about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--COPYING29
-rw-r--r--LICENSE674
-rw-r--r--README.md13
-rw-r--r--default.nix33
-rw-r--r--doc/entities.ent22
-rw-r--r--doc/index.xml37
-rw-r--r--doc/install.xml80
-rw-r--r--doc/options.xml9
-rw-r--r--lib/call-machine.nix65
-rw-r--r--lib/get-tests.nix22
-rw-r--r--machines/README.md4
-rw-r--r--machines/aszlig/arilou.nix47
-rw-r--r--machines/aszlig/dnyarri-kconf.nix1577
-rw-r--r--machines/aszlig/dnyarri.nix130
-rw-r--r--machines/aszlig/kzerza.nix71
-rw-r--r--machines/aszlig/managed/haenk.nix95
-rw-r--r--machines/aszlig/managed/notsure.nix89
-rw-r--r--machines/aszlig/managed/tyree.nix79
-rw-r--r--machines/aszlig/mmrnmhrm-kconf.nix1272
-rw-r--r--machines/aszlig/mmrnmhrm.nix81
-rw-r--r--machines/aszlig/tishtushi.nix73
-rw-r--r--machines/default.nix31
-rw-r--r--machines/labnet/heinrich.nix143
-rw-r--r--machines/labnet/labtop.nix135
-rw-r--r--machines/misc/mailserver.nix118
-rw-r--r--machines/profpatsch/katara.nix343
-rw-r--r--machines/profpatsch/notes.org32
-rw-r--r--machines/profpatsch/pkgs.nix25
-rw-r--r--machines/profpatsch/taffybar.patch71
-rw-r--r--machines/sternenseemann/fliewatuet.nix272
-rw-r--r--machines/sternenseemann/schnurrkadse.nix111
-rw-r--r--modules/README.md49
-rw-r--r--modules/hardware/gamecontroller.nix109
-rw-r--r--modules/hardware/t100ha/default.nix20
-rw-r--r--modules/module-list.nix25
-rw-r--r--modules/profiles/common.nix88
-rw-r--r--modules/profiles/tests.nix249
-rw-r--r--modules/services/multipath-vpn.nix246
-rw-r--r--modules/services/postfix/default.nix65
-rw-r--r--modules/system/iso.nix12
-rw-r--r--modules/system/thinkpad.nix31
-rw-r--r--modules/user/aszlig/profiles/base.nix101
-rw-r--r--modules/user/aszlig/profiles/workstation/default.nix178
-rw-r--r--modules/user/aszlig/profiles/workstation/packages.nix92
-rw-r--r--modules/user/aszlig/programs/gajim/config.nix731
-rw-r--r--modules/user/aszlig/programs/gajim/config.patch80
-rw-r--r--modules/user/aszlig/programs/gajim/default.nix59
-rw-r--r--modules/user/aszlig/programs/git/default.nix74
-rw-r--r--modules/user/aszlig/programs/mpv/default.nix24
-rw-r--r--modules/user/aszlig/programs/taalo-build/default.nix65
-rw-r--r--modules/user/aszlig/programs/taskwarrior/config.patch48
-rw-r--r--modules/user/aszlig/programs/taskwarrior/default.nix36
-rw-r--r--modules/user/aszlig/programs/vim/default.nix384
-rw-r--r--modules/user/aszlig/programs/xpdf/default.nix20
-rw-r--r--modules/user/aszlig/programs/zsh/default.nix117
-rw-r--r--modules/user/aszlig/services/i3/conky.nix121
-rw-r--r--modules/user/aszlig/services/i3/default.nix136
-rw-r--r--modules/user/aszlig/services/i3/i3.conf131
-rw-r--r--modules/user/aszlig/services/i3/workspace.nix107
-rw-r--r--modules/user/aszlig/services/slim/default.nix45
-rw-r--r--modules/user/aszlig/services/vlock/default.nix57
-rw-r--r--modules/user/aszlig/services/vlock/message.cat18
-rw-r--r--modules/user/aszlig/services/vlock/message.colmap18
-rw-r--r--modules/user/aszlig/system/kernel.nix57
-rw-r--r--modules/user/profpatsch/programs/scanning.nix13
-rw-r--r--nixpkgs-path.nix2
-rwxr-xr-xpkgs/aacolorize/aacolorize.py182
-rw-r--r--pkgs/aacolorize/default.nix13
-rw-r--r--pkgs/axbo/default.nix49
-rw-r--r--pkgs/beehive/default.nix17
-rw-r--r--pkgs/beehive/godeps.nix378
-rw-r--r--pkgs/blop/default.nix16
-rw-r--r--pkgs/build-support/channel.nix32
-rw-r--r--pkgs/default.nix31
-rw-r--r--pkgs/games/COPYING20
-rw-r--r--pkgs/games/LICENSE.APACHE (renamed from LICENSE.APACHE)0
-rw-r--r--pkgs/games/base-module.nix (renamed from base-module.nix)0
-rw-r--r--pkgs/games/default.nix25
-rw-r--r--pkgs/games/humblebundle/bastion.nix (renamed from humblebundle/bastion.nix)0
-rw-r--r--pkgs/games/humblebundle/cavestoryplus.nix (renamed from humblebundle/cavestoryplus.nix)0
-rw-r--r--pkgs/games/humblebundle/default.nix (renamed from humblebundle/default.nix)0
-rw-r--r--pkgs/games/humblebundle/fetch-humble-bundle/default.nix (renamed from humblebundle/fetch-humble-bundle/default.nix)0
-rw-r--r--pkgs/games/humblebundle/fez.nix (renamed from humblebundle/fez.nix)0
-rw-r--r--pkgs/games/humblebundle/ftl.nix (renamed from humblebundle/ftl.nix)0
-rw-r--r--pkgs/games/humblebundle/guacamelee.nix (renamed from humblebundle/guacamelee.nix)0
-rw-r--r--pkgs/games/humblebundle/hammerwatch.nix (renamed from humblebundle/hammerwatch.nix)0
-rw-r--r--pkgs/games/humblebundle/jamestown.nix (renamed from humblebundle/jamestown.nix)0
-rw-r--r--pkgs/games/humblebundle/liads.nix (renamed from humblebundle/liads.nix)0
-rw-r--r--pkgs/games/humblebundle/megabytepunch.nix (renamed from humblebundle/megabytepunch.nix)0
-rw-r--r--pkgs/games/humblebundle/rocketbirds.nix (renamed from humblebundle/rocketbirds.nix)0
-rw-r--r--pkgs/games/humblebundle/spaz.nix (renamed from humblebundle/spaz.nix)0
-rw-r--r--pkgs/games/humblebundle/swordsandsoldiers.nix (renamed from humblebundle/swordsandsoldiers.nix)0
-rw-r--r--pkgs/games/humblebundle/unepic.nix (renamed from humblebundle/unepic.nix)0
-rw-r--r--pkgs/games/steam/default.nix (renamed from steam/default.nix)0
-rw-r--r--pkgs/games/steam/fetchsteam/default.nix (renamed from steam/fetchsteam/default.nix)0
-rw-r--r--pkgs/games/steam/fetchsteam/downloader.patch (renamed from steam/fetchsteam/downloader.patch)0
-rw-r--r--pkgs/games/steam/starbound.nix (renamed from steam/starbound.nix)0
-rw-r--r--pkgs/grandpa/default.nix20
-rw-r--r--pkgs/greybird-xfce-theme/default.nix26
-rw-r--r--pkgs/kpatches/bfqsched/default.nix45
-rw-r--r--pkgs/libcmt/default.nix25
-rw-r--r--pkgs/librxtx-java/default.nix29
-rw-r--r--pkgs/list-gamecontrollers/default.nix10
-rw-r--r--pkgs/list-gamecontrollers/list-gc.c31
-rw-r--r--pkgs/lockdev/default.nix23
-rw-r--r--pkgs/nixops/default.nix37
-rw-r--r--pkgs/pvolctrl/default.nix35
-rw-r--r--pkgs/show-qr-code/default.nix28
-rw-r--r--pkgs/sidplayfp/default.nix29
-rw-r--r--pkgs/tkabber-urgent-plugin/default.nix26
-rw-r--r--pkgs/tomahawk/default.nix89
-rw-r--r--pkgs/twitchstream/default.nix112
-rw-r--r--release.nix168
-rw-r--r--tests/aszlig/i3.nix41
-rw-r--r--tests/default.nix19
-rw-r--r--tests/labnet/heinrich.nix51
-rw-r--r--tests/make-test.nix30
-rw-r--r--tests/richi235/multipath-vpn.nix189
118 files changed, 11180 insertions, 37 deletions
diff --git a/COPYING b/COPYING
index 581a4b68..8377ade4 100644
--- a/COPYING
+++ b/COPYING
@@ -1,20 +1,17 @@
-Everything except files that end with ".patch" are copyright (C) 2014
-aszlig and licensed under the Apache License, Version 2.0 (the
-"License"); you may not use these files except in compliance with the
-License. You may obtain a copy of the License at
+All Nix expressions in this repository are free software: you can
+redistribute them and/or modify them 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.
 
-   http://www.apache.org/licenses/LICENSE-2.0
+The expression files are distributed in the hope that they 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.
 
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
+For files other than the Nix expression files the same terms apply,
+unless explicitly stated otherwise here or in the file header.
 
-If the URL to the license is unavailable, please see LICENSE.APACHE in
-this directory.
+You should have received a copy of the GNU General Public License
+along with this program (see LICENSE file).
 
-All of the .patch files are copyright (C) 2014 aszlig as well, but are
-licensed under the licenses of the corresponding projects. Please look
-at accompanying Nix expressions for more information about the
-licenses of the respective projects and thus my patches.
+If not, see <http://www.gnu.org/licenses/>.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..94a9ed02
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program 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.
+
+    This program 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/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..37d71f5b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+About Vuizvui
+=============
+
+This contains a set of NixOS modules/configurations and various other Nix
+expressions used by [OpenLab Augsburg](https://openlab-augsburg.de) and its
+members.
+
+Documentation
+=============
+
+You can find the latest build of the documentation here:
+
+https://headcounter.org/hydra/job/openlab/vuizvui/manual/latest/download
diff --git a/default.nix b/default.nix
index d85bd191..68a66670 100644
--- a/default.nix
+++ b/default.nix
@@ -1,25 +1,16 @@
-{ configuration ? null }:
+{ system ? builtins.currentSystem, ... }@args:
 
-let
-  configFilePath = let
-    xdgConfig = builtins.getEnv "XDG_CONFIG_HOME";
-    fallback = "${builtins.getEnv "HOME"}/.config";
-    basedir = if xdgConfig == "" then fallback else xdgConfig;
-  in "${basedir}/nixgames.nix";
+with (import (import ./nixpkgs-path.nix) { inherit system; }).lib;
 
-  configFile = if !builtins.pathExists configFilePath then throw ''
-    The config file "${configFilePath}" doesn't exist! Be sure to create it and
-    put your HumbleBundle email address and password in it, like this:
+{
+  machines = import ./machines {
+    inherit system;
+  };
 
-    {
-      humblebundle.email = "fancyuser@example.com";
-      humblebundle.password = "my_super_secret_password";
-    }
-  '' else configFilePath;
+  pkgs = import ./pkgs {
+    pkgs = import (import ./nixpkgs-path.nix) args;
+  };
 
-in ((import <nixpkgs/lib>).evalModules {
-  modules = [
-    (if configuration == null then configFilePath else configuration)
-    ./base-module.nix ./humblebundle ./steam
-  ];
-}).config.packages
+  # Inherit upstream lib until we have our own lib.
+  lib = import "${import ./nixpkgs-path.nix}/lib";
+}
diff --git a/doc/entities.ent b/doc/entities.ent
new file mode 100644
index 00000000..cee77e2d
--- /dev/null
+++ b/doc/entities.ent
@@ -0,0 +1,22 @@
+<!ENTITY nixos.url "https://nixos.org/">
+<!ENTITY nixpkgs.url "https://nixos.org/nixpkgs/">
+<!ENTITY openlab.url "https://openlab-augsburg.de/">
+
+<!ENTITY nixos '
+<link xmlns="http://docbook.org/ns/docbook"
+      xmlns:xlink="http://www.w3.org/1999/xlink"
+      xlink:href="&nixos.url;">NixOS</link>
+'>
+<!ENTITY nixpkgs '
+<link xmlns="http://docbook.org/ns/docbook"
+      xmlns:xlink="http://www.w3.org/1999/xlink"
+      xlink:href="&nixpkgs.url;">&lt;nixpkgs&gt;</link>
+'>
+<!ENTITY openlab '
+<link xmlns="http://docbook.org/ns/docbook"
+      xmlns:xlink="http://www.w3.org/1999/xlink"
+      xlink:href="&openlab.url;">OpenLab Augsburg</link>
+'>
+
+<!ENTITY hydra.base "https://headcounter.org/hydra">
+<!ENTITY hydra.channelbase "&hydra.base;/channel/custom/openlab/vuizvui">
diff --git a/doc/index.xml b/doc/index.xml
new file mode 100644
index 00000000..efb0bf2f
--- /dev/null
+++ b/doc/index.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!DOCTYPE book [
+<!ENTITY % entities SYSTEM "entities.ent">
+%entities;
+]>
+<book xmlns="http://docbook.org/ns/docbook"
+      xmlns:xlink="http://www.w3.org/1999/xlink"
+      xmlns:xi="http://www.w3.org/2001/XInclude">
+  <title>Vuizvui</title>
+  <preface>
+    <title>What is Vuizvui?</title>
+    <para>
+      Vuizvui is a set of NixOS modules and machine configurations that aim to
+      extend &nixos; in a way that fits the needs of the members of the
+      &openlab; and also serves as a playground for experimental features that
+      are yet to be included in the official NixOS project once they're well
+      tested and matured enough.
+    </para>
+
+    <para>
+      This means that module options in Vuizvui are subject to change without
+      retaining backwards-compatibility for configurations outside of the
+      defined machines.
+    </para>
+
+    <para>
+      The name <literal>Vuizvui</literal> is of Bavarian origins and means
+      something like <literal>too much</literal> while on the other side
+      <literal>nix</literal> means nothing. Which fits quite well because this
+      repository is for everything either too complex or not polished/generic
+      enough to be pushed into &nixpkgs;.
+    </para>
+  </preface>
+
+  <xi:include href="install.xml" />
+  <xi:include href="options.xml" />
+</book>
diff --git a/doc/install.xml b/doc/install.xml
new file mode 100644
index 00000000..df94a8f3
--- /dev/null
+++ b/doc/install.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>
+<!DOCTYPE book [
+<!ENTITY % entities SYSTEM "entities.ent">
+%entities;
+]>
+<part xmlns="http://docbook.org/ns/docbook"
+      xmlns:xlink="http://www.w3.org/1999/xlink"
+      xmlns:xi="http://www.w3.org/2001/XInclude">
+  <title>Installing a machine in Vuizvui</title>
+
+  <para>
+    The easiest way to get started is if the machine is already in Vuizvui so
+    there is a channel available.
+  </para>
+
+  <para>
+    You can have a look at
+    <link xlink:href="&hydra.base;/jobset/openlab/vuizvui#tabs-channels">the
+      list of channels</link>
+    to check whether a channel exists for the machine you want to install.
+  </para>
+
+  <para>
+    So let's say you want to install the machine <literal>labtop</literal> which
+    has the channel attribute <literal>channels.machines.labnet.labtop</literal>
+  </para>
+
+  <para>
+    First you need to add the channel for the
+    <systemitem class="username">root</systemitem> user of your current system
+    using the following commands:
+
+    <command>
+<screen>
+nix-channel --add <link
+  xlink:href="&hydra.channelbase;/channels.machines.labnet.labtop"/> vuizvui
+nix-channel --update
+</screen>
+    </command>
+
+    Notice the <literal>vuizvui</literal> argument at the end of the first
+    command. This makes the channel available as
+    <literal>&lt;vuizvui&gt;</literal> in the search path of the current system.
+  </para>
+
+  <para>
+    For the first installation the <envar>NIX_PATH</envar> isn't correctly set
+    and will be set to include the <literal>vuizvui</literal> channel after
+    you've switched to the configuration for the first time.
+  </para>
+
+  <para>
+    Next put the following in your
+    <filename>/etc/nixos/configuration.nix</filename>:
+  </para>
+
+  <screen><code language="nix">(import &lt;vuizvui/machines&gt; {}).labnet.labtop.config</code></screen>
+
+  <para>
+    Of course you need to replace <literal>labnet.labtop</literal> with the
+    attribute of your machine.
+  </para>
+
+  <para>
+    Now in order to do the first build and activation of the configuration, you
+    need to issue the following command as root:
+  </para>
+
+  <!-- FIXME: This WON'T work because of wrong NIX_PATH and missicg binary
+              cache public key! -->
+  <!-- TODO: create a bootsrap script that does this automatically -->
+  <screen><command>nixos-rebuild \
+  -I nixpkgs=/nix/var/nix/profiles/per-user/root/channels/vuizvui/nixpkgs \
+  --option binary-cache-public-keys "headcounter.org:/7YANMvnQnyvcVB6rgFTdb8p5LG1OTXaO+21CaOSBzg=" \
+      switch</command></screen>
+
+  <para>
+    We redefine <literal>nixpkgs</literal> here, because vuizvui brings its own nixpkgs that gets build on the hydra, using it we get to download from the binary cache. Additionally, we need to manually specify the public key for the <literal>headcounter.org</literal> hydra.
+  </para>
+</part>
diff --git a/doc/options.xml b/doc/options.xml
new file mode 100644
index 00000000..da30e6c8
--- /dev/null
+++ b/doc/options.xml
@@ -0,0 +1,9 @@
+<part xmlns="http://docbook.org/ns/docbook"
+    xmlns:xlink="http://www.w3.org/1999/xlink"
+    xmlns:xi="http://www.w3.org/2001/XInclude">
+    <title>Vuizvui-specific NixOS options</title>
+    <para>
+        The following NixOS options are specific to Vuizvui:
+    </para>
+    <xi:include href="options-db.xml" />
+</part>
diff --git a/lib/call-machine.nix b/lib/call-machine.nix
new file mode 100644
index 00000000..0844e4eb
--- /dev/null
+++ b/lib/call-machine.nix
@@ -0,0 +1,65 @@
+path: { system ? builtins.currentSystem }:
+
+let
+  nixpkgs = import ../nixpkgs-path.nix;
+
+  eval = import "${nixpkgs}/nixos/lib/eval-config.nix" {
+    inherit system;
+    modules = [ path ] ++ import ../modules/module-list.nix;
+  };
+
+  iso = let
+    isoModule = "${nixpkgs}/nixos/modules/installer/cd-dvd/iso-image.nix";
+    wrapIso = { config, pkgs, lib, ... }@attrs: let
+      isoEval = (import isoModule attrs);
+      isoEvalcfg = isoEval.config or {};
+      bootcfg = isoEvalcfg.boot or {};
+      fscfg = isoEvalcfg.fileSystems or {};
+    in {
+      options = isoEval.options or {};
+      imports = isoEval.imports or [];
+      config = isoEvalcfg // {
+        boot = bootcfg // lib.optionalAttrs (bootcfg ? loader) {
+          loader = lib.mkForce bootcfg.loader;
+        };
+        fileSystems = lib.mapAttrs (lib.const lib.mkForce) fscfg // {
+          "/boot" = lib.mkForce (fscfg."/boot" or {
+            device = "none";
+            fsType = "none";
+            options = "noauto";
+          });
+        };
+      };
+    };
+  in import "${nixpkgs}/nixos/lib/eval-config.nix" {
+    inherit system;
+    modules = [
+      config wrapIso
+      (
+        { lib, ... }: let
+          name = eval.config.networking.hostName;
+          upperName = lib.toUpper name;
+        in rec {
+          isoImage.isoName = "${name}.iso";
+          isoImage.volumeID = builtins.substring 0 11 "${upperName}_LIVE";
+          isoImage.makeEfiBootable = true;
+          isoImage.makeUsbBootable = true;
+          isoImage.appendToMenuLabel = " \"${name}\" Live System";
+        }
+      )
+    ];
+  };
+
+  config = {
+    imports = [ path ] ++ import ../modules/module-list.nix;
+  };
+
+  vm = (import "${nixpkgs}/nixos" {
+    inherit system;
+    configuration = config;
+  }).vm;
+
+in {
+  build = eval.config.system.build.toplevel;
+  inherit config eval iso vm;
+}
diff --git a/lib/get-tests.nix b/lib/get-tests.nix
new file mode 100644
index 00000000..08fc9475
--- /dev/null
+++ b/lib/get-tests.nix
@@ -0,0 +1,22 @@
+{ system ? builtins.currentSystem
+, nixpkgs ? import ../nixpkgs-path.nix
+, vuizvuiTests ? ../tests
+}:
+
+with import "${nixpkgs}/lib";
+
+{
+  nixos = let
+    upstreamTests = (import "${nixpkgs}/nixos/release.nix" {
+      inherit nixpkgs;
+    }).tests;
+    isTestOrJob = attr: (attr.type or null) == "derivation" || attr ? test;
+    isTestOrSystems = attr: isTestOrJob attr || attr ? ${system};
+    cond = attr: !isTestOrSystems attr;
+    reduce = attr: if isTestOrJob attr then attr else attr.${system};
+  in mapAttrsRecursiveCond cond (path: reduce) upstreamTests;
+
+  vuizvui = import vuizvuiTests {
+    inherit system;
+  };
+}
diff --git a/machines/README.md b/machines/README.md
new file mode 100644
index 00000000..9d3fe3af
--- /dev/null
+++ b/machines/README.md
@@ -0,0 +1,4 @@
+This directory contains NixOS machine configurations.
+
+Feel free to add your own configuration into a subdirectory named after your
+nickname or handle and update default.nix accordingly.
diff --git a/machines/aszlig/arilou.nix b/machines/aszlig/arilou.nix
new file mode 100644
index 00000000..b9a1c87d
--- /dev/null
+++ b/machines/aszlig/arilou.nix
@@ -0,0 +1,47 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+let
+  rootUUID = "e9c95c74-e4cf-41f6-bb45-baf8dd579217";
+  swapUUID = "4d172959-5cfd-4164-a46e-fa7be0dfd03a";
+  diskID = "usb-Lexar_USB_Flash_Drive_201303211246293590E4-0:0";
+
+  modulesPath = "${import ../../nixpkgs-path.nix}/nixos/modules";
+in {
+  vuizvui.user.aszlig.profiles.workstation.enable = true;
+  imports = [ "${modulesPath}/profiles/all-hardware.nix" ];
+
+  boot = {
+    kernelPackages = pkgs.linuxPackages_latest;
+    initrd.kernelModules = [ "fbcon" "usb_storage" ];
+    loader.grub.device = "/dev/disk/by-id/${diskID}";
+    loader.grub.memtest86.enable = true;
+  };
+
+  networking.hostName = "arilou";
+  networking.wireless.enable = mkForce true;
+  networking.enableB43Firmware = true;
+
+  fileSystems."/".device = "/dev/disk/by-uuid/${rootUUID}";
+  fileSystems."/".fsType = "btrfs";
+  fileSystems."/".options = concatStringsSep "," [
+    "ssd"
+    "space_cache"
+    "compress-force=zlib"
+    "noatime"
+  ];
+
+  fileSystems."/tmp".device = "none";
+  fileSystems."/tmp".fsType = "tmpfs";
+  fileSystems."/tmp".options = "nosuid,nodev,relatime";
+
+  swapDevices = singleton {
+    device = "/dev/disk/by-uuid/${swapUUID}";
+  };
+
+  services.openssh.enable = mkForce false;
+  services.xserver.videoDrivers = [ "intel" "ati" "nouveau" ];
+
+  nix.maxJobs = mkForce 2;
+}
diff --git a/machines/aszlig/dnyarri-kconf.nix b/machines/aszlig/dnyarri-kconf.nix
new file mode 100644
index 00000000..a34f9871
--- /dev/null
+++ b/machines/aszlig/dnyarri-kconf.nix
@@ -0,0 +1,1577 @@
+{
+  "CONFIG_64BIT" = "y";
+  "CONFIG_X86_64" = "y";
+  "CONFIG_X86" = "y";
+  "CONFIG_INSTRUCTION_DECODER" = "y";
+  "CONFIG_PERF_EVENTS_INTEL_UNCORE" = "y";
+  "CONFIG_OUTPUT_FORMAT" = "elf64-x86-64";
+  "CONFIG_ARCH_DEFCONFIG" = "arch/x86/configs/x86_64_defconfig";
+  "CONFIG_LOCKDEP_SUPPORT" = "y";
+  "CONFIG_STACKTRACE_SUPPORT" = "y";
+  "CONFIG_HAVE_LATENCYTOP_SUPPORT" = "y";
+  "CONFIG_MMU" = "y";
+  "CONFIG_NEED_DMA_MAP_STATE" = "y";
+  "CONFIG_NEED_SG_DMA_LENGTH" = "y";
+  "CONFIG_GENERIC_ISA_DMA" = "y";
+  "CONFIG_GENERIC_BUG" = "y";
+  "CONFIG_GENERIC_BUG_RELATIVE_POINTERS" = "y";
+  "CONFIG_GENERIC_HWEIGHT" = "y";
+  "CONFIG_ARCH_MAY_HAVE_PC_FDC" = "y";
+  "CONFIG_RWSEM_XCHGADD_ALGORITHM" = "y";
+  "CONFIG_GENERIC_CALIBRATE_DELAY" = "y";
+  "CONFIG_ARCH_HAS_CPU_RELAX" = "y";
+  "CONFIG_ARCH_HAS_CACHE_LINE_SIZE" = "y";
+  "CONFIG_HAVE_SETUP_PER_CPU_AREA" = "y";
+  "CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK" = "y";
+  "CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK" = "y";
+  "CONFIG_ARCH_HIBERNATION_POSSIBLE" = "y";
+  "CONFIG_ARCH_SUSPEND_POSSIBLE" = "y";
+  "CONFIG_ARCH_WANT_HUGE_PMD_SHARE" = "y";
+  "CONFIG_ARCH_WANT_GENERAL_HUGETLB" = "y";
+  "CONFIG_ZONE_DMA32" = "y";
+  "CONFIG_AUDIT_ARCH" = "y";
+  "CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING" = "y";
+  "CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC" = "y";
+  "CONFIG_X86_64_SMP" = "y";
+  "CONFIG_ARCH_HWEIGHT_CFLAGS" = "-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11";
+  "CONFIG_ARCH_SUPPORTS_UPROBES" = "y";
+  "CONFIG_FIX_EARLYCON_MEM" = "y";
+  "CONFIG_PGTABLE_LEVELS" = "4";
+  "CONFIG_DEFCONFIG_LIST" = "/lib/modules/$UNAME_RELEASE/.config";
+  "CONFIG_IRQ_WORK" = "y";
+  "CONFIG_BUILDTIME_EXTABLE_SORT" = "y";
+  "CONFIG_INIT_ENV_ARG_LIMIT" = "32";
+  "CONFIG_CROSS_COMPILE" = "";
+  "CONFIG_LOCALVERSION" = "";
+  "CONFIG_HAVE_KERNEL_GZIP" = "y";
+  "CONFIG_HAVE_KERNEL_BZIP2" = "y";
+  "CONFIG_HAVE_KERNEL_LZMA" = "y";
+  "CONFIG_HAVE_KERNEL_XZ" = "y";
+  "CONFIG_HAVE_KERNEL_LZO" = "y";
+  "CONFIG_HAVE_KERNEL_LZ4" = "y";
+  "CONFIG_KERNEL_XZ" = "y";
+  "CONFIG_DEFAULT_HOSTNAME" = "dnyarri";
+  "CONFIG_SWAP" = "y";
+  "CONFIG_SYSVIPC" = "y";
+  "CONFIG_SYSVIPC_SYSCTL" = "y";
+  "CONFIG_POSIX_MQUEUE" = "y";
+  "CONFIG_POSIX_MQUEUE_SYSCTL" = "y";
+  "CONFIG_CROSS_MEMORY_ATTACH" = "y";
+  "CONFIG_FHANDLE" = "y";
+  "CONFIG_HAVE_ARCH_AUDITSYSCALL" = "y";
+  "CONFIG_GENERIC_IRQ_PROBE" = "y";
+  "CONFIG_GENERIC_IRQ_SHOW" = "y";
+  "CONFIG_GENERIC_PENDING_IRQ" = "y";
+  "CONFIG_IRQ_DOMAIN" = "y";
+  "CONFIG_IRQ_DOMAIN_HIERARCHY" = "y";
+  "CONFIG_GENERIC_MSI_IRQ" = "y";
+  "CONFIG_GENERIC_MSI_IRQ_DOMAIN" = "y";
+  "CONFIG_IRQ_FORCED_THREADING" = "y";
+  "CONFIG_SPARSE_IRQ" = "y";
+  "CONFIG_CLOCKSOURCE_WATCHDOG" = "y";
+  "CONFIG_ARCH_CLOCKSOURCE_DATA" = "y";
+  "CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE" = "y";
+  "CONFIG_GENERIC_TIME_VSYSCALL" = "y";
+  "CONFIG_GENERIC_CLOCKEVENTS" = "y";
+  "CONFIG_GENERIC_CLOCKEVENTS_BROADCAST" = "y";
+  "CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST" = "y";
+  "CONFIG_GENERIC_CMOS_UPDATE" = "y";
+  "CONFIG_TICK_ONESHOT" = "y";
+  "CONFIG_NO_HZ_COMMON" = "y";
+  "CONFIG_NO_HZ_IDLE" = "y";
+  "CONFIG_NO_HZ" = "y";
+  "CONFIG_HIGH_RES_TIMERS" = "y";
+  "CONFIG_TICK_CPU_ACCOUNTING" = "y";
+  "CONFIG_BSD_PROCESS_ACCT" = "y";
+  "CONFIG_BSD_PROCESS_ACCT_V3" = "y";
+  "CONFIG_TASKSTATS" = "y";
+  "CONFIG_TASK_DELAY_ACCT" = "y";
+  "CONFIG_TASK_XACCT" = "y";
+  "CONFIG_TASK_IO_ACCOUNTING" = "y";
+  "CONFIG_PREEMPT_RCU" = "y";
+  "CONFIG_SRCU" = "y";
+  "CONFIG_RCU_STALL_COMMON" = "y";
+  "CONFIG_BUILD_BIN2C" = "y";
+  "CONFIG_IKCONFIG" = "y";
+  "CONFIG_IKCONFIG_PROC" = "y";
+  "CONFIG_LOG_BUF_SHIFT" = "17";
+  "CONFIG_LOG_CPU_MAX_BUF_SHIFT" = "14";
+  "CONFIG_HAVE_UNSTABLE_SCHED_CLOCK" = "y";
+  "CONFIG_ARCH_SUPPORTS_NUMA_BALANCING" = "y";
+  "CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH" = "y";
+  "CONFIG_ARCH_SUPPORTS_INT128" = "y";
+  "CONFIG_CGROUPS" = "y";
+  "CONFIG_CGROUP_FREEZER" = "y";
+  "CONFIG_CGROUP_PIDS" = "y";
+  "CONFIG_CGROUP_DEVICE" = "y";
+  "CONFIG_CPUSETS" = "y";
+  "CONFIG_CGROUP_CPUACCT" = "y";
+  "CONFIG_CGROUP_SCHED" = "y";
+  "CONFIG_FAIR_GROUP_SCHED" = "y";
+  "CONFIG_CFS_BANDWIDTH" = "y";
+  "CONFIG_BLK_CGROUP" = "y";
+  "CONFIG_NAMESPACES" = "y";
+  "CONFIG_UTS_NS" = "y";
+  "CONFIG_IPC_NS" = "y";
+  "CONFIG_USER_NS" = "y";
+  "CONFIG_PID_NS" = "y";
+  "CONFIG_NET_NS" = "y";
+  "CONFIG_SCHED_AUTOGROUP" = "y";
+  "CONFIG_RELAY" = "y";
+  "CONFIG_BLK_DEV_INITRD" = "y";
+  "CONFIG_INITRAMFS_SOURCE" = "";
+  "CONFIG_RD_GZIP" = "y";
+  "CONFIG_RD_BZIP2" = "y";
+  "CONFIG_RD_LZMA" = "y";
+  "CONFIG_RD_XZ" = "y";
+  "CONFIG_RD_LZO" = "y";
+  "CONFIG_RD_LZ4" = "y";
+  "CONFIG_SYSCTL" = "y";
+  "CONFIG_ANON_INODES" = "y";
+  "CONFIG_HAVE_UID16" = "y";
+  "CONFIG_SYSCTL_EXCEPTION_TRACE" = "y";
+  "CONFIG_HAVE_PCSPKR_PLATFORM" = "y";
+  "CONFIG_BPF" = "y";
+  "CONFIG_UID16" = "y";
+  "CONFIG_MULTIUSER" = "y";
+  "CONFIG_SGETMASK_SYSCALL" = "y";
+  "CONFIG_SYSFS_SYSCALL" = "y";
+  "CONFIG_KALLSYMS" = "y";
+  "CONFIG_PRINTK" = "y";
+  "CONFIG_BUG" = "y";
+  "CONFIG_ELF_CORE" = "y";
+  "CONFIG_PCSPKR_PLATFORM" = "y";
+  "CONFIG_BASE_FULL" = "y";
+  "CONFIG_FUTEX" = "y";
+  "CONFIG_EPOLL" = "y";
+  "CONFIG_SIGNALFD" = "y";
+  "CONFIG_TIMERFD" = "y";
+  "CONFIG_EVENTFD" = "y";
+  "CONFIG_SHMEM" = "y";
+  "CONFIG_AIO" = "y";
+  "CONFIG_ADVISE_SYSCALLS" = "y";
+  "CONFIG_PCI_QUIRKS" = "y";
+  "CONFIG_MEMBARRIER" = "y";
+  "CONFIG_HAVE_PERF_EVENTS" = "y";
+  "CONFIG_PERF_EVENTS" = "y";
+  "CONFIG_VM_EVENT_COUNTERS" = "y";
+  "CONFIG_SLUB_DEBUG" = "y";
+  "CONFIG_SLUB" = "y";
+  "CONFIG_KEXEC_CORE" = "y";
+  "CONFIG_HAVE_OPROFILE" = "y";
+  "CONFIG_OPROFILE_NMI_TIMER" = "y";
+  "CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS" = "y";
+  "CONFIG_ARCH_USE_BUILTIN_BSWAP" = "y";
+  "CONFIG_USER_RETURN_NOTIFIER" = "y";
+  "CONFIG_HAVE_IOREMAP_PROT" = "y";
+  "CONFIG_HAVE_KPROBES" = "y";
+  "CONFIG_HAVE_KRETPROBES" = "y";
+  "CONFIG_HAVE_OPTPROBES" = "y";
+  "CONFIG_HAVE_KPROBES_ON_FTRACE" = "y";
+  "CONFIG_HAVE_ARCH_TRACEHOOK" = "y";
+  "CONFIG_HAVE_DMA_ATTRS" = "y";
+  "CONFIG_HAVE_DMA_CONTIGUOUS" = "y";
+  "CONFIG_GENERIC_SMP_IDLE_THREAD" = "y";
+  "CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT" = "y";
+  "CONFIG_HAVE_REGS_AND_STACK_ACCESS_API" = "y";
+  "CONFIG_HAVE_DMA_API_DEBUG" = "y";
+  "CONFIG_HAVE_HW_BREAKPOINT" = "y";
+  "CONFIG_HAVE_MIXED_BREAKPOINTS_REGS" = "y";
+  "CONFIG_HAVE_USER_RETURN_NOTIFIER" = "y";
+  "CONFIG_HAVE_PERF_EVENTS_NMI" = "y";
+  "CONFIG_HAVE_PERF_REGS" = "y";
+  "CONFIG_HAVE_PERF_USER_STACK_DUMP" = "y";
+  "CONFIG_HAVE_ARCH_JUMP_LABEL" = "y";
+  "CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG" = "y";
+  "CONFIG_HAVE_ALIGNED_STRUCT_PAGE" = "y";
+  "CONFIG_HAVE_CMPXCHG_LOCAL" = "y";
+  "CONFIG_HAVE_CMPXCHG_DOUBLE" = "y";
+  "CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION" = "y";
+  "CONFIG_ARCH_WANT_OLD_COMPAT_IPC" = "y";
+  "CONFIG_HAVE_ARCH_SECCOMP_FILTER" = "y";
+  "CONFIG_SECCOMP_FILTER" = "y";
+  "CONFIG_HAVE_CC_STACKPROTECTOR" = "y";
+  "CONFIG_CC_STACKPROTECTOR" = "y";
+  "CONFIG_CC_STACKPROTECTOR_REGULAR" = "y";
+  "CONFIG_HAVE_CONTEXT_TRACKING" = "y";
+  "CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN" = "y";
+  "CONFIG_HAVE_IRQ_TIME_ACCOUNTING" = "y";
+  "CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE" = "y";
+  "CONFIG_HAVE_ARCH_HUGE_VMAP" = "y";
+  "CONFIG_HAVE_ARCH_SOFT_DIRTY" = "y";
+  "CONFIG_MODULES_USE_ELF_RELA" = "y";
+  "CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK" = "y";
+  "CONFIG_ARCH_HAS_ELF_RANDOMIZE" = "y";
+  "CONFIG_HAVE_COPY_THREAD_TLS" = "y";
+  "CONFIG_OLD_SIGSUSPEND3" = "y";
+  "CONFIG_COMPAT_OLD_SIGACTION" = "y";
+  "CONFIG_ARCH_HAS_GCOV_PROFILE_ALL" = "y";
+  "CONFIG_SLABINFO" = "y";
+  "CONFIG_RT_MUTEXES" = "y";
+  "CONFIG_BASE_SMALL" = "0";
+  "CONFIG_MODULES" = "y";
+  "CONFIG_MODULE_FORCE_LOAD" = "y";
+  "CONFIG_MODULE_UNLOAD" = "y";
+  "CONFIG_MODULE_FORCE_UNLOAD" = "y";
+  "CONFIG_MODVERSIONS" = "y";
+  "CONFIG_MODULES_TREE_LOOKUP" = "y";
+  "CONFIG_STOP_MACHINE" = "y";
+  "CONFIG_BLOCK" = "y";
+  "CONFIG_BLK_DEV_BSG" = "y";
+  "CONFIG_BLK_DEV_INTEGRITY" = "y";
+  "CONFIG_BLK_DEV_THROTTLING" = "y";
+  "CONFIG_MSDOS_PARTITION" = "y";
+  "CONFIG_EFI_PARTITION" = "y";
+  "CONFIG_BLOCK_COMPAT" = "y";
+  "CONFIG_IOSCHED_NOOP" = "y";
+  "CONFIG_IOSCHED_DEADLINE" = "y";
+  "CONFIG_IOSCHED_CFQ" = "y";
+  "CONFIG_CFQ_GROUP_IOSCHED" = "y";
+  "CONFIG_IOSCHED_BFQ" = "y";
+  "CONFIG_DEFAULT_BFQ" = "y";
+  "CONFIG_DEFAULT_IOSCHED" = "bfq";
+  "CONFIG_PREEMPT_NOTIFIERS" = "y";
+  "CONFIG_PADATA" = "y";
+  "CONFIG_ASN1" = "y";
+  "CONFIG_UNINLINE_SPIN_UNLOCK" = "y";
+  "CONFIG_ARCH_SUPPORTS_ATOMIC_RMW" = "y";
+  "CONFIG_MUTEX_SPIN_ON_OWNER" = "y";
+  "CONFIG_RWSEM_SPIN_ON_OWNER" = "y";
+  "CONFIG_LOCK_SPIN_ON_OWNER" = "y";
+  "CONFIG_ARCH_USE_QUEUED_SPINLOCKS" = "y";
+  "CONFIG_QUEUED_SPINLOCKS" = "y";
+  "CONFIG_ARCH_USE_QUEUED_RWLOCKS" = "y";
+  "CONFIG_QUEUED_RWLOCKS" = "y";
+  "CONFIG_FREEZER" = "y";
+  "CONFIG_ZONE_DMA" = "y";
+  "CONFIG_SMP" = "y";
+  "CONFIG_X86_FEATURE_NAMES" = "y";
+  "CONFIG_IOSF_MBI" = "m";
+  "CONFIG_X86_SUPPORTS_MEMORY_FAILURE" = "y";
+  "CONFIG_SCHED_OMIT_FRAME_POINTER" = "y";
+  "CONFIG_NO_BOOTMEM" = "y";
+  "CONFIG_MCORE2" = "y";
+  "CONFIG_X86_INTERNODE_CACHE_SHIFT" = "6";
+  "CONFIG_X86_L1_CACHE_SHIFT" = "6";
+  "CONFIG_X86_INTEL_USERCOPY" = "y";
+  "CONFIG_X86_USE_PPRO_CHECKSUM" = "y";
+  "CONFIG_X86_P6_NOP" = "y";
+  "CONFIG_X86_TSC" = "y";
+  "CONFIG_X86_CMPXCHG64" = "y";
+  "CONFIG_X86_CMOV" = "y";
+  "CONFIG_X86_MINIMUM_CPU_FAMILY" = "64";
+  "CONFIG_X86_DEBUGCTLMSR" = "y";
+  "CONFIG_CPU_SUP_INTEL" = "y";
+  "CONFIG_CPU_SUP_AMD" = "y";
+  "CONFIG_CPU_SUP_CENTAUR" = "y";
+  "CONFIG_HPET_TIMER" = "y";
+  "CONFIG_HPET_EMULATE_RTC" = "y";
+  "CONFIG_DMI" = "y";
+  "CONFIG_GART_IOMMU" = "y";
+  "CONFIG_SWIOTLB" = "y";
+  "CONFIG_IOMMU_HELPER" = "y";
+  "CONFIG_NR_CPUS" = "8";
+  "CONFIG_SCHED_SMT" = "y";
+  "CONFIG_SCHED_MC" = "y";
+  "CONFIG_PREEMPT" = "y";
+  "CONFIG_PREEMPT_COUNT" = "y";
+  "CONFIG_X86_LOCAL_APIC" = "y";
+  "CONFIG_X86_IO_APIC" = "y";
+  "CONFIG_X86_MCE" = "y";
+  "CONFIG_X86_MCE_INTEL" = "y";
+  "CONFIG_X86_MCE_THRESHOLD" = "y";
+  "CONFIG_X86_THERMAL_VECTOR" = "y";
+  "CONFIG_X86_16BIT" = "y";
+  "CONFIG_X86_ESPFIX64" = "y";
+  "CONFIG_X86_VSYSCALL_EMULATION" = "y";
+  "CONFIG_MICROCODE" = "y";
+  "CONFIG_MICROCODE_INTEL" = "y";
+  "CONFIG_MICROCODE_OLD_INTERFACE" = "y";
+  "CONFIG_X86_MSR" = "m";
+  "CONFIG_X86_CPUID" = "m";
+  "CONFIG_ARCH_PHYS_ADDR_T_64BIT" = "y";
+  "CONFIG_ARCH_DMA_ADDR_T_64BIT" = "y";
+  "CONFIG_X86_DIRECT_GBPAGES" = "y";
+  "CONFIG_NUMA" = "y";
+  "CONFIG_X86_64_ACPI_NUMA" = "y";
+  "CONFIG_NODES_SPAN_OTHER_NODES" = "y";
+  "CONFIG_NODES_SHIFT" = "6";
+  "CONFIG_ARCH_SPARSEMEM_ENABLE" = "y";
+  "CONFIG_ARCH_SPARSEMEM_DEFAULT" = "y";
+  "CONFIG_ARCH_SELECT_MEMORY_MODEL" = "y";
+  "CONFIG_ILLEGAL_POINTER_VALUE" = "0xdead000000000000";
+  "CONFIG_SELECT_MEMORY_MODEL" = "y";
+  "CONFIG_SPARSEMEM_MANUAL" = "y";
+  "CONFIG_SPARSEMEM" = "y";
+  "CONFIG_NEED_MULTIPLE_NODES" = "y";
+  "CONFIG_HAVE_MEMORY_PRESENT" = "y";
+  "CONFIG_SPARSEMEM_EXTREME" = "y";
+  "CONFIG_SPARSEMEM_VMEMMAP_ENABLE" = "y";
+  "CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER" = "y";
+  "CONFIG_SPARSEMEM_VMEMMAP" = "y";
+  "CONFIG_HAVE_MEMBLOCK" = "y";
+  "CONFIG_HAVE_MEMBLOCK_NODE_MAP" = "y";
+  "CONFIG_ARCH_DISCARD_MEMBLOCK" = "y";
+  "CONFIG_SPLIT_PTLOCK_CPUS" = "4";
+  "CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK" = "y";
+  "CONFIG_COMPACTION" = "y";
+  "CONFIG_MIGRATION" = "y";
+  "CONFIG_PHYS_ADDR_T_64BIT" = "y";
+  "CONFIG_ZONE_DMA_FLAG" = "1";
+  "CONFIG_BOUNCE" = "y";
+  "CONFIG_VIRT_TO_BUS" = "y";
+  "CONFIG_MMU_NOTIFIER" = "y";
+  "CONFIG_KSM" = "y";
+  "CONFIG_DEFAULT_MMAP_MIN_ADDR" = "65536";
+  "CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE" = "y";
+  "CONFIG_TRANSPARENT_HUGEPAGE" = "y";
+  "CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS" = "y";
+  "CONFIG_CLEANCACHE" = "y";
+  "CONFIG_FRONTSWAP" = "y";
+  "CONFIG_ZPOOL" = "m";
+  "CONFIG_ZSMALLOC" = "y";
+  "CONFIG_GENERIC_EARLY_IOREMAP" = "y";
+  "CONFIG_ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT" = "y";
+  "CONFIG_FRAME_VECTOR" = "y";
+  "CONFIG_X86_RESERVE_LOW" = "64";
+  "CONFIG_MTRR" = "y";
+  "CONFIG_MTRR_SANITIZER" = "y";
+  "CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT" = "0";
+  "CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT" = "1";
+  "CONFIG_X86_PAT" = "y";
+  "CONFIG_ARCH_USES_PG_UNCACHED" = "y";
+  "CONFIG_ARCH_RANDOM" = "y";
+  "CONFIG_X86_SMAP" = "y";
+  "CONFIG_SECCOMP" = "y";
+  "CONFIG_HZ_1000" = "y";
+  "CONFIG_HZ" = "1000";
+  "CONFIG_SCHED_HRTICK" = "y";
+  "CONFIG_KEXEC" = "y";
+  "CONFIG_KEXEC_FILE" = "y";
+  "CONFIG_PHYSICAL_START" = "0x1000000";
+  "CONFIG_PHYSICAL_ALIGN" = "0x1000000";
+  "CONFIG_LEGACY_VSYSCALL_NONE" = "y";
+  "CONFIG_MODIFY_LDT_SYSCALL" = "y";
+  "CONFIG_HAVE_LIVEPATCH" = "y";
+  "CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG" = "y";
+  "CONFIG_USE_PERCPU_NUMA_NODE_ID" = "y";
+  "CONFIG_PM" = "y";
+  "CONFIG_ACPI" = "y";
+  "CONFIG_ACPI_LEGACY_TABLES_LOOKUP" = "y";
+  "CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC" = "y";
+  "CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT" = "y";
+  "CONFIG_ACPI_REV_OVERRIDE_POSSIBLE" = "y";
+  "CONFIG_ACPI_BUTTON" = "y";
+  "CONFIG_ACPI_VIDEO" = "y";
+  "CONFIG_ACPI_FAN" = "y";
+  "CONFIG_ACPI_DOCK" = "y";
+  "CONFIG_ACPI_CPU_FREQ_PSS" = "y";
+  "CONFIG_ACPI_PROCESSOR_IDLE" = "y";
+  "CONFIG_ACPI_PROCESSOR" = "y";
+  "CONFIG_ACPI_THERMAL" = "y";
+  "CONFIG_ACPI_NUMA" = "y";
+  "CONFIG_ACPI_CUSTOM_DSDT_FILE" = "";
+  "CONFIG_X86_PM_TIMER" = "y";
+  "CONFIG_ACPI_HOTPLUG_IOAPIC" = "y";
+  "CONFIG_ACPI_HED" = "y";
+  "CONFIG_HAVE_ACPI_APEI" = "y";
+  "CONFIG_HAVE_ACPI_APEI_NMI" = "y";
+  "CONFIG_ACPI_EXTLOG" = "m";
+  "CONFIG_CPU_IDLE" = "y";
+  "CONFIG_CPU_IDLE_GOV_LADDER" = "y";
+  "CONFIG_CPU_IDLE_GOV_MENU" = "y";
+  "CONFIG_INTEL_IDLE" = "y";
+  "CONFIG_PCI" = "y";
+  "CONFIG_PCI_DIRECT" = "y";
+  "CONFIG_PCI_MMCONFIG" = "y";
+  "CONFIG_PCI_DOMAINS" = "y";
+  "CONFIG_PCIEPORTBUS" = "y";
+  "CONFIG_PCIEAER" = "y";
+  "CONFIG_PCIEASPM" = "y";
+  "CONFIG_PCIEASPM_PERFORMANCE" = "y";
+  "CONFIG_PCIE_PME" = "y";
+  "CONFIG_PCI_BUS_ADDR_T_64BIT" = "y";
+  "CONFIG_PCI_MSI" = "y";
+  "CONFIG_PCI_MSI_IRQ_DOMAIN" = "y";
+  "CONFIG_HT_IRQ" = "y";
+  "CONFIG_PCI_LABEL" = "y";
+  "CONFIG_ISA_DMA_API" = "y";
+  "CONFIG_AMD_NB" = "y";
+  "CONFIG_BINFMT_ELF" = "y";
+  "CONFIG_COMPAT_BINFMT_ELF" = "y";
+  "CONFIG_BINFMT_SCRIPT" = "y";
+  "CONFIG_BINFMT_MISC" = "y";
+  "CONFIG_COREDUMP" = "y";
+  "CONFIG_IA32_EMULATION" = "y";
+  "CONFIG_X86_X32" = "y";
+  "CONFIG_COMPAT" = "y";
+  "CONFIG_COMPAT_FOR_U64_ALIGNMENT" = "y";
+  "CONFIG_SYSVIPC_COMPAT" = "y";
+  "CONFIG_KEYS_COMPAT" = "y";
+  "CONFIG_X86_DEV_DMA_OPS" = "y";
+  "CONFIG_PMC_ATOM" = "y";
+  "CONFIG_NET" = "y";
+  "CONFIG_NET_INGRESS" = "y";
+  "CONFIG_PACKET" = "y";
+  "CONFIG_PACKET_DIAG" = "m";
+  "CONFIG_UNIX" = "y";
+  "CONFIG_UNIX_DIAG" = "y";
+  "CONFIG_XFRM" = "y";
+  "CONFIG_XFRM_ALGO" = "y";
+  "CONFIG_NET_KEY" = "y";
+  "CONFIG_INET" = "y";
+  "CONFIG_IP_MULTICAST" = "y";
+  "CONFIG_IP_ROUTE_CLASSID" = "y";
+  "CONFIG_NET_IP_TUNNEL" = "m";
+  "CONFIG_SYN_COOKIES" = "y";
+  "CONFIG_NET_UDP_TUNNEL" = "m";
+  "CONFIG_NET_FOU" = "m";
+  "CONFIG_INET_TUNNEL" = "m";
+  "CONFIG_INET_LRO" = "y";
+  "CONFIG_INET_DIAG" = "y";
+  "CONFIG_INET_TCP_DIAG" = "y";
+  "CONFIG_INET_UDP_DIAG" = "y";
+  "CONFIG_TCP_CONG_CUBIC" = "y";
+  "CONFIG_DEFAULT_TCP_CONG" = "cubic";
+  "CONFIG_IPV6" = "y";
+  "CONFIG_IPV6_ROUTER_PREF" = "y";
+  "CONFIG_IPV6_ILA" = "m";
+  "CONFIG_INET6_TUNNEL" = "m";
+  "CONFIG_IPV6_SIT" = "m";
+  "CONFIG_IPV6_NDISC_NODETYPE" = "y";
+  "CONFIG_IPV6_TUNNEL" = "m";
+  "CONFIG_IPV6_GRE" = "m";
+  "CONFIG_NET_PTP_CLASSIFY" = "y";
+  "CONFIG_NETFILTER" = "y";
+  "CONFIG_NETFILTER_ADVANCED" = "y";
+  "CONFIG_BRIDGE_NETFILTER" = "m";
+  "CONFIG_NETFILTER_INGRESS" = "y";
+  "CONFIG_NETFILTER_NETLINK" = "m";
+  "CONFIG_NETFILTER_NETLINK_ACCT" = "m";
+  "CONFIG_NETFILTER_NETLINK_QUEUE" = "m";
+  "CONFIG_NETFILTER_NETLINK_LOG" = "m";
+  "CONFIG_NF_CONNTRACK" = "m";
+  "CONFIG_NF_LOG_COMMON" = "m";
+  "CONFIG_NF_CONNTRACK_MARK" = "y";
+  "CONFIG_NF_CONNTRACK_ZONES" = "y";
+  "CONFIG_NF_CONNTRACK_EVENTS" = "y";
+  "CONFIG_NF_CONNTRACK_TIMEOUT" = "y";
+  "CONFIG_NF_CONNTRACK_LABELS" = "y";
+  "CONFIG_NF_CT_PROTO_DCCP" = "m";
+  "CONFIG_NF_CT_PROTO_GRE" = "m";
+  "CONFIG_NF_CT_PROTO_SCTP" = "m";
+  "CONFIG_NF_CT_PROTO_UDPLITE" = "m";
+  "CONFIG_NF_CONNTRACK_AMANDA" = "m";
+  "CONFIG_NF_CONNTRACK_FTP" = "m";
+  "CONFIG_NF_CONNTRACK_H323" = "m";
+  "CONFIG_NF_CONNTRACK_IRC" = "m";
+  "CONFIG_NF_CONNTRACK_BROADCAST" = "m";
+  "CONFIG_NF_CONNTRACK_NETBIOS_NS" = "m";
+  "CONFIG_NF_CONNTRACK_SNMP" = "m";
+  "CONFIG_NF_CONNTRACK_PPTP" = "m";
+  "CONFIG_NF_CONNTRACK_SANE" = "m";
+  "CONFIG_NF_CONNTRACK_SIP" = "m";
+  "CONFIG_NF_CONNTRACK_TFTP" = "m";
+  "CONFIG_NF_CT_NETLINK" = "m";
+  "CONFIG_NF_CT_NETLINK_TIMEOUT" = "m";
+  "CONFIG_NF_NAT" = "m";
+  "CONFIG_NF_NAT_NEEDED" = "y";
+  "CONFIG_NF_NAT_PROTO_DCCP" = "m";
+  "CONFIG_NF_NAT_PROTO_UDPLITE" = "m";
+  "CONFIG_NF_NAT_PROTO_SCTP" = "m";
+  "CONFIG_NF_NAT_AMANDA" = "m";
+  "CONFIG_NF_NAT_FTP" = "m";
+  "CONFIG_NF_NAT_IRC" = "m";
+  "CONFIG_NF_NAT_SIP" = "m";
+  "CONFIG_NF_NAT_TFTP" = "m";
+  "CONFIG_NF_NAT_REDIRECT" = "m";
+  "CONFIG_NETFILTER_SYNPROXY" = "m";
+  "CONFIG_NF_TABLES" = "m";
+  "CONFIG_NF_TABLES_INET" = "m";
+  "CONFIG_NF_TABLES_NETDEV" = "m";
+  "CONFIG_NFT_EXTHDR" = "m";
+  "CONFIG_NFT_META" = "m";
+  "CONFIG_NFT_CT" = "m";
+  "CONFIG_NFT_RBTREE" = "m";
+  "CONFIG_NFT_HASH" = "m";
+  "CONFIG_NFT_COUNTER" = "m";
+  "CONFIG_NFT_LOG" = "m";
+  "CONFIG_NFT_LIMIT" = "m";
+  "CONFIG_NFT_MASQ" = "m";
+  "CONFIG_NFT_REDIR" = "m";
+  "CONFIG_NFT_NAT" = "m";
+  "CONFIG_NFT_QUEUE" = "m";
+  "CONFIG_NFT_REJECT" = "m";
+  "CONFIG_NFT_REJECT_INET" = "m";
+  "CONFIG_NFT_COMPAT" = "m";
+  "CONFIG_NETFILTER_XTABLES" = "m";
+  "CONFIG_NETFILTER_XT_MARK" = "m";
+  "CONFIG_NETFILTER_XT_CONNMARK" = "m";
+  "CONFIG_NETFILTER_XT_SET" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_CHECKSUM" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_CLASSIFY" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_CONNMARK" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_CT" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_DSCP" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_HL" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_HMARK" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_IDLETIMER" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_LOG" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_MARK" = "m";
+  "CONFIG_NETFILTER_XT_NAT" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_NETMAP" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_NFLOG" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_NFQUEUE" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_NOTRACK" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_RATEEST" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_REDIRECT" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_TEE" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_TPROXY" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_TRACE" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_TCPMSS" = "m";
+  "CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_ADDRTYPE" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_BPF" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_CGROUP" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_CLUSTER" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_COMMENT" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_CONNBYTES" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_CONNLABEL" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_CONNLIMIT" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_CONNMARK" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_CONNTRACK" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_CPU" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_DCCP" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_DEVGROUP" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_DSCP" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_ECN" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_ESP" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_HASHLIMIT" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_HELPER" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_HL" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_IPCOMP" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_IPRANGE" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_L2TP" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_LENGTH" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_LIMIT" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_MAC" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_MARK" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_MULTIPORT" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_NFACCT" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_OSF" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_OWNER" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_POLICY" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_PKTTYPE" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_QUOTA" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_RATEEST" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_REALM" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_RECENT" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_SCTP" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_SOCKET" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_STATE" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_STATISTIC" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_STRING" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_TCPMSS" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_TIME" = "m";
+  "CONFIG_NETFILTER_XT_MATCH_U32" = "m";
+  "CONFIG_IP_SET" = "m";
+  "CONFIG_IP_SET_MAX" = "256";
+  "CONFIG_IP_SET_BITMAP_IP" = "m";
+  "CONFIG_IP_SET_BITMAP_IPMAC" = "m";
+  "CONFIG_IP_SET_BITMAP_PORT" = "m";
+  "CONFIG_IP_SET_HASH_IP" = "m";
+  "CONFIG_IP_SET_HASH_IPMARK" = "m";
+  "CONFIG_IP_SET_HASH_IPPORT" = "m";
+  "CONFIG_IP_SET_HASH_IPPORTIP" = "m";
+  "CONFIG_IP_SET_HASH_IPPORTNET" = "m";
+  "CONFIG_IP_SET_HASH_MAC" = "m";
+  "CONFIG_IP_SET_HASH_NETPORTNET" = "m";
+  "CONFIG_IP_SET_HASH_NET" = "m";
+  "CONFIG_IP_SET_HASH_NETNET" = "m";
+  "CONFIG_IP_SET_HASH_NETPORT" = "m";
+  "CONFIG_IP_SET_HASH_NETIFACE" = "m";
+  "CONFIG_IP_SET_LIST_SET" = "m";
+  "CONFIG_NF_DEFRAG_IPV4" = "m";
+  "CONFIG_NF_CONNTRACK_IPV4" = "m";
+  "CONFIG_NF_TABLES_IPV4" = "m";
+  "CONFIG_NFT_CHAIN_ROUTE_IPV4" = "m";
+  "CONFIG_NFT_REJECT_IPV4" = "m";
+  "CONFIG_NFT_DUP_IPV4" = "m";
+  "CONFIG_NF_TABLES_ARP" = "m";
+  "CONFIG_NF_DUP_IPV4" = "m";
+  "CONFIG_NF_LOG_ARP" = "m";
+  "CONFIG_NF_LOG_IPV4" = "m";
+  "CONFIG_NF_REJECT_IPV4" = "y";
+  "CONFIG_NF_NAT_IPV4" = "m";
+  "CONFIG_NFT_CHAIN_NAT_IPV4" = "m";
+  "CONFIG_NF_NAT_MASQUERADE_IPV4" = "m";
+  "CONFIG_NFT_MASQ_IPV4" = "m";
+  "CONFIG_NFT_REDIR_IPV4" = "m";
+  "CONFIG_NF_NAT_SNMP_BASIC" = "m";
+  "CONFIG_NF_NAT_PROTO_GRE" = "m";
+  "CONFIG_NF_NAT_PPTP" = "m";
+  "CONFIG_NF_NAT_H323" = "m";
+  "CONFIG_IP_NF_IPTABLES" = "m";
+  "CONFIG_IP_NF_MATCH_AH" = "m";
+  "CONFIG_IP_NF_MATCH_ECN" = "m";
+  "CONFIG_IP_NF_MATCH_RPFILTER" = "m";
+  "CONFIG_IP_NF_MATCH_TTL" = "m";
+  "CONFIG_IP_NF_FILTER" = "m";
+  "CONFIG_IP_NF_TARGET_REJECT" = "m";
+  "CONFIG_IP_NF_TARGET_SYNPROXY" = "m";
+  "CONFIG_IP_NF_NAT" = "m";
+  "CONFIG_IP_NF_TARGET_MASQUERADE" = "m";
+  "CONFIG_IP_NF_TARGET_NETMAP" = "m";
+  "CONFIG_IP_NF_TARGET_REDIRECT" = "m";
+  "CONFIG_IP_NF_MANGLE" = "m";
+  "CONFIG_IP_NF_TARGET_CLUSTERIP" = "m";
+  "CONFIG_IP_NF_TARGET_ECN" = "m";
+  "CONFIG_IP_NF_TARGET_TTL" = "m";
+  "CONFIG_IP_NF_RAW" = "m";
+  "CONFIG_IP_NF_ARPTABLES" = "m";
+  "CONFIG_IP_NF_ARPFILTER" = "m";
+  "CONFIG_IP_NF_ARP_MANGLE" = "m";
+  "CONFIG_NF_DEFRAG_IPV6" = "m";
+  "CONFIG_NF_CONNTRACK_IPV6" = "m";
+  "CONFIG_NF_TABLES_IPV6" = "m";
+  "CONFIG_NFT_CHAIN_ROUTE_IPV6" = "m";
+  "CONFIG_NFT_REJECT_IPV6" = "m";
+  "CONFIG_NFT_DUP_IPV6" = "m";
+  "CONFIG_NF_DUP_IPV6" = "m";
+  "CONFIG_NF_REJECT_IPV6" = "y";
+  "CONFIG_NF_LOG_IPV6" = "m";
+  "CONFIG_NF_NAT_IPV6" = "m";
+  "CONFIG_NFT_CHAIN_NAT_IPV6" = "m";
+  "CONFIG_NF_NAT_MASQUERADE_IPV6" = "m";
+  "CONFIG_NFT_MASQ_IPV6" = "m";
+  "CONFIG_NFT_REDIR_IPV6" = "m";
+  "CONFIG_IP6_NF_IPTABLES" = "m";
+  "CONFIG_IP6_NF_MATCH_AH" = "m";
+  "CONFIG_IP6_NF_MATCH_EUI64" = "m";
+  "CONFIG_IP6_NF_MATCH_FRAG" = "m";
+  "CONFIG_IP6_NF_MATCH_OPTS" = "m";
+  "CONFIG_IP6_NF_MATCH_HL" = "m";
+  "CONFIG_IP6_NF_MATCH_IPV6HEADER" = "m";
+  "CONFIG_IP6_NF_MATCH_MH" = "m";
+  "CONFIG_IP6_NF_MATCH_RPFILTER" = "m";
+  "CONFIG_IP6_NF_MATCH_RT" = "m";
+  "CONFIG_IP6_NF_TARGET_HL" = "m";
+  "CONFIG_IP6_NF_FILTER" = "m";
+  "CONFIG_IP6_NF_TARGET_REJECT" = "m";
+  "CONFIG_IP6_NF_TARGET_SYNPROXY" = "m";
+  "CONFIG_IP6_NF_MANGLE" = "m";
+  "CONFIG_IP6_NF_RAW" = "m";
+  "CONFIG_IP6_NF_NAT" = "m";
+  "CONFIG_IP6_NF_TARGET_MASQUERADE" = "m";
+  "CONFIG_IP6_NF_TARGET_NPT" = "m";
+  "CONFIG_NF_TABLES_BRIDGE" = "m";
+  "CONFIG_NFT_BRIDGE_META" = "m";
+  "CONFIG_NFT_BRIDGE_REJECT" = "m";
+  "CONFIG_NF_LOG_BRIDGE" = "m";
+  "CONFIG_L2TP" = "m";
+  "CONFIG_STP" = "m";
+  "CONFIG_BRIDGE" = "m";
+  "CONFIG_BRIDGE_IGMP_SNOOPING" = "y";
+  "CONFIG_HAVE_NET_DSA" = "y";
+  "CONFIG_LLC" = "m";
+  "CONFIG_NET_SCHED" = "y";
+  "CONFIG_NET_SCH_CBQ" = "m";
+  "CONFIG_NET_SCH_HTB" = "m";
+  "CONFIG_NET_SCH_HFSC" = "m";
+  "CONFIG_NET_SCH_PRIO" = "m";
+  "CONFIG_NET_SCH_MULTIQ" = "m";
+  "CONFIG_NET_SCH_RED" = "m";
+  "CONFIG_NET_SCH_SFB" = "m";
+  "CONFIG_NET_SCH_SFQ" = "m";
+  "CONFIG_NET_SCH_TEQL" = "m";
+  "CONFIG_NET_SCH_TBF" = "m";
+  "CONFIG_NET_SCH_GRED" = "m";
+  "CONFIG_NET_SCH_DSMARK" = "m";
+  "CONFIG_NET_SCH_NETEM" = "m";
+  "CONFIG_NET_SCH_DRR" = "m";
+  "CONFIG_NET_SCH_MQPRIO" = "m";
+  "CONFIG_NET_SCH_CHOKE" = "m";
+  "CONFIG_NET_SCH_QFQ" = "m";
+  "CONFIG_NET_SCH_CODEL" = "m";
+  "CONFIG_NET_SCH_FQ_CODEL" = "m";
+  "CONFIG_NET_SCH_FQ" = "m";
+  "CONFIG_NET_SCH_HHF" = "m";
+  "CONFIG_NET_SCH_PIE" = "m";
+  "CONFIG_NET_SCH_INGRESS" = "m";
+  "CONFIG_NET_SCH_PLUG" = "m";
+  "CONFIG_NET_CLS" = "y";
+  "CONFIG_NET_CLS_BASIC" = "m";
+  "CONFIG_NET_CLS_TCINDEX" = "m";
+  "CONFIG_NET_CLS_ROUTE4" = "m";
+  "CONFIG_NET_CLS_FW" = "m";
+  "CONFIG_NET_CLS_U32" = "m";
+  "CONFIG_CLS_U32_MARK" = "y";
+  "CONFIG_NET_CLS_RSVP" = "m";
+  "CONFIG_NET_CLS_RSVP6" = "m";
+  "CONFIG_NET_CLS_FLOW" = "m";
+  "CONFIG_NET_CLS_CGROUP" = "y";
+  "CONFIG_NET_CLS_BPF" = "m";
+  "CONFIG_NET_CLS_FLOWER" = "m";
+  "CONFIG_NET_EMATCH" = "y";
+  "CONFIG_NET_EMATCH_STACK" = "32";
+  "CONFIG_NET_EMATCH_CMP" = "m";
+  "CONFIG_NET_EMATCH_NBYTE" = "m";
+  "CONFIG_NET_EMATCH_U32" = "m";
+  "CONFIG_NET_EMATCH_META" = "m";
+  "CONFIG_NET_EMATCH_TEXT" = "m";
+  "CONFIG_NET_EMATCH_IPSET" = "m";
+  "CONFIG_NET_CLS_ACT" = "y";
+  "CONFIG_NET_ACT_POLICE" = "m";
+  "CONFIG_NET_ACT_GACT" = "m";
+  "CONFIG_GACT_PROB" = "y";
+  "CONFIG_NET_ACT_MIRRED" = "m";
+  "CONFIG_NET_ACT_IPT" = "m";
+  "CONFIG_NET_ACT_NAT" = "m";
+  "CONFIG_NET_ACT_PEDIT" = "m";
+  "CONFIG_NET_ACT_SIMP" = "m";
+  "CONFIG_NET_ACT_SKBEDIT" = "m";
+  "CONFIG_NET_ACT_CSUM" = "m";
+  "CONFIG_NET_ACT_VLAN" = "m";
+  "CONFIG_NET_ACT_BPF" = "m";
+  "CONFIG_NET_ACT_CONNMARK" = "m";
+  "CONFIG_NET_CLS_IND" = "y";
+  "CONFIG_NET_SCH_FIFO" = "y";
+  "CONFIG_DNS_RESOLVER" = "y";
+  "CONFIG_BATMAN_ADV" = "m";
+  "CONFIG_BATMAN_ADV_BLA" = "y";
+  "CONFIG_OPENVSWITCH" = "m";
+  "CONFIG_OPENVSWITCH_VXLAN" = "m";
+  "CONFIG_VSOCKETS" = "m";
+  "CONFIG_NETLINK_MMAP" = "y";
+  "CONFIG_NETLINK_DIAG" = "m";
+  "CONFIG_MPLS" = "y";
+  "CONFIG_NET_MPLS_GSO" = "m";
+  "CONFIG_MPLS_ROUTING" = "m";
+  "CONFIG_MPLS_IPTUNNEL" = "m";
+  "CONFIG_HSR" = "m";
+  "CONFIG_RPS" = "y";
+  "CONFIG_RFS_ACCEL" = "y";
+  "CONFIG_XPS" = "y";
+  "CONFIG_CGROUP_NET_CLASSID" = "y";
+  "CONFIG_NET_RX_BUSY_POLL" = "y";
+  "CONFIG_BQL" = "y";
+  "CONFIG_BPF_JIT" = "y";
+  "CONFIG_NET_FLOW_LIMIT" = "y";
+  "CONFIG_NET_PKTGEN" = "m";
+  "CONFIG_CEPH_LIB" = "m";
+  "CONFIG_LWTUNNEL" = "y";
+  "CONFIG_HAVE_BPF_JIT" = "y";
+  "CONFIG_DEVTMPFS" = "y";
+  "CONFIG_DEVTMPFS_MOUNT" = "y";
+  "CONFIG_FW_LOADER" = "y";
+  "CONFIG_FIRMWARE_IN_KERNEL" = "y";
+  "CONFIG_ALLOW_DEV_COREDUMP" = "y";
+  "CONFIG_GENERIC_CPU_AUTOPROBE" = "y";
+  "CONFIG_REGMAP" = "y";
+  "CONFIG_DMA_SHARED_BUFFER" = "y";
+  "CONFIG_CONNECTOR" = "y";
+  "CONFIG_PROC_EVENTS" = "y";
+  "CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT" = "y";
+  "CONFIG_PNP" = "y";
+  "CONFIG_PNPACPI" = "y";
+  "CONFIG_BLK_DEV" = "y";
+  "CONFIG_BLK_DEV_NULL_BLK" = "m";
+  "CONFIG_ZRAM" = "y";
+  "CONFIG_ZRAM_LZ4_COMPRESS" = "y";
+  "CONFIG_BLK_DEV_LOOP" = "y";
+  "CONFIG_BLK_DEV_LOOP_MIN_COUNT" = "0";
+  "CONFIG_BLK_DEV_CRYPTOLOOP" = "m";
+  "CONFIG_CDROM_PKTCDVD" = "y";
+  "CONFIG_CDROM_PKTCDVD_BUFFERS" = "8";
+  "CONFIG_HAVE_IDE" = "y";
+  "CONFIG_SCSI_MOD" = "y";
+  "CONFIG_SCSI" = "y";
+  "CONFIG_SCSI_DMA" = "y";
+  "CONFIG_SCSI_MQ_DEFAULT" = "y";
+  "CONFIG_BLK_DEV_SD" = "y";
+  "CONFIG_BLK_DEV_SR" = "y";
+  "CONFIG_CHR_DEV_SG" = "y";
+  "CONFIG_ATA" = "y";
+  "CONFIG_ATA_ACPI" = "y";
+  "CONFIG_SATA_AHCI" = "y";
+  "CONFIG_MD" = "y";
+  "CONFIG_BLK_DEV_MD" = "y";
+  "CONFIG_MD_AUTODETECT" = "y";
+  "CONFIG_MD_RAID1" = "y";
+  "CONFIG_BLK_DEV_DM_BUILTIN" = "y";
+  "CONFIG_BLK_DEV_DM" = "y";
+  "CONFIG_DM_BUFIO" = "m";
+  "CONFIG_DM_CRYPT" = "y";
+  "CONFIG_DM_UEVENT" = "y";
+  "CONFIG_DM_FLAKEY" = "m";
+  "CONFIG_DM_VERITY" = "m";
+  "CONFIG_DM_LOG_WRITES" = "m";
+  "CONFIG_NETDEVICES" = "y";
+  "CONFIG_NET_CORE" = "y";
+  "CONFIG_DUMMY" = "m";
+  "CONFIG_NET_TEAM" = "m";
+  "CONFIG_NET_TEAM_MODE_BROADCAST" = "m";
+  "CONFIG_NET_TEAM_MODE_ROUNDROBIN" = "m";
+  "CONFIG_NET_TEAM_MODE_RANDOM" = "m";
+  "CONFIG_NET_TEAM_MODE_ACTIVEBACKUP" = "m";
+  "CONFIG_NET_TEAM_MODE_LOADBALANCE" = "m";
+  "CONFIG_VXLAN" = "m";
+  "CONFIG_GENEVE" = "m";
+  "CONFIG_NETCONSOLE" = "m";
+  "CONFIG_NETPOLL" = "y";
+  "CONFIG_NET_POLL_CONTROLLER" = "y";
+  "CONFIG_TUN" = "m";
+  "CONFIG_NLMON" = "m";
+  "CONFIG_VHOST_NET" = "m";
+  "CONFIG_VHOST_RING" = "m";
+  "CONFIG_VHOST" = "m";
+  "CONFIG_ETHERNET" = "y";
+  "CONFIG_NET_VENDOR_INTEL" = "y";
+  "CONFIG_E1000E" = "y";
+  "CONFIG_PPP" = "m";
+  "CONFIG_PPP_BSDCOMP" = "m";
+  "CONFIG_PPP_DEFLATE" = "m";
+  "CONFIG_PPP_FILTER" = "y";
+  "CONFIG_PPP_MPPE" = "m";
+  "CONFIG_PPPOE" = "m";
+  "CONFIG_PPP_ASYNC" = "m";
+  "CONFIG_PPP_SYNC_TTY" = "m";
+  "CONFIG_SLHC" = "m";
+  "CONFIG_USB_NET_DRIVERS" = "m";
+  "CONFIG_INPUT" = "y";
+  "CONFIG_INPUT_LEDS" = "m";
+  "CONFIG_INPUT_FF_MEMLESS" = "y";
+  "CONFIG_INPUT_MOUSEDEV" = "y";
+  "CONFIG_INPUT_MOUSEDEV_SCREEN_X" = "1600";
+  "CONFIG_INPUT_MOUSEDEV_SCREEN_Y" = "1200";
+  "CONFIG_INPUT_JOYDEV" = "y";
+  "CONFIG_INPUT_EVDEV" = "y";
+  "CONFIG_INPUT_KEYBOARD" = "y";
+  "CONFIG_KEYBOARD_ATKBD" = "y";
+  "CONFIG_INPUT_MOUSE" = "y";
+  "CONFIG_INPUT_MISC" = "y";
+  "CONFIG_INPUT_UINPUT" = "m";
+  "CONFIG_SERIO" = "y";
+  "CONFIG_ARCH_MIGHT_HAVE_PC_SERIO" = "y";
+  "CONFIG_SERIO_I8042" = "y";
+  "CONFIG_SERIO_LIBPS2" = "y";
+  "CONFIG_USERIO" = "m";
+  "CONFIG_TTY" = "y";
+  "CONFIG_VT" = "y";
+  "CONFIG_CONSOLE_TRANSLATIONS" = "y";
+  "CONFIG_VT_CONSOLE" = "y";
+  "CONFIG_HW_CONSOLE" = "y";
+  "CONFIG_VT_HW_CONSOLE_BINDING" = "y";
+  "CONFIG_UNIX98_PTYS" = "y";
+  "CONFIG_DEVPTS_MULTIPLE_INSTANCES" = "y";
+  "CONFIG_DEVMEM" = "y";
+  "CONFIG_DEVKMEM" = "y";
+  "CONFIG_NVRAM" = "m";
+  "CONFIG_HPET" = "y";
+  "CONFIG_HPET_MMAP" = "y";
+  "CONFIG_HPET_MMAP_DEFAULT" = "y";
+  "CONFIG_HANGCHECK_TIMER" = "m";
+  "CONFIG_DEVPORT" = "y";
+  "CONFIG_I2C" = "y";
+  "CONFIG_I2C_BOARDINFO" = "y";
+  "CONFIG_I2C_CHARDEV" = "y";
+  "CONFIG_I2C_MUX" = "y";
+  "CONFIG_I2C_HELPER_AUTO" = "y";
+  "CONFIG_I2C_ALGOBIT" = "y";
+  "CONFIG_I2C_I801" = "y";
+  "CONFIG_PPS" = "y";
+  "CONFIG_PTP_1588_CLOCK" = "y";
+  "CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB" = "y";
+  "CONFIG_POWER_SUPPLY" = "y";
+  "CONFIG_HWMON" = "y";
+  "CONFIG_HWMON_VID" = "y";
+  "CONFIG_SENSORS_ASC7621" = "y";
+  "CONFIG_SENSORS_CORETEMP" = "y";
+  "CONFIG_SENSORS_W83627EHF" = "y";
+  "CONFIG_THERMAL" = "y";
+  "CONFIG_THERMAL_HWMON" = "y";
+  "CONFIG_THERMAL_WRITABLE_TRIPS" = "y";
+  "CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE" = "y";
+  "CONFIG_THERMAL_GOV_STEP_WISE" = "y";
+  "CONFIG_THERMAL_GOV_USER_SPACE" = "y";
+  "CONFIG_THERMAL_GOV_POWER_ALLOCATOR" = "y";
+  "CONFIG_INTEL_POWERCLAMP" = "m";
+  "CONFIG_X86_PKG_TEMP_THERMAL" = "m";
+  "CONFIG_INTEL_PCH_THERMAL" = "m";
+  "CONFIG_SSB_POSSIBLE" = "y";
+  "CONFIG_BCMA_POSSIBLE" = "y";
+  "CONFIG_MEDIA_SUPPORT" = "y";
+  "CONFIG_MEDIA_CAMERA_SUPPORT" = "y";
+  "CONFIG_VIDEO_DEV" = "y";
+  "CONFIG_VIDEO_V4L2" = "y";
+  "CONFIG_VIDEOBUF2_CORE" = "y";
+  "CONFIG_VIDEOBUF2_MEMOPS" = "y";
+  "CONFIG_VIDEOBUF2_VMALLOC" = "y";
+  "CONFIG_MEDIA_USB_SUPPORT" = "y";
+  "CONFIG_USB_VIDEO_CLASS" = "y";
+  "CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV" = "y";
+  "CONFIG_USB_GSPCA" = "m";
+  "CONFIG_USB_M5602" = "m";
+  "CONFIG_USB_STV06XX" = "m";
+  "CONFIG_USB_GL860" = "m";
+  "CONFIG_USB_GSPCA_BENQ" = "m";
+  "CONFIG_USB_GSPCA_CONEX" = "m";
+  "CONFIG_USB_GSPCA_CPIA1" = "m";
+  "CONFIG_USB_GSPCA_DTCS033" = "m";
+  "CONFIG_USB_GSPCA_ETOMS" = "m";
+  "CONFIG_USB_GSPCA_FINEPIX" = "m";
+  "CONFIG_USB_GSPCA_JEILINJ" = "m";
+  "CONFIG_USB_GSPCA_JL2005BCD" = "m";
+  "CONFIG_USB_GSPCA_KINECT" = "m";
+  "CONFIG_USB_GSPCA_KONICA" = "m";
+  "CONFIG_USB_GSPCA_MARS" = "m";
+  "CONFIG_USB_GSPCA_MR97310A" = "m";
+  "CONFIG_USB_GSPCA_NW80X" = "m";
+  "CONFIG_USB_GSPCA_OV519" = "m";
+  "CONFIG_USB_GSPCA_OV534" = "m";
+  "CONFIG_USB_GSPCA_OV534_9" = "m";
+  "CONFIG_USB_GSPCA_PAC207" = "m";
+  "CONFIG_USB_GSPCA_PAC7302" = "m";
+  "CONFIG_USB_GSPCA_PAC7311" = "m";
+  "CONFIG_USB_GSPCA_SE401" = "m";
+  "CONFIG_USB_GSPCA_SN9C2028" = "m";
+  "CONFIG_USB_GSPCA_SN9C20X" = "m";
+  "CONFIG_USB_GSPCA_SONIXB" = "m";
+  "CONFIG_USB_GSPCA_SONIXJ" = "m";
+  "CONFIG_USB_GSPCA_SPCA500" = "m";
+  "CONFIG_USB_GSPCA_SPCA501" = "m";
+  "CONFIG_USB_GSPCA_SPCA505" = "m";
+  "CONFIG_USB_GSPCA_SPCA506" = "m";
+  "CONFIG_USB_GSPCA_SPCA508" = "m";
+  "CONFIG_USB_GSPCA_SPCA561" = "m";
+  "CONFIG_USB_GSPCA_SPCA1528" = "m";
+  "CONFIG_USB_GSPCA_SQ905" = "m";
+  "CONFIG_USB_GSPCA_SQ905C" = "m";
+  "CONFIG_USB_GSPCA_SQ930X" = "m";
+  "CONFIG_USB_GSPCA_STK014" = "m";
+  "CONFIG_USB_GSPCA_STK1135" = "m";
+  "CONFIG_USB_GSPCA_STV0680" = "m";
+  "CONFIG_USB_GSPCA_SUNPLUS" = "m";
+  "CONFIG_USB_GSPCA_T613" = "m";
+  "CONFIG_USB_GSPCA_TOPRO" = "m";
+  "CONFIG_USB_GSPCA_TOUPTEK" = "m";
+  "CONFIG_USB_GSPCA_TV8532" = "m";
+  "CONFIG_USB_GSPCA_VC032X" = "m";
+  "CONFIG_USB_GSPCA_VICAM" = "m";
+  "CONFIG_USB_GSPCA_XIRLINK_CIT" = "m";
+  "CONFIG_USB_GSPCA_ZC3XX" = "m";
+  "CONFIG_AGP" = "y";
+  "CONFIG_AGP_INTEL" = "y";
+  "CONFIG_INTEL_GTT" = "y";
+  "CONFIG_VGA_ARB" = "y";
+  "CONFIG_VGA_ARB_MAX_GPUS" = "2";
+  "CONFIG_DRM" = "y";
+  "CONFIG_DRM_KMS_HELPER" = "y";
+  "CONFIG_DRM_KMS_FB_HELPER" = "y";
+  "CONFIG_DRM_TTM" = "y";
+  "CONFIG_DRM_RADEON" = "y";
+  "CONFIG_DRM_RADEON_USERPTR" = "y";
+  "CONFIG_DRM_BOCHS" = "m";
+  "CONFIG_DRM_BRIDGE" = "y";
+  "CONFIG_FB" = "y";
+  "CONFIG_FB_CMDLINE" = "y";
+  "CONFIG_FB_CFB_FILLRECT" = "y";
+  "CONFIG_FB_CFB_COPYAREA" = "y";
+  "CONFIG_FB_CFB_IMAGEBLIT" = "y";
+  "CONFIG_FB_SYS_FILLRECT" = "y";
+  "CONFIG_FB_SYS_COPYAREA" = "y";
+  "CONFIG_FB_SYS_IMAGEBLIT" = "y";
+  "CONFIG_FB_SYS_FOPS" = "y";
+  "CONFIG_FB_MODE_HELPERS" = "y";
+  "CONFIG_FB_TILEBLITTING" = "y";
+  "CONFIG_BACKLIGHT_LCD_SUPPORT" = "y";
+  "CONFIG_BACKLIGHT_CLASS_DEVICE" = "y";
+  "CONFIG_HDMI" = "y";
+  "CONFIG_VGA_CONSOLE" = "y";
+  "CONFIG_VGACON_SOFT_SCROLLBACK" = "y";
+  "CONFIG_VGACON_SOFT_SCROLLBACK_SIZE" = "1024";
+  "CONFIG_DUMMY_CONSOLE" = "y";
+  "CONFIG_DUMMY_CONSOLE_COLUMNS" = "80";
+  "CONFIG_DUMMY_CONSOLE_ROWS" = "25";
+  "CONFIG_FRAMEBUFFER_CONSOLE" = "y";
+  "CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY" = "y";
+  "CONFIG_SOUND" = "y";
+  "CONFIG_SOUND_OSS_CORE" = "y";
+  "CONFIG_SOUND_OSS_CORE_PRECLAIM" = "y";
+  "CONFIG_SND" = "y";
+  "CONFIG_SND_TIMER" = "y";
+  "CONFIG_SND_PCM" = "y";
+  "CONFIG_SND_HWDEP" = "y";
+  "CONFIG_SND_RAWMIDI" = "m";
+  "CONFIG_SND_JACK" = "y";
+  "CONFIG_SND_SEQUENCER" = "y";
+  "CONFIG_SND_SEQ_DUMMY" = "m";
+  "CONFIG_SND_OSSEMUL" = "y";
+  "CONFIG_SND_MIXER_OSS" = "y";
+  "CONFIG_SND_PCM_OSS" = "y";
+  "CONFIG_SND_PCM_OSS_PLUGINS" = "y";
+  "CONFIG_SND_PCM_TIMER" = "y";
+  "CONFIG_SND_SEQUENCER_OSS" = "y";
+  "CONFIG_SND_HRTIMER" = "y";
+  "CONFIG_SND_SEQ_HRTIMER_DEFAULT" = "y";
+  "CONFIG_SND_DYNAMIC_MINORS" = "y";
+  "CONFIG_SND_MAX_CARDS" = "32";
+  "CONFIG_SND_PROC_FS" = "y";
+  "CONFIG_SND_VMASTER" = "y";
+  "CONFIG_SND_DMA_SGBUF" = "y";
+  "CONFIG_SND_RAWMIDI_SEQ" = "m";
+  "CONFIG_SND_PCI" = "y";
+  "CONFIG_SND_CTXFI" = "y";
+  "CONFIG_SND_HDA" = "y";
+  "CONFIG_SND_HDA_INTEL" = "y";
+  "CONFIG_SND_HDA_HWDEP" = "y";
+  "CONFIG_SND_HDA_RECONFIG" = "y";
+  "CONFIG_SND_HDA_INPUT_BEEP" = "y";
+  "CONFIG_SND_HDA_INPUT_BEEP_MODE" = "0";
+  "CONFIG_SND_HDA_PATCH_LOADER" = "y";
+  "CONFIG_SND_HDA_CODEC_REALTEK" = "y";
+  "CONFIG_SND_HDA_GENERIC" = "y";
+  "CONFIG_SND_HDA_POWER_SAVE_DEFAULT" = "0";
+  "CONFIG_SND_HDA_CORE" = "y";
+  "CONFIG_SND_HDA_PREALLOC_SIZE" = "4096";
+  "CONFIG_SND_USB" = "y";
+  "CONFIG_SND_USB_AUDIO" = "m";
+  "CONFIG_HID" = "y";
+  "CONFIG_HID_BATTERY_STRENGTH" = "y";
+  "CONFIG_UHID" = "m";
+  "CONFIG_HID_GENERIC" = "y";
+  "CONFIG_HID_A4TECH" = "y";
+  "CONFIG_HID_APPLE" = "y";
+  "CONFIG_HID_BELKIN" = "y";
+  "CONFIG_HID_CHERRY" = "y";
+  "CONFIG_HID_CHICONY" = "y";
+  "CONFIG_HID_CYPRESS" = "y";
+  "CONFIG_HID_EZKEY" = "y";
+  "CONFIG_HID_GEMBIRD" = "m";
+  "CONFIG_HID_KENSINGTON" = "y";
+  "CONFIG_HID_LOGITECH" = "y";
+  "CONFIG_HID_MICROSOFT" = "y";
+  "CONFIG_HID_MONTEREY" = "y";
+  "CONFIG_HID_PANTHERLORD" = "y";
+  "CONFIG_PANTHERLORD_FF" = "y";
+  "CONFIG_HID_SONY" = "m";
+  "CONFIG_SONY_FF" = "y";
+  "CONFIG_HID_GREENASIA" = "y";
+  "CONFIG_GREENASIA_FF" = "y";
+  "CONFIG_HID_WACOM" = "m";
+  "CONFIG_USB_HID" = "y";
+  "CONFIG_USB_HIDDEV" = "y";
+  "CONFIG_I2C_HID" = "m";
+  "CONFIG_USB_OHCI_LITTLE_ENDIAN" = "y";
+  "CONFIG_USB_SUPPORT" = "y";
+  "CONFIG_USB_COMMON" = "y";
+  "CONFIG_USB_ARCH_HAS_HCD" = "y";
+  "CONFIG_USB" = "y";
+  "CONFIG_USB_ANNOUNCE_NEW_DEVICES" = "y";
+  "CONFIG_USB_DEFAULT_PERSIST" = "y";
+  "CONFIG_USB_MON" = "m";
+  "CONFIG_USB_EHCI_HCD" = "y";
+  "CONFIG_USB_EHCI_ROOT_HUB_TT" = "y";
+  "CONFIG_USB_EHCI_PCI" = "y";
+  "CONFIG_USB_STORAGE" = "y";
+  "CONFIG_USB_STORAGE_REALTEK" = "m";
+  "CONFIG_REALTEK_AUTOPM" = "y";
+  "CONFIG_USB_STORAGE_DATAFAB" = "m";
+  "CONFIG_USB_STORAGE_FREECOM" = "m";
+  "CONFIG_USB_STORAGE_ISD200" = "m";
+  "CONFIG_USB_STORAGE_USBAT" = "m";
+  "CONFIG_USB_STORAGE_SDDR09" = "m";
+  "CONFIG_USB_STORAGE_SDDR55" = "m";
+  "CONFIG_USB_STORAGE_JUMPSHOT" = "m";
+  "CONFIG_USB_STORAGE_ALAUDA" = "m";
+  "CONFIG_USB_STORAGE_ONETOUCH" = "m";
+  "CONFIG_USB_STORAGE_KARMA" = "m";
+  "CONFIG_USB_STORAGE_CYPRESS_ATACB" = "m";
+  "CONFIG_USB_STORAGE_ENE_UB6250" = "m";
+  "CONFIG_USB_UAS" = "m";
+  "CONFIG_USBIP_CORE" = "m";
+  "CONFIG_USBIP_VHCI_HCD" = "m";
+  "CONFIG_USBIP_HOST" = "m";
+  "CONFIG_USB_SERIAL" = "y";
+  "CONFIG_USB_SERIAL_SIMPLE" = "m";
+  "CONFIG_USB_SERIAL_AIRCABLE" = "m";
+  "CONFIG_USB_SERIAL_ARK3116" = "m";
+  "CONFIG_USB_SERIAL_BELKIN" = "m";
+  "CONFIG_USB_SERIAL_CH341" = "m";
+  "CONFIG_USB_SERIAL_WHITEHEAT" = "m";
+  "CONFIG_USB_SERIAL_DIGI_ACCELEPORT" = "m";
+  "CONFIG_USB_SERIAL_CP210X" = "m";
+  "CONFIG_USB_SERIAL_CYPRESS_M8" = "m";
+  "CONFIG_USB_SERIAL_EMPEG" = "m";
+  "CONFIG_USB_SERIAL_FTDI_SIO" = "m";
+  "CONFIG_USB_SERIAL_VISOR" = "m";
+  "CONFIG_USB_SERIAL_IPAQ" = "m";
+  "CONFIG_USB_SERIAL_IR" = "m";
+  "CONFIG_USB_SERIAL_EDGEPORT" = "m";
+  "CONFIG_USB_SERIAL_EDGEPORT_TI" = "m";
+  "CONFIG_USB_SERIAL_F81232" = "m";
+  "CONFIG_USB_SERIAL_GARMIN" = "m";
+  "CONFIG_USB_SERIAL_IPW" = "m";
+  "CONFIG_USB_SERIAL_IUU" = "m";
+  "CONFIG_USB_SERIAL_KEYSPAN_PDA" = "m";
+  "CONFIG_USB_SERIAL_KEYSPAN" = "m";
+  "CONFIG_USB_SERIAL_KEYSPAN_MPR" = "y";
+  "CONFIG_USB_SERIAL_KEYSPAN_USA28" = "y";
+  "CONFIG_USB_SERIAL_KEYSPAN_USA28X" = "y";
+  "CONFIG_USB_SERIAL_KEYSPAN_USA28XA" = "y";
+  "CONFIG_USB_SERIAL_KEYSPAN_USA28XB" = "y";
+  "CONFIG_USB_SERIAL_KEYSPAN_USA19" = "y";
+  "CONFIG_USB_SERIAL_KEYSPAN_USA18X" = "y";
+  "CONFIG_USB_SERIAL_KEYSPAN_USA19W" = "y";
+  "CONFIG_USB_SERIAL_KEYSPAN_USA19QW" = "y";
+  "CONFIG_USB_SERIAL_KEYSPAN_USA19QI" = "y";
+  "CONFIG_USB_SERIAL_KEYSPAN_USA49W" = "y";
+  "CONFIG_USB_SERIAL_KEYSPAN_USA49WLC" = "y";
+  "CONFIG_USB_SERIAL_KLSI" = "m";
+  "CONFIG_USB_SERIAL_KOBIL_SCT" = "m";
+  "CONFIG_USB_SERIAL_MCT_U232" = "m";
+  "CONFIG_USB_SERIAL_METRO" = "m";
+  "CONFIG_USB_SERIAL_MOS7720" = "m";
+  "CONFIG_USB_SERIAL_MOS7840" = "m";
+  "CONFIG_USB_SERIAL_MXUPORT" = "m";
+  "CONFIG_USB_SERIAL_NAVMAN" = "m";
+  "CONFIG_USB_SERIAL_PL2303" = "m";
+  "CONFIG_USB_SERIAL_OTI6858" = "m";
+  "CONFIG_USB_SERIAL_QCAUX" = "m";
+  "CONFIG_USB_SERIAL_QUALCOMM" = "m";
+  "CONFIG_USB_SERIAL_SPCP8X5" = "m";
+  "CONFIG_USB_SERIAL_SAFE" = "m";
+  "CONFIG_USB_SERIAL_SIERRAWIRELESS" = "m";
+  "CONFIG_USB_SERIAL_SYMBOL" = "m";
+  "CONFIG_USB_SERIAL_TI" = "m";
+  "CONFIG_USB_SERIAL_CYBERJACK" = "m";
+  "CONFIG_USB_SERIAL_XIRCOM" = "m";
+  "CONFIG_USB_SERIAL_WWAN" = "m";
+  "CONFIG_USB_SERIAL_OPTION" = "m";
+  "CONFIG_USB_SERIAL_OMNINET" = "m";
+  "CONFIG_USB_SERIAL_OPTICON" = "m";
+  "CONFIG_USB_SERIAL_XSENS_MT" = "m";
+  "CONFIG_USB_SERIAL_WISHBONE" = "m";
+  "CONFIG_USB_SERIAL_SSU100" = "m";
+  "CONFIG_USB_SERIAL_QT2" = "m";
+  "CONFIG_USB_SERIAL_DEBUG" = "m";
+  "CONFIG_USB_EZUSB_FX2" = "m";
+  "CONFIG_NEW_LEDS" = "y";
+  "CONFIG_LEDS_CLASS" = "m";
+  "CONFIG_LEDS_CLASS_FLASH" = "m";
+  "CONFIG_EDAC_ATOMIC_SCRUB" = "y";
+  "CONFIG_EDAC_SUPPORT" = "y";
+  "CONFIG_RTC_LIB" = "y";
+  "CONFIG_RTC_CLASS" = "y";
+  "CONFIG_RTC_HCTOSYS" = "y";
+  "CONFIG_RTC_HCTOSYS_DEVICE" = "rtc0";
+  "CONFIG_RTC_SYSTOHC" = "y";
+  "CONFIG_RTC_SYSTOHC_DEVICE" = "rtc0";
+  "CONFIG_RTC_INTF_SYSFS" = "y";
+  "CONFIG_RTC_INTF_PROC" = "y";
+  "CONFIG_RTC_INTF_DEV" = "y";
+  "CONFIG_RTC_DRV_CMOS" = "y";
+  "CONFIG_IRQ_BYPASS_MANAGER" = "m";
+  "CONFIG_CLKEVT_I8253" = "y";
+  "CONFIG_I8253_LOCK" = "y";
+  "CONFIG_CLKBLD_I8253" = "y";
+  "CONFIG_EXTCON" = "m";
+  "CONFIG_RAS" = "y";
+  "CONFIG_FIRMWARE_MEMMAP" = "y";
+  "CONFIG_DMIID" = "y";
+  "CONFIG_DMI_SYSFS" = "m";
+  "CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK" = "y";
+  "CONFIG_UEFI_CPER" = "y";
+  "CONFIG_DCACHE_WORD_ACCESS" = "y";
+  "CONFIG_EXT2_FS" = "y";
+  "CONFIG_EXT3_FS" = "m";
+  "CONFIG_EXT3_FS_POSIX_ACL" = "y";
+  "CONFIG_EXT3_FS_SECURITY" = "y";
+  "CONFIG_EXT4_FS" = "m";
+  "CONFIG_EXT4_FS_POSIX_ACL" = "y";
+  "CONFIG_EXT4_FS_SECURITY" = "y";
+  "CONFIG_EXT4_ENCRYPTION" = "m";
+  "CONFIG_EXT4_FS_ENCRYPTION" = "y";
+  "CONFIG_JBD2" = "m";
+  "CONFIG_FS_MBCACHE" = "m";
+  "CONFIG_XFS_FS" = "y";
+  "CONFIG_XFS_POSIX_ACL" = "y";
+  "CONFIG_FS_POSIX_ACL" = "y";
+  "CONFIG_EXPORTFS" = "y";
+  "CONFIG_FILE_LOCKING" = "y";
+  "CONFIG_FSNOTIFY" = "y";
+  "CONFIG_DNOTIFY" = "y";
+  "CONFIG_INOTIFY_USER" = "y";
+  "CONFIG_FANOTIFY" = "y";
+  "CONFIG_AUTOFS4_FS" = "y";
+  "CONFIG_FUSE_FS" = "y";
+  "CONFIG_CUSE" = "m";
+  "CONFIG_OVERLAY_FS" = "y";
+  "CONFIG_ISO9660_FS" = "y";
+  "CONFIG_JOLIET" = "y";
+  "CONFIG_UDF_FS" = "y";
+  "CONFIG_UDF_NLS" = "y";
+  "CONFIG_FAT_FS" = "y";
+  "CONFIG_MSDOS_FS" = "y";
+  "CONFIG_VFAT_FS" = "y";
+  "CONFIG_FAT_DEFAULT_CODEPAGE" = "850";
+  "CONFIG_FAT_DEFAULT_IOCHARSET" = "iso8859-1";
+  "CONFIG_NTFS_FS" = "y";
+  "CONFIG_PROC_FS" = "y";
+  "CONFIG_PROC_SYSCTL" = "y";
+  "CONFIG_PROC_PAGE_MONITOR" = "y";
+  "CONFIG_PROC_CHILDREN" = "y";
+  "CONFIG_KERNFS" = "y";
+  "CONFIG_SYSFS" = "y";
+  "CONFIG_TMPFS" = "y";
+  "CONFIG_TMPFS_POSIX_ACL" = "y";
+  "CONFIG_TMPFS_XATTR" = "y";
+  "CONFIG_CONFIGFS_FS" = "y";
+  "CONFIG_MISC_FILESYSTEMS" = "y";
+  "CONFIG_ADFS_FS" = "m";
+  "CONFIG_ADFS_FS_RW" = "y";
+  "CONFIG_AFFS_FS" = "m";
+  "CONFIG_ECRYPT_FS" = "m";
+  "CONFIG_HFS_FS" = "m";
+  "CONFIG_HFSPLUS_FS" = "m";
+  "CONFIG_BEFS_FS" = "m";
+  "CONFIG_BFS_FS" = "m";
+  "CONFIG_EFS_FS" = "m";
+  "CONFIG_LOGFS" = "m";
+  "CONFIG_CRAMFS" = "m";
+  "CONFIG_SQUASHFS" = "m";
+  "CONFIG_SQUASHFS_FILE_CACHE" = "y";
+  "CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU" = "y";
+  "CONFIG_SQUASHFS_ZLIB" = "y";
+  "CONFIG_SQUASHFS_LZ4" = "y";
+  "CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE" = "3";
+  "CONFIG_VXFS_FS" = "m";
+  "CONFIG_MINIX_FS" = "m";
+  "CONFIG_OMFS_FS" = "m";
+  "CONFIG_QNX4FS_FS" = "m";
+  "CONFIG_QNX6FS_FS" = "m";
+  "CONFIG_ROMFS_FS" = "m";
+  "CONFIG_ROMFS_BACKED_BY_BLOCK" = "y";
+  "CONFIG_ROMFS_ON_BLOCK" = "y";
+  "CONFIG_PSTORE" = "y";
+  "CONFIG_PSTORE_RAM" = "y";
+  "CONFIG_SYSV_FS" = "m";
+  "CONFIG_UFS_FS" = "m";
+  "CONFIG_UFS_FS_WRITE" = "y";
+  "CONFIG_NETWORK_FILESYSTEMS" = "y";
+  "CONFIG_NFS_FS" = "y";
+  "CONFIG_NFS_V3" = "y";
+  "CONFIG_NFS_V3_ACL" = "y";
+  "CONFIG_NFS_V4" = "y";
+  "CONFIG_NFS_USE_KERNEL_DNS" = "y";
+  "CONFIG_NFSD" = "y";
+  "CONFIG_NFSD_V2_ACL" = "y";
+  "CONFIG_NFSD_V3" = "y";
+  "CONFIG_NFSD_V3_ACL" = "y";
+  "CONFIG_NFSD_V4" = "y";
+  "CONFIG_GRACE_PERIOD" = "y";
+  "CONFIG_LOCKD" = "y";
+  "CONFIG_LOCKD_V4" = "y";
+  "CONFIG_NFS_ACL_SUPPORT" = "y";
+  "CONFIG_NFS_COMMON" = "y";
+  "CONFIG_SUNRPC" = "y";
+  "CONFIG_SUNRPC_GSS" = "y";
+  "CONFIG_RPCSEC_GSS_KRB5" = "m";
+  "CONFIG_CEPH_FS" = "m";
+  "CONFIG_CIFS" = "y";
+  "CONFIG_NLS" = "y";
+  "CONFIG_NLS_DEFAULT" = "ascii";
+  "CONFIG_NLS_CODEPAGE_437" = "m";
+  "CONFIG_NLS_CODEPAGE_850" = "m";
+  "CONFIG_NLS_CODEPAGE_852" = "m";
+  "CONFIG_NLS_ASCII" = "y";
+  "CONFIG_NLS_ISO8859_1" = "m";
+  "CONFIG_NLS_ISO8859_15" = "m";
+  "CONFIG_NLS_MAC_ROMAN" = "m";
+  "CONFIG_NLS_MAC_CELTIC" = "m";
+  "CONFIG_NLS_MAC_CENTEURO" = "m";
+  "CONFIG_NLS_MAC_CROATIAN" = "m";
+  "CONFIG_NLS_MAC_CYRILLIC" = "m";
+  "CONFIG_NLS_MAC_GAELIC" = "m";
+  "CONFIG_NLS_MAC_GREEK" = "m";
+  "CONFIG_NLS_MAC_ICELAND" = "m";
+  "CONFIG_NLS_MAC_INUIT" = "m";
+  "CONFIG_NLS_MAC_ROMANIAN" = "m";
+  "CONFIG_NLS_MAC_TURKISH" = "m";
+  "CONFIG_NLS_UTF8" = "m";
+  "CONFIG_TRACE_IRQFLAGS_SUPPORT" = "y";
+  "CONFIG_MESSAGE_LOGLEVEL_DEFAULT" = "4";
+  "CONFIG_FRAME_WARN" = "2048";
+  "CONFIG_SECTION_MISMATCH_WARN_ONLY" = "y";
+  "CONFIG_ARCH_WANT_FRAME_POINTERS" = "y";
+  "CONFIG_MAGIC_SYSRQ" = "y";
+  "CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE" = "0x1";
+  "CONFIG_HAVE_DEBUG_KMEMLEAK" = "y";
+  "CONFIG_DEBUG_MEMORY_INIT" = "y";
+  "CONFIG_HAVE_DEBUG_STACKOVERFLOW" = "y";
+  "CONFIG_HAVE_ARCH_KMEMCHECK" = "y";
+  "CONFIG_HAVE_ARCH_KASAN" = "y";
+  "CONFIG_PANIC_ON_OOPS_VALUE" = "0";
+  "CONFIG_PANIC_TIMEOUT" = "0";
+  "CONFIG_SCHED_INFO" = "y";
+  "CONFIG_DEBUG_BUGVERBOSE" = "y";
+  "CONFIG_RCU_CPU_STALL_TIMEOUT" = "60";
+  "CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS" = "y";
+  "CONFIG_USER_STACKTRACE_SUPPORT" = "y";
+  "CONFIG_HAVE_FUNCTION_TRACER" = "y";
+  "CONFIG_HAVE_FUNCTION_GRAPH_TRACER" = "y";
+  "CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST" = "y";
+  "CONFIG_HAVE_DYNAMIC_FTRACE" = "y";
+  "CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS" = "y";
+  "CONFIG_HAVE_FTRACE_MCOUNT_RECORD" = "y";
+  "CONFIG_HAVE_SYSCALL_TRACEPOINTS" = "y";
+  "CONFIG_HAVE_FENTRY" = "y";
+  "CONFIG_HAVE_C_RECORDMCOUNT" = "y";
+  "CONFIG_TRACING_SUPPORT" = "y";
+  "CONFIG_TEST_HEXDUMP" = "m";
+  "CONFIG_MEMTEST" = "y";
+  "CONFIG_HAVE_ARCH_KGDB" = "y";
+  "CONFIG_STRICT_DEVMEM" = "y";
+  "CONFIG_X86_VERBOSE_BOOTUP" = "y";
+  "CONFIG_EARLY_PRINTK" = "y";
+  "CONFIG_DOUBLEFAULT" = "y";
+  "CONFIG_HAVE_MMIOTRACE_SUPPORT" = "y";
+  "CONFIG_IO_DELAY_TYPE_0X80" = "0";
+  "CONFIG_IO_DELAY_TYPE_0XED" = "1";
+  "CONFIG_IO_DELAY_TYPE_UDELAY" = "2";
+  "CONFIG_IO_DELAY_TYPE_NONE" = "3";
+  "CONFIG_IO_DELAY_0X80" = "y";
+  "CONFIG_DEFAULT_IO_DELAY_TYPE" = "0";
+  "CONFIG_KEYS" = "y";
+  "CONFIG_ENCRYPTED_KEYS" = "y";
+  "CONFIG_SECURITY" = "y";
+  "CONFIG_DEFAULT_SECURITY_DAC" = "y";
+  "CONFIG_DEFAULT_SECURITY" = "";
+  "CONFIG_CRYPTO" = "y";
+  "CONFIG_CRYPTO_ALGAPI" = "y";
+  "CONFIG_CRYPTO_ALGAPI2" = "y";
+  "CONFIG_CRYPTO_AEAD" = "y";
+  "CONFIG_CRYPTO_AEAD2" = "y";
+  "CONFIG_CRYPTO_BLKCIPHER" = "y";
+  "CONFIG_CRYPTO_BLKCIPHER2" = "y";
+  "CONFIG_CRYPTO_HASH" = "y";
+  "CONFIG_CRYPTO_HASH2" = "y";
+  "CONFIG_CRYPTO_RNG" = "y";
+  "CONFIG_CRYPTO_RNG2" = "y";
+  "CONFIG_CRYPTO_RNG_DEFAULT" = "y";
+  "CONFIG_CRYPTO_PCOMP" = "y";
+  "CONFIG_CRYPTO_PCOMP2" = "y";
+  "CONFIG_CRYPTO_AKCIPHER2" = "y";
+  "CONFIG_CRYPTO_AKCIPHER" = "m";
+  "CONFIG_CRYPTO_RSA" = "m";
+  "CONFIG_CRYPTO_MANAGER" = "y";
+  "CONFIG_CRYPTO_MANAGER2" = "y";
+  "CONFIG_CRYPTO_USER" = "m";
+  "CONFIG_CRYPTO_GF128MUL" = "y";
+  "CONFIG_CRYPTO_NULL" = "y";
+  "CONFIG_CRYPTO_NULL2" = "y";
+  "CONFIG_CRYPTO_PCRYPT" = "y";
+  "CONFIG_CRYPTO_WORKQUEUE" = "y";
+  "CONFIG_CRYPTO_CRYPTD" = "y";
+  "CONFIG_CRYPTO_MCRYPTD" = "m";
+  "CONFIG_CRYPTO_AUTHENC" = "m";
+  "CONFIG_CRYPTO_TEST" = "m";
+  "CONFIG_CRYPTO_ABLK_HELPER" = "y";
+  "CONFIG_CRYPTO_GLUE_HELPER_X86" = "y";
+  "CONFIG_CRYPTO_CCM" = "m";
+  "CONFIG_CRYPTO_GCM" = "m";
+  "CONFIG_CRYPTO_CHACHA20POLY1305" = "m";
+  "CONFIG_CRYPTO_SEQIV" = "y";
+  "CONFIG_CRYPTO_ECHAINIV" = "m";
+  "CONFIG_CRYPTO_CBC" = "y";
+  "CONFIG_CRYPTO_CTR" = "y";
+  "CONFIG_CRYPTO_CTS" = "m";
+  "CONFIG_CRYPTO_ECB" = "y";
+  "CONFIG_CRYPTO_LRW" = "y";
+  "CONFIG_CRYPTO_PCBC" = "y";
+  "CONFIG_CRYPTO_XTS" = "y";
+  "CONFIG_CRYPTO_KEYWRAP" = "m";
+  "CONFIG_CRYPTO_CMAC" = "y";
+  "CONFIG_CRYPTO_HMAC" = "y";
+  "CONFIG_CRYPTO_XCBC" = "m";
+  "CONFIG_CRYPTO_VMAC" = "m";
+  "CONFIG_CRYPTO_CRC32C" = "y";
+  "CONFIG_CRYPTO_CRC32C_INTEL" = "y";
+  "CONFIG_CRYPTO_CRC32" = "y";
+  "CONFIG_CRYPTO_CRC32_PCLMUL" = "y";
+  "CONFIG_CRYPTO_CRCT10DIF" = "y";
+  "CONFIG_CRYPTO_CRCT10DIF_PCLMUL" = "m";
+  "CONFIG_CRYPTO_GHASH" = "y";
+  "CONFIG_CRYPTO_POLY1305" = "m";
+  "CONFIG_CRYPTO_POLY1305_X86_64" = "m";
+  "CONFIG_CRYPTO_MD4" = "y";
+  "CONFIG_CRYPTO_MD5" = "y";
+  "CONFIG_CRYPTO_MICHAEL_MIC" = "y";
+  "CONFIG_CRYPTO_RMD128" = "m";
+  "CONFIG_CRYPTO_RMD160" = "m";
+  "CONFIG_CRYPTO_RMD256" = "m";
+  "CONFIG_CRYPTO_RMD320" = "m";
+  "CONFIG_CRYPTO_SHA1" = "y";
+  "CONFIG_CRYPTO_SHA1_SSSE3" = "y";
+  "CONFIG_CRYPTO_SHA256_SSSE3" = "y";
+  "CONFIG_CRYPTO_SHA512_SSSE3" = "y";
+  "CONFIG_CRYPTO_SHA1_MB" = "m";
+  "CONFIG_CRYPTO_SHA256" = "y";
+  "CONFIG_CRYPTO_SHA512" = "y";
+  "CONFIG_CRYPTO_TGR192" = "m";
+  "CONFIG_CRYPTO_WP512" = "m";
+  "CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL" = "m";
+  "CONFIG_CRYPTO_AES" = "y";
+  "CONFIG_CRYPTO_AES_X86_64" = "y";
+  "CONFIG_CRYPTO_AES_NI_INTEL" = "y";
+  "CONFIG_CRYPTO_ANUBIS" = "m";
+  "CONFIG_CRYPTO_ARC4" = "y";
+  "CONFIG_CRYPTO_BLOWFISH" = "y";
+  "CONFIG_CRYPTO_BLOWFISH_COMMON" = "y";
+  "CONFIG_CRYPTO_BLOWFISH_X86_64" = "y";
+  "CONFIG_CRYPTO_CAMELLIA" = "m";
+  "CONFIG_CRYPTO_CAMELLIA_X86_64" = "y";
+  "CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64" = "y";
+  "CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64" = "y";
+  "CONFIG_CRYPTO_CAST_COMMON" = "y";
+  "CONFIG_CRYPTO_CAST5" = "y";
+  "CONFIG_CRYPTO_CAST5_AVX_X86_64" = "y";
+  "CONFIG_CRYPTO_CAST6" = "y";
+  "CONFIG_CRYPTO_CAST6_AVX_X86_64" = "y";
+  "CONFIG_CRYPTO_DES" = "y";
+  "CONFIG_CRYPTO_DES3_EDE_X86_64" = "y";
+  "CONFIG_CRYPTO_FCRYPT" = "m";
+  "CONFIG_CRYPTO_KHAZAD" = "m";
+  "CONFIG_CRYPTO_SALSA20" = "m";
+  "CONFIG_CRYPTO_SALSA20_X86_64" = "m";
+  "CONFIG_CRYPTO_CHACHA20" = "m";
+  "CONFIG_CRYPTO_CHACHA20_X86_64" = "m";
+  "CONFIG_CRYPTO_SEED" = "m";
+  "CONFIG_CRYPTO_SERPENT" = "y";
+  "CONFIG_CRYPTO_SERPENT_SSE2_X86_64" = "y";
+  "CONFIG_CRYPTO_SERPENT_AVX_X86_64" = "y";
+  "CONFIG_CRYPTO_SERPENT_AVX2_X86_64" = "y";
+  "CONFIG_CRYPTO_TEA" = "m";
+  "CONFIG_CRYPTO_TWOFISH" = "y";
+  "CONFIG_CRYPTO_TWOFISH_COMMON" = "y";
+  "CONFIG_CRYPTO_TWOFISH_X86_64" = "y";
+  "CONFIG_CRYPTO_TWOFISH_X86_64_3WAY" = "y";
+  "CONFIG_CRYPTO_TWOFISH_AVX_X86_64" = "y";
+  "CONFIG_CRYPTO_DEFLATE" = "y";
+  "CONFIG_CRYPTO_ZLIB" = "y";
+  "CONFIG_CRYPTO_LZO" = "y";
+  "CONFIG_CRYPTO_842" = "m";
+  "CONFIG_CRYPTO_LZ4" = "y";
+  "CONFIG_CRYPTO_LZ4HC" = "y";
+  "CONFIG_CRYPTO_ANSI_CPRNG" = "m";
+  "CONFIG_CRYPTO_DRBG_MENU" = "y";
+  "CONFIG_CRYPTO_DRBG_HMAC" = "y";
+  "CONFIG_CRYPTO_DRBG" = "y";
+  "CONFIG_CRYPTO_JITTERENTROPY" = "y";
+  "CONFIG_CRYPTO_USER_API" = "m";
+  "CONFIG_CRYPTO_USER_API_HASH" = "m";
+  "CONFIG_CRYPTO_USER_API_SKCIPHER" = "m";
+  "CONFIG_CRYPTO_USER_API_RNG" = "m";
+  "CONFIG_CRYPTO_USER_API_AEAD" = "m";
+  "CONFIG_CRYPTO_HASH_INFO" = "y";
+  "CONFIG_ASYMMETRIC_KEY_TYPE" = "y";
+  "CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE" = "y";
+  "CONFIG_PUBLIC_KEY_ALGO_RSA" = "y";
+  "CONFIG_X509_CERTIFICATE_PARSER" = "y";
+  "CONFIG_PKCS7_MESSAGE_PARSER" = "m";
+  "CONFIG_PKCS7_TEST_KEY" = "m";
+  "CONFIG_SYSTEM_TRUSTED_KEYRING" = "y";
+  "CONFIG_SYSTEM_TRUSTED_KEYS" = "";
+  "CONFIG_HAVE_KVM" = "y";
+  "CONFIG_HAVE_KVM_IRQCHIP" = "y";
+  "CONFIG_HAVE_KVM_IRQFD" = "y";
+  "CONFIG_HAVE_KVM_IRQ_ROUTING" = "y";
+  "CONFIG_HAVE_KVM_EVENTFD" = "y";
+  "CONFIG_KVM_APIC_ARCHITECTURE" = "y";
+  "CONFIG_KVM_MMIO" = "y";
+  "CONFIG_KVM_ASYNC_PF" = "y";
+  "CONFIG_HAVE_KVM_MSI" = "y";
+  "CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT" = "y";
+  "CONFIG_KVM_VFIO" = "y";
+  "CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT" = "y";
+  "CONFIG_KVM_COMPAT" = "y";
+  "CONFIG_HAVE_KVM_IRQ_BYPASS" = "y";
+  "CONFIG_VIRTUALIZATION" = "y";
+  "CONFIG_KVM" = "m";
+  "CONFIG_KVM_INTEL" = "m";
+  "CONFIG_BITREVERSE" = "y";
+  "CONFIG_GENERIC_STRNCPY_FROM_USER" = "y";
+  "CONFIG_GENERIC_STRNLEN_USER" = "y";
+  "CONFIG_GENERIC_NET_UTILS" = "y";
+  "CONFIG_GENERIC_FIND_FIRST_BIT" = "y";
+  "CONFIG_GENERIC_PCI_IOMAP" = "y";
+  "CONFIG_GENERIC_IOMAP" = "y";
+  "CONFIG_GENERIC_IO" = "y";
+  "CONFIG_ARCH_USE_CMPXCHG_LOCKREF" = "y";
+  "CONFIG_ARCH_HAS_FAST_MULTIPLIER" = "y";
+  "CONFIG_CRC_CCITT" = "y";
+  "CONFIG_CRC16" = "y";
+  "CONFIG_CRC_T10DIF" = "y";
+  "CONFIG_CRC_ITU_T" = "y";
+  "CONFIG_CRC32" = "y";
+  "CONFIG_CRC32_SELFTEST" = "y";
+  "CONFIG_CRC32_SLICEBY8" = "y";
+  "CONFIG_CRC7" = "y";
+  "CONFIG_LIBCRC32C" = "y";
+  "CONFIG_CRC8" = "y";
+  "CONFIG_RANDOM32_SELFTEST" = "y";
+  "CONFIG_842_COMPRESS" = "m";
+  "CONFIG_842_DECOMPRESS" = "m";
+  "CONFIG_ZLIB_INFLATE" = "y";
+  "CONFIG_ZLIB_DEFLATE" = "y";
+  "CONFIG_LZO_COMPRESS" = "y";
+  "CONFIG_LZO_DECOMPRESS" = "y";
+  "CONFIG_LZ4_COMPRESS" = "y";
+  "CONFIG_LZ4HC_COMPRESS" = "y";
+  "CONFIG_LZ4_DECOMPRESS" = "y";
+  "CONFIG_XZ_DEC" = "y";
+  "CONFIG_XZ_DEC_X86" = "y";
+  "CONFIG_XZ_DEC_POWERPC" = "y";
+  "CONFIG_XZ_DEC_IA64" = "y";
+  "CONFIG_XZ_DEC_ARM" = "y";
+  "CONFIG_XZ_DEC_ARMTHUMB" = "y";
+  "CONFIG_XZ_DEC_SPARC" = "y";
+  "CONFIG_XZ_DEC_BCJ" = "y";
+  "CONFIG_XZ_DEC_TEST" = "y";
+  "CONFIG_DECOMPRESS_GZIP" = "y";
+  "CONFIG_DECOMPRESS_BZIP2" = "y";
+  "CONFIG_DECOMPRESS_LZMA" = "y";
+  "CONFIG_DECOMPRESS_XZ" = "y";
+  "CONFIG_DECOMPRESS_LZO" = "y";
+  "CONFIG_DECOMPRESS_LZ4" = "y";
+  "CONFIG_GENERIC_ALLOCATOR" = "y";
+  "CONFIG_REED_SOLOMON" = "y";
+  "CONFIG_REED_SOLOMON_ENC8" = "y";
+  "CONFIG_REED_SOLOMON_DEC8" = "y";
+  "CONFIG_TEXTSEARCH" = "y";
+  "CONFIG_TEXTSEARCH_KMP" = "m";
+  "CONFIG_TEXTSEARCH_BM" = "m";
+  "CONFIG_TEXTSEARCH_FSM" = "m";
+  "CONFIG_BTREE" = "y";
+  "CONFIG_INTERVAL_TREE" = "y";
+  "CONFIG_ASSOCIATIVE_ARRAY" = "y";
+  "CONFIG_HAS_IOMEM" = "y";
+  "CONFIG_HAS_IOPORT_MAP" = "y";
+  "CONFIG_HAS_DMA" = "y";
+  "CONFIG_CHECK_SIGNATURE" = "y";
+  "CONFIG_CPU_RMAP" = "y";
+  "CONFIG_DQL" = "y";
+  "CONFIG_GLOB" = "y";
+  "CONFIG_NLATTR" = "y";
+  "CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE" = "y";
+  "CONFIG_CLZ_TAB" = "y";
+  "CONFIG_CORDIC" = "y";
+  "CONFIG_MPILIB" = "y";
+  "CONFIG_OID_REGISTRY" = "y";
+  "CONFIG_FONT_SUPPORT" = "y";
+  "CONFIG_FONT_8x8" = "y";
+  "CONFIG_FONT_8x16" = "y";
+  "CONFIG_ARCH_HAS_SG_CHAIN" = "y";
+  "CONFIG_ARCH_HAS_PMEM_API" = "y";
+  "CONFIG_ARCH_HAS_MMIO_FLUSH" = "y";
+}
diff --git a/machines/aszlig/dnyarri.nix b/machines/aszlig/dnyarri.nix
new file mode 100644
index 00000000..5192e955
--- /dev/null
+++ b/machines/aszlig/dnyarri.nix
@@ -0,0 +1,130 @@
+{ pkgs, lib, ... }:
+
+with lib;
+
+{
+  vuizvui.user.aszlig.profiles.workstation.enable = true;
+
+  nix.maxJobs = 8;
+
+  boot = {
+    kernelParams = [ "snd-hda-intel.patch=patch51.fw" ];
+
+    initrd = {
+      mdadmConf = ''
+        ARRAY /dev/md0 metadata=1.2 UUID=f5e9de04:89efc509:4e184fcc:166b0b67
+        ARRAY /dev/md1 metadata=0.90 UUID=b85aa8be:cea0faf2:7abcbee8:eeae037b
+      '';
+      luks.devices = [
+        { name = "system_crypt";
+          device = "/dev/md1";
+          preLVM = true;
+        }
+      ];
+    };
+
+    loader.grub.devices = [
+      "/dev/disk/by-id/ata-ST31500541AS_5XW0AMNH"
+      "/dev/disk/by-id/ata-ST31500541AS_6XW0M217"
+    ];
+  };
+
+  nixpkgs.config.virtualbox.enableExtensionPack = true;
+
+  vuizvui.user.aszlig.system.kernel.enable = true;
+  vuizvui.user.aszlig.system.kernel.config = let
+    radeonFw = [
+      "radeon/R600_rlc.bin"
+      "radeon/R700_rlc.bin"
+      "radeon/RV710_uvd.bin"
+      "radeon/RV710_smc.bin"
+      "radeon/RV730_smc.bin"
+    ];
+
+    extraFw = radeonFw ++ [ "patch51.fw" ];
+
+    patch51 = pkgs.writeText "patch51.fw" ''
+      [codec]
+      0x10ec0889 0x80860033 2
+
+      [pincfg]
+      0x11 0x01442130
+      0x12 0x411111f0
+      0x14 0x01014410
+      0x15 0x0321403f
+      0x16 0x40f000f0
+      0x17 0x40f000f0
+      0x18 0x03a19020
+      0x19 0x40f000f0
+      0x1a 0x01014412
+      0x1b 0x01014411
+      0x1c 0x411111f0
+      0x1d 0x411111f0
+      0x1e 0x01451140
+      0x1f 0x01c51170
+
+      [model]
+      auto
+    '';
+
+  in import ./dnyarri-kconf.nix // {
+    CONFIG_EXTRA_FIRMWARE = concatStringsSep " " extraFw;
+    CONFIG_EXTRA_FIRMWARE_DIR = pkgs.stdenv.mkDerivation {
+      name = "builtin-firmware";
+      buildCommand = let
+        firmwareBasePath = "${pkgs.firmwareLinuxNonfree}/lib/firmware";
+      in ''
+        mkdir -p "$out/radeon"
+        ${concatMapStrings (x: ''
+          cp -Lv -t "$out/radeon" "${firmwareBasePath}/${x}"
+        '') radeonFw}
+
+        cp "${patch51}" "$out/patch51.fw"
+      '';
+    };
+  };
+
+  networking.hostName = "dnyarri";
+
+  fileSystems = {
+    "/boot" = {
+      label = "boot";
+      fsType = "ext2";
+    };
+    "/" = {
+      device = "/dev/shofixti/root";
+      fsType = "xfs";
+    };
+  };
+
+  powerManagement.powerUpCommands = ''
+    ${pkgs.hdparm}/sbin/hdparm -B 255 /dev/disk/by-id/ata-ST31500541AS_5XW0AMNH
+    ${pkgs.hdparm}/sbin/hdparm -B 255 /dev/disk/by-id/ata-ST31500541AS_6XW0M217
+  '';
+
+  swapDevices = singleton {
+    device = "/dev/shofixti/swap";
+  };
+
+  # TODO: Try to avoid this, but as there is only a single user using audio on
+  # this machine, it's okay for now. But remember that this will break heavily,
+  # should there be another user accessing the audio devices.
+  users.extraUsers.aszlig.extraGroups = [ "audio" "vboxusers" ];
+
+  services.synergy.client.enable = true;
+  services.synergy.client.serverAddress = "mmrnmhrm";
+
+  services.kmscon.enable = true;
+
+  systemd.services."synergy-client".serviceConfig.CPUSchedulingPolicy = "rr";
+  systemd.services."synergy-client".serviceConfig.CPUSchedulingPriority = 50;
+
+  services.xserver.videoDrivers = [ "ati" ];
+  services.xserver.xrandrHeads = [ "HDMI-0" "DVI-0" ];
+
+  vuizvui.user.aszlig.services.i3.reverseHeads = true;
+  vuizvui.user.aszlig.services.i3.workspaces."6" = {
+    label = "Chromium";
+    assign = singleton { class = "^Chromium(?:-browser)?\$"; };
+  };
+}
diff --git a/machines/aszlig/kzerza.nix b/machines/aszlig/kzerza.nix
new file mode 100644
index 00000000..b90b05d2
--- /dev/null
+++ b/machines/aszlig/kzerza.nix
@@ -0,0 +1,71 @@
+{ pkgs, lib, ... }:
+
+with lib;
+
+let
+  rootUUID = "ad41f848-d14a-4a89-9d04-3e48bd73dc5c";
+  diskID = "usb-0000_Removable_Drive_23372707080836980013-0:0";
+in {
+  vuizvui.user.aszlig.profiles.base.enable = true;
+  vuizvui.createISO = true;
+
+  services.xserver.enable = mkForce false;
+
+  services.gpm.enable = true;
+  services.gpm.protocol = "exps2";
+
+  boot = {
+    kernelParams = singleton "consoleblank=0";
+    initrd.kernelModules = [ "fbcon" "usb_storage" ];
+    loader.grub.device = "/dev/disk/by-id/${diskID}";
+  };
+
+  networking.hostName = "kzerza";
+
+  fileSystems."/".device = "/dev/disk/by-uuid/${rootUUID}";
+  fileSystems."/".fsType = "btrfs";
+  fileSystems."/".options = concatStringsSep "," [
+    "ssd"
+    "space_cache"
+    "compress-force=zlib"
+    "noatime"
+  ];
+
+  services.udev.extraRules = ''
+    SUBSYSTEM=="usb*|tty", ACTION=="add|change", ATTRS{idVendor}=="0403", \
+      ATTRS{idProduct}=="6001", OWNER="grandpa"
+  '';
+
+  fileSystems."/tmp".device = "none";
+  fileSystems."/tmp".fsType = "tmpfs";
+  fileSystems."/tmp".options = "nosuid,nodev,relatime";
+
+  users.extraGroups.grandpa.gid = 666;
+  users.extraUsers.grandpa = {
+    uid = 666;
+    description = "GrandPA User";
+    group = "grandpa";
+    createHome = true;
+  };
+
+  systemd.services.grandpa = {
+    description = "GrandPA Lighting Controller";
+    wantedBy = [ "multi-user.target" ];
+    preStart = "${pkgs.kbd}/bin/chvt 7";
+    serviceConfig = {
+      Type = "idle";
+      ExecStart = "${pkgs.vuizvui.grandpa}/bin/grandpa";
+      ExecStopPost = "${pkgs.systemd}/bin/systemctl poweroff";
+      Restart = "on-failure";
+      StandardInput = "tty";
+      StandardOutput = "tty";
+      TTYPath = "/dev/tty7";
+      TTYVTDisallocate = true;
+      User = "grandpa";
+      Group = "grandpa";
+      PermissionsStartOnly = true;
+      PrivateTmp = true;
+      PrivateNetwork = true;
+    };
+  };
+}
diff --git a/machines/aszlig/managed/haenk.nix b/machines/aszlig/managed/haenk.nix
new file mode 100644
index 00000000..75730ff4
--- /dev/null
+++ b/machines/aszlig/managed/haenk.nix
@@ -0,0 +1,95 @@
+{ config, pkgs, lib, ... }:
+
+{
+  boot.initrd.availableKernelModules = [
+    "pata_sis" "ohci_pci" "ehci_pci" "firewire_ohci" "sd_mod" "sr_mod"
+  ];
+  boot.kernelPackages = pkgs.linuxPackages_latest;
+  boot.loader.grub = {
+    enable = true;
+    version = 2;
+    device = "/dev/disk/by-id/ata-FUJITSU_MHV2080AH_NT61T782VR71";
+  };
+
+  environment.systemPackages = with pkgs; [
+    cdparanoia chromium figlet gajim gimp htop inkscape kde5.oxygen-icons5
+    libreoffice mosh mpv pciutils skype vlc vuizvui.greybird-xfce-theme
+    vuizvui.tomahawk wget youtubeDL
+  ];
+
+  fileSystems."/" = {
+    device = "/dev/disk/by-uuid/df1cab2d-cbca-4fc5-af6a-c0580c4db1b7";
+    fsType = "btrfs";
+  };
+
+  swapDevices = lib.singleton {
+    device = "/dev/disk/by-uuid/b5ea0ae8-20c6-43dd-ad97-6d8c783dac02";
+  };
+
+  hardware = {
+    cpu.amd.updateMicrocode = true;
+
+    firmware = lib.singleton (pkgs.runCommand "ipw2x00-firmware" {} ''
+      mkdir -p "$out/lib/firmware"
+      cp "${pkgs.fetchgit rec {
+        name = "ipw2x00-20151227";
+        url = "git://anonscm.debian.org/kernel/firmware-nonfree.git";
+        rev = "e4147b94a856dfe7d4dac11b5da7d9e96b3c2e95";
+        sha256 = "18kymqzhlppj520n6vkq5666qgryz3prym1pxn3sqv34yvav7agi";
+      }}"/debian/config/ipw2x00/*.fw "$out/lib/firmware/"
+    '');
+
+    pulseaudio.enable = true;
+  };
+
+  i18n.consoleKeyMap = "de";
+  i18n.defaultLocale = "en_US.UTF-8";
+
+  networking.hostName = "haenk";
+  networking.firewall.enable = false;
+  networking.wireless.enable = true;
+  networking.useNetworkd = true;
+  networking.enableIntel2200BGFirmware = true;
+
+  nix.maxJobs = 1;
+  nix.useChroot = true;
+  nix.extraOptions = ''
+    auto-optimise-store = true
+  '';
+
+  nixpkgs.config = {
+    allowUnfree = true;
+    pulseaudio = true;
+    chromium.enablePepperFlash = true;
+
+    packageOverrides = opkgs: {
+      # This is because the driver for the NV44M GPU doesn't like LLVM 3.7
+      mesa_noglu = opkgs.mesa_noglu.override {
+        llvmPackages = opkgs.llvmPackages_36;
+      };
+    };
+  };
+
+  services.openssh.enable = true;
+  services.tlp.enable = true;
+  services.ntp.extraFlags = [ "-G" ];
+
+  services.xserver.enable = true;
+  services.xserver.layout = "de";
+  services.xserver.xkbOptions = "eurosign:e";
+  services.xserver.displayManager.auto.enable = true;
+  services.xserver.displayManager.auto.user = "bla";
+  services.xserver.desktopManager.xfce.enable = true;
+  services.xserver.synaptics.enable = true;
+  services.xserver.wacom.enable = true;
+
+  time.timeZone = "Europe/Berlin";
+
+  users.extraUsers.bla = {
+    isNormalUser = true;
+    uid = 1000;
+    extraGroups = [ "video" "wheel" ];
+  };
+
+  vuizvui.user.aszlig.programs.vim.enable = true;
+}
diff --git a/machines/aszlig/managed/notsure.nix b/machines/aszlig/managed/notsure.nix
new file mode 100644
index 00000000..1b807e35
--- /dev/null
+++ b/machines/aszlig/managed/notsure.nix
@@ -0,0 +1,89 @@
+{ pkgs, lib, ... }:
+
+let
+  rootUUID = "ata-WDC_WD7500BPVT-22HXZT3_WD-WX71A9124879";
+
+in {
+  boot = {
+    initrd.availableKernelModules = [ "ehci_pci" "ahci" ];
+    kernelPackages = pkgs.linuxPackages_latest;
+    loader.grub.enable = true;
+    loader.grub.version = 2;
+    loader.grub.device = "/dev/disk/by-id/${rootUUID}";
+  };
+
+  fileSystems."/" = {
+    label = "root";
+    fsType = "btrfs";
+    options = "rw,space_cache,relatime";
+  };
+
+  hardware = {
+    enableAllFirmware = true;
+    opengl.s3tcSupport = true;
+    pulseaudio.enable = true;
+  };
+
+  networking = {
+    firewall.enable = false;
+    hostName = "notsure";
+    networkmanager.enable = true;
+  };
+
+  nix.maxJobs = 2;
+
+  nixpkgs.config = {
+    allowUnfree = true;
+    chromium.enablePepperFlash = true;
+    pulseaudio = true;
+  };
+
+  environment.systemPackages = with pkgs; [
+    chromium
+    file
+    gajim
+    gimp
+    git
+    htop
+    libreoffice
+    miro
+    mpv
+    opentyrian
+    pavucontrol
+    pulseaudioFull
+    samba
+    skype
+    thunderbird
+    vuizvui.tomahawk
+    wine
+    xpdf
+    youtubeDL
+  ];
+
+  i18n = {
+    consoleFont = "lat9w-16";
+    consoleKeyMap = "de";
+    defaultLocale = "en_US.UTF-8";
+  };
+
+  services = {
+    deluge.enable = true;
+    printing.enable = true;
+    tlp.enable = true;
+
+    xserver = {
+      enable = true;
+      layout = "de";
+      xkbOptions = "eurosign:e";
+
+      displayManager.kdm.enable = true;
+      desktopManager.kde5.enable = true;
+    };
+  };
+
+  swapDevices = lib.singleton { label = "swap"; };
+
+  time.timeZone = "Europe/Berlin";
+
+  vuizvui.user.aszlig.programs.vim.enable = true;
+}
diff --git a/machines/aszlig/managed/tyree.nix b/machines/aszlig/managed/tyree.nix
new file mode 100644
index 00000000..fead2ef3
--- /dev/null
+++ b/machines/aszlig/managed/tyree.nix
@@ -0,0 +1,79 @@
+{ config, pkgs, lib, ... }:
+
+{
+  boot.initrd.availableKernelModules = [ "usbhid" ];
+  boot.kernelModules = [ "kvm-intel" ];
+
+  boot.loader.gummiboot.enable = true;
+  boot.loader.efi.canTouchEfiVariables = true;
+
+  environment.systemPackages = with pkgs; [
+    cdparanoia chromium figlet gajim gimp htop inkscape libreoffice mosh mpv
+    pciutils skype vlc vuizvui.tomahawk wget youtubeDL
+  ];
+
+  fileSystems."/boot".device = "/dev/disk/by-uuid/A0D5-269D";
+  fileSystems."/boot".fsType = "vfat";
+
+  fileSystems."/".label = "tyree-root";
+  fileSystems."/".fsType = "btrfs";
+  fileSystems."/".options = lib.concatStringsSep "," [
+    "compress=lzo"
+    "discard"
+    "noatime"
+    "space_cache"
+    "ssd"
+  ];
+
+  swapDevices = lib.singleton {
+    label = "tyree-swap";
+  };
+
+  hardware.cpu.intel.updateMicrocode = true;
+  hardware.pulseaudio.enable = true;
+
+  i18n.consoleKeyMap = "de";
+  i18n.defaultLocale = "en_US.UTF-8";
+
+  networking.hostName = "tyree";
+  networking.firewall.enable = false;
+  networking.wireless.enable = true;
+  networking.useNetworkd = true;
+
+  nix.maxJobs = 4;
+  nix.useChroot = true;
+  nix.readOnlyStore = true;
+  nix.buildCores = 0;
+  nix.extraOptions = ''
+    auto-optimise-store = true
+  '';
+
+  nixpkgs.config = {
+    allowUnfree = true;
+    pulseaudio = true;
+    chromium.enablePepperFlash = true;
+  };
+
+  services.openssh.enable = true;
+  services.tlp.enable = true;
+
+  services.xserver.enable = true;
+  services.xserver.layout = "de";
+  services.xserver.xkbOptions = "eurosign:e";
+  services.xserver.displayManager.auto.enable = true;
+  services.xserver.displayManager.auto.user = "bla";
+  services.xserver.desktopManager.kde5.enable = true;
+  services.xserver.synaptics.enable = true;
+  services.xserver.wacom.enable = true;
+
+  time.timeZone = "Europe/Berlin";
+
+  users.extraUsers.bla = {
+    isNormalUser = true;
+    uid = 1000;
+    extraGroups = [ "video" "wheel" ];
+  };
+
+  vuizvui.hardware.t100ha.enable = true;
+  vuizvui.user.aszlig.programs.vim.enable = true;
+}
diff --git a/machines/aszlig/mmrnmhrm-kconf.nix b/machines/aszlig/mmrnmhrm-kconf.nix
new file mode 100644
index 00000000..17c5cc7e
--- /dev/null
+++ b/machines/aszlig/mmrnmhrm-kconf.nix
@@ -0,0 +1,1272 @@
+{
+  "CONFIG_64BIT" = "y";
+  "CONFIG_X86_64" = "y";
+  "CONFIG_X86" = "y";
+  "CONFIG_INSTRUCTION_DECODER" = "y";
+  "CONFIG_PERF_EVENTS_INTEL_UNCORE" = "y";
+  "CONFIG_OUTPUT_FORMAT" = "elf64-x86-64";
+  "CONFIG_ARCH_DEFCONFIG" = "arch/x86/configs/x86_64_defconfig";
+  "CONFIG_LOCKDEP_SUPPORT" = "y";
+  "CONFIG_STACKTRACE_SUPPORT" = "y";
+  "CONFIG_HAVE_LATENCYTOP_SUPPORT" = "y";
+  "CONFIG_MMU" = "y";
+  "CONFIG_NEED_DMA_MAP_STATE" = "y";
+  "CONFIG_NEED_SG_DMA_LENGTH" = "y";
+  "CONFIG_GENERIC_ISA_DMA" = "y";
+  "CONFIG_GENERIC_BUG" = "y";
+  "CONFIG_GENERIC_BUG_RELATIVE_POINTERS" = "y";
+  "CONFIG_GENERIC_HWEIGHT" = "y";
+  "CONFIG_ARCH_MAY_HAVE_PC_FDC" = "y";
+  "CONFIG_RWSEM_XCHGADD_ALGORITHM" = "y";
+  "CONFIG_GENERIC_CALIBRATE_DELAY" = "y";
+  "CONFIG_ARCH_HAS_CPU_RELAX" = "y";
+  "CONFIG_ARCH_HAS_CACHE_LINE_SIZE" = "y";
+  "CONFIG_HAVE_SETUP_PER_CPU_AREA" = "y";
+  "CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK" = "y";
+  "CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK" = "y";
+  "CONFIG_ARCH_HIBERNATION_POSSIBLE" = "y";
+  "CONFIG_ARCH_SUSPEND_POSSIBLE" = "y";
+  "CONFIG_ARCH_WANT_HUGE_PMD_SHARE" = "y";
+  "CONFIG_ARCH_WANT_GENERAL_HUGETLB" = "y";
+  "CONFIG_ZONE_DMA32" = "y";
+  "CONFIG_AUDIT_ARCH" = "y";
+  "CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING" = "y";
+  "CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC" = "y";
+  "CONFIG_X86_64_SMP" = "y";
+  "CONFIG_ARCH_HWEIGHT_CFLAGS" = "-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11";
+  "CONFIG_ARCH_SUPPORTS_UPROBES" = "y";
+  "CONFIG_FIX_EARLYCON_MEM" = "y";
+  "CONFIG_PGTABLE_LEVELS" = "4";
+  "CONFIG_DEFCONFIG_LIST" = "/lib/modules/$UNAME_RELEASE/.config";
+  "CONFIG_IRQ_WORK" = "y";
+  "CONFIG_BUILDTIME_EXTABLE_SORT" = "y";
+  "CONFIG_INIT_ENV_ARG_LIMIT" = "32";
+  "CONFIG_CROSS_COMPILE" = "";
+  "CONFIG_LOCALVERSION" = "";
+  "CONFIG_HAVE_KERNEL_GZIP" = "y";
+  "CONFIG_HAVE_KERNEL_BZIP2" = "y";
+  "CONFIG_HAVE_KERNEL_LZMA" = "y";
+  "CONFIG_HAVE_KERNEL_XZ" = "y";
+  "CONFIG_HAVE_KERNEL_LZO" = "y";
+  "CONFIG_HAVE_KERNEL_LZ4" = "y";
+  "CONFIG_KERNEL_XZ" = "y";
+  "CONFIG_DEFAULT_HOSTNAME" = "mmrnmhrm";
+  "CONFIG_SWAP" = "y";
+  "CONFIG_SYSVIPC" = "y";
+  "CONFIG_SYSVIPC_SYSCTL" = "y";
+  "CONFIG_POSIX_MQUEUE" = "y";
+  "CONFIG_POSIX_MQUEUE_SYSCTL" = "y";
+  "CONFIG_CROSS_MEMORY_ATTACH" = "y";
+  "CONFIG_FHANDLE" = "y";
+  "CONFIG_HAVE_ARCH_AUDITSYSCALL" = "y";
+  "CONFIG_GENERIC_IRQ_PROBE" = "y";
+  "CONFIG_GENERIC_IRQ_SHOW" = "y";
+  "CONFIG_GENERIC_PENDING_IRQ" = "y";
+  "CONFIG_IRQ_DOMAIN" = "y";
+  "CONFIG_IRQ_DOMAIN_HIERARCHY" = "y";
+  "CONFIG_GENERIC_MSI_IRQ" = "y";
+  "CONFIG_GENERIC_MSI_IRQ_DOMAIN" = "y";
+  "CONFIG_IRQ_FORCED_THREADING" = "y";
+  "CONFIG_SPARSE_IRQ" = "y";
+  "CONFIG_CLOCKSOURCE_WATCHDOG" = "y";
+  "CONFIG_ARCH_CLOCKSOURCE_DATA" = "y";
+  "CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE" = "y";
+  "CONFIG_GENERIC_TIME_VSYSCALL" = "y";
+  "CONFIG_GENERIC_CLOCKEVENTS" = "y";
+  "CONFIG_GENERIC_CLOCKEVENTS_BROADCAST" = "y";
+  "CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST" = "y";
+  "CONFIG_GENERIC_CMOS_UPDATE" = "y";
+  "CONFIG_TICK_ONESHOT" = "y";
+  "CONFIG_NO_HZ_COMMON" = "y";
+  "CONFIG_NO_HZ_IDLE" = "y";
+  "CONFIG_HIGH_RES_TIMERS" = "y";
+  "CONFIG_TICK_CPU_ACCOUNTING" = "y";
+  "CONFIG_BSD_PROCESS_ACCT" = "y";
+  "CONFIG_BSD_PROCESS_ACCT_V3" = "y";
+  "CONFIG_TASKSTATS" = "y";
+  "CONFIG_TASK_DELAY_ACCT" = "y";
+  "CONFIG_TASK_XACCT" = "y";
+  "CONFIG_TASK_IO_ACCOUNTING" = "y";
+  "CONFIG_PREEMPT_RCU" = "y";
+  "CONFIG_SRCU" = "y";
+  "CONFIG_RCU_STALL_COMMON" = "y";
+  "CONFIG_BUILD_BIN2C" = "y";
+  "CONFIG_IKCONFIG" = "y";
+  "CONFIG_IKCONFIG_PROC" = "y";
+  "CONFIG_LOG_BUF_SHIFT" = "17";
+  "CONFIG_LOG_CPU_MAX_BUF_SHIFT" = "14";
+  "CONFIG_HAVE_UNSTABLE_SCHED_CLOCK" = "y";
+  "CONFIG_ARCH_SUPPORTS_NUMA_BALANCING" = "y";
+  "CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH" = "y";
+  "CONFIG_ARCH_SUPPORTS_INT128" = "y";
+  "CONFIG_CGROUPS" = "y";
+  "CONFIG_CGROUP_FREEZER" = "y";
+  "CONFIG_CGROUP_PIDS" = "y";
+  "CONFIG_CGROUP_DEVICE" = "y";
+  "CONFIG_CPUSETS" = "y";
+  "CONFIG_CGROUP_CPUACCT" = "y";
+  "CONFIG_PAGE_COUNTER" = "y";
+  "CONFIG_MEMCG" = "y";
+  "CONFIG_MEMCG_SWAP" = "y";
+  "CONFIG_MEMCG_SWAP_ENABLED" = "y";
+  "CONFIG_MEMCG_KMEM" = "y";
+  "CONFIG_CGROUP_PERF" = "y";
+  "CONFIG_CGROUP_SCHED" = "y";
+  "CONFIG_FAIR_GROUP_SCHED" = "y";
+  "CONFIG_CFS_BANDWIDTH" = "y";
+  "CONFIG_BLK_CGROUP" = "y";
+  "CONFIG_CGROUP_WRITEBACK" = "y";
+  "CONFIG_NAMESPACES" = "y";
+  "CONFIG_UTS_NS" = "y";
+  "CONFIG_IPC_NS" = "y";
+  "CONFIG_USER_NS" = "y";
+  "CONFIG_PID_NS" = "y";
+  "CONFIG_NET_NS" = "y";
+  "CONFIG_SCHED_AUTOGROUP" = "y";
+  "CONFIG_RELAY" = "y";
+  "CONFIG_BLK_DEV_INITRD" = "y";
+  "CONFIG_INITRAMFS_SOURCE" = "";
+  "CONFIG_RD_GZIP" = "y";
+  "CONFIG_RD_BZIP2" = "y";
+  "CONFIG_RD_LZMA" = "y";
+  "CONFIG_RD_XZ" = "y";
+  "CONFIG_RD_LZO" = "y";
+  "CONFIG_RD_LZ4" = "y";
+  "CONFIG_SYSCTL" = "y";
+  "CONFIG_ANON_INODES" = "y";
+  "CONFIG_HAVE_UID16" = "y";
+  "CONFIG_SYSCTL_EXCEPTION_TRACE" = "y";
+  "CONFIG_HAVE_PCSPKR_PLATFORM" = "y";
+  "CONFIG_BPF" = "y";
+  "CONFIG_UID16" = "y";
+  "CONFIG_MULTIUSER" = "y";
+  "CONFIG_SGETMASK_SYSCALL" = "y";
+  "CONFIG_SYSFS_SYSCALL" = "y";
+  "CONFIG_KALLSYMS" = "y";
+  "CONFIG_PRINTK" = "y";
+  "CONFIG_BUG" = "y";
+  "CONFIG_ELF_CORE" = "y";
+  "CONFIG_PCSPKR_PLATFORM" = "y";
+  "CONFIG_BASE_FULL" = "y";
+  "CONFIG_FUTEX" = "y";
+  "CONFIG_EPOLL" = "y";
+  "CONFIG_SIGNALFD" = "y";
+  "CONFIG_TIMERFD" = "y";
+  "CONFIG_EVENTFD" = "y";
+  "CONFIG_SHMEM" = "y";
+  "CONFIG_AIO" = "y";
+  "CONFIG_ADVISE_SYSCALLS" = "y";
+  "CONFIG_PCI_QUIRKS" = "y";
+  "CONFIG_MEMBARRIER" = "y";
+  "CONFIG_HAVE_PERF_EVENTS" = "y";
+  "CONFIG_PERF_EVENTS" = "y";
+  "CONFIG_VM_EVENT_COUNTERS" = "y";
+  "CONFIG_SLUB_DEBUG" = "y";
+  "CONFIG_SLUB" = "y";
+  "CONFIG_KEXEC_CORE" = "y";
+  "CONFIG_HAVE_OPROFILE" = "y";
+  "CONFIG_OPROFILE_NMI_TIMER" = "y";
+  "CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS" = "y";
+  "CONFIG_ARCH_USE_BUILTIN_BSWAP" = "y";
+  "CONFIG_USER_RETURN_NOTIFIER" = "y";
+  "CONFIG_HAVE_IOREMAP_PROT" = "y";
+  "CONFIG_HAVE_KPROBES" = "y";
+  "CONFIG_HAVE_KRETPROBES" = "y";
+  "CONFIG_HAVE_OPTPROBES" = "y";
+  "CONFIG_HAVE_KPROBES_ON_FTRACE" = "y";
+  "CONFIG_HAVE_ARCH_TRACEHOOK" = "y";
+  "CONFIG_HAVE_DMA_ATTRS" = "y";
+  "CONFIG_HAVE_DMA_CONTIGUOUS" = "y";
+  "CONFIG_GENERIC_SMP_IDLE_THREAD" = "y";
+  "CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT" = "y";
+  "CONFIG_HAVE_REGS_AND_STACK_ACCESS_API" = "y";
+  "CONFIG_HAVE_DMA_API_DEBUG" = "y";
+  "CONFIG_HAVE_HW_BREAKPOINT" = "y";
+  "CONFIG_HAVE_MIXED_BREAKPOINTS_REGS" = "y";
+  "CONFIG_HAVE_USER_RETURN_NOTIFIER" = "y";
+  "CONFIG_HAVE_PERF_EVENTS_NMI" = "y";
+  "CONFIG_HAVE_PERF_REGS" = "y";
+  "CONFIG_HAVE_PERF_USER_STACK_DUMP" = "y";
+  "CONFIG_HAVE_ARCH_JUMP_LABEL" = "y";
+  "CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG" = "y";
+  "CONFIG_HAVE_ALIGNED_STRUCT_PAGE" = "y";
+  "CONFIG_HAVE_CMPXCHG_LOCAL" = "y";
+  "CONFIG_HAVE_CMPXCHG_DOUBLE" = "y";
+  "CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION" = "y";
+  "CONFIG_ARCH_WANT_OLD_COMPAT_IPC" = "y";
+  "CONFIG_HAVE_ARCH_SECCOMP_FILTER" = "y";
+  "CONFIG_SECCOMP_FILTER" = "y";
+  "CONFIG_HAVE_CC_STACKPROTECTOR" = "y";
+  "CONFIG_CC_STACKPROTECTOR" = "y";
+  "CONFIG_CC_STACKPROTECTOR_REGULAR" = "y";
+  "CONFIG_HAVE_CONTEXT_TRACKING" = "y";
+  "CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN" = "y";
+  "CONFIG_HAVE_IRQ_TIME_ACCOUNTING" = "y";
+  "CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE" = "y";
+  "CONFIG_HAVE_ARCH_HUGE_VMAP" = "y";
+  "CONFIG_HAVE_ARCH_SOFT_DIRTY" = "y";
+  "CONFIG_MODULES_USE_ELF_RELA" = "y";
+  "CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK" = "y";
+  "CONFIG_ARCH_HAS_ELF_RANDOMIZE" = "y";
+  "CONFIG_HAVE_COPY_THREAD_TLS" = "y";
+  "CONFIG_OLD_SIGSUSPEND3" = "y";
+  "CONFIG_COMPAT_OLD_SIGACTION" = "y";
+  "CONFIG_ARCH_HAS_GCOV_PROFILE_ALL" = "y";
+  "CONFIG_SLABINFO" = "y";
+  "CONFIG_RT_MUTEXES" = "y";
+  "CONFIG_BASE_SMALL" = "0";
+  "CONFIG_MODULES" = "y";
+  "CONFIG_MODULE_FORCE_LOAD" = "y";
+  "CONFIG_MODULE_UNLOAD" = "y";
+  "CONFIG_MODULE_FORCE_UNLOAD" = "y";
+  "CONFIG_MODVERSIONS" = "y";
+  "CONFIG_MODULES_TREE_LOOKUP" = "y";
+  "CONFIG_STOP_MACHINE" = "y";
+  "CONFIG_BLOCK" = "y";
+  "CONFIG_BLK_DEV_BSG" = "y";
+  "CONFIG_BLK_DEV_INTEGRITY" = "y";
+  "CONFIG_BLK_DEV_THROTTLING" = "y";
+  "CONFIG_MSDOS_PARTITION" = "y";
+  "CONFIG_EFI_PARTITION" = "y";
+  "CONFIG_BLOCK_COMPAT" = "y";
+  "CONFIG_IOSCHED_NOOP" = "y";
+  "CONFIG_IOSCHED_DEADLINE" = "y";
+  "CONFIG_IOSCHED_CFQ" = "y";
+  "CONFIG_CFQ_GROUP_IOSCHED" = "y";
+  "CONFIG_IOSCHED_BFQ" = "y";
+  "CONFIG_DEFAULT_BFQ" = "y";
+  "CONFIG_DEFAULT_IOSCHED" = "bfq";
+  "CONFIG_PREEMPT_NOTIFIERS" = "y";
+  "CONFIG_PADATA" = "y";
+  "CONFIG_ASN1" = "m";
+  "CONFIG_UNINLINE_SPIN_UNLOCK" = "y";
+  "CONFIG_ARCH_SUPPORTS_ATOMIC_RMW" = "y";
+  "CONFIG_MUTEX_SPIN_ON_OWNER" = "y";
+  "CONFIG_RWSEM_SPIN_ON_OWNER" = "y";
+  "CONFIG_LOCK_SPIN_ON_OWNER" = "y";
+  "CONFIG_ARCH_USE_QUEUED_SPINLOCKS" = "y";
+  "CONFIG_QUEUED_SPINLOCKS" = "y";
+  "CONFIG_ARCH_USE_QUEUED_RWLOCKS" = "y";
+  "CONFIG_QUEUED_RWLOCKS" = "y";
+  "CONFIG_FREEZER" = "y";
+  "CONFIG_ZONE_DMA" = "y";
+  "CONFIG_SMP" = "y";
+  "CONFIG_X86_FEATURE_NAMES" = "y";
+  "CONFIG_X86_SUPPORTS_MEMORY_FAILURE" = "y";
+  "CONFIG_SCHED_OMIT_FRAME_POINTER" = "y";
+  "CONFIG_NO_BOOTMEM" = "y";
+  "CONFIG_MCORE2" = "y";
+  "CONFIG_X86_INTERNODE_CACHE_SHIFT" = "6";
+  "CONFIG_X86_L1_CACHE_SHIFT" = "6";
+  "CONFIG_X86_INTEL_USERCOPY" = "y";
+  "CONFIG_X86_USE_PPRO_CHECKSUM" = "y";
+  "CONFIG_X86_P6_NOP" = "y";
+  "CONFIG_X86_TSC" = "y";
+  "CONFIG_X86_CMPXCHG64" = "y";
+  "CONFIG_X86_CMOV" = "y";
+  "CONFIG_X86_MINIMUM_CPU_FAMILY" = "64";
+  "CONFIG_X86_DEBUGCTLMSR" = "y";
+  "CONFIG_CPU_SUP_INTEL" = "y";
+  "CONFIG_CPU_SUP_AMD" = "y";
+  "CONFIG_CPU_SUP_CENTAUR" = "y";
+  "CONFIG_HPET_TIMER" = "y";
+  "CONFIG_HPET_EMULATE_RTC" = "y";
+  "CONFIG_DMI" = "y";
+  "CONFIG_SWIOTLB" = "y";
+  "CONFIG_IOMMU_HELPER" = "y";
+  "CONFIG_NR_CPUS" = "8";
+  "CONFIG_SCHED_SMT" = "y";
+  "CONFIG_SCHED_MC" = "y";
+  "CONFIG_PREEMPT" = "y";
+  "CONFIG_PREEMPT_COUNT" = "y";
+  "CONFIG_X86_LOCAL_APIC" = "y";
+  "CONFIG_X86_IO_APIC" = "y";
+  "CONFIG_X86_MCE" = "y";
+  "CONFIG_X86_MCE_INTEL" = "y";
+  "CONFIG_X86_MCE_THRESHOLD" = "y";
+  "CONFIG_X86_THERMAL_VECTOR" = "y";
+  "CONFIG_X86_16BIT" = "y";
+  "CONFIG_X86_ESPFIX64" = "y";
+  "CONFIG_X86_VSYSCALL_EMULATION" = "y";
+  "CONFIG_MICROCODE" = "y";
+  "CONFIG_MICROCODE_INTEL" = "y";
+  "CONFIG_MICROCODE_OLD_INTERFACE" = "y";
+  "CONFIG_X86_MSR" = "m";
+  "CONFIG_X86_CPUID" = "m";
+  "CONFIG_ARCH_PHYS_ADDR_T_64BIT" = "y";
+  "CONFIG_ARCH_DMA_ADDR_T_64BIT" = "y";
+  "CONFIG_X86_DIRECT_GBPAGES" = "y";
+  "CONFIG_ARCH_SPARSEMEM_ENABLE" = "y";
+  "CONFIG_ARCH_SPARSEMEM_DEFAULT" = "y";
+  "CONFIG_ARCH_SELECT_MEMORY_MODEL" = "y";
+  "CONFIG_ILLEGAL_POINTER_VALUE" = "0xdead000000000000";
+  "CONFIG_SELECT_MEMORY_MODEL" = "y";
+  "CONFIG_SPARSEMEM_MANUAL" = "y";
+  "CONFIG_SPARSEMEM" = "y";
+  "CONFIG_HAVE_MEMORY_PRESENT" = "y";
+  "CONFIG_SPARSEMEM_EXTREME" = "y";
+  "CONFIG_SPARSEMEM_VMEMMAP_ENABLE" = "y";
+  "CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER" = "y";
+  "CONFIG_SPARSEMEM_VMEMMAP" = "y";
+  "CONFIG_HAVE_MEMBLOCK" = "y";
+  "CONFIG_HAVE_MEMBLOCK_NODE_MAP" = "y";
+  "CONFIG_ARCH_DISCARD_MEMBLOCK" = "y";
+  "CONFIG_MEMORY_ISOLATION" = "y";
+  "CONFIG_SPLIT_PTLOCK_CPUS" = "4";
+  "CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK" = "y";
+  "CONFIG_MEMORY_BALLOON" = "y";
+  "CONFIG_BALLOON_COMPACTION" = "y";
+  "CONFIG_COMPACTION" = "y";
+  "CONFIG_MIGRATION" = "y";
+  "CONFIG_PHYS_ADDR_T_64BIT" = "y";
+  "CONFIG_ZONE_DMA_FLAG" = "1";
+  "CONFIG_BOUNCE" = "y";
+  "CONFIG_VIRT_TO_BUS" = "y";
+  "CONFIG_MMU_NOTIFIER" = "y";
+  "CONFIG_KSM" = "y";
+  "CONFIG_DEFAULT_MMAP_MIN_ADDR" = "65536";
+  "CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE" = "y";
+  "CONFIG_MEMORY_FAILURE" = "y";
+  "CONFIG_TRANSPARENT_HUGEPAGE" = "y";
+  "CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS" = "y";
+  "CONFIG_CLEANCACHE" = "y";
+  "CONFIG_FRONTSWAP" = "y";
+  "CONFIG_ZSWAP" = "y";
+  "CONFIG_ZPOOL" = "y";
+  "CONFIG_ZBUD" = "y";
+  "CONFIG_ZSMALLOC" = "y";
+  "CONFIG_GENERIC_EARLY_IOREMAP" = "y";
+  "CONFIG_ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT" = "y";
+  "CONFIG_FRAME_VECTOR" = "y";
+  "CONFIG_X86_RESERVE_LOW" = "64";
+  "CONFIG_MTRR" = "y";
+  "CONFIG_MTRR_SANITIZER" = "y";
+  "CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT" = "0";
+  "CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT" = "1";
+  "CONFIG_X86_PAT" = "y";
+  "CONFIG_ARCH_USES_PG_UNCACHED" = "y";
+  "CONFIG_ARCH_RANDOM" = "y";
+  "CONFIG_X86_SMAP" = "y";
+  "CONFIG_SECCOMP" = "y";
+  "CONFIG_HZ_1000" = "y";
+  "CONFIG_HZ" = "1000";
+  "CONFIG_SCHED_HRTICK" = "y";
+  "CONFIG_KEXEC" = "y";
+  "CONFIG_KEXEC_FILE" = "y";
+  "CONFIG_PHYSICAL_START" = "0x1000000";
+  "CONFIG_PHYSICAL_ALIGN" = "0x1000000";
+  "CONFIG_LEGACY_VSYSCALL_NONE" = "y";
+  "CONFIG_MODIFY_LDT_SYSCALL" = "y";
+  "CONFIG_HAVE_LIVEPATCH" = "y";
+  "CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG" = "y";
+  "CONFIG_PM" = "y";
+  "CONFIG_ACPI" = "y";
+  "CONFIG_ACPI_LEGACY_TABLES_LOOKUP" = "y";
+  "CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC" = "y";
+  "CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT" = "y";
+  "CONFIG_ACPI_BUTTON" = "y";
+  "CONFIG_ACPI_VIDEO" = "y";
+  "CONFIG_ACPI_FAN" = "y";
+  "CONFIG_ACPI_DOCK" = "y";
+  "CONFIG_ACPI_CPU_FREQ_PSS" = "y";
+  "CONFIG_ACPI_PROCESSOR_IDLE" = "y";
+  "CONFIG_ACPI_PROCESSOR" = "y";
+  "CONFIG_ACPI_THERMAL" = "y";
+  "CONFIG_ACPI_CUSTOM_DSDT_FILE" = "";
+  "CONFIG_ACPI_INITRD_TABLE_OVERRIDE" = "y";
+  "CONFIG_X86_PM_TIMER" = "y";
+  "CONFIG_ACPI_HOTPLUG_IOAPIC" = "y";
+  "CONFIG_ACPI_HED" = "y";
+  "CONFIG_ACPI_NFIT" = "m";
+  "CONFIG_HAVE_ACPI_APEI" = "y";
+  "CONFIG_HAVE_ACPI_APEI_NMI" = "y";
+  "CONFIG_ACPI_EXTLOG" = "m";
+  "CONFIG_CPU_IDLE" = "y";
+  "CONFIG_CPU_IDLE_GOV_LADDER" = "y";
+  "CONFIG_CPU_IDLE_GOV_MENU" = "y";
+  "CONFIG_INTEL_IDLE" = "y";
+  "CONFIG_PCI" = "y";
+  "CONFIG_PCI_DIRECT" = "y";
+  "CONFIG_PCI_MMCONFIG" = "y";
+  "CONFIG_PCI_DOMAINS" = "y";
+  "CONFIG_PCIEPORTBUS" = "y";
+  "CONFIG_PCIEAER" = "y";
+  "CONFIG_PCIEASPM" = "y";
+  "CONFIG_PCIEASPM_PERFORMANCE" = "y";
+  "CONFIG_PCIE_PME" = "y";
+  "CONFIG_PCI_BUS_ADDR_T_64BIT" = "y";
+  "CONFIG_PCI_MSI" = "y";
+  "CONFIG_PCI_MSI_IRQ_DOMAIN" = "y";
+  "CONFIG_HT_IRQ" = "y";
+  "CONFIG_PCI_LABEL" = "y";
+  "CONFIG_ISA_DMA_API" = "y";
+  "CONFIG_AMD_NB" = "y";
+  "CONFIG_BINFMT_ELF" = "y";
+  "CONFIG_COMPAT_BINFMT_ELF" = "y";
+  "CONFIG_BINFMT_SCRIPT" = "y";
+  "CONFIG_BINFMT_MISC" = "y";
+  "CONFIG_COREDUMP" = "y";
+  "CONFIG_IA32_EMULATION" = "y";
+  "CONFIG_X86_X32" = "y";
+  "CONFIG_COMPAT" = "y";
+  "CONFIG_COMPAT_FOR_U64_ALIGNMENT" = "y";
+  "CONFIG_SYSVIPC_COMPAT" = "y";
+  "CONFIG_KEYS_COMPAT" = "y";
+  "CONFIG_X86_DEV_DMA_OPS" = "y";
+  "CONFIG_PMC_ATOM" = "y";
+  "CONFIG_NET" = "y";
+  "CONFIG_NET_INGRESS" = "y";
+  "CONFIG_PACKET" = "y";
+  "CONFIG_PACKET_DIAG" = "m";
+  "CONFIG_UNIX" = "y";
+  "CONFIG_UNIX_DIAG" = "y";
+  "CONFIG_XFRM" = "y";
+  "CONFIG_XFRM_ALGO" = "y";
+  "CONFIG_NET_KEY" = "y";
+  "CONFIG_INET" = "y";
+  "CONFIG_IP_MULTICAST" = "y";
+  "CONFIG_IP_ROUTE_CLASSID" = "y";
+  "CONFIG_NET_IP_TUNNEL" = "m";
+  "CONFIG_NET_UDP_TUNNEL" = "m";
+  "CONFIG_NET_FOU" = "m";
+  "CONFIG_INET_TUNNEL" = "m";
+  "CONFIG_INET_LRO" = "y";
+  "CONFIG_INET_DIAG" = "y";
+  "CONFIG_INET_TCP_DIAG" = "y";
+  "CONFIG_INET_UDP_DIAG" = "y";
+  "CONFIG_TCP_CONG_CUBIC" = "y";
+  "CONFIG_DEFAULT_TCP_CONG" = "cubic";
+  "CONFIG_IPV6" = "y";
+  "CONFIG_IPV6_ROUTER_PREF" = "y";
+  "CONFIG_IPV6_ILA" = "m";
+  "CONFIG_INET6_TUNNEL" = "m";
+  "CONFIG_IPV6_SIT" = "m";
+  "CONFIG_IPV6_NDISC_NODETYPE" = "y";
+  "CONFIG_IPV6_TUNNEL" = "m";
+  "CONFIG_IPV6_GRE" = "m";
+  "CONFIG_NET_PTP_CLASSIFY" = "y";
+  "CONFIG_IP_SCTP" = "m";
+  "CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5" = "y";
+  "CONFIG_SCTP_COOKIE_HMAC_MD5" = "y";
+  "CONFIG_HAVE_NET_DSA" = "y";
+  "CONFIG_NET_SCHED" = "y";
+  "CONFIG_NET_SCH_CBQ" = "m";
+  "CONFIG_NET_SCH_HTB" = "m";
+  "CONFIG_NET_SCH_HFSC" = "m";
+  "CONFIG_NET_SCH_PRIO" = "m";
+  "CONFIG_NET_SCH_MULTIQ" = "m";
+  "CONFIG_NET_SCH_RED" = "m";
+  "CONFIG_NET_SCH_SFB" = "m";
+  "CONFIG_NET_SCH_SFQ" = "m";
+  "CONFIG_NET_SCH_TEQL" = "m";
+  "CONFIG_NET_SCH_TBF" = "m";
+  "CONFIG_NET_SCH_GRED" = "m";
+  "CONFIG_NET_SCH_DSMARK" = "m";
+  "CONFIG_NET_SCH_NETEM" = "m";
+  "CONFIG_NET_SCH_DRR" = "m";
+  "CONFIG_NET_SCH_MQPRIO" = "m";
+  "CONFIG_NET_SCH_CHOKE" = "m";
+  "CONFIG_NET_SCH_QFQ" = "m";
+  "CONFIG_NET_SCH_CODEL" = "m";
+  "CONFIG_NET_SCH_FQ_CODEL" = "m";
+  "CONFIG_NET_SCH_FQ" = "m";
+  "CONFIG_NET_SCH_HHF" = "m";
+  "CONFIG_NET_SCH_PIE" = "m";
+  "CONFIG_NET_SCH_INGRESS" = "m";
+  "CONFIG_NET_SCH_PLUG" = "m";
+  "CONFIG_NET_CLS" = "y";
+  "CONFIG_NET_CLS_BASIC" = "m";
+  "CONFIG_NET_CLS_TCINDEX" = "m";
+  "CONFIG_NET_CLS_ROUTE4" = "m";
+  "CONFIG_NET_CLS_FW" = "m";
+  "CONFIG_NET_CLS_U32" = "m";
+  "CONFIG_NET_CLS_RSVP" = "m";
+  "CONFIG_NET_CLS_RSVP6" = "m";
+  "CONFIG_NET_CLS_FLOW" = "m";
+  "CONFIG_NET_CLS_CGROUP" = "m";
+  "CONFIG_NET_CLS_BPF" = "m";
+  "CONFIG_NET_CLS_FLOWER" = "m";
+  "CONFIG_NET_EMATCH" = "y";
+  "CONFIG_NET_EMATCH_STACK" = "32";
+  "CONFIG_NET_EMATCH_CMP" = "m";
+  "CONFIG_NET_EMATCH_NBYTE" = "m";
+  "CONFIG_NET_EMATCH_U32" = "m";
+  "CONFIG_NET_EMATCH_META" = "m";
+  "CONFIG_NET_EMATCH_TEXT" = "m";
+  "CONFIG_NET_CLS_ACT" = "y";
+  "CONFIG_NET_ACT_POLICE" = "m";
+  "CONFIG_NET_ACT_GACT" = "m";
+  "CONFIG_NET_ACT_MIRRED" = "m";
+  "CONFIG_NET_ACT_NAT" = "m";
+  "CONFIG_NET_ACT_PEDIT" = "m";
+  "CONFIG_NET_ACT_SIMP" = "m";
+  "CONFIG_NET_ACT_SKBEDIT" = "m";
+  "CONFIG_NET_ACT_CSUM" = "m";
+  "CONFIG_NET_ACT_VLAN" = "m";
+  "CONFIG_NET_ACT_BPF" = "m";
+  "CONFIG_NET_SCH_FIFO" = "y";
+  "CONFIG_DNS_RESOLVER" = "y";
+  "CONFIG_VSOCKETS" = "y";
+  "CONFIG_NETLINK_MMAP" = "y";
+  "CONFIG_NETLINK_DIAG" = "m";
+  "CONFIG_RPS" = "y";
+  "CONFIG_RFS_ACCEL" = "y";
+  "CONFIG_XPS" = "y";
+  "CONFIG_CGROUP_NET_CLASSID" = "y";
+  "CONFIG_NET_RX_BUSY_POLL" = "y";
+  "CONFIG_BQL" = "y";
+  "CONFIG_BPF_JIT" = "y";
+  "CONFIG_NET_FLOW_LIMIT" = "y";
+  "CONFIG_LWTUNNEL" = "y";
+  "CONFIG_HAVE_BPF_JIT" = "y";
+  "CONFIG_DEVTMPFS" = "y";
+  "CONFIG_DEVTMPFS_MOUNT" = "y";
+  "CONFIG_FW_LOADER" = "y";
+  "CONFIG_EXTRA_FIRMWARE" = "";
+  "CONFIG_FW_LOADER_USER_HELPER" = "y";
+  "CONFIG_ALLOW_DEV_COREDUMP" = "y";
+  "CONFIG_GENERIC_CPU_AUTOPROBE" = "y";
+  "CONFIG_REGMAP" = "y";
+  "CONFIG_DMA_SHARED_BUFFER" = "y";
+  "CONFIG_CONNECTOR" = "y";
+  "CONFIG_PROC_EVENTS" = "y";
+  "CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT" = "y";
+  "CONFIG_PNP" = "y";
+  "CONFIG_PNPACPI" = "y";
+  "CONFIG_BLK_DEV" = "y";
+  "CONFIG_BLK_DEV_NULL_BLK" = "m";
+  "CONFIG_ZRAM" = "y";
+  "CONFIG_ZRAM_LZ4_COMPRESS" = "y";
+  "CONFIG_BLK_DEV_LOOP" = "y";
+  "CONFIG_BLK_DEV_LOOP_MIN_COUNT" = "0";
+  "CONFIG_BLK_DEV_CRYPTOLOOP" = "m";
+  "CONFIG_CDROM_PKTCDVD" = "y";
+  "CONFIG_CDROM_PKTCDVD_BUFFERS" = "8";
+  "CONFIG_VIRTIO_BLK" = "m";
+  "CONFIG_EEPROM_AT24" = "m";
+  "CONFIG_EEPROM_93CX6" = "m";
+  "CONFIG_HAVE_IDE" = "y";
+  "CONFIG_SCSI_MOD" = "y";
+  "CONFIG_SCSI" = "y";
+  "CONFIG_SCSI_DMA" = "y";
+  "CONFIG_SCSI_MQ_DEFAULT" = "y";
+  "CONFIG_BLK_DEV_SD" = "y";
+  "CONFIG_BLK_DEV_SR" = "y";
+  "CONFIG_CHR_DEV_SG" = "y";
+  "CONFIG_ATA" = "y";
+  "CONFIG_ATA_ACPI" = "y";
+  "CONFIG_SATA_AHCI" = "y";
+  "CONFIG_ATA_SFF" = "y";
+  "CONFIG_ATA_BMDMA" = "y";
+  "CONFIG_ATA_PIIX" = "y";
+  "CONFIG_MD" = "y";
+  "CONFIG_BLK_DEV_DM_BUILTIN" = "y";
+  "CONFIG_BLK_DEV_DM" = "y";
+  "CONFIG_DM_CRYPT" = "y";
+  "CONFIG_DM_UEVENT" = "y";
+  "CONFIG_DM_LOG_WRITES" = "m";
+  "CONFIG_NETDEVICES" = "y";
+  "CONFIG_NET_CORE" = "y";
+  "CONFIG_VXLAN" = "m";
+  "CONFIG_GENEVE" = "m";
+  "CONFIG_VIRTIO_NET" = "m";
+  "CONFIG_NLMON" = "m";
+  "CONFIG_VHOST_NET" = "m";
+  "CONFIG_VHOST_RING" = "m";
+  "CONFIG_VHOST" = "m";
+  "CONFIG_ETHERNET" = "y";
+  "CONFIG_NET_VENDOR_BROADCOM" = "y";
+  "CONFIG_TIGON3" = "y";
+  "CONFIG_PHYLIB" = "y";
+  "CONFIG_USB_NET_DRIVERS" = "m";
+  "CONFIG_INPUT" = "y";
+  "CONFIG_INPUT_LEDS" = "y";
+  "CONFIG_INPUT_FF_MEMLESS" = "y";
+  "CONFIG_INPUT_MATRIXKMAP" = "m";
+  "CONFIG_INPUT_MOUSEDEV" = "y";
+  "CONFIG_INPUT_MOUSEDEV_SCREEN_X" = "1024";
+  "CONFIG_INPUT_MOUSEDEV_SCREEN_Y" = "768";
+  "CONFIG_INPUT_JOYDEV" = "y";
+  "CONFIG_INPUT_EVDEV" = "y";
+  "CONFIG_INPUT_KEYBOARD" = "y";
+  "CONFIG_KEYBOARD_ATKBD" = "y";
+  "CONFIG_INPUT_MOUSE" = "y";
+  "CONFIG_INPUT_TABLET" = "y";
+  "CONFIG_SERIO" = "y";
+  "CONFIG_ARCH_MIGHT_HAVE_PC_SERIO" = "y";
+  "CONFIG_SERIO_I8042" = "y";
+  "CONFIG_SERIO_LIBPS2" = "y";
+  "CONFIG_TTY" = "y";
+  "CONFIG_VT" = "y";
+  "CONFIG_CONSOLE_TRANSLATIONS" = "y";
+  "CONFIG_VT_CONSOLE" = "y";
+  "CONFIG_HW_CONSOLE" = "y";
+  "CONFIG_VT_HW_CONSOLE_BINDING" = "y";
+  "CONFIG_UNIX98_PTYS" = "y";
+  "CONFIG_DEVPTS_MULTIPLE_INSTANCES" = "y";
+  "CONFIG_DEVMEM" = "y";
+  "CONFIG_DEVKMEM" = "y";
+  "CONFIG_HVC_DRIVER" = "y";
+  "CONFIG_VIRTIO_CONSOLE" = "m";
+  "CONFIG_NVRAM" = "m";
+  "CONFIG_HPET" = "y";
+  "CONFIG_HPET_MMAP" = "y";
+  "CONFIG_HPET_MMAP_DEFAULT" = "y";
+  "CONFIG_HANGCHECK_TIMER" = "m";
+  "CONFIG_TCG_TPM" = "y";
+  "CONFIG_TCG_TIS" = "y";
+  "CONFIG_DEVPORT" = "y";
+  "CONFIG_I2C" = "y";
+  "CONFIG_I2C_BOARDINFO" = "y";
+  "CONFIG_I2C_CHARDEV" = "y";
+  "CONFIG_I2C_MUX" = "y";
+  "CONFIG_I2C_HELPER_AUTO" = "y";
+  "CONFIG_I2C_ALGOBIT" = "y";
+  "CONFIG_I2C_I801" = "y";
+  "CONFIG_PPS" = "y";
+  "CONFIG_PTP_1588_CLOCK" = "y";
+  "CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB" = "y";
+  "CONFIG_POWER_SUPPLY" = "y";
+  "CONFIG_POWER_RESET" = "y";
+  "CONFIG_HWMON" = "y";
+  "CONFIG_SENSORS_CORETEMP" = "y";
+  "CONFIG_SENSORS_LM90" = "y";
+  "CONFIG_THERMAL" = "y";
+  "CONFIG_THERMAL_HWMON" = "y";
+  "CONFIG_THERMAL_WRITABLE_TRIPS" = "y";
+  "CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE" = "y";
+  "CONFIG_THERMAL_GOV_FAIR_SHARE" = "y";
+  "CONFIG_THERMAL_GOV_STEP_WISE" = "y";
+  "CONFIG_THERMAL_GOV_BANG_BANG" = "y";
+  "CONFIG_THERMAL_GOV_USER_SPACE" = "y";
+  "CONFIG_THERMAL_GOV_POWER_ALLOCATOR" = "y";
+  "CONFIG_INTEL_POWERCLAMP" = "m";
+  "CONFIG_X86_PKG_TEMP_THERMAL" = "m";
+  "CONFIG_INTEL_PCH_THERMAL" = "m";
+  "CONFIG_SSB_POSSIBLE" = "y";
+  "CONFIG_BCMA_POSSIBLE" = "y";
+  "CONFIG_MFD_CORE" = "y";
+  "CONFIG_LPC_ICH" = "y";
+  "CONFIG_MEDIA_SUPPORT" = "y";
+  "CONFIG_MEDIA_CAMERA_SUPPORT" = "y";
+  "CONFIG_VIDEO_DEV" = "y";
+  "CONFIG_VIDEO_V4L2" = "y";
+  "CONFIG_VIDEOBUF2_CORE" = "m";
+  "CONFIG_VIDEOBUF2_MEMOPS" = "m";
+  "CONFIG_VIDEOBUF2_VMALLOC" = "m";
+  "CONFIG_MEDIA_USB_SUPPORT" = "y";
+  "CONFIG_USB_VIDEO_CLASS" = "m";
+  "CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV" = "y";
+  "CONFIG_AGP" = "y";
+  "CONFIG_AGP_INTEL" = "y";
+  "CONFIG_INTEL_GTT" = "y";
+  "CONFIG_VGA_ARB" = "y";
+  "CONFIG_VGA_ARB_MAX_GPUS" = "16";
+  "CONFIG_DRM" = "y";
+  "CONFIG_DRM_KMS_HELPER" = "y";
+  "CONFIG_DRM_KMS_FB_HELPER" = "y";
+  "CONFIG_DRM_TTM" = "y";
+  "CONFIG_DRM_NOUVEAU" = "y";
+  "CONFIG_NOUVEAU_DEBUG" = "5";
+  "CONFIG_NOUVEAU_DEBUG_DEFAULT" = "3";
+  "CONFIG_DRM_NOUVEAU_BACKLIGHT" = "y";
+  "CONFIG_DRM_BOCHS" = "m";
+  "CONFIG_DRM_VIRTIO_GPU" = "m";
+  "CONFIG_DRM_BRIDGE" = "y";
+  "CONFIG_FB" = "y";
+  "CONFIG_FB_CMDLINE" = "y";
+  "CONFIG_FB_CFB_FILLRECT" = "y";
+  "CONFIG_FB_CFB_COPYAREA" = "y";
+  "CONFIG_FB_CFB_IMAGEBLIT" = "y";
+  "CONFIG_FB_SYS_FILLRECT" = "y";
+  "CONFIG_FB_SYS_COPYAREA" = "y";
+  "CONFIG_FB_SYS_IMAGEBLIT" = "y";
+  "CONFIG_FB_SYS_FOPS" = "y";
+  "CONFIG_FB_BACKLIGHT" = "y";
+  "CONFIG_FB_MODE_HELPERS" = "y";
+  "CONFIG_FB_TILEBLITTING" = "y";
+  "CONFIG_BACKLIGHT_LCD_SUPPORT" = "y";
+  "CONFIG_BACKLIGHT_CLASS_DEVICE" = "y";
+  "CONFIG_HDMI" = "y";
+  "CONFIG_VGA_CONSOLE" = "y";
+  "CONFIG_VGACON_SOFT_SCROLLBACK" = "y";
+  "CONFIG_VGACON_SOFT_SCROLLBACK_SIZE" = "1024";
+  "CONFIG_DUMMY_CONSOLE" = "y";
+  "CONFIG_DUMMY_CONSOLE_COLUMNS" = "80";
+  "CONFIG_DUMMY_CONSOLE_ROWS" = "25";
+  "CONFIG_FRAMEBUFFER_CONSOLE" = "y";
+  "CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY" = "y";
+  "CONFIG_SOUND" = "y";
+  "CONFIG_SOUND_OSS_CORE" = "y";
+  "CONFIG_SOUND_OSS_CORE_PRECLAIM" = "y";
+  "CONFIG_SND" = "y";
+  "CONFIG_SND_TIMER" = "y";
+  "CONFIG_SND_PCM" = "y";
+  "CONFIG_SND_HWDEP" = "y";
+  "CONFIG_SND_RAWMIDI" = "y";
+  "CONFIG_SND_JACK" = "y";
+  "CONFIG_SND_SEQUENCER" = "y";
+  "CONFIG_SND_SEQ_DUMMY" = "m";
+  "CONFIG_SND_OSSEMUL" = "y";
+  "CONFIG_SND_MIXER_OSS" = "y";
+  "CONFIG_SND_PCM_OSS" = "y";
+  "CONFIG_SND_PCM_OSS_PLUGINS" = "y";
+  "CONFIG_SND_PCM_TIMER" = "y";
+  "CONFIG_SND_SEQUENCER_OSS" = "y";
+  "CONFIG_SND_HRTIMER" = "y";
+  "CONFIG_SND_SEQ_HRTIMER_DEFAULT" = "y";
+  "CONFIG_SND_DYNAMIC_MINORS" = "y";
+  "CONFIG_SND_MAX_CARDS" = "32";
+  "CONFIG_SND_PROC_FS" = "y";
+  "CONFIG_SND_VMASTER" = "y";
+  "CONFIG_SND_DMA_SGBUF" = "y";
+  "CONFIG_SND_RAWMIDI_SEQ" = "y";
+  "CONFIG_SND_PCI" = "y";
+  "CONFIG_SND_HDA" = "y";
+  "CONFIG_SND_HDA_INTEL" = "y";
+  "CONFIG_SND_HDA_INPUT_BEEP" = "y";
+  "CONFIG_SND_HDA_INPUT_BEEP_MODE" = "0";
+  "CONFIG_SND_HDA_CODEC_SIGMATEL" = "y";
+  "CONFIG_SND_HDA_GENERIC" = "y";
+  "CONFIG_SND_HDA_POWER_SAVE_DEFAULT" = "0";
+  "CONFIG_SND_HDA_CORE" = "y";
+  "CONFIG_SND_HDA_PREALLOC_SIZE" = "64";
+  "CONFIG_SND_USB" = "y";
+  "CONFIG_SND_USB_AUDIO" = "y";
+  "CONFIG_HID" = "y";
+  "CONFIG_HIDRAW" = "y";
+  "CONFIG_UHID" = "m";
+  "CONFIG_HID_GENERIC" = "y";
+  "CONFIG_HID_GREENASIA" = "y";
+  "CONFIG_GREENASIA_FF" = "y";
+  "CONFIG_USB_HID" = "y";
+  "CONFIG_USB_HIDDEV" = "y";
+  "CONFIG_I2C_HID" = "m";
+  "CONFIG_USB_OHCI_LITTLE_ENDIAN" = "y";
+  "CONFIG_USB_SUPPORT" = "y";
+  "CONFIG_USB_COMMON" = "y";
+  "CONFIG_USB_ARCH_HAS_HCD" = "y";
+  "CONFIG_USB" = "y";
+  "CONFIG_USB_ANNOUNCE_NEW_DEVICES" = "y";
+  "CONFIG_USB_DEFAULT_PERSIST" = "y";
+  "CONFIG_USB_MON" = "m";
+  "CONFIG_USB_EHCI_HCD" = "y";
+  "CONFIG_USB_EHCI_ROOT_HUB_TT" = "y";
+  "CONFIG_USB_EHCI_TT_NEWSCHED" = "y";
+  "CONFIG_USB_EHCI_PCI" = "y";
+  "CONFIG_USB_UHCI_HCD" = "y";
+  "CONFIG_USB_STORAGE" = "y";
+  "CONFIG_USB_STORAGE_REALTEK" = "m";
+  "CONFIG_REALTEK_AUTOPM" = "y";
+  "CONFIG_USB_STORAGE_DATAFAB" = "m";
+  "CONFIG_USB_STORAGE_FREECOM" = "m";
+  "CONFIG_USB_STORAGE_ISD200" = "m";
+  "CONFIG_USB_STORAGE_USBAT" = "m";
+  "CONFIG_USB_STORAGE_SDDR09" = "m";
+  "CONFIG_USB_STORAGE_SDDR55" = "m";
+  "CONFIG_USB_STORAGE_JUMPSHOT" = "m";
+  "CONFIG_USB_STORAGE_ALAUDA" = "m";
+  "CONFIG_USB_STORAGE_ONETOUCH" = "m";
+  "CONFIG_USB_STORAGE_KARMA" = "m";
+  "CONFIG_USB_STORAGE_CYPRESS_ATACB" = "m";
+  "CONFIG_USB_STORAGE_ENE_UB6250" = "m";
+  "CONFIG_USB_UAS" = "m";
+  "CONFIG_USB_MDC800" = "m";
+  "CONFIG_USB_MICROTEK" = "m";
+  "CONFIG_USBIP_CORE" = "m";
+  "CONFIG_USBIP_VHCI_HCD" = "m";
+  "CONFIG_USBIP_HOST" = "m";
+  "CONFIG_USB_SERIAL" = "m";
+  "CONFIG_USB_SERIAL_GENERIC" = "y";
+  "CONFIG_USB_SERIAL_SIMPLE" = "m";
+  "CONFIG_USB_SERIAL_AIRCABLE" = "m";
+  "CONFIG_USB_SERIAL_ARK3116" = "m";
+  "CONFIG_USB_SERIAL_BELKIN" = "m";
+  "CONFIG_USB_SERIAL_CH341" = "m";
+  "CONFIG_USB_SERIAL_WHITEHEAT" = "m";
+  "CONFIG_USB_SERIAL_DIGI_ACCELEPORT" = "m";
+  "CONFIG_USB_SERIAL_CP210X" = "m";
+  "CONFIG_USB_SERIAL_CYPRESS_M8" = "m";
+  "CONFIG_USB_SERIAL_EMPEG" = "m";
+  "CONFIG_USB_SERIAL_FTDI_SIO" = "m";
+  "CONFIG_USB_SERIAL_VISOR" = "m";
+  "CONFIG_USB_SERIAL_IPAQ" = "m";
+  "CONFIG_USB_SERIAL_IR" = "m";
+  "CONFIG_USB_SERIAL_EDGEPORT" = "m";
+  "CONFIG_USB_SERIAL_EDGEPORT_TI" = "m";
+  "CONFIG_USB_SERIAL_F81232" = "m";
+  "CONFIG_USB_SERIAL_GARMIN" = "m";
+  "CONFIG_USB_SERIAL_IPW" = "m";
+  "CONFIG_USB_SERIAL_IUU" = "m";
+  "CONFIG_USB_SERIAL_KEYSPAN_PDA" = "m";
+  "CONFIG_USB_SERIAL_KEYSPAN" = "m";
+  "CONFIG_USB_SERIAL_KLSI" = "m";
+  "CONFIG_USB_SERIAL_KOBIL_SCT" = "m";
+  "CONFIG_USB_SERIAL_MCT_U232" = "m";
+  "CONFIG_USB_SERIAL_METRO" = "m";
+  "CONFIG_USB_SERIAL_MOS7720" = "m";
+  "CONFIG_USB_SERIAL_MOS7840" = "m";
+  "CONFIG_USB_SERIAL_MXUPORT" = "m";
+  "CONFIG_USB_SERIAL_NAVMAN" = "m";
+  "CONFIG_USB_SERIAL_PL2303" = "m";
+  "CONFIG_USB_SERIAL_OTI6858" = "m";
+  "CONFIG_USB_SERIAL_QCAUX" = "m";
+  "CONFIG_USB_SERIAL_QUALCOMM" = "m";
+  "CONFIG_USB_SERIAL_SPCP8X5" = "m";
+  "CONFIG_USB_SERIAL_SAFE" = "m";
+  "CONFIG_USB_SERIAL_SIERRAWIRELESS" = "m";
+  "CONFIG_USB_SERIAL_SYMBOL" = "m";
+  "CONFIG_USB_SERIAL_TI" = "m";
+  "CONFIG_USB_SERIAL_CYBERJACK" = "m";
+  "CONFIG_USB_SERIAL_XIRCOM" = "m";
+  "CONFIG_USB_SERIAL_WWAN" = "m";
+  "CONFIG_USB_SERIAL_OPTION" = "m";
+  "CONFIG_USB_SERIAL_OMNINET" = "m";
+  "CONFIG_USB_SERIAL_OPTICON" = "m";
+  "CONFIG_USB_SERIAL_XSENS_MT" = "m";
+  "CONFIG_USB_SERIAL_WISHBONE" = "m";
+  "CONFIG_USB_SERIAL_SSU100" = "m";
+  "CONFIG_USB_SERIAL_QT2" = "m";
+  "CONFIG_USB_EZUSB_FX2" = "m";
+  "CONFIG_NEW_LEDS" = "y";
+  "CONFIG_LEDS_CLASS" = "y";
+  "CONFIG_LEDS_CLASS_FLASH" = "m";
+  "CONFIG_EDAC_ATOMIC_SCRUB" = "y";
+  "CONFIG_EDAC_SUPPORT" = "y";
+  "CONFIG_EDAC" = "y";
+  "CONFIG_EDAC_MM_EDAC" = "y";
+  "CONFIG_EDAC_I82975X" = "y";
+  "CONFIG_RTC_LIB" = "y";
+  "CONFIG_RTC_CLASS" = "y";
+  "CONFIG_RTC_HCTOSYS" = "y";
+  "CONFIG_RTC_HCTOSYS_DEVICE" = "rtc0";
+  "CONFIG_RTC_SYSTOHC" = "y";
+  "CONFIG_RTC_SYSTOHC_DEVICE" = "rtc0";
+  "CONFIG_RTC_INTF_SYSFS" = "y";
+  "CONFIG_RTC_INTF_PROC" = "y";
+  "CONFIG_RTC_INTF_DEV" = "y";
+  "CONFIG_RTC_DRV_CMOS" = "y";
+  "CONFIG_IRQ_BYPASS_MANAGER" = "y";
+  "CONFIG_VIRT_DRIVERS" = "y";
+  "CONFIG_VIRTIO" = "m";
+  "CONFIG_VIRTIO_PCI" = "m";
+  "CONFIG_VIRTIO_BALLOON" = "m";
+  "CONFIG_VIRTIO_INPUT" = "m";
+  "CONFIG_VIRTIO_MMIO" = "m";
+  "CONFIG_X86_PLATFORM_DEVICES" = "y";
+  "CONFIG_ACPI_WMI" = "y";
+  "CONFIG_MXM_WMI" = "y";
+  "CONFIG_SURFACE_PRO3_BUTTON" = "m";
+  "CONFIG_CLKEVT_I8253" = "y";
+  "CONFIG_I8253_LOCK" = "y";
+  "CONFIG_CLKBLD_I8253" = "y";
+  "CONFIG_RAS" = "y";
+  "CONFIG_LIBNVDIMM" = "m";
+  "CONFIG_ND_BLK" = "m";
+  "CONFIG_FIRMWARE_MEMMAP" = "y";
+  "CONFIG_DELL_RBU" = "y";
+  "CONFIG_DCDBAS" = "y";
+  "CONFIG_DMIID" = "y";
+  "CONFIG_DMI_SYSFS" = "y";
+  "CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK" = "y";
+  "CONFIG_UEFI_CPER" = "y";
+  "CONFIG_DCACHE_WORD_ACCESS" = "y";
+  "CONFIG_EXT2_FS" = "y";
+  "CONFIG_EXT2_FS_XATTR" = "y";
+  "CONFIG_EXT2_FS_POSIX_ACL" = "y";
+  "CONFIG_FS_MBCACHE" = "y";
+  "CONFIG_BTRFS_FS" = "y";
+  "CONFIG_BTRFS_FS_POSIX_ACL" = "y";
+  "CONFIG_FS_POSIX_ACL" = "y";
+  "CONFIG_EXPORTFS" = "y";
+  "CONFIG_FILE_LOCKING" = "y";
+  "CONFIG_FSNOTIFY" = "y";
+  "CONFIG_DNOTIFY" = "y";
+  "CONFIG_INOTIFY_USER" = "y";
+  "CONFIG_FANOTIFY" = "y";
+  "CONFIG_AUTOFS4_FS" = "y";
+  "CONFIG_FUSE_FS" = "y";
+  "CONFIG_CUSE" = "m";
+  "CONFIG_OVERLAY_FS" = "y";
+  "CONFIG_FSCACHE" = "m";
+  "CONFIG_CACHEFILES" = "m";
+  "CONFIG_ISO9660_FS" = "y";
+  "CONFIG_JOLIET" = "y";
+  "CONFIG_ZISOFS" = "y";
+  "CONFIG_UDF_FS" = "y";
+  "CONFIG_UDF_NLS" = "y";
+  "CONFIG_FAT_FS" = "m";
+  "CONFIG_MSDOS_FS" = "m";
+  "CONFIG_VFAT_FS" = "m";
+  "CONFIG_FAT_DEFAULT_CODEPAGE" = "437";
+  "CONFIG_FAT_DEFAULT_IOCHARSET" = "utf8";
+  "CONFIG_NTFS_FS" = "m";
+  "CONFIG_NTFS_RW" = "y";
+  "CONFIG_PROC_FS" = "y";
+  "CONFIG_PROC_SYSCTL" = "y";
+  "CONFIG_PROC_PAGE_MONITOR" = "y";
+  "CONFIG_PROC_CHILDREN" = "y";
+  "CONFIG_KERNFS" = "y";
+  "CONFIG_SYSFS" = "y";
+  "CONFIG_TMPFS" = "y";
+  "CONFIG_TMPFS_POSIX_ACL" = "y";
+  "CONFIG_TMPFS_XATTR" = "y";
+  "CONFIG_CONFIGFS_FS" = "y";
+  "CONFIG_MISC_FILESYSTEMS" = "y";
+  "CONFIG_ECRYPT_FS" = "y";
+  "CONFIG_SQUASHFS" = "m";
+  "CONFIG_SQUASHFS_FILE_CACHE" = "y";
+  "CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU" = "y";
+  "CONFIG_SQUASHFS_XATTR" = "y";
+  "CONFIG_SQUASHFS_ZLIB" = "y";
+  "CONFIG_SQUASHFS_LZ4" = "y";
+  "CONFIG_SQUASHFS_LZO" = "y";
+  "CONFIG_SQUASHFS_XZ" = "y";
+  "CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE" = "3";
+  "CONFIG_NETWORK_FILESYSTEMS" = "y";
+  "CONFIG_NFS_FS" = "y";
+  "CONFIG_NFS_V3" = "y";
+  "CONFIG_NFS_V3_ACL" = "y";
+  "CONFIG_NFS_V4" = "y";
+  "CONFIG_NFS_USE_KERNEL_DNS" = "y";
+  "CONFIG_NFSD" = "y";
+  "CONFIG_NFSD_V2_ACL" = "y";
+  "CONFIG_NFSD_V3" = "y";
+  "CONFIG_NFSD_V3_ACL" = "y";
+  "CONFIG_NFSD_V4" = "y";
+  "CONFIG_GRACE_PERIOD" = "y";
+  "CONFIG_LOCKD" = "y";
+  "CONFIG_LOCKD_V4" = "y";
+  "CONFIG_NFS_ACL_SUPPORT" = "y";
+  "CONFIG_NFS_COMMON" = "y";
+  "CONFIG_SUNRPC" = "y";
+  "CONFIG_SUNRPC_GSS" = "y";
+  "CONFIG_RPCSEC_GSS_KRB5" = "m";
+  "CONFIG_CIFS" = "y";
+  "CONFIG_CIFS_XATTR" = "y";
+  "CONFIG_CIFS_POSIX" = "y";
+  "CONFIG_NLS" = "y";
+  "CONFIG_NLS_DEFAULT" = "ascii";
+  "CONFIG_NLS_CODEPAGE_437" = "m";
+  "CONFIG_NLS_CODEPAGE_737" = "m";
+  "CONFIG_NLS_CODEPAGE_775" = "m";
+  "CONFIG_NLS_CODEPAGE_850" = "m";
+  "CONFIG_NLS_CODEPAGE_852" = "m";
+  "CONFIG_NLS_CODEPAGE_855" = "m";
+  "CONFIG_NLS_CODEPAGE_857" = "m";
+  "CONFIG_NLS_CODEPAGE_860" = "m";
+  "CONFIG_NLS_CODEPAGE_861" = "m";
+  "CONFIG_NLS_CODEPAGE_862" = "m";
+  "CONFIG_NLS_CODEPAGE_863" = "m";
+  "CONFIG_NLS_CODEPAGE_864" = "m";
+  "CONFIG_NLS_CODEPAGE_865" = "m";
+  "CONFIG_NLS_CODEPAGE_866" = "m";
+  "CONFIG_NLS_CODEPAGE_869" = "m";
+  "CONFIG_NLS_CODEPAGE_936" = "m";
+  "CONFIG_NLS_CODEPAGE_950" = "m";
+  "CONFIG_NLS_CODEPAGE_932" = "m";
+  "CONFIG_NLS_CODEPAGE_949" = "m";
+  "CONFIG_NLS_CODEPAGE_874" = "m";
+  "CONFIG_NLS_ISO8859_8" = "m";
+  "CONFIG_NLS_CODEPAGE_1250" = "m";
+  "CONFIG_NLS_CODEPAGE_1251" = "m";
+  "CONFIG_NLS_ASCII" = "y";
+  "CONFIG_NLS_ISO8859_1" = "m";
+  "CONFIG_NLS_ISO8859_2" = "m";
+  "CONFIG_NLS_ISO8859_3" = "m";
+  "CONFIG_NLS_ISO8859_4" = "m";
+  "CONFIG_NLS_ISO8859_5" = "m";
+  "CONFIG_NLS_ISO8859_6" = "m";
+  "CONFIG_NLS_ISO8859_7" = "m";
+  "CONFIG_NLS_ISO8859_9" = "m";
+  "CONFIG_NLS_ISO8859_13" = "m";
+  "CONFIG_NLS_ISO8859_14" = "m";
+  "CONFIG_NLS_ISO8859_15" = "m";
+  "CONFIG_NLS_KOI8_R" = "m";
+  "CONFIG_NLS_KOI8_U" = "m";
+  "CONFIG_NLS_MAC_ROMAN" = "m";
+  "CONFIG_NLS_MAC_CELTIC" = "m";
+  "CONFIG_NLS_MAC_CENTEURO" = "m";
+  "CONFIG_NLS_MAC_CROATIAN" = "m";
+  "CONFIG_NLS_MAC_CYRILLIC" = "m";
+  "CONFIG_NLS_MAC_GAELIC" = "m";
+  "CONFIG_NLS_MAC_GREEK" = "m";
+  "CONFIG_NLS_MAC_ICELAND" = "m";
+  "CONFIG_NLS_MAC_INUIT" = "m";
+  "CONFIG_NLS_MAC_ROMANIAN" = "m";
+  "CONFIG_NLS_MAC_TURKISH" = "m";
+  "CONFIG_NLS_UTF8" = "y";
+  "CONFIG_DLM" = "m";
+  "CONFIG_TRACE_IRQFLAGS_SUPPORT" = "y";
+  "CONFIG_MESSAGE_LOGLEVEL_DEFAULT" = "4";
+  "CONFIG_FRAME_WARN" = "2048";
+  "CONFIG_SECTION_MISMATCH_WARN_ONLY" = "y";
+  "CONFIG_ARCH_WANT_FRAME_POINTERS" = "y";
+  "CONFIG_MAGIC_SYSRQ" = "y";
+  "CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE" = "0x1";
+  "CONFIG_HAVE_DEBUG_KMEMLEAK" = "y";
+  "CONFIG_DEBUG_MEMORY_INIT" = "y";
+  "CONFIG_HAVE_DEBUG_STACKOVERFLOW" = "y";
+  "CONFIG_HAVE_ARCH_KMEMCHECK" = "y";
+  "CONFIG_HAVE_ARCH_KASAN" = "y";
+  "CONFIG_PANIC_ON_OOPS_VALUE" = "0";
+  "CONFIG_PANIC_TIMEOUT" = "0";
+  "CONFIG_SCHED_INFO" = "y";
+  "CONFIG_DEBUG_BUGVERBOSE" = "y";
+  "CONFIG_RCU_CPU_STALL_TIMEOUT" = "60";
+  "CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS" = "y";
+  "CONFIG_USER_STACKTRACE_SUPPORT" = "y";
+  "CONFIG_HAVE_FUNCTION_TRACER" = "y";
+  "CONFIG_HAVE_FUNCTION_GRAPH_TRACER" = "y";
+  "CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST" = "y";
+  "CONFIG_HAVE_DYNAMIC_FTRACE" = "y";
+  "CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS" = "y";
+  "CONFIG_HAVE_FTRACE_MCOUNT_RECORD" = "y";
+  "CONFIG_HAVE_SYSCALL_TRACEPOINTS" = "y";
+  "CONFIG_HAVE_FENTRY" = "y";
+  "CONFIG_HAVE_C_RECORDMCOUNT" = "y";
+  "CONFIG_TRACING_SUPPORT" = "y";
+  "CONFIG_TEST_HEXDUMP" = "m";
+  "CONFIG_MEMTEST" = "y";
+  "CONFIG_HAVE_ARCH_KGDB" = "y";
+  "CONFIG_STRICT_DEVMEM" = "y";
+  "CONFIG_X86_VERBOSE_BOOTUP" = "y";
+  "CONFIG_EARLY_PRINTK" = "y";
+  "CONFIG_DOUBLEFAULT" = "y";
+  "CONFIG_HAVE_MMIOTRACE_SUPPORT" = "y";
+  "CONFIG_IO_DELAY_TYPE_0X80" = "0";
+  "CONFIG_IO_DELAY_TYPE_0XED" = "1";
+  "CONFIG_IO_DELAY_TYPE_UDELAY" = "2";
+  "CONFIG_IO_DELAY_TYPE_NONE" = "3";
+  "CONFIG_IO_DELAY_0X80" = "y";
+  "CONFIG_DEFAULT_IO_DELAY_TYPE" = "0";
+  "CONFIG_KEYS" = "y";
+  "CONFIG_ENCRYPTED_KEYS" = "y";
+  "CONFIG_SECURITYFS" = "y";
+  "CONFIG_DEFAULT_SECURITY_DAC" = "y";
+  "CONFIG_DEFAULT_SECURITY" = "";
+  "CONFIG_XOR_BLOCKS" = "y";
+  "CONFIG_CRYPTO" = "y";
+  "CONFIG_CRYPTO_ALGAPI" = "y";
+  "CONFIG_CRYPTO_ALGAPI2" = "y";
+  "CONFIG_CRYPTO_AEAD" = "y";
+  "CONFIG_CRYPTO_AEAD2" = "y";
+  "CONFIG_CRYPTO_BLKCIPHER" = "y";
+  "CONFIG_CRYPTO_BLKCIPHER2" = "y";
+  "CONFIG_CRYPTO_HASH" = "y";
+  "CONFIG_CRYPTO_HASH2" = "y";
+  "CONFIG_CRYPTO_RNG" = "y";
+  "CONFIG_CRYPTO_RNG2" = "y";
+  "CONFIG_CRYPTO_RNG_DEFAULT" = "y";
+  "CONFIG_CRYPTO_PCOMP" = "y";
+  "CONFIG_CRYPTO_PCOMP2" = "y";
+  "CONFIG_CRYPTO_AKCIPHER2" = "y";
+  "CONFIG_CRYPTO_AKCIPHER" = "m";
+  "CONFIG_CRYPTO_RSA" = "m";
+  "CONFIG_CRYPTO_MANAGER" = "y";
+  "CONFIG_CRYPTO_MANAGER2" = "y";
+  "CONFIG_CRYPTO_USER" = "m";
+  "CONFIG_CRYPTO_GF128MUL" = "y";
+  "CONFIG_CRYPTO_NULL" = "y";
+  "CONFIG_CRYPTO_NULL2" = "y";
+  "CONFIG_CRYPTO_PCRYPT" = "y";
+  "CONFIG_CRYPTO_WORKQUEUE" = "y";
+  "CONFIG_CRYPTO_CRYPTD" = "y";
+  "CONFIG_CRYPTO_MCRYPTD" = "m";
+  "CONFIG_CRYPTO_AUTHENC" = "m";
+  "CONFIG_CRYPTO_TEST" = "m";
+  "CONFIG_CRYPTO_ABLK_HELPER" = "y";
+  "CONFIG_CRYPTO_GLUE_HELPER_X86" = "y";
+  "CONFIG_CRYPTO_CCM" = "m";
+  "CONFIG_CRYPTO_GCM" = "m";
+  "CONFIG_CRYPTO_CHACHA20POLY1305" = "m";
+  "CONFIG_CRYPTO_SEQIV" = "y";
+  "CONFIG_CRYPTO_ECHAINIV" = "m";
+  "CONFIG_CRYPTO_CBC" = "y";
+  "CONFIG_CRYPTO_CTR" = "y";
+  "CONFIG_CRYPTO_CTS" = "m";
+  "CONFIG_CRYPTO_ECB" = "y";
+  "CONFIG_CRYPTO_LRW" = "y";
+  "CONFIG_CRYPTO_PCBC" = "y";
+  "CONFIG_CRYPTO_XTS" = "y";
+  "CONFIG_CRYPTO_KEYWRAP" = "m";
+  "CONFIG_CRYPTO_CMAC" = "y";
+  "CONFIG_CRYPTO_HMAC" = "y";
+  "CONFIG_CRYPTO_XCBC" = "y";
+  "CONFIG_CRYPTO_VMAC" = "y";
+  "CONFIG_CRYPTO_CRC32C" = "y";
+  "CONFIG_CRYPTO_CRC32C_INTEL" = "m";
+  "CONFIG_CRYPTO_CRC32" = "y";
+  "CONFIG_CRYPTO_CRC32_PCLMUL" = "m";
+  "CONFIG_CRYPTO_CRCT10DIF" = "y";
+  "CONFIG_CRYPTO_CRCT10DIF_PCLMUL" = "m";
+  "CONFIG_CRYPTO_GHASH" = "y";
+  "CONFIG_CRYPTO_POLY1305" = "m";
+  "CONFIG_CRYPTO_POLY1305_X86_64" = "m";
+  "CONFIG_CRYPTO_MD4" = "y";
+  "CONFIG_CRYPTO_MD5" = "y";
+  "CONFIG_CRYPTO_MICHAEL_MIC" = "y";
+  "CONFIG_CRYPTO_RMD128" = "m";
+  "CONFIG_CRYPTO_RMD160" = "m";
+  "CONFIG_CRYPTO_RMD256" = "m";
+  "CONFIG_CRYPTO_RMD320" = "m";
+  "CONFIG_CRYPTO_SHA1" = "y";
+  "CONFIG_CRYPTO_SHA1_SSSE3" = "m";
+  "CONFIG_CRYPTO_SHA256_SSSE3" = "m";
+  "CONFIG_CRYPTO_SHA512_SSSE3" = "m";
+  "CONFIG_CRYPTO_SHA1_MB" = "m";
+  "CONFIG_CRYPTO_SHA256" = "y";
+  "CONFIG_CRYPTO_SHA512" = "y";
+  "CONFIG_CRYPTO_TGR192" = "m";
+  "CONFIG_CRYPTO_WP512" = "m";
+  "CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL" = "m";
+  "CONFIG_CRYPTO_AES" = "y";
+  "CONFIG_CRYPTO_AES_X86_64" = "y";
+  "CONFIG_CRYPTO_AES_NI_INTEL" = "m";
+  "CONFIG_CRYPTO_ANUBIS" = "m";
+  "CONFIG_CRYPTO_ARC4" = "y";
+  "CONFIG_CRYPTO_BLOWFISH" = "y";
+  "CONFIG_CRYPTO_BLOWFISH_COMMON" = "y";
+  "CONFIG_CRYPTO_BLOWFISH_X86_64" = "y";
+  "CONFIG_CRYPTO_CAMELLIA" = "m";
+  "CONFIG_CRYPTO_CAMELLIA_X86_64" = "y";
+  "CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64" = "m";
+  "CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64" = "m";
+  "CONFIG_CRYPTO_CAST_COMMON" = "y";
+  "CONFIG_CRYPTO_CAST5" = "y";
+  "CONFIG_CRYPTO_CAST5_AVX_X86_64" = "y";
+  "CONFIG_CRYPTO_CAST6" = "y";
+  "CONFIG_CRYPTO_CAST6_AVX_X86_64" = "y";
+  "CONFIG_CRYPTO_DES" = "y";
+  "CONFIG_CRYPTO_DES3_EDE_X86_64" = "y";
+  "CONFIG_CRYPTO_FCRYPT" = "m";
+  "CONFIG_CRYPTO_KHAZAD" = "m";
+  "CONFIG_CRYPTO_SALSA20" = "m";
+  "CONFIG_CRYPTO_SALSA20_X86_64" = "m";
+  "CONFIG_CRYPTO_CHACHA20" = "m";
+  "CONFIG_CRYPTO_CHACHA20_X86_64" = "m";
+  "CONFIG_CRYPTO_SEED" = "m";
+  "CONFIG_CRYPTO_SERPENT" = "y";
+  "CONFIG_CRYPTO_SERPENT_SSE2_X86_64" = "y";
+  "CONFIG_CRYPTO_SERPENT_AVX_X86_64" = "m";
+  "CONFIG_CRYPTO_SERPENT_AVX2_X86_64" = "m";
+  "CONFIG_CRYPTO_TEA" = "m";
+  "CONFIG_CRYPTO_TWOFISH" = "y";
+  "CONFIG_CRYPTO_TWOFISH_COMMON" = "y";
+  "CONFIG_CRYPTO_TWOFISH_X86_64" = "y";
+  "CONFIG_CRYPTO_TWOFISH_X86_64_3WAY" = "m";
+  "CONFIG_CRYPTO_TWOFISH_AVX_X86_64" = "m";
+  "CONFIG_CRYPTO_DEFLATE" = "y";
+  "CONFIG_CRYPTO_ZLIB" = "y";
+  "CONFIG_CRYPTO_LZO" = "y";
+  "CONFIG_CRYPTO_842" = "m";
+  "CONFIG_CRYPTO_LZ4" = "y";
+  "CONFIG_CRYPTO_LZ4HC" = "y";
+  "CONFIG_CRYPTO_ANSI_CPRNG" = "m";
+  "CONFIG_CRYPTO_DRBG_MENU" = "y";
+  "CONFIG_CRYPTO_DRBG_HMAC" = "y";
+  "CONFIG_CRYPTO_DRBG" = "y";
+  "CONFIG_CRYPTO_JITTERENTROPY" = "y";
+  "CONFIG_CRYPTO_USER_API" = "m";
+  "CONFIG_CRYPTO_USER_API_HASH" = "m";
+  "CONFIG_CRYPTO_USER_API_SKCIPHER" = "m";
+  "CONFIG_CRYPTO_USER_API_RNG" = "m";
+  "CONFIG_CRYPTO_USER_API_AEAD" = "m";
+  "CONFIG_CRYPTO_HASH_INFO" = "y";
+  "CONFIG_ASYMMETRIC_KEY_TYPE" = "m";
+  "CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE" = "m";
+  "CONFIG_PUBLIC_KEY_ALGO_RSA" = "m";
+  "CONFIG_X509_CERTIFICATE_PARSER" = "m";
+  "CONFIG_PKCS7_MESSAGE_PARSER" = "m";
+  "CONFIG_PKCS7_TEST_KEY" = "m";
+  "CONFIG_SYSTEM_TRUSTED_KEYRING" = "y";
+  "CONFIG_SYSTEM_TRUSTED_KEYS" = "";
+  "CONFIG_HAVE_KVM" = "y";
+  "CONFIG_HAVE_KVM_IRQCHIP" = "y";
+  "CONFIG_HAVE_KVM_IRQFD" = "y";
+  "CONFIG_HAVE_KVM_IRQ_ROUTING" = "y";
+  "CONFIG_HAVE_KVM_EVENTFD" = "y";
+  "CONFIG_KVM_APIC_ARCHITECTURE" = "y";
+  "CONFIG_KVM_MMIO" = "y";
+  "CONFIG_KVM_ASYNC_PF" = "y";
+  "CONFIG_HAVE_KVM_MSI" = "y";
+  "CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT" = "y";
+  "CONFIG_KVM_VFIO" = "y";
+  "CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT" = "y";
+  "CONFIG_KVM_COMPAT" = "y";
+  "CONFIG_HAVE_KVM_IRQ_BYPASS" = "y";
+  "CONFIG_VIRTUALIZATION" = "y";
+  "CONFIG_KVM" = "y";
+  "CONFIG_KVM_INTEL" = "y";
+  "CONFIG_RAID6_PQ" = "y";
+  "CONFIG_BITREVERSE" = "y";
+  "CONFIG_GENERIC_STRNCPY_FROM_USER" = "y";
+  "CONFIG_GENERIC_STRNLEN_USER" = "y";
+  "CONFIG_GENERIC_NET_UTILS" = "y";
+  "CONFIG_GENERIC_FIND_FIRST_BIT" = "y";
+  "CONFIG_GENERIC_PCI_IOMAP" = "y";
+  "CONFIG_GENERIC_IOMAP" = "y";
+  "CONFIG_GENERIC_IO" = "y";
+  "CONFIG_ARCH_USE_CMPXCHG_LOCKREF" = "y";
+  "CONFIG_ARCH_HAS_FAST_MULTIPLIER" = "y";
+  "CONFIG_CRC_CCITT" = "y";
+  "CONFIG_CRC16" = "y";
+  "CONFIG_CRC_T10DIF" = "y";
+  "CONFIG_CRC_ITU_T" = "y";
+  "CONFIG_CRC32" = "y";
+  "CONFIG_CRC32_SELFTEST" = "y";
+  "CONFIG_CRC32_SLICEBY8" = "y";
+  "CONFIG_CRC7" = "y";
+  "CONFIG_LIBCRC32C" = "y";
+  "CONFIG_CRC8" = "y";
+  "CONFIG_RANDOM32_SELFTEST" = "y";
+  "CONFIG_842_COMPRESS" = "m";
+  "CONFIG_842_DECOMPRESS" = "m";
+  "CONFIG_ZLIB_INFLATE" = "y";
+  "CONFIG_ZLIB_DEFLATE" = "y";
+  "CONFIG_LZO_COMPRESS" = "y";
+  "CONFIG_LZO_DECOMPRESS" = "y";
+  "CONFIG_LZ4_COMPRESS" = "y";
+  "CONFIG_LZ4HC_COMPRESS" = "y";
+  "CONFIG_LZ4_DECOMPRESS" = "y";
+  "CONFIG_XZ_DEC" = "y";
+  "CONFIG_XZ_DEC_X86" = "y";
+  "CONFIG_XZ_DEC_POWERPC" = "y";
+  "CONFIG_XZ_DEC_IA64" = "y";
+  "CONFIG_XZ_DEC_ARM" = "y";
+  "CONFIG_XZ_DEC_ARMTHUMB" = "y";
+  "CONFIG_XZ_DEC_SPARC" = "y";
+  "CONFIG_XZ_DEC_BCJ" = "y";
+  "CONFIG_XZ_DEC_TEST" = "m";
+  "CONFIG_DECOMPRESS_GZIP" = "y";
+  "CONFIG_DECOMPRESS_BZIP2" = "y";
+  "CONFIG_DECOMPRESS_LZMA" = "y";
+  "CONFIG_DECOMPRESS_XZ" = "y";
+  "CONFIG_DECOMPRESS_LZO" = "y";
+  "CONFIG_DECOMPRESS_LZ4" = "y";
+  "CONFIG_GENERIC_ALLOCATOR" = "y";
+  "CONFIG_TEXTSEARCH" = "y";
+  "CONFIG_TEXTSEARCH_KMP" = "m";
+  "CONFIG_TEXTSEARCH_BM" = "m";
+  "CONFIG_TEXTSEARCH_FSM" = "m";
+  "CONFIG_ASSOCIATIVE_ARRAY" = "y";
+  "CONFIG_HAS_IOMEM" = "y";
+  "CONFIG_HAS_IOPORT_MAP" = "y";
+  "CONFIG_HAS_DMA" = "y";
+  "CONFIG_CHECK_SIGNATURE" = "y";
+  "CONFIG_CPU_RMAP" = "y";
+  "CONFIG_DQL" = "y";
+  "CONFIG_GLOB" = "y";
+  "CONFIG_NLATTR" = "y";
+  "CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE" = "y";
+  "CONFIG_CLZ_TAB" = "y";
+  "CONFIG_CORDIC" = "y";
+  "CONFIG_MPILIB" = "m";
+  "CONFIG_OID_REGISTRY" = "y";
+  "CONFIG_FONT_SUPPORT" = "y";
+  "CONFIG_FONT_8x8" = "y";
+  "CONFIG_FONT_8x16" = "y";
+  "CONFIG_ARCH_HAS_SG_CHAIN" = "y";
+  "CONFIG_ARCH_HAS_PMEM_API" = "y";
+  "CONFIG_ARCH_HAS_MMIO_FLUSH" = "y";
+}
diff --git a/machines/aszlig/mmrnmhrm.nix b/machines/aszlig/mmrnmhrm.nix
new file mode 100644
index 00000000..49826d9b
--- /dev/null
+++ b/machines/aszlig/mmrnmhrm.nix
@@ -0,0 +1,81 @@
+{ pkgs, lib, ... }:
+
+with lib;
+
+{
+  vuizvui.user.aszlig.profiles.workstation.enable = true;
+
+  nix.maxJobs = 2;
+
+  boot = {
+    loader.grub.devices = map (i: "/dev/disk/by-id/${i}") [
+      "ata-WDC_WD10EZEX-00BN5A0_WD-WCC3F5756955"
+      "ata-WDC_WD10EZEX-00BN5A0_WD-WCC3F5790537"
+    ];
+  };
+
+  vuizvui.user.aszlig.system.kernel.enable = true;
+  vuizvui.user.aszlig.system.kernel.config = import ./mmrnmhrm-kconf.nix;
+
+  networking.hostName = "mmrnmhrm";
+
+  fileSystems = {
+    "/" = {
+      label = "root";
+      fsType = "btrfs";
+      options = concatStringsSep "," [
+        "autodefrag"
+        "space_cache"
+        "compress=lzo"
+        "noatime"
+      ];
+    };
+  };
+
+  swapDevices = [
+    { label = "swap1"; }
+    { label = "swap2"; }
+  ];
+
+  services.synergy.server.enable = true;
+  services.synergy.server.configFile = pkgs.writeText "synergy.conf" ''
+    section: screens
+      dnyarri:
+      mmrnmhrm:
+      tishtushi:
+    end
+
+    section: links
+      mmrnmhrm:
+        left = dnyarri
+        right = dnyarri
+      dnyarri:
+        right = mmrnmhrm
+        left = mmrnmhrm
+    end
+
+    section: options
+      keystroke(Super+F1) = switchToScreen(dnyarri)
+      keystroke(Super+F2) = switchToScreen(mmrnmhrm)
+      keystroke(Super+F3) = switchToScreen(tishtushi)
+    end
+  '';
+
+  services.kmscon.enable = true;
+
+  systemd.services."synergy-server".serviceConfig.CPUSchedulingPolicy = "rr";
+  systemd.services."synergy-server".serviceConfig.CPUSchedulingPriority = 50;
+
+  services.xserver.videoDrivers = [ "nouveau" ];
+  services.xserver.xrandrHeads = [ "DVI-I-1" "VGA-1" ];
+
+  vuizvui.user.aszlig.services.i3.workspaces."1" = {
+    label = "XMPP";
+    assign = singleton { class = "^(?:Tkabber|Gajim)\$"; };
+  };
+
+  vuizvui.user.aszlig.services.i3.workspaces."3" = {
+    label = "Chromium";
+    assign = singleton { class = "^Chromium(?:-browser)?\$"; };
+  };
+}
diff --git a/machines/aszlig/tishtushi.nix b/machines/aszlig/tishtushi.nix
new file mode 100644
index 00000000..a3f281f4
--- /dev/null
+++ b/machines/aszlig/tishtushi.nix
@@ -0,0 +1,73 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+let
+  rootUUID = "e33a3dda-a87d-473b-b113-37783aa35667";
+  swapUUID = "e9f59283-143c-4c36-978c-c730c6ca27c7";
+  storeUUID = "ce1db87b-d717-450d-a212-3685a224f626";
+  diskID = "ata-Hitachi_HTS543232A7A384_E2P31243FGB6PJ";
+in {
+  vuizvui.user.aszlig.profiles.workstation.enable = true;
+  vuizvui.user.aszlig.programs.taalo-build.enable = true;
+
+  boot = rec {
+    kernelPackages = with pkgs; let
+      trimVer = ver: take 2 (splitString "." (replaceChars ["-"] ["."] ver));
+      tooOld = trimVer linux_latest.version == trimVer linux_testing.version;
+      origKernel = if tooOld then linux_latest else linux_testing;
+      bfqsched = pkgs.vuizvui.kernelPatches.bfqsched // {
+        extraConfig = ''
+          IOSCHED_BFQ y
+          DEFAULT_BFQ y
+          DEFAULT_CFQ n
+          DEFAULT_IOSCHED "bfq"
+        '';
+      };
+      kernel = origKernel.override (origArgs: {
+        kernelPatches = origArgs.kernelPatches ++ singleton bfqsched;
+      });
+    in linuxPackagesFor kernel kernelPackages;
+
+    initrd.kernelModules = [ "fbcon" "usb_storage" ];
+    loader.grub.device = "/dev/disk/by-id/${diskID}";
+    loader.grub.timeout = 0;
+  };
+
+  networking.hostName = "tishtushi";
+  networking.wireless.enable = mkForce true;
+
+  fileSystems."/" = {
+    device = "/dev/disk/by-uuid/${rootUUID}";
+    fsType = "btrfs";
+    options = concatStringsSep "," [
+      "space_cache" "compress=zlib" "noatime"
+    ];
+  };
+
+  fileSystems."/nix/store" = {
+    device = "/dev/disk/by-uuid/${storeUUID}";
+    fsType = "btrfs";
+    options = concatStringsSep "," [
+      "ssd" "compress-force=zlib" "noatime"
+    ];
+  };
+
+  swapDevices = singleton {
+    device = "/dev/disk/by-uuid/${swapUUID}";
+  };
+
+  services.synergy.client.enable = true;
+  services.synergy.client.serverAddress = "mmrnmhrm";
+
+  services.tlp.enable = true;
+
+  services.xserver.videoDrivers = [ "intel" ];
+  services.xserver.synaptics.enable = true;
+  services.xserver.synaptics.tapButtons = true;
+  services.xserver.synaptics.twoFingerScroll = true;
+  services.xserver.synaptics.vertEdgeScroll = false;
+  services.xserver.synaptics.accelFactor = "0.1";
+
+  nix.maxJobs = 4;
+}
diff --git a/machines/default.nix b/machines/default.nix
new file mode 100644
index 00000000..7c0ed379
--- /dev/null
+++ b/machines/default.nix
@@ -0,0 +1,31 @@
+{ system ? builtins.currentSystem, ... }:
+
+let
+  callMachine = import ../lib/call-machine.nix;
+in {
+  aszlig = {
+    dnyarri   = callMachine ./aszlig/dnyarri.nix {};
+    mmrnmhrm  = callMachine ./aszlig/mmrnmhrm.nix {};
+    arilou    = callMachine ./aszlig/arilou.nix {};
+    kzerza    = callMachine ./aszlig/kzerza.nix {};
+    tishtushi = callMachine ./aszlig/tishtushi.nix {};
+    managed = {
+      haenk   = callMachine ./aszlig/managed/haenk.nix {};
+      notsure = callMachine ./aszlig/managed/notsure.nix {};
+      tyree   = callMachine ./aszlig/managed/tyree.nix {};
+    };
+  };
+  labnet = {
+    heinrich = callMachine ./labnet/heinrich.nix {};
+    labtop   = callMachine ./labnet/labtop.nix {};
+  };
+  profpatsch = {
+    katara = callMachine ./profpatsch/katara.nix {};
+  };
+  misc = {
+    mailserver = callMachine ./misc/mailserver.nix {};
+  };
+  sternenseemann = {
+    fliewatuet = callMachine ./sternenseemann/fliewatuet.nix {};
+  };
+}
diff --git a/machines/labnet/heinrich.nix b/machines/labnet/heinrich.nix
new file mode 100644
index 00000000..64601314
--- /dev/null
+++ b/machines/labnet/heinrich.nix
@@ -0,0 +1,143 @@
+{ config, lib, ... }:
+
+with lib;
+
+let
+  routes = {
+    moritz = {
+      id = 14;
+      address = "192.168.0.12";
+      prefixLength = 24;
+      gateway = "192.168.0.1";
+      destination = "144.76.143.122";
+    };
+
+    hotelturm = {
+      id = 8;
+      address = "10.11.77.5";
+      prefixLength = 24;
+      gateway = "10.11.77.16";
+      destination = "10.11.7.0/24";
+    };
+  };
+
+  internalIf = config.vuizvui.machines.heinrich.internalInterface;
+  externalIf = config.vuizvui.machines.heinrich.externalInterface;
+
+  mkRouteConfig = name: cfg: {
+    key = "routes-${name}";
+
+    networking.vlans.${name} = {
+      inherit (cfg) id;
+      interface = externalIf;
+    };
+
+    networking.interfaces.${name}.ip4 = singleton {
+      inherit (cfg) address prefixLength;
+    };
+
+    systemd.network.networks."40-${name}".routes = singleton {
+      routeConfig.Gateway = cfg.gateway;
+      routeConfig.Destination = cfg.destination;
+    };
+  };
+
+in {
+  imports = mapAttrsToList mkRouteConfig routes;
+
+  options.vuizvui.machines.heinrich = {
+    internalInterface = mkOption {
+      type = types.str;
+      default = "enp7s0";
+      description = ''
+        The internal network interface where Heinrich is serving DHCP and DNS
+        requests.
+      '';
+    };
+
+    externalInterface = mkOption {
+      type = types.str;
+      default = "enp5s0";
+      description = ''
+        The external network interface where Heinrich is connected to the
+        internet.
+      '';
+    };
+  };
+
+  config = {
+    networking.useDHCP = false;
+    networking.interfaces.${externalIf}.ip4 = mkForce [];
+    networking.interfaces.${internalIf}.ip4 = lib.singleton {
+      address = "172.16.0.1";
+      prefixLength = 24;
+    };
+
+    services.dnsmasq.enable = true;
+    services.dnsmasq.resolveLocalQueries = false;
+    services.dnsmasq.extraConfig = ''
+      dhcp-range=172.16.0.100,172.16.0.254,12h
+
+      dhcp-option=3,172.16.0.1 # Gateway
+      dhcp-option=6,172.16.0.1 # DNS-server
+
+      local=/openlab.lan/
+      domain=openlab.lan
+
+      dhcp-leasefile=/var/db/dnsmasq/dhcp.leases
+    '';
+
+    systemd.services.dnsmasq-pre = {
+      description = "Pre-Init DNSMasq";
+      before = [ "dnsmasq.service" ];
+      wantedBy = [ "multi-user.target" ];
+      script = ''
+        mkdir -p /var/db/dnsmasq
+        chown dnsmasq:nogroup /var/db/dnsmasq
+      '';
+      serviceConfig.Type = "oneshot";
+      serviceConfig.RemainAfterExit = true;
+    };
+
+    users.motd = ''
+      0. Never touch a running system.
+      1. Dokumentiere alle trotz 0 erfolgten Änderungen im Github-Repo:
+         https://github.com/openlab-aux/labnetz-doku
+      2. Mit großer Macht geht große Verantwortung einher.
+      3. So weit!
+      4. ...
+      5. Reisst dir Hannes den Arsch auf, wenn Du die Punkte 0-2 ignorierst.
+    '';
+
+    # TODO: This is a dummy, replace it once we know about the real root fs.
+    fileSystems."/".label = "root";
+    boot.loader.grub.device = "nodev";
+
+    networking.useNetworkd = true;
+    networking.firewall.enable = false;
+    networking.nat.enable = true;
+    networking.nat.externalIP = routes.hotelturm.address;
+    networking.nat.externalInterface = "hotelturm";
+    networking.nat.internalIPs = [ "172.16.0.1/24" ];
+    networking.nat.internalInterfaces = [ internalIf ];
+
+    /* TODO!
+    services.openvpn.enable = true;
+    services.openvpn.servers.heinrich.config = ''
+      dev tun0
+      remote 144.76.143.122
+      ifconfig 10.9.8.2 10.9.8.1
+      secret /etc/openvpn/priv.key
+
+      comp-lzo
+
+      keepalive 10 60
+      ping-timer-rem
+      persist-tun
+      persist-key
+
+      route 0.0.0.0 0.0.0.0
+    '';
+    */
+  };
+}
diff --git a/machines/labnet/labtop.nix b/machines/labnet/labtop.nix
new file mode 100644
index 00000000..65e3723d
--- /dev/null
+++ b/machines/labnet/labtop.nix
@@ -0,0 +1,135 @@
+{ pkgs, lib, ... }:
+
+let
+  greybird = pkgs.stdenv.mkDerivation {
+    name = "greybird-xfce-theme";
+
+    src = pkgs.fetchFromGitHub {
+      repo = "Greybird";
+      owner = "shimmerproject";
+      rev = "61ec18d22780aa87998381599c941e0cf4f7bfb5";
+      sha256 = "03h8hba4lfp337a4drylcplrbggry9gz8dq1f3gjy25fhqkgvq05";
+    };
+
+    phases = [ "unpackPhase" "installPhase" ];
+
+    installPhase = ''
+      mkdir -p "$out/share/themes/Greybird" \
+               "$out/share/themes/Greybird-compact/xfwm4"
+      cp -vrt "$out/share/themes/Greybird" \
+        gtk-* metacity-1 unity xfce-notify-4.0 xfwm4
+      cp -vrt "$out/share/themes/Greybird-compact/xfwm4" \
+        xfwm4_compact/*
+    '';
+  };
+
+  modulesPath = "${import ../../nixpkgs-path.nix}/nixos/modules";
+
+in {
+  imports = [ "${modulesPath}/installer/scan/not-detected.nix" ];
+
+  boot.loader.grub.device = "/dev/disk/by-id/ata-HITACHI_HTS722010K9SA00_080711DP0270DPGLVMPC";
+
+  boot.kernelModules = [ "kvm-intel" ];
+  boot.initrd.availableKernelModules = [
+    "uhci_hcd" "ehci_pci" "ata_piix" "firewire_ohci" "usb_storage"
+  ];
+
+  i18n = {
+    consoleFont = "lat9w-16";
+    consoleKeyMap = "us";
+    defaultLocale = "de_DE.UTF-8";
+  };
+
+  fileSystems."/" = {
+    device = "/dev/disk/by-uuid/754fd3e3-2e04-4028-9363-0c6bb4c54367";
+    fsType = "ext4";
+  };
+
+  vuizvui.hardware.thinkpad.enable = true;
+
+  environment.systemPackages = with pkgs; [
+    #repetierhost <- TODO
+    ack
+    antimony
+    blender
+    filezilla
+    firefox
+    fish
+    freecad
+    gcc
+    gnome3.gedit
+    gimp
+    git
+    gmpc
+    vuizvui.greybird-xfce-theme
+    inkscape
+    ino
+    (libreoffice.overrideDerivation (lib.const { doCheck = false; }))
+    netcat-openbsd
+    openscad
+    printrun
+    python3
+    screen
+    slic3r
+    tmux
+    vim
+    vlc
+    wget
+  ];
+
+  services.xserver = {
+    enable = true;
+    layout = "us";
+    xkbOptions = "eurosign:e";
+
+    displayManager.auto.enable = true;
+    displayManager.auto.user = "openlab";
+    desktopManager.xfce.enable = true;
+    # synaptics.enable = true;
+    # synaptics.minSpeed = "0.5";
+    # synaptics.accelFactor = "0.01";
+  };
+
+
+  # hardware.trackpoint = {
+  #   enable = true;
+  #   emulateWheel = true;
+  #   sensitivity = 130;
+  #   speed = 350;
+  # };
+
+
+  services.openssh.enable = true;
+
+  networking.networkmanager.enable = true;
+  networking.enableIntel3945ABGFirmware = true;
+  networking.hostName = "labtop";
+  networking.firewall = {
+    allowedTCPPorts = [ 1337 2342 ];
+    allowedTCPPortRanges = [ { from = 8000; to = 8005; } ];
+    allowPing = true;
+  };
+
+  nix.maxJobs = 2;
+
+  users.mutableUsers = false;
+  users.extraUsers.openlab = {
+    uid = 1000;
+    isNormalUser = true;
+    password = "openlab";
+    extraGroups = [ "wheel" "networkmanager" "dialout"];
+    openssh.authorizedKeys.keys = lib.singleton (lib.concatStrings [
+
+      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJhthfk38lzDvoI7lPqRneI0yBpZEhLD"
+      "GRBpcXzpPSu+V0YlgrDix5fHhBl+EKfw4aeQNvQNuAky3pDtX+BDK1b7idbz9ZMCExy2a1"
+      "kBKDVJz/onLSQxiiZMuHlAljVj9iU4uoTOxX3vB85Ok9aZtMP1rByRIWR9e81/km4HdfZT"
+      "CjFVRLWfvo0s29H7l0fnbG9bb2E6kydlvjnXJnZFXX+KUM16X11lK53ilPdPJdm87VtxeS"
+      "KZ7GOiBz6q7FHzEd2Zc3CnzgupQiXGSblXrlN22IY3IWfm5S/8RTeQbMLVoH0TncgCeenX"
+      "H7FU/sXD79ypqQV/WaVVDYMOirsnh/ philip@nyx"
+    ]);
+  };
+
+  # fix for emacs
+  programs.bash.promptInit = "PS=\"# \"";
+}
diff --git a/machines/misc/mailserver.nix b/machines/misc/mailserver.nix
new file mode 100644
index 00000000..a9548fcb
--- /dev/null
+++ b/machines/misc/mailserver.nix
@@ -0,0 +1,118 @@
+{ config, pkgs, lib, ... }: let
+  vhostMap = {
+    smtpd_sender_login_maps = [
+      "SELECT username AS allowedUser"
+      "FROM mailbox"
+      "WHERE username='%s' AND active = 1"
+      "UNION SELECT goto FROM alias"
+      "WHERE address='%s' AND active = 1"
+    ];
+
+    virtual_alias_maps = [
+      "SELECT goto"
+      "FROM alias"
+      "WHERE address='%s' AND active = '1'"
+    ];
+
+    virtual_mailbox_domains = [
+      "SELECT domain"
+      "FROM domain"
+      "WHERE domain='%s' AND active = '1'"
+    ];
+
+    virtual_mailbox_maps = [
+      "SELECT maildir"
+      "FROM mailbox"
+      "WHERE username='%s' AND active = '1'"
+    ];
+  };
+
+  mkDbMap = query: "proxy:pgsql:${pkgs.writeText "database.cf" ''
+    hosts = localhost
+    user = postfix
+    dbname = postfix
+    query = ${query}
+  ''}";
+
+in {
+  services.spamassassin.enable = true;
+
+  services.postfix.enable = true;
+  services.postfix.hostname = "mailtest.lan";
+
+  # TODO: This is a dummy, replace it once we know about the real root fs.
+  fileSystems."/".label = "root";
+  boot.loader.grub.device = "nodev";
+
+  vuizvui.services.postfix.enable = true;
+  vuizvui.services.postfix.restrictions = {
+    sender = [
+      "reject_authenticated_sender_login_mismatch"
+      "reject_unknown_sender_domain"
+    ];
+    recipient = [
+      "permit_sasl_authenticated"
+      "permit_mynetworks"
+      "reject_unauth_destination"
+      "reject_invalid_hostname"
+      "reject_non_fqdn_hostname"
+      "reject_non_fqdn_sender"
+      "reject_non_fqdn_recipient"
+      "reject_unknown_reverse_client_hostname"
+    ];
+    helo = [
+      "permit_sasl_authenticated"
+      "permit_mynetworks"
+      "reject_invalid_hostname"
+      "reject_unauth_pipelining"
+      "reject_non_fqdn_hostname"
+    ];
+  };
+
+  services.postfix.extraConfig = ''
+    ${lib.concatStrings (lib.mapAttrsToList (cfgvar: query: ''
+      ${cfgvar} = ${mkDbMap (lib.concatStringsSep " " query)}
+    '') vhostMap)}
+
+    # a bit more spam protection
+    disable_vrfy_command = yes
+
+    smtpd_sasl_type=dovecot
+    smtpd_sasl_path=private/auth_dovecot XXXXXXXXXXXXXXX
+    smtpd_sasl_auth_enable = yes
+    smtpd_sasl_authenticated_header = yes
+    broken_sasl_auth_clients = yes
+
+    proxy_read_maps = ${lib.concatStringsSep " " (map (s: "\$${s}") [
+      "local_recipient_maps" "mydestination" "virtual_alias_maps"
+      "virtual_alias_domains" "virtual_mailbox_maps" "virtual_mailbox_domains"
+      "relay_recipient_maps" "relay_domains" "canonical_maps"
+      "sender_canonical_maps" "recipient_canonical_maps" "relocated_maps"
+      "transport_maps" "mynetworks" "smtpd_sender_login_maps"
+    ])}
+
+    local_transport = virtual
+    virtual_transport = dovecot
+
+    virtual_uid_maps = static:5000 XXXXXXXXXXXX
+    virtual_gid_maps = static:5000 XXXXXXXXXXXX
+
+    smtpd_tls_cert_file=/etc/ssl/mail.crt XXXX: KEYS
+    smtpd_tls_key_file=/etc/ssl/mail.key XXXX: KEYS
+    smtpd_use_tls=yes
+  '';
+
+  services.postfix.extraMasterConf = ''
+    mailman unix - n n - - pipe
+      flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ''${nexthop} ''${user}
+      # ^^^ FIXME: maybe not needed!
+
+    dovecot unix - n n - - pipe
+      flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ''${recipient}
+      # ^^^ FIXME: maybe not needed!
+
+    spamassassin unix - n n - - pipe
+      user=${toString config.ids.uids.spamd} argv=${pkgs.spamassassin}/bin/spamc -f -e /var/setuid-wrappers/sendmail -oi -f ''${sender} ''${recipient}
+      # ^^^ FIXME: maybe not needed!
+  '';
+}
diff --git a/machines/profpatsch/katara.nix b/machines/profpatsch/katara.nix
new file mode 100644
index 00000000..00cbe88b
--- /dev/null
+++ b/machines/profpatsch/katara.nix
@@ -0,0 +1,343 @@
+{ config, pkgs, lib, ... }:
+let
+
+  myPkgs = import ./pkgs.nix { inherit pkgs; };
+
+  mytexlive = with pkgs.texlive; combine { inherit scheme-medium minted units collection-bibtexextra; };
+
+in {
+
+  config = rec {
+
+    #########
+    # Kernel
+
+    boot.initrd.availableKernelModules = [ "uhci_hcd" "ehci_pci" "ahci" ];
+    boot.loader.grub.enable = true;
+    boot.loader.grub.version = 2;
+    boot.loader.grub.device = "/dev/sda";
+    boot.initrd.luks.devices = [ { device = "/dev/sda2"; name = "cryptroot"; } ];
+
+
+    ###########
+    # Hardware
+
+
+    fileSystems."/" = {
+      device = "/dev/dm-0";
+      fsType = "btrfs";
+      options = [ "ssd" ];
+    };
+
+    fileSystems."/boot" = {
+      device = "/dev/sda1";
+      fsType = "ext3";
+    };
+
+    hardware.pulseaudio.enable = true;
+    vuizvui.hardware.thinkpad.enable = true;
+
+
+    ######
+    # Nix
+
+    nix.maxJobs = 2;
+    vuizvui.enableGlobalNixpkgsConfig = true;
+
+    ##########
+    # Network
+
+    networking.hostName = "katara";
+    networking.networkmanager.enable = true;
+
+    networking.firewall = {
+      enable = true;
+      # Programmer’s dilemma
+      allowedTCPPortRanges = [
+        { from = 8000; to = 8005; }
+        { from = 8080; to = 8085; }
+      ];
+    };
+
+    i18n = {
+      consoleFont = "lat9w-16";
+      consoleKeyMap = "us";
+      defaultLocale = "en_US.UTF-8";
+    };
+
+
+    ###########
+    # Packages
+
+    environment.profileRelativeEnvVars = { EDITOR = [ "${pkgs.vim}/bin/vim" ]; };
+
+    environment.systemPackages = with pkgs;
+    let
+      systemPkgs = [
+        atool             # archive tools
+        curl              # transfer data to/from a URL
+        diffoscope        # diff whole filetrees (and archives)
+        dos2unix          # text file conversion
+        fdupes            # file duplicate finder
+        file              # file information
+        git               # version control system
+        gnupg             # PGP encryption
+        htop              # top replacement
+        imagemagick       # image conversion
+        jmtpfs            # MTP fuse
+        gnumake           # make
+        manpages          # system manpages (not included by default)
+        mkpasswd          # UNIX password creator
+        mosh              # ssh with stable connections
+        nmap              # stats about clients in the network
+        silver-searcher   # file content searcher, > ack > grep
+        stow              # dotfile management
+        tmux              # detachable terminal multiplexer
+        traceroute        # trace ip routes
+        vim               # slight improvement over vi
+        wget              # the other URL file fetcher
+      ];
+      xPkgs = [
+        dmenu             # simple UI menu builder
+        dunst             # notification daemon (implements libnotify)
+        i3lock            # lock screen
+        libnotify         # notification library
+        lxappearance      # GTK theme chooser
+        myPkgs.taffybar   # status bar
+        xbindkeys         # keybinding manager
+        xclip             # clipboard thingy
+        xorg.xkill        # X11 application kill
+      ];
+      guiPkgs = [
+        gnome3.adwaita-icon-theme
+        # TODO: get themes to work. See notes.org.
+        gnome3.gnome_themes_standard
+        # kde4.oxygen-icons TODO
+      ];
+      userPrograms = [
+        abcde                # high-level cd-ripper with tag support
+        anki                 # spaced repetition system
+        audacity lame        # audio editor and mp3 codec
+        beets                # audio file metadata tagger
+        # chromium             # browser
+        (chromium.override { enablePepperFlash = true; })
+        dropbox-cli          # dropbox.com client
+        emacs                # pretty neat operating system i guess
+        feh                  # brother of meh, displays images in a meh way, but fast
+        filezilla            # FTP GUI business-ready interface framework
+        ghc                  # Glasgow Haskell Compiler, mostly for ghci
+        gimp                 # graphics
+        gmpc                 # mpd client and best music player interface in the world
+        httpie
+        keepassx             # password manager
+        libreoffice          # a giant ball of C++, that sometimes helps with proprietary shitformats
+        lilyterm             # terminal emulator, best one around
+        # lyx mytexlive      # you didn’t see a thing
+        mpv                  # you are my sun and my stars. and you play my stuff.
+        newsbeuter           # RSS/Atom feed reader
+        networkmanagerapplet # NetworkManager status bar widget
+        poezio               # CLI XMPP client
+        poppler_utils        # pdfto*
+        ranger               # CLI file browser
+        rtorrent             # monster of a bittorrent client
+        stack                # haskell package manager
+        pkgs.vuizvui.show-qr-code # display a QR code
+        zathura              # pdf viewer
+      ];
+      mailPkgs = [
+        elinks             # command line browser
+        myPkgs.offlineimap # IMAP client
+        mutt-with-sidebar  # has been sucking less since 1970
+        msmtp              # SMTP client
+        notmuch            # mail indexer
+      ];
+      nixPkgs = [
+        nix-repl                  # nix REPL
+        nix-prefetch-scripts      # prefetch store paths from various destinations
+        haskellPackages.cabal2nix # convert cabal files to nix
+      ];
+      tmpPkgs = [
+        # needs user service
+        redshift   # increases screen warmth at night (so i don’t have to feel cold)
+        snapper
+      ];
+    in systemPkgs ++ xPkgs ++ guiPkgs ++ userPrograms ++ nixPkgs ++ mailPkgs ++ nixPkgs ++ tmpPkgs;
+    system.extraDependencies = with pkgs; lib.singleton (
+       # Haskell packages I want to keep around
+       haskellPackages.ghcWithPackages (hpkgs: with hpkgs;
+         [
+           # frp
+           frpnow
+           gloss
+           gtk
+           frpnow-gtk
+           frpnow-gloss
+
+           lens
+           wreq
+           aeson-lens
+         ]))
+       ++
+       # other packages that I use sometimes in a shell
+       [
+         #wkhtmltopdf
+         rustc
+         haskellPackages.purescript
+       ];
+
+    ###########
+    # Services
+
+    # Enable the OpenSSH daemon.
+    services.openssh.enable = true;
+
+    # Enable CUPS to print documents.
+    services.printing = {
+      enable = true;
+      drivers = [ pkgs.gutenprint ];
+    };
+
+    time.timeZone = "Europe/Berlin";
+
+    # redshift TODO as user
+    services.redshift = {
+      # enable = true;
+      latitude = "48";
+      longitude = "10";
+      temperature.day = 6300;
+    };
+
+    # locate
+    services.locate = {
+      enable = true;
+    };
+
+    # Automount
+    services.udisks2.enable = true;
+
+    services.journald.extraConfig = "SystemMaxUse=50M";
+
+    # TODO: taffybar battery depends on this
+    services.upower.enable = true;
+
+    ###################
+    # Graphical System
+
+    services.xserver = {
+      enable = true;
+      layout = "de";
+      xkbVariant = "neo";
+      xkbOptions = "altwin:swap_alt_win";
+      serverFlagsSection = ''
+        Option "StandbyTime" "10"
+        Option "SuspendTime" "20"
+        Option "OffTime" "30"
+      '';
+      synaptics.enable = true;
+      synaptics.minSpeed = "0.5";
+      synaptics.accelFactor = "0.01";
+      videoDrivers = [ "intel" ];
+
+      # otherwise xterm is enabled, creating an xterm that spawns the window manager.
+      desktopManager.xterm.enable = false;
+
+      # TODO: include taffybar
+      windowManager.xmonad = {
+        enable = true;
+        enableContribAndExtras = true;
+      };
+      displayManager = {
+        desktopManagerHandlesLidAndPower = false;
+        sessionCommands =
+            ''
+            #TODO add as nixpkg
+            export PATH+=":$HOME/scripts" #add utility scripts
+            export EDITOR=emacsclient
+            xset r rate 250 35
+            set-background &
+            # TODO xbindkeys user service file
+            xbindkeys
+            nice -n19 dropbox start &
+            nm-applet &
+            '';
+      };
+
+      startGnuPGAgent = true;
+
+    };
+
+    fonts.fontconfig = {
+      defaultFonts = {
+        monospace = [ "Source Code Pro" "DejaVu Sans Mono" ]; # TODO does not work
+        sansSerif = [ "Liberation Sans" ];
+      };
+      # use overkill infinality settings from old Arch installation
+      ultimate = {
+        rendering = {
+          INFINALITY_FT_FILTER_PARAMS = "08 24 36 24 08";
+          INFINALITY_FT_FRINGE_FILTER_STRENGTH = "25";
+          INFINALITY_FT_USE_VARIOUS_TWEAKS = "true";
+          INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH = "25";
+          INFINALITY_FT_STEM_ALIGNMENT_STRENGTH = "15";
+          INFINALITY_FT_STEM_FITTING_STRENGTH = "15";
+        };
+      };
+    };
+    fonts.fonts = with pkgs; [
+      corefonts
+      source-han-sans-japanese
+      source-han-sans-korean
+      source-han-sans-simplified-chinese
+      source-code-pro
+      dejavu_fonts
+      ubuntu_font_family
+    ];
+
+
+    ########
+    # Users
+
+    # Nobody wants mutable state. :)
+    users.mutableUsers = false;
+    users.extraUsers =
+      let authKeys = ["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJhthfk38lzDvoI7lPqRneI0yBpZEhLDGRBpcXzpPSu+V0YlgrDix5fHhBl+EKfw4aeQNvQNuAky3pDtX+BDK1b7idbz9ZMCExy2a1kBKDVJz/onLSQxiiZMuHlAljVj9iU4uoTOxX3vB85Ok9aZtMP1rByRIWR9e81/km4HdfZTCjFVRLWfvo0s29H7l0fnbG9bb2E6kydlvjnXJnZFXX+KUM16X11lK53ilPdPJdm87VtxeSKZ7GOiBz6q7FHzEd2Zc3CnzgupQiXGSblXrlN22IY3IWfm5S/8RTeQbMLVoH0TncgCeenXH7FU/sXD79ypqQV/WaVVDYMOirsnh/ philip@nyx"];
+      in {
+        philip = rec {
+  	name = "philip";
+  	group = "users";
+          extraGroups = [ "wheel" "networkmanager" ];
+  	uid = 1000;
+  	createHome = true;
+  	home = "/home/philip";
+          passwordFile = "${home}/.config/passwd";
+          # password = "test"; # in case of emergency, break glass
+    shell = "/run/current-system/sw/bin/fish";
+          openssh.authorizedKeys.keys = authKeys;
+      };
+    };
+
+    ###########
+    # Programs
+
+    # see gpgAgent
+    programs.ssh.startAgent = false;
+
+    # friendly user shell
+    programs.fish.enable = true;
+
+    vuizvui.user.profpatsch.programs.scanning.enable = true;
+
+    #######
+    # Misc
+
+    # TODO seems to work only sometimes in chromium
+    # security.pki.certificateFiles = [ "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" ];
+
+    ########
+    # Fixes
+
+    # fix for emacs ssh
+    programs.bash.promptInit = "PS1=\"# \"";
+
+  };
+}
diff --git a/machines/profpatsch/notes.org b/machines/profpatsch/notes.org
new file mode 100644
index 00000000..b5a82651
--- /dev/null
+++ b/machines/profpatsch/notes.org
@@ -0,0 +1,32 @@
+* GTK themes
+this should work:
+
+#+BEGIN_SRC nix
+      # https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/x11/desktop-managers/gnome3.nix
+      xserver.displayManager.session = [
+        {
+          manage = "window";
+          name = "awesome";
+          start = ''
+            # Set GTK_DATA_PREFIX so that GTK+ can find the themes
+            export GTK_DATA_PREFIX=${config.system.path}
+            # Find theme engines
+            export GTK_PATH=${config.system.path}/lib/gtk-3.0:${config.system.path}/lib/gtk-2.0
+            # Find the mouse
+            export XCURSOR_PATH=~/.icons:${config.system.path}/share/icons
+            # Update user dirs as described in http://freedesktop.org/wiki/Software/xdg-user-dirs/
+            ${pkgs.xdg-user-dirs}/bin/xdg-user-dirs-update
+            # Find the mouse
+            export XCURSOR_PATH=~/.icons:${config.system.path}/share/icons
+            ${pkgs.awesome}/bin/awesome&
+            waitPID=$!
+          '';
+        }
+      ];
+
+        environment = {
+
+          # Share needed for themes and backgrounds
+          pathsToLink = [ "/include" "/share"];
+       };
+#+END_SRC
diff --git a/machines/profpatsch/pkgs.nix b/machines/profpatsch/pkgs.nix
new file mode 100644
index 00000000..ef0a2f3f
--- /dev/null
+++ b/machines/profpatsch/pkgs.nix
@@ -0,0 +1,25 @@
+{ pkgs }:
+
+let
+  addRuntimeDeps = drv: ds: drv.overrideDerivation (old: {
+    propagatedNativeBuildInputs = old.propagatedNativeBuildInputs ++ ds;
+  });
+
+in
+with pkgs;
+{
+
+  offlineimap = addRuntimeDeps offlineimap [ pythonPackages.pygpgme ];
+
+  taffybar = taffybar.override {
+    ghcWithPackages = (haskellPackages.override {
+      overrides = _: super: {
+        taffybar = super.taffybar.overrideDerivation (old: {
+          name = old.name + "foo";
+          patches = (old.patches or []) ++ [ ./taffybar.patch ];
+        });
+      };
+    }).ghcWithPackages;
+  };
+
+}
diff --git a/machines/profpatsch/taffybar.patch b/machines/profpatsch/taffybar.patch
new file mode 100644
index 00000000..a93fca1a
--- /dev/null
+++ b/machines/profpatsch/taffybar.patch
@@ -0,0 +1,71 @@
+diff --git a/src/System/Taffybar/Battery.hs b/src/System/Taffybar/Battery.hs
+index 5335eff..32c7efa 100644
+--- a/src/System/Taffybar/Battery.hs
++++ b/src/System/Taffybar/Battery.hs
+@@ -9,6 +9,7 @@
+ -- more advanced features could be supported if there is interest.
+ module System.Taffybar.Battery (
+   batteryBarNew,
++  batteryIconNew,
+   textBatteryNew,
+   defaultBatteryConfig
+   ) where
+@@ -108,30 +109,22 @@ defaultBatteryConfig =
+       | pct < 0.9 = (0.5, 0.5, 0.5)
+       | otherwise = (0, 1, 0)
+ 
+--- | A fancy graphical battery widget that represents the current
+--- charge as a colored vertical bar.  There is also a textual
+--- percentage readout next to the bar.
++-- | 
+ batteryBarNew :: BarConfig -- ^ Configuration options for the bar display
+-                 -> Double -- ^ Polling period in seconds
+                  -> IO Widget
+-batteryBarNew battCfg pollSeconds = do
++batteryBarNew battCfg = do
+   battCtxt <- batteryContextNew
+-  case battCtxt of
+-    Nothing -> do
+-      let lbl :: Maybe String
+-          lbl = Just "No battery"
+-      labelNew lbl >>= return . toWidget
+-    Just ctxt -> do
+-      -- This is currently pretty inefficient - each poll period it
+-      -- queries the battery twice (once for the label and once for
+-      -- the bar).
+-      --
+-      -- Converting it to combine the two shouldn't be hard.
+-      b <- hBoxNew False 1
+-      txt <- textBatteryNew "$percentage$%" pollSeconds
+-      r <- newIORef ctxt
+-      bar <- pollingBarNew battCfg pollSeconds (battPct r)
+-      boxPackStart b bar PackNatural 0
+-      boxPackStart b txt PackNatural 0
+-      widgetShowAll b
+-      return (toWidget b)
++  let noBat = toWidget <$> labelNew (Just "No battery" :: Maybe String)
++  maybe noBat (batteryIconNew battCfg) battCtxt
++
++-- | A fancy graphical battery widget that represents the current
++-- charge as a colored vertical bar.
++batteryIconNew :: BarConfig
++                  -> BatteryContext
++                  -> IO Widget
++batteryIconNew cfg ctxt = do
++    icon <- pollingBarNew cfg pollSeconds . battPct =<< newIORef ctxt
++    widgetShowAll icon
++    return icon
++      where
++        pollSeconds = 5
+diff --git a/src/System/Taffybar/Widgets/PollingBar.hs b/src/System/Taffybar/Widgets/PollingBar.hs
+index d30adaf..01f161c 100644
+--- a/src/System/Taffybar/Widgets/PollingBar.hs
++++ b/src/System/Taffybar/Widgets/PollingBar.hs
+@@ -16,6 +16,7 @@ import Control.Monad ( forever )
+ import Graphics.UI.Gtk
+ 
+ import System.Taffybar.Widgets.VerticalBar
++import Debug.Trace
+ 
+ pollingBarNew :: BarConfig -> Double -> IO Double -> IO Widget
+ pollingBarNew cfg pollSeconds action = do
diff --git a/machines/sternenseemann/fliewatuet.nix b/machines/sternenseemann/fliewatuet.nix
new file mode 100644
index 00000000..6c8994ee
--- /dev/null
+++ b/machines/sternenseemann/fliewatuet.nix
@@ -0,0 +1,272 @@
+# Edit this configuration file to define what should be installed on
+{ config, pkgs, ... }:
+
+let
+   mytexlive = with pkgs.texlive; combine { inherit scheme-medium minted units collection-bibtexextra; };
+in {
+  nixpkgs.config.allowUnfree = true;
+
+  # hardware
+  boot.blacklistedKernelModules = [ "nouveau" ];
+  boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usb_storage" ];
+  boot.kernelModules = [ "kvm-intel" ];
+  boot.initrd.luks.devices = [ { device = "/dev/sda2"; name = "crypted"; } ];
+
+  fileSystems."/" = {
+    device = "/dev/dm-0";
+    fsType = "btrfs";
+  };
+  fileSystems."/boot/" = {
+    device = "/dev/sda1";
+    fsType = "vfat";
+  };
+
+  swapDevices = [ ];
+
+  nix.maxJobs = 8;
+
+  boot.loader.gummiboot.enable = true;
+  boot.loader.efi.canTouchEfiVariables = true;
+
+  # sound
+  # fix sound
+  boot.extraModprobeConfig = ''
+  options snd-hda-intel index=1,0 enable_msi=1
+  '';
+
+  hardware.pulseaudio.enable = true;
+  hardware.pulseaudio.support32Bit = true;
+
+  hardware.opengl.driSupport32Bit = true;
+
+  hardware.enableAllFirmware = true;
+
+  hardware.trackpoint = {
+    enable = true;
+    emulateWheel = true;
+    speed = 250;
+    sensitivity = 140;
+  };
+
+  networking.hostName = "fliewatuet"; # Define your hostname.
+  networking.networkmanager.enable = true;
+
+  # Select internationalisation properties.
+  i18n = {
+    consoleFont = "Lat2-Terminus16";
+    consoleKeyMap = "de-latin1";
+    defaultLocale = "en_US.UTF-8";
+  };
+
+  # Set your time zone.
+  time.timeZone = "Europe/Berlin";
+
+  environment.systemPackages = with pkgs; [
+    ## tools
+    rdiff-backup
+    pass
+    wget
+    curl
+    stow
+    scrot
+    dmenu
+    mosh
+    gnupg
+    gpgme
+    sudo
+    silver-searcher
+    graphicsmagick
+    dcraw
+    mkpasswd
+    nmap
+    traceroute
+    file
+    progress
+    zip
+    unzip
+    atool
+    manpages
+    man_db
+    sshuttle
+    speedtest-cli
+    youtube-dl
+    yafc
+    psmisc
+    telnet
+
+    ## dev
+    git
+    vim
+    neovim
+    gnumake
+    clang
+    gcc
+    gnum4
+    automake
+    valgrind
+    ghc
+    cabal-install
+    haskellPackages.cabal2nix
+    haskellPackages.stylish-haskell
+    clisp
+    go
+
+    ## applications
+    tmux
+    htop
+    mutt
+    tor
+    torbrowser
+    mupdf
+    zathura
+    w3m
+    pythonPackages.alot
+    msmtp
+    offlineimap
+    notmuch
+    irssi
+    mytexlive
+
+    ## GUI
+    # wm etc.
+    taffybar
+    xbindkeys
+    alock
+    dunst
+    libnotify
+    redshift
+    xorg.xbacklight
+    xorg.xmodmap
+    hicolor_icon_theme
+    networkmanagerapplet
+    xclip
+    xsel
+    # applications
+    lxappearance
+    firefox
+    qutebrowser
+    gstreamer
+    termite
+    feh
+    pavucontrol
+    cbatticon
+    filezilla
+    screen-message
+    mumble
+    libreoffice
+
+    ## audio / video
+    mpv
+    abcde
+    audacity
+    beets
+    lame
+    ffmpeg
+
+    ## services
+    gutenprint
+    acpi
+
+    ## games
+    jdk
+  ];
+
+  # Proudly stolen from Profpatsch
+  fonts.fontconfig = {
+    defaultFonts = {
+      monospace = [ "Inconsolata" "Source Code Pro" "DejaVu Sans Mono" ];
+      sansSerif = [ "Liberation Sans" ];
+    };
+    ultimate = {
+      rendering = {
+        INFINALITY_FT_FILTER_PARAMS = "08 24 36 24 08";
+        INFINALITY_FT_FRINGE_FILTER_STRENGTH = "25";
+        INFINALITY_FT_USE_VARIOUS_TWEAKS = "true";
+        INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH = "25";
+        INFINALITY_FT_STEM_ALIGNMENT_STRENGTH = "15";
+        INFINALITY_FT_STEM_FITTING_STRENGTH = "15";
+      };
+    };
+  };
+  fonts.fonts = with pkgs; [
+    corefonts
+    source-han-sans-japanese
+    source-han-sans-korean
+    source-han-sans-simplified-chinese
+    source-code-pro
+    dejavu_fonts
+    ubuntu_font_family
+    inconsolata
+    tewi-font
+  ];
+
+  # to make Ctrl-Shift-t work in termite
+  environment.etc."vte.sh" = { source = "${pkgs.gnome3.vte}/etc/profile.d/vte.sh"; };
+
+  # Enable the OpenSSH daemon.
+  services.openssh.enable = true;
+
+  # for taffybar
+  services.upower.enable = true;
+
+  services.tor.enable = true;
+
+  # Enable CUPS to print documents.
+  services.printing = {
+    enable = true;
+    drivers = [ pkgs.gutenprint pkgs.hplip ];
+  };
+
+  services.tlp.enable = true;
+
+  # Enable the X11 windowing system.
+  services.xserver = {
+    enable = true;
+    layout = "de";
+    xkbVariant = "neo";
+
+    desktopManager.xterm.enable = false;
+
+    windowManager.xmonad = {
+      enable = true;
+      enableContribAndExtras = true;
+    };
+    displayManager = {
+      desktopManagerHandlesLidAndPower = false;
+      sessionCommands =
+        ''
+        export BROWSER=firefox
+        redshift -c .redshift &
+        xmodmap -e "pointer = 1 25 3 4 5 6 7 8 9"
+        xbindkeys
+        cbatticon &
+        set-bg
+        '';
+    };
+
+    synaptics.enable = true;
+    synaptics.tapButtons = false;
+    synaptics.twoFingerScroll = true;
+
+    videoDrivers = [ "intel" ];
+
+    startGnuPGAgent = true;
+  };
+
+  programs.fish.enable = true;
+
+  users.mutableUsers = false;
+  users.extraUsers.lukas = {
+    isNormalUser = true;
+    uid = 1000;
+    home = "/home/lukas";
+    shell = "/run/current-system/sw/bin/fish";
+    group = "users";
+    passwordFile = "/home/lukas/.config/passwd";
+    extraGroups = [ "audio" "wheel" "networkmanager" ];
+  };
+
+  system.stateVersion = "unstable";
+
+  programs.ssh.startAgent = false;
+}
diff --git a/machines/sternenseemann/schnurrkadse.nix b/machines/sternenseemann/schnurrkadse.nix
new file mode 100644
index 00000000..e1bf9f63
--- /dev/null
+++ b/machines/sternenseemann/schnurrkadse.nix
@@ -0,0 +1,111 @@
+{ config, lib, pkgs, ... }:
+
+{
+
+  boot.initrd.availableKernelModules = [ "uhci_hcd" "ehci_pci" "ata_piix" "usb_storage" "floppy" ];
+  boot.kernelModules = [ ];
+  boot.extraModulePackages = [ ];
+
+  fileSystems."/" =
+    { device = "/dev/disk/by-uuid/98d6b322-25d9-4eff-a64a-684b3aad3734";
+      fsType = "ext4";
+    };
+
+  swapDevices =
+    [ { device = "/dev/disk/by-uuid/e5e7e8ad-af02-4b51-8a5b-f79f143c63da"; }
+    ];
+
+  nix.maxJobs = 1;
+  networking.enableIntel2200BGFirmware = true;
+  hardware.enableAllFirmware = true;
+
+  hardware.trackpoint = {
+    enable = true;
+    emulateWheel = true;
+    speed = 250;
+    sensitivity = 140;
+  };
+
+  boot.loader.grub.enable = true;
+  boot.loader.grub.version = 2;
+  boot.loader.grub.device = "/dev/sda";
+
+  networking.hostName = "schnurrkadse";
+  networking.networkmanager.enable = true;
+
+  i18n = {
+    consoleFont = "Lat2-Terminus16";
+    consoleKeyMap = "de-latin1";
+    defaultLocale = "en_US.UTF-8";
+  };
+
+  time.timeZone = "Europe/Berlin";
+
+  environment.systemPackages = with pkgs; [
+    wget
+    vim
+    git
+    stow
+    acpi
+    termite
+    redshift
+    networkmanagerapplet
+    sudo
+    mosh
+    dmenu
+
+    chromium
+    mpv
+    htop
+  ];
+
+  services.openssh.enable = true;
+  services.printing = {
+    enable = true;
+    drivers = [ pkgs.gutenprint pkgs.hplip ];
+  };
+
+  services.xserver = {
+    enable = true;
+    layout = "de";
+    xkbVariant = "neo";
+
+    desktopManager.xterm.enable = false;
+
+    windowManager.xmonad = {
+      enable = true;
+      enableContribAndExtras = true;
+    };
+
+    displayManager = {
+      desktopManagerHandlesLidAndPower = false;
+      sessionCommands =
+        ''
+        redshift -c .redshift &
+        '';
+    };
+
+    synaptics.enable = true;
+    synaptics.tapButtons = false;
+    synaptics.twoFingerScroll = true;
+
+    videoDrivers = [ "intel" ];
+
+    startGnuPGAgent = true;
+  };
+
+  programs.fish.enable = true;
+
+  users.extraUsers.lukas = {
+    isNormalUser = true;
+    uid = 1000;
+    shell = "/run/current-system/sw/bin/fish";
+    group = "users";
+    extraGroups = [ "audio" "wheel" "networkmanager" ];
+  };
+
+  environment.etc."vte.sh" = { source = "${pkgs.gnome3.vte}/etc/profile.d/vte.sh"; };
+  programs.ssh.startAgent = false;
+
+  system.stateVersion = "unstable";
+}
diff --git a/modules/README.md b/modules/README.md
new file mode 100644
index 00000000..d9dd5851
--- /dev/null
+++ b/modules/README.md
@@ -0,0 +1,49 @@
+This directory contains various NixOS modules.
+
+If you add a module here, make sure that you define all options using a
+`vuizvui.*` namespace, so that the documentation is generated and you don't
+clash with modules from upstream [nixpkgs](https://github.com/NixOS/nixpkgs).
+
+When writing modules, make sure to categorize them accordingly:
+
+<table>
+  <tr>
+    <th>hardware</th>
+    <td>Hardware-related options</td>
+  </tr>
+  <tr>
+    <th>profiles</th>
+    <td>Options for a specific domain (like for example
+        `desktop`, `router`, `music`, ...)
+    </td>
+  </tr>
+  <tr>
+    <th>programs</th>
+    <td>Program-specific configuration options</td>
+  </tr>
+  <tr>
+    <th>services</th>
+    <td>Modules that implement systemd services</td>
+  </tr>
+  <tr>
+    <th>system</th>
+    <td>Everything system-related (like for example kernel)</td>
+  </tr>
+  <tr>
+    <th>tasks</th>
+    <td>Various one-shot services</td>
+  </tr>
+</table>
+
+If a module is highly specific to your own configuration, use the same
+categories but put them under `user/$category/$module`.
+
+Don't forget to add your module to `module-list.nix`, but make sure you have
+options in place to disable them by default.
+
+## Module option reference
+
+There is also a Hydra job for the currently available options which are
+specific to all of the modules listed in `module-list.nix`:
+
+https://headcounter.org/hydra/job/openlab/vuizvui/manual/latest/download/1/manual.html
diff --git a/modules/hardware/gamecontroller.nix b/modules/hardware/gamecontroller.nix
new file mode 100644
index 00000000..5cfe9d16
--- /dev/null
+++ b/modules/hardware/gamecontroller.nix
@@ -0,0 +1,109 @@
+{ config, lib, ... }:
+
+with lib;
+
+let
+  mappingType = (types.addCheck types.str (val: let
+    pattern = "[ab][0-9]+|h[0-9]+\.[0-9]+";
+  in builtins.match pattern val == [])) // {
+    name = "aI (axis), bI (button) or hI.M (hat) where I=index, M=mask";
+  };
+
+  mkAssignmentOption = example: name: description: mkOption {
+    type = types.nullOr mappingType;
+    default = null;
+    inherit example;
+    description = "Assignment for ${description}.";
+  };
+
+  mkAxisOption = mkAssignmentOption "a0";
+  mkButtonOption = mkAssignmentOption "b0";
+
+  axes = {
+    leftx = "left stick X axis";
+    lefty = "left stick Y axis";
+    rightx = "right stick X axis";
+    righty = "right stick Y axis";
+    lefttrigger = "left trigger";
+    righttrigger = "right trigger";
+  };
+
+  buttons = {
+    a = "A button (down)";
+    b = "B button (right)";
+    x = "X button (left)";
+    y = "Y button (up)";
+    back = "XBox <literal>back</literal> button";
+    guide = "XBox <literal>guide</literal> button";
+    start = "<literal>start</literal> button";
+    leftstick = "pressing the left stick";
+    rightstick = "pressing the right stick";
+    leftshoulder = "left shoulder/bumper button";
+    rightshoulder = "right shoulder/bumper button";
+    dpup = "directional pad up";
+    dpdown = "directional pad down";
+    dpleft = "directional pad left";
+    dpright = "directional pad right";
+  };
+
+  gcSubModule = { name, ... }: {
+    options = {
+      name = mkOption {
+        type = types.str;
+        default = name;
+        description = ''
+          The name of this controller, doesn't have special meaning and is only
+          there to make it easier to dinguish various mappings.
+        '';
+      };
+
+      guid = mkOption {
+        type = types.uniq types.str;
+        default = name;
+        description = ''
+          The SDL2 GUID to uniquely identify this controller.
+
+          Use <literal>vuizvui.list-gamecontrollers</literal> to list them.
+        '';
+      };
+
+      mapping = mapAttrs mkAxisOption axes // mapAttrs mkButtonOption buttons;
+    };
+  };
+
+  mkGCLine = const (cfg: let
+    validMappings = attrNames axes ++ attrNames buttons;
+    mkMappingVal = name: let
+      val = cfg.mapping.${name} or null;
+    in if val == null then null else "${name}:${val}";
+    attrs = [ cfg.guid cfg.name "platform:Linux" ]
+         ++ remove null (map mkMappingVal validMappings);
+  in concatStringsSep "," attrs);
+
+  controllers = mapAttrsToList mkGCLine config.vuizvui.hardware.gameController;
+  controllerConfig = concatStringsSep "\n" controllers;
+
+in {
+  options.vuizvui.hardware.gameController = mkOption {
+    type = types.attrsOf (types.submodule gcSubModule);
+    default = {};
+    description = let
+      url =
+      "https://upload.wikimedia.org/wikipedia/commons/2/2c/360_controller.svg";
+    in ''
+      A mapping of the game controllers to use with SDL2 games.
+
+      The mapping is always based on the XBox reference controller, so even if
+      you don't use an XBox controller, you still have to map your keys
+      according to this layout:
+
+      <link xlink:href="${
+        "https://upload.wikimedia.org/wikipedia/commons/2/2c/360_controller.svg"
+      }"/>
+    '';
+  };
+
+  config = mkIf (config.vuizvui.hardware.gameController != {}) {
+    environment.sessionVariables.SDL_GAMECONTROLLERCONFIG = controllerConfig;
+  };
+}
diff --git a/modules/hardware/t100ha/default.nix b/modules/hardware/t100ha/default.nix
new file mode 100644
index 00000000..d5f2138e
--- /dev/null
+++ b/modules/hardware/t100ha/default.nix
@@ -0,0 +1,20 @@
+{ config, pkgs, lib, ... }:
+
+let
+  cfg = config.vuizvui.hardware.t100ha;
+  desc = "hardware support for the ASUS T100HA convertible";
+
+in {
+  options.vuizvui.hardware.t100ha.enable = lib.mkEnableOption desc;
+
+  config = lib.mkIf cfg.enable {
+    # Needed for booting from MMC:
+    boot.initrd.availableKernelModules = [
+      "xhci_pci" "sdhci_acpi" "mmc_block"
+    ];
+    # It's a CherryTrail SoC, so we want to have the latest and greatest:
+    boot.kernelPackages = pkgs.linuxPackages_latest;
+    # By default the console is rotated by 90 degrees to the right.
+    boot.kernelParams = [ "fbcon=rotate:3" ];
+  };
+}
diff --git a/modules/module-list.nix b/modules/module-list.nix
new file mode 100644
index 00000000..a606acb3
--- /dev/null
+++ b/modules/module-list.nix
@@ -0,0 +1,25 @@
+[
+  ./hardware/gamecontroller.nix
+  ./hardware/t100ha
+  ./profiles/common.nix
+  ./profiles/tests.nix
+  ./services/multipath-vpn.nix
+  ./services/postfix
+  ./system/iso.nix
+  ./system/thinkpad.nix
+  ./user/aszlig/profiles/base.nix
+  ./user/aszlig/profiles/workstation
+  ./user/aszlig/programs/gajim
+  ./user/aszlig/programs/git
+  ./user/aszlig/programs/mpv
+  ./user/aszlig/programs/taalo-build
+  ./user/aszlig/programs/taskwarrior
+  ./user/aszlig/programs/vim
+  ./user/aszlig/programs/xpdf
+  ./user/aszlig/programs/zsh
+  ./user/aszlig/services/i3
+  ./user/aszlig/services/slim
+  ./user/aszlig/services/vlock
+  ./user/aszlig/system/kernel.nix
+  ./user/profpatsch/programs/scanning.nix
+]
diff --git a/modules/profiles/common.nix b/modules/profiles/common.nix
new file mode 100644
index 00000000..dbaec7ed
--- /dev/null
+++ b/modules/profiles/common.nix
@@ -0,0 +1,88 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+{
+  options.vuizvui = {
+    modifyNixPath = mkOption {
+      type = types.bool;
+      default = true;
+      description = ''
+        Whether to modify NIX_PATH for vuizvui, so that &lt;nixpkgs&gt; points
+        to the path within the Nix channel instead of the
+        <literal>nixpkgs</literal> or <literal>nixos</literal> channel from the
+        root user.
+      '';
+    };
+
+    enableGlobalNixpkgsConfig = mkOption {
+      type = types.bool;
+      default = false;
+      description = ''
+        Enabling this links <literal>nixos-config</literal> to be used by
+        <literal>nixpkgs-config</literal>, which essentially means that
+        attributes defined in <option>nixpkgs.config</option> are also in effect
+        for user environments.
+      '';
+    };
+
+    channelName = mkOption {
+      type = types.str;
+      default = "vuizvui";
+      description = ''
+        The channel name which is used to refer to <literal>vuizvui</literal>.
+      '';
+    };
+  };
+
+  config = let
+    nixpkgs = import ../../nixpkgs-path.nix;
+    system = config.nixpkgs.system;
+
+  in {
+    nixpkgs.config.packageOverrides = pkgs: {
+      # XXX: REAAAALLLY UGLY hack to force the Headcounter Hydra to rebuild GHC
+      # and all its packages and not use binary substitution.
+      haskellPackages = pkgs.haskellPackages.override {
+        ghc = pkgs.haskellPackages.ghc.overrideDerivation (const {
+          forceRebuild = true;
+        });
+      };
+
+      inherit (import ../../pkgs {
+        # We need to make sure to incorporate other package overrides,
+        # otherwise we are unable to override packages in vuizvui.*.
+        pkgs = pkgs // config.nixpkgs.config.packageOverrides pkgs;
+      }) vuizvui;
+    };
+
+    nix.binaryCachePublicKeys = [
+      "headcounter.org:/7YANMvnQnyvcVB6rgFTdb8p5LG1OTXaO+21CaOSBzg="
+    ];
+
+    environment.variables.NIXPKGS_CONFIG = let
+      nixpkgsCfg = toString (pkgs.writeText "nixpkgs-try-config.nix" ''
+        if (builtins.tryEval <nixpkgs-config>).success
+        then import <nixpkgs-config>
+        else {}
+      '');
+    in mkIf config.vuizvui.enableGlobalNixpkgsConfig (mkForce nixpkgsCfg);
+
+    nix.nixPath = let
+      rootChannelsPath = "/nix/var/nix/profiles/per-user/root/channels";
+      channelPath = "${rootChannelsPath}/${config.vuizvui.channelName}";
+      nixosConfig = "/etc/nixos/configuration.nix";
+      nixpkgsConfig = "nixpkgs-config=${pkgs.writeText "nixpkgs-config.nix" ''
+        (import ${nixpkgs}/nixos/lib/eval-config.nix {
+          modules = [ ${nixosConfig} ];
+        }).config.nixpkgs.config
+      ''}";
+      nixPath = [
+        "vuizvui=${channelPath}"
+        "nixpkgs=${channelPath}/nixpkgs"
+        "nixos-config=${nixosConfig}"
+        rootChannelsPath
+      ] ++ optional config.vuizvui.enableGlobalNixpkgsConfig nixpkgsConfig;
+    in mkIf config.vuizvui.modifyNixPath (mkOverride 90 nixPath);
+  };
+}
diff --git a/modules/profiles/tests.nix b/modules/profiles/tests.nix
new file mode 100644
index 00000000..04019b3d
--- /dev/null
+++ b/modules/profiles/tests.nix
@@ -0,0 +1,249 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+let
+  whichNet = if config.networking.useNetworkd then "networkd" else "scripted";
+
+  mkTest = attrs: if attrs.check then attrs.paths or [ attrs.path ] else [];
+
+  anyAttrs = pred: cfg: any id (mapAttrsToList (const pred) cfg);
+
+  upstreamTests = concatMap mkTest [
+    { check = config.services.avahi.enable;
+      path  = ["nixos" "avahi"];
+    }
+    { check = config.vuizvui.createISO;
+      paths = [
+        ["nixos" "bootBiosCdrom"]
+        ["nixos" "bootBiosUsb"]
+        ["nixos" "bootUefiCdrom"]
+        ["nixos" "bootUefiUsb"]
+      ];
+    }
+    { check = config.services.cadvisor.enable;
+      path  = ["nixos" "cadvisor"];
+    }
+    { check = config.services.cjdns.enable;
+      path  = ["nixos" "cjdns"];
+    }
+    { check = config.containers != {};
+      path  = ["nixos" "containers"];
+    }
+    { check = config.virtualisation.docker.enable;
+      path  = ["nixos" "docker"];
+    }
+    { check = config.services.dockerRegistry.enable;
+      path  = ["nixos" "dockerRegistry"];
+    }
+    { check = config.services.etcd.enable;
+      path  = ["nixos" "etcd"];
+    }
+    { check = config.networking.firewall.enable;
+      path  = ["nixos" "firewall"];
+    }
+    { check = config.services.fleet.enable;
+      path  = ["nixos" "fleet"];
+    }
+    { check = config.services.xserver.desktopManager.gnome3.enable;
+      path  = ["nixos" "gnome3"];
+    }
+    { check = config.services.xserver.displayManager.gdm.enable;
+      path  = ["nixos" "gnome3-gdm"];
+    }
+    { check = config.services.xserver.windowManager.i3.enable;
+      path  = ["nixos" "i3wm"];
+    }
+    { check = elem "btrfs" config.boot.supportedFilesystems;
+      paths = [
+        ["nixos" "installer" "btrfsSimple"]
+        ["nixos" "installer" "btrfsSubvols"]
+        ["nixos" "installer" "btrfsSubvolDefault"]
+      ];
+    }
+    { check = config.boot.loader.grub.version == 1;
+      path  = ["nixos" "installer" "grub1"];
+    }
+    { check = config.boot.initrd.luks.devices != [];
+      path  = ["nixos" "installer" "luksroot"];
+    }
+    { check = true;
+      path  = ["nixos" "installer" "lvm"];
+    }
+    { check = config.fileSystems ? "/boot";
+      path  = ["nixos" "installer" "separateBoot"];
+    }
+    { check = config.fileSystems ? "/boot"
+           && config.fileSystems."/boot".fsType == "vfat";
+      path  = ["nixos" "installer" "separateBootFat"];
+    }
+    { check = elem "ext3" config.boot.supportedFilesystems;
+      path  = ["nixos" "installer" "simple"];
+    }
+    { check = config.boot.loader.grub.fsIdentifier == "label";
+      path  = ["nixos" "installer" "simpleLabels"];
+    }
+    { check = config.boot.loader.grub.fsIdentifier == "provided";
+      path  = ["nixos" "installer" "simpleProvided"];
+    }
+    { check = config.boot.initrd.mdadmConf != "";
+      path  = ["nixos" "installer" "swraid"];
+    }
+    { check = config.services.influxdb.enable;
+      path  = ["nixos" "influxdb"];
+    }
+    { check = config.networking.enableIPv6;
+      path  = ["nixos" "ipv6"];
+    }
+    { check = config.services.jenkins.enable;
+      path  = ["nixos" "jenkins"];
+    }
+    { check = config.services.xserver.desktopManager.kde4.enable;
+      path  = ["nixos" "kde4"];
+    }
+    { check = with config.services.kubernetes; apiserver.enable
+           || scheduler.enable || controllerManager.enable || kubelet.enable
+           || proxy.enable;
+      path  = ["nixos" "kubernetes"];
+    }
+    { check = config.boot.kernelPackages.kernel.version
+           == pkgs.linuxPackages_latest.kernel.version;
+      path  = ["nixos" "latestKernel" "login"];
+    }
+    { check = true;
+      path  = ["nixos" "login"];
+    }
+    { check = true;
+      path  = ["nixos" "misc"];
+    }
+    { check = config.services.murmur.enable;
+      path  = ["nixos" "mumble"];
+    }
+    { check = config.services.munin-node.enable
+           || config.services.munin-cron.enable;
+      path  = ["nixos" "munin"];
+    }
+    { check = config.services.mysql.enable;
+      path  = ["nixos" "mysql"];
+    }
+    { check = config.services.mysql.enable
+           && config.services.mysql.replication.role != "none";
+      path  = ["nixos" "mysqlReplication"];
+    }
+    { check = config.networking.nat.enable
+           && config.networking.firewall.enable;
+      path  = ["nixos" "nat" "firewall"];
+    }
+    { check = config.networking.nat.enable
+           && !config.networking.firewall.enable;
+      path  = ["nixos" "nat" "standalone"];
+    }
+    { check = config.networking.bonds != {};
+      path  = ["nixos" "networking" whichNet "bond"];
+    }
+    { check = config.networking.bridges != {};
+      path  = ["nixos" "networking" whichNet "bridge"];
+    }
+    { check = anyAttrs (i: i.useDHCP == true) config.networking.interfaces;
+      path  = ["nixos" "networking" whichNet "dhcpOneIf"];
+    }
+    { check = config.networking.useDHCP;
+      path  = ["nixos" "networking" whichNet "dhcpSimple"];
+    }
+    { check = true;
+      path  = ["nixos" "networking" whichNet "loopback"];
+    }
+    { check = config.networking.macvlans != {};
+      path  = ["nixos" "networking" whichNet "macvlan"];
+    }
+    { check = config.networking.sits != {};
+      path  = ["nixos" "networking" whichNet "sit"];
+    }
+    { check = anyAttrs (i: i.ip4 != []) config.networking.interfaces;
+      path  = ["nixos" "networking" whichNet "static"];
+    }
+    { check = config.networking.vlans != {};
+      path  = ["nixos" "networking" whichNet "vlan"];
+    }
+    { check = with config.networking.proxy; any (val: val != null)
+            [ default allProxy ftpProxy httpProxy httpsProxy noProxy
+              rsyncProxy
+            ];
+      path  = ["nixos" "networkingProxy"];
+    }
+    { check = elem "nfs" config.boot.supportedFilesystems;
+      paths = [
+        ["nixos" "nfs3"]
+        ["nixos" "nfs4"]
+      ];
+    }
+    { check = true;
+      path  = ["nixos" "nixosPinVersion"];
+    }
+    { check = config.services.nsd.enable;
+      path  = ["nixos" "nsd"];
+    }
+    { check = config.services.openssh.enable;
+      path  = ["nixos" "openssh"];
+    }
+    { check = config.services.panamax.enable;
+      path  = ["nixos" "panamax"];
+    }
+    { check = config.services.peerflix.enable;
+      path  = ["nixos" "peerflix"];
+    }
+    { check = config.services.printing.enable;
+      path  = ["nixos" "printing"];
+    }
+    { check = config.services.httpd.enable
+           && elem "proxy_balancer" config.services.httpd.extraModules;
+      path  = ["nixos" "proxy"];
+    }
+    { check = config.services.pumpio.enable;
+      path  = ["nixos" "pumpio"];
+    }
+    { check = config.hardware.opengl.driSupport
+           && config.services.xserver.enable;
+      path  = ["nixos" "quake3"];
+    }
+    { check = true;
+      path  = ["nixos" "runInMachine"];
+    }
+    { check = config.services.xserver.displayManager.sddm.enable;
+      path  = ["nixos" "sddm"];
+    }
+    { check = true;
+      path  = ["nixos" "simple"];
+    }
+    { check = config.services.tomcat.enable;
+      path  = ["nixos" "tomcat"];
+    }
+    { check = config.services.udisks2.enable;
+      path  = ["nixos" "udisks2"];
+    }
+    { check = config.virtualisation.virtualbox.host.enable;
+      path  = ["nixos" "virtualbox"];
+    }
+    { check = config.services.xserver.desktopManager.xfce.enable;
+      path  = ["nixos" "xfce"];
+    }
+  ];
+
+in {
+  options.vuizvui = {
+    requiresTests = mkOption {
+      type = types.listOf (types.listOf types.str);
+      default = [];
+      example = [ ["nixos" "nat" "firewall"] ["vuizvui" "foo"] ];
+      description = ''
+        A list of attribute paths to the tests which need to succeed in order to
+        trigger a channel update for the current configuration/machine.
+
+        Every attribute path itself is a list of attribute names, which are
+        queried using <function>lib.getAttrFromPath</function>.
+      '';
+    };
+  };
+
+  config.vuizvui.requiresTests = upstreamTests;
+}
diff --git a/modules/services/multipath-vpn.nix b/modules/services/multipath-vpn.nix
new file mode 100644
index 00000000..c6c318aa
--- /dev/null
+++ b/modules/services/multipath-vpn.nix
@@ -0,0 +1,246 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+let
+  deps = with pkgs.perlPackages; rec {
+    IOInterface = buildPerlPackage {
+      name = "IO-Interface-1.09";
+      src = fetchurl {
+        url = mirror://cpan/authors/id/L/LD/LDS/IO-Interface-1.09.tar.gz;
+        sha256 = "0fkizbclng7jaxkwj9cr2wby34r45mazb0yrq87fdq5i5v2q2gp6";
+      };
+      buildInputs = [ ModuleBuild ];
+      preConfigure = "touch Makefile.PL";
+      buildPhase = "perl Build.PL --prefix=$out; ./Build build";
+      installPhase = "./Build install";
+      checkPhase = "./Build test";
+    };
+
+    IOPipely = buildPerlPackage {
+      name = "IO-Pipely-0.005";
+      src = fetchurl {
+        url = mirror://cpan/authors/id/R/RC/RCAPUTO/IO-Pipely-0.005.tar.gz;
+        sha256 = "0x1fkwbkbkhxf0cvz08yj24hm9c775i1xx8khlqfwiibrgsnqfz3";
+      };
+    };
+
+    ModuleBuild = buildPerlPackage {
+      name = "Module-Build-0.4211";
+      src = fetchurl {
+        url = mirror://cpan/authors/id/L/LE/LEONT/Module-Build-0.4211.tar.gz;
+        sha256 = "1c5hfhajr963w4mdjivsc7yz4vf4pz1rrfch5a93fbac1x2mr58h";
+      };
+      doCheck = false;
+    };
+
+    POE = buildPerlPackage {
+      name = "POE-1.366";
+      src = fetchurl {
+        url = mirror://cpan/authors/id/R/RC/RCAPUTO/POE-1.366.tar.gz;
+        sha256 = "08qmb45clkjw2ni9dl5y1fa4ifrinvbvvcgh7r20ls32frw034xl";
+      };
+      buildInputs = [ POETestLoops ];
+      propagatedBuildInputs = [ IOPipely IOTty POETestLoops ];
+    };
+
+    POETestLoops = buildPerlPackage {
+      name = "POE-Test-Loops-1.360";
+      src = fetchurl {
+        url = mirror://cpan/authors/id/R/RC/RCAPUTO/POE-Test-Loops-1.360.tar.gz;
+        sha256 = "0yx4wsljfmdzsiv0ni98x6lw975cm82ahngbwqvzv60wx5pwkl5y";
+      };
+    };
+
+    POEWheelUDP = pkgs.buildPerlPackage {
+      name = "POE-Wheel-UDP-0.02";
+      src = fetchurl {
+        url = mirror://cpan/authors/id/H/HA/HACHI/POE-Wheel-UDP-0.02.tar.gz;
+        sha256 = "0d611cqpmq7svmxq6pbjb59b97x5zh2z4lc11f8zjmci98nag2g6";
+      };
+      propagatedBuildInputs = [ POE ];
+    };
+  };
+
+  linkOptions = { name, ... }: {
+    options = {
+      interface = mkOption {
+        type = types.str;
+        description = ''
+          IP address or interface name to connect to the relay.
+        '';
+      };
+
+      sourcePort = mkOption {
+        type = types.int;
+        default = 11218;
+        description = ''
+          Local UDP port to use for connecting to the other endpoint.
+        '';
+      };
+
+      destAddress = mkOption {
+        type = types.str;
+        description = ''
+          Remote UDP host or IP of the other endpoint.
+        '';
+      };
+
+      destPort = mkOption {
+        type = types.int;
+        default = 11218;
+        description = ''
+          Remote UDP port the other endpoint is listening.
+        '';
+      };
+
+      ratio = mkOption {
+        type = types.int;
+        default = 1;
+        description = ''
+          Defines how many packets the remote endpoint is getting in relation to
+          the other defined links.
+        '';
+      };
+    };
+  };
+
+  commonOptions = {
+    links = mkOption {
+      default = {};
+      type = types.attrsOf (types.submodule linkOptions);
+      description = ''
+        Links used to connect to the remote endpoint (server).
+      '';
+    };
+
+    tun.ip = mkOption {
+      type = types.str;
+      description = ''
+        IP address of the TUN interface used for communicating to/from the
+        outside of the tunnel.
+      '';
+    };
+
+    tun.mask = mkOption {
+      type = types.int;
+      description = ''
+        Network prefix length to use for the TUN interface.
+      '';
+    };
+
+    tun.mtu = mkOption {
+      type = types.int;
+      default = 1500;
+      description = ''
+        Maximum transfer unit for the TUN interface.
+      '';
+    };
+
+    route.network = mkOption {
+      type = types.str;
+      description = ''
+        Network address of the auto-enabled route.
+      '';
+    };
+
+    route.mask = mkOption {
+      type = types.int;
+      description = ''
+        Network prefix length of the auto-enabled route.
+      '';
+    };
+
+    route.gateway = mkOption {
+      type = types.str;
+      description = ''
+        Gateway address of the auto-enabled route.
+      '';
+    };
+  };
+
+  clientOptions = commonOptions // {
+    enable = mkEnableOption "Multipath VPN Client";
+  };
+
+  serverOptions = commonOptions // {
+    enable = mkEnableOption "Multipath VPN Server";
+  };
+
+  genConfig = name: cfg: mkIf cfg.enable (let
+    attrs = if name == "client" then {
+      descName = "Client";
+    } else if name == "server" then {
+      descName = "Server";
+    } else throw "Invalid multipath VPN config mode";
+
+    mpvpn = pkgs.stdenv.mkDerivation rec {
+      name = "multipath-vpn";
+
+      src = pkgs.fetchFromGitHub {
+        owner = "richi235";
+        repo = name;
+        rev = "51729f7bb24b5361c90469c60f67df0c8b4e2371";
+        sha256 = "1p2i1m649nhrylqz2grc5nxwgzqq1rnwkzk7iipdxabx2164ahaq";
+      };
+
+      configFile = pkgs.writeText "mpvpn.conf" ''
+        ${concatStringsSep "\n" (mapAttrsToList (
+          name: attrs: concatStringsSep "\t" [
+            "link" name attrs.interface
+            (toString attrs.sourcePort)
+            attrs.destAddress
+            (toString attrs.destPort)
+            (toString attrs.ratio)
+          ]
+        ) cfg.links)}
+
+        ${concatStringsSep "\t" [
+          "local" cfg.tun.ip (toString cfg.tun.mask) (toString cfg.tun.mtu)
+        ]}
+
+        ${concatStringsSep "\t" [
+          "route" cfg.route.network (toString cfg.route.mask) cfg.route.gateway
+        ]}
+      '';
+
+      buildPhase = "true";
+      buildInputs = [
+        pkgs.makeWrapper pkgs.perl
+        deps.POEWheelUDP deps.IOInterface
+      ];
+      installPhase = ''
+        mkdir -p "$out/bin"
+
+        sed -e "s,/etc/multivpn.cfg,$configFile," \
+            -e 's/detect+handle_local_ip_change/handle_local_ip_change/g' \
+            vpn_client_and_server.pl > "$out/bin/multipath-vpn"
+
+        chmod +x "$out/bin/multipath-vpn"
+        wrapProgram $out/bin/multipath-vpn --set PERL5LIB $PERL5LIB
+      '';
+    };
+  in {
+    systemd.services."multipath-vpn-${name}" = {
+      description = "Multipath VPN ${attrs.descName}";
+      after = [ "network-interfaces.target" ];
+      wantedBy = [ "multi-user.target" ];
+      path = [ pkgs.iptables pkgs.nettools pkgs.iproute pkgs.bridge-utils ];
+      serviceConfig.ExecStart = "@${mpvpn}/bin/multipath-vpn multipath-vpn";
+    };
+  });
+
+in {
+  options.vuizvui.services.multipath-vpn.client = commonOptions // {
+    enable = mkEnableOption "Multipath VPN Client";
+  };
+
+  options.vuizvui.services.multipath-vpn.server = commonOptions // {
+    enable = mkEnableOption "Multipath VPN Server";
+  };
+
+  config = mkMerge [
+    (genConfig "client" config.vuizvui.services.multipath-vpn.client)
+    (genConfig "server" config.vuizvui.services.multipath-vpn.server)
+  ];
+}
diff --git a/modules/services/postfix/default.nix b/modules/services/postfix/default.nix
new file mode 100644
index 00000000..8a0865b9
--- /dev/null
+++ b/modules/services/postfix/default.nix
@@ -0,0 +1,65 @@
+{ config, lib, ... }:
+
+with lib;
+
+let
+  cfg = config.vuizvui.services.postfix;
+
+  mkRestriction = name: specificDescription: {
+    option.${name} = mkOption {
+      default = null;
+      type = types.nullOr (types.listOf types.str);
+      description = ''
+        A list of restrictions to apply or <option>null</option> to use the
+        built-in default value from Postfix.
+        ${specificDescription}
+      '';
+    };
+
+    config = let
+      restrictions = cfg.restrictions.${name};
+    in mkIf (restrictions != null) {
+      services.postfix.extraConfig = ''
+        smtpd_${name}_restrictions = ${concatStringsSep ", " restrictions}
+      '';
+    };
+  };
+
+  restrictions = mapAttrsToList mkRestriction {
+    client = ''
+      SMTP server access restrictions in the context of a client SMTP connection
+      request.
+    '';
+    data = ''
+      Access restrictions that the Postfix SMTP server applies in the context of
+      the SMTP DATA command.
+    '';
+    end_of_data = ''
+      Access restrictions that the Postfix SMTP server applies in the context of
+      the SMTP END-OF-DATA command.
+    '';
+    etrn = ''
+      SMTP server access restrictions in the context of a client ETRN request.
+    '';
+    helo = ''
+      Restrictions that the Postfix SMTP server applies in the context of the
+      SMTP HELO command.
+    '';
+    recipient = ''
+      Access restrictions that the Postfix SMTP server applies in the context of
+      the RCPT TO command.
+    '';
+    sender = ''
+      Restrictions that the Postfix SMTP server applies in the context of the
+      MAIL FROM command.
+    '';
+  };
+
+in {
+  options.vuizvui.services.postfix = {
+    enable = mkEnableOption "Vuizvui Postfix";
+    restrictions = fold mergeAttrs {} (catAttrs "option" restrictions);
+  };
+
+  config = mkIf cfg.enable (mkMerge (catAttrs "config" restrictions));
+}
diff --git a/modules/system/iso.nix b/modules/system/iso.nix
new file mode 100644
index 00000000..893a56e9
--- /dev/null
+++ b/modules/system/iso.nix
@@ -0,0 +1,12 @@
+{ lib, ... }:
+
+{
+  options.vuizvui.createISO = lib.mkOption {
+    default = false;
+    example = true;
+    type = lib.types.bool;
+    description = ''
+      Whether to build an ISO image out of this machine configuration on Hydra.
+    '';
+  };
+}
diff --git a/modules/system/thinkpad.nix b/modules/system/thinkpad.nix
new file mode 100644
index 00000000..025ce760
--- /dev/null
+++ b/modules/system/thinkpad.nix
@@ -0,0 +1,31 @@
+{ lib, config, pkgs, ... }:
+
+with lib;
+
+let
+  cfg = config.vuizvui.hardware.thinkpad;
+
+in
+{
+  options.vuizvui.hardware.thinkpad = {
+    enable = mkEnableOption "thinkpad support";
+  };
+
+  config = mkIf cfg.enable {
+    # read acpi stats (e.g. battery)
+    environment.systemPackages = [ pkgs.acpi ];
+
+    # for wifi
+    hardware.enableAllFirmware = true;
+
+    hardware.trackpoint = {
+      enable = true;
+      emulateWheel = true;
+      speed = 250;
+      sensitivity = 140;
+    };
+
+    # TLP Linux Advanced Power Management
+    services.tlp.enable = true;
+  };
+}
diff --git a/modules/user/aszlig/profiles/base.nix b/modules/user/aszlig/profiles/base.nix
new file mode 100644
index 00000000..8f31467e
--- /dev/null
+++ b/modules/user/aszlig/profiles/base.nix
@@ -0,0 +1,101 @@
+{ config, pkgs, lib, ... }:
+
+let
+  cfg = config.vuizvui.user.aszlig.profiles.base;
+
+in {
+  options.vuizvui.user.aszlig.profiles.base = {
+    enable = lib.mkEnableOption "Base profile for aszlig";
+  };
+
+  config = lib.mkIf cfg.enable {
+    nix = {
+      useChroot = true;
+      readOnlyStore = true;
+      buildCores = 0;
+      extraOptions = ''
+        auto-optimise-store = true
+        log-servers = https://headcounter.org/hydra/log
+      '';
+    };
+
+    boot.loader.grub = {
+      enable = true;
+      version = 2;
+    };
+
+    hardware.cpu.intel.updateMicrocode = true;
+
+    users.defaultUserShell = "/var/run/current-system/sw/bin/zsh";
+
+    networking.wireless.enable = false;
+    networking.firewall.enable = false;
+    networking.useNetworkd = true;
+
+    i18n.consoleKeyMap = "dvorak";
+    i18n.consoleFont = "lat9w-16";
+
+    programs.ssh.startAgent = false;
+    programs.ssh.extraConfig = ''
+      ServerAliveInterval 60
+    '';
+
+    vuizvui.user.aszlig.programs.vim.enable = true;
+    vuizvui.user.aszlig.programs.zsh.enable = true;
+    vuizvui.enableGlobalNixpkgsConfig = true;
+
+    services.nixosManual.showManual = false;
+
+    services.journald.extraConfig = ''
+      MaxRetentionSec=3month
+    '';
+
+    environment.systemPackages = with pkgs; [
+      binutils
+      cacert
+      file
+      htop
+      iotop
+      psmisc
+      unrar
+      unzip
+      vlock
+      wget
+      xz
+    ];
+
+    nixpkgs.config = {
+      pulseaudio = true;
+      chromium.enablePepperFlash = true;
+      firefox.jre = true;
+
+      # Needed for CPU microcode
+      allowUnfree = true;
+
+      allowBroken = true;
+
+      packageOverrides = pkgs: {
+        beets = pkgs.beets.override {
+          enableAlternatives = true;
+        };
+        miro = pkgs.miro.override {
+          enableBonjour = true;
+        };
+        netrw = pkgs.netrw.override {
+          checksumType = "mhash";
+        };
+        nix = pkgs.nixUnstable;
+        uqm = pkgs.uqm.override {
+          use3DOVideos = true;
+          useRemixPacks = true;
+        };
+        w3m = pkgs.w3m.override {
+          graphicsSupport = true;
+        };
+      };
+    };
+
+    system.fsPackages = with pkgs; [ sshfsFuse ];
+    time.timeZone = "Europe/Berlin";
+  };
+}
diff --git a/modules/user/aszlig/profiles/workstation/default.nix b/modules/user/aszlig/profiles/workstation/default.nix
new file mode 100644
index 00000000..2e0d8a40
--- /dev/null
+++ b/modules/user/aszlig/profiles/workstation/default.nix
@@ -0,0 +1,178 @@
+{ pkgs, config, lib, ... }:
+
+let
+  cfg = config.vuizvui.user.aszlig.profiles.workstation;
+  randrHeads = config.services.xserver.xrandrHeads;
+
+in {
+  options.vuizvui.user.aszlig.profiles.workstation = {
+    enable = lib.mkEnableOption "Workstation profile for aszlig";
+  };
+
+  config = lib.mkIf cfg.enable {
+    vuizvui.user.aszlig.profiles.base.enable = true;
+
+    boot.kernelParams = [ "zswap.enabled=1" "panic=1800" ];
+    boot.cleanTmpDir = true;
+
+    environment.systemPackages = with lib; let
+      mkRandrConf = acc: name: acc ++ singleton {
+        inherit name;
+        value = "--output '${name}' --preferred"
+              + optionalString (acc != []) " --right-of '${(head acc).name}'";
+      };
+      randrConf = map (getAttr "value") (foldl mkRandrConf [] randrHeads);
+    in singleton (pkgs.writeScriptBin "xreset" ''
+      #!${pkgs.stdenv.shell}
+      ${pkgs.xorg.xrandr}/bin/xrandr ${concatStringsSep " " randrConf}
+    '') ++ import ./packages.nix pkgs;
+
+    hardware = {
+      pulseaudio.enable = true;
+      opengl = {
+        driSupport32Bit = true;
+        s3tcSupport = true;
+      };
+    };
+
+    fonts = {
+      enableCoreFonts = true;
+      enableFontDir = true;
+      enableGhostscriptFonts = true;
+      fonts = [
+        pkgs.dosemu_fonts
+        pkgs.liberation_ttf
+      ];
+    };
+
+    vuizvui.user.aszlig.services.i3.enable = true;
+    vuizvui.user.aszlig.services.slim.enable = true;
+    vuizvui.user.aszlig.services.vlock.enable = true;
+
+    vuizvui.user.aszlig.programs.gajim.enable = true;
+    vuizvui.user.aszlig.programs.mpv.enable = true;
+    vuizvui.user.aszlig.programs.taskwarrior.enable = true;
+    vuizvui.user.aszlig.programs.xpdf.enable = true;
+
+    vuizvui.user.aszlig.programs.git.enable = true;
+    vuizvui.user.aszlig.programs.git.config = {
+      color.ui = "auto";
+      merge.tool = "vimdiff3";
+      user.email = "aszlig@redmoonstudios.org";
+      user.name = "aszlig";
+      user.signkey = "8C2DC961";
+      gpg.program = "${pkgs.gnupg}/bin/gpg2";
+      push.default = "current";
+      tar."tar.xz".command = "${pkgs.xz}/bin/xz -c";
+      rebase.autosquash = true;
+      rerere.enabled = true;
+      rerere.autoupdate = true;
+      commit.gpgsign = true;
+
+      alias.backport = let
+        release = "14.04";
+        message = "Merge release ${release} into backports.";
+      in "!git fetch upstream release-${release} &&"
+       + " git merge -m \"${message}\" --log FETCH_HEAD";
+    };
+
+    vuizvui.hardware.gameController."03000000ff1100004133000010010000" = {
+      name = "PS2 Controller";
+      mapping = {
+        a = "b2";
+        b = "b1";
+        x = "b3";
+        y = "b0";
+        back = "b8";
+        start = "b9";
+        leftshoulder = "b6";
+        rightshoulder = "b7";
+        leftstick = "b10";
+        rightstick = "b11";
+        leftx = "a0";
+        lefty = "a1";
+        rightx = "a3";
+        righty = "a2";
+        lefttrigger = "b4";
+        righttrigger = "b5";
+        dpup = "h0.1";
+        dpleft = "h0.8";
+        dpdown = "h0.4";
+        dpright = "h0.2";
+      };
+    };
+
+    services = {
+      openssh = {
+        enable = true;
+        permitRootLogin = "without-password";
+      };
+
+      xfs.enable = false;
+
+      gpm = {
+        enable = true;
+        protocol = "exps2";
+      };
+
+      printing.enable = true;
+      printing.drivers = [ pkgs.gutenprint pkgs.hplip ];
+
+      udev.extraRules = ''
+        # aXbo S.P.A.C.
+        SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", \
+          ATTRS{serial}=="0001", OWNER="aszlig", SYMLINK+="axbo"
+        # Enttec DMX device
+        SUBSYSTEM=="usb*|tty", ACTION=="add|change", ATTRS{idVendor}=="0403", \
+          ATTRS{idProduct}=="6001", OWNER="aszlig"
+      '';
+
+      xserver = {
+        enable = true;
+        layout = "dvorak";
+
+        startGnuPGAgent = true;
+
+        displayManager.sessionCommands = ''
+          ${pkgs.redshift}/bin/redshift -l 48.428404:10.866007 &
+          ${pkgs.xorg.xrdb}/bin/xrdb "${pkgs.writeText "xrdb.config" ''
+            Rxvt*font:                 vga
+            Rxvt*background:           black
+            Rxvt*foreground:           grey
+            Rxvt*scrollBar:            false
+            Rxvt*saveLines:            2000
+
+            Rxvt*keysym.Home:          \033[1~
+            Rxvt*keysym.End:           \033[4~
+
+            Rxvt*urgentOnBell:         true
+
+            XTerm*font:                vga
+            XTerm*saveLines:           10000
+            XTerm*bellIsUrgent:        true
+            XTerm*background:          black
+            XTerm*foreground:          grey
+
+            XTerm*backarrowKeyIsErase: true
+            XTerm*ptyInitialErase:     true
+          ''}"
+        '';
+
+        desktopManager.default = "none";
+        desktopManager.xterm.enable = false;
+      };
+    };
+
+    virtualisation.virtualbox.host.enable = true;
+
+    users.extraUsers.aszlig = {
+      uid = 1000;
+      description = "aszlig";
+      group = "users";
+      extraGroups = [ "wheel" "video" ];
+      home = "/home/aszlig";
+      useDefaultShell = true;
+      createHome = true;
+    };
+  };
+}
diff --git a/modules/user/aszlig/profiles/workstation/packages.nix b/modules/user/aszlig/profiles/workstation/packages.nix
new file mode 100644
index 00000000..8ba1d309
--- /dev/null
+++ b/modules/user/aszlig/profiles/workstation/packages.nix
@@ -0,0 +1,92 @@
+pkgs: with pkgs; [
+  vuizvui.aacolorize
+  abook
+  acpi
+  apg
+  ascii
+  aspellDicts.de
+  aspellDicts.en
+  vuizvui.axbo
+  bc
+  beets
+  chromiumBeta
+  dash
+  dos2unix
+  erlang
+  fbida
+  ffmpeg
+  figlet
+  firefox
+  flac
+  gdb
+  ghostscript
+  gimp
+  glxinfo
+  gnumake
+  gnupg1compat
+  gpodder
+  graphviz
+  haskellPackages.cabal2nix
+  haskellPackages.cabal-install
+  haskellPackages.hlint
+  haskellPackages.yesod-bin
+  haxe
+  hexedit
+  i3
+  i3lock
+  imagemagick
+  jwhois
+  keychain
+  lastwatch
+  lftp
+  ltrace
+  manpages
+  mmv
+  mosh
+  mp3info
+  mpg321
+  mtr
+  mumble
+  mutt
+  ncdu
+  neko
+  netrw
+  nix-prefetch-scripts
+  nix-repl
+  vuizvui.nixops
+  nixpkgs-lint
+  nmap
+  openssh
+  openssl
+  p7zip
+  pavucontrol
+  picard
+  posix_man_pages
+  pulseaudioLight
+  vuizvui.pvolctrl
+  python
+  python3
+  pythonPackages.hetzner
+  pythonPackages.pep8
+  pythonPackages.polib
+  rlwrap
+  rtorrent
+  samplicator
+  screen
+  scrot
+  socat
+  sox
+  sqlite
+  strace
+  surfraw
+  telnet
+  vuizvui.tomahawk
+  unzip
+  uqm
+  valgrind
+  vbindiff
+  vorbisTools
+  w3m
+  wireshark
+  youtubeDL
+]
diff --git a/modules/user/aszlig/programs/gajim/config.nix b/modules/user/aszlig/programs/gajim/config.nix
new file mode 100644
index 00000000..86c4fef1
--- /dev/null
+++ b/modules/user/aszlig/programs/gajim/config.nix
@@ -0,0 +1,731 @@
+lib: with lib;
+
+let
+  mkConfig = let
+    traverse = path: attrs: let
+      mkVal = name: value: let
+        flatPath = concatStringsSep "." (path ++ [name]);
+      in if isAttrs value then traverse (path ++ [name]) value
+         else if value == true then "${flatPath} = True"
+         else if value == false then "${flatPath} = False"
+         else "${flatPath} = ${value}";
+    in concatStringsSep "\n" (mapAttrsToList mkVal attrs);
+
+    rootTraverse = attrs: (traverse [] attrs) + "\n";
+  in rootTraverse;
+
+in mkConfig {
+  activity_iconset = "default";
+  after_nickname = ">";
+  allow_hide_roster = true;
+  always_english_wikipedia = false;
+  always_english_wiktionary = true;
+  ascii_formatting = true;
+  ask_avatars_on_startup = true;
+  ask_offline_status = true;
+  ask_offline_status_on_connection = false;
+  ask_online_status = false;
+  attach_notifications_to_systray = false;
+  audio_input_device = "pulsesrc device=alsa_input."
+                     + "usb-046d_0804_DD519390-02-U0x46d0x804.analog-mono"
+                     + " ! volume name=gajim_vol";
+  audio_input_volume = "50";
+  audio_output_device = "pulsesink device=alsa_output."
+                      + "pci-0000_00_1b.0.analog-stereo sync=true";
+  audio_output_volume = "50";
+  autoaway = false;
+  autoaway_message = "$S (Away as a result of being idle more than $T min)";
+  autoawaytime = "5";
+  autodetect_browser_mailer = false;
+  autopopup = true;
+  autopopupaway = true;
+  autoxa = false;
+  autoxa_message = "$S (Not available as a result of being"
+                 + " idle more than $T min)";
+  autoxatime = "15";
+  avatar_position_in_roster = "left";
+  before_nickname = "<";
+  change_roster_title = true;
+  change_status_window_timeout = "15";
+  "chat-msgwin-height" = "440";
+  "chat-msgwin-width" = "480";
+  "chat-msgwin-x-position" = "-1";
+  "chat-msgwin-y-position" = "-1";
+  chat_avatar_height = "52";
+  chat_avatar_width = "52";
+  chat_merge_consecutive_nickname = false;
+  chat_merge_consecutive_nickname_indent = "  ";
+  check_idle_every_foo_seconds = "2";
+  check_if_gajim_is_default = true;
+  collapsed_rows = "";
+  compact_view = false;
+  confirm_block = "";
+  confirm_close_muc = true;
+  confirm_close_muc_rooms = "";
+  confirm_close_multiple_tabs = true;
+  confirm_custom_status = "no";
+  confirm_metacontacts = "no";
+  conversation_font = "Liberation Mono 10";
+  ctrl_tab_go_to_next_composing = true;
+  custom_file_manager = "";
+  custombrowser = "chromium";
+  custommailapp = "";
+  dictionary_url = "WIKTIONARY";
+  displayed_chat_state_notifications = "all";
+  emoticons_theme = "";
+  enable_negative_priority = false;
+  escape_key_closes = false;
+  esession_modp = "5,14";
+  file_transfers_port = "28011";
+  ft_add_hosts_to_send = "";
+  "gc-hpaned-position" = "979";
+  "gc-msgwin-height" = "440";
+  "gc-msgwin-width" = "600";
+  "gc-msgwin-x-position" = "-1";
+  "gc-msgwin-y-position" = "-1";
+  gc_nicknames_colors = "#4e9a06:#f57900:#ce5c00:#3465a4:#204a87:#75507b:"
+                      + "#5c3566:#c17d11:#8f5902:#ef2929:#cc0000:#a40000";
+  gc_proposed_nick_char = "_";
+  gc_refer_to_nick_char = ":";
+  global_proxy = "";
+  hide_avatar_of_transport = true;
+  hide_chat_banner = false;
+  hide_groupchat_banner = false;
+  hide_groupchat_occupants_list = false;
+  history_window_height = "1156";
+  history_window_width = "1596";
+  "history_window_x-position" = "0";
+  "history_window_y-position" = "20";
+  iconset = "dcraven";
+  ignore_incoming_xhtml = false;
+  inmsgcolor = "#ff7f50";
+  inmsgfont = "";
+  inmsgtxtcolor = "";
+  inmsgtxtfont = "";
+  just_connected_bg_color = "#adc3c6";
+  just_disconnected_bg_color = "#ab6161";
+  key_up_lines = "25";
+  last_emoticons_dir = "";
+  last_roster_visible = true;
+  last_save_dir = "";
+  last_send_dir = "";
+  last_sounds_dir = "";
+  latex_png_dpi = "108";
+  log_contact_status_changes = true;
+  log_xhtml_messages = false;
+  markedmsgcolor = "#ff8080";
+  max_conversation_lines = "500";
+  mergeaccounts = false;
+  mood_iconset = "default";
+  "msgwin-height" = "1156";
+  "msgwin-max-state" = true;
+  "msgwin-width" = "1336";
+  "msgwin-x-position" = "0";
+  "msgwin-y-position" = "20";
+  muc_autorejoin_on_kick = false;
+  muc_autorejoin_timeout = "1";
+  muc_highlight_words = "DOWN;PROBLEM;CRITICAL;UNREACHABLE";
+  muc_restore_lines = "20";
+  muc_restore_timeout = "60";
+  networkmanager_support = true;
+  noconfirm_close_muc_rooms = "";
+  notification_avatar_height = "48";
+  notification_avatar_width = "48";
+  notification_position_x = "-1";
+  notification_position_y = "-1";
+  notification_preview_message = true;
+  notification_timeout = "5";
+  notify_on_all_muc_messages = false;
+  notify_on_file_complete = true;
+  notify_on_new_gmail_email = true;
+  notify_on_new_gmail_email_command = "";
+  notify_on_new_gmail_email_extra = false;
+  notify_on_new_message = false;
+  notify_on_signin = false;
+  notify_on_signout = false;
+  one_message_window = "always_with_roster";
+  openwith = "xdg-open";
+  outgoing_chat_state_notifications = "composing_only";
+  outmsgcolor = "#add8e6";
+  outmsgfont = "";
+  outmsgtxtcolor = "";
+  outmsgtxtfont = "";
+  plugins.plugin_installer.active = false;
+  print_ichat_every_foo_minutes = "5";
+  print_status_in_chats = true;
+  print_status_in_muc = "in_and_out";
+  print_time = "always";
+  print_time_fuzzy = "0";
+  quit_on_roster_x_button = true;
+  recently_groupchat = "";
+  remote_control = true;
+  restore_lines = "10";
+  restore_timeout = "60";
+  restored_messages_color = "#555753";
+  restored_messages_small = false;
+  roster_avatar_height = "16";
+  roster_avatar_width = "16";
+  roster_height = "1156";
+  roster_theme = "blue";
+  roster_width = "206";
+  roster_window_skip_taskbar = false;
+  "roster_x-position" = "0";
+  "roster_y-position" = "20";
+  rst_formatting_outgoing_messages = false;
+  "save-roster-position" = true;
+  scroll_roster_to_last_message = true;
+  search_engine = "https://www.google.com/search?&q=%s&sourceid=gajim";
+  send_on_ctrl_enter = false;
+  send_sha_in_gc_presence = true;
+  shell_like_completion = true;
+  show_activity_in_roster = true;
+  show_affiliation_in_groupchat = true;
+  show_ascii_formatting_chars = true;
+  show_avatar_in_chat = true;
+  show_avatars_in_roster = true;
+  show_contacts_number = true;
+  show_location_in_roster = true;
+  show_mood_in_roster = true;
+  show_only_chat_and_online = false;
+  show_roster_on_startup = "always";
+  show_self_contact = "when_other_resource";
+  show_status_msgs_in_roster = true;
+  show_transports_group = true;
+  show_tunes_in_roster = true;
+  show_unread_tab_icon = true;
+  showoffline = false;
+  "single-msg-height" = "280";
+  "single-msg-width" = "400";
+  "single-msg-x-position" = "0";
+  "single-msg-y-position" = "0";
+  sort_by_show_in_muc = false;
+  sort_by_show_in_roster = true;
+  sounddnd = false;
+  soundplayer = "aplay -q";
+  sounds_on = false;
+  speller_language = "de.en";
+  statusmsgcolor = "#4e9a06";
+  statusmsgfont = "";
+  stun_server = "";
+  tabs_always_visible = true;
+  tabs_border = false;
+  tabs_close_button = true;
+  tabs_position = "right";
+  time_stamp = "[%H:%M:%S]";
+  tooltip_account_name_color = "#888A85";
+  tooltip_affiliation_administrator_color = "#F57900";
+  tooltip_affiliation_member_color = "#73D216";
+  tooltip_affiliation_none_color = "#555753";
+  tooltip_affiliation_owner_color = "#CC0000";
+  tooltip_avatar_height = "125";
+  tooltip_avatar_width = "125";
+  tooltip_idle_color = "#888A85";
+  tooltip_status_away_color = "#EDD400";
+  tooltip_status_busy_color = "#F57900";
+  tooltip_status_free_for_chat_color = "#3465A4";
+  tooltip_status_na_color = "#CC0000";
+  tooltip_status_offline_color = "#555753";
+  tooltip_status_online_color = "#73D216";
+  trayicon = "never";
+  trayicon_notification_on_events = true;
+  treat_incoming_messages = "";
+  uri_schemes = "aaa:// aaas:// acap:// cap:// cid: crid:// data: dav: "
+              + "dict:// dns: fax: file:/ ftp:// geo: go: gopher:// h323: "
+              + "http:// https:// iax: icap:// im: imap:// info: ipp:// iris: "
+              + "iris.beep: iris.xpc: iris.xpcs: iris.lwz: ldap:// mid: "
+              + "modem: msrp:// msrps:// mtqp:// mupdate:// news: nfs:// "
+              + "nntp:// opaquelocktoken: pop:// pres: prospero:// rtsp:// "
+              + "service: shttp:// sip: sips: sms: snmp:// soap.beep:// "
+              + "soap.beeps:// tag: tel: telnet:// tftp:// thismessage:/ "
+              + "tip:// tv: urn:// vemmi:// xmlrpc.beep:// xmlrpc.beeps:// "
+              + "z39.50r:// z39.50s:// about: apt: cvs:// daap:// ed2k:// "
+              + "feed: fish:// git:// iax2: irc:// ircs:// ldaps:// magnet: "
+              + "mms:// rsync:// ssh:// svn:// sftp:// smb:// webcal://";
+  urlmsgcolor = "#add8e6";
+  use_gnomekeyring = true;
+  use_gpg_agent = true;
+  use_kib_mib = false;
+  use_kwalletcli = true;
+  use_latex = false;
+  use_notif_daemon = true;
+  use_smooth_scrolling = true;
+  use_speller = true;
+  use_stun_server = false;
+  use_transports_iconsets = true;
+  use_urgency_hint = true;
+  vcard_avatar_height = "200";
+  vcard_avatar_width = "200";
+  verbose = false;
+  version = "0.15.4";
+  video_framerate = "";
+  video_input_device = "v4l2src device=/dev/video0";
+  video_output_device = "ximagesink";
+  video_size = "";
+
+  accounts = {
+    Local = {
+      action_when_plaintext_connection = "warn";
+      active = true;
+      adjust_priority_with_status = true;
+      allow_no_log_for = "";
+      anonymous_auth = false;
+      answer_receipts = true;
+      attached_gpg_keys = "";
+      autoauth = false;
+      autoconnect = true;
+      autoconnect_as = "online";
+      autonegotiate_esessions = true;
+      autopriority_away = "40";
+      autopriority_chat = "50";
+      autopriority_dnd = "20";
+      autopriority_invisible = "10";
+      autopriority_online = "50";
+      autopriority_xa = "30";
+      autoreconnect = true;
+      client_cert = "";
+      client_cert_encrypted = false;
+      connection_types = "tls ssl plain";
+      custom_host = "";
+      custom_port = "5298";
+      dont_ack_subscription = false;
+      enable_esessions = true;
+      enable_message_carbons = false;
+      file_transfer_proxies = "proxy.eu.jabber.org, proxy.jabber.ru, "
+                            + "proxy.jabbim.cz";
+      ft_send_local_ips = true;
+      gpg_sign_presence = true;
+      hostname = "mmrnmhrm";
+      http_auth = "ask";
+      ignore_ssl_errors = "";
+      ignore_unknown_contacts = false;
+      is_zeroconf = true;
+      keep_alive_every_foo_secs = "55";
+      keep_alives_enabled = true;
+      keyid = "";
+      keyname = "";
+      last_archiving_time = "1970-01-01T00:00:00Z";
+      last_status = "online";
+      last_status_msg = "";
+      listen_to_network_manager = true;
+      log_encrypted_sessions = true;
+      minimized_gc = "";
+      "msgwin-height" = "440";
+      "msgwin-width" = "480";
+      "msgwin-x-position" = "-1";
+      "msgwin-y-position" = "-1";
+      name = "aszlig";
+      no_log_for = "";
+      password = "zeroconf";
+      ping_alive_every_foo_secs = "120";
+      ping_alives_enabled = true;
+      priority = "5";
+      proxy = "";
+      publish_location = false;
+      publish_tune = false;
+      request_receipt = true;
+      resource = "gajim";
+      restore_last_status = false;
+      roster_version = "";
+      savepass = false;
+      send_idle_time = true;
+      send_os_info = true;
+      send_time_info = true;
+      ssl_fingerprint_sha1 = "";
+      subscribe_activity = true;
+      subscribe_location = true;
+      subscribe_mood = true;
+      subscribe_nick = true;
+      subscribe_tune = true;
+      subscription_request_msg = "";
+      sync_with_global_status = true;
+      test_ft_proxies_on_startup = true;
+      time_for_ping_alive_answer = "60";
+      try_connecting_for_foo_secs = "60";
+      use_custom_host = false;
+      use_env_http_proxy = false;
+      use_ft_proxies = false;
+      use_srv = true;
+      warn_when_insecure_password = true;
+      warn_when_insecure_ssl_connection = true;
+      zeroconf_email = "";
+      zeroconf_first_name = "";
+      zeroconf_jabber_id = "";
+      zeroconf_last_name = "";
+    };
+
+    "aszlig.net" = {
+      action_when_plaintext_connection = "disconnect";
+      active = true;
+      adjust_priority_with_status = true;
+      allow_no_log_for = "";
+      anonymous_auth = false;
+      answer_receipts = true;
+      autoauth = false;
+      autoconnect = false;
+      autoconnect_as = "online";
+      autonegotiate_esessions = true;
+      autopriority_away = "40";
+      autopriority_chat = "50";
+      autopriority_dnd = "20";
+      autopriority_invisible = "10";
+      autopriority_online = "50";
+      autopriority_xa = "30";
+      autoreconnect = true;
+      client_cert = "";
+      client_cert_encrypted = false;
+      connection_types = "tls ssl plain";
+      custom_host = "aszlig.net";
+      custom_port = "5222";
+      dont_ack_subscription = false;
+      enable_esessions = true;
+      enable_message_carbons = false;
+      file_transfer_proxies = "proxy.headcounter.org";
+      ft_send_local_ips = true;
+      gpg_sign_presence = true;
+      hostname = "aszlig.net";
+      http_auth = "ask";
+      ignore_ssl_errors = "";
+      ignore_unknown_contacts = false;
+      is_zeroconf = false;
+      keep_alive_every_foo_secs = "55";
+      keep_alives_enabled = true;
+      keyid = "8C2DC961";
+      keyname = ''aszlig <"^[0-9]+$"@regexmail.net>'';
+      last_archiving_time = "1970-01-01T00:00:00Z";
+      last_status_msg = "";
+      listen_to_network_manager = true;
+      log_encrypted_sessions = true;
+      minimized_gc = "";
+      "msgwin-height" = "440";
+      "msgwin-width" = "480";
+      "msgwin-x-position" = "-1";
+      "msgwin-y-position" = "-1";
+      name = "aszlig";
+      no_log_for = "";
+      ping_alive_every_foo_secs = "120";
+      ping_alives_enabled = true;
+      priority = "5";
+      proxy = "";
+      publish_location = false;
+      publish_tune = false;
+      request_receipt = true;
+      resource = "redmoon";
+      restore_last_status = false;
+      savepass = true;
+      send_idle_time = true;
+      send_os_info = true;
+      send_time_info = true;
+      ssl_fingerprint_sha1 = "8D:BC:E5:46:AB:B3:53:F7:36:B3:"
+                           + "66:0D:B4:B7:83:32:65:BA:A8:EF";
+      subscribe_activity = true;
+      subscribe_location = true;
+      subscribe_mood = true;
+      subscribe_nick = true;
+      subscribe_tune = true;
+      subscription_request_msg = "";
+      sync_with_global_status = true;
+      test_ft_proxies_on_startup = true;
+      time_for_ping_alive_answer = "60";
+      try_connecting_for_foo_secs = "60";
+      use_custom_host = false;
+      use_env_http_proxy = false;
+      use_ft_proxies = true;
+      use_srv = true;
+      warn_when_insecure_password = true;
+      warn_when_insecure_ssl_connection = true;
+      zeroconf_email = "";
+      zeroconf_first_name = "";
+      zeroconf_jabber_id = "";
+      zeroconf_last_name = "";
+    };
+  };
+
+  defaultstatusmsg = {
+    away = {
+      enabled = false;
+      message = "Be right back.";
+    };
+
+    chat = {
+      enabled = false;
+      message = "I'm free for chat.";
+    };
+
+    dnd = {
+      enabled = false;
+      message = "Do not disturb.";
+    };
+
+    invisible = {
+      enabled = false;
+      message = "Bye!";
+    };
+
+    offline = {
+      enabled = false;
+      message = "Bye!";
+    };
+
+    online = {
+      enabled = false;
+      message = "I'm available.";
+    };
+
+    xa = {
+      enabled = false;
+      message = "I'm not available.";
+    };
+  };
+
+  statusmsg = let
+    defaults = {
+      activity = "";
+      activity_text = "";
+      message = "";
+      mood = "";
+      mood_text = "";
+      subactivity = "";
+    };
+    applyDefaults = const (attrs: defaults // attrs);
+  in mapAttrs applyDefaults {
+    zone.activity = "working";
+    zone.subactivity = "coding";
+    zone.message = "In The Zone[TM]";
+
+    rofa.activity = "working";
+    rofa.activity_text = "Blinded by the lights...";
+    rofa.subactivity = "other";
+    rofa.message = "RoFa";
+
+    kernel.mood = "happy";
+    kernel.message = "Kerneling down for reboot NOW.";
+
+    sleep.activity = "inactive";
+    sleep.subactivity = "sleeping";
+    sleep.mood = "sleepy";
+    sleep.message = "Sleeping the hell out of here...";
+
+    _last_away = {};
+    _last_chat = {};
+    _last_dnd = {};
+    _last_invisible = {};
+    _last_offline = {};
+    _last_online = {};
+    _last_xa = {};
+  };
+
+  soundevents = {
+    contact_connected = {
+      enabled = false;
+      path = "connected.wav";
+    };
+
+    contact_disconnected = {
+      enabled = false;
+      path = "disconnected.wav";
+    };
+
+    first_message_received = {
+      enabled = true;
+      path = "message1.wav";
+    };
+
+    gmail_received = {
+      enabled = false;
+      path = "message1.wav";
+    };
+
+    message_sent = {
+      enabled = false;
+      path = "sent.wav";
+    };
+
+    muc_message_highlight = {
+      enabled = true;
+      path = "gc_message1.wav";
+    };
+
+    muc_message_received = {
+      enabled = false;
+      path = "gc_message2.wav";
+    };
+
+    next_message_received_focused = {
+      enabled = false;
+      path = "message2.wav";
+    };
+
+    next_message_received_unfocused = {
+      enabled = true;
+      path = "message2.wav";
+    };
+  };
+
+  proxies.Tor = {
+    bosh_content = "text/xml; charset=utf-8";
+    bosh_hold = "2";
+    bosh_http_pipelining = false;
+    bosh_uri = "";
+    bosh_useproxy = false;
+    bosh_wait = "30";
+    bosh_wait_for_restart_response = false;
+    host = "localhost";
+    pass = "";
+    port = "9050";
+    type = "socks5";
+    useauth = false;
+    user = "";
+  };
+
+  themes = {
+    blue = {
+      accountbgcolor = "#0c232e";
+      accountfont = "Liberation Mono 8";
+      accountfontattrs = "B";
+      accounttextcolor = "#ffffff";
+      bannerbgcolor = "#0f4864";
+      bannerfont = "Liberation Mono Bold 12";
+      bannerfontattrs = "B";
+      bannertextcolor = "#ffffff";
+      contactbgcolor = "#0c232b";
+      contactfont = "Liberation Mono Bold 8";
+      contactfontattrs = "";
+      contacttextcolor = "#ffffff";
+      groupbgcolor = "#18515f";
+      groupfont = "Liberation Mono Bold 8";
+      groupfontattrs = "I";
+      grouptextcolor = "#ffffff";
+      state_composing_color = "green4";
+      state_gone_color = "grey";
+      state_inactive_color = "grey62";
+      state_muc_directed_msg_color = "red2";
+      state_muc_msg_color = "mediumblue";
+      state_paused_color = "mediumblue";
+    };
+
+    default = {
+      accountbgcolor = "";
+      accountfont = "";
+      accountfontattrs = "B";
+      accounttextcolor = "";
+      bannerbgcolor = "";
+      bannerfont = "";
+      bannerfontattrs = "B";
+      bannertextcolor = "";
+      contactbgcolor = "";
+      contactfont = "";
+      contactfontattrs = "";
+      contacttextcolor = "";
+      groupbgcolor = "";
+      groupfont = "";
+      groupfontattrs = "I";
+      grouptextcolor = "";
+      state_composing_color = "green4";
+      state_gone_color = "grey";
+      state_inactive_color = "grey62";
+      state_muc_directed_msg_color = "red2";
+      state_muc_msg_color = "mediumblue";
+      state_paused_color = "mediumblue";
+    };
+
+    green = {
+      accountbgcolor = "#94aa8c";
+      accountfont = "";
+      accountfontattrs = "B";
+      accounttextcolor = "";
+      bannerbgcolor = "#94aa8c";
+      bannerfont = "";
+      bannerfontattrs = "B";
+      bannertextcolor = "";
+      contactbgcolor = "";
+      contactfont = "";
+      contactfontattrs = "";
+      contacttextcolor = "#000000";
+      groupbgcolor = "#eff3e7";
+      groupfont = "";
+      groupfontattrs = "I";
+      grouptextcolor = "#0000ff";
+      state_composing_color = "green4";
+      state_gone_color = "grey";
+      state_inactive_color = "grey62";
+      state_muc_directed_msg_color = "red2";
+      state_muc_msg_color = "mediumblue";
+      state_paused_color = "mediumblue";
+    };
+
+    grocery = {
+      accountbgcolor = "#6bbe18";
+      accountfont = "";
+      accountfontattrs = "B";
+      accounttextcolor = "";
+      bannerbgcolor = "#108abd";
+      bannerfont = "";
+      bannerfontattrs = "B";
+      bannertextcolor = "";
+      contactbgcolor = "#efb26b";
+      contactfont = "";
+      contactfontattrs = "";
+      contacttextcolor = "#000000";
+      groupbgcolor = "#ceefad";
+      groupfont = "";
+      groupfontattrs = "I";
+      grouptextcolor = "#12125a";
+      state_composing_color = "green4";
+      state_gone_color = "grey";
+      state_inactive_color = "grey62";
+      state_muc_directed_msg_color = "red2";
+      state_muc_msg_color = "mediumblue";
+      state_paused_color = "mediumblue";
+    };
+
+    human = {
+      accountbgcolor = "#996442";
+      accountfont = "";
+      accountfontattrs = "B";
+      accounttextcolor = "";
+      bannerbgcolor = "#996442";
+      bannerfont = "";
+      bannerfontattrs = "B";
+      bannertextcolor = "";
+      contactbgcolor = "";
+      contactfont = "";
+      contactfontattrs = "";
+      contacttextcolor = "#000000";
+      groupbgcolor = "#e3ca94";
+      groupfont = "";
+      groupfontattrs = "I";
+      grouptextcolor = "#ab5920";
+      state_composing_color = "green4";
+      state_gone_color = "grey";
+      state_inactive_color = "grey62";
+      state_muc_directed_msg_color = "red2";
+      state_muc_msg_color = "mediumblue";
+      state_paused_color = "mediumblue";
+    };
+
+    marine = {
+      accountbgcolor = "#918caa";
+      accountfont = "";
+      accountfontattrs = "B";
+      accounttextcolor = "";
+      bannerbgcolor = "#918caa";
+      bannerfont = "";
+      bannerfontattrs = "B";
+      bannertextcolor = "";
+      contactbgcolor = "";
+      contactfont = "";
+      contactfontattrs = "";
+      contacttextcolor = "#000000";
+      groupbgcolor = "#e9e7f3";
+      groupfont = "";
+      groupfontattrs = "I";
+      grouptextcolor = "";
+      state_composing_color = "green4";
+      state_gone_color = "grey";
+      state_inactive_color = "grey62";
+      state_muc_directed_msg_color = "red2";
+      state_muc_msg_color = "mediumblue";
+      state_paused_color = "mediumblue";
+    };
+  };
+}
diff --git a/modules/user/aszlig/programs/gajim/config.patch b/modules/user/aszlig/programs/gajim/config.patch
new file mode 100644
index 00000000..fcfcc371
--- /dev/null
+++ b/modules/user/aszlig/programs/gajim/config.patch
@@ -0,0 +1,80 @@
+diff --git a/src/common/optparser.py b/src/common/optparser.py
+index f84b18a..0078317 100644
+--- a/src/common/optparser.py
++++ b/src/common/optparser.py
+@@ -30,6 +30,7 @@ import os
+ import sys
+ import locale
+ import re
++from itertools import chain
+ from time import time
+ from common import gajim
+ from common import helpers
+@@ -46,19 +47,25 @@ class OptionsParser:
+ 
+     def read(self):
+         try:
+-            fd = open(self.__filename)
++            cfg = nixfd = open("@nix_config@", 'r')
+         except Exception:
+             if os.path.exists(self.__filename):
+                 #we talk about a file
+                 print _('Error: cannot open %s for reading') % self.__filename
+             return False
+ 
++        try:
++            fd = open(self.__filename)
++            cfg = chain(cfg, fd)
++        except Exception:
++            fd = None
++
+         new_version = gajim.config.get('version')
+         new_version = new_version.split('-', 1)[0]
+         seen = set()
+         regex = re.compile(r"(?P<optname>[^.=]+)(?:(?:\.(?P<key>.+))?\.(?P<subname>[^.=]+))?\s=\s(?P<value>.*)")
+ 
+-        for line in fd:
++        for line in cfg:
+             try:
+                 line = line.decode('utf-8')
+             except UnicodeDecodeError:
+@@ -79,10 +86,13 @@ class OptionsParser:
+         self.update_config(old_version, new_version)
+         self.old_values = {} # clean mem
+ 
+-        fd.close()
++        if fd is not None:
++            fd.close()
++
++        nixfd.close()
+         return True
+ 
+-    def write_line(self, fd, opt, parents, value):
++    def write_line(self, (fd, nixcfg), opt, parents, value):
+         if value is None:
+             return
+         value = value[1]
+@@ -102,17 +112,21 @@ class OptionsParser:
+                     p = p.encode('utf-8')
+                 s += p + '.'
+         s += opt
+-        fd.write(s + ' = ' + value + '\n')
++        line = s + ' = ' + value + '\n'
++        if not nixcfg.startswith(line) and not ('\n' + line) in nixcfg:
++            fd.write(line)
+ 
+     def write(self):
+         (base_dir, filename) = os.path.split(self.__filename)
+         self.__tempfile = os.path.join(base_dir, '.' + filename)
++
+         try:
++            nixcfg = open("@nix_config@", 'r').read()
+             f = open(self.__tempfile, 'w')
+         except IOError, e:
+             return str(e)
+         try:
+-            gajim.config.foreach(self.write_line, f)
++            gajim.config.foreach(self.write_line, (f, nixcfg))
+         except IOError, e:
+             return str(e)
+         f.flush()
diff --git a/modules/user/aszlig/programs/gajim/default.nix b/modules/user/aszlig/programs/gajim/default.nix
new file mode 100644
index 00000000..4c8a4304
--- /dev/null
+++ b/modules/user/aszlig/programs/gajim/default.nix
@@ -0,0 +1,59 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+let
+  cfg = config.vuizvui.user.aszlig.programs.gajim;
+
+  gtkTheme = pkgs.writeText "gajim.gtkrc" ''
+    style "default" {
+      fg[NORMAL] = "#d5faff"
+      fg[ACTIVE] = "#fffeff"
+      fg[SELECTED] = "#fffeff"
+      fg[INSENSITIVE] = "#85aaaf"
+      fg[PRELIGHT] = "#d7f2ff"
+
+      text[NORMAL] = "#fffefe"
+      text[ACTIVE] = "#fffeff"
+      text[SELECTED] = "#fffeff"
+      text[INSENSITIVE] = "#85aaaf"
+      text[PRELIGHT] = "#d7f2ff"
+
+      bg[NORMAL] = "#0f4866"
+      bg[ACTIVE] = "#0c232e"
+      bg[SELECTED] = "#005a56"
+      bg[INSENSITIVE] = "#103040"
+      bg[PRELIGHT] = "#1d5875"
+
+      base[NORMAL] = "#0c232e"
+      base[ACTIVE] = "#0f4864"
+      base[SELECTED] = "#005a56"
+      base[INSENSITIVE] = "#103040"
+      base[PRELIGHT] = "#1d5875"
+    }
+
+    class "GtkWidget" style "default"
+
+    gtk-enable-animations = 0
+  '';
+
+  gajimPatched = overrideDerivation pkgs.gajim (o: {
+    patches = (o.patches or []) ++ singleton (pkgs.substituteAll {
+      src = ./config.patch;
+      nix_config = pkgs.writeText "gajim.config" (import ./config.nix lib);
+    });
+    postPatch = (o.postPatch or "") + ''
+      sed -i -e '/^export/i export GTK2_RC_FILES="${gtkTheme}"' \
+        scripts/gajim.in
+    '';
+  });
+
+in {
+  options.vuizvui.user.aszlig.programs.gajim = {
+    enable = mkEnableOption "aszlig's Gajim";
+  };
+
+  config = mkIf cfg.enable {
+    environment.systemPackages = [ gajimPatched ];
+  };
+}
diff --git a/modules/user/aszlig/programs/git/default.nix b/modules/user/aszlig/programs/git/default.nix
new file mode 100644
index 00000000..0090b617
--- /dev/null
+++ b/modules/user/aszlig/programs/git/default.nix
@@ -0,0 +1,74 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+  cfg = config.vuizvui.user.aszlig.programs.git;
+
+  genConf = attrs: let
+    escStr = s: "\"${escape [ "\"" "\\" ] s}\"";
+    mkVal = v: if isBool v && v  then "true"
+          else if isBool v && !v then "false"
+          else escStr (toString v);
+    mkLine = key: val: "${key} = ${mkVal val}";
+
+    filterNull = filterAttrs (_: v: !(isNull v));
+
+    mkSection = sect: subsect: vals: ''
+      [${sect}${optionalString (subsect != null) " ${escStr subsect}"}]
+      ${concatStringsSep "\n" (mapAttrsToList mkLine (filterNull vals))}
+    '';
+
+    mkConf = sect: content: let
+      subs = filterAttrs (_: isAttrs) content;
+      nonSubs = filterAttrs (_: s: !isAttrs s) content;
+      hasPlain = (attrNames nonSubs) != [];
+      plainSects = singleton (mkSection sect null nonSubs);
+    in mapAttrsToList (mkSection sect) subs ++ optional hasPlain plainSects;
+
+    text = concatStringsSep "\n" (flatten (mapAttrsToList mkConf attrs));
+  in pkgs.writeText "gitconfig" text;
+
+  gitPatched = overrideDerivation pkgs.gitFull (git: {
+    makeFlags = let
+      oldFlags = git.makeFlags or [];
+      newVal = "ETC_GITCONFIG=${cfg.config}";
+    in if isList oldFlags
+       then oldFlags ++ [ newVal ]
+       else "${oldFlags} ${newVal}";
+  });
+in {
+  options.vuizvui.user.aszlig.programs.git = {
+    enable = mkEnableOption "Git";
+
+    config = mkOption {
+      description = "System-wide default config for Git";
+
+      type = let
+        superType = types.attrsOf types.unspecified;
+      in mkOptionType {
+        name = "attribute set of either plain values or "
+             + "attribute sets of values (if it is a subsection)";
+        inherit (superType) check merge;
+        inherit (superType) getSubOptions getSubModules substSubModules;
+      };
+
+      default = {};
+      example = {
+        color.ui = "auto";
+        merge.tool = "vimdiff";
+        guitool.foobar.noconsole = true;
+      };
+
+      apply = genConf;
+    };
+  };
+
+  config = mkIf cfg.enable {
+    environment.systemPackages = [
+      gitPatched
+      pkgs.gitAndTools.git-remote-hg
+      pkgs.gitAndTools.hub
+    ];
+  };
+}
diff --git a/modules/user/aszlig/programs/mpv/default.nix b/modules/user/aszlig/programs/mpv/default.nix
new file mode 100644
index 00000000..1e412c71
--- /dev/null
+++ b/modules/user/aszlig/programs/mpv/default.nix
@@ -0,0 +1,24 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+let
+  cfg = config.vuizvui.user.aszlig.programs.mpv;
+
+  patchedMpv = overrideDerivation pkgs.mpv (o: {
+    installPhase = o.installPhase + ''
+      cat > "$out/etc/mpv/mpv.conf" <<CONFIG
+      ao=pulse
+      CONFIG
+    '';
+  });
+
+in {
+  options.vuizvui.user.aszlig.programs.mpv = {
+    enable = mkEnableOption "aszlig's MPV";
+  };
+
+  config = mkIf cfg.enable {
+    environment.systemPackages = [ patchedMpv ];
+  };
+}
diff --git a/modules/user/aszlig/programs/taalo-build/default.nix b/modules/user/aszlig/programs/taalo-build/default.nix
new file mode 100644
index 00000000..6b50df1d
--- /dev/null
+++ b/modules/user/aszlig/programs/taalo-build/default.nix
@@ -0,0 +1,65 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+{
+  options.vuizvui.user.aszlig.programs.taalo-build = {
+    enable = mkEnableOption "aszlig's build helper for remote builds";
+  };
+  config = mkIf config.vuizvui.user.aszlig.programs.taalo-build.enable {
+    environment.systemPackages = singleton (pkgs.writeScriptBin "taalo-build" ''
+      #!${pkgs.perl}/bin/perl -I${pkgs.nix}/lib/perl5/site_perl
+      use strict;
+      use Nix::CopyClosure;
+      use Nix::SSH;
+      use IPC::Open2;
+
+      binmode STDERR, ":encoding(utf8)";
+
+      open my $instantiate, "-|", "nix-instantiate", @ARGV
+        or die "Failed to run nix-instantiate";
+      my $to_realize = join "", <$instantiate>;
+      close $instantiate or exit $? >> 8;
+
+      chomp $to_realize;
+
+      my ($from, $to);
+      my $dest = 'nix-remote-build@taalo.headcounter.org';
+      my $cmd = "exec ssh $dest -C -- nix-store --serve --write";
+      my $pid = open2($from, $to, $cmd);
+
+      # Do the handshake.
+      my $magic;
+      eval {
+          my $SERVE_MAGIC_1 = 0x390c9deb; # FIXME
+          my $clientVersion = 0x200;
+          syswrite($to, pack("L<x4L<x4", $SERVE_MAGIC_1, $clientVersion))
+            or die;
+          $magic = readInt($from);
+      };
+
+      die "unable to connect to taalo\n" if $@;
+      die "did not get valid handshake from taalo\n" if $magic != 0x5452eecb;
+
+      my $serverVersion = readInt($from);
+      die "unsupported server version\n"
+        if $serverVersion < 0x200 || $serverVersion >= 0x300;
+
+      Nix::CopyClosure::copyToOpen(
+        $from, $to, "taalo", [$to_realize], 0, 0, 0, 1
+      );
+
+      writeInt(6, $to) or die;
+      writeStrings([$to_realize], $to);
+      writeInt(0, $to);
+      writeInt(0, $to);
+
+      my $res = readInt($from);
+
+      close $to;
+
+      waitpid($pid, 0);
+      exit $res;
+    '');
+  };
+}
diff --git a/modules/user/aszlig/programs/taskwarrior/config.patch b/modules/user/aszlig/programs/taskwarrior/config.patch
new file mode 100644
index 00000000..4ee4c4ce
--- /dev/null
+++ b/modules/user/aszlig/programs/taskwarrior/config.patch
@@ -0,0 +1,48 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 5558f6b..c8956f8 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -91,6 +91,9 @@ SET (TASK_DOCDIR  share/doc/task CACHE STRING "Installation directory for doc fi
+ SET (TASK_RCDIR "${TASK_DOCDIR}/rc" CACHE STRING "Installation directory for configuration files")
+ SET (TASK_BINDIR  bin            CACHE STRING "Installation directory for the binary")
+ 
++SET (SYSTEM_TASKRC "${CMAKE_INSTALL_PREFIX}/etc/taskrc"
++     CACHE STRING "System-wide taskrc")
++
+ message ("-- Looking for SHA1 references")
+ if (EXISTS ${CMAKE_SOURCE_DIR}/.git/index)
+   set (HAVE_COMMIT true)
+diff --git a/cmake.h.in b/cmake.h.in
+index 0041e6e..f8c1a0e 100644
+--- a/cmake.h.in
++++ b/cmake.h.in
+@@ -16,6 +16,7 @@
+ 
+ /* Installation details */
+ #define TASK_RCDIR "${CMAKE_INSTALL_PREFIX}/${TASK_RCDIR}"
++#define SYSTEM_TASKRC "${SYSTEM_TASKRC}"
+ 
+ /* Localization */
+ #define PACKAGE_LANGUAGE ${PACKAGE_LANGUAGE}
+diff --git a/src/Context.cpp b/src/Context.cpp
+index 8aae74e..ffa5557 100644
+--- a/src/Context.cpp
++++ b/src/Context.cpp
+@@ -121,7 +121,8 @@ int Context::initialize (int argc, const char** argv)
+     }
+ 
+     config.clear ();
+-    config.load (rc_file);
++    config.load (SYSTEM_TASKRC);
++    config.load (rc_file, 2);
+     CLI2::applyOverrides (argc, argv);
+ 
+     ////////////////////////////////////////////////////////////////////////////
+@@ -146,7 +147,6 @@ int Context::initialize (int argc, const char** argv)
+     }
+ 
+     tdb2.set_location (data_dir);
+-    createDefaultConfig ();
+ 
+     ////////////////////////////////////////////////////////////////////////////
+     //
diff --git a/modules/user/aszlig/programs/taskwarrior/default.nix b/modules/user/aszlig/programs/taskwarrior/default.nix
new file mode 100644
index 00000000..99d428de
--- /dev/null
+++ b/modules/user/aszlig/programs/taskwarrior/default.nix
@@ -0,0 +1,36 @@
+{ config, pkgs, lib, ... }:
+
+let
+  cfg = config.vuizvui.user.aszlig.programs.taskwarrior;
+
+  taskrc = pkgs.writeText "taskrc.in" ''
+    data.location=~/.task
+    include @out@/share/doc/task/rc/dark-yellow-green.theme
+
+    color=on
+    dateformat=Y-m-d
+    dateformat.annotation=Y-m-d
+    dateformat.edit=Y-m-d H:N:S
+    dateformat.holiday=YMD
+    dateformat.info=Y-m-d H:N:S
+    dateformat.report=Y-m-d
+    weekstart=Monday
+  '';
+
+  taskwarrior = pkgs.taskwarrior.overrideDerivation (t: {
+    patches = (t.patches or []) ++ [ ./config.patch ];
+    postInstall = (t.postInstall or "") + ''
+      mkdir -p "$out/etc"
+      substituteAll "${taskrc}" "$out/etc/taskrc"
+    '';
+  });
+
+in {
+  options.vuizvui.user.aszlig.programs.taskwarrior = {
+    enable = lib.mkEnableOption "aszlig's TaskWarrior";
+  };
+
+  config = lib.mkIf cfg.enable {
+    environment.systemPackages = lib.singleton taskwarrior;
+  };
+}
diff --git a/modules/user/aszlig/programs/vim/default.nix b/modules/user/aszlig/programs/vim/default.nix
new file mode 100644
index 00000000..cb6149fe
--- /dev/null
+++ b/modules/user/aszlig/programs/vim/default.nix
@@ -0,0 +1,384 @@
+{ config, pkgs, lib, ... }:
+
+let
+  cfg = config.vuizvui.user.aszlig.programs.vim;
+
+  fetchVimScript = { srcId, sha256, type, name }: let
+    baseUrl = "http://www.vim.org/scripts/download_script.php";
+    src = pkgs.fetchurl {
+      name = "script${toString srcId}.vim";
+      url = "${baseUrl}?src_id=${toString srcId}";
+      inherit sha256;
+    };
+  in pkgs.stdenv.mkDerivation {
+    name = "vim-${type}-${toString srcId}";
+    buildCommand = ''
+      install -vD -m 0644 "${src}" "$out/${type}/${name}.vim"
+    '';
+  };
+
+  extractSubdir = subdir: src: pkgs.stdenv.mkDerivation {
+    name = "${src.name}-subdir";
+    phases = [ "unpackPhase" "installPhase" ];
+    inherit src;
+    installPhase = ''
+      cp -Rd "${subdir}" "$out"
+    '';
+  };
+
+  mkVimPlugins = plugins: pkgs.buildEnv {
+    name = "vim-plugins";
+    paths = with lib; mapAttrsToList (const id) plugins;
+    ignoreCollisions = true;
+    postBuild = ''
+      find -L "$out" -mindepth 1 -maxdepth 1 -type f -delete
+    '';
+  };
+
+  pluginDeps = {
+    vimAddonMwUtils = pkgs.fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-mw-utils";
+      rev = "0c5612fa31ee434ba055e21c76f456244b3b5109";
+      sha256 = "147s1k4n45d3x281vj35l26sv4waxjlpqdn83z3k9n51556h1d45";
+    };
+
+    vimAddonCompletion = pkgs.fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-completion";
+      rev = "80f717d68df5b0d7b32228229ddfd29c3e86e435";
+      sha256 = "08acffzy847w8b5j8pdw6qsidm2859ki5q351n4r7fkr969p80mi";
+    };
+
+    vimAddonActions = pkgs.fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-actions";
+      rev = "a5d20500fb8812958540cf17862bd73e7af64936";
+      sha256 = "1wfkwr89sn2w97i94d0dqylcg9mr6pirjadi0a4l492nfnsh99bc";
+    };
+
+    vimAddonBackgroundCmd = pkgs.fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-background-cmd";
+      rev = "14df72660a95804a57c02b9ff0ae3198608e2491";
+      sha256 = "09lh6hqbx05gm7njhpqvhqdwig3pianq9rddxmjsr6b1vylgdgg4";
+    };
+
+    vimAddonErrorFormats = pkgs.fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-errorformats";
+      rev = "dcbb203ad5f56e47e75fdee35bc92e2ba69e1d28";
+      sha256 = "159zqm69fxbxcv3b2y99g57bf20qrzsijcvb5rzy2njxah3049m1";
+    };
+
+    vimAddonToggleBuffer = pkgs.fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-toggle-buffer";
+      rev = "a1b38b9c5709cba666ed2d84ef06548f675c6b0b";
+      sha256 = "1xq38kfdm36c34ln66znw841q797w5gm8bpq1x64bsf2h6n3ml03";
+    };
+
+    vimAddonGotoThingAtCursor = pkgs.fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-goto-thing-at-cursor";
+      rev = "f052e094bdb351829bf72ae3435af9042e09a6e4";
+      sha256 = "1ksm2b0j80zn8sz2y227bpcx4jsv76lwgr2gpgy2drlyqhn2vlv0";
+    };
+
+    vimAddonViews = pkgs.fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-views";
+      rev = "d1383ad56d0a07d7350880adbadf9de501729fa8";
+      sha256 = "09gqh7w5rk4lmra706schqaj8dnisf396lpsipm7xv6gy1qbslnv";
+    };
+
+    vimAddonSwfMill = pkgs.fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-swfmill";
+      rev = "726777e02cbe3ad8f82e37421fb37674f446a148";
+      sha256 = "0ablzl5clgfzhzwvzzbaj0cda0b4cyrj3pbv02f26hx7rfnssaqm";
+    };
+
+    vimHaxeSyntax = pkgs.fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-haxe-syntax";
+      rev = "500acc2f2ab92d77ff6cd04fdc7868800c033dfa";
+      sha256 = "1ipm0igplplfmscm3bk95qpf9rw71h133l9shmw54mxr4h0ymnmj";
+    };
+
+    tlib = pkgs.fetchFromGitHub {
+      owner = "tomtom";
+      repo = "tlib_vim";
+      rev = "bc4097bd38c4bc040fe1e74df68dec6c9adfcb6a";
+      sha256 = "19v7bgmkk4k2g1z62bd0kky29xxfq96l7wfrl27wb2zijlhbrnpz";
+    };
+
+    vamStub = pkgs.writeTextFile {
+      name = "vam-stub";
+      destination = "/autoload/vam.vim";
+      text = ''
+        fun! vam#DefineAndBind(local, global, default)
+          return ' if !exists('.string(a:global).') |
+                 \ let '.a:global.' = '.a:default.' |
+                 \ endif | let '.a:local.' = '.a:global
+        endfun
+      '';
+    };
+  };
+
+  plugins = mkVimPlugins (pluginDeps // {
+    vimErl = pkgs.fetchFromGitHub {
+      owner = "jimenezrick";
+      repo = "vimerl";
+      rev = "823bf8cb515bb10396c705cdc017aa9121cc4d12";
+      sha256 = "0sybkx8iy8qhr6nlwn52j7zd5v99rn0b8wbg43d112z2px4yq5x3";
+    };
+
+    vimHaxe = pkgs.fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-haxe";
+      rev = "8efc705db41a01713d67d437f29866a1ff831e8a";
+      sha256 = "15kv13gvpgf23p0566qrlw7gmpir2z7g5dnkfs1knmcwzw45am5d";
+    };
+
+    factor = extractSubdir "misc/vim" (pkgs.fetchFromGitHub {
+      owner = "slavapestov";
+      repo = "factor";
+      rev = "0d6f70cc7cf35cc627ee78886e2932091a651fe6";
+      sha256 = "0lmqzvrmwgmxpcpwgn59y033sf4jybmw3lffbjwww5d7ch90333q";
+    });
+
+    opaLang = extractSubdir "tools/editors/vim" (pkgs.fetchFromGitHub {
+      owner = "MLstate";
+      repo = "opalang";
+      rev = "94e4e6d9d8da9a72214f4f28dd1ffa1a987997eb";
+      sha256 = "0d6b67868cfqakkz63y5ynpz549lbpfzc3c3x7kx3ffsv10xy3bb";
+    });
+
+    lslvim = pkgs.fetchFromGitHub {
+      owner = "sukima";
+      repo = "LSLvim";
+      rev = "f269de39a1c713a43470e90d0ec78208c0f05e0b";
+      sha256 = "1plwx5id3jsj4y6yhshlf3rishxhf1b9k47g2cpzaczvqb5bl40w";
+    };
+
+    vimSyntaxShakespeare = pkgs.fetchFromGitHub {
+      owner = "pbrisbin";
+      repo = "vim-syntax-shakespeare";
+      rev = "29085ae94ee3dbd7f39f2a7705d86692ef5bc365";
+      sha256 = "0kvys81jiwqzwmpbk1lvbciw28yha4shd1xby5saiy4b68l6d8rk";
+    };
+
+    glsl = fetchVimScript {
+      name = "glsl";
+      srcId = 3194;
+      sha256 = "1vqfcpjmfyjc95wns3i84kgd1k5r2lwjjvjcprygi9g9vng7i5xc";
+      type = "syntax";
+    };
+
+    actionScript = fetchVimScript {
+      name = "actionscript";
+      srcId = 1205;
+      sha256 = "0pdzqg678lhn7lmqf3z9icpj6ff2nnghsxy983kxkn8sblnzlhfs";
+      type = "syntax";
+    };
+
+    indentPython = fetchVimScript {
+      name = "python";
+      srcId = 4316;
+      sha256 = "1pgdiaqd1hm0qpspy1asj7i103pq0846lnjrxvl6pk17ymww9pmk";
+      type = "indent";
+    };
+
+    nixAddon = pkgs.stdenv.mkDerivation {
+      name = "vim-nix-support";
+
+      lnl7 = pkgs.fetchFromGitHub {
+        owner = "LnL7";
+        repo = "vim-nix";
+        rev = "f0b7bd4bce5ed0f12fb4d26115c84fb3edcd1e12";
+        sha256 = "0x12a191xafn7918xa8r4sjiw79005lcr0yv5kjc4p1izwddfgdv";
+      };
+
+      src = pkgs.fetchFromGitHub {
+        owner = "MarcWeber";
+        repo = "vim-addon-nix";
+        rev = "2aed79ba5d8c5e6abd102de77e55e242f61b17f1";
+        sha256 = "0zx1q9994py6jmm0qbbx6fc1dy5la8zfskkbvqqxssxrl5dx7vvi";
+      };
+
+      phases = [ "unpackPhase" "patchPhase" "installPhase" ];
+      patchPhase = ''
+        for what in indent syntax; do
+          install -vD -m 0644 "$lnl7/$what/nix.vim" "$what/nix.vim"
+        done
+        sed -i -re '/^ *au(group)? /,/^ *au(group)? +end/ {
+          s/^ *au(tocmd)? +((BufRead|BufNewFile),?)+ +[^ ]+ +setl(ocal)?/${
+            "& sw=2 sts=2 et iskeyword+=-"
+          }/
+        }' plugin/vim-addon-nix.vim
+        grep '^setlocal' "$lnl7/ftplugin/nix.vim" >> ftplugin/nix.vim
+      '';
+
+      installPhase = ''
+        cp -Rd . "$out"
+      '';
+    };
+
+    urwebAddon = pkgs.fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-urweb";
+      rev = "49ea3960a9924a5dd7ff70956d1a7c0479a55773";
+      sha256 = "090ww8nxqsabrwf4r8g7a93kawnp6zwpsx65yxpacwwwlbc73m7s";
+    };
+
+    indentHaskell = fetchVimScript {
+      name = "haskell";
+      srcId = 7407;
+      sha256 = "1lj44jkyihmcnj2kcfckhqzr9gfipda9frbzicix2wrc5728kjsv";
+      type = "indent";
+    };
+
+    fishSyntax = fetchVimScript {
+      name = "fish";
+      srcId = 20242;
+      sha256 = "12gfmyxxf84f19bp8xfmkb9phbfkifn89sjgi8hnv6dn0a5y1zpj";
+      type = "syntax";
+    };
+
+    elmVim = pkgs.fetchFromGitHub {
+      owner = "lambdatoast";
+      repo = "elm.vim";
+      rev = "ad556c97e26072b065825852ceead0fe6a1f7d7c";
+      sha256 = "19k6b6m5ngm5qn2f3p13hzjyvha53fpdgq691z8n0lwfn8831b21";
+    };
+
+    flake8 = pkgs.fetchFromGitHub {
+      owner = "nvie";
+      repo = "vim-flake8";
+      rev = "293613dbe731a2875ce93739e7b64ee504d8bbab";
+      sha256 = "0xmqmbh66g44vhx9769mzs820k6ksbpfnsfvivmbhzlps2hjqpqg";
+    };
+
+    vader = pkgs.fetchFromGitHub {
+      owner = "junegunn";
+      repo = "vader.vim";
+      rev = "ad2c752435baba9e7544d0046f0277c3573439bd";
+      sha256 = "0yvnah4lxk5w5qidc3y5nvl6lpi8rcv26907b3w7vjskqc935b8f";
+    };
+  });
+
+  generic = ''
+    syntax on
+    colorscheme elflord
+
+    " boolean
+    set nocompatible
+    set showcmd
+    set showmatch
+    set ignorecase
+    set smartcase
+    set incsearch
+    set modeline
+    set smarttab
+    set expandtab
+    set smartindent
+    set ruler
+
+    " non-boolean
+    set tabstop=4
+    set softtabstop=4
+    set shiftwidth=4
+    set textwidth=80
+    set termencoding=ascii
+    set backspace=indent,eol,start
+    set background=dark
+  '';
+
+  plugin = ''
+    " erlang
+    let erlang_folding = 0
+    let erlang_highlight_bif = 1
+    let erlang_force_use_vimerl_indent = 1
+
+    " python
+    let python_highlight_numbers = 1
+    let python_highlight_builtins = 1
+    let python_highlight_exceptions = 1
+    let g:flake8_cmd = '${pkgs.pythonPackages.flake8}/bin/flake8'
+
+    " all plugins
+    set runtimepath^=${plugins}
+    set runtimepath+=${plugins}/after
+    runtime! ftdetect/*.vim
+  '';
+
+  autocmd = ''
+    " jump to last position
+    au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") |
+                   \ exe "normal! g'\"zz" | endif
+
+    " filetype defaults
+    filetype plugin indent on
+    au BufNewFile,BufRead *.as set filetype=actionscript
+    au BufNewFile,BufRead *.html set tabstop=4|set shiftwidth=4|set expandtab
+    au FileType python set textwidth=79
+    au FileType gitcommit set textwidth=72
+    au FileType docbk set tabstop=2 shiftwidth=2 expandtab
+
+    " highlight unnecessary whitespace
+    highlight ExtraWhitespace ctermbg=red guibg=red
+    match ExtraWhitespace /\s\+$/
+    au BufWinEnter,InsertLeave * match ExtraWhitespace /\s\+$/
+    au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
+    " prevent colorscheme from overriding these highlights
+    au ColorScheme * highlight ExtraWhitespace ctermbg=red guibg=red
+
+    " highlight everything exceeding 80 characters
+    au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
+  '';
+
+  misc = ''
+    " ASCII art mode
+    fun! AAMode()
+      highlight clear ExtraWhitespace
+      for m in getmatches()
+        if m.group == 'ErrorMsg' && m.pattern == '\%>80v.\+'
+          call matchdelete(m.id)
+        endif
+      endfor
+    endfun
+
+    command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
+      \ | wincmd p | diffthis
+
+    " flake everything that has been *detected* as python (not just by suffix).
+    autocmd BufWritePost * if &ft ==# 'python' | call Flake8() | endif
+  '';
+
+  vimrc = pkgs.writeText "vimrc" ''
+    ${generic}
+    ${plugin}
+
+    if has("autocmd")
+      ${autocmd}
+    endif
+
+    ${misc}
+  '';
+
+  patchedVim = lib.overrideDerivation pkgs.vim_configurable (o: {
+    postInstall = (o.postInstall or "") + ''
+      ln -sf "${vimrc}" "$out/share/vim/vimrc"
+    '';
+  });
+
+in {
+  options.vuizvui.user.aszlig.programs.vim = {
+    enable = lib.mkEnableOption "aszlig's Vim";
+  };
+
+  config = lib.mkIf cfg.enable {
+    environment.systemPackages = lib.singleton patchedVim;
+  };
+}
diff --git a/modules/user/aszlig/programs/xpdf/default.nix b/modules/user/aszlig/programs/xpdf/default.nix
new file mode 100644
index 00000000..e7edd806
--- /dev/null
+++ b/modules/user/aszlig/programs/xpdf/default.nix
@@ -0,0 +1,20 @@
+{ config, pkgs, lib, ... }:
+
+let
+  cfg = config.vuizvui.user.aszlig.programs.xpdf;
+
+  xpdf = pkgs.xpdf.overrideDerivation (drv: {
+    postInstall = (drv.postInstall or "") + ''
+      echo 'bind ctrl-o any toggleOutline' >> "$out/etc/xpdfrc"
+    '';
+  });
+
+in {
+  options.vuizvui.user.aszlig.programs.xpdf = {
+    enable = lib.mkEnableOption "aszlig's xpdf";
+  };
+
+  config = lib.mkIf cfg.enable {
+    environment.systemPackages = lib.singleton xpdf;
+  };
+}
diff --git a/modules/user/aszlig/programs/zsh/default.nix b/modules/user/aszlig/programs/zsh/default.nix
new file mode 100644
index 00000000..119b6aa9
--- /dev/null
+++ b/modules/user/aszlig/programs/zsh/default.nix
@@ -0,0 +1,117 @@
+{ config, lib, ... }:
+
+with lib;
+
+let
+  cfg = config.vuizvui.user.aszlig.programs.zsh;
+
+in {
+  options.vuizvui.user.aszlig.programs.zsh = {
+    enable = mkEnableOption "zsh";
+  };
+
+  config = mkIf cfg.enable {
+    environment.shellInit = ''
+      export EDITOR="vim"
+      export EMAIL="aszlig@redmoonstudios.org"
+    '';
+
+    nixpkgs.config.packageOverrides = pkgs: {
+      zsh = overrideDerivation pkgs.zsh (o: {
+        postConfigure = (o.postConfigure or "") + ''
+          sed -i -e '/^name=zsh\/newuser/d' config.modules
+        '';
+      });
+    };
+
+    programs.zsh.enable = true;
+
+    programs.zsh.shellAliases.t = "task";
+
+    programs.zsh.interactiveShellInit = mkAfter ''
+      export HISTFILE=~/.histfile
+      export HISTSIZE=100000
+      export SAVEHIST=100000
+
+      unsetopt SHARE_HISTORY
+
+      setopt extendedglob
+      setopt extendedhistory
+      setopt globcomplete
+      setopt histnostore
+      setopt histreduceblanks
+      setopt correct
+      setopt dvorak
+      setopt interactivecomments
+      setopt autopushd
+      setopt autocd
+      setopt beep
+
+      bindkey -v
+      if [[ "$TERM" = xterm ]]; then
+        bindkey -v '\e[H' vi-beginning-of-line
+        bindkey -v '\e[F' vi-end-of-line
+
+        function set-title() {
+          echo -en "\e]2;$2\a"
+        }
+
+        function reset-title() {
+          echo -en "\e]2;''${(%):-%~}\a\a"
+        }
+
+        autoload -Uz add-zsh-hook
+        add-zsh-hook preexec set-title
+        add-zsh-hook precmd reset-title
+      else
+        bindkey -v '\e[1~' vi-beginning-of-line
+        bindkey -v '\e[4~' vi-end-of-line
+      fi
+
+      bindkey -a '/' history-incremental-pattern-search-backward
+      bindkey -a '?' history-incremental-pattern-search-forward
+      bindkey '\e[A' up-line-or-history
+      bindkey '\e[B' down-line-or-history
+
+      zstyle ':completion:*' completer _expand _complete _ignored _approximate
+      zstyle ':completion:*' expand prefix suffix
+      zstyle ':completion:*' group-name '''
+      zstyle ':completion:*' insert-unambiguous true
+      zstyle ':completion:*' list-colors '''
+      zstyle ':completion:*' list-prompt \
+        %SAt %p: Hit TAB for more, or the character to insert%s
+      zstyle ':completion:*' list-suffixes true
+      zstyle ':completion:*' matcher-list ''' \
+        'm:{[:lower:]}={[:upper:]}' \
+        'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' \
+        'l:|=* r:|=*' \
+        'r:|[._-]=** r:|=**'
+      zstyle ':completion:*' max-errors 2 numeric
+      zstyle ':completion:*' menu select=long
+      zstyle ':completion:*' original true
+      zstyle ':completion:*' preserve-prefix '//[^/]##/'
+      zstyle ':completion:*' prompt \
+        'Hm, did you mistype something? There are %e errors in the completion.'
+      zstyle ':completion:*' select-prompt \
+        %SScrolling active: current selection at %p%s
+      zstyle ':completion:*' use-compctl false
+      zstyle ':completion:*' verbose true
+
+      autoload -Uz compinit
+      compinit
+
+      autoload -Uz zmv
+    '';
+
+    programs.zsh.promptInit = ''
+      autoload -Uz prompt_special_chars
+
+      () {
+          local p_machine='%(!..%B%F{red}%n%b%F{blue}@)%b%F{red}%m'
+          local p_path='%B%F{blue}[%F{cyan}%~%B%F{blue}]'
+          local p_exitcode='%F{green}%?%(!.%F{cyan}>.%b%F{green}>)%b%f '
+          PROMPT="$p_machine$p_path$p_exitcode"
+      }
+    '';
+  };
+}
diff --git a/modules/user/aszlig/services/i3/conky.nix b/modules/user/aszlig/services/i3/conky.nix
new file mode 100644
index 00000000..76c61160
--- /dev/null
+++ b/modules/user/aszlig/services/i3/conky.nix
@@ -0,0 +1,121 @@
+{ pkgs ? import (import ../../../../../nixpkgs-path.nix) {}
+, lib ? import "${import ../../../../../nixpkgs-path.nix}/lib"
+, timeout ? 300
+}:
+
+with lib;
+
+let
+  baseConfig = pkgs.writeText "conkyrc" ''
+    conky.config = {
+      cpu_avg_samples = 2,
+      net_avg_samples = 2,
+      no_buffers = true,
+      out_to_console = true,
+      out_to_ncurses = false,
+      out_to_stderr = false,
+      out_to_x = false,
+      extra_newline = false,
+      update_interval = 1.0,
+      uppercase = false,
+      use_spacer = 'none',
+      pad_percents = 3,
+      use_spacer = 'left',
+    };
+
+    conky.text = ''';
+  '';
+
+  optexpr = name: expr: "\${${name}_disabled:-\\\${${name} ${expr}\\}}";
+  cexpr = name: args: "${optexpr name (concatStringsSep " " args)}";
+
+  mkNetInfo = iface: let
+    upspeed = cexpr "upspeed" [ iface ];
+    downspeed = cexpr "downspeed" [ iface ];
+  in "${upspeed} ${downspeed}";
+
+  mkDiskFree = path: let
+    used = cexpr "fs_used" [ path ];
+    size = cexpr "fs_size" [ path ];
+  in "${used}/${size}";
+
+  gpuTemp = "${cexpr "hwmon" [ "0" "temp" "1" ]}C";
+
+  weather = (cexpr "weather" [
+    "http://weather.noaa.gov/pub/data/observations/metar/stations/"
+    "EDMA"
+    "temperature"
+  ]) + "C";
+
+  mkConky = args: let
+    time = cexpr "time" [ "%a %b %d %T %Z %Y" ];
+    text = concatStringsSep " | " (args ++ singleton time);
+    conky = pkgs.conky.override {
+      weatherMetarSupport = true;
+    };
+  in pkgs.writeScript "conky-run.sh" ''
+    #!${pkgs.stdenv.shell}
+    PATH="${pkgs.coreutils}/bin"
+
+    cpuload() {
+      for i in $(seq 1 $(nproc))
+      do
+        [ $i -eq 1 ] || echo -n ' '
+        echo -n "\''${cpu cpu$i}%"
+      done
+    }
+
+    cputemp_collect() {
+      for i in /sys/bus/platform/devices/coretemp.?/hwmon/hwmon?/temp?_input
+      do
+        [ -e "$i" ] || continue
+        echo "$i" | ${pkgs.gnused}/bin/sed -re \
+          's/^.*hwmon([0-9]+)[^0-9]*([0-9]+).*$/''${hwmon \1 temp \2}/'
+      done
+    }
+
+    cputemp() {
+      echo $(cputemp_collect)
+    }
+
+    tries=0
+    while ! raw_netinfo="$(${
+      "${pkgs.iproute}/sbin/ip route get 8.8.8.8 2> /dev/null"
+    })"; do
+      if [ $tries -ge ${toString timeout} ]; then
+        upspeed_disabled=N/A
+        downspeed_disabled=N/A
+        break
+      fi
+      echo "Waiting for primary network interface to become available..."
+      tries=$(($tries + 1))
+      sleep 1
+    done
+
+    primary_netdev="$(echo "$raw_netinfo" | \
+      ${pkgs.gnused}/bin/sed -nre 's/^.*dev *([^ ]+).*$/\1/p')"
+
+    ${conky}/bin/conky -c "${baseConfig}" -t "${text}"
+  '';
+
+in {
+  left = mkConky [
+    "CPU: $(cpuload) - ${cexpr "cpu" [ "cpu0" ]}%"
+    "MEM: \\$mem/\\$memmax - \\$memperc%"
+    "SWAP: \\$swap/\\$swapmax \\$swapperc%"
+  ];
+
+  right = mkConky [
+    "NET: ${mkNetInfo "$primary_netdev"}"
+    "DF: ${mkDiskFree "/"}"
+    "LAVG: \\$loadavg"
+    "TEMP - CPU: $(cputemp) - GPU: ${gpuTemp} - OUTSIDE: ${weather}"
+  ];
+
+  single = mkConky [
+    "CPU: $(cpuload) - ${cexpr "cpu" [ "cpu0" ]}%"
+    "MEM: \\$mem/\\$memmax - \\$memperc%"
+    "NET: ${mkNetInfo "$primary_netdev"}"
+    "TEMP - CPU: $(cputemp) - OUTSIDE: ${weather}"
+  ];
+}
diff --git a/modules/user/aszlig/services/i3/default.nix b/modules/user/aszlig/services/i3/default.nix
new file mode 100644
index 00000000..0814ac1e
--- /dev/null
+++ b/modules/user/aszlig/services/i3/default.nix
@@ -0,0 +1,136 @@
+{ pkgs, lib, config, ... }:
+
+with lib;
+
+let
+  cfg = config.vuizvui.user.aszlig.services.i3;
+  inherit (config.services.xserver) xrandrHeads;
+
+  # The symbols if you press shift and a number key.
+  wsNumberSymbols = [
+    "exclam" "at" "numbersign" "dollar" "percent"
+    "asciicircum" "ampersand" "asterisk" "parenleft" "parenright"
+  ];
+
+  wsCount = length wsNumberSymbols;
+
+  headCount = length xrandrHeads;
+  wsPerHead = wsCount / headCount;
+  excessWs = wsCount - (headCount * wsPerHead);
+  headModifier = if cfg.reverseHeads then reverseList else id;
+  getHeadAt = elemAt (headModifier xrandrHeads);
+
+  mkSwitchTo = number: "$mod+${if number == 10 then "0" else toString number}";
+
+  mkDefaultWorkspace = number: numberSymbol: {
+    name = toString number;
+    value = {
+      label = mkDefault null;
+      labelPrefix = mkDefault "${toString number}: ";
+      keys.switchTo = mkDefault (mkSwitchTo number);
+      keys.moveTo = mkDefault "$mod+Shift+${numberSymbol}";
+      head = if headCount == 0 then mkDefault null
+             else mkDefault (getHeadAt ((number - (excessWs + 1)) / wsPerHead));
+    };
+  };
+
+  wsCfgList = mapAttrsToList (_: getAttr "config") cfg.workspaces;
+  wsConfig = concatStrings wsCfgList;
+  defaultWorkspaces = listToAttrs (imap mkDefaultWorkspace wsNumberSymbols);
+
+  conky = import ./conky.nix {
+    inherit pkgs lib;
+    timeout = cfg.networkTimeout;
+  };
+
+  mkBar = output: statusCmd: singleton ''
+    bar {
+      ${optionalString (output != null) "output ${output}"}
+      ${optionalString (statusCmd != null) "status_command ${statusCmd}"}
+      colors {
+        focused_workspace  #5c5cff #e5e5e5
+        active_workspace   #ffffff #0000ee
+        inactive_workspace #00cdcd #0000ee
+        urgent_workspace   #ffff00 #cd0000
+      }
+    }
+  '';
+
+  barConfig = let
+    barHeads = headModifier xrandrHeads;
+    bars = if headCount == 0 then mkBar null conky.single
+      else if headCount == 1 then mkBar (head barHeads) conky.single
+      else let inner = take (length barHeads - 2) (tail barHeads);
+           in mkBar (head barHeads) conky.left
+           ++ map (flip mkBar null) inner
+           ++ mkBar (last barHeads) conky.right;
+  in concatStrings (headModifier bars);
+
+in
+{
+  options.vuizvui.user.aszlig.services.i3 = {
+    enable = mkEnableOption "i3";
+
+    workspaces = mkOption {
+      type = types.attrsOf (types.submodule (import ./workspace.nix));
+      description = ''
+        Workspace to monitor assignment.
+
+        Workspaces are by default assigned starting from the leftmost monitor
+        being workspace 1 and the rightmost monitor being workspace 10. The
+        workspaces are divided by the number of available heads, so if you have
+        a dual head system, you'll end up having workspace 1 to 5 on the left
+        monitor and 6 to 10 on the right.
+      '';
+    };
+
+    reverseHeads = mkOption {
+      type = types.bool;
+      default = false;
+      description = ''
+        Reverse the order of the heads, so if enabled and you have two heads,
+        you'll end up having workspaces 1 to 5 on the right head and 6 to 10 on
+        the left head.
+      '';
+    };
+
+    networkTimeout = mkOption {
+      type = types.int;
+      default = 300;
+      description = ''
+        Maximum number of seconds to wait for network device detection.
+      '';
+    };
+  };
+
+  config = mkIf cfg.enable {
+    vuizvui.user.aszlig.services.i3.workspaces = defaultWorkspaces;
+
+    vuizvui.requiresTests = [ ["vuizvui" "aszlig" "i3"] ];
+
+    services.xserver.windowManager = {
+      default = "i3";
+
+      i3.enable = true;
+      i3.configFile = pkgs.substituteAll {
+        name = "i3.conf";
+        src = ./i3.conf;
+
+        inherit (pkgs) dmenu xterm;
+        inherit (pkgs.vuizvui) pvolctrl;
+        inherit (pkgs.xorg) xsetroot;
+        inherit wsConfig barConfig;
+
+        lockall = pkgs.writeScript "lockvt.sh" ''
+          #!${pkgs.stdenv.shell}
+          "${pkgs.socat}/bin/socat" - UNIX-CONNECT:/run/console-lock.sock \
+            < /dev/null
+        '';
+
+        postInstall = ''
+          ${pkgs.i3}/bin/i3 -c "$target" -C
+        '';
+      };
+    };
+  };
+}
diff --git a/modules/user/aszlig/services/i3/i3.conf b/modules/user/aszlig/services/i3/i3.conf
new file mode 100644
index 00000000..cd14c425
--- /dev/null
+++ b/modules/user/aszlig/services/i3/i3.conf
@@ -0,0 +1,131 @@
+# default modifier key
+set $mod Mod4
+
+# we want to have a VT-style font :-)
+font -dosemu-vga-medium-r-normal--17-160-75-75-c-80-ibm-cp866
+
+# Use Mouse+$mod to drag floating windows to their wanted position
+floating_modifier $mod
+
+# reasonable defaults!
+default_orientation horizontal
+workspace_layout tabbed
+popup_during_fullscreen ignore
+
+# start a terminal
+bindsym $mod+Shift+Return exec --no-startup-id @xterm@/bin/xterm
+
+# kill focused window
+bindsym $mod+Shift+C kill
+
+# start dmenu (a program launcher)
+bindsym $mod+p exec --no-startup-id @dmenu@/bin/dmenu_run
+
+# start lock screen
+bindsym $mod+Shift+Escape exec --no-startup-id @lockall@
+
+# set background
+exec @xsetroot@/bin/xsetroot -solid black
+
+# audio controls
+bindsym XF86AudioLowerVolume exec @pvolctrl@/bin/pvolctrl -10
+bindsym XF86AudioRaiseVolume exec @pvolctrl@/bin/pvolctrl 10
+bindsym XF86AudioMute exec @pvolctrl@/bin/pvolctrl 0
+
+# change/move focus
+bindsym $mod+Shift+Left move left
+bindsym $mod+Shift+H move left
+bindsym $mod+Shift+Down move down
+bindsym $mod+Shift+T move down
+bindsym $mod+Shift+Up move up
+bindsym $mod+Shift+N move up
+bindsym $mod+Shift+Right move right
+bindsym $mod+Shift+S move right
+
+bindsym $mod+Left focus left
+bindsym $mod+h focus left
+bindsym $mod+Down focus down
+bindsym $mod+t focus down
+bindsym $mod+Up focus up
+bindsym $mod+n focus up
+bindsym $mod+Right focus right
+bindsym $mod+s focus right
+
+# split in horizontal orientation
+bindsym $mod+i split h
+
+# split in vertical orientation
+bindsym $mod+d split v
+
+# enter fullscreen mode for the focused container
+bindsym $mod+f fullscreen
+
+# change container layout (stacked, tabbed, default)
+bindsym $mod+apostrophe layout stacking
+bindsym $mod+comma layout tabbed
+bindsym $mod+period layout default
+
+# toggle tiling / floating
+bindsym $mod+Shift+space floating toggle
+
+# change focus between tiling / floating windows
+bindsym $mod+space focus mode_toggle
+
+# focus the parent container
+bindsym $mod+a focus parent
+
+# focus the child container
+bindsym $mod+semicolon focus child
+
+# reload the configuration file
+bindsym $mod+Shift+L reload
+# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
+bindsym $mod+Shift+R restart
+# exit i3 (logs you out of your X session)
+bindsym $mod+Shift+Q exit
+
+# resize window (you can also use the mouse for that)
+mode "resize" {
+    # These bindings trigger as soon as you enter the resize mode
+
+    # They resize the border in the direction you pressed, e.g.
+    # when pressing left, the window is resized so that it has
+    # more space on its left
+
+    bindsym Left resize shrink left 10 px or 10 ppt
+    bindsym h resize shrink left 10 px or 10 ppt
+    bindsym Down resize shrink down 10 px or 10 ppt
+    bindsym t resize shrink down 10 px or 10 ppt
+    bindsym Up resize shrink up 10 px or 10 ppt
+    bindsym n resize shrink up 10 px or 10 ppt
+    bindsym Right resize shrink right 10 px or 10 ppt
+    bindsym s resize shrink right 10 px or 10 ppt
+
+    bindsym Shift+Left resize grow left 10 px or 10 ppt
+    bindsym Shift+H resize grow left 10 px or 10 ppt
+    bindsym Shift+Down resize grow down 10 px or 10 ppt
+    bindsym Shift+T resize grow down 10 px or 10 ppt
+    bindsym Shift+Up resize grow up 10 px or 10 ppt
+    bindsym Shift+N resize grow up 10 px or 10 ppt
+    bindsym Shift+Right resize grow right 10 px or 10 ppt
+    bindsym Shift+S resize grow right 10 px or 10 ppt
+
+    # back to normal: Enter or Escape
+    bindsym Return mode "default"
+    bindsym Escape mode "default"
+}
+
+bindsym $mod+r mode "resize"
+
+# workspace configuration
+@wsConfig@
+
+# ratmenu should be as unintrusive as possible
+for_window [class="^ratmenu$"] floating enable
+for_window [class="^ratmenu$"] border none
+
+# various app cruft
+for_window [class="^Dia$"] floating enable
+
+# bar configuration
+@barConfig@
diff --git a/modules/user/aszlig/services/i3/workspace.nix b/modules/user/aszlig/services/i3/workspace.nix
new file mode 100644
index 00000000..403ba57d
--- /dev/null
+++ b/modules/user/aszlig/services/i3/workspace.nix
@@ -0,0 +1,107 @@
+{ name, lib, config, ... }:
+
+with lib;
+
+let
+  finalLabel =
+    if config.label == null then name
+    else config.labelPrefix + config.label;
+
+  mkDoc = anchor: "http://i3wm.org/docs/userguide.html#${anchor}";
+in
+{
+  options = {
+    labelPrefix = mkOption {
+      type = types.str;
+      default = "";
+      example = "666: ";
+      description = ''
+        The value that will be put in front of the <option>label</option>.
+        So if you have a label called <replaceable>bar</replaceable> and a
+        <option>labelPrefix</option> called <replaceable>foo</replaceable> the
+        label for the workspace will be <replaceable>foobar</replaceable>.
+      '';
+    };
+
+    label = mkOption {
+      type = types.nullOr types.str;
+      default = name;
+      description = ''
+        The label of this workspace, which is its name by default. If the value
+        is <replaceable>null</replaceable>, the resulting label of the workspace
+        is just its name and no <option>labelPrefix</option> is applied.
+      '';
+    };
+
+    assign = mkOption {
+      type = types.listOf types.attrs;
+      default = [];
+      example = [
+        { class = "^Chromium(?:-browser)?\$"; }
+        { instance = "^gajim\$"; }
+      ];
+      description = let
+        anchor = "_automatically_putting_clients_on_specific_workspaces";
+      in ''
+        Assign windows to this specific workspace using the attribute names
+        described by <link xlink:href="${mkDoc anchor}"/>.
+      '';
+    };
+
+    head = mkOption {
+      type = types.nullOr types.str;
+      default = null;
+      description = ''
+        The XRandR head this workspace will be assigned to.
+      '';
+    };
+
+    keys = let
+      commonDesc = ''
+        The <replaceable>$mod</replaceable> placeholder represents the default
+        modifier key. Details about the syntax of key combinations can be found
+        at <link xlink:href="${mkDoc "keybindings"}"/>.
+      '';
+    in {
+      switchTo = mkOption {
+        type = types.nullOr types.str;
+        default = null;
+        example = "$mod+1";
+        description = ''
+          Key combination to switch to this workspace.
+        '' + commonDesc;
+      };
+
+      moveTo = mkOption {
+        type = types.nullOr types.str;
+        default = null;
+        example = "$mod+Shift+exclam";
+        description = ''
+          Key combination to move a container to this workspace.
+        '' + commonDesc;
+      };
+    };
+
+    config = mkOption {
+      type = types.lines;
+      default = "";
+      description = ''
+        Raw configuration options for this workspace.
+      '';
+    };
+  };
+
+  config.config = let
+    mkAssign = mapAttrsToList (criteria: value: "${criteria}=\"${value}\"");
+    mkSym = sym: rest: optionalString (sym != null) "bindsym ${sym} ${rest}";
+  in ''
+    ${optionalString (config.head != null) ''
+    workspace "${finalLabel}" output ${config.head}
+    ''}
+    ${mkSym config.keys.switchTo "workspace \"${finalLabel}\""}
+    ${mkSym config.keys.moveTo "move workspace \"${finalLabel}\""}
+    ${concatMapStrings (assign: ''
+    assign [${concatStringsSep " " (mkAssign assign)}] ${finalLabel}
+    '') config.assign}
+  '';
+}
diff --git a/modules/user/aszlig/services/slim/default.nix b/modules/user/aszlig/services/slim/default.nix
new file mode 100644
index 00000000..e5dea220
--- /dev/null
+++ b/modules/user/aszlig/services/slim/default.nix
@@ -0,0 +1,45 @@
+{ pkgs, config, lib, ... }:
+
+with lib;
+
+let
+  cfg = config.vuizvui.user.aszlig.services.slim;
+  randrHeads = config.services.xserver.xrandrHeads;
+in {
+  options.vuizvui.user.aszlig.services.slim = {
+    enable = mkEnableOption "Vuizvui SLiM";
+  };
+
+  config.services.xserver.displayManager.slim = mkIf cfg.enable {
+    enable = true;
+    theme = pkgs.stdenv.mkDerivation {
+      name = "nixos-theme-vuizvui";
+      src = pkgs.slimThemes.nixosSlim;
+      phases = [ "unpackPhase" "patchPhase" "installPhase" ];
+      patchPhase = let
+        headFactor = if randrHeads == [] then 1 else lib.length randrHeads;
+        centerLeft = 100 / (headFactor * 2);
+      in ''
+        ${pkgs.imagemagick}/bin/mogrify \
+          -fill '#080010' -draw 'color 0,0 reset' \
+          share/slim/themes/nixos-slim-testing/background.png
+        ${pkgs.imagemagick}/bin/mogrify \
+          -negate -region 100x110+0+0 -negate -fill white -colorize 20% \
+          share/slim/themes/nixos-slim-testing/panel.png
+        sed -i \
+          -e 's/^\([a-z_]\+_x[^0-9]*\)[0-9]\+%/\1${toString centerLeft}%/' \
+          share/slim/themes/nixos-slim-testing/slim.theme
+        cat >> share/slim/themes/nixos-slim-testing/slim.theme <<EOF
+        session_x      ${toString centerLeft}%
+        msg_color      #ffffff
+        username_color #ffffff
+        password_color #ffffff
+        input_color    #ffffff
+        EOF
+      '';
+      installPhase = ''
+        cp -R share/slim/themes/nixos-slim-testing "$out"
+      '';
+    };
+  };
+}
diff --git a/modules/user/aszlig/services/vlock/default.nix b/modules/user/aszlig/services/vlock/default.nix
new file mode 100644
index 00000000..f750ccf7
--- /dev/null
+++ b/modules/user/aszlig/services/vlock/default.nix
@@ -0,0 +1,57 @@
+{ pkgs, config, lib, ... }:
+
+let
+  cfg = config.vuizvui.user.aszlig.services.vlock;
+
+  messageFile = pkgs.runCommand "message.cat" {} ''
+    echo -en '\e[H\e[2J\e[?25l' > "$out"
+    "${pkgs.vuizvui.aacolorize}/bin/aacolorize" \
+      "${./message.cat}" "${./message.colmap}" \
+      >> "$out"
+  '';
+
+  esc = "\\\\033";
+  unlockCSI = "${esc}[16;39H${esc}[?25h${esc}[K";
+
+  vlock = lib.overrideDerivation pkgs.vlock (o: {
+    postPatch = (o.postPatch or "") + ''
+      echo -n '"' > src/message.h
+      sed -e ':nl;N;$!bnl;s/[\\"]/\\&/g;s/\n/\\n/g' "${messageFile}" \
+        >> src/message.h
+      sed -i -e '$s/$/"/' src/message.h
+      sed -i -e 's!getenv("VLOCK_MESSAGE")!\n#include "message.h"\n!' \
+        src/vlock-main.c
+      sed -i -re 's/(fprintf[^"]*")(.*user)/\1${unlockCSI}\2/' \
+        src/auth-pam.c
+    '';
+  });
+in {
+  options.vuizvui.user.aszlig.services.vlock = {
+    enable = lib.mkEnableOption "console lock";
+  };
+
+  config = lib.mkIf cfg.enable {
+    systemd.sockets.vlock = {
+      description = "Console Lock Socket";
+      wantedBy = [ "sockets.target" ];
+      socketConfig.ListenStream = "/run/console-lock.sock";
+      socketConfig.Accept = true;
+    };
+
+    systemd.services."vlock@" = {
+      description = "Lock All Consoles";
+      serviceConfig.Type = "oneshot";
+
+      #environment.USER = "%i"; XXX
+      environment.USER = "aszlig";
+
+      script = ''
+        retval=0
+        oldvt="$("${pkgs.kbd}/bin/fgconsole")"
+        "${vlock}/bin/vlock" -asn || retval=$?
+        if [ $retval -ne 0 ]; then "${pkgs.kbd}/bin/chvt" "$oldvt"; fi
+        exit $retval
+      '';
+    };
+  };
+}
diff --git a/modules/user/aszlig/services/vlock/message.cat b/modules/user/aszlig/services/vlock/message.cat
new file mode 100644
index 00000000..f079e829
--- /dev/null
+++ b/modules/user/aszlig/services/vlock/message.cat
@@ -0,0 +1,18 @@
+
+                .
+                |
+          -_    |     .           .-.  .-. ..      ,.--., ,===.
+            `-_ |     |           '||\.||' `' ,  , ||  || ;___
+    -_         >:_    |    _-      ||`\||  || `\/' ||  ||     ;
+      `-_   _-'   `-_ | _-'       .'   `|  ;' /'`\ ``=='' ,==='
+         >:'         `:'
+      _-' |           |    _-   ..              ..             ..
+    -'    |           | _-'     ||              ||             ||
+         .|.         _:<        ||  ,---. .---. ||,-. .--.  .--||
+      _-' | `-_   _-'   `-_     ||  ||"|| ||''' |.,'' |"/'  |,";|
+    -'    |    `:<         `-   ||_ ||_|| ||__  |,\\. ||__  ||_,|
+          |     | `-_           `--'`---' `---' '' `' `---' `---'
+          '     |    `-
+                |                     press ENTER to unlock
+                `
+
diff --git a/modules/user/aszlig/services/vlock/message.colmap b/modules/user/aszlig/services/vlock/message.colmap
new file mode 100644
index 00000000..d7e42fb6
--- /dev/null
+++ b/modules/user/aszlig/services/vlock/message.colmap
@@ -0,0 +1,18 @@
+
+                c
+                c
+          cc    c     b           WWW  WWW WW      BccccB cBBBc
+            ccc c     b           WWWWWWWW WW W  W Bc  cB cccc
+    bb         ccc    b    bb      WWWWWW  WW WWWW Bc  cB     c
+      bbb   bbb   ccc b bbb       WW   WW  WW WWWW BcBBcB cBBBc
+         bbb         cbb
+      bbb c           b    cc   rr              rr             rr
+    bb    c           b ccc     rr              rr             rr
+         ccb         ccc        rr  rrrrr rrrrr rrrrr rrrr  rrrrr
+      ccc c bbb   ccc   ccc     rr  rrRrr rrRRR rrrrr rRrr  rrRrr
+    cc    c    bbb         cc   rrr rrrrr rrrr  rrrrr rrrr  rrrrr
+          c     b bbb           rrrrrrrrr rrrrr rr rr rrrrr rrrrr
+          c     b    bb
+                b                     ppppp PPPPP pp pppppp
+                b
+
diff --git a/modules/user/aszlig/system/kernel.nix b/modules/user/aszlig/system/kernel.nix
new file mode 100644
index 00000000..b1f666e4
--- /dev/null
+++ b/modules/user/aszlig/system/kernel.nix
@@ -0,0 +1,57 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+let
+  cfg = config.vuizvui.user.aszlig.system.kernel;
+
+  generateKConf = exprs: let
+    isNumber = c: elem c ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9"];
+    mkValue = val:
+      if val == "" then "\"\""
+      else if val == "y" || val == "m" || val == "n" then val
+      else if all isNumber (stringToCharacters val) then val
+      else if substring 0 2 val == "0x" then val
+      else "\"${val}\"";
+    mkConfigLine = key: val: "${key}=${mkValue val}";
+    mkConf = cfg: concatStringsSep "\n" (mapAttrsToList mkConfigLine cfg);
+  in pkgs.writeText "generated.kconf" (mkConf exprs + "\n");
+
+  mainlineKernel = {
+    version = "4.4.0-rc8";
+    src = pkgs.fetchgit {
+      url = git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git;
+      rev = "02006f7a7a715af10974a30b7ad8e6ee340f954c";
+      sha256 = "1m08bjbizh2w04l17rq0mkmrayfrhrrsbymaawlr5mi2gvv9rmca";
+    };
+  };
+
+in {
+  options.vuizvui.user.aszlig.system.kernel = {
+    enable = mkEnableOption "aszlig's custom kernel";
+
+    config = mkOption {
+      type = types.attrsOf types.unspecified;
+      default = {};
+      description = ''
+        An attribute set of configuration options to use
+        for building a custom kernel.
+      '';
+    };
+  };
+
+  config = mkIf cfg.enable {
+    boot = let
+      linuxVuizvui = pkgs.buildLinux {
+        inherit (mainlineKernel) version src;
+
+        kernelPatches = singleton pkgs.vuizvui.kernelPatches.bfqsched;
+        configfile = generateKConf cfg.config;
+        allowImportFromDerivation = true;
+      };
+    in rec {
+      kernelPackages = pkgs.recurseIntoAttrs
+        (pkgs.linuxPackagesFor linuxVuizvui kernelPackages);
+    };
+  };
+}
diff --git a/modules/user/profpatsch/programs/scanning.nix b/modules/user/profpatsch/programs/scanning.nix
new file mode 100644
index 00000000..4e8bf2d4
--- /dev/null
+++ b/modules/user/profpatsch/programs/scanning.nix
@@ -0,0 +1,13 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+{
+  options.vuizvui.user.profpatsch.programs.scanning = {
+    enable = mkEnableOption "scanning & simple-scan";
+  };
+
+  config = mkIf config.vuizvui.user.profpatsch.programs.scanning.enable {
+    environment.systemPackages = [ pkgs.simple-scan ];
+    hardware.sane.enable = true;
+  };
+}
diff --git a/nixpkgs-path.nix b/nixpkgs-path.nix
new file mode 100644
index 00000000..c13b09db
--- /dev/null
+++ b/nixpkgs-path.nix
@@ -0,0 +1,2 @@
+# This will be replaced by the channel expression generators in release.nix!
+<nixpkgs>
diff --git a/pkgs/aacolorize/aacolorize.py b/pkgs/aacolorize/aacolorize.py
new file mode 100755
index 00000000..ff19b687
--- /dev/null
+++ b/pkgs/aacolorize/aacolorize.py
@@ -0,0 +1,182 @@
+#!/usr/bin/env python
+import os
+import sys
+
+from optparse import Option, OptionParser
+
+COLORS = {
+    "k": (30, "Black"),
+    "r": (31, "Red"),
+    "g": (32, "Green"),
+    "y": (33, "Yellow"),
+    "b": (34, "Blue"),
+    "p": (35, "Pink"),
+    "c": (36, "Cyan"),
+    "w": (37, "White"),
+}
+
+ESC = chr(27)
+
+class ColorizeError(Exception):
+    pass
+
+class Color(object):
+    def __init__(self, ident=None):
+        """
+        Initialize a color object, if no `ident` is given or it's invalid,
+        the Color object represents "no color".
+        """
+        if ident is not None:
+            spec = COLORS.get(ident.lower(), None)
+        else:
+            spec = None
+
+        if spec is None:
+            self.ident = None
+            self.bold = False
+            self.code = None
+            self.name = "None"
+        else:
+            self.ident = ident
+            self.code, self.name = spec
+
+            if ident.isupper():
+                self.bold = True
+            else:
+                self.bold = False
+
+    @property
+    def attrs(self):
+        """
+        A tuple consisting of the SGR attributes.
+        """
+        if self.ident is None:
+            return ()
+
+        if self.bold:
+            return (1, self.code)
+        else:
+            return (self.code,)
+
+    def sgr_attrs(self, *attrs):
+        """
+        Return the attributes specified by `attrs` formatted according
+        to the CSI specification.
+        """
+        return ';'.join(map(lambda c: str(c), attrs))
+
+    def sgr(self, *attrs):
+        """
+        Start Set Graphics Rendition
+        Return the CSI escape code for `attrs`.
+        """
+        return "%s[%sm" % (ESC, self.sgr_attrs(*attrs))
+
+    def sgr_start(self):
+        """
+        Start Set Graphics Rendition
+        Return the CSI start escape code for the current color.
+        """
+        return self.sgr(*self.attrs)
+
+    def sgr_stop(self):
+        """
+        Clear Set Graphics Rendition
+        """
+        return self.sgr()
+
+    def apply(self, value):
+        """
+        Apply the current color to the string in `value`.
+        """
+        return "%s%s%s" % (self.sgr_start(), value, self.sgr_stop())
+
+    def describe(self):
+        """
+        Return the description of the current color IN color :-)
+        """
+        fmt = "%c: <ESC>[%sm -> [%s]"
+        return fmt % (
+            self.ident,
+            self.sgr_attrs(*self.attrs),
+            self.apply(self.name)
+        )
+
+    def transform_to(self, new_color):
+        """
+        Return the CSI sequences needed to transform into `new_color`.
+        """
+        if self.ident is None and new_color.ident is not None:
+            return new_color.sgr_start()
+        elif self.ident is not None and new_color.ident is None:
+            return self.sgr_stop()
+        elif self.ident is None and new_color.ident is None:
+            return ''
+        elif self.code == new_color.code:
+            if not self.bold and new_color.bold:
+                return self.sgr(1)
+            elif self.bold and not new_color.bold:
+                return self.sgr(22)
+            elif self.bold == new_color.bold:
+                return ''
+        else:
+            if self.bold and new_color.bold:
+                return new_color.sgr(new_color.code)
+
+        return self.sgr_stop()+new_color.sgr_start()
+
+    def __repr__(self):
+        if self.bold:
+            return "<Bold color %s>" % self.name.lower()
+        else:
+            return "<Color %s>" % self.name.lower()
+
+def print_colortable():
+    for ident in COLORS.iterkeys():
+        normal = Color(ident).describe()
+        bold = Color(ident.upper()).describe()
+        sys.stdout.write("%-35s%s\n" % (normal, bold))
+
+def colorize_art(art, colmap):
+    if len(art) != len(colmap):
+        raise ColorizeError("Art and colormap differ in size!")
+
+    no_color = Color()
+
+    out = ""
+    last_color = no_color
+    for i, char in enumerate(colmap):
+        color = Color(char)
+        out += last_color.transform_to(color) + art[i]
+        last_color = color
+
+    last_color.transform_to(no_color)
+
+    return out
+
+def colorize_file(artfile, mapfile=None):
+    if mapfile is None:
+        mapfile = os.path.splitext(artfile)[0]+'.colmap'
+
+    asciiart = open(artfile, 'r').read()
+    colormap = open(mapfile, 'r').read()
+
+    return colorize_art(asciiart, colormap)
+
+if __name__ == "__main__":
+    parser = OptionParser(usage="%prog [options] artfile [mapfile]")
+    parser.add_option("-t", "--table", action="store_true", dest="table",
+                      help="Show color table and exit.")
+
+    (options, args) = parser.parse_args()
+
+    if options.table:
+        print_colortable()
+        parser.exit()
+
+    if not len(args) in (1, 2):
+        parser.print_help()
+        parser.exit()
+    else:
+        colorized = colorize_file(*args)
+        sys.stdout.write(colorized)
diff --git a/pkgs/aacolorize/default.nix b/pkgs/aacolorize/default.nix
new file mode 100644
index 00000000..a7a3c3f1
--- /dev/null
+++ b/pkgs/aacolorize/default.nix
@@ -0,0 +1,13 @@
+{ buildPythonPackage, runCommand }:
+
+buildPythonPackage {
+  name = "aacolorize";
+  src = runCommand "aacolorize-src" {} ''
+    mkdir -p "$out"
+    cp "${./aacolorize.py}" "$out/aacolorize"
+    cat > "$out/setup.py" <<SETUP
+    from distutils.core import setup
+    setup(name='aacolorize', scripts=['aacolorize'])
+    SETUP
+  '';
+}
diff --git a/pkgs/axbo/default.nix b/pkgs/axbo/default.nix
new file mode 100644
index 00000000..93f8ffad
--- /dev/null
+++ b/pkgs/axbo/default.nix
@@ -0,0 +1,49 @@
+{ stdenv, fetchurl, fetchFromGitHub, jdk, jre, ant, makeWrapper
+, commonsLogging, librxtx_java
+}:
+
+stdenv.mkDerivation rec {
+  name = "axbo-research-${version}";
+  version = "3.0.12";
+
+  src = fetchFromGitHub {
+    owner = "jansolo";
+    repo = "aXbo-research";
+    rev = "aXbo-research_${version}";
+    sha256 = "0p2my5bczmwnrs3c0l9wyq3gsc5vydw0nh9n8jkdp9vm77z0kgvd";
+  };
+
+  sourceRoot = "${src.name}/aXbo-research";
+
+  buildInputs = [ jdk ant makeWrapper ];
+
+  buildPhase = ''
+    ant -Dplatforms.JDK_1.7.home="$JAVA_HOME" jar
+  '';
+
+  extraJars = [
+    "commons-beanutils-1.8.3"
+    "commons-digester3-3.2"
+    "jcommon-1.0.20"
+    "jfreechart-1.0.16"
+    "swingx-all-1.6.4"
+  ];
+
+  installPhase = with stdenv.lib; let
+    classpath = makeSearchPath "share/java/\\*" [
+      "$out"
+      commonsLogging
+      librxtx_java
+    ];
+  in ''
+    for dep in $extraJars; do
+      install -vD -m 644 "lib/$dep.jar" "$out/share/java/$dep.jar"
+    done
+    install -vD -m 644 dist/axbo.jar "$out/share/java/axbo.jar"
+
+    mkdir -p "$out/bin"
+    makeWrapper "${jre}/bin/java" "$out/bin/axbo-research" \
+      --add-flags "-Djava.library.path='${librxtx_java}/lib'" \
+      --add-flags "-cp ${classpath} com.dreikraft.axbo.Axbo"
+  '';
+}
diff --git a/pkgs/beehive/default.nix b/pkgs/beehive/default.nix
new file mode 100644
index 00000000..7fcca398
--- /dev/null
+++ b/pkgs/beehive/default.nix
@@ -0,0 +1,17 @@
+{ goPackages, lib, fetchFromGitHub, fetchhg, fetchgit }:
+
+goPackages.buildGoPackage {
+  name = "beehive";
+  goPackagePath = "github.com/muesli/beehive";
+  src = fetchFromGitHub {
+    owner = "muesli";
+    repo = "beehive";
+    rev = "74a7fc4927b8ef14b199254e04630c24f44429f7";
+    sha256 = "1clgc6245yb3yxqdc14xj0f8hc8v4b9hgkv22c89zp0n1by8xrqx";
+  };
+  buildInputs = lib.mapAttrsToList (name: val: val) (import ./godeps.nix {
+    inherit (goPackages) buildGoPackage;
+    inherit lib fetchFromGitHub fetchhg fetchgit;
+  });
+  meta.broken = true;
+}
diff --git a/pkgs/beehive/godeps.nix b/pkgs/beehive/godeps.nix
new file mode 100644
index 00000000..a0e7526e
--- /dev/null
+++ b/pkgs/beehive/godeps.nix
@@ -0,0 +1,378 @@
+{ buildGoPackage, lib, fetchFromGitHub, fetchgit, fetchhg }:
+
+rec {
+  cascadia = buildGoPackage {
+    name = "cascadia";
+    goPackagePath = "code.google.com/p/cascadia";
+    src = fetchhg {
+      url = "https://code.google.com/p/cascadia";
+      rev = "5d796540e3cb93ea0556c897e6a3c7690f614d35";
+      sha256 = "1mxmj4vbh47j3nvmdqdah4fprkyww3pf8i9sy0zcar52bpa4j69c";
+    };
+    buildInputs = [ net ];
+  };
+
+  charset = buildGoPackage {
+    name = "go-charset";
+    goPackagePath = "code.google.com/p/go-charset";
+    src = fetchhg {
+      url = "https://code.google.com/p/go-charset";
+      rev = "ebbeafdc430eb6c7e44e9a730a38eaff4c56ba3a";
+      sha256 = "162jd0ryvwaj7bwxbdwrs1vi6ig3bhd6m4n16wf54frrzyqxh34p";
+    };
+  };
+
+  gonet = buildGoPackage {
+    name = "go.net";
+    goPackagePath = "code.google.com/p/go.net";
+    src = fetchhg {
+      url = "https://code.google.com/p/go.net";
+      rev = "937a34c9de13c766c814510f76bca091dee06028";
+      sha256 = "1f91yzjllw2pdk68yjvf8hjix4mrlqn7fh97h9n7qjy903rwnb9q";
+    };
+    buildInputs = [ net text ];
+  };
+
+  gomock = buildGoPackage {
+    name = "gomock";
+    goPackagePath = "code.google.com/p/gomock";
+    src = fetchgit {
+      url = "https://code.google.com/p/gomock";
+      rev = "e033c7513ca3d743bbb64df299bdec29e93fed03";
+      sha256 = "0vmpqibyx09bdqnqsy8g4xiw3hpw0j9kww7ak2z7fdzxpd9ly337";
+    };
+  };
+
+  anaconda = buildGoPackage {
+    name = "anaconda";
+    goPackagePath = "github.com/ChimeraCoder/anaconda";
+    src = fetchFromGitHub {
+      owner = "ChimeraCoder";
+      repo = "anaconda";
+      rev = "964821c05001e5a38dd234d681ce9a929858481a";
+      sha256 = "077fxb4iazsjfsbmj966ifias84agxbzip742w9cbc7fv1bpy085";
+    };
+    buildInputs = [ tokenbucket jsonpointer oauth ];
+  };
+
+  tokenbucket = buildGoPackage {
+    name = "tokenbucket";
+    goPackagePath = "github.com/ChimeraCoder/tokenbucket";
+    src = fetchFromGitHub {
+      owner = "ChimeraCoder";
+      repo = "tokenbucket";
+      rev = "c5a927568de7aad8a58127d80bcd36ca4e71e454";
+      sha256 = "1cyzlvk1mgdvdfmqsdsy5y2rflfz5q54a9rz9jylc2mg40c1d6dq";
+    };
+  };
+
+  gotumblr = buildGoPackage {
+    name = "gotumblr";
+    goPackagePath = "github.com/MariaTerzieva/gotumblr";
+    src = fetchFromGitHub {
+      owner = "MariaTerzieva";
+      repo = "gotumblr";
+      rev = "62f45d64049aeab0b3835351edc66704c7210f7a";
+      sha256 = "06bqc6c4j9g8l0xqhc9g5jmx4q6dq5jid5bpj4skca30gsqgldgr";
+    };
+    buildInputs = [ oauth1a ];
+  };
+
+  goquery = buildGoPackage {
+    name = "goquery";
+    goPackagePath = "github.com/PuerkitoBio/goquery";
+    src = fetchFromGitHub {
+      owner = "PuerkitoBio";
+      repo = "goquery";
+      rev = "4cf64c51f7e80d56d9ae2ffe7d684d3dd5dbd5d0";
+      sha256 = "1d6cl0qhfx9ngj3hn56mxwwy7yak62c5wxa77f7yfarql84r8h4n";
+    };
+    buildInputs = [ cascadia net ];
+  };
+
+  GoOse = buildGoPackage {
+    name = "GoOse";
+    goPackagePath = "github.com/advancedlogic/GoOse";
+    src = fetchFromGitHub {
+      owner = "advancedlogic";
+      repo = "GoOse";
+      rev = "e210b2436fec0a3ce1b5f9209ee3340314b408e2";
+      sha256 = "0sjqy295x9rn93b5k3r8hdbi5gjbdd3h2dn89v4nzpnzmlrfbc2c";
+    };
+    buildInputs = [ cascadia charset gojs-config goquery net latinx set ];
+  };
+
+  gojs-config = buildGoPackage {
+    name = "gojs-config";
+    goPackagePath = "github.com/advancedlogic/gojs-config";
+    src = fetchFromGitHub {
+      owner = "advancedlogic";
+      repo = "gojs-config";
+      rev = "bff36193fca8bd2f6269e8c4e8c723991fd20565";
+      sha256 = "1k0wgn3pj384sqai2c9dkv06j0z439i3xqzfl3kplb0wdf8a2vy0";
+    };
+  };
+
+  latinx = buildGoPackage {
+    name = "latinx";
+    goPackagePath = "github.com/bjarneh/latinx";
+    src = fetchFromGitHub {
+      owner = "bjarneh";
+      repo = "latinx";
+      rev = "4dfe9ba2a293f28a5e06fc7ffe56b1d71a47b8c8";
+      sha256 = "0lavz5m0dz1rxyl20var3xqj2ndcmai2v893p83pjwm4333yb5g0";
+    };
+  };
+
+  jsonpointer = buildGoPackage {
+    name = "go-jsonpointer";
+    goPackagePath = "github.com/dustin/go-jsonpointer";
+    src = fetchFromGitHub {
+      owner = "dustin";
+      repo = "go-jsonpointer";
+      rev = "75939f54b39e7dafae879e61f65438dadc5f288c";
+      sha256 = "1vcv5xb6v6akbbi71q4srfla311s4p9kspqya2h40x8fxx00lkxp";
+    };
+    propagatedBuildInputs = [ gojson ];
+  };
+
+  gojson = buildGoPackage {
+    name = "gojson";
+    goPackagePath = "github.com/dustin/gojson";
+    src = fetchFromGitHub {
+      owner = "dustin";
+      repo = "gojson";
+      rev = "af16e0e771e2ed110f2785564ae33931de8829e4";
+      sha256 = "0626n6a5hwb0zwi6dwsmqdv2g5fwzsfx22rbxscaydpb90b6qnin";
+    };
+  };
+
+  restful = buildGoPackage {
+    name = "go-restful";
+    goPackagePath = "github.com/emicklei/go-restful";
+    src = fetchFromGitHub {
+      owner = "emicklei";
+      repo = "go-restful";
+      rev = "7ef8ec372029a3112fdb94a53b1ca8eedf666e67";
+      sha256 = "0rrpa9xiqkzapn6axjl19nnhxk0ljjq20a8jpam80hkzw4waa955";
+    };
+    postPatch = ''
+      rm -rf examples
+    '';
+    buildInputs = [ schema ];
+  };
+
+  goirc = buildGoPackage {
+    name = "goirc";
+    goPackagePath = "github.com/fluffle/goirc";
+    src = fetchFromGitHub {
+      owner = "fluffle";
+      repo = "goirc";
+      rev = "0cac69d2eec69bb08bb29b776d045a78b9699791";
+      sha256 = "0iba19rslsyww3qsf9d4ncdxjjz7pv8k36ar5s1i6f4fwv42d56q";
+    };
+    buildInputs = [ glog golog gomock ];
+  };
+
+  golog = buildGoPackage {
+    name = "golog";
+    goPackagePath = "github.com/fluffle/golog";
+    src = fetchFromGitHub {
+      owner = "fluffle";
+      repo = "golog";
+      rev = "3b86dae249b53d7dc2d9e817ff019fa01a155b06";
+      sha256 = "0b8fzkk9bshkfsnbx2nq6dn0dcngsh5awpym98sinkkfwywvlq2f";
+    };
+    buildInputs = [ gomock ];
+  };
+
+  oauth = buildGoPackage {
+    name = "go-oauth";
+    goPackagePath = "github.com/garyburd/go-oauth";
+    src = fetchFromGitHub {
+      owner = "garyburd";
+      repo = "go-oauth";
+      rev = "fa02955a8929c2f007c533fbdfb8ddc91bb6a731";
+      sha256 = "0zx9azdhjxf18fk4y3hnp70cz75iyllqfvfxma02i8f63q364d94";
+    };
+    postPatch = ''
+      rm -rf examples
+    '';
+  };
+
+  glog = buildGoPackage {
+    name = "glog";
+    goPackagePath = "github.com/golang/glog";
+    src = fetchFromGitHub {
+      owner = "golang";
+      repo = "glog";
+      rev = "44145f04b68cf362d9c4df2182967c2275eaefed";
+      sha256 = "1k7sf6qmpgm0iw81gx2dwggf9di6lgw0n54mni7862hihwfrb5rq";
+    };
+  };
+
+  protobuf = buildGoPackage {
+    name = "protobuf";
+    goPackagePath = "github.com/golang/protobuf";
+    src = fetchFromGitHub {
+      owner = "golang";
+      repo = "protobuf";
+      rev = "f7137ae6b19afbfd61a94b746fda3b3fe0491874";
+      sha256 = "05n1ws6y9qpp3imxjvl3jnknq6kca2vc5g475fqr2l67ap3w5lwk";
+    };
+    subPackages = [ "proto" "protoc-gen-go" ];
+  };
+
+  schema = buildGoPackage {
+    name = "schema";
+    goPackagePath = "github.com/gorilla/schema";
+    src = fetchFromGitHub {
+      owner = "gorilla";
+      repo = "schema";
+      rev = "c8422571edf3131506bab7df27e18980fe2598d5";
+      sha256 = "10czpd111l834aam52bh1cxv31pq4h8mi1w994v4848rmbw3jpp4";
+    };
+  };
+
+  dbus = buildGoPackage {
+    name = "go.dbus";
+    goPackagePath = "github.com/guelfey/go.dbus";
+    src = fetchFromGitHub {
+      owner = "guelfey";
+      repo = "go.dbus";
+      rev = "f6a3a2366cc39b8479cadc499d3c735fb10fbdda";
+      sha256 = "15rnpvclg4b3cblcxwwgkdfgamhigiyla0s1rwhfjraqhn94r3ph";
+    };
+    postPatch = ''
+      rm -rf _examples
+    '';
+  };
+
+  web = buildGoPackage {
+    name = "web";
+    goPackagePath = "github.com/hoisie/web";
+    src = fetchFromGitHub {
+      owner = "hoisie";
+      repo = "web";
+      rev = "5a66d0fa07a54688eba8fa506576a78a942ef243";
+      sha256 = "1h4ary4ac51xznr41996k3xqlclm3r5mjba71y6anfwdrhaa2qf1";
+    };
+    buildInputs = [ gonet ];
+    postPatch = ''
+      rm -rf examples
+    '';
+  };
+
+  goserial = buildGoPackage {
+    name = "goserial";
+    goPackagePath = "github.com/huin/goserial";
+    src = fetchFromGitHub {
+      owner = "huin";
+      repo = "goserial";
+      rev = "7b90efdb22b1c168a57b998b2780cf541b2c4740";
+      sha256 = "05ha3yvhvbfrbxlqi8x1fwcliginw0vxhh76mh6vycn9n7yjpacy";
+    };
+  };
+
+  rss = buildGoPackage {
+    name = "go-pkg-rss";
+    goPackagePath = "github.com/jteeuwen/go-pkg-rss";
+    src = fetchFromGitHub {
+      owner = "jteeuwen";
+      repo = "go-pkg-rss";
+      rev = "2382fc0262cb000be19e9042cdbc8459105b4f00";
+      sha256 = "0rss5sj128qwai60wpkm5cy2q8d9yfakdm4pqb8p4lhgpq26g05h";
+    };
+    buildInputs = [ xmlx ];
+  };
+
+  xmlx = buildGoPackage {
+    name = "go-pkg-xmlx";
+    goPackagePath = "github.com/jteeuwen/go-pkg-xmlx";
+    src = fetchFromGitHub {
+      owner = "jteeuwen";
+      repo = "go-pkg-xmlx";
+      rev = "cf505b97c711dd1c5a4682f68ea04dd35e385b8f";
+      sha256 = "01pdjndl1i0p7lr8svi1j0f79zyl36s0xn7yb8d8yziksbczbcrj";
+    };
+  };
+
+  oauth1a = buildGoPackage {
+    name = "oauth1a";
+    goPackagePath = "github.com/kurrik/oauth1a";
+    src = fetchFromGitHub {
+      owner = "kurrik";
+      repo = "oauth1a";
+      rev = "fc2542bc5f2532ed4a437960d2d51ff6e18a5cb6";
+      sha256 = "1v9zsn80y5x5fklc7q8rxixjrh5g01rsdlz247lgf3rag0hb3d39";
+    };
+  };
+
+  xmpp = buildGoPackage {
+    name = "go-xmpp";
+    goPackagePath = "github.com/mattn/go-xmpp";
+    src = fetchFromGitHub {
+      owner = "mattn";
+      repo = "go-xmpp";
+      rev = "8b13d0ad771420685f85ed09d8e9bf81757e7e20";
+      sha256 = "022all0cphxmrg015jzfsqd5xd5nli7fpw32wx6ql79s4rsy3bwb";
+    };
+    postPatch = ''
+      rm -rf _example
+    '';
+  };
+
+  goefa = buildGoPackage {
+    name = "goefa";
+    goPackagePath = "github.com/michiwend/goefa";
+    src = fetchFromGitHub {
+      owner = "michiwend";
+      repo = "goefa";
+      rev = "381f3d7b77fc04d9a81d2bc9e3e6d2fc742757b1";
+      sha256 = "1aiiafbpvw2xlvjgh27mfljd3d0j443iz7sp9w9w3109ay1q2gk4";
+    };
+    buildInputs = [ charset ];
+  };
+
+  hue = buildGoPackage {
+    name = "go.hue";
+    goPackagePath = "github.com/muesli/go.hue";
+    src = fetchFromGitHub {
+      owner = "muesli";
+      repo = "go.hue";
+      rev = "8aefcc693cafb5b2b4ef8ca8d51ab880849e8c12";
+      sha256 = "158q3g5rg9wra1wxkvyb1c2v868gp9mslhf6gmbifj516lsb1agi";
+    };
+  };
+
+  net = buildGoPackage {
+    name = "net";
+    goPackagePath = "golang.org/x/net";
+    src = fetchgit {
+      url = "https://go.googlesource.com/net";
+      rev = "97d8e4e174133a4d1d2171380e510eb4dea8f5ea";
+      sha256 = "0jydngilxhgw8f1zgz11hbjk87bhj0jpar89a2py1pii4ncx9w04";
+    };
+    buildInputs = [ text ];
+  };
+
+  text = buildGoPackage {
+    name = "text";
+    goPackagePath = "golang.org/x/text";
+    src = fetchgit {
+      url = "https://go.googlesource.com/text";
+      rev = "26df76be81cdb060ed9820481a0d67b2d0b04ac2";
+      sha256 = "1vmgzzi0r1idjfgfwibq2r3xlnab3w2v6nmm3c5l2bb994w376gn";
+    };
+  };
+
+  set = buildGoPackage {
+    name = "set.v0";
+    goPackagePath = "gopkg.in/fatih/set.v0";
+    src = fetchgit {
+      url = "https://gopkg.in/fatih/set.v0";
+      rev = "27c40922c40b43fe04554d8223a402af3ea333f3";
+      sha256 = "1d8yz8p4jvyqvmpim40x5y7kj91c5hcc5hbmxhv0j32ifz01nacl";
+    };
+  };
+}
diff --git a/pkgs/blop/default.nix b/pkgs/blop/default.nix
new file mode 100644
index 00000000..6f1f49c5
--- /dev/null
+++ b/pkgs/blop/default.nix
@@ -0,0 +1,16 @@
+{ stdenv, fetchurl, ladspaH }:
+
+stdenv.mkDerivation rec {
+  name = "blop-${version}";
+  version = "0.2.8";
+
+  configureFlags = [
+    "--with-ladspa-prefix=${ladspaH}"
+    "--with-ladspa-plugin-dir=$(out)/lib/ladspa"
+  ];
+
+  src = fetchurl {
+    url = "mirror://sourceforge/blop/${name}.tar.gz";
+    sha256 = "02iymw84dml8glyqgx1mxq4fz2fifgi1jca28hx2r3a2mi7i71vy";
+  };
+}
diff --git a/pkgs/build-support/channel.nix b/pkgs/build-support/channel.nix
new file mode 100644
index 00000000..a837177f
--- /dev/null
+++ b/pkgs/build-support/channel.nix
@@ -0,0 +1,32 @@
+{ stdenv }:
+
+{ name, src, constituents ? [], meta ? {}, ... }@args:
+
+stdenv.mkDerivation ({
+  inherit name src constituents;
+  preferLocalBuild = true;
+  _hydraAggregate = true;
+
+  phases = [ "unpackPhase" "patchPhase" "installPhase" ];
+  installPhase = ''
+    mkdir -p "$out/tarballs" "$out/nix-support"
+
+    tar cJf "$out/tarballs/nixexprs.tar.xz" \
+      --owner=0 --group=0 --mtime="1970-01-01 00:00:00 UTC" \
+      --transform='s!^\.!${name}!' .
+
+    echo "channel - $out/tarballs/nixexprs.tar.xz" \
+      > "$out/nix-support/hydra-build-products"
+
+    echo $constituents > "$out/nix-support/hydra-aggregate-constituents"
+    for i in $constituents; do
+      if [ -e "$i/nix-support/failed" ]; then
+        touch "$out/nix-support/failed"
+      fi
+    done
+  '';
+
+  meta = meta // {
+    isHydraChannel = true;
+  };
+} // removeAttrs args [ "name" "channelName" "src" "constituents" "meta" ])
diff --git a/pkgs/default.nix b/pkgs/default.nix
new file mode 100644
index 00000000..6eec67a4
--- /dev/null
+++ b/pkgs/default.nix
@@ -0,0 +1,31 @@
+{ pkgs ? import (import ../nixpkgs-path.nix) {} }:
+
+let
+  callPackage = pkgs.lib.callPackageWith (pkgs // self.vuizvui);
+
+  self.vuizvui = {
+    mkChannel = callPackage ./build-support/channel.nix { };
+
+    aacolorize = callPackage ./aacolorize { };
+    axbo = callPackage ./axbo { };
+    beehive = callPackage ./beehive { };
+    blop = callPackage ./blop { };
+    grandpa = callPackage ./grandpa { };
+    greybird-xfce-theme = callPackage ./greybird-xfce-theme { };
+    nixops = callPackage ./nixops { };
+    libCMT = callPackage ./libcmt { };
+    librxtx_java = callPackage ./librxtx-java { };
+    list-gamecontrollers = callPackage ./list-gamecontrollers { };
+    lockdev = callPackage ./lockdev { };
+    pvolctrl = callPackage ./pvolctrl { };
+    show-qr-code = callPackage ./show-qr-code { };
+    sidplayfp = callPackage ./sidplayfp { };
+    tkabber_urgent_plugin = callPackage ./tkabber-urgent-plugin { };
+    tomahawk = callPackage ./tomahawk { qt5 = pkgs.qt55; };
+    twitchstream = callPackage ./twitchstream { };
+
+    kernelPatches = {
+      bfqsched = callPackage ./kpatches/bfqsched { };
+    };
+  };
+in pkgs // self
diff --git a/pkgs/games/COPYING b/pkgs/games/COPYING
new file mode 100644
index 00000000..581a4b68
--- /dev/null
+++ b/pkgs/games/COPYING
@@ -0,0 +1,20 @@
+Everything except files that end with ".patch" are copyright (C) 2014
+aszlig and licensed under the Apache License, Version 2.0 (the
+"License"); you may not use these files except in compliance with the
+License. You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+If the URL to the license is unavailable, please see LICENSE.APACHE in
+this directory.
+
+All of the .patch files are copyright (C) 2014 aszlig as well, but are
+licensed under the licenses of the corresponding projects. Please look
+at accompanying Nix expressions for more information about the
+licenses of the respective projects and thus my patches.
diff --git a/LICENSE.APACHE b/pkgs/games/LICENSE.APACHE
index d6456956..d6456956 100644
--- a/LICENSE.APACHE
+++ b/pkgs/games/LICENSE.APACHE
diff --git a/base-module.nix b/pkgs/games/base-module.nix
index 08855379..08855379 100644
--- a/base-module.nix
+++ b/pkgs/games/base-module.nix
diff --git a/pkgs/games/default.nix b/pkgs/games/default.nix
new file mode 100644
index 00000000..d85bd191
--- /dev/null
+++ b/pkgs/games/default.nix
@@ -0,0 +1,25 @@
+{ configuration ? null }:
+
+let
+  configFilePath = let
+    xdgConfig = builtins.getEnv "XDG_CONFIG_HOME";
+    fallback = "${builtins.getEnv "HOME"}/.config";
+    basedir = if xdgConfig == "" then fallback else xdgConfig;
+  in "${basedir}/nixgames.nix";
+
+  configFile = if !builtins.pathExists configFilePath then throw ''
+    The config file "${configFilePath}" doesn't exist! Be sure to create it and
+    put your HumbleBundle email address and password in it, like this:
+
+    {
+      humblebundle.email = "fancyuser@example.com";
+      humblebundle.password = "my_super_secret_password";
+    }
+  '' else configFilePath;
+
+in ((import <nixpkgs/lib>).evalModules {
+  modules = [
+    (if configuration == null then configFilePath else configuration)
+    ./base-module.nix ./humblebundle ./steam
+  ];
+}).config.packages
diff --git a/humblebundle/bastion.nix b/pkgs/games/humblebundle/bastion.nix
index b4acda6b..b4acda6b 100644
--- a/humblebundle/bastion.nix
+++ b/pkgs/games/humblebundle/bastion.nix
diff --git a/humblebundle/cavestoryplus.nix b/pkgs/games/humblebundle/cavestoryplus.nix
index d4c744d4..d4c744d4 100644
--- a/humblebundle/cavestoryplus.nix
+++ b/pkgs/games/humblebundle/cavestoryplus.nix
diff --git a/humblebundle/default.nix b/pkgs/games/humblebundle/default.nix
index 237a5dc6..237a5dc6 100644
--- a/humblebundle/default.nix
+++ b/pkgs/games/humblebundle/default.nix
diff --git a/humblebundle/fetch-humble-bundle/default.nix b/pkgs/games/humblebundle/fetch-humble-bundle/default.nix
index fbabaa8c..fbabaa8c 100644
--- a/humblebundle/fetch-humble-bundle/default.nix
+++ b/pkgs/games/humblebundle/fetch-humble-bundle/default.nix
diff --git a/humblebundle/fez.nix b/pkgs/games/humblebundle/fez.nix
index 5f23b97c..5f23b97c 100644
--- a/humblebundle/fez.nix
+++ b/pkgs/games/humblebundle/fez.nix
diff --git a/humblebundle/ftl.nix b/pkgs/games/humblebundle/ftl.nix
index 7423951a..7423951a 100644
--- a/humblebundle/ftl.nix
+++ b/pkgs/games/humblebundle/ftl.nix
diff --git a/humblebundle/guacamelee.nix b/pkgs/games/humblebundle/guacamelee.nix
index 537ec945..537ec945 100644
--- a/humblebundle/guacamelee.nix
+++ b/pkgs/games/humblebundle/guacamelee.nix
diff --git a/humblebundle/hammerwatch.nix b/pkgs/games/humblebundle/hammerwatch.nix
index 8cf65211..8cf65211 100644
--- a/humblebundle/hammerwatch.nix
+++ b/pkgs/games/humblebundle/hammerwatch.nix
diff --git a/humblebundle/jamestown.nix b/pkgs/games/humblebundle/jamestown.nix
index 15900bba..15900bba 100644
--- a/humblebundle/jamestown.nix
+++ b/pkgs/games/humblebundle/jamestown.nix
diff --git a/humblebundle/liads.nix b/pkgs/games/humblebundle/liads.nix
index a96af8e0..a96af8e0 100644
--- a/humblebundle/liads.nix
+++ b/pkgs/games/humblebundle/liads.nix
diff --git a/humblebundle/megabytepunch.nix b/pkgs/games/humblebundle/megabytepunch.nix
index 643e5835..643e5835 100644
--- a/humblebundle/megabytepunch.nix
+++ b/pkgs/games/humblebundle/megabytepunch.nix
diff --git a/humblebundle/rocketbirds.nix b/pkgs/games/humblebundle/rocketbirds.nix
index a57d1562..a57d1562 100644
--- a/humblebundle/rocketbirds.nix
+++ b/pkgs/games/humblebundle/rocketbirds.nix
diff --git a/humblebundle/spaz.nix b/pkgs/games/humblebundle/spaz.nix
index 5e40ea49..5e40ea49 100644
--- a/humblebundle/spaz.nix
+++ b/pkgs/games/humblebundle/spaz.nix
diff --git a/humblebundle/swordsandsoldiers.nix b/pkgs/games/humblebundle/swordsandsoldiers.nix
index 2fd4fc4b..2fd4fc4b 100644
--- a/humblebundle/swordsandsoldiers.nix
+++ b/pkgs/games/humblebundle/swordsandsoldiers.nix
diff --git a/humblebundle/unepic.nix b/pkgs/games/humblebundle/unepic.nix
index cc4099f5..cc4099f5 100644
--- a/humblebundle/unepic.nix
+++ b/pkgs/games/humblebundle/unepic.nix
diff --git a/steam/default.nix b/pkgs/games/steam/default.nix
index 03e6b180..03e6b180 100644
--- a/steam/default.nix
+++ b/pkgs/games/steam/default.nix
diff --git a/steam/fetchsteam/default.nix b/pkgs/games/steam/fetchsteam/default.nix
index cccddb51..cccddb51 100644
--- a/steam/fetchsteam/default.nix
+++ b/pkgs/games/steam/fetchsteam/default.nix
diff --git a/steam/fetchsteam/downloader.patch b/pkgs/games/steam/fetchsteam/downloader.patch
index 72e5c473..72e5c473 100644
--- a/steam/fetchsteam/downloader.patch
+++ b/pkgs/games/steam/fetchsteam/downloader.patch
diff --git a/steam/starbound.nix b/pkgs/games/steam/starbound.nix
index ba63fcfa..ba63fcfa 100644
--- a/steam/starbound.nix
+++ b/pkgs/games/steam/starbound.nix
diff --git a/pkgs/grandpa/default.nix b/pkgs/grandpa/default.nix
new file mode 100644
index 00000000..b1704538
--- /dev/null
+++ b/pkgs/grandpa/default.nix
@@ -0,0 +1,20 @@
+{ fetchFromGitHub, buildPythonPackage, pythonPackages, cython, gpm }:
+
+pythonPackages.buildPythonPackage {
+  name = "grandpa-0.5";
+  namePrefix = "";
+
+  src = fetchFromGitHub {
+    owner = "aszlig";
+    repo = "GrandPA";
+    rev = "d8d2571f732a68ed18be7533244db2cfb822b4c1";
+    sha256 = "19zf3pnr1adngncvinvn8yyvc0sj66lp7lwiql6379rf78xxlmhn";
+  };
+
+  doCheck = false;
+
+  buildInputs = [ cython gpm ];
+  propagatedBuildInputs = with pythonPackages; [
+    bsddb curses pyserial
+  ];
+}
diff --git a/pkgs/greybird-xfce-theme/default.nix b/pkgs/greybird-xfce-theme/default.nix
new file mode 100644
index 00000000..80b26e85
--- /dev/null
+++ b/pkgs/greybird-xfce-theme/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation {
+  name = "greybird-xfce-theme";
+
+  src = fetchFromGitHub {
+    repo = "Greybird";
+    owner = "shimmerproject";
+    rev = "d0a50a8ea75f11d668229287e83189ef038a56f0";
+    sha256 = "08lf39qbx85ldxfh4qyj9fd42mbsg3vs2r0bg1csl6qx13lffiay";
+  };
+
+  phases = [ "unpackPhase" "installPhase" ];
+
+  installPhase = ''
+    mkdir -p "$out/share/themes/Greybird"
+    cp -vrt "$out/share/themes/Greybird" \
+      gtk-* metacity-1 unity xfce-notify-4.0 xfwm4
+
+    for i in a11y compact; do
+      outdir="$out/share/themes/Greybird-$i/xfwm4"
+      mkdir -p "$outdir"
+      cp -vrt "$outdir" xfwm4-$i/*
+    done
+  '';
+}
diff --git a/pkgs/kpatches/bfqsched/default.nix b/pkgs/kpatches/bfqsched/default.nix
new file mode 100644
index 00000000..fd6c6f81
--- /dev/null
+++ b/pkgs/kpatches/bfqsched/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, fetchurl }:
+
+let
+  bfqVersion = "v7r11";
+  kernelVersion = "4.4";
+  fullKernelVersion = "${kernelVersion}.0";
+  version = "${fullKernelVersion}-${bfqVersion}";
+
+  baseURL = "http://algo.ing.unimo.it/people/paolo/disk_sched/patches";
+
+  fetchPatch = { name, sha256 }: fetchurl {
+    url = "${baseURL}/${version}/${name}.patch";
+    inherit sha256;
+  };
+
+  allPatches = [
+    (fetchPatch {
+      name = "0001-block-cgroups-kconfig-build-bits-for-BFQ-"
+           + "${bfqVersion}-${fullKernelVersion}";
+      sha256 = "1kmlfz63610zc4lxhanjsn4hhw43cdsbk3pyaij723vbd7619kyi";
+    })
+    (fetchPatch {
+      name = "0002-block-introduce-the-BFQ-"
+           + "${bfqVersion}-I-O-sched-for-${fullKernelVersion}";
+      sha256 = "1i5jqkxglp3ah76i4vyi13pnmjkr6qlqy69qbaj2132vijqkyz5i";
+    })
+    (fetchPatch {
+      name = "0003-block-bfq-add-Early-Queue-Merge-EQM-to-BFQ-"
+           + "${bfqVersion}-for";
+      sha256 = "09bv31s8d2aphi3d9py4sz1gcvyb5645a8s7zj614a56hv11p8k9";
+    })
+  ];
+
+  patch = stdenv.mkDerivation {
+    name = "bfqsched-${version}.patch";
+    inherit allPatches;
+    buildCommand = ''
+      cat $allPatches > "$out"
+    '';
+  };
+
+in {
+  name = "bfqsched-${version}";
+  inherit version patch;
+}
diff --git a/pkgs/libcmt/default.nix b/pkgs/libcmt/default.nix
new file mode 100644
index 00000000..e255ef25
--- /dev/null
+++ b/pkgs/libcmt/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchurl, ladspaH }:
+
+stdenv.mkDerivation rec {
+  name = "libcmt-${version}";
+  version = "1.16";
+
+  buildInputs = [ ladspaH ];
+
+  setSourceRoot = ''
+    sourceRoot=cmt/src
+  '';
+
+  makeFlags = [
+    "INSTALL_PLUGINS_DIR=$(out)/lib/ladspa"
+  ];
+
+  preInstall = ''
+    mkdir -p "$out/lib/ladspa"
+  '';
+
+  src = fetchurl {
+    url = "http://www.ladspa.org/download/cmt_src_${version}.tgz";
+    sha256 = "0dan83pvljij3972bv214balc26p9fgw40i2d5y0x7lbd5z1saji";
+  };
+}
diff --git a/pkgs/librxtx-java/default.nix b/pkgs/librxtx-java/default.nix
new file mode 100644
index 00000000..14b0a9da
--- /dev/null
+++ b/pkgs/librxtx-java/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, unzip, jdk, lockdev }:
+
+stdenv.mkDerivation rec {
+  name = "rxtx-${version}";
+  version = "2.2pre2";
+
+  src = fetchurl {
+    urls = [
+      "http://rxtx.qbang.org/pub/rxtx/${name}.zip"
+      "ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${name}.zip"
+    ];
+    sha256 = "00sv9604hkq81mshih0fhqfzn4mf01d6rish6vplsi0gfqz3fc1w";
+  };
+
+  buildInputs = [ unzip jdk lockdev ];
+
+  NIX_CFLAGS_COMPILE = "-DUTS_RELEASE=\"3.8.0\"";
+
+  configureFlags = [ "--enable-liblock" ];
+
+  makeFlags = [
+    "JHOME=$(out)/share/java"
+    "RXTX_PATH=$(out)/lib"
+  ];
+
+  preInstall = ''
+    mkdir -p "$out/lib" "$out/share/java"
+  '';
+}
diff --git a/pkgs/list-gamecontrollers/default.nix b/pkgs/list-gamecontrollers/default.nix
new file mode 100644
index 00000000..c207d2eb
--- /dev/null
+++ b/pkgs/list-gamecontrollers/default.nix
@@ -0,0 +1,10 @@
+{ runCommand, pkgconfig, SDL2 }:
+
+runCommand "list-gamecontrollers" {
+  buildInputs = [ pkgconfig SDL2 ];
+} ''
+  mkdir -p "$out/bin"
+  gcc -Werror "${./list-gc.c}" \
+    $(pkg-config --libs --cflags sdl2) \
+    -o "$out/bin/list-gamecontrollers"
+''
diff --git a/pkgs/list-gamecontrollers/list-gc.c b/pkgs/list-gamecontrollers/list-gc.c
new file mode 100644
index 00000000..f40b7da6
--- /dev/null
+++ b/pkgs/list-gamecontrollers/list-gc.c
@@ -0,0 +1,31 @@
+#include <SDL.h>
+
+void dump_guid(SDL_Joystick *js) {
+    SDL_JoystickGUID guid;
+    const char *name;
+    char guidstr[33];
+
+    guid = SDL_JoystickGetGUID(js);
+    name = SDL_JoystickName(js);
+    SDL_JoystickGetGUIDString(guid, guidstr, sizeof(guidstr));
+
+    printf("%s: %s\n", name, guidstr);
+}
+
+int main()
+{
+    int i;
+    SDL_Joystick *js;
+
+    SDL_Init(SDL_INIT_JOYSTICK);
+    atexit(SDL_Quit);
+
+    for (i = 0; i < SDL_NumJoysticks(); ++i) {
+        if ((js = SDL_JoystickOpen(i)) != NULL) {
+            dump_guid(js);
+            SDL_JoystickClose(js);
+        }
+    }
+
+    return EXIT_SUCCESS;
+}
diff --git a/pkgs/lockdev/default.nix b/pkgs/lockdev/default.nix
new file mode 100644
index 00000000..52e78eb5
--- /dev/null
+++ b/pkgs/lockdev/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, fetchurl, perl }:
+
+let
+  baseurl = "ftp://ftp.debian.org/debian/pool/main/l/lockdev/";
+in stdenv.mkDerivation rec {
+  name = "lockdev-${version}";
+  version = "1.0.3";
+
+  buildInputs = [ perl ];
+
+  patches = stdenv.lib.singleton (fetchurl {
+    url = baseurl + "lockdev_1.0.3-1.5.diff.gz";
+    sha256 = "1l3pq1nfb5qx3i91cjaiz3c53368gw6m28a5mv9391n5gmsdmi3r";
+  });
+
+  NIX_CFLAGS_COMPILE = "-fPIC -D_PATH_LOCK=\"/tmp\"";
+  installFlags = [ "basedir=$(out)" ];
+
+  src = fetchurl {
+    url = baseurl + "lockdev_${version}.orig.tar.gz";
+    sha256 = "10lzhq6r2dn8y3ki7wlqsa8s3ndkf842bszcjw4dbzf3g9fn7bnc";
+  };
+}
diff --git a/pkgs/nixops/default.nix b/pkgs/nixops/default.nix
new file mode 100644
index 00000000..af16b56c
--- /dev/null
+++ b/pkgs/nixops/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, fetchFromGitHub, fetchpatch, git }:
+
+let
+  rev = "9076dbc722a4125b2a08d4b49d94b2073b71578f";
+  sha256 = "05zc12spjk9pcspqq88wz3k4rgqy8bsxy28ysjw752959b95ys1z";
+
+  master = stdenv.mkDerivation rec {
+    name = "nixops-upstream-patched";
+
+    src = fetchFromGitHub {
+      owner = "NixOS";
+      repo = "nixops";
+      inherit rev sha256;
+    };
+
+    phases = [ "unpackPhase" "patchPhase" "installPhase" ];
+
+    postPatch = ''
+      sed -i -re 's!<nixpkgs([^>]*)>!${import ../../nixpkgs-path.nix}\1!g' \
+        release.nix doc/manual/default.nix doc/manual/resource.nix
+    '';
+
+    installPhase = ''
+      cp -a . "$out"
+    '';
+  };
+
+  release = import "${master}/release.nix" {
+    nixopsSrc = {
+      outPath = master;
+      inherit rev;
+      revCount = 0;
+      shortRev = builtins.substring 0 7 rev;
+    };
+    officialRelease = false;
+  };
+in stdenv.lib.getAttr stdenv.system release.build
diff --git a/pkgs/pvolctrl/default.nix b/pkgs/pvolctrl/default.nix
new file mode 100644
index 00000000..5701c19e
--- /dev/null
+++ b/pkgs/pvolctrl/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchurl, pkgconfig, libpulseaudio }:
+
+stdenv.mkDerivation rec {
+  name = "pvolctrl-0.23";
+
+  unpackPhase = let
+    baseurl = "https://sites.google.com/site/guenterbartsch/blog/"
+            + "volumecontrolutilityforpulseaudio/";
+    makefile = fetchurl {
+      url = baseurl + "Makefile";
+      sha256 = "0l2ffvb617csk6h29y64v6ywhpcp7la6vvcip1w4nq0yry6jhrqz";
+    };
+    source = fetchurl {
+      url = baseurl + "pvolctrl.c";
+      sha256 = "0vcd5dlw9l47jpabwmmzdvlkn67fz55dr3sryyh56sl263mibjda";
+    };
+  in ''
+    mkdir -p "${name}"
+    sed -e 's|/usr/bin/||' "${makefile}" > "${name}/Makefile"
+    sed -e 's/PA_VOLUME_MAX/PA_VOLUME_NORM/
+    /avg_vol += (avg_vol \* vol_mod) \/ 100;/ {
+      s/(avg_vol/((int)PA_VOLUME_NORM/
+    }
+    /if (vol_mod)/i \
+      if (info->name == NULL || strncmp(info->name, "combined", 8) != 0) \
+        return;' "${source}" > "${name}/pvolctrl.c"
+    sourceRoot="${name}"
+  '';
+
+  installPhase = ''
+    install -D -T pvolctrl "$out/bin/pvolctrl"
+  '';
+
+  buildInputs = [ pkgconfig libpulseaudio ];
+}
diff --git a/pkgs/show-qr-code/default.nix b/pkgs/show-qr-code/default.nix
new file mode 100644
index 00000000..17d9847a
--- /dev/null
+++ b/pkgs/show-qr-code/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, writeScriptBin, gtkdialog, qrencode }:
+
+let script = writeScriptBin "show-qr-code" ''
+  #!/bin/sh
+  TMP=$(mktemp)
+  ${qrencode}/bin/qrencode -s 8 -o "$TMP" -t PNG "$1"
+
+  export DIALOG='
+  <vbox>
+      <pixmap>
+          <input file>'$TMP'</input>
+      </pixmap>
+  </vbox>
+  '
+
+  ${gtkdialog}/bin/gtkdialog --program=DIALOG > /dev/null &
+
+  sleep 0.2
+
+  rm "$TMP"
+
+  '';
+
+in script // {
+  meta = {
+    description = "Show the given string as qr code in a gtk window";
+  };
+}
diff --git a/pkgs/sidplayfp/default.nix b/pkgs/sidplayfp/default.nix
new file mode 100644
index 00000000..c06da466
--- /dev/null
+++ b/pkgs/sidplayfp/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, pkgconfig, alsaLib, libpulseaudio }:
+
+let
+  libsidplayfp = stdenv.mkDerivation rec {
+    name = "libsidplayfp-${version}";
+    version = "1.3.0";
+
+    src = fetchurl {
+      url = "mirror://sourceforge/sidplay-residfp/${name}.tar.gz";
+      sha256 = "1gd4pn445v3wzr95z1b8642w016dnhq2hi8dgpc9imxig4xhx47d";
+    };
+  };
+
+in stdenv.mkDerivation rec {
+  name = "sidplayfp-${version}";
+  version = "1.1.0.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/sidplay-residfp/${name}.tar.gz";
+    sha256 = "0m8gk4xw2g4s3rcc3qy7nw6i08ivijjnbf3b6s5y3ryysyjjmc50";
+  };
+
+  postPatch = ''
+    sed -i -e '/cerr.*\(Clear screen\|Move cursor\)/d' src/menu.cpp
+  '';
+
+  buildInputs = [ pkgconfig libsidplayfp alsaLib libpulseaudio ];
+}
+
diff --git a/pkgs/tkabber-urgent-plugin/default.nix b/pkgs/tkabber-urgent-plugin/default.nix
new file mode 100644
index 00000000..b39e5ea8
--- /dev/null
+++ b/pkgs/tkabber-urgent-plugin/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchsvn, xlibs }:
+
+stdenv.mkDerivation {
+  name = "tkabber-urgent-plugin";
+
+  src = fetchsvn {
+    url = "http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/urgent";
+    rev = 528;
+    sha256 = "1qr7i0559ad5y1l5h2gp8aix4nsfgm0bx7jqb030hgbxaw1xnbp5";
+  };
+
+  buildInputs = [ xlibs.libX11 ];
+
+  patchPhase = ''
+    sed -i -e 's|exec xwininfo|exec ${xlibs.xwininfo}/bin/xwininfo|' urgent.tcl
+  '';
+
+  buildPhase = ''
+    gcc -lX11 -o urgent urgent.c
+  '';
+
+  installPhase = ''
+    install -vd "$out/share/tkabber-plugins/urgent"
+    cp -vpt "$out/share/tkabber-plugins/urgent" urgent urgent.tcl
+  '';
+}
diff --git a/pkgs/tomahawk/default.nix b/pkgs/tomahawk/default.nix
new file mode 100644
index 00000000..d8d9cbc6
--- /dev/null
+++ b/pkgs/tomahawk/default.nix
@@ -0,0 +1,89 @@
+{ stdenv, fetchFromGitHub, fetchurl, cmake, pkgconfig, attica, boost, gnutls
+, libechonest, liblastfm, lucenepp, vlc_qt5, qca-qt5, qt5, qtkeychain
+, kde5_latest, sparsehash, taglib, websocketpp, makeWrapper, ffmpeg_2, v4l_utils
+
+, enableXMPP      ? true,  libjreen     ? null
+, enableKDE       ? false, kdelibs      ? null
+, enableTelepathy ? false, telepathy_qt ? null
+}:
+
+assert enableXMPP      -> libjreen     != null;
+assert enableKDE       -> kdelibs      != null;
+assert enableTelepathy -> telepathy_qt != null;
+
+with stdenv.lib;
+
+let
+  useQT5 = pkg: let
+    qt5variant = pkg.override (attrs: {
+      ${if attrs ? qt4 then "qt4" else "qt"} = qt5.qtbase;
+    });
+  in qt5variant.overrideDerivation (drv: {
+    postInstall = (drv.postInstall or "") + ''
+      for i in "$out"/include/*; do
+        [ -d "$i" ] || continue
+        ! expr "$i" : '.*5$$' > /dev/null || continue
+        ln -sv "$i" "''${i}5"
+      done
+      for l in "$out"/lib*/*.so*; do
+        bn="$(basename "$l")"
+        ! expr "''${bn%.so*}" : '.*5$$' > /dev/null || continue
+        ln -sv "$l" "$(dirname "$l")/''${bn%.so*}5.''${bn#*.}"
+      done
+    '';
+  });
+
+  libechonestQT5 = overrideDerivation ((useQT5 libechonest).override {
+    qjson = null;
+  }) (drv: {
+    cmakeFlags = (drv.cmakeFlags or []) ++ [ "-DBUILD_WITH_QT4=OFF" ];
+  });
+
+  qtkeychainQT5 = overrideDerivation (useQT5 qtkeychain) (drv: {
+    cmakeFlags = (drv.cmakeFlags or []) ++ [
+      "-DBUILD_WITH_QT4=OFF"
+      "-DQt5LinguistTools_DIR=${qt5.qttools}/lib/cmake/Qt5LinguistTools"
+    ];
+  });
+
+  vlc = vlc_qt5.override {
+    ffmpeg = ffmpeg_2.override {
+      v4l_utils = v4l_utils.override { withQt4 = false; };
+    };
+  };
+
+in stdenv.mkDerivation rec {
+  name = "tomahawk-${version}";
+  version = "0.9.0-git";
+
+  src = fetchFromGitHub {
+    owner = "tomahawk-player";
+    repo = "tomahawk";
+    rev = "d4c3f24232f09e352868cf8592efcfb1f228b2db";
+    sha256 = "0hn7fa2a17i76ai657h6l9f4yp3sz75xpv3yparky9kir6zjbrrz";
+  };
+
+  cmakeFlags = [
+    "-DLUCENEPP_INCLUDE_DIR=${lucenepp}/include"
+    "-DLUCENEPP_LIBRARY_DIR=${lucenepp}/lib"
+  ];
+
+  buildInputs = (map useQT5 [ liblastfm qt5.quazip ]) ++ [
+    qca-qt5 qtkeychainQT5 libechonestQT5 kde5_latest.attica cmake pkgconfig
+    kde5_latest.extra-cmake-modules boost gnutls lucenepp vlc qt5.qtbase
+    qt5.qtsvg qt5.qttools qt5.qtwebkit qt5.qtx11extras sparsehash taglib
+    websocketpp makeWrapper
+  ] ++ stdenv.lib.optional enableXMPP      (useQT5 libjreen)
+    ++ stdenv.lib.optional enableKDE       (useQT5 kdelibs)
+    ++ stdenv.lib.optional enableTelepathy (useQT5 telepathy_qt);
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    description = "A multi-source music player";
+    homepage = "http://tomahawk-player.org/";
+    license = licenses.gpl3Plus;
+    platforms = platforms.all;
+    maintainers = [ maintainers.aszlig ];
+  };
+}
diff --git a/pkgs/twitchstream/default.nix b/pkgs/twitchstream/default.nix
new file mode 100644
index 00000000..b6d0b523
--- /dev/null
+++ b/pkgs/twitchstream/default.nix
@@ -0,0 +1,112 @@
+{ stdenv, fetchurl, writeScriptBin, ffmpeg_2, libpulseaudio }:
+
+# FIXME: Clean up this whole file!
+
+with stdenv.lib;
+
+let
+  streams = {
+    dnyarri = {
+      width = 1920;
+      height = 1080;
+      monitor = 1;
+    };
+    mmrnmhrm = {
+      width = 1600;
+      height = 1280;
+      monitor = 1;
+    };
+  };
+
+  sumAttr = name: attrs: acc: acc + (getAttr name attrs);
+  maxAttr = name: attrs: acc: let
+    current = getAttr name attrs;
+  in if acc > current then acc else current;
+
+  fullwidth = fold (sumAttr "width") 0 (attrValues streams);
+  maxheight = fold (maxAttr "height") 0 (attrValues streams);
+
+  resolution = "1920x1080";
+  fps = 15;
+  quality = "slow";
+
+  encoder = let
+    aacenc = stdenv.mkDerivation rec {
+      name = "vo-aacenc-0.1.3";
+      src = fetchurl {
+        url = "mirror://sourceforge/opencore-amr/${name}.tar.gz";
+        sha256 = "0dhghm3c8pqrriwwyj5x9i0yf52fmdfijbgqqkvqvwarldvp86p5";
+      };
+    };
+    base = ffmpeg_2.override { x11grabSupport = true; };
+  in stdenv.lib.overrideDerivation base (attrs: {
+    configureFlags = attrs.configureFlags ++ [
+      "--enable-libpulse"
+      "--enable-version3"
+      "--enable-libvo-aacenc"
+    ];
+    preConfigure = ''
+      addPkgConfigPath "${libpulseaudio}"
+      addPkgConfigPath "${aacenc}"
+    '';
+    NIX_CFLAGS_COMPILE = "-I${aacenc}/include -L${aacenc}/lib";
+    buildInputs = attrs.buildInputs ++ [ libpulseaudio aacenc ];
+  });
+
+  script = let
+    combine = [
+      "color=c=black:s=1248x640 [surface]"
+      "[0:v] setpts=PTS-STARTPTS, scale=680x540 [left]"
+      "[1:v] setpts=PTS-STARTPTS, scale=568x640 [right]"
+      "[surface][left] overlay=0:0 [leftonly]"
+      "[leftonly][right] overlay=680:0 [out]"
+    ];
+  /*
+    combine = [
+      "color=c=black:s=${toString fullwidth}x${toString maxheight} [surface]"
+      "[surface][0:v] overlay=0:0 [leftonly]"
+      "[leftonly][1:v] overlay=${toString streams.dnyarri.width}:0 [out]"
+    ];
+  */
+    nop = x: "\\";
+  in ''
+    #!${stdenv.shell}
+    keyfile="$HOME/.twitch.key"
+    if [ ! -e "$keyfile" ]; then
+      echo "You need to put your streaming key into $keyfile!" >&2
+      echo "To obtain the key, please visit the following URL:" >&2
+      echo "http://www.twitch.tv/broadcast/dashboard/streamkey" >&2
+      exit 1
+    fi
+
+    ${encoder}/bin/ffmpeg -loglevel warning \
+      -f x11grab -s "${resolution}" -r "${toString fps}" -i "$DISPLAY+1920,0" \
+      -f pulse -ac 2 -i default \
+      -codec:v libx264 -s 1280x720 -preset:v fast -crf 24 -pix_fmt yuv420p \
+      -codec:a libvo_aacenc -ar 44100 -threads auto -b:a 128k -bufsize 8k \
+      -f flv "rtmp://live-fra.twitch.tv/app/$(< "$keyfile")" "$@"
+  '';
+
+  disabled = ''
+    ${encoder}/bin/ffmpeg \
+      -f x11grab -s "${resolution}" -r "${toString fps}" -i "$DISPLAY+1920,0" \
+      ${nop ''
+      -i 'tcp://dnyarri:7891?listen' \
+      ''}
+      -f pulse -ac 2 -i default \
+      ${nop ''
+      -filter_complex "${concatStringsSep "; " combine}" \
+      -map "[out]" -map 2:a,0:v \
+      -c:v libx264 -preset "${quality}" -s 1280x720 \
+                   -b 2500k -minrate 2500k -maxrate 2500k \
+                   -tune film -qscale:v 1 -threads:v 4 -crf 1 -tune animation \
+      -c:a libmp3lame -ar 44100 -qscale:a 1 -bufsize 512k -threads 4 \
+      -framerate "${toString fps}" \
+      -force_key_frames 2 -b 2500k -minrate 2500k -maxrate 2500k \
+      -g 2 -keyint_min 2 \
+      ''}
+      -c:v libx264 -preset fast -pix_fmt yuv420p -s 1280x800 -threads 0 \
+      -c:a libmp3lame -ab 128k -ar 44100 -threads 0 \
+      -f flv "rtmp://live-fra.twitch.tv/app/$(< "$keyfile")" "$@"
+  '';
+in writeScriptBin "twitchstream" script
diff --git a/release.nix b/release.nix
new file mode 100644
index 00000000..74cf1149
--- /dev/null
+++ b/release.nix
@@ -0,0 +1,168 @@
+{ vuizvuiSrc ? null
+, nixpkgsSrc ? <nixpkgs>
+, supportedSystems ? [ "i686-linux" "x86_64-linux" ]
+}:
+
+let
+  nixpkgsRevCount = nixpkgsSrc.revCount or 12345;
+  nixpkgsShortRev = nixpkgsSrc.shortRev or "abcdefg";
+  nixpkgsVersion = "pre${toString nixpkgsRevCount}.${nixpkgsShortRev}-vuizvui";
+
+  nixpkgs = nixpkgsSrc;
+
+  vuizvuiRevCount = vuizvuiSrc.revCount or 12345;
+  vuizvuiShortRev = vuizvuiSrc.shortRev or "abcdefg";
+  vuizvuiVersion = "pre${toString vuizvuiRevCount}.${vuizvuiShortRev}";
+
+  vuizvui = let
+    patchedVuizvui = (import nixpkgs {}).stdenv.mkDerivation {
+      name = "vuizvui-${vuizvuiVersion}";
+      inherit nixpkgsVersion;
+      src = vuizvuiSrc;
+      phases = [ "unpackPhase" "installPhase" ];
+      installPhase = ''
+        cp -r --no-preserve=ownership "${nixpkgs}/" nixpkgs
+        chmod -R u+w nixpkgs
+        echo -n "$nixpkgsVersion" > nixpkgs/.version-suffix
+        echo "echo '$nixpkgsVersion'" \
+          > nixpkgs/nixos/modules/installer/tools/get-version-suffix
+        echo -n ${nixpkgs.rev or nixpkgsShortRev} > nixpkgs/.git-revision
+        echo './nixpkgs' > nixpkgs-path.nix
+        cp -r . "$out"
+      '';
+    };
+  in if vuizvuiSrc == null then ./. else patchedVuizvui;
+
+  system = "x86_64-linux";
+  pkgsUpstream = import nixpkgs { inherit system; };
+  root = import vuizvui { inherit system; };
+
+  mpath = if vuizvuiSrc == null then ./machines else "${vuizvui}/machines";
+  allMachines = import mpath { inherit system; };
+
+  allTests = import ./lib/get-tests.nix ({
+    inherit system nixpkgs;
+  } // pkgsUpstream.lib.optionalAttrs (vuizvuiSrc != null) {
+    vuizvuiTests = "${vuizvui}/tests";
+  });
+
+in with pkgsUpstream.lib; with builtins; {
+
+  machines = let
+    getBuild = const (getAttr "build");
+  in mapAttrsRecursiveCond (m: !(m ? eval)) getBuild allMachines;
+
+  isoImages = let
+    buildIso = attrs: let
+      name = attrs.iso.config.networking.hostName;
+      cond = attrs.iso.config.vuizvui.createISO;
+    in if !cond then {} else pkgsUpstream.runCommand "vuizvui-iso-${name}" {
+      meta.description = "Live CD/USB stick of ${name}";
+      iso = attrs.iso.config.system.build.isoImage;
+      passthru.config = attrs.iso.config;
+    } ''
+      mkdir -p "$out/nix-support"
+      echo "file iso" $iso/iso/*.iso* \
+        >> "$out/nix-support/hydra-build-products"
+    '';
+  in mapAttrsRecursiveCond (m: !(m ? iso)) (const buildIso) allMachines;
+
+  tests = let
+    machineList = collect (m: m ? eval) allMachines;
+    activatedTests = unique (concatMap (machine:
+      machine.eval.config.vuizvui.requiresTests
+    ) machineList);
+    mkTest = path: setAttrByPath path (getAttrFromPath path allTests);
+  in fold recursiveUpdate {} (map mkTest activatedTests) // {
+    inherit (allTests) vuizvui;
+  };
+
+  pkgs = let
+    releaseLib = import "${nixpkgs}/pkgs/top-level/release-lib.nix" {
+      inherit supportedSystems;
+      packageSet = attrs: (import vuizvui attrs).pkgs.vuizvui;
+    };
+  in with releaseLib; mapTestOn (packagePlatforms releaseLib.pkgs);
+
+  channels = let
+    mkChannel = attrs: root.pkgs.vuizvui.mkChannel (rec {
+      name = "vuizvui-channel-${attrs.name or "generic"}-${vuizvuiVersion}";
+      src = vuizvui;
+      patchPhase = ''
+        touch .update-on-nixos-rebuild
+      '';
+    } // removeAttrs attrs [ "name" ]);
+
+    gatherTests = active: map (path: getAttrFromPath path allTests) active;
+
+  in {
+    generic = mkChannel {};
+
+    machines = mapAttrsRecursiveCond (m: !(m ? eval)) (path: attrs: mkChannel {
+      name = "machine-${last path}";
+      constituents = singleton attrs.eval.config.system.build.toplevel
+                  ++ gatherTests attrs.eval.config.vuizvui.requiresTests;
+    }) allMachines;
+  };
+
+  manual = let
+    modules = import "${nixpkgs}/nixos/lib/eval-config.nix" {
+      modules = import "${vuizvui}/modules/module-list.nix";
+      check = false;
+      inherit system;
+    };
+
+    patchedDocbookXSL = overrideDerivation pkgsUpstream.docbook5_xsl (drv: {
+      # Don't chunk off <preface/>
+      postPatch = (drv.postPatch or "") + ''
+        sed -i -e '
+          /<xsl:when.*preface/d
+          /<xsl:for-each/s!|//d:preface \+!!g
+          /<xsl:variable/s!|[a-z]\+::d:preface\[1\] \+!!g
+        ' xhtml/chunk-common.xsl
+
+        sed -i -e '
+          /<xsl:when.*preface/,/<\/xsl:when>/d
+          /<xsl:template/s!|d:preface!!g
+        ' xhtml/chunk-code.xsl
+      '';
+    });
+
+    isVuizvui = opt: head (splitString "." opt.name) == "vuizvui";
+    filterDoc = filter (opt: isVuizvui opt && opt.visible && !opt.internal);
+    optionsXML = toXML (filterDoc (optionAttrSetToDocList modules.options));
+    optionsFile = toFile "options.xml" (unsafeDiscardStringContext optionsXML);
+  in pkgsUpstream.stdenv.mkDerivation {
+    name = "vuizvui-options";
+
+    buildInputs = singleton pkgsUpstream.libxslt;
+
+    xsltFlags = ''
+      --param section.autolabel 1
+      --param section.label.includes.component.label 1
+      --param html.stylesheet 'style.css'
+      --param xref.with.number.and.title 1
+      --param admon.style '''
+    '';
+
+    buildCommand = ''
+      cp -r "${./doc}" doc
+      chmod -R +w doc
+      xsltproc -o doc/options-db.xml \
+        "${nixpkgs}/nixos/doc/manual/options-to-docbook.xsl" \
+        ${optionsFile}
+
+      dest="$out/share/doc/vuizvui"
+      mkdir -p "$dest"
+
+      xsltproc -o "$dest/" $xsltFlags -nonet -xinclude \
+        ${patchedDocbookXSL}/xml/xsl/docbook/xhtml/chunk.xsl \
+        doc/index.xml
+
+      cp "${nixpkgs}/nixos/doc/manual/style.css" "$dest/style.css"
+
+      mkdir -p "$out/nix-support"
+      echo "doc manual $dest" > "$out/nix-support/hydra-build-products"
+    '';
+  };
+}
diff --git a/tests/aszlig/i3.nix b/tests/aszlig/i3.nix
new file mode 100644
index 00000000..3c5a5c0c
--- /dev/null
+++ b/tests/aszlig/i3.nix
@@ -0,0 +1,41 @@
+{ pkgs, ... }:
+
+{
+  name = "i3";
+
+  machine = { lib, ... }: {
+    imports = [
+      "${import ../../nixpkgs-path.nix}/nixos/tests/common/x11.nix"
+    ];
+
+    vuizvui.user.aszlig.profiles.base.enable = true;
+
+    vuizvui.user.aszlig.services.i3 = {
+      enable = true;
+
+      workspaces."1" = {
+        label = "first";
+        assign = lib.singleton { class = "^test\$"; };
+      };
+    };
+
+    services.xserver.windowManager.default = lib.mkForce "i3";
+    /* XXX */
+    fonts = {
+      enableCoreFonts = true;
+      enableFontDir = true;
+      enableGhostscriptFonts = true;
+      fonts = [
+        pkgs.dosemu_fonts
+        pkgs.liberation_ttf
+      ];
+    };
+    /* !XXX */
+  };
+
+  testScript = { nodes, ... }: ''
+    $machine->waitForX;
+    $machine->sleep(20);
+    $machine->screenshot("i3");
+  '';
+}
diff --git a/tests/default.nix b/tests/default.nix
new file mode 100644
index 00000000..77fb3073
--- /dev/null
+++ b/tests/default.nix
@@ -0,0 +1,19 @@
+{ system ? builtins.currentSystem, ... }:
+
+let
+  callTest = path: import ./make-test.nix (import path) {
+    inherit system;
+  };
+
+in {
+  aszlig = {
+    i3 = callTest ./aszlig/i3.nix;
+  };
+  labnet = {
+    heinrich = callTest ./labnet/heinrich.nix;
+  };
+  richi235 = {
+    # Currently broken
+    #multipath-vpn = callTest ./richi235/multipath-vpn.nix;
+  };
+}
diff --git a/tests/labnet/heinrich.nix b/tests/labnet/heinrich.nix
new file mode 100644
index 00000000..a7839c42
--- /dev/null
+++ b/tests/labnet/heinrich.nix
@@ -0,0 +1,51 @@
+{
+  name = "heinrich";
+
+  nodes = let
+    common = { lib, ... }: {
+      networking.useNetworkd = true;
+      systemd.network.netdevs."40-eth0".netdevConfig = {
+        Name = "eth0";
+        Kind = "dummy";
+      };
+    };
+  in {
+    heinrich = {
+      imports = [ common (import ../../machines {}).labnet.heinrich.config ];
+      virtualisation.vlans = [ 1 8 14 ];
+      vuizvui.machines.heinrich.internalInterface = "eth1";
+      vuizvui.machines.heinrich.externalInterface = "eth2";
+    };
+    hotelturm = { lib, ... }: {
+      imports = [ common ];
+      virtualisation.vlans = [ 8 ];
+      networking.useDHCP = false;
+      networking.interfaces.eth1.ip4 = lib.singleton {
+        address = "10.11.77.16";
+        prefixLength = 24;
+      };
+    };
+    moritz = { lib, ... }: {
+      imports = [ common ];
+      virtualisation.vlans = [ 14 ];
+      networking.useDHCP = false;
+      networking.interfaces.eth1.ip4 = lib.singleton {
+        address = "192.168.0.1";
+        prefixLength = 24;
+      };
+    };
+    client = {
+      imports = [ common ];
+      virtualisation.vlans = [ 1 ];
+    };
+  };
+
+  testScript = ''
+    startAll;
+    $heinrich->waitForUnit("dnsmasq.service");
+    $client->waitForUnit("network-interfaces.target");
+    $client->waitForUnit("network.target");
+
+    $client->succeed("ip addr >&2");
+  '';
+}
diff --git a/tests/make-test.nix b/tests/make-test.nix
new file mode 100644
index 00000000..d98ff87f
--- /dev/null
+++ b/tests/make-test.nix
@@ -0,0 +1,30 @@
+f: { system ? builtins.currentSystem, ... } @ args: let
+  nixpkgsPath = import ../nixpkgs-path.nix;
+
+  lib = import "${nixpkgsPath}/lib";
+
+  testLib = import "${nixpkgsPath}/nixos/lib/testing.nix" {
+    inherit system;
+  };
+
+  pkgs = import nixpkgsPath { inherit system; };
+
+  testArgs = if builtins.isFunction f then f (args // {
+    pkgs = pkgs // {
+      vuizvui = import ../pkgs { inherit pkgs; };
+    };
+  }) else f;
+
+  nodes = testArgs.nodes or (if testArgs ? machine then {
+    inherit (testArgs) machine;
+  } else {});
+
+  injectCommon = name: conf: {
+    imports = [ conf ] ++ import ../modules/module-list.nix;
+  };
+
+  testArgsWithCommon = removeAttrs testArgs [ "machine" ] // {
+    nodes = lib.mapAttrs injectCommon nodes;
+  };
+
+in testLib.makeTest testArgsWithCommon
diff --git a/tests/richi235/multipath-vpn.nix b/tests/richi235/multipath-vpn.nix
new file mode 100644
index 00000000..3595b074
--- /dev/null
+++ b/tests/richi235/multipath-vpn.nix
@@ -0,0 +1,189 @@
+{
+  name = "multipath-test";
+
+  nodes = let
+    common = { lib, ... }: {
+      networking.firewall.enable = false;
+      networking.useNetworkd = true;
+      systemd.network.netdevs."40-eth0".netdevConfig = {
+        Name = "eth0";
+        Kind = "dummy";
+      };
+    };
+
+  in {
+    client = { lib, ... }: {
+      imports = [ common ];
+      virtualisation.vlans = [ 10 ];
+      networking.defaultGateway = "42.0.0.1";
+      networking.interfaces.eth1.ip4 = lib.singleton {
+        address = "42.0.0.2";
+        prefixLength = 8;
+      };
+    };
+    mtc = { lib, nodes, ... }: {
+      imports = [ common ];
+      virtualisation.vlans = [ 1 2 10 ];
+      networking.interfaces.eth1.ip4 = lib.mkForce (lib.singleton {
+        address = "1.0.0.2";
+        prefixLength = 8;
+      });
+      networking.interfaces.eth2.ip4 = lib.mkForce (lib.singleton {
+        address = "2.0.0.2";
+        prefixLength = 8;
+      });
+      networking.interfaces.eth3.ip4 = lib.mkForce (lib.singleton {
+        address = "42.0.0.1";
+        prefixLength = 8;
+      });
+      systemd.network.networks."40-eth1".routes = lib.singleton {
+        routeConfig.Gateway = "1.0.0.1";
+        routeConfig.Destination = "10.0.0.0/8";
+      };
+      systemd.network.networks."40-eth2".routes = lib.singleton {
+        routeConfig.Gateway = "2.0.0.1";
+        routeConfig.Destination = "11.0.0.0/8";
+      };
+      vuizvui.services.multipath-vpn.client.enable = true;
+      vuizvui.services.multipath-vpn.client.links.vlan1 = {
+        interface = "eth1";
+        destAddress = "10.0.0.1";
+      };
+      vuizvui.services.multipath-vpn.client.links.vlan2 = {
+        interface = "eth2";
+        destAddress = "11.0.0.1";
+      };
+      vuizvui.services.multipath-vpn.client.tun = {
+        ip = "192.168.66.2";
+        mask = 24;
+      };
+      vuizvui.services.multipath-vpn.client.route = {
+        network = "0.0.0.0";
+        mask = 0;
+        gateway = "192.168.66.1";
+      };
+    };
+    relay1 = { lib, ... }: {
+      imports = [ common ];
+      virtualisation.vlans = [ 1 3 ];
+      networking.useDHCP = false;
+      networking.interfaces.eth1.ip4 = lib.mkForce (lib.singleton {
+        address = "1.0.0.1";
+        prefixLength = 8;
+      });
+      networking.interfaces.eth2.ip4 = lib.mkForce (lib.singleton {
+        address = "10.0.0.2";
+        prefixLength = 8;
+      });
+      systemd.network.networks."40-eth2".routes = lib.singleton {
+        routeConfig.Gateway = "10.0.0.1";
+        routeConfig.Destination = "10.0.0.0/8";
+      };
+      networking.nat.enable = true;
+      networking.nat.internalInterfaces = [ "eth1" ];
+      networking.nat.externalInterface = "eth2";
+    };
+    relay2 = { lib, ... }: {
+      imports = [ common ];
+      virtualisation.vlans = [ 2 4 ];
+      networking.useDHCP = false;
+      networking.interfaces.eth1.ip4 = lib.mkForce (lib.singleton {
+        address = "2.0.0.1";
+        prefixLength = 8;
+      });
+      networking.interfaces.eth2.ip4 = lib.mkForce (lib.singleton {
+        address = "11.0.0.2";
+        prefixLength = 8;
+      });
+      systemd.network.networks."40-eth2".routes = lib.singleton {
+        routeConfig.Gateway = "11.0.0.1";
+        routeConfig.Destination = "11.0.0.0/8";
+      };
+      networking.nat.enable = true;
+      networking.nat.internalInterfaces = [ "eth1" ];
+      networking.nat.externalInterface = "eth2";
+    };
+    mts = { lib, ... }: {
+      imports = [ common ];
+      virtualisation.vlans = [ 3 4 5 ];
+      networking.interfaces.eth1.ip4 = lib.mkForce (lib.singleton {
+        address = "10.0.0.1";
+        prefixLength = 8;
+      });
+      networking.interfaces.eth2.ip4 = lib.mkForce (lib.singleton {
+        address = "11.0.0.1";
+        prefixLength = 8;
+      });
+      networking.interfaces.eth3.ip4 = lib.mkForce (lib.singleton {
+        address = "6.6.6.42";
+        prefixLength = 8;
+      });
+      networking.nat.enable = true;
+      #networking.nat.internalInterfaces = [ "tun0" ];
+      networking.nat.externalInterface = "eth3";
+      vuizvui.services.multipath-vpn.server.enable = true;
+      vuizvui.services.multipath-vpn.server.links.vlan3 = {
+        interface = "eth1";
+        destAddress = "0"; # XXX
+        destPort = 0; # XXX
+      };
+      vuizvui.services.multipath-vpn.server.links.vlan4 = {
+        interface = "eth2";
+        destAddress = "0"; # XXX
+        destPort = 0; # XXX
+      };
+      vuizvui.services.multipath-vpn.server.tun = {
+        ip = "192.168.66.1";
+        mask = 24;
+      };
+      vuizvui.services.multipath-vpn.server.route = {
+        #network = "192.168.0.0";
+        #network = "6.0.0.0";
+        #mask = 8;
+        network = "0.0.0.0";
+        mask = 0;
+        gateway = "192.168.66.2";
+      };
+    };
+    zs = { lib, ... }: {
+      imports = [ common ];
+      virtualisation.vlans = [ 5 ];
+      networking.interfaces.eth1.ip4 = lib.mkForce (lib.singleton {
+        address = "6.6.6.23";
+        prefixLength = 8;
+      });
+    };
+  };
+
+  testScript = { nodes, ... }: ''
+    startAll;
+    $mtc->waitForUnit("multipath-vpn-client.service");
+    $mts->waitForUnit("multipath-vpn-server.service");
+
+    $mtc->sleep(30);
+
+    subtest "test network topology", sub {
+      $mtc->succeed("ping -c1 10.0.0.1 >&2");
+      $mtc->succeed("ping -c1 11.0.0.1 >&2");
+      $mts->succeed("ping -c1 6.6.6.23 >&2");
+    };
+
+    subtest "test tunnel connectivity", sub {
+      $client->execute("ifconfig >&2");
+      $client->execute("ip route >&2");
+      $zs->execute("ifconfig >&2");
+      $zs->execute("ip route >&2");
+
+      $mtc->execute("ifconfig >&2");
+      $mtc->execute("ip route >&2");
+      $mts->execute("ifconfig >&2");
+      $mts->execute("ip route >&2");
+
+      $mtc->succeed("ping -c1 192.168.66.1 >&2");
+      $mtc->succeed("ping -c1 6.6.6.23 >&2");
+
+      #$client->succeed("ping -c1 192.168.66.1 >&2");
+      $client->succeed("ping -c1 6.6.6.23 >&2");
+    };
+  '';
+}