diff --git a/Nix/Atoms.hs b/Nix/Atoms.hs
deleted file mode 100644
--- a/Nix/Atoms.hs
+++ /dev/null
@@ -1,48 +0,0 @@
-module Nix.Atoms where
-
-import Prelude
-import Data.Text (Text, pack)
-import GHC.Generics
-import Data.Data
-import Data.HashMap.Strict (HashMap)
-
--- | Atoms are values that evaluate to themselves. This means that
--- they appear in both the parsed AST (in the form of literals) and
--- the evaluated form.
-data NAtom
-  -- | An integer. The c nix implementation currently only supports
-  -- integers that fit in the range of 'Int64'.
-  = NInt !Integer
-  -- | Booleans.
-  | NBool !Bool
-  -- | Null values. There's only one of this variant.
-  | NNull
-  -- | URIs, which are just string literals, but do not need quotes.
-  | NUri !Text
-  deriving (Eq, Ord, Generic, Typeable, Data, Show)
-
-class ToAtom t where
-  toAtom :: t -> NAtom
-
-instance ToAtom Bool where toAtom = NBool
-instance ToAtom Int where toAtom = NInt . fromIntegral
-instance ToAtom Integer where toAtom = NInt
-
-class FromAtom t where
-  fromAtom :: NAtom -> t
-  fromAtoms :: [NAtom] -> t
-  fromAtomSet :: HashMap Text NAtom -> t
-
--- | Convert a primitive into something which can be made from a
--- constant. So for example `convert 1 :: Expression`
-convert :: (ToAtom prim, FromAtom t) => prim -> t
-convert = fromAtom . toAtom
-
--- | Conversion to environment variables for constants.
-atomToEnvString :: NAtom -> Text
-atomToEnvString = \case
-  NInt i -> pack $ show i
-  NBool True -> "1"
-  NBool False -> ""
-  NNull -> ""
-  NUri uri -> uri
diff --git a/Nix/Eval.hs b/Nix/Eval.hs
deleted file mode 100644
--- a/Nix/Eval.hs
+++ /dev/null
@@ -1,240 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE LambdaCase #-}
-{-# LANGUAGE RecursiveDo #-}
-module Nix.Eval where
-
-import           Control.Applicative
-import           Control.Arrow
-import           Control.Monad hiding (mapM, sequence)
-import           Control.Monad.Fix
-import           Data.Fix
-import           Data.Foldable (foldl')
-import qualified Data.Map as Map
-import           Data.Text (Text)
-import qualified Data.Text as Text
-import           Data.Traversable as T
-import           Data.Typeable (Typeable)
-import           GHC.Generics
-import           Nix.Pretty (atomText)
-import           Nix.StringOperations (runAntiquoted)
-import           Nix.Atoms
-import           Nix.Expr
-import           Prelude hiding (mapM, sequence)
-
--- | An 'NValue' is the most reduced form of an 'NExpr' after evaluation
--- is completed.
-data NValueF m r
-    = NVConstant NAtom
-    | NVStr Text
-    | NVList [r]
-    | NVSet (Map.Map Text r)
-    | NVFunction (Params r) (NValue m -> m r)
-    | NVLiteralPath FilePath
-    | NVEnvPath FilePath
-    deriving (Generic, Typeable, Functor)
-
-instance Show f => Show (NValueF m f) where
-    showsPrec = flip go where
-      go (NVConstant atom) = showsCon1 "NVConstant" atom
-      go (NVStr      text) = showsCon1 "NVStr"      text
-      go (NVList     list) = showsCon1 "NVList"     list
-      go (NVSet     attrs) = showsCon1 "NVSet"      attrs
-      go (NVFunction r _)  = showsCon1 "NVFunction" r
-      go (NVLiteralPath p) = showsCon1 "NVLiteralPath" p
-      go (NVEnvPath p)     = showsCon1 "NVEnvPath" p
-
-      showsCon1 :: Show a => String -> a -> Int -> String -> String
-      showsCon1 con a d = showParen (d > 10) $ showString (con ++ " ") . showsPrec 11 a
-
-type NValue m = Fix (NValueF m)
-
-valueText :: Functor m => NValue m -> Text
-valueText = cata phi where
-    phi (NVConstant a)    = atomText a
-    phi (NVStr t)         = t
-    phi (NVList _)        = error "Cannot coerce a list to a string"
-    phi (NVSet _)         = error "Cannot coerce a set to a string"
-    phi (NVFunction _ _)  = error "Cannot coerce a function to a string"
-    phi (NVLiteralPath p) = Text.pack p
-    phi (NVEnvPath p)     = Text.pack p
-
-buildArgument :: Params (NValue m) -> NValue m -> NValue m
-buildArgument paramSpec arg = either error (Fix . NVSet) $ case paramSpec of
-    Param name -> return $ Map.singleton name arg
-    ParamSet (FixedParamSet s) Nothing -> lookupParamSet s
-    ParamSet (FixedParamSet s) (Just name) ->
-      Map.insert name arg <$> lookupParamSet s
-    ParamSet _ _ -> error "Can't yet handle variadic param sets"
-  where
-    go env k def = maybe (Left err) return $ Map.lookup k env <|> def
-      where err = "Could not find " ++ show k
-    lookupParamSet s = case arg of
-        Fix (NVSet env) -> Map.traverseWithKey (go env) s
-        _               -> Left "Unexpected function environment"
-
-evalExpr :: MonadFix m => NExpr -> NValue m -> m (NValue m)
-evalExpr = cata phi
-  where
-    phi (NSym var) = \env -> case env of
-      Fix (NVSet s) -> maybe err return $ Map.lookup var s
-      _ -> error "invalid evaluation environment"
-     where err = error ("Undefined variable: " ++ show var)
-    phi (NConstant x) = const $ return $ Fix $ NVConstant x
-    phi (NStr str) = fmap (Fix . NVStr) . flip evalString str
-    phi (NLiteralPath p) = const $ return $ Fix $ NVLiteralPath p
-    phi (NEnvPath p) = const $ return $ Fix $ NVEnvPath p
-
-    phi (NUnary op arg) = \env -> arg env >>= \case
-      Fix (NVConstant c) -> pure $ Fix $ NVConstant $ case (op, c) of
-        (NNeg, NInt  i) -> NInt  (-i)
-        (NNot, NBool b) -> NBool (not b)
-        _               -> error $ "unsupported argument type for unary operator " ++ show op
-      _ -> error "argument to unary operator must evaluate to an atomic type"
-    phi (NBinary op larg rarg) = \env -> do
-      lval <- larg env
-      rval <- rarg env
-      case (lval, rval) of
-       (Fix (NVConstant lc), Fix (NVConstant rc)) -> pure $ Fix $ NVConstant $ case (op, lc, rc) of
-         (NEq,  l, r) -> NBool $ l == r
-         (NNEq, l, r) -> NBool $ l /= r
-         (NLt,  l, r) -> NBool $ l <  r
-         (NLte, l, r) -> NBool $ l <= r
-         (NGt,  l, r) -> NBool $ l >  r
-         (NGte, l, r) -> NBool $ l >= r
-         (NAnd,  NBool l, NBool r) -> NBool $ l && r
-         (NOr,   NBool l, NBool r) -> NBool $ l || r
-         (NImpl, NBool l, NBool r) -> NBool $ not l || r
-         (NPlus,  NInt l, NInt r) -> NInt $ l + r
-         (NMinus, NInt l, NInt r) -> NInt $ l - r
-         (NMult,  NInt l, NInt r) -> NInt $ l * r
-         (NDiv,   NInt l, NInt r) -> NInt $ l `div` r
-         _ -> error $ "unsupported argument types for binary operator " ++ show op
-       (Fix (NVStr ls), Fix (NVStr rs)) -> case op of
-         NConcat -> pure $ Fix $ NVStr $ ls `mappend` rs
-         _ -> error $ "unsupported argument types for binary operator " ++ show op
-       (Fix (NVSet ls), Fix (NVSet rs)) -> case op of
-         NUpdate -> pure $ Fix $ NVSet $ rs `Map.union` ls
-         _ -> error $ "unsupported argument types for binary operator " ++ show op
-       _ -> error $ "unsupported argument types for binary operator " ++ show op
-
-    phi (NSelect aset attr alternative) = go where
-      go env = do
-        aset' <- aset env
-        ks    <- evalSelector True env attr
-        case extract aset' ks of
-         Just v  -> pure v
-         Nothing -> case alternative of
-           Just v  -> v env
-           Nothing -> error "could not look up attribute in value"
-      extract (Fix (NVSet s)) (k:ks) = case Map.lookup k s of
-                                        Just v  -> extract v ks
-                                        Nothing -> Nothing
-      extract               _  (_:_) = Nothing
-      extract               v     [] = Just v
-
-    phi (NHasAttr aset attr) = \env -> aset env >>= \case
-      Fix (NVSet s) -> evalSelector True env attr >>= \case
-        [keyName] -> pure $ Fix $ NVConstant $ NBool $ keyName `Map.member` s
-        _ -> error "attribute name argument to hasAttr is not a single-part name"
-      _ -> error "argument to hasAttr has wrong type"
-
-    phi (NList l) = \env ->
-        Fix . NVList <$> mapM ($ env) l
-
-    phi (NSet binds) = \env -> Fix . NVSet <$> evalBinds True env binds
-
-    phi (NRecSet binds) = \env -> case env of
-      (Fix (NVSet env')) -> do
-        rec
-          mergedEnv <- pure $ Fix $ NVSet $ evaledBinds `Map.union` env'
-          evaledBinds <- evalBinds True mergedEnv binds
-        pure mergedEnv
-      _ -> error "invalid evaluation environment"
-
-    phi (NLet binds e) = \env -> case env of
-      (Fix (NVSet env')) -> do
-        rec
-          mergedEnv   <- pure $ Fix $ NVSet $ evaledBinds `Map.union` env'
-          evaledBinds <- evalBinds True mergedEnv binds
-        e mergedEnv
-      _ -> error "invalid evaluation environment"
-
-    phi (NIf cond t f) = \env -> do
-      (Fix cval) <- cond env
-      case cval of
-        NVConstant (NBool True) -> t env
-        NVConstant (NBool False) -> f env
-        _ -> error "condition must be a boolean"
-
-    phi (NWith scope e) = \env -> case env of
-      (Fix (NVSet env')) -> do
-        s <- scope env
-        case s of
-          (Fix (NVSet scope')) -> e . Fix . NVSet $ Map.union scope' env'
-          _ -> error "scope must be a set in with statement"
-      _ -> error "invalid evaluation environment"
-
-    phi (NAssert cond e) = \env -> do
-      (Fix cond') <- cond env
-      case cond' of
-        (NVConstant (NBool True)) -> e env
-        (NVConstant (NBool False)) -> error "assertion failed"
-        _ -> error "assertion condition must be boolean"
-
-    phi (NApp fun x) = \env -> do
-        fun' <- fun env
-        case fun' of
-            Fix (NVFunction argset f) -> do
-                arg <- x env
-                let arg' = buildArgument argset arg
-                f arg'
-            _ -> error "Attempt to call non-function"
-
-    phi (NAbs a b) = \env -> do
-        -- jww (2014-06-28): arglists should not receive the current
-        -- environment, but rather should recursively view their own arg
-        -- set
-        args <- traverse ($ env) a
-        return $ Fix $ NVFunction args b
-
-evalString :: Monad m
-           => NValue m -> NString (NValue m -> m (NValue m)) -> m Text
-evalString env nstr = do
-  let fromParts parts = Text.concat <$>
-        mapM (runAntiquoted return (fmap valueText . ($ env))) parts
-  case nstr of
-    Indented parts -> fromParts parts
-    DoubleQuoted parts -> fromParts parts
-
-evalBinds :: Monad m => Bool -> NValue m ->
-             [Binding (NValue m -> m (NValue m))] ->
-             m (Map.Map Text (NValue m))
-evalBinds allowDynamic env xs = buildResult <$> sequence (concatMap go xs) where
-  buildResult :: [([Text], NValue m)] -> Map.Map Text (NValue m)
-  buildResult = foldl' insert Map.empty . map (first reverse) where
-    insert _ ([], _) = error "invalid selector with no components"
-    insert m (p:ps, v) = modifyPath ps (insertIfNotMember p v) where
-      alreadyDefinedErr = error $ "attribute " ++ attr ++ " already defined"
-      attr = show $ Text.intercalate "." $ reverse (p:ps)
-
-      modifyPath [] f = f m
-      modifyPath (x:parts) f = modifyPath parts $ \m' -> case Map.lookup x m' of
-        Nothing                -> Map.singleton x $ g Map.empty
-        Just (Fix (NVSet m'')) -> Map.insert x (g m'') m'
-        Just _                 -> alreadyDefinedErr
-       where g = Fix . NVSet . f
-
-      insertIfNotMember k x m'
-        | Map.notMember k m' = Map.insert k x m'
-        | otherwise = alreadyDefinedErr
-
-  -- TODO: Inherit
-  go (NamedVar x y) = [liftM2 (,) (evalSelector allowDynamic env x) (y env)]
-  go _ = [] -- HACK! But who cares right now
-
-evalSelector :: Monad m => Bool -> NValue m -> NAttrPath (NValue m -> m (NValue m)) -> m [Text]
-evalSelector dyn env = mapM evalKeyName where
-  evalKeyName (StaticKey k) = return k
-  evalKeyName (DynamicKey k)
-    | dyn       = runAntiquoted (evalString env) (fmap valueText . ($ env)) k
-    | otherwise = error "dynamic attribute not allowed in this context"
diff --git a/Nix/Expr.hs b/Nix/Expr.hs
deleted file mode 100644
--- a/Nix/Expr.hs
+++ /dev/null
@@ -1,10 +0,0 @@
--- | Wraps the expression submodules.
-module Nix.Expr (
-  module Nix.Expr.Types,
-  module Nix.Expr.Types.Annotated,
-  module Nix.Expr.Shorthands
-  ) where
-
-import Nix.Expr.Types
-import Nix.Expr.Shorthands
-import Nix.Expr.Types.Annotated
diff --git a/Nix/Expr/Shorthands.hs b/Nix/Expr/Shorthands.hs
deleted file mode 100644
--- a/Nix/Expr/Shorthands.hs
+++ /dev/null
@@ -1,238 +0,0 @@
--- | A bunch of shorthands for making nix expressions.
---
--- Functions with an @F@ suffix return a more general type without the outer
--- 'Fix' wrapper.
-module Nix.Expr.Shorthands where
-
-import Prelude
-import Data.Monoid
-import Data.Text (Text)
-import Data.Fix
-import qualified Data.Map as Map
-import Nix.Atoms
-import Nix.Expr.Types
-import Text.Regex.TDFA.Text ()
-import Text.Regex.TDFA ((=~))
-
--- | Make an integer literal expression.
-mkInt :: Integer -> NExpr
-mkInt = Fix . mkIntF
-
-mkIntF :: Integer -> NExprF a
-mkIntF = NConstant . NInt
-
--- | Make a regular (double-quoted) string.
-mkStr :: Text -> NExpr
-mkStr = Fix . NStr . DoubleQuoted . \case
-  "" -> []
-  x -> [Plain x]
-
--- | Make an indented string.
-mkIndentedStr :: Text -> NExpr
-mkIndentedStr = Fix . NStr . Indented . \case
-  "" -> []
-  x -> [Plain x]
-
--- | Make a literal URI expression.
-mkUri :: Text -> NExpr
-mkUri = Fix . mkUriF
-
-mkUriF :: Text -> NExprF a
-mkUriF = NConstant . NUri
-
--- | Make a path. Use 'True' if the path should be read from the
--- environment, else 'False'.
-mkPath :: Bool -> FilePath -> NExpr
-mkPath b = Fix . mkPathF b
-
-mkPathF :: Bool -> FilePath -> NExprF a
-mkPathF False = NLiteralPath
-mkPathF True = NEnvPath
-
--- | Make a path expression which pulls from the NIX_PATH env variable.
-mkEnvPath :: FilePath -> NExpr
-mkEnvPath = Fix . mkEnvPathF
-
-mkEnvPathF :: FilePath -> NExprF a
-mkEnvPathF = mkPathF True
-
--- | Make a path expression which references a relative path.
-mkRelPath :: FilePath -> NExpr
-mkRelPath = Fix . mkRelPathF
-
-mkRelPathF :: FilePath -> NExprF a
-mkRelPathF = mkPathF False
-
--- | Make a variable (symbol)
-mkSym :: Text -> NExpr
-mkSym = Fix . mkSymF
-
-mkSymF :: Text -> NExprF a
-mkSymF = NSym
-
-mkSelector :: Text -> NAttrPath NExpr
-mkSelector = (:[]) . StaticKey
-
-mkBool :: Bool -> NExpr
-mkBool = Fix . mkBoolF
-
-mkBoolF :: Bool -> NExprF a
-mkBoolF = NConstant . NBool
-
-mkNull :: NExpr
-mkNull = Fix mkNullF
-
-mkNullF :: NExprF a
-mkNullF = NConstant NNull
-
-mkOper :: NUnaryOp -> NExpr -> NExpr
-mkOper op = Fix . NUnary op
-
-mkOper2 :: NBinaryOp -> NExpr -> NExpr -> NExpr
-mkOper2 op a = Fix . NBinary op a
-
-mkParamset :: [(Text, Maybe NExpr)] -> Params NExpr
-mkParamset params = ParamSet (mkFixedParamSet params) Nothing
-
-mkFixedParamSet :: [(Text, Maybe NExpr)] -> ParamSet NExpr
-mkFixedParamSet ps = FixedParamSet (Map.fromList ps)
-
-mkVariadicParamSet :: [(Text, Maybe NExpr)] -> ParamSet NExpr
-mkVariadicParamSet ps = VariadicParamSet (Map.fromList ps)
-
-mkApp :: NExpr -> NExpr -> NExpr
-mkApp e = Fix . NApp e
-
-mkRecSet :: [Binding NExpr] -> NExpr
-mkRecSet = Fix . NRecSet
-
-mkNonRecSet :: [Binding NExpr] -> NExpr
-mkNonRecSet = Fix . NSet
-
-mkLets :: [Binding NExpr] -> NExpr -> NExpr
-mkLets bindings = Fix . NLet bindings
-
-mkList :: [NExpr] -> NExpr
-mkList = Fix . NList
-
-mkWith :: NExpr -> NExpr -> NExpr
-mkWith e = Fix . NWith e
-
-mkAssert :: NExpr -> NExpr -> NExpr
-mkAssert e = Fix . NWith e
-
-mkIf :: NExpr -> NExpr -> NExpr -> NExpr
-mkIf e1 e2 = Fix . NIf e1 e2
-
-mkFunction :: Params NExpr -> NExpr -> NExpr
-mkFunction params = Fix . NAbs params
-
-mkDot :: NExpr -> Text -> NExpr
-mkDot e key = mkDots e [key]
-
-mkDots :: NExpr -> [Text] -> NExpr
-mkDots e keys = Fix $ NSelect e (toKey <$> keys) Nothing
-  where
-    toKey :: Text -> NKeyName NExpr
-    toKey k = (if isPlainSymbol k then StaticKey else dynamicKey) k
-    -- | Make a dynamic key name that is only enclosed in double quotes
-    -- (no antiquotes).
-    dynamicKey :: Text -> NKeyName NExpr
-    dynamicKey k = DynamicKey $ Plain $ DoubleQuoted [Plain k]
-    -- | Check if it’s a valid nix symbol
-    -- the nix lexer regex for IDs (symbols) is [a-zA-Z\_][a-zA-Z0-9\_\'\-]*
-    isPlainSymbol :: Text -> Bool
-    isPlainSymbol s = s =~ ("^[a-zA-Z_][a-zA-Z0-9_'-]*$" :: Text)
-
--- | An `inherit` clause without an expression to pull from.
-inherit :: [NKeyName e] -> Binding e
-inherit = Inherit Nothing
-
--- | An `inherit` clause with an expression to pull from.
-inheritFrom :: e -> [NKeyName e] -> Binding e
-inheritFrom expr = Inherit (Just expr)
-
--- | Shorthand for producing a binding of a name to an expression.
-bindTo :: Text -> NExpr -> Binding NExpr
-bindTo name val = NamedVar (mkSelector name) val
-
--- | Infix version of bindTo.
-($=) :: Text -> NExpr -> Binding NExpr
-name $= value = bindTo name value
-
-infixr 2 $=
-
--- | Append a list of bindings to a set or let expression.
--- For example, adding `[a = 1, b = 2]` to `let c = 3; in 4` produces
--- `let a = 1; b = 2; c = 3; in 4`.
-appendBindings :: [Binding NExpr] -> NExpr -> NExpr
-appendBindings newBindings (Fix e) = case e of
-  NLet bindings e' -> Fix $ NLet (bindings <> newBindings) e'
-  NSet bindings -> Fix $ NSet (bindings <> newBindings)
-  NRecSet bindings -> Fix $ NRecSet (bindings <> newBindings)
-  _ -> error "Can only append bindings to a set or a let"
-
--- | Applies a transformation to the body of a nix function.
-modifyFunctionBody :: (NExpr -> NExpr) -> NExpr -> NExpr
-modifyFunctionBody f (Fix e) = case e of
-  NAbs params body -> Fix $ NAbs params (f body)
-  _ -> error "Not a function"
-
--- | A let statement with multiple assignments.
-letsE :: [(Text, NExpr)] -> NExpr -> NExpr
-letsE pairs = Fix . NLet (map (uncurry bindTo) pairs)
-
--- | Wrapper for a single-variable @let@.
-letE :: Text -> NExpr -> NExpr -> NExpr
-letE varName varExpr = letsE [(varName, varExpr)]
-
--- | Make an attribute set (non-recursive).
-attrsE :: [(Text, NExpr)] -> NExpr
-attrsE pairs = Fix $ NSet (map (uncurry bindTo) pairs)
-
--- | Make an attribute set (recursive).
-recAttrsE :: [(Text, NExpr)] -> NExpr
-recAttrsE pairs = Fix $ NRecSet (map (uncurry bindTo) pairs)
-
--- | Logical negation.
-mkNot :: NExpr -> NExpr
-mkNot = Fix . NUnary NNot
-
--- | Dot-reference into an attribute set.
-(!.) :: NExpr -> Text -> NExpr
-(!.) = mkDot
-infixl 8 !.
-
-mkBinop :: NBinaryOp -> NExpr -> NExpr -> NExpr
-mkBinop op e1 e2 = Fix (NBinary op e1 e2)
-
--- | Various nix binary operators
-($==), ($!=), ($<), ($<=), ($>), ($>=), ($&&), ($||), ($->),
-  ($//), ($+), ($-), ($*), ($/), ($++)
-  :: NExpr -> NExpr -> NExpr
-e1 $== e2 = mkBinop NEq e1 e2
-e1 $!= e2 = mkBinop NNEq e1 e2
-e1 $< e2 = mkBinop NLt e1 e2
-e1 $<= e2 = mkBinop NLte e1 e2
-e1 $> e2 = mkBinop NGt e1 e2
-e1 $>= e2 = mkBinop NGte e1 e2
-e1 $&& e2 = mkBinop NAnd e1 e2
-e1 $|| e2 = mkBinop NOr e1 e2
-e1 $-> e2 = mkBinop NImpl e1 e2
-e1 $// e2 = mkBinop NUpdate e1 e2
-e1 $+ e2 = mkBinop NPlus e1 e2
-e1 $- e2 = mkBinop NMinus e1 e2
-e1 $* e2 = mkBinop NMult e1 e2
-e1 $/ e2 = mkBinop NDiv e1 e2
-e1 $++ e2 = mkBinop NConcat e1 e2
-
--- | Function application expression.
-(@@) :: NExpr -> NExpr -> NExpr
-(@@) = mkApp
-infixl 1 @@
-
--- | Lambda shorthand.
-(==>) :: Params NExpr -> NExpr -> NExpr
-(==>) = mkFunction
-
-infixr 1 ==>
diff --git a/Nix/Expr/Types.hs b/Nix/Expr/Types.hs
deleted file mode 100644
--- a/Nix/Expr/Types.hs
+++ /dev/null
@@ -1,272 +0,0 @@
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE DeriveTraversable #-}
-{-# LANGUAGE DeriveFoldable #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveFunctor #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE LambdaCase #-}
-{-# LANGUAGE TemplateHaskell #-}
--- | The nix expression type and supporting types.
-module Nix.Expr.Types where
-
-import           Control.Monad hiding (forM_, mapM, sequence)
-import           Data.Data
-import           Data.Eq.Deriving
-import           Data.Fix
-import           Data.Foldable
-import           Data.Functor.Classes (Eq1(..), Eq2(..), Show1(..), showsUnaryWith, liftShowsPrec2)
-import           Data.Map (Map, toList)
-import           Data.Text (Text, pack)
-import           Data.Traversable
-import           GHC.Exts
-import           GHC.Generics
-import           Nix.Atoms
-import           Prelude hiding (readFile, concat, concatMap, elem, mapM,
-                                 sequence, minimum, foldr)
-import           Text.Show.Deriving
-
--- | The main nix expression type. This is polymorphic so that it can be made
--- a functor, which allows us to traverse expressions and map functions over
--- them. The actual 'NExpr' type is a fixed point of this functor, defined
--- below.
-data NExprF r
-  = NConstant !NAtom
-  -- ^ Constants: ints, bools, URIs, and null.
-  | NStr !(NString r)
-  -- ^ A string, with interpolated expressions.
-  | NSym !Text
-  -- ^ A variable. For example, in the expression @f a@, @f@ is represented
-  -- as @NSym "f"@ and @a@ as @NSym "a"@.
-  | NList ![r]
-  -- ^ A list literal.
-  | NSet ![Binding r]
-  -- ^ An attribute set literal, not recursive.
-  | NRecSet ![Binding r]
-  -- ^ An attribute set literal, recursive.
-  | NLiteralPath !FilePath
-  -- ^ A path expression, which is evaluated to a store path. The path here
-  -- can be relative, in which case it's evaluated relative to the file in
-  -- which it appears.
-  | NEnvPath !FilePath
-  -- ^ A path which refers to something in the Nix search path (the NIX_PATH
-  -- environment variable. For example, @<nixpkgs/pkgs>@.
-  | NUnary !NUnaryOp !r
-  -- ^ Application of a unary operator to an expression.
-  | NBinary !NBinaryOp !r !r
-  -- ^ Application of a binary operator to two expressions.
-  | NSelect !r !(NAttrPath r) !(Maybe r)
-  -- ^ Dot-reference into an attribute set, optionally providing an
-  -- alternative if the key doesn't exist.
-  | NHasAttr !r !(NAttrPath r)
-  -- ^ Ask if a set contains a given attribute path.
-  | NAbs !(Params r) !r
-  -- ^ A function literal (lambda abstraction).
-  | NApp !r !r
-  -- ^ Apply a function to an argument.
-  | NLet ![Binding r] !r
-  -- ^ Evaluate the second argument after introducing the bindings.
-  | NIf !r !r !r
-  -- ^ If-then-else statement.
-  | NWith !r !r
-  -- ^ Evaluate an attribute set, bring its bindings into scope, and
-  -- evaluate the second argument.
-  | NAssert !r !r
-  -- ^ Assert that the first returns true before evaluating the second.
-  deriving (Ord, Eq, Generic, Typeable, Data, Functor, Foldable, Traversable, Show)
-
--- | We make an `IsString` for expressions, where the string is interpreted
--- as an identifier. This is the most common use-case...
-instance IsString NExpr where
-  fromString = Fix . NSym . fromString
-
-
--- | The monomorphic expression type is a fixed point of the polymorphic one.
-type NExpr = Fix NExprF
-
--- | A single line of the bindings section of a let expression or of a set.
-data Binding r
-  = NamedVar !(NAttrPath r) !r
-  -- ^ An explicit naming, such as @x = y@ or @x.y = z@.
-  | Inherit !(Maybe r) ![NKeyName r]
-  -- ^ Using a name already in scope, such as @inherit x;@ which is shorthand
-  -- for @x = x;@ or @inherit (x) y;@ which means @y = x.y;@.
-  deriving (Typeable, Data, Ord, Eq, Functor, Foldable, Traversable, Show)
-
--- | @Params@ represents all the ways the formal parameters to a
--- function can be represented.
-data Params r
-  = Param !Text
-  -- ^ For functions with a single named argument, such as @x: x + 1@.
-  | ParamSet !(ParamSet r) !(Maybe Text)
-  -- ^ Explicit parameters (argument must be a set). Might specify a name
-  -- to bind to the set in the function body.
-  deriving (Ord, Eq, Generic, Typeable, Data, Functor, Show,
-            Foldable, Traversable)
-
-instance IsString (Params r) where
-  fromString = Param . fromString
-
--- | An explicit parameter set; provides a shorthand for unpacking arguments.
-data ParamSet r
-  = FixedParamSet !(Map Text (Maybe r))
-  -- ^ A fixed set, where no arguments beyond what is specified in the map
-  -- may be given. The map might contain defaults for arguments not passed.
-  | VariadicParamSet !(Map Text (Maybe r))
-  -- ^ Same as the 'FixedParamSet', but extra arguments are allowed.
-  deriving (Ord, Eq, Generic, Typeable, Data, Functor, Show,
-            Foldable, Traversable)
-
-instance Eq1 ParamSet where
-  liftEq eq (FixedParamSet a) (FixedParamSet b) =
-    liftEq (liftEq (liftEq eq)) (Data.Map.toList a) (Data.Map.toList b)
-  liftEq eq (VariadicParamSet a) (VariadicParamSet b) =
-    liftEq (liftEq (liftEq eq)) (Data.Map.toList a) (Data.Map.toList b)
-  liftEq _ _ _ = False
-
--- It's not possible to derive this automatically as there is no Show1 instance
--- for Map. We define one locally here.
-instance Show1 ParamSet where
-  liftShowsPrec sp sl p =
-    let liftShowsPrecMap :: (Int -> a -> ShowS)
-                         -> ([a] -> ShowS)
-                         -> Int
-                         -> Map Text a
-                         -> ShowS
-        liftShowsPrecMap spMap slMap pMap m =
-          showsUnaryWith (liftShowsPrec (liftShowsPrec spMap slMap)
-                                        (liftShowList spMap slMap))
-                         "fromList" pMap (Data.Map.toList m)
-        showNamedMap s =
-          showsUnaryWith (liftShowsPrecMap (liftShowsPrec sp sl)
-                                           (liftShowList sp sl))
-                         s p
-    in \case
-      FixedParamSet m    -> showNamedMap "FixedParamSet" m
-      VariadicParamSet m -> showNamedMap "VariadicParamSet" m
-
--- | 'Antiquoted' represents an expression that is either
--- antiquoted (surrounded by ${...}) or plain (not antiquoted).
-data Antiquoted v r = Plain !v | Antiquoted !r
-  deriving (Ord, Eq, Generic, Typeable, Data, Functor, Foldable, Traversable, Show)
-
--- | An 'NString' is a list of things that are either a plain string
--- or an antiquoted expression. After the antiquotes have been evaluated,
--- the final string is constructed by concating all the parts.
-data NString r
-  = DoubleQuoted ![Antiquoted Text r]
-  -- ^ Strings wrapped with double-quotes (") are not allowed to contain
-  -- literal newline characters.
-  | Indented ![Antiquoted Text r]
-  -- ^ Strings wrapped with two single quotes ('') can contain newlines,
-  -- and their indentation will be stripped.
-  deriving (Eq, Ord, Generic, Typeable, Data, Functor, Foldable, Traversable, Show)
-
--- | For the the 'IsString' instance, we use a plain doublequoted string.
-instance IsString (NString r) where
-  fromString "" = DoubleQuoted []
-  fromString string = DoubleQuoted [Plain $ pack string]
-
--- | A 'KeyName' is something that can appear at the right side of an
--- equals sign. For example, @a@ is a 'KeyName' in @{ a = 3; }@, @let a = 3;
--- in ...@, @{}.a@ or @{} ? a@.
---
--- Nix supports both static keynames (just an identifier) and dynamic
--- identifiers. Dynamic identifiers can be either a string (e.g.:
--- @{ "a" = 3; }@) or an antiquotation (e.g.: @let a = "example";
--- in { ${a} = 3; }.example@).
---
--- Note: There are some places where a dynamic keyname is not allowed.
--- In particular, those include:
---
---   * The RHS of a @binding@ inside @let@: @let ${"a"} = 3; in ...@
---     produces a syntax error.
---   * The attribute names of an 'inherit': @inherit ${"a"};@ is forbidden.
---
--- Note: In Nix, a simple string without antiquotes such as @"foo"@ is
--- allowed even if the context requires a static keyname, but the
--- parser still considers it a 'DynamicKey' for simplicity.
-data NKeyName r
-  = DynamicKey !(Antiquoted (NString r) r)
-  | StaticKey !Text
-  deriving (Eq, Ord, Generic, Typeable, Data, Show)
-
--- | Most key names are just static text, so this instance is convenient.
-instance IsString (NKeyName r) where
-  fromString = StaticKey . fromString
-
-instance Eq1 NKeyName where
-  liftEq eq (DynamicKey a) (DynamicKey b) = liftEq2 (liftEq eq) eq a b
-  liftEq _ (StaticKey a) (StaticKey b) = a == b
-  liftEq _ _ _ = False
-
--- Deriving this instance automatically is not possible because @r@
--- occurs not only as last argument in @Antiquoted (NString r) r@
-instance Show1 NKeyName where
-  liftShowsPrec sp sl p = \case
-    DynamicKey a -> showsUnaryWith (liftShowsPrec2 (liftShowsPrec sp sl) (liftShowList sp sl) sp sl) "DynamicKey" p a
-    StaticKey t  -> showsUnaryWith showsPrec "StaticKey" p t
-
--- Deriving this instance automatically is not possible because @r@
--- occurs not only as last argument in @Antiquoted (NString r) r@
-instance Functor NKeyName where
-  fmap = fmapDefault
-
--- Deriving this instance automatically is not possible because @r@
--- occurs not only as last argument in @Antiquoted (NString r) r@
-instance Foldable NKeyName where
-  foldMap = foldMapDefault
-
--- Deriving this instance automatically is not possible because @r@
--- occurs not only as last argument in @Antiquoted (NString r) r@
-instance Traversable NKeyName where
-  traverse f = \case
-    DynamicKey (Plain str)    -> DynamicKey . Plain <$> traverse f str
-    DynamicKey (Antiquoted e) -> DynamicKey . Antiquoted <$> f e
-    StaticKey key -> pure (StaticKey key)
-
--- | A selector (for example in a @let@ or an attribute set) is made up
--- of strung-together key names.
-type NAttrPath r = [NKeyName r]
-
--- | There are two unary operations: logical not and integer negation.
-data NUnaryOp = NNeg | NNot
-  deriving (Eq, Ord, Generic, Typeable, Data, Show)
-
--- | Binary operators expressible in the nix language.
-data NBinaryOp
-  = NEq -- ^ Equality (==)
-  | NNEq -- ^ Inequality (!=)
-  | NLt -- ^ Less than (<)
-  | NLte -- ^ Less than or equal (<=)
-  | NGt -- ^ Greater than (>)
-  | NGte -- ^ Greater than or equal (>=)
-  | NAnd -- ^ Logical and (&&)
-  | NOr -- ^ Logical or (||)
-  | NImpl -- ^ Logical implication (->)
-  | NUpdate -- ^ Joining two attribut sets (//)
-  | NPlus -- ^ Addition (+)
-  | NMinus -- ^ Subtraction (-)
-  | NMult -- ^ Multiplication (*)
-  | NDiv -- ^ Division (/)
-  | NConcat -- ^ List concatenation (++)
-  deriving (Eq, Ord, Generic, Typeable, Data, Show)
-
--- | Get the name out of the parameter (there might be none).
-paramName :: Params r -> Maybe Text
-paramName (Param n) = Just n
-paramName (ParamSet _ n) = n
-
-$(deriveEq1 ''NExprF)
-$(deriveEq1 ''NString)
-$(deriveEq1 ''Binding)
-$(deriveEq1 ''Params)
-$(deriveEq1 ''Antiquoted)
-$(deriveEq2 ''Antiquoted)
-
-$(deriveShow1 ''NExprF)
-$(deriveShow1 ''NString)
-$(deriveShow1 ''Params)
-$(deriveShow1 ''Binding)
-$(deriveShow1 ''Antiquoted)
-$(deriveShow2 ''Antiquoted)
diff --git a/Nix/Expr/Types/Annotated.hs b/Nix/Expr/Types/Annotated.hs
deleted file mode 100644
--- a/Nix/Expr/Types/Annotated.hs
+++ /dev/null
@@ -1,90 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveFunctor      #-}
-{-# LANGUAGE DeriveFoldable     #-}
-{-# LANGUAGE DeriveTraversable  #-}
-{-# LANGUAGE PatternSynonyms    #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE FlexibleInstances  #-}
-{-# LANGUAGE LambdaCase         #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE TemplateHaskell    #-}
-
--- | The source location annotated nix expression type and supporting types.
---
-module Nix.Expr.Types.Annotated
-  ( module Nix.Expr.Types.Annotated
-  , Delta(..)
-  )where
-
-import           Control.Monad        hiding (forM_, mapM, sequence)
-import           Data.Data
-import           Data.Fix
-import           Data.Function        (on)
-import           Data.Functor.Compose
-import           Data.Semigroup
-import           GHC.Generics
-import           Nix.Expr.Types
-import           Nix.Parser.Library   (Delta(..))
-import           Prelude              hiding (concat, concatMap, elem, foldr,
-                                       mapM, minimum, readFile, sequence)
-import           Text.Show.Deriving
-
--- | A location in a source file
-data SrcSpan = SrcSpan{ spanBegin :: Delta
-                      , spanEnd   :: Delta
-                      }
-  deriving (Ord, Eq, Generic, Typeable, Data, Show)
-
--- | A type constructor applied to a type along with an annotation
---
--- Intended to be used with 'Fix':
--- @type MyType = Fix (Compose (Ann Annotation) F)@
-data Ann ann a = Ann{ annotation :: ann
-                    , annotated  :: a
-                    }
-  deriving (Ord, Eq, Data, Generic, Typeable, Functor, Foldable, Traversable, Read, Show)
-
-$(deriveShow1 ''Ann)
-
-instance Semigroup SrcSpan where
-  s1 <> s2 = SrcSpan ((min `on` spanBegin) s1 s2)
-                     ((max `on` spanEnd) s1 s2)
-
-type AnnF ann f = Compose (Ann ann) f
-
-annToAnnF :: Ann ann (f (Fix (AnnF ann f))) -> Fix (AnnF ann f)
-annToAnnF (Ann ann a) = AnnE ann a
-
-type NExprLocF = AnnF SrcSpan NExprF
-
--- | A nix expression with source location at each subexpression.
-type NExprLoc = Fix NExprLocF
-
-pattern AnnE ann a = Fix (Compose (Ann ann a))
-
-stripAnnotation :: Functor f => Fix (AnnF ann f) -> Fix f
-stripAnnotation = ana (annotated . getCompose . unFix)
-
-nApp :: NExprLoc -> NExprLoc -> NExprLoc
-nApp e1@(AnnE s1 _) e2@(AnnE s2 _) = AnnE (s1 <> s2) (NApp e1 e2)
-
-nUnary :: Ann SrcSpan NUnaryOp -> NExprLoc -> NExprLoc
-nUnary (Ann s1 u) e1@(AnnE s2 _) = AnnE (s1 <> s2) (NUnary u e1)
-
-nBinary :: Ann SrcSpan NBinaryOp -> NExprLoc -> NExprLoc -> NExprLoc
-nBinary (Ann s1 b) e1@(AnnE s2 _) e2@(AnnE s3 _) =
-  AnnE (s1 <> s2 <> s3) (NBinary b e1 e2)
-
-nSelectLoc :: NExprLoc -> Ann SrcSpan (NAttrPath NExprLoc) -> Maybe NExprLoc -> NExprLoc
-nSelectLoc e1@(AnnE s1 _) (Ann s2 ats) d = case d of
-  Nothing               -> AnnE (s1 <> s2) (NSelect e1 ats Nothing)
-  Just (e2@(AnnE s3 _)) -> AnnE (s1 <> s2 <> s3) (NSelect e1 ats (Just e2))
-
-nHasAttr :: NExprLoc -> Ann SrcSpan (NAttrPath NExprLoc) -> NExprLoc
-nHasAttr e1@(AnnE s1 _) (Ann s2 ats) = AnnE (s1 <> s2) (NHasAttr e1 ats)
-
-nAbs :: Ann SrcSpan (Params NExprLoc) -> NExprLoc -> NExprLoc
-nAbs (Ann s1 ps) e1@(AnnE s2 _) = AnnE (s1 <> s2) (NAbs ps e1)
-
-nStr :: Ann SrcSpan (NString NExprLoc) -> NExprLoc
-nStr (Ann s1 s) = AnnE s1 (NStr s)
diff --git a/Nix/Parser.hs b/Nix/Parser.hs
deleted file mode 100644
--- a/Nix/Parser.hs
+++ /dev/null
@@ -1,293 +0,0 @@
-{-# LANGUAGE CPP #-}
-{-# LANGUAGE OverloadedStrings #-}
-
-module Nix.Parser (
-  parseNixFile,
-  parseNixFileLoc,
-  parseNixString,
-  parseNixStringLoc,
-  parseNixText,
-  parseNixTextLoc,
-  Result(..)
-  ) where
-
-import           Control.Applicative
-import           Control.Monad
-import           Control.Monad.IO.Class
-import           Data.Foldable hiding (concat)
-import qualified Data.Map as Map
-import           Data.Text hiding (head, map, foldl1', foldl', concat)
-import           Nix.Parser.Library
-import           Nix.Parser.Operators
-import           Nix.Expr
-import           Nix.StringOperations
-import           Prelude hiding (elem)
-
---------------------------------------------------------------------------------
-
-annotateLocation :: Parser a -> Parser (Ann SrcSpan a)
-annotateLocation p = do
-  begin <- position
-  res   <- p
-  end   <- position
-  let span = SrcSpan begin end
-  pure $ Ann span res
-
-annotateLocation1 :: Parser (NExprF NExprLoc) -> Parser NExprLoc
-annotateLocation1 = fmap annToAnnF . annotateLocation
-
---------------------------------------------------------------------------------
-
-nixExpr :: Parser NExpr
-nixExpr = stripAnnotation <$> nixExprLoc
-
--- | The lexer for this parser is defined in 'Nix.Parser.Library'.
-nixExprLoc :: Parser NExprLoc
-nixExprLoc = whiteSpace *> (nixToplevelForm <|> foldl' makeParser nixTerm nixOperators)
- where
-  makeParser :: Parser NExprLoc -> Either NSpecialOp NOperatorDef -> Parser NExprLoc
-  makeParser term (Left NSelectOp) = nixSelect term
-  makeParser term (Left NAppOp) = chainl1 term $ pure $ \a b -> (nApp a b)
-  makeParser term (Left NHasAttrOp) = nixHasAttr term
-  makeParser term (Right (NUnaryDef name op))
-    = build <$> many (annotateLocation (void $ symbol name)) <*> term
-    where build :: [Ann SrcSpan ()] -> NExprLoc -> NExprLoc
-          build = flip $ foldl' (\t' (Ann s ()) -> nUnary (Ann s op) t')
-  makeParser term (Right (NBinaryDef assoc ops)) = case assoc of
-    NAssocLeft  -> chainl1 term op
-    NAssocRight -> chainr1 term op
-    NAssocNone  -> term <**> (flip <$> op <*> term <|> pure id)
-   where op :: Parser (NExprLoc -> NExprLoc -> NExprLoc)
-         op = choice . map (\(n,o) -> (\(Ann a ()) -> nBinary (Ann a o)) <$> annotateLocation (reservedOp n)) $ ops
-
-antiStart :: Parser String
-antiStart = try (string "${") <?> show ("${" :: String)
-
-nixAntiquoted :: Parser a -> Parser (Antiquoted a NExprLoc)
-nixAntiquoted p = Antiquoted <$> (antiStart *> nixExprLoc <* symbolic '}') <|> Plain <$> p
-
-selDot :: Parser ()
-selDot = try (char '.' *> notFollowedBy (("path" :: String) <$ nixPath)) *> whiteSpace
-      <?> "."
-
-nixSelector :: Parser (Ann SrcSpan (NAttrPath NExprLoc))
-nixSelector = annotateLocation $ keyName `sepBy1` selDot
-
-nixSelect :: Parser NExprLoc -> Parser NExprLoc
-nixSelect term = build
-  <$> term
-  <*> optional ((,) <$> (selDot *> nixSelector) <*> optional (reserved "or" *> nixExprLoc))
- where
-  build :: NExprLoc -> Maybe (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc) -> NExprLoc
-  build t Nothing = t
-  build t (Just (s,o)) = nSelectLoc t s o
-
-nixHasAttr :: Parser NExprLoc -> Parser NExprLoc
-nixHasAttr term = build <$> term <*> optional (reservedOp "?" *> nixSelector) where
-  build :: NExprLoc -> Maybe (Ann SrcSpan (NAttrPath NExprLoc)) -> NExprLoc
-  build t Nothing = t
-  build t (Just s) = nHasAttr t s
-
--- | A self-contained unit.
-nixTerm :: Parser NExprLoc
-nixTerm = nixSelect $ choice
-  [ nixInt, nixBool, nixNull, nixParens, nixList, nixPath, nixSPath, nixUri
-  , nixStringExpr, nixSet, nixSym ]
-
-nixToplevelForm :: Parser NExprLoc
-nixToplevelForm = choice [nixLambda, nixLet, nixIf, nixAssert, nixWith]
-
-nixSym :: Parser NExprLoc
-nixSym = annotateLocation1 $ mkSymF <$> identifier
-
-nixInt :: Parser NExprLoc
-nixInt = annotateLocation1 $ mkIntF <$> token decimal <?> "integer"
-
-nixBool :: Parser NExprLoc
-nixBool = annotateLocation1 $ try (true <|> false) <?> "bool" where
-  true = mkBoolF True <$ reserved "true"
-  false = mkBoolF False <$ reserved "false"
-
-nixNull :: Parser NExprLoc
-nixNull = annotateLocation1 $ mkNullF <$ try (reserved "null") <?> "null"
-
-nixParens :: Parser NExprLoc
-nixParens = parens nixExprLoc <?> "parens"
-
-nixList :: Parser NExprLoc
-nixList = annotateLocation1 $ brackets (NList <$> many nixTerm) <?> "list"
-
-pathChars :: String
-pathChars = ['A'..'Z'] ++ ['a'..'z'] ++ "._-+" ++ ['0'..'9']
-
-slash :: Parser Char
-slash = try (char '/' <* notFollowedBy (char '/')) <?> "slash"
-
--- | A path surrounded by angle brackets, indicating that it should be
--- looked up in the NIX_PATH environment variable at evaluation.
-nixSPath :: Parser NExprLoc
-nixSPath = annotateLocation1 $ mkPathF True <$> try (char '<' *> some (oneOf pathChars <|> slash) <* symbolic '>')
-        <?> "spath"
-
-nixPath :: Parser NExprLoc
-nixPath = annotateLocation1 $ token $ fmap (mkPathF False) $ ((++)
-    <$> (try ((++) <$> many (oneOf pathChars) <*> fmap (:[]) slash) <?> "path")
-    <*> fmap concat
-      (  some (some (oneOf pathChars)
-     <|> liftA2 (:) slash (some (oneOf pathChars)))
-      )
-    )
-    <?> "path"
-
-nixLet :: Parser NExprLoc
-nixLet = annotateLocation1 $ NLet
-      <$> (reserved "let" *> nixBinders)
-      <*> (whiteSpace *> reserved "in" *> nixExprLoc)
-      <?> "let"
-
-nixIf :: Parser NExprLoc
-nixIf = annotateLocation1 $ NIf
-     <$> (reserved "if" *> nixExprLoc)
-     <*> (whiteSpace *> reserved "then" *> nixExprLoc)
-     <*> (whiteSpace *> reserved "else" *> nixExprLoc)
-     <?> "if"
-
-nixAssert :: Parser NExprLoc
-nixAssert = annotateLocation1 $ NAssert
-  <$> (reserved "assert" *> nixExprLoc)
-  <*> (semi *> nixExprLoc)
-
-nixWith :: Parser NExprLoc
-nixWith = annotateLocation1 $ NWith
-  <$> (reserved "with" *> nixExprLoc)
-  <*> (semi *> nixExprLoc)
-
-nixLambda :: Parser NExprLoc
-nixLambda = (nAbs <$> annotateLocation (try argExpr <?> "lambda arguments") <*> nixExprLoc) <?> "lambda"
-
-nixStringExpr :: Parser NExprLoc
-nixStringExpr = nStr <$> annotateLocation nixString
-
-uriAfterColonC :: Parser Char
-uriAfterColonC = alphaNum <|> oneOf "%/?:@&=+$,-_.!~*'"
-
-nixUri :: Parser NExprLoc
-nixUri = annotateLocation1 $ token $ fmap (mkUriF . pack) $ (++)
-  <$> try ((++) <$> (scheme <* char ':') <*> fmap (\x -> [':',x]) uriAfterColonC)
-  <*> many uriAfterColonC
- where
-  scheme = (:) <$> letter <*> many (alphaNum <|> oneOf "+-.")
-
-nixString :: Parser (NString NExprLoc)
-nixString = doubleQuoted <|> indented <?> "string"
-  where
-    doubleQuoted :: Parser (NString NExprLoc)
-    doubleQuoted = DoubleQuoted . removePlainEmpty . mergePlain
-                <$> (doubleQ *> many (stringChar doubleQ (void $ char '\\') doubleEscape)
-                             <* token doubleQ)
-                <?> "double quoted string"
-
-    doubleQ = void $ char '"'
-    doubleEscape = Plain . singleton <$> (char '\\' *> escapeCode)
-
-    indented :: Parser (NString NExprLoc)
-    indented = stripIndent
-            <$> (indentedQ *> many (stringChar indentedQ indentedQ indentedEscape)
-                           <* token indentedQ)
-            <?> "indented string"
-
-    indentedQ = void $ try (string "''") <?> "\"''\""
-    indentedEscape = fmap Plain
-              $  try (indentedQ *> char '\\') *> fmap singleton escapeCode
-             <|> try (indentedQ *> ("''" <$ char '\'' <|> "$"  <$ char '$'))
-
-    stringChar end escStart esc
-       =  esc
-      <|> Antiquoted <$> (antiStart *> nixExprLoc <* char '}') -- don't skip trailing space
-      <|> Plain . singleton <$> char '$'
-      <|> Plain . pack <$> some plainChar
-     where plainChar = notFollowedBy (end <|> void (char '$') <|> escStart) *> anyChar
-
-    escapeCode = choice [ c <$ char e | (c,e) <- escapeCodes ] <|> anyChar
-
--- | Gets all of the arguments for a function.
-argExpr :: Parser (Params NExprLoc)
-argExpr = choice [atLeft, onlyname, atRight] <* symbolic ':' where
-  -- An argument not in curly braces. There's some potential ambiguity
-  -- in the case of, for example `x:y`. Is it a lambda function `x: y`, or
-  -- a URI `x:y`? Nix syntax says it's the latter. So we need to fail if
-  -- there's a valid URI parse here.
-  onlyname = choice [nixUri >> unexpected "valid uri",
-                     Param <$> identifier]
-
-  -- Parameters named by an identifier on the left (`args @ {x, y}`)
-  atLeft = try $ do
-    name <- identifier <* symbolic '@'
-    (constructor, params) <- params
-    return $ ParamSet (constructor params) (Just name)
-
-  -- Parameters named by an identifier on the right, or none (`{x, y} @ args`)
-  atRight = do
-    (constructor, params) <- params
-    name <- optional $ symbolic '@' *> identifier
-    return $ ParamSet (constructor params) name
-
-  -- Return the parameters set.
-  params = do
-    (args, dotdots) <- braces getParams
-    let constructor = if dotdots then VariadicParamSet else FixedParamSet
-    return (constructor, Map.fromList args)
-
-  -- Collects the parameters within curly braces. Returns the parameters and
-  -- a boolean indicating if the parameters are variadic.
-  getParams :: Parser ([(Text, Maybe NExprLoc)], Bool)
-  getParams = go [] where
-    -- Attempt to parse `...`. If this succeeds, stop and return True.
-    -- Otherwise, attempt to parse an argument, optionally with a
-    -- default. If this fails, then return what has been accumulated
-    -- so far.
-    go acc = (token (string "...") >> return (acc, True)) <|> getMore acc
-    getMore acc =
-      -- Could be nothing, in which just return what we have so far.
-      option (acc, False) $ do
-        -- Get an argument name and an optional default.
-        pair <- liftA2 (,) identifier (optional $ symbolic '?' *> nixExprLoc)
-        -- Either return this, or attempt to get a comma and restart.
-        option (acc ++ [pair], False) $ symbolic ',' >> go (acc ++ [pair])
-
-nixBinders :: Parser [Binding NExprLoc]
-nixBinders = (inherit <|> namedVar) `endBy` symbolic ';' where
-  inherit = Inherit <$> (reserved "inherit" *> optional scope)
-                    <*> many keyName
-                    <?> "inherited binding"
-  namedVar = NamedVar <$> (annotated <$> nixSelector) <*> (symbolic '=' *> nixExprLoc)
-          <?> "variable binding"
-  scope = parens nixExprLoc <?> "inherit scope"
-
-keyName :: Parser (NKeyName NExprLoc)
-keyName = dynamicKey <|> staticKey where
-  staticKey = StaticKey <$> identifier
-  dynamicKey = DynamicKey <$> nixAntiquoted nixString
-
-nixSet :: Parser NExprLoc
-nixSet = annotateLocation1 $ (isRec <*> braces nixBinders) <?> "set" where
-  isRec = (try (reserved "rec" *> pure NRecSet) <?> "recursive set")
-       <|> pure NSet
-
-parseNixFile :: MonadIO m => FilePath -> m (Result NExpr)
-parseNixFile = parseFromFileEx $ nixExpr <* eof
-
-parseNixFileLoc :: MonadIO m => FilePath -> m (Result NExprLoc)
-parseNixFileLoc = parseFromFileEx $ nixExprLoc <* eof
-
-parseNixString :: String -> Result NExpr
-parseNixString = parseFromString $ nixExpr <* eof
-
-parseNixStringLoc :: String -> Result NExprLoc
-parseNixStringLoc = parseFromString $ nixExprLoc <* eof
-
-parseNixText :: Text -> Result NExpr
-parseNixText = parseNixString . unpack
-
-parseNixTextLoc :: Text -> Result NExprLoc
-parseNixTextLoc = parseNixStringLoc . unpack
diff --git a/Nix/Parser/Library.hs b/Nix/Parser/Library.hs
deleted file mode 100644
--- a/Nix/Parser/Library.hs
+++ /dev/null
@@ -1,138 +0,0 @@
-{-# LANGUAGE CPP #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE OverloadedStrings #-}
-module Nix.Parser.Library
-  ( module Nix.Parser.Library
-  , module X
-  , Trifecta.Delta(..)
-  ) where
-
-import Prelude
-import Control.Applicative
-import Control.Monad
-import Control.Monad.IO.Class
-import Data.Text hiding (map)
-import Text.Parser.Expression as X
-import Text.Parser.LookAhead as X
-import Text.Parser.Token as X
-import Text.Parser.Char as X hiding (text)
-import Text.Parser.Combinators as X
-import Text.PrettyPrint.ANSI.Leijen as X (Doc, text)
-import Text.Parser.Token.Highlight
-import Text.Parser.Token.Style
-
-import qualified Data.HashSet as HashSet
-
-#if USE_PARSEC
-import qualified Text.Parsec as Parsec
-import qualified Text.Parsec.Text as Parsec
-import qualified Data.Text.IO as T
-#else
-import qualified Text.Trifecta as Trifecta
-import qualified Text.Trifecta.Delta as Trifecta
-
-import Text.Trifecta as X (Result(..))
-#endif
-
-newtype NixParser p a = NixParser { runNixParser :: p a }
-  deriving (Functor, Applicative, Alternative, Monad, MonadPlus, Parsing, CharParsing, LookAheadParsing, Trifecta.DeltaParsing)
-
-instance TokenParsing p => TokenParsing (NixParser p) where
-  someSpace = NixParser $ buildSomeSpaceParser someSpace commentStyle
-  nesting = NixParser . nesting . runNixParser
-  highlight h = NixParser . highlight h . runNixParser
-  semi = token $ char ';' <?> ";"
-  token p = p <* whiteSpace
-
-commentStyle :: CommentStyle
-commentStyle = CommentStyle
-  { _commentStart = "/*"
-  , _commentEnd   = "*/"
-  , _commentLine  = "#"
-  , _commentNesting = True
-  }
-
-identStyle :: CharParsing m => IdentifierStyle m
-identStyle = IdentifierStyle
-  { _styleName = "identifier"
-  , _styleStart = identStart
-  , _styleLetter = identLetter
-  , _styleReserved = reservedNames
-  , _styleHighlight = Identifier
-  , _styleReservedHighlight = ReservedIdentifier
-  }
-
-identifier :: (TokenParsing m, Monad m) => m Text
-identifier = ident identStyle <?> "identifier"
-
-reserved :: (TokenParsing m, Monad m) => String -> m ()
-reserved = reserve identStyle
-
-reservedOp :: TokenParsing m => String -> m ()
-reservedOp o = token $ try $ () <$
-  highlight ReservedOperator (string o) <* (notFollowedBy opLetter <?> "end of " ++ o)
-
-opStart :: CharParsing m => m Char
-opStart = oneOf ".+-*/=<>&|!?"
-
-opLetter :: CharParsing m => m Char
-opLetter = oneOf ">-+/&|="
-
-identStart :: CharParsing m => m Char
-identStart = letter <|> char '_'
-
-identLetter :: CharParsing m => m Char
-identLetter = alphaNum <|> oneOf "_'-"
-
-reservedNames :: HashSet.HashSet String
-reservedNames = HashSet.fromList
-    [ "let", "in"
-    , "if", "then", "else"
-    , "assert"
-    , "with"
-    , "rec"
-    , "inherit"
-    , "or"
-    ]
-
-stopWords :: (TokenParsing m, Monad m) => m ()
-stopWords = () <$
-    (whiteSpace *> (reserved "in" <|> reserved "then" <|> reserved "else"))
-
-someTill :: Alternative f => f a -> f end -> f [a]
-someTill p end = go
-  where
-    go   = (:) <$> p <*> scan
-    scan = (end *> pure []) <|>  go
-
---------------------------------------------------------------------------------
-parseFromFileEx :: MonadIO m => Parser a -> FilePath -> m (Result a)
-parseFromString :: Parser a -> String -> Result a
-position :: Parser Trifecta.Delta
-
-#if USE_PARSEC
-data Result a = Success a
-              | Failure Doc
-  deriving Show
-
-type Parser = NixParser Parsec.Parser
-
-parseFromFileEx p path =
-    (either (Failure . text . show) Success . Parsec.parse (runNixParser p) path)
-        `liftM` liftIO (T.readFile path)
-
-parseFromString p = either (Failure . text . show) Success . Parsec.parse (runNixParser p) "<string>" . pack
-
-position = error "position not implemented for Parsec parser"
-
-#else
-
-type Parser = NixParser Trifecta.Parser
-
-parseFromFileEx p = Trifecta.parseFromFileEx (runNixParser p)
-
-parseFromString p = Trifecta.parseString (runNixParser p) (Trifecta.Directed "<string>" 0 0 0 0)
-
-position = Trifecta.position
-
-#endif
diff --git a/Nix/Parser/Operators.hs b/Nix/Parser/Operators.hs
deleted file mode 100644
--- a/Nix/Parser/Operators.hs
+++ /dev/null
@@ -1,81 +0,0 @@
-module Nix.Parser.Operators where
-
-import           Data.Data (Data(..))
-import           Data.Foldable (concat)
-import qualified Data.Map as Map
-import           Data.Maybe (catMaybes)
-import           Data.Typeable (Typeable)
-import           GHC.Exts
-import           GHC.Generics
-import           Nix.Expr
-import           Prelude hiding (readFile, concat, concatMap, elem, mapM,
-                                 sequence, minimum, foldr)
-
-data NSpecialOp = NHasAttrOp | NSelectOp | NAppOp
-  deriving (Eq, Ord, Generic, Typeable, Data, Show)
-
-data NAssoc = NAssocNone | NAssocLeft | NAssocRight
-  deriving (Eq, Ord, Generic, Typeable, Data, Show)
-
-data NOperatorDef
-  = NUnaryDef String NUnaryOp
-  | NBinaryDef NAssoc [(String, NBinaryOp)]
-  deriving (Eq, Ord, Generic, Typeable, Data, Show)
-
-nixOperators :: [Either NSpecialOp NOperatorDef]
-nixOperators =
-  [ Left NSelectOp
-  , Left NAppOp
-  , Right $ NUnaryDef "-" NNeg
-  , Left NHasAttrOp
-  ] ++ map Right
-  [ NBinaryDef NAssocRight [("++", NConcat)]
-  , NBinaryDef NAssocLeft [("*", NMult), ("/", NDiv)]
-  , NBinaryDef NAssocLeft [("+", NPlus), ("-", NMinus)]
-  , NUnaryDef  "!"  NNot
-  , NBinaryDef NAssocRight [("//", NUpdate)]
-  , NBinaryDef NAssocLeft [("<", NLt), (">", NGt), ("<=", NLte), (">=", NGte)]
-  , NBinaryDef NAssocNone [("==", NEq), ("!=", NNEq)]
-  , NBinaryDef NAssocLeft [("&&", NAnd)]
-  , NBinaryDef NAssocLeft [("||", NOr)]
-  , NBinaryDef NAssocNone [("->", NImpl)]
-  ]
-
-data OperatorInfo = OperatorInfo
-  { precedence    :: Int
-  , associativity :: NAssoc
-  , operatorName  :: String
-  } deriving (Eq, Ord, Generic, Typeable, Data, Show)
-
-getUnaryOperator :: NUnaryOp -> OperatorInfo
-getUnaryOperator = (m Map.!) where
-  m = Map.fromList . concat . zipWith buildEntry [1..] . reverse $
-        nixOperators
-  buildEntry i = \case
-    Right (NUnaryDef name op) -> [(op, OperatorInfo i NAssocNone name)]
-    _ -> []
-
-getBinaryOperator :: NBinaryOp -> OperatorInfo
-getBinaryOperator = (m Map.!) where
-  m = Map.fromList . concat . zipWith buildEntry [1..] . reverse $
-        nixOperators
-  buildEntry i = \case
-    Right (NBinaryDef assoc ops) -> do
-      [(op, OperatorInfo i assoc name) | (name,op) <- ops]
-    _ -> []
-
-getSpecialOperatorPrec :: NSpecialOp -> Int
-getSpecialOperatorPrec = (m Map.!) where
-  m = Map.fromList . catMaybes . zipWith buildEntry [1..] . reverse $
-        nixOperators
-  buildEntry _ (Right _) = Nothing
-  buildEntry i (Left op) = Just (op, i)
-
-selectOp :: OperatorInfo
-selectOp = OperatorInfo (getSpecialOperatorPrec NSelectOp) NAssocLeft "."
-
-hasAttrOp :: OperatorInfo
-hasAttrOp = OperatorInfo (getSpecialOperatorPrec NHasAttrOp) NAssocLeft "?"
-
-appOp :: OperatorInfo
-appOp = OperatorInfo (getSpecialOperatorPrec NAppOp) NAssocLeft " "
diff --git a/Nix/Pretty.hs b/Nix/Pretty.hs
deleted file mode 100644
--- a/Nix/Pretty.hs
+++ /dev/null
@@ -1,177 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-module Nix.Pretty where
-
-import Prelude hiding ((<$>))
-import Data.Fix
-import Data.Map (toList)
-import Data.Maybe (isJust)
-import Data.Text (Text, pack, unpack, replace, strip)
-import Data.List (isPrefixOf)
-import Nix.Atoms
-import Nix.Expr
-import Nix.Parser.Library (reservedNames)
-import Nix.Parser.Operators
-import Nix.StringOperations
-import Text.PrettyPrint.ANSI.Leijen
-
-import qualified Data.Text as Text
-import qualified Data.HashSet as HashSet
-
--- | This type represents a pretty printed nix expression
--- together with some information about the expression.
-data NixDoc = NixDoc
-  { -- | The rendered expression, without any parentheses.
-    withoutParens    :: Doc
-
-    -- | The root operator is the operator at the root of
-    -- the expression tree. For example, in '(a * b) + c', '+' would be the root
-    -- operator. It is needed to determine if we need to wrap the expression in
-    -- parentheses.
-  , rootOp :: OperatorInfo
-  }
-
--- | A simple expression is never wrapped in parentheses. The expression
--- behaves as if its root operator had a precedence higher than all
--- other operators (including function application).
-simpleExpr :: Doc -> NixDoc
-simpleExpr = flip NixDoc $ OperatorInfo maxBound NAssocNone "simple expr"
-
--- | An expression that behaves as if its root operator
--- had a precedence lower than all other operators.
--- That ensures that the expression is wrapped in parantheses in
--- almost always, but it's still rendered without parentheses
--- in cases where parentheses are never required (such as in the LHS
--- of a binding).
-leastPrecedence :: Doc -> NixDoc
-leastPrecedence = flip NixDoc $ OperatorInfo minBound NAssocNone "least precedence"
-
-appOpNonAssoc :: OperatorInfo
-appOpNonAssoc = appOp { associativity = NAssocNone }
-
-wrapParens :: OperatorInfo -> NixDoc -> Doc
-wrapParens op sub
-  | precedence (rootOp sub) > precedence op = withoutParens sub
-  | precedence (rootOp sub) == precedence op
-    && associativity (rootOp sub) == associativity op
-    && associativity op /= NAssocNone = withoutParens sub
-  | otherwise = parens $ withoutParens sub
-
-prettyString :: NString NixDoc -> Doc
-prettyString (DoubleQuoted parts) = dquotes . hcat . map prettyPart $ parts
-  where prettyPart (Plain t)      = text . concatMap escape . unpack $ t
-        prettyPart (Antiquoted r) = text "$" <> braces (withoutParens r)
-        escape '"' = "\\\""
-        escape x = maybe [x] (('\\':) . (:[])) $ toEscapeCode x
-prettyString (Indented parts)
-  = group $ nest 2 (squote <> squote <$$> content) <$$> squote <> squote
- where
-  content = vsep . map prettyLine . stripLastIfEmpty . splitLines $ parts
-  stripLastIfEmpty = reverse . f . reverse where
-    f ([Plain t] : xs) | Text.null (strip t) = xs
-    f xs = xs
-  prettyLine = hcat . map prettyPart
-  prettyPart (Plain t) = text . unpack . replace "${" "''${" . replace "''" "'''" $ t
-  prettyPart (Antiquoted r) = text "$" <> braces (withoutParens r)
-
-prettyParams :: Params NixDoc -> Doc
-prettyParams (Param n) = text $ unpack n
-prettyParams (ParamSet s mname) = prettyParamSet s <> case mname of
-  Nothing -> empty
-  Just name -> text "@" <> text (unpack name)
-
-prettyParamSet :: ParamSet NixDoc -> Doc
-prettyParamSet params = lbrace <+> middle <+> rbrace
-  where
-    prettyArgs = case params of
-      FixedParamSet args -> map prettySetArg (toList args)
-
-      VariadicParamSet args -> map prettySetArg (toList args) ++ [text "..."]
-    middle = hcat $ punctuate (comma <> space) prettyArgs
-    prettySetArg (n, maybeDef) = case maybeDef of
-      Nothing -> text (unpack n)
-      Just v -> text (unpack n) <+> text "?" <+> withoutParens v
-
-prettyBind :: Binding NixDoc -> Doc
-prettyBind (NamedVar n v) = prettySelector n <+> equals <+> withoutParens v <> semi
-prettyBind (Inherit s ns)
-  = text "inherit" <+> scope <> fillSep (map prettyKeyName ns) <> semi
- where scope = maybe empty ((<> space) . parens . withoutParens) s
-
-prettyKeyName :: NKeyName NixDoc -> Doc
-prettyKeyName (StaticKey key)
-  | HashSet.member (unpack key) reservedNames = dquotes $ text $ unpack key
-prettyKeyName (StaticKey key) = text . unpack $ key
-prettyKeyName (DynamicKey key) = runAntiquoted prettyString withoutParens key
-
-prettySelector :: NAttrPath NixDoc -> Doc
-prettySelector = hcat . punctuate dot . map prettyKeyName
-
--- | Translate an atom into its nix representation.
-atomText :: NAtom -> Text
-atomText (NInt i)   = pack (show i)
-atomText (NBool b)  = if b then "true" else "false"
-atomText NNull      = "null"
-atomText (NUri uri) = uri
-
-prettyAtom :: NAtom -> NixDoc
-prettyAtom atom = simpleExpr $ text $ unpack $ atomText atom
-
-prettyNix :: NExpr -> Doc
-prettyNix = withoutParens . cata phi where
-  phi :: NExprF NixDoc -> NixDoc
-  phi (NConstant atom) = prettyAtom atom
-  phi (NStr str) = simpleExpr $ prettyString str
-  phi (NList []) = simpleExpr $ lbracket <> rbracket
-  phi (NList xs) = simpleExpr $ group $
-    nest 2 (vsep $ lbracket : map (wrapParens appOpNonAssoc) xs) <$> rbracket
-  phi (NSet []) = simpleExpr $ lbrace <> rbrace
-  phi (NSet xs) = simpleExpr $ group $
-    nest 2 (vsep $ lbrace : map prettyBind xs) <$> rbrace
-  phi (NRecSet []) = simpleExpr $ recPrefix <> lbrace <> rbrace
-  phi (NRecSet xs) = simpleExpr $ group $
-    nest 2 (vsep $ recPrefix <> lbrace : map prettyBind xs) <$> rbrace
-  phi (NAbs args body) = leastPrecedence $
-    (prettyParams args <> colon) </> (nest 2 $ withoutParens body)
-  phi (NBinary op r1 r2) = flip NixDoc opInfo $ hsep
-    [ wrapParens (f NAssocLeft) r1
-    , text $ operatorName opInfo
-    , wrapParens (f NAssocRight) r2
-    ]
-    where
-      opInfo = getBinaryOperator op
-      f x
-        | associativity opInfo /= x = opInfo { associativity = NAssocNone }
-        | otherwise = opInfo
-  phi (NUnary op r1) =
-    NixDoc (text (operatorName opInfo) <> wrapParens opInfo r1) opInfo
-    where opInfo = getUnaryOperator op
-  phi (NSelect r attr o) = (if isJust o then leastPrecedence else flip NixDoc selectOp) $
-     wrapParens selectOp r <> dot <> prettySelector attr <> ordoc
-    where ordoc = maybe empty (((space <> text "or") <+>) . withoutParens) o
-  phi (NHasAttr r attr)
-    = NixDoc (wrapParens hasAttrOp r <+> text "?" <+> prettySelector attr) hasAttrOp
-  phi (NApp fun arg)
-    = NixDoc (wrapParens appOp fun <+> wrapParens appOpNonAssoc arg) appOp
-  phi (NEnvPath p) = simpleExpr $ text ("<" ++ p ++ ">")
-  phi (NLiteralPath p) = simpleExpr $ text $ case p of
-    "./" -> "./."
-    "../" -> "../."
-    ".." -> "../."
-    txt | "/" `isPrefixOf` txt -> txt
-        | "./" `isPrefixOf` txt -> txt
-        | "../" `isPrefixOf` txt -> txt
-        | otherwise -> "./" ++ txt
-  phi (NSym name) = simpleExpr $ text (unpack name)
-  phi (NLet binds body) = leastPrecedence $ group $ nest 2 $
-        vsep (text "let" : map prettyBind binds) <$> text "in" <+> withoutParens body
-  phi (NIf cond trueBody falseBody) = leastPrecedence $
-    group $ nest 2 $ (text "if" <+> withoutParens cond) <$>
-      (  align (text "then" <+> withoutParens trueBody)
-     <$> align (text "else" <+> withoutParens falseBody)
-      )
-  phi (NWith scope body) = leastPrecedence $
-    text "with"  <+> withoutParens scope <> semi <+> withoutParens body
-  phi (NAssert cond body) = leastPrecedence $
-    text "assert" <+> withoutParens cond <> semi <+> withoutParens body
-
-  recPrefix = text "rec" <> space
diff --git a/Nix/StringOperations.hs b/Nix/StringOperations.hs
deleted file mode 100644
--- a/Nix/StringOperations.hs
+++ /dev/null
@@ -1,87 +0,0 @@
--- | Functions for manipulating nix strings.
-module Nix.StringOperations where
-
-import Nix.Expr
-import           Data.List (intercalate)
-import           Data.Monoid ((<>))
-import           Data.Text (Text)
-import qualified Data.Text as T
-import           Prelude hiding (elem)
-import           Data.Tuple (swap)
-
-
--- | Merge adjacent 'Plain' values with 'mappend'.
-mergePlain :: Monoid v => [Antiquoted v r] -> [Antiquoted v r]
-mergePlain [] = []
-mergePlain (Plain a: Plain b: xs) = mergePlain (Plain (a <> b) : xs)
-mergePlain (x:xs) = x : mergePlain xs
-
--- | Remove 'Plain' values equal to 'mempty', as they don't have any
--- informational content.
-removePlainEmpty :: (Eq v, Monoid v) => [Antiquoted v r] -> [Antiquoted v r]
-removePlainEmpty = filter f where
-  f (Plain x) = x /= mempty
-  f _ = True
-
--- | Equivalent to case splitting on 'Antiquoted' strings.
-runAntiquoted :: (v -> a) -> (r -> a) -> Antiquoted v r -> a
-runAntiquoted f _ (Plain v) = f v
-runAntiquoted _ f (Antiquoted r) = f r
-
--- | Split a stream representing a string with antiquotes on line breaks.
-splitLines :: [Antiquoted Text r] -> [[Antiquoted Text r]]
-splitLines = uncurry (flip (:)) . go where
-  go (Plain t : xs) = (Plain l :) <$> foldr f (go xs) ls where
-    (l : ls) = T.split (=='\n') t
-    f prefix (finished, current) = ((Plain prefix : current) : finished, [])
-  go (Antiquoted a : xs) = (Antiquoted a :) <$> go xs
-  go [] = ([],[])
-
--- | Join a stream of strings containing antiquotes again. This is the inverse
--- of 'splitLines'.
-unsplitLines :: [[Antiquoted Text r]] -> [Antiquoted Text r]
-unsplitLines = intercalate [Plain "\n"]
-
--- | Form an indented string by stripping spaces equal to the minimal indent.
-stripIndent :: [Antiquoted Text r] -> NString r
-stripIndent [] = Indented []
-stripIndent xs =
-  Indented . removePlainEmpty . mergePlain . unsplitLines $ ls'
-  where
-    ls = stripEmptyOpening $ splitLines xs
-    ls' = map (dropSpaces minIndent) ls
-
-    minIndent = case stripEmptyLines ls of
-      [] -> 0
-      nonEmptyLs -> minimum $ map (countSpaces . mergePlain) nonEmptyLs
-
-    stripEmptyLines = filter $ \case
-      [Plain t] -> not $ T.null $ T.strip t
-      _ -> True
-
-    stripEmptyOpening ([Plain t]:ts) | T.null (T.strip t) = ts
-    stripEmptyOpening ts = ts
-
-    countSpaces (Antiquoted _:_) = 0
-    countSpaces (Plain t : _) = T.length . T.takeWhile (== ' ') $ t
-    countSpaces [] = 0
-
-    dropSpaces 0 x = x
-    dropSpaces n (Plain t : cs) = Plain (T.drop n t) : cs
-    dropSpaces _ _ = error "stripIndent: impossible"
-
-escapeCodes :: [(Char, Char)]
-escapeCodes =
-  [ ('\n', 'n' )
-  , ('\r', 'r' )
-  , ('\t', 't' )
-  , ('\\', '\\')
-  , ('$' , '$' )
-  , ('"', '"')
-  ]
-
-fromEscapeCode :: Char -> Maybe Char
-fromEscapeCode = (`lookup` map swap escapeCodes)
-
-toEscapeCode :: Char -> Maybe Char
-toEscapeCode = (`lookup` escapeCodes)
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,94 @@
+# hnix
+
+[![Build Status](https://api.travis-ci.org/haskell-nix/hnix.svg)](https://travis-ci.org/haskell-nix/hnix)
+[![Chat](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/haskell-nix/Lobby)
+
+Haskell parser, evaluator and type checker for the Nix language.
+
+## Prerequisites
+
+Nix is installed and in your `$PATH`. This is so that `nix-store` can be used
+for interacting with store paths, until `hnix-store` is ready.
+
+## Getting Started
+
+```bash
+$ git clone --recursive https://github.com/haskell-nix/hnix.git
+...
+$ cd hnix
+$ nix-shell
+$ cabal configure --enable-tests
+$ cabal build
+$ cabal test
+# To run all of the tests, which takes up to a minute:
+$ LANGUAGE_TESTS=yes NIXPKGS_TESTS=yes cabal test
+$ ./dist/build/hnix/hnix --help
+```
+
+## Building a Docker container
+
+If you don't have Nix installed, or you'd just like to play around with `hnix`
+completely separately from your main system, you can build a Docker container:
+
+```bash
+$ docker build -t hnix .
+$ docker run hnix hnix --eval --expr '1 + 2'
+
+# In order to refer to files under the current directory:
+$ docker run -v $PWD/:/tmp/build run hnix hnix default.nix
+```
+
+## Building with full debug info
+
+To build `hnix` for debugging, and with full tracing output and stack traces,
+use:
+
+```
+$ nix-shell --arg doProfiling true
+$ cabal configure --enable-tests --enable-profiling --flags=tracing
+$ cabal build
+$ ./dist/build/hnix/hnix -v5 --trace <args> +RTS -xc
+```
+
+Note that this will run quite slowly, but will give the most information as to
+what might potentially be going wrong during parsing or evaluation.
+
+## Building with benchmarks enabled
+
+To build `hnix` with benchmarks enabled:
+
+```
+$ nix-shell --arg doBenchmarks true
+$ cabal configure --enable-tests --enable-benchmarks
+$ cabal build
+$ cabal bench
+```
+
+## Building with profiling enabled
+
+To build `hnix` with profiling enabled:
+
+```
+$ nix-shell --arg doProfiling true
+$ cabal configure --enable-tests --enable-profiling
+$ cabal build
+$ ./dist/build/hnix/hnix <args> +RTS -p
+```
+
+## How you can help
+
+If you're looking for a way to help out, try taking a look
+[here](https://github.com/haskell-nix/hnix/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22+no%3Aassignee).
+When you find an issue that looks interesting to you, comment on the ticket to
+let others know you're working on it; look for others who might have done the
+same. You can talk with everyone live on
+[Gitter](https://gitter.im/haskell-nix/Lobby).
+
+When you're ready to submit a pull request, test it with:
+```
+git submodule update --init --recursive
+nix-shell --run "LANGUAGE_TESTS=yes cabal test"
+```
+
+Make sure that all the tests that were passing prior to your PR are still
+passing afterwards; it's OK if no new tests are passing.
diff --git a/data/let-comments-multiline.nix b/data/let-comments-multiline.nix
deleted file mode 100644
--- a/data/let-comments-multiline.nix
+++ /dev/null
@@ -1,13 +0,0 @@
-let
-  b.a = 3; /*
-   this is a multiline comment
-   /* we can also nest these comments
-    */ /*
-   */
-  */
-  b.c = { e = {}; };
-  /* just some more comments
-   */
-  b.c.e.f = 4;
-/* this file is documented really well */
-in b /* todo */
diff --git a/data/let-comments.nix b/data/let-comments.nix
deleted file mode 100644
--- a/data/let-comments.nix
+++ /dev/null
@@ -1,13 +0,0 @@
-let
-  b.a = 3;
-   # this is a oneline comment
-   # we can also nest these comments
-    # #
-   #
-  #
-  b.c = { e = {}; };
-  # just some more comments
-   #
-  b.c.e.f = 4;
-# this file is documented really well
-in b # todo
diff --git a/data/let.nix b/data/let.nix
deleted file mode 100644
--- a/data/let.nix
+++ /dev/null
@@ -1,5 +0,0 @@
-let
-  b.a = 3;
-  b.c = { e = {}; };
-  b.c.e.f = 4;
-in b
diff --git a/data/nixpkgs-all-packages-pretty.nix b/data/nixpkgs-all-packages-pretty.nix
deleted file mode 100644
--- a/data/nixpkgs-all-packages-pretty.nix
+++ /dev/null
@@ -1,10835 +0,0 @@
-{ bootStdenv ? null, config ? null, crossSystem ? null, gccWithCC ? true, gccWithProfiling ? true, noSysDirs ? system != "x86_64-darwin" && system != "x86_64-freebsd" && system != "i686-freebsd" && system != "x86_64-kfreebsd-gnu", platform ? null, system ? builtins.currentSystem }:
-let
-  config_ = config;
-  platform_ = platform;
-  in let
-    lib = import ../../lib;
-    config = let
-      toPath = builtins.toPath;
-      getEnv = x: if builtins ? getEnv
-        then builtins.getEnv x
-        else "";
-      pathExists = name:
-      builtins ? pathExists && builtins.pathExists (toPath name);
-      configFile = getEnv "NIXPKGS_CONFIG";
-      homeDir = getEnv "HOME";
-      configFile2 = homeDir + "/.nixpkgs/config.nix";
-      configExpr = if config_ != null
-        then config_
-        else if configFile != "" && pathExists configFile
-          then import (toPath configFile)
-          else if homeDir != "" && pathExists configFile2
-            then import (toPath configFile2)
-            else { };
-      in if builtins.isFunction configExpr
-        then configExpr {
-          inherit pkgs;
-        }
-        else configExpr;
-    platformAuto = let
-      platforms = import ./platforms.nix;
-      in if system == "armv6l-linux"
-        then platforms.raspberrypi
-        else if system == "armv5tel-linux"
-          then platforms.sheevaplug
-          else if system == "mips64el-linux"
-            then platforms.fuloong2f_n32
-            else if system == "x86_64-linux"
-              then platforms.pc64
-              else if system == "i686-linux"
-                then platforms.pc32
-                else platforms.pcBase;
-    platform = if platform_ != null
-      then platform_
-      else config.platform or platformAuto;
-    helperFunctions = stdenvAdapters // import ../build-support/trivial-builders.nix {
-      inherit (pkgs) stdenv;
-      inherit (pkgs.xorg) lndir;
-    };
-    stdenvAdapters = import ../stdenv/adapters.nix pkgs;
-    pkgs = applyGlobalOverrides (config.packageOverrides or pkgs:
-    { });
-    applyGlobalOverrides = overrider:
-    let
-      overrides = overrider pkgsOrig // lib.optionalAttrs (pkgsOrig.stdenv ? overrides && crossSystem == null) (pkgsOrig.stdenv.overrides pkgsOrig);
-      pkgsOrig = pkgsFun pkgs { };
-      pkgs = pkgsFun pkgs overrides;
-      in pkgs;
-    pkgsFun = pkgs: overrides:
-    with helperFunctions; let
-      defaultScope = pkgs // pkgs.xorg;
-      self = self_ // overrides;
-      self_ = with self; helperFunctions // {
-        inherit system platform;
-        inherit pkgs;
-        callPackage = newScope { };
-        newScope = extra:
-        lib.callPackageWith (defaultScope // extra);
-        forceSystem = system: kernel:
-        import ./all-packages.nix {
-          inherit system;
-          platform = platform // {
-            kernelArch = kernel;
-          };
-          inherit bootStdenv noSysDirs
-          gccWithCC gccWithProfiling
-          config crossSystem;
-        };
-        pkgsi686Linux = forceSystem "i686-linux" "i386";
-        callPackage_i686 = lib.callPackageWith (pkgsi686Linux // pkgsi686Linux.xorg);
-        path = ../..;
-        x11 = xlibsWrapper;
-        xlibs = xorg // {
-          xlibs = xlibsWrapper;
-        };
-        inherit lib config
-        stdenvAdapters;
-        inherit (lib) lowPrio hiPrio
-        appendToName makeOverridable;
-        inherit (misc) versionedDerivation;
-        recurseIntoAttrs = attrs:
-        attrs // {
-          recurseForDerivations = true;
-        };
-        builderDefs = lib.composedArgsAndFun (import ../build-support/builder-defs/builder-defs.nix) {
-          inherit stringsWithDeps lib
-          stdenv writeScript fetchurl
-          fetchmtn fetchgit;
-        };
-        builderDefsPackage = builderDefs.builderDefsPackage builderDefs;
-        stringsWithDeps = lib.stringsWithDeps;
-        nix-generate-from-cpan = callPackage ../../maintainers/scripts/nix-generate-from-cpan.nix {
-        };
-        nixpkgs-lint = callPackage ../../maintainers/scripts/nixpkgs-lint.nix {
-        };
-        allStdenvs = import ../stdenv {
-          inherit system platform config;
-          allPackages = args:
-          import ./all-packages.nix ({
-            inherit config system;
-          } // args);
-        };
-        defaultStdenv = allStdenvs.stdenv // {
-          inherit platform;
-        };
-        stdenvCross = lowPrio (makeStdenvCross defaultStdenv crossSystem binutilsCross gccCrossStageFinal);
-        stdenv = if bootStdenv != null
-          then bootStdenv // {
-            inherit platform;
-          }
-          else if crossSystem != null
-            then stdenvCross
-            else let
-              changer = config.replaceStdenv or null;
-              in if changer != null
-                then changer {
-                  pkgs = import ./all-packages.nix {
-                    config = removeAttrs config [
-                      "replaceStdenv"
-                    ];
-                  };
-                }
-                else defaultStdenv;
-        stdenvApple = stdenvAdapters.overrideGCC allStdenvs.stdenvNative gccApple;
-        forceNativeDrv = drv:
-        if crossSystem == null
-          then drv
-          else drv // {
-            crossDrv = drv.nativeDrv;
-          };
-        stdenv_32bit = lowPrio (if system == "x86_64-linux"
-          then overrideGCC stdenv gcc48_multi
-          else stdenv);
-        attrSetToDir = arg:
-        import ../build-support/upstream-updater/attrset-to-dir.nix {
-          inherit writeTextFile stdenv
-          lib;
-          theAttrSet = arg;
-        };
-        autoreconfHook = makeSetupHook {
-          substitutions = {
-            inherit autoconf automake
-            libtool;
-          };
-        } ../build-support/setup-hooks/autoreconf.sh;
-        buildEnv = import ../build-support/buildenv {
-          inherit (pkgs) runCommand perl;
-        };
-        buildFHSChrootEnv = import ../build-support/build-fhs-chrootenv {
-          inherit stdenv glibc
-          glibcLocales gcc coreutils
-          diffutils findutils;
-          inherit gnused gnugrep gnutar
-          gzip bzip2 bashInteractive xz
-          shadow gawk;
-          inherit less buildEnv;
-        };
-        dotnetenv = import ../build-support/dotnetenv {
-          inherit stdenv;
-          dotnetfx = dotnetfx40;
-        };
-        scatterOutputHook = makeSetupHook {
-        } ../build-support/setup-hooks/scatter_output.sh;
-        vsenv = callPackage ../build-support/vsenv {
-          vs = vs90wrapper;
-        };
-        fetchbower = import ../build-support/fetchbower {
-          inherit stdenv git;
-          inherit (nodePackages) fetch-bower;
-        };
-        fetchbzr = import ../build-support/fetchbzr {
-          inherit stdenv bazaar;
-        };
-        fetchcvs = import ../build-support/fetchcvs {
-          inherit stdenv cvs;
-        };
-        fetchdarcs = import ../build-support/fetchdarcs {
-          inherit stdenv darcs nix;
-        };
-        fetchgit = import ../build-support/fetchgit {
-          inherit stdenv git cacert;
-        };
-        fetchgitPrivate = import ../build-support/fetchgit/private.nix {
-          inherit fetchgit writeScript
-          openssh stdenv;
-        };
-        fetchgitrevision = import ../build-support/fetchgitrevision runCommand git;
-        fetchmtn = callPackage ../build-support/fetchmtn (config.fetchmtn or {
-        });
-        packer = callPackage ../development/tools/packer {
-        };
-        fetchpatch = callPackage ../build-support/fetchpatch {
-        };
-        fetchsvn = import ../build-support/fetchsvn {
-          inherit stdenv subversion
-          openssh;
-          sshSupport = true;
-        };
-        fetchsvnrevision = import ../build-support/fetchsvnrevision runCommand subversion;
-        fetchsvnssh = import ../build-support/fetchsvnssh {
-          inherit stdenv subversion
-          openssh expect;
-          sshSupport = true;
-        };
-        fetchhg = import ../build-support/fetchhg {
-          inherit stdenv mercurial nix;
-        };
-        fetchurl = import ../build-support/fetchurl {
-          inherit curl stdenv;
-        };
-        fetchurlGnome = callPackage ../build-support/fetchurl/gnome.nix {
-        };
-        fetchurlBoot = stdenv.fetchurlBoot;
-        fetchzip = import ../build-support/fetchzip {
-          inherit lib fetchurl unzip;
-        };
-        fetchFromGitHub = { owner, repo, rev, sha256 }:
-        fetchzip {
-          name = "${repo}-${rev}-src";
-          url = "https://github.com/${owner}/${repo}/archive/${rev}.tar.gz";
-          inherit sha256;
-        };
-        resolveMirrorURLs = { url }:
-        fetchurl {
-          showURLs = true;
-          inherit url;
-        };
-        libredirect = callPackage ../build-support/libredirect {
-        };
-        makeDesktopItem = import ../build-support/make-desktopitem {
-          inherit stdenv;
-        };
-        makeAutostartItem = import ../build-support/make-startupitem {
-          inherit stdenv;
-          inherit lib;
-        };
-        makeInitrd = { compressor ? "gzip -9", contents }:
-        import ../build-support/kernel/make-initrd.nix {
-          inherit stdenv perl
-          perlArchiveCpio cpio contents
-          ubootChooser compressor;
-        };
-        makeWrapper = makeSetupHook {
-        } ../build-support/setup-hooks/make-wrapper.sh;
-        makeModulesClosure = { allowMissing ? false, kernel, rootModules }:
-        import ../build-support/kernel/modules-closure.nix {
-          inherit stdenv kmod kernel
-          nukeReferences rootModules
-          allowMissing;
-        };
-        pathsFromGraph = ../build-support/kernel/paths-from-graph.pl;
-        srcOnly = args:
-        import ../build-support/src-only ({
-          inherit stdenv;
-        } // args);
-        substituteAll = import ../build-support/substitute/substitute-all.nix {
-          inherit stdenv;
-        };
-        replaceDependency = import ../build-support/replace-dependency.nix {
-          inherit runCommand nix lib;
-        };
-        nukeReferences = callPackage ../build-support/nuke-references/default.nix {
-        };
-        vmTools = import ../build-support/vm/default.nix {
-          inherit pkgs;
-        };
-        releaseTools = import ../build-support/release/default.nix {
-          inherit pkgs;
-        };
-        composableDerivation = import ../../lib/composable-derivation.nix {
-          inherit pkgs lib;
-        };
-        platforms = import ./platforms.nix;
-        setJavaClassPath = makeSetupHook {
-        } ../build-support/setup-hooks/set-java-classpath.sh;
-        fixDarwinDylibNames = makeSetupHook {
-        } ../build-support/setup-hooks/fix-darwin-dylib-names.sh;
-        keepBuildTree = makeSetupHook {
-        } ../build-support/setup-hooks/keep-build-tree.sh;
-        enableGCOVInstrumentation = makeSetupHook {
-        } ../build-support/setup-hooks/enable-coverage-instrumentation.sh;
-        makeGCOVReport = makeSetupHook {
-          deps = [
-            pkgs.lcov
-            pkgs.enableGCOVInstrumentation
-          ];
-        } ../build-support/setup-hooks/make-coverage-analysis-report.sh;
-        abduco = callPackage ../tools/misc/abduco {
-        };
-        acct = callPackage ../tools/system/acct {
-        };
-        acoustidFingerprinter = callPackage ../tools/audio/acoustid-fingerprinter {
-          ffmpeg = ffmpeg_1;
-        };
-        actdiag = pythonPackages.actdiag;
-        adom = callPackage ../games/adom {
-        };
-        aefs = callPackage ../tools/filesystems/aefs {
-        };
-        aegisub = callPackage ../applications/video/aegisub {
-          wxGTK = wxGTK30;
-          lua = lua5_1;
-        };
-        aespipe = callPackage ../tools/security/aespipe {
-        };
-        aescrypt = callPackage ../tools/misc/aescrypt {
-        };
-        ahcpd = callPackage ../tools/networking/ahcpd {
-        };
-        aircrackng = callPackage ../tools/networking/aircrack-ng {
-        };
-        analog = callPackage ../tools/admin/analog {
-        };
-        apktool = callPackage ../development/tools/apktool {
-          buildTools = androidenv.buildTools;
-        };
-        apt-offline = callPackage ../tools/misc/apt-offline {
-        };
-        archivemount = callPackage ../tools/filesystems/archivemount {
-        };
-        arandr = callPackage ../tools/X11/arandr {
-        };
-        arcanist = callPackage ../development/tools/misc/arcanist {
-        };
-        arduino_core = callPackage ../development/arduino/arduino-core {
-          jdk = jdk;
-          jre = jdk;
-        };
-        argyllcms = callPackage ../tools/graphics/argyllcms {
-        };
-        arp-scan = callPackage ../tools/misc/arp-scan {
-        };
-        ascii = callPackage ../tools/text/ascii {
-        };
-        asymptote = builderDefsPackage ../tools/graphics/asymptote {
-          inherit freeglut ghostscriptX
-          imagemagick fftw boehmgc mesa
-          ncurses readline gsl libsigsegv
-          python zlib perl texinfo xz;
-          texLive = texLiveAggregationFun {
-            paths = [
-              texLive
-              texLiveExtra
-              texLiveCMSuper
-            ];
-          };
-        };
-        awscli = callPackage ../tools/admin/awscli {
-        };
-        ec2_api_tools = callPackage ../tools/virtualization/ec2-api-tools {
-        };
-        ec2_ami_tools = callPackage ../tools/virtualization/ec2-ami-tools {
-        };
-        altermime = callPackage ../tools/networking/altermime {
-        };
-        amule = callPackage ../tools/networking/p2p/amule {
-        };
-        amuleDaemon = appendToName "daemon" (amule.override {
-          monolithic = false;
-          daemon = true;
-        });
-        amuleGui = appendToName "gui" (amule.override {
-          monolithic = false;
-          client = true;
-        });
-        androidenv = import ../development/mobile/androidenv {
-          inherit pkgs;
-          pkgs_i686 = pkgsi686Linux;
-        };
-        apg = callPackage ../tools/security/apg {
-        };
-        grc = callPackage ../tools/misc/grc {
-        };
-        otool = callPackage ../os-specific/darwin/otool {
-        };
-        pass = callPackage ../tools/security/pass {
-          gnupg = gnupg1compat;
-        };
-        setfile = callPackage ../os-specific/darwin/setfile {
-        };
-        install_name_tool = callPackage ../os-specific/darwin/install_name_tool {
-        };
-        xcodeenv = callPackage ../development/mobile/xcodeenv {
-        };
-        titaniumenv = callPackage ../development/mobile/titaniumenv {
-          inherit pkgs;
-          pkgs_i686 = pkgsi686Linux;
-        };
-        inherit (androidenv) androidsdk_4_1;
-        aria2 = callPackage ../tools/networking/aria2 {
-        };
-        aria = aria2;
-        at = callPackage ../tools/system/at {
-        };
-        atftp = callPackage ../tools/networking/atftp {
-        };
-        autogen = callPackage ../development/tools/misc/autogen {
-        };
-        autojump = callPackage ../tools/misc/autojump {
-        };
-        autorandr = callPackage ../tools/misc/autorandr {
-          inherit (xorg) xrandr xdpyinfo;
-        };
-        avahi = callPackage ../development/libraries/avahi {
-          qt4Support = config.avahi.qt4Support or false;
-        };
-        aws = callPackage ../tools/virtualization/aws {
-        };
-        aws_mturk_clt = callPackage ../tools/misc/aws-mturk-clt {
-        };
-        axel = callPackage ../tools/networking/axel {
-        };
-        azureus = callPackage ../tools/networking/p2p/azureus {
-        };
-        basex = callPackage ../tools/text/xml/basex {
-        };
-        babeld = callPackage ../tools/networking/babeld {
-        };
-        badvpn = callPackage ../tools/networking/badvpn {
-        };
-        banner = callPackage ../games/banner {
-        };
-        barcode = callPackage ../tools/graphics/barcode {
-        };
-        bc = callPackage ../tools/misc/bc {
-        };
-        bcache-tools = callPackage ../tools/filesystems/bcache-tools {
-        };
-        bchunk = callPackage ../tools/cd-dvd/bchunk {
-        };
-        bfr = callPackage ../tools/misc/bfr {
-        };
-        bindfs = callPackage ../tools/filesystems/bindfs {
-        };
-        bitbucket-cli = pythonPackages.bitbucket-cli;
-        blockdiag = pythonPackages.blockdiag;
-        bmon = callPackage ../tools/misc/bmon {
-        };
-        bochs = callPackage ../applications/virtualization/bochs {
-          wxSupport = false;
-        };
-        boomerang = callPackage ../development/tools/boomerang {
-        };
-        bootchart = callPackage ../tools/system/bootchart {
-        };
-        bro = callPackage ../applications/networking/ids/bro {
-        };
-        bsod = callPackage ../misc/emulators/bsod {
-        };
-        btrfsProgs = callPackage ../tools/filesystems/btrfsprogs {
-        };
-        bwm_ng = callPackage ../tools/networking/bwm-ng {
-        };
-        byobu = callPackage ../tools/misc/byobu {
-        };
-        capstone = callPackage ../development/libraries/capstone {
-        };
-        catdoc = callPackage ../tools/text/catdoc {
-        };
-        ccnet = callPackage ../tools/networking/ccnet {
-        };
-        consul = callPackage ../servers/consul {
-        };
-        consul_ui = callPackage ../servers/consul/ui.nix {
-        };
-        chntpw = callPackage ../tools/security/chntpw {
-        };
-        coprthr = callPackage ../development/libraries/coprthr {
-          flex = flex_2_5_35;
-        };
-        crawl = callPackage ../games/crawl {
-          lua = lua5;
-        };
-        cv = callPackage ../tools/misc/cv {
-        };
-        direnv = callPackage ../tools/misc/direnv {
-        };
-        ditaa = callPackage ../tools/graphics/ditaa {
-        };
-        dlx = callPackage ../misc/emulators/dlx {
-        };
-        eggdrop = callPackage ../tools/networking/eggdrop {
-        };
-        enca = callPackage ../tools/text/enca {
-        };
-        fasd = callPackage ../tools/misc/fasd {
-          inherit (haskellPackages) pandoc;
-        };
-        fop = callPackage ../tools/typesetting/fop {
-        };
-        mcrl = callPackage ../tools/misc/mcrl {
-        };
-        mcrl2 = callPackage ../tools/misc/mcrl2 {
-        };
-        mpdcron = callPackage ../tools/audio/mpdcron {
-        };
-        syslogng = callPackage ../tools/system/syslog-ng {
-        };
-        syslogng_incubator = callPackage ../tools/system/syslog-ng-incubator {
-        };
-        rsyslog = callPackage ../tools/system/rsyslog {
-        };
-        mcrypt = callPackage ../tools/misc/mcrypt {
-        };
-        mcelog = callPackage ../os-specific/linux/mcelog {
-        };
-        apparix = callPackage ../tools/misc/apparix {
-        };
-        appdata-tools = callPackage ../tools/misc/appdata-tools {
-        };
-        asciidoc = callPackage ../tools/typesetting/asciidoc {
-          inherit (pythonPackages) matplotlib
-          numpy aafigure
-          recursivePthLoader;
-          enableStandardFeatures = false;
-        };
-        asciidoc-full = appendToName "full" (asciidoc.override {
-          inherit (pythonPackages) pygments;
-          enableStandardFeatures = true;
-        });
-        autossh = callPackage ../tools/networking/autossh {
-        };
-        bacula = callPackage ../tools/backup/bacula {
-        };
-        beanstalkd = callPackage ../servers/beanstalkd {
-        };
-        bgs = callPackage ../tools/X11/bgs {
-        };
-        biber = callPackage ../tools/typesetting/biber {
-          inherit (perlPackages) autovivification
-          BusinessISBN BusinessISMN
-          BusinessISSN ConfigAutoConf
-          DataCompare DataDump DateSimple
-          EncodeEUCJPASCII EncodeHanExtra
-          EncodeJIS2K ExtUtilsLibBuilder
-          FileSlurp IPCRun3 Log4Perl
-          LWPProtocolHttps ListAllUtils
-          ListMoreUtils ModuleBuild
-          MozillaCA ReadonlyXS
-          RegexpCommon TextBibTeX
-          UnicodeCollate UnicodeLineBreak
-          URI XMLLibXMLSimple XMLLibXSLT
-          XMLWriter;
-        };
-        bibtextools = callPackage ../tools/typesetting/bibtex-tools {
-          inherit (strategoPackages016) strategoxt
-          sdf;
-        };
-        bittorrent = callPackage ../tools/networking/p2p/bittorrent {
-          gui = true;
-        };
-        bittornado = callPackage ../tools/networking/p2p/bit-tornado {
-        };
-        blueman = callPackage ../tools/bluetooth/blueman {
-          inherit (pythonPackages) notify;
-        };
-        bmrsa = builderDefsPackage (import ../tools/security/bmrsa/11.nix) {
-          inherit unzip;
-        };
-        bogofilter = callPackage ../tools/misc/bogofilter {
-        };
-        bsdiff = callPackage ../tools/compression/bsdiff {
-        };
-        btar = callPackage ../tools/backup/btar {
-        };
-        bud = callPackage ../tools/networking/bud {
-          inherit (pythonPackages) gyp;
-        };
-        bup = callPackage ../tools/backup/bup {
-          inherit (pythonPackages) pyxattr
-          pylibacl setuptools fuse;
-          inherit (haskellPackages) pandoc;
-          par2Support = config.bup.par2Support or false;
-        };
-        ori = callPackage ../tools/backup/ori {
-        };
-        atool = callPackage ../tools/archivers/atool {
-        };
-        bzip2 = callPackage ../tools/compression/bzip2 {
-        };
-        cabextract = callPackage ../tools/archivers/cabextract {
-        };
-        cadaver = callPackage ../tools/networking/cadaver {
-        };
-        cantata = callPackage ../applications/audio/cantata {
-        };
-        can-utils = callPackage ../os-specific/linux/can-utils {
-        };
-        ccid = callPackage ../tools/security/ccid {
-        };
-        ccrypt = callPackage ../tools/security/ccrypt {
-        };
-        cdecl = callPackage ../development/tools/cdecl {
-        };
-        cdrdao = callPackage ../tools/cd-dvd/cdrdao {
-        };
-        cdrkit = callPackage ../tools/cd-dvd/cdrkit {
-        };
-        ceph = callPackage ../tools/filesystems/ceph {
-        };
-        cfdg = builderDefsPackage ../tools/graphics/cfdg {
-          inherit libpng bison flex
-          ffmpeg;
-        };
-        checkinstall = callPackage ../tools/package-management/checkinstall {
-        };
-        cheetahTemplate = builderDefsPackage (import ../tools/text/cheetah-template/2.0.1.nix) {
-          inherit makeWrapper python;
-        };
-        chkrootkit = callPackage ../tools/security/chkrootkit {
-        };
-        chrony = callPackage ../tools/networking/chrony {
-        };
-        chunkfs = callPackage ../tools/filesystems/chunkfs {
-        };
-        chunksync = callPackage ../tools/backup/chunksync {
-        };
-        cjdns = callPackage ../tools/networking/cjdns {
-        };
-        cksfv = callPackage ../tools/networking/cksfv {
-        };
-        clementine = callPackage ../applications/audio/clementine {
-        };
-        ciopfs = callPackage ../tools/filesystems/ciopfs {
-        };
-        colord = callPackage ../tools/misc/colord {
-        };
-        colord-gtk = callPackage ../tools/misc/colord-gtk {
-        };
-        colordiff = callPackage ../tools/text/colordiff {
-        };
-        concurrencykit = callPackage ../development/libraries/concurrencykit {
-        };
-        connect = callPackage ../tools/networking/connect {
-        };
-        conspy = callPackage ../os-specific/linux/conspy {
-        };
-        connman = callPackage ../tools/networking/connman {
-        };
-        connmanui = callPackage ../tools/networking/connmanui {
-        };
-        convertlit = callPackage ../tools/text/convertlit {
-        };
-        collectd = callPackage ../tools/system/collectd {
-        };
-        colormake = callPackage ../development/tools/build-managers/colormake {
-        };
-        cowsay = callPackage ../tools/misc/cowsay {
-        };
-        cpuminer = callPackage ../tools/misc/cpuminer {
-        };
-        cuetools = callPackage ../tools/cd-dvd/cuetools {
-        };
-        unifdef = callPackage ../development/tools/misc/unifdef {
-        };
-        "unionfs-fuse" = callPackage ../tools/filesystems/unionfs-fuse {
-        };
-        usb_modeswitch = callPackage ../development/tools/misc/usb-modeswitch {
-        };
-        biosdevname = callPackage ../tools/networking/biosdevname {
-        };
-        clamav = callPackage ../tools/security/clamav {
-        };
-        cloc = callPackage ../tools/misc/cloc {
-          inherit (perlPackages) perl
-          AlgorithmDiff RegexpCommon;
-        };
-        cloog = callPackage ../development/libraries/cloog {
-        };
-        cloogppl = callPackage ../development/libraries/cloog-ppl {
-        };
-        convmv = callPackage ../tools/misc/convmv {
-        };
-        cool-old-term = callPackage ../applications/misc/cool-old-term {
-        };
-        coreutils = callPackage ../tools/misc/coreutils {
-          aclSupport = crossSystem == null && stdenv.isLinux;
-        };
-        cpio = callPackage ../tools/archivers/cpio {
-        };
-        cromfs = callPackage ../tools/archivers/cromfs {
-        };
-        cron = callPackage ../tools/system/cron {
-        };
-        cudatoolkit5 = callPackage ../development/compilers/cudatoolkit/5.5.nix {
-          python = python26;
-        };
-        cudatoolkit6 = callPackage ../development/compilers/cudatoolkit/6.0.nix {
-          python = python26;
-        };
-        cudatoolkit = cudatoolkit5;
-        curl = callPackage ../tools/networking/curl rec {
-          fetchurl = fetchurlBoot;
-          zlibSupport = true;
-          sslSupport = zlibSupport;
-          scpSupport = zlibSupport && !stdenv.isSunOS && !stdenv.isCygwin;
-        };
-        curl3 = callPackage ../tools/networking/curl/7.15.nix rec {
-          zlibSupport = true;
-          sslSupport = zlibSupport;
-        };
-        cunit = callPackage ../tools/misc/cunit {
-        };
-        curlftpfs = callPackage ../tools/filesystems/curlftpfs {
-        };
-        cutter = callPackage ../tools/networking/cutter {
-        };
-        dadadodo = builderDefsPackage (import ../tools/text/dadadodo) {
-        };
-        daq = callPackage ../applications/networking/ids/daq {
-        };
-        dar = callPackage ../tools/archivers/dar {
-        };
-        davfs2 = callPackage ../tools/filesystems/davfs2 {
-        };
-        dbench = callPackage ../development/tools/misc/dbench {
-        };
-        dcraw = callPackage ../tools/graphics/dcraw {
-        };
-        debian_devscripts = callPackage ../tools/misc/debian-devscripts {
-          inherit (perlPackages) CryptSSLeay
-          LWP TimeDate DBFile
-          FileDesktopEntry;
-        };
-        debootstrap = callPackage ../tools/misc/debootstrap {
-        };
-        detox = callPackage ../tools/misc/detox {
-        };
-        ddclient = callPackage ../tools/networking/ddclient {
-        };
-        dd_rescue = callPackage ../tools/system/dd_rescue {
-        };
-        ddrescue = callPackage ../tools/system/ddrescue {
-        };
-        deluge = pythonPackages.deluge;
-        desktop_file_utils = callPackage ../tools/misc/desktop-file-utils {
-        };
-        despotify = callPackage ../development/libraries/despotify {
-        };
-        dev86 = callPackage ../development/compilers/dev86 {
-        };
-        dnsmasq = callPackage ../tools/networking/dnsmasq {
-        };
-        dnstop = callPackage ../tools/networking/dnstop {
-        };
-        dhcp = callPackage ../tools/networking/dhcp {
-        };
-        dhcpcd = callPackage ../tools/networking/dhcpcd {
-        };
-        diffstat = callPackage ../tools/text/diffstat {
-        };
-        diffutils = callPackage ../tools/text/diffutils {
-        };
-        wgetpaste = callPackage ../tools/text/wgetpaste {
-        };
-        dirmngr = callPackage ../tools/security/dirmngr {
-        };
-        disper = callPackage ../tools/misc/disper {
-        };
-        dmd = callPackage ../development/compilers/dmd {
-        };
-        dmg2img = callPackage ../tools/misc/dmg2img {
-        };
-        docbook2odf = callPackage ../tools/typesetting/docbook2odf {
-          inherit (perlPackages) PerlMagick;
-        };
-        docbook2x = callPackage ../tools/typesetting/docbook2x {
-          inherit (perlPackages) XMLSAX
-          XMLParser XMLNamespaceSupport;
-        };
-        dosfstools = callPackage ../tools/filesystems/dosfstools {
-        };
-        dotnetfx35 = callPackage ../development/libraries/dotnetfx35 {
-        };
-        dotnetfx40 = callPackage ../development/libraries/dotnetfx40 {
-        };
-        dropbear = callPackage ../tools/networking/dropbear {
-        };
-        dtach = callPackage ../tools/misc/dtach {
-        };
-        duo-unix = callPackage ../tools/security/duo-unix {
-        };
-        duplicity = callPackage ../tools/backup/duplicity {
-          inherit (pythonPackages) boto
-          lockfile;
-          gnupg = gnupg1;
-        };
-        duply = callPackage ../tools/backup/duply {
-        };
-        dvdplusrwtools = callPackage ../tools/cd-dvd/dvd+rw-tools {
-        };
-        dvgrab = callPackage ../tools/video/dvgrab {
-        };
-        dvtm = callPackage ../tools/misc/dvtm {
-        };
-        e2fsprogs = callPackage ../tools/filesystems/e2fsprogs {
-        };
-        easyrsa = callPackage ../tools/networking/easyrsa {
-        };
-        ebook_tools = callPackage ../tools/text/ebook-tools {
-        };
-        ecryptfs = callPackage ../tools/security/ecryptfs {
-        };
-        editres = callPackage ../tools/graphics/editres {
-          inherit (xlibs) libXt libXaw;
-          inherit (xorg) utilmacros;
-        };
-        edk2 = callPackage ../development/compilers/edk2 {
-        };
-        efibootmgr = callPackage ../tools/system/efibootmgr {
-        };
-        efivar = callPackage ../tools/system/efivar {
-        };
-        evemu = callPackage ../tools/system/evemu {
-        };
-        elasticsearch = callPackage ../servers/search/elasticsearch {
-        };
-        elasticsearchPlugins = recurseIntoAttrs (callPackage ../servers/search/elasticsearch/plugins.nix {
-        });
-        emv = callPackage ../tools/misc/emv {
-        };
-        enblendenfuse = callPackage ../tools/graphics/enblend-enfuse {
-        };
-        encfs = callPackage ../tools/filesystems/encfs {
-        };
-        enscript = callPackage ../tools/text/enscript {
-        };
-        ethtool = callPackage ../tools/misc/ethtool {
-        };
-        ettercap = callPackage ../applications/networking/sniffers/ettercap {
-        };
-        euca2ools = callPackage ../tools/virtualization/euca2ools {
-          pythonPackages = python26Packages;
-        };
-        evtest = callPackage ../applications/misc/evtest {
-        };
-        exempi = callPackage ../development/libraries/exempi {
-        };
-        execline = callPackage ../tools/misc/execline {
-        };
-        exercism = callPackage ../development/tools/exercism {
-        };
-        exif = callPackage ../tools/graphics/exif {
-        };
-        exiftags = callPackage ../tools/graphics/exiftags {
-        };
-        extundelete = callPackage ../tools/filesystems/extundelete {
-        };
-        expect = callPackage ../tools/misc/expect {
-        };
-        f2fs-tools = callPackage ../tools/filesystems/f2fs-tools {
-        };
-        fabric = pythonPackages.fabric;
-        fail2ban = callPackage ../tools/security/fail2ban {
-          systemd = systemd.override {
-            pythonSupport = true;
-          };
-        };
-        fakeroot = callPackage ../tools/system/fakeroot {
-        };
-        fakechroot = callPackage ../tools/system/fakechroot {
-        };
-        fcitx = callPackage ../tools/inputmethods/fcitx {
-        };
-        fcron = callPackage ../tools/system/fcron {
-        };
-        fdm = callPackage ../tools/networking/fdm {
-        };
-        figlet = callPackage ../tools/misc/figlet {
-        };
-        file = callPackage ../tools/misc/file {
-        };
-        filegive = callPackage ../tools/networking/filegive {
-        };
-        fileschanged = callPackage ../tools/misc/fileschanged {
-        };
-        findutils = callPackage ../tools/misc/findutils {
-        };
-        finger_bsd = callPackage ../tools/networking/bsd-finger {
-        };
-        fio = callPackage ../tools/system/fio {
-        };
-        flashtool = callPackage_i686 ../development/mobile/flashtool {
-          platformTools = androidenv.platformTools;
-        };
-        flpsed = callPackage ../applications/editors/flpsed {
-        };
-        flvstreamer = callPackage ../tools/networking/flvstreamer {
-        };
-        libbsd = callPackage ../development/libraries/libbsd {
-        };
-        lprof = callPackage ../tools/graphics/lprof {
-        };
-        fdk_aac = callPackage ../development/libraries/fdk-aac {
-        };
-        flvtool2 = callPackage ../tools/video/flvtool2 {
-        };
-        fontforge = lowPrio (callPackage ../tools/misc/fontforge {
-        });
-        fontforgeX = callPackage ../tools/misc/fontforge {
-          withX11 = true;
-        };
-        forktty = callPackage ../os-specific/linux/forktty {
-        };
-        fortune = callPackage ../tools/misc/fortune {
-        };
-        fox = callPackage ../development/libraries/fox/default.nix {
-          libpng = libpng12;
-        };
-        fox_1_6 = callPackage ../development/libraries/fox/fox-1.6.nix {
-        };
-        fping = callPackage ../tools/networking/fping {
-        };
-        fprot = callPackage ../tools/security/fprot {
-        };
-        freeipmi = callPackage ../tools/system/freeipmi {
-        };
-        freetalk = callPackage ../applications/networking/instant-messengers/freetalk {
-          guile = guile_1_8;
-        };
-        freetds = callPackage ../development/libraries/freetds {
-        };
-        ftgl = callPackage ../development/libraries/ftgl {
-        };
-        ftgl212 = callPackage ../development/libraries/ftgl/2.1.2.nix {
-        };
-        fuppes = callPackage ../tools/networking/fuppes {
-          ffmpeg = ffmpeg_0_6_90;
-        };
-        fsfs = callPackage ../tools/filesystems/fsfs {
-        };
-        fuse_zip = callPackage ../tools/filesystems/fuse-zip {
-        };
-        fuse_exfat = callPackage ../tools/filesystems/fuse-exfat {
-        };
-        dos2unix = callPackage ../tools/text/dos2unix {
-        };
-        uni2ascii = callPackage ../tools/text/uni2ascii {
-        };
-        g500-control = callPackage ../tools/misc/g500-control {
-        };
-        galculator = callPackage ../applications/misc/galculator {
-          gtk = gtk3;
-        };
-        gawk = callPackage ../tools/text/gawk {
-        };
-        gawkInteractive = appendToName "interactive" (gawk.override {
-          readlineSupport = true;
-        });
-        gbdfed = callPackage ../tools/misc/gbdfed {
-          gtk = gtk2;
-        };
-        gdmap = callPackage ../tools/system/gdmap {
-        };
-        genext2fs = callPackage ../tools/filesystems/genext2fs {
-        };
-        gengetopt = callPackage ../development/tools/misc/gengetopt {
-        };
-        getmail = callPackage ../tools/networking/getmail {
-        };
-        getopt = callPackage ../tools/misc/getopt {
-        };
-        gftp = callPackage ../tools/networking/gftp {
-        };
-        gifsicle = callPackage ../tools/graphics/gifsicle {
-        };
-        glusterfs = callPackage ../tools/filesystems/glusterfs {
-        };
-        glmark2 = callPackage ../tools/graphics/glmark2 {
-        };
-        glxinfo = callPackage ../tools/graphics/glxinfo {
-        };
-        gmvault = callPackage ../tools/networking/gmvault {
-        };
-        gnokii = builderDefsPackage (import ../tools/misc/gnokii) {
-          inherit intltool perl gettext
-          libusb pkgconfig bluez readline
-          pcsclite libical gtk glib;
-          inherit (xorg) libXpm;
-        };
-        gnufdisk = callPackage ../tools/system/fdisk {
-          guile = guile_1_8;
-        };
-        gnugrep = callPackage ../tools/text/gnugrep {
-          libiconv = libiconvOrNull;
-        };
-        gnulib = callPackage ../development/tools/gnulib {
-        };
-        gnupatch = callPackage ../tools/text/gnupatch {
-        };
-        gnupg1orig = callPackage ../tools/security/gnupg1 {
-        };
-        gnupg1compat = callPackage ../tools/security/gnupg1compat {
-        };
-        gnupg1 = gnupg1compat;
-        gnupg = callPackage ../tools/security/gnupg {
-          libusb = libusb1;
-        };
-        gnupg2_1 = lowPrio (callPackage ../tools/security/gnupg/git.nix {
-          libassuan = libassuan2_1;
-        });
-        gnuplot = callPackage ../tools/graphics/gnuplot {
-        };
-        gnuplot_qt = gnuplot.override {
-          withQt = true;
-        };
-        gnuplot_aquaterm = gnuplot.override {
-          aquaterm = true;
-        };
-        gnused = callPackage ../tools/text/gnused {
-        };
-        gnutar = callPackage ../tools/archivers/gnutar {
-        };
-        gnuvd = callPackage ../tools/misc/gnuvd {
-        };
-        goaccess = callPackage ../tools/misc/goaccess {
-        };
-        googleAuthenticator = callPackage ../os-specific/linux/google-authenticator {
-        };
-        gource = callPackage ../applications/version-management/gource {
-        };
-        gpodder = callPackage ../applications/audio/gpodder {
-        };
-        gptfdisk = callPackage ../tools/system/gptfdisk {
-        };
-        grafana = callPackage ../development/tools/misc/grafana {
-        };
-        grafx2 = callPackage ../applications/graphics/grafx2 {
-        };
-        graphviz = callPackage ../tools/graphics/graphviz {
-        };
-        graphviz_2_0 = callPackage ../tools/graphics/graphviz/2.0.nix {
-        };
-        grive = callPackage ../tools/filesystems/grive {
-          json_c = json-c-0-11;
-        };
-        groff = callPackage ../tools/text/groff {
-          ghostscript = null;
-        };
-        grub = callPackage_i686 ../tools/misc/grub {
-          buggyBiosCDSupport = config.grub.buggyBiosCDSupport or true;
-        };
-        grub2 = callPackage ../tools/misc/grub/2.0x.nix {
-          libusb = libusb1;
-          flex = flex_2_5_35;
-        };
-        grub2_efi = grub2.override {
-          EFIsupport = true;
-        };
-        gssdp = callPackage ../development/libraries/gssdp {
-          inherit (gnome) libsoup;
-        };
-        gt5 = callPackage ../tools/system/gt5 {
-        };
-        gtest = callPackage ../development/libraries/gtest {
-        };
-        gtkdatabox = callPackage ../development/libraries/gtkdatabox {
-        };
-        gtkgnutella = callPackage ../tools/networking/p2p/gtk-gnutella {
-        };
-        gtkvnc = callPackage ../tools/admin/gtk-vnc {
-        };
-        gtmess = callPackage ../applications/networking/instant-messengers/gtmess {
-        };
-        gummiboot = callPackage ../tools/misc/gummiboot {
-        };
-        gupnp = callPackage ../development/libraries/gupnp {
-          inherit (gnome) libsoup;
-        };
-        gupnp_av = callPackage ../development/libraries/gupnp-av {
-        };
-        gupnp_igd = callPackage ../development/libraries/gupnp-igd {
-        };
-        gupnptools = callPackage ../tools/networking/gupnp-tools {
-        };
-        gvpe = builderDefsPackage ../tools/networking/gvpe {
-          inherit openssl gmp nettools
-          iproute;
-        };
-        gvolicon = callPackage ../tools/audio/gvolicon {
-        };
-        gzip = callPackage ../tools/compression/gzip {
-        };
-        gzrt = callPackage ../tools/compression/gzrt {
-        };
-        partclone = callPackage ../tools/backup/partclone {
-        };
-        partimage = callPackage ../tools/backup/partimage {
-        };
-        pigz = callPackage ../tools/compression/pigz {
-        };
-        haproxy = callPackage ../tools/networking/haproxy {
-        };
-        haveged = callPackage ../tools/security/haveged {
-        };
-        hardlink = callPackage ../tools/system/hardlink {
-        };
-        hashcat = callPackage ../tools/security/hashcat {
-        };
-        halibut = callPackage ../tools/typesetting/halibut {
-        };
-        hddtemp = callPackage ../tools/misc/hddtemp {
-        };
-        hdf5 = callPackage ../tools/misc/hdf5 {
-          szip = null;
-        };
-        heimdall = callPackage ../tools/misc/heimdall {
-        };
-        hevea = callPackage ../tools/typesetting/hevea {
-        };
-        highlight = callPackage ../tools/text/highlight {
-          lua = lua5;
-        };
-        host = callPackage ../tools/networking/host {
-        };
-        hping = callPackage ../tools/networking/hping {
-        };
-        httpie = callPackage ../tools/networking/httpie {
-        };
-        httpfs2 = callPackage ../tools/filesystems/httpfs {
-        };
-        iasl = callPackage ../development/compilers/iasl {
-        };
-        icecast = callPackage ../servers/icecast {
-        };
-        icoutils = callPackage ../tools/graphics/icoutils {
-        };
-        idutils = callPackage ../tools/misc/idutils {
-        };
-        idle3tools = callPackage ../tools/system/idle3tools {
-        };
-        iftop = callPackage ../tools/networking/iftop {
-        };
-        imapproxy = callPackage ../tools/networking/imapproxy {
-        };
-        imapsync = callPackage ../tools/networking/imapsync {
-          inherit (perlPackages) MailIMAPClient;
-        };
-        inadyn = callPackage ../tools/networking/inadyn {
-        };
-        inetutils = callPackage ../tools/networking/inetutils {
-        };
-        ioping = callPackage ../tools/system/ioping {
-        };
-        iodine = callPackage ../tools/networking/iodine {
-        };
-        iperf = callPackage ../tools/networking/iperf {
-        };
-        ipmitool = callPackage ../tools/system/ipmitool {
-          static = false;
-        };
-        ipmiutil = callPackage ../tools/system/ipmiutil {
-        };
-        ised = callPackage ../tools/misc/ised {
-        };
-        isl = callPackage ../development/libraries/isl {
-        };
-        isl_0_12 = callPackage ../development/libraries/isl/0.12.2.nix {
-        };
-        isync = callPackage ../tools/networking/isync {
-        };
-        jd-gui = callPackage_i686 ../tools/security/jd-gui {
-        };
-        jdiskreport = callPackage ../tools/misc/jdiskreport {
-        };
-        jfsrec = callPackage ../tools/filesystems/jfsrec {
-          boost = boost144;
-        };
-        jfsutils = callPackage ../tools/filesystems/jfsutils {
-        };
-        jhead = callPackage ../tools/graphics/jhead {
-        };
-        jing = callPackage ../tools/text/xml/jing {
-        };
-        jmtpfs = callPackage ../tools/filesystems/jmtpfs {
-        };
-        jnettop = callPackage ../tools/networking/jnettop {
-        };
-        jq = callPackage ../development/tools/jq {
-        };
-        jscoverage = callPackage ../development/tools/misc/jscoverage {
-        };
-        jwhois = callPackage ../tools/networking/jwhois {
-        };
-        kazam = callPackage ../applications/video/kazam {
-        };
-        kalibrate-rtl = callPackage ../tools/misc/kalibrate-rtl {
-        };
-        kexectools = callPackage ../os-specific/linux/kexectools {
-        };
-        keychain = callPackage ../tools/misc/keychain {
-        };
-        kismet = callPackage ../applications/networking/sniffers/kismet {
-        };
-        less = callPackage ../tools/misc/less {
-        };
-        lockfileProgs = callPackage ../tools/misc/lockfile-progs {
-        };
-        logstash = callPackage ../tools/misc/logstash {
-        };
-        logstash-forwarder = callPackage ../tools/misc/logstash-forwarder {
-        };
-        kippo = callPackage ../servers/kippo {
-        };
-        klavaro = callPackage ../games/klavaro {
-        };
-        kzipmix = callPackage_i686 ../tools/compression/kzipmix {
-        };
-        minidlna = callPackage ../tools/networking/minidlna {
-          ffmpeg = ffmpeg_0_10;
-        };
-        mmv = callPackage ../tools/misc/mmv {
-        };
-        most = callPackage ../tools/misc/most {
-        };
-        multitail = callPackage ../tools/misc/multitail {
-        };
-        netperf = callPackage ../applications/networking/netperf {
-        };
-        ninka = callPackage ../development/tools/misc/ninka {
-        };
-        nodejs = callPackage ../development/web/nodejs {
-        };
-        nodePackages = recurseIntoAttrs (import ./node-packages.nix {
-          inherit pkgs stdenv nodejs
-          fetchurl fetchgit;
-          neededNatives = [
-            python
-          ] ++ lib.optional (lib.elem system lib.platforms.linux) utillinux;
-          self = pkgs.nodePackages;
-        });
-        ldapvi = callPackage ../tools/misc/ldapvi {
-        };
-        ldns = callPackage ../development/libraries/ldns {
-        };
-        lftp = callPackage ../tools/networking/lftp {
-        };
-        libconfig = callPackage ../development/libraries/libconfig {
-        };
-        libee = callPackage ../development/libraries/libee {
-        };
-        libestr = callPackage ../development/libraries/libestr {
-        };
-        libevdev = callPackage ../development/libraries/libevdev {
-        };
-        liboauth = callPackage ../development/libraries/liboauth {
-        };
-        libtirpc = callPackage ../development/libraries/ti-rpc {
-        };
-        libshout = callPackage ../development/libraries/libshout {
-        };
-        libqmi = callPackage ../development/libraries/libqmi {
-        };
-        libmbim = callPackage ../development/libraries/libmbim {
-        };
-        libtorrent = callPackage ../tools/networking/p2p/libtorrent {
-        };
-        logcheck = callPackage ../tools/system/logcheck {
-          inherit (perlPackages) mimeConstruct;
-        };
-        logrotate = callPackage ../tools/system/logrotate {
-        };
-        logstalgia = callPackage ../tools/graphics/logstalgia {
-        };
-        lout = callPackage ../tools/typesetting/lout {
-        };
-        lrzip = callPackage ../tools/compression/lrzip {
-        };
-        lsh = lowPrio (callPackage ../tools/networking/lsh {
-        });
-        lshw = callPackage ../tools/system/lshw {
-        };
-        lxc = callPackage ../os-specific/linux/lxc {
-        };
-        lzip = callPackage ../tools/compression/lzip {
-        };
-        lzma = xz;
-        xz = callPackage ../tools/compression/xz {
-        };
-        lzop = callPackage ../tools/compression/lzop {
-        };
-        maildrop = callPackage ../tools/networking/maildrop {
-        };
-        mailpile = callPackage ../applications/networking/mailreaders/mailpile {
-        };
-        mailutils = callPackage ../tools/networking/mailutils {
-          guile = guile_1_8;
-        };
-        mairix = callPackage ../tools/text/mairix {
-        };
-        makemkv = callPackage ../applications/video/makemkv {
-        };
-        man = callPackage ../tools/misc/man {
-        };
-        man_db = callPackage ../tools/misc/man-db {
-        };
-        memtest86 = callPackage ../tools/misc/memtest86 {
-        };
-        memtest86plus = callPackage ../tools/misc/memtest86+ {
-        };
-        meo = callPackage ../tools/security/meo {
-        };
-        mc = callPackage ../tools/misc/mc {
-        };
-        mcabber = callPackage ../applications/networking/instant-messengers/mcabber {
-        };
-        mcron = callPackage ../tools/system/mcron {
-          guile = guile_1_8;
-        };
-        mdbtools = callPackage ../tools/misc/mdbtools {
-        };
-        mdbtools_git = callPackage ../tools/misc/mdbtools/git.nix {
-          inherit (gnome) scrollkeeper;
-        };
-        mednafen = callPackage ../misc/emulators/mednafen {
-        };
-        mednafen-server = callPackage ../misc/emulators/mednafen/server.nix {
-        };
-        megacli = callPackage ../tools/misc/megacli {
-        };
-        megatools = callPackage ../tools/networking/megatools {
-        };
-        mfcuk = callPackage ../tools/security/mfcuk {
-        };
-        minecraft = callPackage ../games/minecraft {
-        };
-        minecraft-server = callPackage ../games/minecraft-server {
-        };
-        minetest = callPackage ../games/minetest {
-          libpng = libpng12;
-        };
-        miniupnpc = callPackage ../tools/networking/miniupnpc {
-        };
-        miniupnpd = callPackage ../tools/networking/miniupnpd {
-        };
-        minixml = callPackage ../development/libraries/minixml {
-        };
-        mjpegtools = callPackage ../tools/video/mjpegtools {
-        };
-        mkcue = callPackage ../tools/cd-dvd/mkcue {
-        };
-        mkpasswd = callPackage ../tools/security/mkpasswd {
-        };
-        mktemp = callPackage ../tools/security/mktemp {
-        };
-        mktorrent = callPackage ../tools/misc/mktorrent {
-        };
-        modemmanager = callPackage ../tools/networking/modemmanager {
-        };
-        monit = callPackage ../tools/system/monit {
-        };
-        mosh = callPackage ../tools/networking/mosh {
-          boost = boostHeaders;
-          inherit (perlPackages) IOTty;
-        };
-        mpage = callPackage ../tools/text/mpage {
-        };
-        mr = callPackage ../applications/version-management/mr {
-        };
-        mscgen = callPackage ../tools/graphics/mscgen {
-        };
-        msf = builderDefsPackage (import ../tools/security/metasploit/3.1.nix) {
-          inherit ruby makeWrapper;
-        };
-        mssys = callPackage ../tools/misc/mssys {
-        };
-        mtdutils = callPackage ../tools/filesystems/mtdutils {
-        };
-        mtools = callPackage ../tools/filesystems/mtools {
-        };
-        mtr = callPackage ../tools/networking/mtr {
-        };
-        multitran = recurseIntoAttrs (let
-          callPackage = newScope pkgs.multitran;
-          in rec {
-            multitrandata = callPackage ../tools/text/multitran/data {
-            };
-            libbtree = callPackage ../tools/text/multitran/libbtree {
-            };
-            libmtsupport = callPackage ../tools/text/multitran/libmtsupport {
-            };
-            libfacet = callPackage ../tools/text/multitran/libfacet {
-            };
-            libmtquery = callPackage ../tools/text/multitran/libmtquery {
-            };
-            mtutils = callPackage ../tools/text/multitran/mtutils {
-            };
-          });
-        munge = callPackage ../tools/security/munge {
-        };
-        muscleframework = callPackage ../tools/security/muscleframework {
-        };
-        muscletool = callPackage ../tools/security/muscletool {
-        };
-        mysql2pgsql = callPackage ../tools/misc/mysql2pgsql {
-        };
-        namazu = callPackage ../tools/text/namazu {
-        };
-        nbd = callPackage ../tools/networking/nbd {
-        };
-        ndjbdns = callPackage ../tools/networking/ndjbdns {
-        };
-        netatalk = callPackage ../tools/filesystems/netatalk {
-        };
-        netcdf = callPackage ../development/libraries/netcdf {
-        };
-        nc6 = callPackage ../tools/networking/nc6 {
-        };
-        ncat = callPackage ../tools/networking/ncat {
-        };
-        ncftp = callPackage ../tools/networking/ncftp {
-        };
-        ncompress = callPackage ../tools/compression/ncompress {
-        };
-        ndisc6 = callPackage ../tools/networking/ndisc6 {
-        };
-        netboot = callPackage ../tools/networking/netboot {
-        };
-        netcat = callPackage ../tools/networking/netcat {
-        };
-        netcat-openbsd = callPackage ../tools/networking/netcat-openbsd {
-        };
-        nethogs = callPackage ../tools/networking/nethogs {
-        };
-        netkittftp = callPackage ../tools/networking/netkit/tftp {
-        };
-        netpbm = callPackage ../tools/graphics/netpbm {
-        };
-        netrw = callPackage ../tools/networking/netrw {
-        };
-        netselect = callPackage ../tools/networking/netselect {
-        };
-        networkmanager = callPackage ../tools/networking/network-manager {
-        };
-        networkmanager_openvpn = callPackage ../tools/networking/network-manager/openvpn.nix {
-        };
-        networkmanager_pptp = callPackage ../tools/networking/network-manager/pptp.nix {
-        };
-        networkmanager_vpnc = callPackage ../tools/networking/network-manager/vpnc.nix {
-        };
-        networkmanager_openconnect = callPackage ../tools/networking/network-manager/openconnect.nix {
-        };
-        networkmanagerapplet = newScope gnome ../tools/networking/network-manager-applet {
-          dconf = gnome3.dconf;
-        };
-        newsbeuter = callPackage ../applications/networking/feedreaders/newsbeuter {
-        };
-        newsbeuter-dev = callPackage ../applications/networking/feedreaders/newsbeuter/dev.nix {
-        };
-        ngrep = callPackage ../tools/networking/ngrep {
-        };
-        ngrok = callPackage ../tools/misc/ngrok {
-        };
-        mpack = callPackage ../tools/networking/mpack {
-        };
-        pa_applet = callPackage ../tools/audio/pa-applet {
-        };
-        pnmixer = callPackage ../tools/audio/pnmixer {
-        };
-        nifskope = callPackage ../tools/graphics/nifskope {
-        };
-        nilfs_utils = callPackage ../tools/filesystems/nilfs-utils {
-        };
-        nitrogen = callPackage ../tools/X11/nitrogen {
-        };
-        nlopt = callPackage ../development/libraries/nlopt {
-        };
-        npapi_sdk = callPackage ../development/libraries/npapi-sdk {
-        };
-        npth = callPackage ../development/libraries/npth {
-        };
-        nmap = callPackage ../tools/security/nmap {
-        };
-        nmap_graphical = callPackage ../tools/security/nmap {
-          inherit (pythonPackages) pysqlite;
-          graphicalSupport = true;
-        };
-        notbit = callPackage ../applications/networking/notbit {
-        };
-        nox = callPackage ../tools/package-management/nox {
-          pythonPackages = python3Packages;
-          nix = nixUnstable;
-        };
-        nss_pam_ldapd = callPackage ../tools/networking/nss-pam-ldapd {
-        };
-        ntfs3g = callPackage ../tools/filesystems/ntfs-3g {
-        };
-        ntfsprogs = pkgs.ntfs3g;
-        ntop = callPackage ../tools/networking/ntop {
-        };
-        ntopng = callPackage ../tools/networking/ntopng {
-        };
-        ntp = callPackage ../tools/networking/ntp {
-        };
-        numdiff = callPackage ../tools/text/numdiff {
-        };
-        nssmdns = callPackage ../tools/networking/nss-mdns {
-        };
-        nwdiag = pythonPackages.nwdiag;
-        nylon = callPackage ../tools/networking/nylon {
-        };
-        nzbget = callPackage ../tools/networking/nzbget {
-        };
-        oathToolkit = callPackage ../tools/security/oath-toolkit {
-        };
-        obex_data_server = callPackage ../tools/bluetooth/obex-data-server {
-        };
-        obexd = callPackage ../tools/bluetooth/obexd {
-        };
-        obexfs = callPackage ../tools/bluetooth/obexfs {
-        };
-        obexftp = callPackage ../tools/bluetooth/obexftp {
-        };
-        obnam = callPackage ../tools/backup/obnam {
-        };
-        odt2txt = callPackage ../tools/text/odt2txt {
-        };
-        offlineimap = callPackage ../tools/networking/offlineimap {
-          inherit (pythonPackages) sqlite3;
-        };
-        opendbx = callPackage ../development/libraries/opendbx {
-        };
-        opendkim = callPackage ../development/libraries/opendkim {
-        };
-        opendylan = callPackage ../development/compilers/opendylan {
-          opendylan-bootstrap = opendylan_bin;
-        };
-        opendylan_bin = callPackage ../development/compilers/opendylan/bin.nix {
-        };
-        openjade = callPackage ../tools/text/sgml/openjade {
-        };
-        openobex = callPackage ../tools/bluetooth/openobex {
-        };
-        openopc = callPackage ../tools/misc/openopc {
-          pythonFull = python27Full.override {
-            extraLibs = [
-              python27Packages.pyro3
-            ];
-          };
-        };
-        openresolv = callPackage ../tools/networking/openresolv {
-        };
-        opensc = callPackage ../tools/security/opensc {
-        };
-        opensc_dnie_wrapper = callPackage ../tools/security/opensc-dnie-wrapper {
-        };
-        openssh = callPackage ../tools/networking/openssh {
-          hpnSupport = false;
-          withKerberos = false;
-          etcDir = "/etc/ssh";
-          pam = if stdenv.isLinux
-            then pam
-            else null;
-        };
-        openssh_hpn = pkgs.appendToName "with-hpn" (openssh.override {
-          hpnSupport = true;
-        });
-        openssh_with_kerberos = pkgs.appendToName "with-kerberos" (openssh.override {
-          withKerberos = true;
-        });
-        opensp = callPackage ../tools/text/sgml/opensp {
-        };
-        spCompat = callPackage ../tools/text/sgml/opensp/compat.nix {
-        };
-        openvpn = callPackage ../tools/networking/openvpn {
-        };
-        openvpn_learnaddress = callPackage ../tools/networking/openvpn/openvpn_learnaddress.nix {
-        };
-        optipng = callPackage ../tools/graphics/optipng {
-          libpng = libpng12;
-        };
-        oslrd = callPackage ../tools/networking/oslrd {
-        };
-        ossec = callPackage ../tools/security/ossec {
-        };
-        otpw = callPackage ../os-specific/linux/otpw {
-        };
-        p7zip = callPackage ../tools/archivers/p7zip {
-        };
-        pal = callPackage ../tools/misc/pal {
-        };
-        panomatic = callPackage ../tools/graphics/panomatic {
-        };
-        par2cmdline = callPackage ../tools/networking/par2cmdline {
-        };
-        parallel = callPackage ../tools/misc/parallel {
-        };
-        parcellite = callPackage ../tools/misc/parcellite {
-        };
-        patchutils = callPackage ../tools/text/patchutils {
-        };
-        parted = callPackage ../tools/misc/parted {
-          hurd = null;
-        };
-        pitivi = callPackage ../applications/video/pitivi {
-          gst = gst_all_1;
-          clutter-gtk = clutter_gtk;
-          inherit (gnome3) gnome_icon_theme
-          gnome_icon_theme_symbolic;
-        };
-        p0f = callPackage ../tools/security/p0f {
-        };
-        pngout = callPackage ../tools/graphics/pngout {
-        };
-        hurdPartedCross = if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-          then makeOverridable ({ hurd }:
-          (parted.override {
-            inherit hurd;
-            enableStatic = true;
-            gettext = null;
-            readline = null;
-            devicemapper = null;
-          }).crossDrv) {
-            hurd = gnu.hurdCrossIntermediate;
-          }
-          else null;
-        ipsecTools = callPackage ../os-specific/linux/ipsec-tools {
-          flex = flex_2_5_35;
-        };
-        patch = gnupatch;
-        pbzip2 = callPackage ../tools/compression/pbzip2 {
-        };
-        pciutils = callPackage ../tools/system/pciutils {
-        };
-        pcsclite = callPackage ../tools/security/pcsclite {
-        };
-        pdf2djvu = callPackage ../tools/typesetting/pdf2djvu {
-        };
-        pdfjam = callPackage ../tools/typesetting/pdfjam {
-        };
-        jbig2enc = callPackage ../tools/graphics/jbig2enc {
-        };
-        pdfread = callPackage ../tools/graphics/pdfread {
-        };
-        briss = callPackage ../tools/graphics/briss {
-        };
-        bully = callPackage ../tools/networking/bully {
-        };
-        pdnsd = callPackage ../tools/networking/pdnsd {
-        };
-        peco = callPackage ../tools/text/peco {
-        };
-        pg_top = callPackage ../tools/misc/pg_top {
-        };
-        pdsh = callPackage ../tools/networking/pdsh {
-          rsh = true;
-          ssh = openssh;
-        };
-        pfstools = callPackage ../tools/graphics/pfstools {
-        };
-        philter = callPackage ../tools/networking/philter {
-        };
-        pinentry = callPackage ../tools/security/pinentry {
-        };
-        pius = callPackage ../tools/security/pius {
-        };
-        pk2cmd = callPackage ../tools/misc/pk2cmd {
-        };
-        plantuml = callPackage ../tools/misc/plantuml {
-        };
-        plan9port = callPackage ../tools/system/plan9port {
-        };
-        ploticus = callPackage ../tools/graphics/ploticus {
-          libpng = libpng12;
-        };
-        plotutils = callPackage ../tools/graphics/plotutils {
-        };
-        plowshare = callPackage ../tools/misc/plowshare {
-        };
-        pngcrush = callPackage ../tools/graphics/pngcrush {
-        };
-        pngnq = callPackage ../tools/graphics/pngnq {
-        };
-        pngtoico = callPackage ../tools/graphics/pngtoico {
-          libpng = libpng12;
-        };
-        pngquant = callPackage ../tools/graphics/pngquant {
-        };
-        podiff = callPackage ../tools/text/podiff {
-        };
-        poedit = callPackage ../tools/text/poedit {
-        };
-        polipo = callPackage ../servers/polipo {
-        };
-        polkit_gnome = callPackage ../tools/security/polkit-gnome {
-        };
-        ponysay = callPackage ../tools/misc/ponysay {
-        };
-        povray = callPackage ../tools/graphics/povray {
-        };
-        ppl = callPackage ../development/libraries/ppl {
-        };
-        ppp = callPackage ../tools/networking/ppp {
-        };
-        pptp = callPackage ../tools/networking/pptp {
-        };
-        prey-bash-client = callPackage ../tools/security/prey {
-        };
-        projectm = callPackage ../applications/audio/projectm {
-        };
-        proxychains = callPackage ../tools/networking/proxychains {
-        };
-        proxytunnel = callPackage ../tools/misc/proxytunnel {
-        };
-        cntlm = callPackage ../tools/networking/cntlm {
-        };
-        pastebinit = callPackage ../tools/misc/pastebinit {
-        };
-        psmisc = callPackage ../os-specific/linux/psmisc {
-        };
-        pstoedit = callPackage ../tools/graphics/pstoedit {
-        };
-        pv = callPackage ../tools/misc/pv {
-        };
-        pwgen = callPackage ../tools/security/pwgen {
-        };
-        pwnat = callPackage ../tools/networking/pwnat {
-        };
-        pycangjie = callPackage ../development/python-modules/pycangjie {
-        };
-        pydb = callPackage ../development/tools/pydb {
-        };
-        pystringtemplate = callPackage ../development/python-modules/stringtemplate {
-        };
-        pythonDBus = dbus_python;
-        pythonIRClib = builderDefsPackage (import ../development/python-modules/irclib) {
-          inherit python;
-        };
-        pythonSexy = builderDefsPackage (import ../development/python-modules/libsexy) {
-          inherit python libsexy pkgconfig
-          libxml2 pygtk pango gtk glib;
-        };
-        openmpi = callPackage ../development/libraries/openmpi {
-        };
-        qhull = callPackage ../development/libraries/qhull {
-        };
-        qjoypad = callPackage ../tools/misc/qjoypad {
-        };
-        qshowdiff = callPackage ../tools/text/qshowdiff {
-        };
-        quilt = callPackage ../development/tools/quilt {
-        };
-        radvd = callPackage ../tools/networking/radvd {
-        };
-        ranger = callPackage ../applications/misc/ranger {
-        };
-        privateer = callPackage ../games/privateer {
-        };
-        rtmpdump = callPackage ../tools/video/rtmpdump {
-        };
-        reaverwps = callPackage ../tools/networking/reaver-wps {
-        };
-        recutils = callPackage ../tools/misc/recutils {
-        };
-        recoll = callPackage ../applications/search/recoll {
-        };
-        reiser4progs = callPackage ../tools/filesystems/reiser4progs {
-        };
-        reiserfsprogs = callPackage ../tools/filesystems/reiserfsprogs {
-        };
-        relfs = callPackage ../tools/filesystems/relfs {
-          inherit (gnome) gnome_vfs GConf;
-        };
-        remarkjs = callPackage ../development/web/remarkjs {
-        };
-        remind = callPackage ../tools/misc/remind {
-        };
-        remmina = callPackage ../applications/networking/remote/remmina {
-        };
-        renameutils = callPackage ../tools/misc/renameutils {
-        };
-        replace = callPackage ../tools/text/replace {
-        };
-        reptyr = callPackage ../os-specific/linux/reptyr {
-        };
-        rdiff_backup = callPackage ../tools/backup/rdiff-backup {
-        };
-        rdmd = callPackage ../development/compilers/rdmd {
-        };
-        rhash = callPackage ../tools/security/rhash {
-        };
-        riemann_c_client = callPackage ../tools/misc/riemann-c-client {
-        };
-        ripmime = callPackage ../tools/networking/ripmime {
-        };
-        rkflashtool = callPackage ../tools/misc/rkflashtool {
-        };
-        rmlint = callPackage ../tools/misc/rmlint {
-        };
-        rng_tools = callPackage ../tools/security/rng-tools {
-        };
-        rsnapshot = callPackage ../tools/backup/rsnapshot {
-          logger = inetutils;
-        };
-        rlwrap = callPackage ../tools/misc/rlwrap {
-        };
-        rockbox_utility = callPackage ../tools/misc/rockbox-utility {
-        };
-        rpPPPoE = builderDefsPackage (import ../tools/networking/rp-pppoe) {
-          inherit ppp;
-        };
-        rpm = callPackage ../tools/package-management/rpm {
-        };
-        rrdtool = callPackage ../tools/misc/rrdtool {
-        };
-        rtorrent = callPackage ../tools/networking/p2p/rtorrent {
-        };
-        rubber = callPackage ../tools/typesetting/rubber {
-        };
-        rxp = callPackage ../tools/text/xml/rxp {
-        };
-        rzip = callPackage ../tools/compression/rzip {
-        };
-        s3backer = callPackage ../tools/filesystems/s3backer {
-        };
-        s3cmd = callPackage ../tools/networking/s3cmd {
-        };
-        s3cmd_15_pre_81e3842f7a = lowPrio (callPackage ../tools/networking/s3cmd/git.nix {
-        });
-        s3sync = callPackage ../tools/networking/s3sync {
-          ruby = ruby18;
-        };
-        sablotron = callPackage ../tools/text/xml/sablotron {
-        };
-        safecopy = callPackage ../tools/system/safecopy {
-        };
-        salut_a_toi = callPackage ../applications/networking/instant-messengers/salut-a-toi {
-        };
-        samplicator = callPackage ../tools/networking/samplicator {
-        };
-        screen = callPackage ../tools/misc/screen {
-        };
-        scrot = callPackage ../tools/graphics/scrot {
-        };
-        scrypt = callPackage ../tools/security/scrypt {
-        };
-        sdcv = callPackage ../applications/misc/sdcv {
-        };
-        sec = callPackage ../tools/admin/sec {
-        };
-        seccure = callPackage ../tools/security/seccure {
-        };
-        setserial = builderDefsPackage (import ../tools/system/setserial) {
-          inherit groff;
-        };
-        seqdiag = pythonPackages.seqdiag;
-        screenfetch = callPackage ../tools/misc/screenfetch {
-        };
-        sg3_utils = callPackage ../tools/system/sg3_utils {
-        };
-        sharutils = callPackage ../tools/archivers/sharutils {
-        };
-        shotwell = callPackage ../applications/graphics/shotwell {
-        };
-        shebangfix = callPackage ../tools/misc/shebangfix {
-        };
-        shellinabox = callPackage ../servers/shellinabox {
-        };
-        siege = callPackage ../tools/networking/siege {
-        };
-        silc_client = callPackage ../applications/networking/instant-messengers/silc-client {
-        };
-        silc_server = callPackage ../servers/silc-server {
-        };
-        silver-searcher = callPackage ../tools/text/silver-searcher {
-        };
-        simplescreenrecorder = callPackage ../applications/video/simplescreenrecorder {
-        };
-        sleuthkit = callPackage ../tools/system/sleuthkit {
-        };
-        slimrat = callPackage ../tools/networking/slimrat {
-          inherit (perlPackages) WWWMechanize
-          LWP;
-        };
-        slsnif = callPackage ../tools/misc/slsnif {
-        };
-        smartmontools = callPackage ../tools/system/smartmontools {
-        };
-        smbldaptools = callPackage ../tools/networking/smbldaptools {
-          inherit (perlPackages) NetLDAP
-          CryptSmbHash DigestSHA1;
-        };
-        smbnetfs = callPackage ../tools/filesystems/smbnetfs {
-        };
-        snort = callPackage ../applications/networking/ids/snort {
-        };
-        snx = callPackage_i686 ../tools/networking/snx {
-          inherit (pkgsi686Linux) pam
-          gcc33;
-          inherit (pkgsi686Linux.xlibs) libX11;
-        };
-        solr = callPackage ../servers/search/solr {
-        };
-        sparsehash = callPackage ../development/libraries/sparsehash {
-        };
-        spiped = callPackage ../tools/networking/spiped {
-        };
-        sproxy = haskellPackages.callPackage ../tools/networking/sproxy {
-        };
-        sproxy-web = haskellPackages.callPackage ../tools/networking/sproxy-web {
-        };
-        stardict = callPackage ../applications/misc/stardict/stardict.nix {
-          inherit (gnome) libgnomeui
-          scrollkeeper;
-        };
-        storebrowse = callPackage ../tools/system/storebrowse {
-        };
-        fusesmb = callPackage ../tools/filesystems/fusesmb {
-        };
-        sl = callPackage ../tools/misc/sl {
-        };
-        socat = callPackage ../tools/networking/socat {
-        };
-        socat2pre = lowPrio (callPackage ../tools/networking/socat/2.x.nix {
-        });
-        sourceHighlight = callPackage ../tools/text/source-highlight {
-          boost = boost149;
-        };
-        spaceFM = callPackage ../applications/misc/spacefm {
-        };
-        squashfsTools = callPackage ../tools/filesystems/squashfs {
-        };
-        sshfsFuse = callPackage ../tools/filesystems/sshfs-fuse {
-        };
-        sshuttle = callPackage ../tools/security/sshuttle {
-        };
-        sudo = callPackage ../tools/security/sudo {
-        };
-        suidChroot = builderDefsPackage (import ../tools/system/suid-chroot) {
-        };
-        super = callPackage ../tools/security/super {
-        };
-        ssdeep = callPackage ../tools/security/ssdeep {
-        };
-        ssmtp = callPackage ../tools/networking/ssmtp {
-          tlsSupport = true;
-        };
-        ssss = callPackage ../tools/security/ssss {
-        };
-        storeBackup = callPackage ../tools/backup/store-backup {
-        };
-        stow = callPackage ../tools/misc/stow {
-        };
-        stun = callPackage ../tools/networking/stun {
-        };
-        stunnel = callPackage ../tools/networking/stunnel {
-        };
-        su = shadow.su;
-        surfraw = callPackage ../tools/networking/surfraw {
-        };
-        swec = callPackage ../tools/networking/swec {
-          inherit (perlPackages) LWP URI
-          HTMLParser HTTPServerSimple
-          Parent;
-        };
-        svnfs = callPackage ../tools/filesystems/svnfs {
-        };
-        sysbench = callPackage ../development/tools/misc/sysbench {
-        };
-        system_config_printer = callPackage ../tools/misc/system-config-printer {
-          libxml2 = libxml2Python;
-        };
-        sitecopy = callPackage ../tools/networking/sitecopy {
-        };
-        stricat = callPackage ../tools/security/stricat {
-        };
-        privoxy = callPackage ../tools/networking/privoxy {
-        };
-        t1utils = callPackage ../tools/misc/t1utils {
-        };
-        tarsnap = callPackage ../tools/backup/tarsnap {
-        };
-        tcpcrypt = callPackage ../tools/security/tcpcrypt {
-        };
-        tboot = callPackage ../tools/security/tboot {
-        };
-        tcpdump = callPackage ../tools/networking/tcpdump {
-        };
-        tcpflow = callPackage ../tools/networking/tcpflow {
-        };
-        teamviewer = callPackage_i686 ../applications/networking/remote/teamviewer {
-        };
-        teamviewer8 = lowPrio (callPackage_i686 ../applications/networking/remote/teamviewer/8.nix {
-        });
-        telnet = callPackage ../tools/networking/telnet {
-        };
-        texmacs = callPackage ../applications/editors/texmacs {
-          tex = texLive;
-          extraFonts = true;
-          guile = guile_1_8;
-        };
-        texmaker = callPackage ../applications/editors/texmaker {
-        };
-        texstudio = callPackage ../applications/editors/texstudio {
-        };
-        tiled-qt = callPackage ../applications/editors/tiled-qt {
-          qt = qt4;
-        };
-        tinc = callPackage ../tools/networking/tinc {
-        };
-        tiny8086 = callPackage ../applications/virtualization/8086tiny {
-        };
-        tmpwatch = callPackage ../tools/misc/tmpwatch {
-        };
-        tmux = callPackage ../tools/misc/tmux {
-        };
-        tor = callPackage ../tools/security/tor {
-        };
-        torbutton = callPackage ../tools/security/torbutton {
-        };
-        torbrowser = callPackage ../tools/security/tor/torbrowser.nix {
-        };
-        torsocks = callPackage ../tools/security/tor/torsocks.nix {
-        };
-        tpm-quote-tools = callPackage ../tools/security/tpm-quote-tools {
-        };
-        tpm-tools = callPackage ../tools/security/tpm-tools {
-        };
-        trickle = callPackage ../tools/networking/trickle {
-        };
-        trousers = callPackage ../tools/security/trousers {
-        };
-        ttf2pt1 = callPackage ../tools/misc/ttf2pt1 {
-        };
-        ttysnoop = callPackage ../os-specific/linux/ttysnoop {
-        };
-        twitterBootstrap = callPackage ../development/web/twitter-bootstrap {
-        };
-        txt2man = callPackage ../tools/misc/txt2man {
-        };
-        ucl = callPackage ../development/libraries/ucl {
-        };
-        ucspi-tcp = callPackage ../tools/networking/ucspi-tcp {
-        };
-        udftools = callPackage ../tools/filesystems/udftools {
-        };
-        udptunnel = callPackage ../tools/networking/udptunnel {
-        };
-        ufraw = callPackage ../applications/graphics/ufraw {
-        };
-        unetbootin = callPackage ../tools/cd-dvd/unetbootin {
-        };
-        unfs3 = callPackage ../servers/unfs3 {
-        };
-        unoconv = callPackage ../tools/text/unoconv {
-        };
-        upx = callPackage ../tools/compression/upx {
-        };
-        urlview = callPackage ../applications/misc/urlview {
-        };
-        usbmuxd = callPackage ../tools/misc/usbmuxd {
-        };
-        vacuum = callPackage ../applications/networking/instant-messengers/vacuum {
-        };
-        volatility = callPackage ../tools/security/volatility {
-        };
-        vidalia = callPackage ../tools/security/vidalia {
-        };
-        vbetool = builderDefsPackage ../tools/system/vbetool {
-          inherit pciutils libx86 zlib;
-        };
-        vde2 = callPackage ../tools/networking/vde2 {
-        };
-        vboot_reference = callPackage ../tools/system/vboot_reference {
-        };
-        vcsh = callPackage ../applications/version-management/vcsh {
-        };
-        verilog = callPackage ../applications/science/electronics/verilog {
-        };
-        vfdecrypt = callPackage ../tools/misc/vfdecrypt {
-        };
-        vifm = callPackage ../applications/misc/vifm {
-        };
-        viking = callPackage ../applications/misc/viking {
-          inherit (gnome) scrollkeeper;
-        };
-        vnc2flv = callPackage ../tools/video/vnc2flv {
-        };
-        vncrec = builderDefsPackage ../tools/video/vncrec {
-          inherit (xlibs) imake libX11
-          xproto gccmakedep libXt libXmu
-          libXaw libXext xextproto libSM
-          libICE libXpm libXp;
-        };
-        vobcopy = callPackage ../tools/cd-dvd/vobcopy {
-        };
-        vobsub2srt = callPackage ../tools/cd-dvd/vobsub2srt {
-        };
-        vorbisgain = callPackage ../tools/misc/vorbisgain {
-        };
-        vpnc = callPackage ../tools/networking/vpnc {
-        };
-        openconnect = callPackage ../tools/networking/openconnect.nix {
-        };
-        vtun = callPackage ../tools/networking/vtun {
-        };
-        wal_e = callPackage ../tools/backup/wal-e {
-        };
-        watchman = callPackage ../development/tools/watchman {
-        };
-        wbox = callPackage ../tools/networking/wbox {
-        };
-        welkin = callPackage ../tools/graphics/welkin {
-        };
-        testdisk = callPackage ../tools/misc/testdisk {
-        };
-        htmlTidy = callPackage ../tools/text/html-tidy {
-        };
-        html-xml-utils = callPackage ../tools/text/xml/html-xml-utils {
-        };
-        tftp_hpa = callPackage ../tools/networking/tftp-hpa {
-        };
-        tigervnc = callPackage ../tools/admin/tigervnc {
-          fontDirectories = [
-            xorg.fontadobe75dpi
-            xorg.fontmiscmisc
-            xorg.fontcursormisc
-            xorg.fontbhlucidatypewriter75dpi
-          ];
-          inherit (xorg) xorgserver;
-          fltk = fltk13;
-        };
-        tightvnc = callPackage ../tools/admin/tightvnc {
-          fontDirectories = [
-            xorg.fontadobe75dpi
-            xorg.fontmiscmisc
-            xorg.fontcursormisc
-            xorg.fontbhlucidatypewriter75dpi
-          ];
-        };
-        time = callPackage ../tools/misc/time {
-        };
-        tkabber = callPackage ../applications/networking/instant-messengers/tkabber {
-        };
-        qfsm = callPackage ../applications/science/electronics/qfsm {
-        };
-        tkgate = callPackage ../applications/science/electronics/tkgate/1.x.nix {
-          inherit (xlibs) libX11 imake
-          xproto gccmakedep;
-        };
-        tkgate2 = lowPrio (callPackage ../applications/science/electronics/tkgate/2.x.nix {
-          inherit (xlibs) libX11;
-        });
-        tm = callPackage ../tools/system/tm {
-        };
-        trang = callPackage ../tools/text/xml/trang {
-        };
-        tre = callPackage ../development/libraries/tre {
-        };
-        ts = callPackage ../tools/system/ts {
-        };
-        transfig = callPackage ../tools/graphics/transfig {
-          libpng = libpng12;
-        };
-        truecrypt = callPackage ../applications/misc/truecrypt {
-          wxGUI = config.truecrypt.wxGUI or true;
-        };
-        ttmkfdir = callPackage ../tools/misc/ttmkfdir {
-        };
-        unclutter = callPackage ../tools/misc/unclutter {
-        };
-        unbound = callPackage ../tools/networking/unbound {
-        };
-        units = callPackage ../tools/misc/units {
-        };
-        unrar = callPackage ../tools/archivers/unrar {
-        };
-        xarchive = callPackage ../tools/archivers/xarchive {
-        };
-        xarchiver = callPackage ../tools/archivers/xarchiver {
-        };
-        xcruiser = callPackage ../applications/misc/xcruiser {
-        };
-        unarj = callPackage ../tools/archivers/unarj {
-        };
-        unshield = callPackage ../tools/archivers/unshield {
-        };
-        unzip = callPackage ../tools/archivers/unzip {
-        };
-        unzipNLS = lowPrio (unzip.override {
-          enableNLS = true;
-        });
-        uptimed = callPackage ../tools/system/uptimed {
-        };
-        varnish = callPackage ../servers/varnish {
-        };
-        varnish2 = callPackage ../servers/varnish/2.1.nix {
-        };
-        venus = callPackage ../tools/misc/venus {
-          python = python27;
-        };
-        vlan = callPackage ../tools/networking/vlan {
-        };
-        wakelan = callPackage ../tools/networking/wakelan {
-        };
-        wavemon = callPackage ../tools/networking/wavemon {
-        };
-        w3cCSSValidator = callPackage ../tools/misc/w3c-css-validator {
-          tomcat = tomcat6;
-        };
-        wdfs = callPackage ../tools/filesystems/wdfs {
-        };
-        wdiff = callPackage ../tools/text/wdiff {
-        };
-        webalizer = callPackage ../tools/networking/webalizer {
-        };
-        webdruid = builderDefsPackage ../tools/admin/webdruid {
-          inherit zlib libpng freetype gd
-          which libxml2 geoip;
-        };
-        weighttp = callPackage ../tools/networking/weighttp {
-        };
-        wget = callPackage ../tools/networking/wget {
-          inherit (perlPackages) LWP;
-        };
-        which = callPackage ../tools/system/which {
-        };
-        wicd = callPackage ../tools/networking/wicd {
-        };
-        wkhtmltopdf = callPackage ../tools/graphics/wkhtmltopdf {
-        };
-        wv = callPackage ../tools/misc/wv {
-        };
-        wv2 = callPackage ../tools/misc/wv2 {
-        };
-        x86info = callPackage ../os-specific/linux/x86info {
-        };
-        x11_ssh_askpass = callPackage ../tools/networking/x11-ssh-askpass {
-        };
-        xbursttools = assert stdenv ? glibc; import ../tools/misc/xburst-tools {
-          inherit stdenv fetchgit autoconf
-          automake confuse pkgconfig
-          libusb libusb1;
-          gccCross = let
-            pkgsCross = import ./all-packages.nix {
-              inherit system;
-              inherit bootStdenv noSysDirs
-              gccWithCC gccWithProfiling
-              config;
-              crossSystem = {
-                config = "mipsel-unknown-linux";
-                bigEndian = true;
-                arch = "mips";
-                float = "soft";
-                withTLS = true;
-                libc = "uclibc";
-                platform = {
-                  name = "ben_nanonote";
-                  kernelMajor = "2.6";
-                  kernelHeadersBaseConfig = "bcm47xx_defconfig";
-                  kernelArch = "mips";
-                };
-                gcc = { arch = "mips32"; };
-              };
-            };
-            in pkgsCross.gccCrossStageStatic;
-        };
-        xclip = callPackage ../tools/misc/xclip {
-        };
-        xtitle = callPackage ../tools/misc/xtitle {
-        };
-        xdelta = callPackage ../tools/compression/xdelta {
-        };
-        xdummy = callPackage ../tools/misc/xdummy {
-        };
-        xfsprogs = callPackage ../tools/filesystems/xfsprogs {
-        };
-        xmlroff = callPackage ../tools/typesetting/xmlroff {
-          inherit (gnome) libgnomeprint;
-        };
-        xmlstarlet = callPackage ../tools/text/xml/xmlstarlet {
-        };
-        xmlto = callPackage ../tools/typesetting/xmlto {
-        };
-        xmltv = callPackage ../tools/misc/xmltv {
-        };
-        xmpppy = builderDefsPackage (import ../development/python-modules/xmpppy) {
-          inherit python setuptools;
-        };
-        xorriso = callPackage ../tools/cd-dvd/xorriso {
-        };
-        xpf = callPackage ../tools/text/xml/xpf {
-          libxml2 = libxml2Python;
-        };
-        xsel = callPackage ../tools/misc/xsel {
-        };
-        xtreemfs = callPackage ../tools/filesystems/xtreemfs {
-        };
-        xvfb_run = callPackage ../tools/misc/xvfb-run {
-          inherit (texFunctions) fontsConf;
-        };
-        youtubeDL = callPackage ../tools/misc/youtube-dl {
-        };
-        zbar = callPackage ../tools/graphics/zbar {
-          pygtk = lib.overrideDerivation pygtk (x:
-          { gtk = gtk2; });
-        };
-        zdelta = callPackage ../tools/compression/zdelta {
-        };
-        zfstools = callPackage ../tools/filesystems/zfstools {
-          zfs = linuxPackages.zfs;
-        };
-        zile = callPackage ../applications/editors/zile {
-        };
-        zip = callPackage ../tools/archivers/zip {
-        };
-        zpaq = callPackage ../tools/archivers/zpaq {
-        };
-        zpaqd = callPackage ../tools/archivers/zpaq/zpaqd.nix {
-        };
-        zsync = callPackage ../tools/compression/zsync {
-        };
-        bash = lowPrio (callPackage ../shells/bash {
-          texinfo = null;
-        });
-        bashInteractive = appendToName "interactive" (callPackage ../shells/bash {
-          interactive = true;
-          readline = readline63;
-        });
-        bashCompletion = callPackage ../shells/bash-completion {
-        };
-        dash = callPackage ../shells/dash {
-        };
-        fish = callPackage ../shells/fish {
-          python = python27Full;
-        };
-        tcsh = callPackage ../shells/tcsh {
-        };
-        rush = callPackage ../shells/rush {
-        };
-        zsh = callPackage ../shells/zsh {
-        };
-        abc = abcPatchable [ ];
-        abcPatchable = patches:
-        import ../development/compilers/abc/default.nix {
-          inherit stdenv fetchurl patches
-          jre apacheAnt;
-          javaCup = callPackage ../development/libraries/java/cup {
-          };
-        };
-        aldor = callPackage ../development/compilers/aldor {
-        };
-        aliceml = callPackage ../development/compilers/aliceml {
-        };
-        aspectj = callPackage ../development/compilers/aspectj {
-        };
-        ats = callPackage ../development/compilers/ats {
-        };
-        ats2 = callPackage ../development/compilers/ats2 {
-        };
-        avra = callPackage ../development/compilers/avra {
-        };
-        bigloo = callPackage ../development/compilers/bigloo {
-        };
-        chicken = callPackage ../development/compilers/chicken {
-        };
-        ccl = builderDefsPackage ../development/compilers/ccl {
-        };
-        clang = wrapClang llvmPackages.clang;
-        clang_34 = wrapClang llvmPackages_34.clang;
-        clang_33 = wrapClang (clangUnwrapped llvm_33 ../development/compilers/llvm/3.3/clang.nix);
-        clangAnalyzer = callPackage ../development/tools/analysis/clang-analyzer {
-          clang = clang_34;
-          llvmPackages = llvmPackages_34;
-        };
-        clangUnwrapped = llvm: pkg:
-        callPackage pkg {
-          stdenv = if stdenv.isDarwin
-            then stdenvApple
-            else stdenv;
-          inherit llvm;
-        };
-        clangSelf = clangWrapSelf llvmPackagesSelf.clang;
-        clangWrapSelf = build:
-        import ../build-support/clang-wrapper {
-          clang = build;
-          stdenv = clangStdenv;
-          libc = glibc;
-          binutils = binutils;
-          shell = bash;
-          inherit libcxx coreutils zlib;
-          nativeTools = false;
-          nativeLibc = false;
-        };
-        clangStdenv = lowPrio (stdenvAdapters.overrideGCC stdenv clang);
-        libcxxStdenv = stdenvAdapters.overrideGCC stdenv (clangWrapSelf llvmPackages.clang);
-        clean = callPackage ../development/compilers/clean {
-        };
-        closurecompiler = callPackage ../development/compilers/closure {
-        };
-        cmucl_binary = callPackage ../development/compilers/cmucl/binary.nix {
-        };
-        compcert = callPackage ../development/compilers/compcert {
-        };
-        cryptol1 = lowPrio (callPackage ../development/compilers/cryptol/1.8.x.nix {
-        });
-        cryptol2 = with haskellPackages_ghc763; callPackage ../development/compilers/cryptol/2.0.x.nix {
-          Cabal = Cabal_1_18_1_3;
-          cabalInstall = cabalInstall_1_18_0_3;
-          process = process_1_2_0_0;
-        };
-        cython = pythonPackages.cython;
-        cython3 = python3Packages.cython;
-        dylan = callPackage ../development/compilers/gwydion-dylan {
-          dylan = callPackage ../development/compilers/gwydion-dylan/binary.nix {
-          };
-        };
-        ecl = callPackage ../development/compilers/ecl {
-        };
-        eql = callPackage ../development/compilers/eql {
-        };
-        adobe_flex_sdk = callPackage ../development/compilers/adobe-flex-sdk {
-        };
-        fpc = callPackage ../development/compilers/fpc {
-        };
-        fpc_2_4_0 = callPackage ../development/compilers/fpc/2.4.0.nix {
-        };
-        gambit = callPackage ../development/compilers/gambit {
-        };
-        gcc = gcc48;
-        gcc33 = wrapGCC (import ../development/compilers/gcc/3.3 {
-          inherit fetchurl stdenv
-          noSysDirs;
-        });
-        gcc34 = wrapGCC (import ../development/compilers/gcc/3.4 {
-          inherit fetchurl stdenv
-          noSysDirs;
-        });
-        gcc48_realCross = lib.addMetaAttrs {
-          hydraPlatforms = [ ];
-        } (callPackage ../development/compilers/gcc/4.8 {
-          inherit noSysDirs;
-          binutilsCross = binutilsCross;
-          libcCross = libcCross;
-          profiledCompiler = false;
-          enableMultilib = false;
-          crossStageStatic = false;
-          cross = assert crossSystem != null; crossSystem;
-        });
-        gcc_realCross = gcc48_realCross;
-        gccCrossStageStatic = let
-          libcCross1 = if stdenv.cross.libc == "msvcrt"
-            then windows.mingw_w64_headers
-            else if stdenv.cross.libc == "libSystem"
-              then darwin.xcode
-              else null;
-          in wrapGCCCross {
-            gcc = forceNativeDrv (lib.addMetaAttrs {
-              hydraPlatforms = [ ];
-            } (gcc_realCross.override {
-              crossStageStatic = true;
-              langCC = false;
-              libcCross = libcCross1;
-              enableShared = false;
-            }));
-            libc = libcCross1;
-            binutils = binutilsCross;
-            cross = assert crossSystem != null; crossSystem;
-          };
-        gccCrossMingw2 = wrapGCCCross {
-          gcc = gccCrossStageStatic.gcc;
-          libc = windows.mingw_headers2;
-          binutils = binutilsCross;
-          cross = assert crossSystem != null; crossSystem;
-        };
-        gccCrossStageFinal = wrapGCCCross {
-          gcc = forceNativeDrv (gcc_realCross.override {
-            libpthreadCross = if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-              then gnu.libpthreadCross
-              else null;
-            langCC = crossSystem == null || crossSystem.config != "i686-pc-mingw32";
-          });
-          libc = libcCross;
-          binutils = binutilsCross;
-          cross = assert crossSystem != null; crossSystem;
-        };
-        gcc44 = lowPrio (wrapGCC (makeOverridable (import ../development/compilers/gcc/4.4) {
-          inherit fetchurl stdenv gmp mpfr
-          gettext which noSysDirs;
-          texinfo = texinfo4;
-          profiledCompiler = true;
-        }));
-        gcc45 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.5 {
-          inherit fetchurl stdenv gmp mpfr
-          mpc libelf zlib perl gettext
-          which noSysDirs;
-          texinfo = texinfo4;
-          ppl = null;
-          cloogppl = null;
-          profiledCompiler = !stdenv.isArm;
-          cross = null;
-          libcCross = if crossSystem != null
-            then libcCross
-            else null;
-          libpthreadCross = if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-            then gnu.libpthreadCross
-            else null;
-        }));
-        gcc46 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.6 {
-          inherit noSysDirs;
-          ppl = null;
-          cloog = null;
-          profiledCompiler = false;
-          cross = null;
-          libcCross = if crossSystem != null
-            then libcCross
-            else null;
-          libpthreadCross = if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-            then gnu.libpthreadCross
-            else null;
-          texinfo = texinfo413;
-        }));
-        gcc48 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.8 {
-          inherit noSysDirs;
-          profiledCompiler = with stdenv; !isDarwin && (isi686 || isx86_64);
-          cross = null;
-          libcCross = if crossSystem != null
-            then libcCross
-            else null;
-          libpthreadCross = if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-            then gnu.libpthreadCross
-            else null;
-        }));
-        gcc48_multi = if system == "x86_64-linux"
-          then lowPrio (wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi (gcc48.gcc.override {
-            stdenv = overrideGCC stdenv (wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi gcc.gcc);
-            profiledCompiler = false;
-            enableMultilib = true;
-          }))
-          else throw "Multilib gcc not supported on ‘${system}’";
-        gcc48_debug = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.8 {
-          stripped = false;
-          inherit noSysDirs;
-          cross = null;
-          libcCross = null;
-          binutilsCross = null;
-        }));
-        gcc49 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.9 {
-          inherit noSysDirs;
-          profiledCompiler = with stdenv; !isDarwin && (isi686 || isx86_64);
-          cross = null;
-          libcCross = if crossSystem != null
-            then libcCross
-            else null;
-          libpthreadCross = if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-            then gnu.libpthreadCross
-            else null;
-        }));
-        gccApple = assert stdenv.isDarwin; wrapGCC (makeOverridable (import ../development/compilers/gcc/4.2-apple64) {
-          inherit fetchurl noSysDirs;
-          profiledCompiler = true;
-          stdenv = allStdenvs.stdenvNative;
-        });
-        gfortran = gfortran48;
-        gfortran48 = wrapGCC (gcc48.gcc.override {
-          name = "gfortran";
-          langFortran = true;
-          langCC = false;
-          langC = false;
-          profiledCompiler = false;
-        });
-        gcj = gcj48;
-        gcj48 = wrapGCC (gcc48.gcc.override {
-          name = "gcj";
-          langJava = true;
-          langFortran = false;
-          langCC = false;
-          langC = false;
-          profiledCompiler = false;
-          inherit zip unzip zlib boehmgc
-          gettext pkgconfig perl;
-          inherit gtk;
-          inherit (gnome) libart_lgpl;
-          inherit (xlibs) libX11 libXt
-          libSM libICE libXtst libXi
-          libXrender libXrandr xproto
-          renderproto xextproto inputproto
-          randrproto;
-        });
-        gnat = gnat45;
-        gnat45 = wrapGCC (gcc45.gcc.override {
-          name = "gnat";
-          langCC = false;
-          langC = true;
-          langAda = true;
-          profiledCompiler = false;
-          inherit gnatboot;
-          cloogppl = null;
-          ppl = null;
-        });
-        gnat46 = wrapGCC (gcc46.gcc.override {
-          name = "gnat";
-          langCC = false;
-          langC = true;
-          langAda = true;
-          profiledCompiler = false;
-          gnatboot = gnat45;
-          ppl = null;
-          cloog = null;
-        });
-        gnatboot = wrapGCC (import ../development/compilers/gnatboot {
-          inherit fetchurl stdenv;
-        });
-        gccgo = gccgo48;
-        gccgo48 = wrapGCC (gcc48.gcc.override {
-          name = "gccgo";
-          langCC = true;
-          langC = true;
-          langGo = true;
-        });
-        ghdl = wrapGCC (import ../development/compilers/gcc/4.3 {
-          inherit stdenv fetchurl gmp mpfr
-          noSysDirs gnat;
-          texinfo = texinfo4;
-          name = "ghdl";
-          langVhdl = true;
-          langCC = false;
-          langC = false;
-          profiledCompiler = false;
-          enableMultilib = false;
-        });
-        ghdl_mcode = callPackage ../development/compilers/ghdl {
-        };
-        gcl = builderDefsPackage ../development/compilers/gcl {
-          inherit mpfr m4 binutils
-          fetchcvs emacs zlib which
-          texinfo;
-          gmp = gmp4;
-          inherit (xlibs) libX11 xproto
-          inputproto libXi libXext
-          xextproto libXt libXaw libXmu;
-          inherit stdenv;
-          texLive = texLiveAggregationFun {
-            paths = [
-              texLive
-              texLiveExtra
-            ];
-          };
-        };
-        jhc = callPackage ../development/compilers/jhc {
-          inherit (haskellPackages_ghc763) ghc
-          binary zlib utf8String readline
-          fgl regexCompat HsSyck random;
-        };
-        gcc-arm-embedded-4_7 = callPackage_i686 ../development/compilers/gcc-arm-embedded {
-          version = "4.7-2013q3-20130916";
-          releaseType = "update";
-          sha256 = "1bd9bi9q80xn2rpy0rn1vvj70rh15kb7dmah0qs4q2rv78fqj40d";
-        };
-        gcc-arm-embedded-4_8 = callPackage_i686 ../development/compilers/gcc-arm-embedded {
-          version = "4.8-2014q1-20140314";
-          releaseType = "update";
-          sha256 = "ce92859550819d4a3d1a6e2672ea64882b30afa2c08cf67fa8e1d93788c2c577";
-        };
-        gcc-arm-embedded = gcc-arm-embedded-4_8;
-        haskell = let
-          pkgs_ = pkgs // {
-            gmp = gmp.override {
-              withStatic = true;
-            };
-          };
-          callPackage = newScope pkgs_;
-          newScope = extra:
-          lib.callPackageWith (pkgs_ // pkgs_.xorg // extra);
-          in callPackage ./haskell-defaults.nix {
-            pkgs = pkgs_;
-            inherit callPackage newScope;
-          };
-        ghc = recurseIntoAttrs (lib.mapAttrs' (name:
-        value:
-        lib.nameValuePair (builtins.substring (builtins.stringLength "packages_") (builtins.stringLength name) name) value.ghc) (lib.filterAttrs (name:
-        value:
-        builtins.substring 0 (builtins.stringLength "packages_") name == "packages_") haskell));
-        haskellPackages = haskellPackages_ghc783;
-        haskellPlatform = haskellPlatformPackages."2013_2_0_0";
-        haskellPackages_ghc6104 = haskell.packages_ghc6104;
-        haskellPackages_ghc6123 = haskell.packages_ghc6123;
-        haskellPackages_ghc704 = haskell.packages_ghc704;
-        haskellPackages_ghc722 = haskell.packages_ghc722;
-        haskellPackages_ghc742 = haskell.packages_ghc742;
-        haskellPackages_ghc763 = haskell.packages_ghc763;
-        haskellPackages_ghc783_no_profiling = recurseIntoAttrs haskell.packages_ghc783.noProfiling;
-        haskellPackages_ghc783_profiling = recurseIntoAttrs haskell.packages_ghc783.profiling;
-        haskellPackages_ghc783 = recurseIntoAttrs haskell.packages_ghc783.highPrio;
-        haskellPackages_ghcHEAD = haskell.packages_ghcHEAD;
-        haskellPlatformPackages = recurseIntoAttrs (import ../development/libraries/haskell/haskell-platform {
-          inherit pkgs;
-        });
-        haxe = callPackage ../development/compilers/haxe {
-        };
-        hhvm = callPackage ../development/compilers/hhvm {
-        };
-        hiphopvm = hhvm;
-        falcon = builderDefsPackage (import ../development/interpreters/falcon) {
-          inherit cmake;
-        };
-        fsharp = callPackage ../development/compilers/fsharp {
-        };
-        go_1_0 = callPackage ../development/compilers/go {
-        };
-        go_1_1 = if stdenv.isDarwin
-          then callPackage ../development/compilers/go/1.1-darwin.nix {
-          }
-          else callPackage ../development/compilers/go/1.1.nix {
-          };
-        go_1_2 = callPackage ../development/compilers/go/1.2.nix {
-        };
-        go_1_3 = callPackage ../development/compilers/go/1.3.nix {
-        };
-        go = go_1_3;
-        gox = callPackage ../development/compilers/go/gox.nix {
-        };
-        gprolog = callPackage ../development/compilers/gprolog {
-        };
-        gwt240 = callPackage ../development/compilers/gwt/2.4.0.nix {
-        };
-        icedtea7_jdk = callPackage ../development/compilers/icedtea rec {
-          jdk = openjdk;
-          jdkPath = "${openjdk}/lib/openjdk";
-        } // { outputs = [ "out" ]; };
-        icedtea7_jre = lib.setName "icedtea7-${lib.getVersion pkgs.icedtea7_jdk.jre}" (lib.addMetaAttrs {
-          description = "Free Java runtime environment based on OpenJDK 7.0 and the IcedTea project";
-        } pkgs.icedtea7_jdk.jre) // {
-          outputs = [ "jre" ];
-        };
-        icedtea7_web = callPackage ../development/compilers/icedtea-web {
-          jdk = "${icedtea7_jdk}/lib/icedtea";
-        };
-        ikarus = callPackage ../development/compilers/ikarus {
-        };
-        hugs = callPackage ../development/compilers/hugs {
-        };
-        path64 = callPackage ../development/compilers/path64 {
-        };
-        openjdk = if stdenv.isDarwin
-          then callPackage ../development/compilers/openjdk-darwin {
-          }
-          else let
-            openjdkBootstrap = callPackage ../development/compilers/openjdk/bootstrap.nix {
-            };
-            in callPackage ../development/compilers/openjdk {
-              jdk = openjdkBootstrap;
-            } // { outputs = [ "out" ]; };
-        openjre = lib.setName "openjre-${lib.getVersion pkgs.openjdk.jre}" (lib.addMetaAttrs {
-          description = "The open-source Java Runtime Environment";
-        } pkgs.openjdk.jre) // {
-          outputs = [ "jre" ];
-        };
-        jdk = if stdenv.isDarwin || stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux"
-          then pkgs.openjdk
-          else pkgs.oraclejdk;
-        jre = if stdenv.isDarwin || stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux"
-          then pkgs.openjre
-          else pkgs.oraclejre;
-        oraclejdk = pkgs.jdkdistro true false;
-        oraclejdk7 = pkgs.oraclejdk7distro true false;
-        oraclejdk8 = pkgs.oraclejdk8distro true false;
-        oraclejre = lowPrio (pkgs.jdkdistro false false);
-        oraclejre7 = lowPrio (pkgs.oraclejdk7distro false false);
-        oraclejre8 = lowPrio (pkgs.oraclejdk8distro false false);
-        jrePlugin = lowPrio (pkgs.jdkdistro false true);
-        supportsJDK = system == "i686-linux" || system == "x86_64-linux";
-        jdkdistro = installjdk:
-        pluginSupport:
-        assert supportsJDK; (if pluginSupport
-          then appendToName "with-plugin"
-          else x:
-          x) (callPackage ../development/compilers/oraclejdk/jdk6-linux.nix {
-        });
-        oraclejdk7distro = installjdk:
-        pluginSupport:
-        assert supportsJDK; (if pluginSupport
-          then appendToName "with-plugin"
-          else x:
-          x) (callPackage ../development/compilers/oraclejdk/jdk7-linux.nix {
-          inherit installjdk;
-        });
-        oraclejdk8distro = installjdk:
-        pluginSupport:
-        assert supportsJDK; (if pluginSupport
-          then appendToName "with-plugin"
-          else x:
-          x) (callPackage ../development/compilers/oraclejdk/jdk8-linux.nix {
-          inherit installjdk;
-        });
-        jikes = callPackage ../development/compilers/jikes {
-        };
-        juliaGit = callPackage ../development/compilers/julia/git-20131013.nix {
-          liblapack = liblapack.override {
-            shared = true;
-          };
-          llvm = llvm_33;
-        };
-        julia021 = callPackage ../development/compilers/julia/0.2.1.nix {
-          liblapack = liblapack.override {
-            shared = true;
-          };
-          llvm = llvm_33;
-        };
-        julia030 = let
-          liblapack = liblapack_3_5_0.override {
-            shared = true;
-          };
-          in callPackage ../development/compilers/julia/0.3.0.nix {
-            inherit liblapack;
-            suitesparse = suitesparse.override {
-              inherit liblapack;
-            };
-            openblas = openblas_0_2_10;
-            llvm = llvm_34;
-          };
-        julia = julia021;
-        lazarus = builderDefsPackage (import ../development/compilers/fpc/lazarus.nix) {
-          inherit makeWrapper gtk glib
-          pango atk gdk_pixbuf;
-          inherit (xlibs) libXi inputproto
-          libX11 xproto libXext xextproto;
-          fpc = fpc;
-        };
-        lessc = callPackage ../development/compilers/lessc {
-        };
-        llvm = llvmPackages.llvm;
-        llvm_34 = llvmPackages_34.llvm;
-        llvm_33 = llvm_v ../development/compilers/llvm/3.3/llvm.nix;
-        llvm_v = path:
-        callPackage path {
-          stdenv = if stdenv.isDarwin
-            then stdenvApple
-            else stdenv;
-        };
-        llvmPackages = if !stdenv.isDarwin
-          then llvmPackages_34
-          else llvmPackages_34 // {
-            llvm = llvm_33;
-            clang = clang_33;
-          };
-        llvmPackages_34 = recurseIntoAttrs (import ../development/compilers/llvm/3.4 {
-          inherit stdenv newScope
-          fetchurl;
-          isl = isl_0_12;
-        });
-        llvmPackagesSelf = import ../development/compilers/llvm/3.4 {
-          inherit newScope fetchurl;
-          isl = isl_0_12;
-          stdenv = libcxxStdenv;
-        };
-        manticore = callPackage ../development/compilers/manticore {
-        };
-        mentorToolchains = recurseIntoAttrs (callPackage_i686 ../development/compilers/mentor {
-        });
-        mercury = callPackage ../development/compilers/mercury {
-        };
-        mitscheme = callPackage ../development/compilers/mit-scheme {
-        };
-        mlton = callPackage ../development/compilers/mlton {
-        };
-        mono = callPackage ../development/compilers/mono {
-          inherit (xlibs) libX11;
-        };
-        monoDLLFixer = callPackage ../build-support/mono-dll-fixer {
-        };
-        mozart = callPackage ../development/compilers/mozart {
-        };
-        neko = callPackage ../development/compilers/neko {
-        };
-        nasm = callPackage ../development/compilers/nasm {
-        };
-        nvidia_cg_toolkit = callPackage ../development/compilers/nvidia-cg-toolkit {
-        };
-        ocaml = ocamlPackages.ocaml;
-        ocaml_3_08_0 = callPackage ../development/compilers/ocaml/3.08.0.nix {
-        };
-        ocaml_3_10_0 = callPackage ../development/compilers/ocaml/3.10.0.nix {
-        };
-        ocaml_3_11_2 = callPackage ../development/compilers/ocaml/3.11.2.nix {
-        };
-        ocaml_3_12_1 = callPackage ../development/compilers/ocaml/3.12.1.nix {
-        };
-        ocaml_4_00_1 = callPackage ../development/compilers/ocaml/4.00.1.nix {
-        };
-        ocaml_4_01_0 = callPackage ../development/compilers/ocaml/4.01.0.nix {
-        };
-        orc = callPackage ../development/compilers/orc {
-        };
-        metaocaml_3_09 = callPackage ../development/compilers/ocaml/metaocaml-3.09.nix {
-        };
-        ber_metaocaml_003 = callPackage ../development/compilers/ocaml/ber-metaocaml-003.nix {
-        };
-        mkOcamlPackages = ocaml: self:
-        let
-          callPackage = newScope self;
-          in rec {
-            inherit ocaml;
-            camlidl = callPackage ../development/tools/ocaml/camlidl {
-            };
-            camlp5_5_strict = callPackage ../development/tools/ocaml/camlp5/5.15.nix {
-            };
-            camlp5_5_transitional = callPackage ../development/tools/ocaml/camlp5/5.15.nix {
-              transitional = true;
-            };
-            camlp5_6_strict = callPackage ../development/tools/ocaml/camlp5 {
-            };
-            camlp5_6_transitional = callPackage ../development/tools/ocaml/camlp5 {
-              transitional = true;
-            };
-            camlp5_strict = camlp5_6_strict;
-            camlp5_transitional = camlp5_6_transitional;
-            camlzip = callPackage ../development/ocaml-modules/camlzip {
-            };
-            camomile_0_8_2 = callPackage ../development/ocaml-modules/camomile/0.8.2.nix {
-            };
-            camomile = callPackage ../development/ocaml-modules/camomile {
-            };
-            camlimages = callPackage ../development/ocaml-modules/camlimages {
-              libpng = libpng12;
-              giflib = giflib_4_1;
-            };
-            biniou = callPackage ../development/ocaml-modules/biniou {
-            };
-            ocaml_cairo = callPackage ../development/ocaml-modules/ocaml-cairo {
-            };
-            cppo = callPackage ../development/tools/ocaml/cppo {
-            };
-            cryptokit = callPackage ../development/ocaml-modules/cryptokit {
-            };
-            csv = callPackage ../development/ocaml-modules/csv {
-            };
-            deriving = callPackage ../development/tools/ocaml/deriving {
-            };
-            easy-format = callPackage ../development/ocaml-modules/easy-format {
-            };
-            findlib = callPackage ../development/tools/ocaml/findlib {
-            };
-            javalib = callPackage ../development/ocaml-modules/javalib {
-              extlib = ocaml_extlib_maximal;
-            };
-            dypgen = callPackage ../development/ocaml-modules/dypgen {
-            };
-            patoline = callPackage ../tools/typesetting/patoline {
-            };
-            gmetadom = callPackage ../development/ocaml-modules/gmetadom {
-            };
-            lablgl = callPackage ../development/ocaml-modules/lablgl {
-            };
-            lablgtk = callPackage ../development/ocaml-modules/lablgtk {
-              inherit (gnome) libgnomecanvas
-              libglade gtksourceview;
-            };
-            lablgtkmathview = callPackage ../development/ocaml-modules/lablgtkmathview {
-              gtkmathview = callPackage ../development/libraries/gtkmathview {
-              };
-            };
-            menhir = callPackage ../development/ocaml-modules/menhir {
-            };
-            merlin = callPackage ../development/tools/ocaml/merlin {
-            };
-            mldonkey = callPackage ../applications/networking/p2p/mldonkey {
-            };
-            mlgmp = callPackage ../development/ocaml-modules/mlgmp {
-            };
-            ocaml_batteries = callPackage ../development/ocaml-modules/batteries {
-            };
-            ocaml_cryptgps = callPackage ../development/ocaml-modules/cryptgps {
-            };
-            ocaml_data_notation = callPackage ../development/ocaml-modules/odn {
-            };
-            ocaml_expat = callPackage ../development/ocaml-modules/expat {
-            };
-            ocamlgraph = callPackage ../development/ocaml-modules/ocamlgraph {
-            };
-            ocaml_http = callPackage ../development/ocaml-modules/http {
-            };
-            ocamlify = callPackage ../development/tools/ocaml/ocamlify {
-            };
-            ocaml_lwt = callPackage ../development/ocaml-modules/lwt {
-            };
-            ocamlmod = callPackage ../development/tools/ocaml/ocamlmod {
-            };
-            ocaml_mysql = callPackage ../development/ocaml-modules/mysql {
-            };
-            ocamlnet = callPackage ../development/ocaml-modules/ocamlnet {
-            };
-            ocaml_oasis = callPackage ../development/tools/ocaml/oasis {
-            };
-            ocaml_pcre = callPackage ../development/ocaml-modules/pcre {
-              inherit pcre;
-            };
-            ocaml_react = callPackage ../development/ocaml-modules/react {
-            };
-            ocamlsdl = callPackage ../development/ocaml-modules/ocamlsdl {
-            };
-            ocaml_sqlite3 = callPackage ../development/ocaml-modules/sqlite3 {
-            };
-            ocaml_ssl = callPackage ../development/ocaml-modules/ssl {
-            };
-            ounit = callPackage ../development/ocaml-modules/ounit {
-            };
-            ulex = callPackage ../development/ocaml-modules/ulex {
-            };
-            ulex08 = callPackage ../development/ocaml-modules/ulex/0.8 {
-              camlp5 = camlp5_transitional;
-            };
-            ocaml_typeconv = callPackage ../development/ocaml-modules/typeconv {
-            };
-            ocaml_typeconv_3_0_5 = callPackage ../development/ocaml-modules/typeconv/3.0.5.nix {
-            };
-            ocaml_sexplib = callPackage ../development/ocaml-modules/sexplib {
-            };
-            ocaml_extlib = callPackage ../development/ocaml-modules/extlib {
-            };
-            ocaml_extlib_maximal = callPackage ../development/ocaml-modules/extlib {
-              minimal = false;
-            };
-            pycaml = callPackage ../development/ocaml-modules/pycaml {
-            };
-            opam_1_0_0 = callPackage ../development/tools/ocaml/opam/1.0.0.nix {
-            };
-            opam_1_1 = callPackage ../development/tools/ocaml/opam/1.1.nix {
-            };
-            opam = opam_1_1;
-            sawja = callPackage ../development/ocaml-modules/sawja {
-            };
-            uucd = callPackage ../development/ocaml-modules/uucd {
-            };
-            uunf = callPackage ../development/ocaml-modules/uunf {
-            };
-            uutf = callPackage ../development/ocaml-modules/uutf {
-            };
-            xmlm = callPackage ../development/ocaml-modules/xmlm {
-            };
-            yojson = callPackage ../development/ocaml-modules/yojson {
-            };
-            zarith = callPackage ../development/ocaml-modules/zarith {
-            };
-          };
-        ocamlPackages = recurseIntoAttrs ocamlPackages_4_01_0;
-        ocamlPackages_3_10_0 = mkOcamlPackages ocaml_3_10_0 pkgs.ocamlPackages_3_10_0;
-        ocamlPackages_3_11_2 = mkOcamlPackages ocaml_3_11_2 pkgs.ocamlPackages_3_11_2;
-        ocamlPackages_3_12_1 = mkOcamlPackages ocaml_3_12_1 pkgs.ocamlPackages_3_12_1;
-        ocamlPackages_4_00_1 = mkOcamlPackages ocaml_4_00_1 pkgs.ocamlPackages_4_00_1;
-        ocamlPackages_4_01_0 = mkOcamlPackages ocaml_4_01_0 pkgs.ocamlPackages_4_01_0;
-        ocamlPackages_latest = ocamlPackages_4_01_0;
-        ocaml_make = callPackage ../development/ocaml-modules/ocamlmake {
-        };
-        opa = let
-          callPackage = newScope pkgs.ocamlPackages_4_00_1;
-          in callPackage ../development/compilers/opa {
-          };
-        ocamlnat = let
-          callPackage = newScope pkgs.ocamlPackages_3_12_1;
-          in callPackage ../development/ocaml-modules/ocamlnat {
-          };
-        qcmm = callPackage ../development/compilers/qcmm {
-          lua = lua4;
-          ocaml = ocaml_3_08_0;
-        };
-        roadsend = callPackage ../development/compilers/roadsend {
-        };
-        rustc = callPackage ../development/compilers/rustc/0.11.nix {
-        };
-        rustcMaster = callPackage ../development/compilers/rustc/head.nix {
-        };
-        rust = rustc;
-        sbclBootstrap = callPackage ../development/compilers/sbcl/bootstrap.nix {
-        };
-        sbcl = callPackage ../development/compilers/sbcl {
-          clisp = clisp;
-        };
-        scala_2_9 = callPackage ../development/compilers/scala/2.9.nix {
-        };
-        scala_2_10 = callPackage ../development/compilers/scala/2.10.nix {
-        };
-        scala_2_11 = callPackage ../development/compilers/scala {
-        };
-        scala = scala_2_11;
-        sdcc = callPackage ../development/compilers/sdcc {
-        };
-        smlnjBootstrap = callPackage ../development/compilers/smlnj/bootstrap.nix {
-        };
-        smlnj = callPackage_i686 ../development/compilers/smlnj {
-        };
-        stalin = callPackage ../development/compilers/stalin {
-        };
-        strategoPackages = recurseIntoAttrs strategoPackages018;
-        strategoPackages016 = callPackage ../development/compilers/strategoxt/0.16.nix {
-          stdenv = overrideInStdenv stdenv [
-            gnumake380
-          ];
-        };
-        strategoPackages017 = callPackage ../development/compilers/strategoxt/0.17.nix {
-          readline = readline5;
-        };
-        strategoPackages018 = callPackage ../development/compilers/strategoxt/0.18.nix {
-          readline = readline5;
-        };
-        metaBuildEnv = callPackage ../development/compilers/meta-environment/meta-build-env {
-        };
-        swiProlog = callPackage ../development/compilers/swi-prolog {
-        };
-        tbb = callPackage ../development/libraries/tbb {
-        };
-        tinycc = callPackage ../development/compilers/tinycc {
-        };
-        urweb = callPackage ../development/compilers/urweb {
-        };
-        vala = callPackage ../development/compilers/vala/default.nix {
-        };
-        visualcpp = callPackage ../development/compilers/visual-c++ {
-        };
-        vs90wrapper = callPackage ../development/compilers/vs90wrapper {
-        };
-        webdsl = callPackage ../development/compilers/webdsl {
-        };
-        win32hello = callPackage ../development/compilers/visual-c++/test {
-        };
-        wrapGCCWith = gccWrapper: glibc:
-        baseGCC: gccWrapper {
-          nativeTools = stdenv ? gcc && stdenv.gcc.nativeTools;
-          nativeLibc = stdenv ? gcc && stdenv.gcc.nativeLibc;
-          nativePrefix = if stdenv ? gcc
-            then stdenv.gcc.nativePrefix
-            else "";
-          gcc = baseGCC;
-          libc = glibc;
-          shell = bash;
-          inherit stdenv binutils
-          coreutils zlib;
-        };
-        wrapClangWith = clangWrapper:
-        glibc: baseClang: clangWrapper {
-          nativeTools = stdenv.gcc.nativeTools or false;
-          nativeLibc = stdenv.gcc.nativeLibc or false;
-          nativePrefix = stdenv.gcc.nativePrefix or "";
-          clang = baseClang;
-          libc = glibc;
-          shell = bash;
-          binutils = stdenv.gcc.binutils;
-          inherit stdenv coreutils zlib;
-        };
-        wrapClang = wrapClangWith (makeOverridable (import ../build-support/clang-wrapper)) glibc;
-        wrapGCC = wrapGCCWith (makeOverridable (import ../build-support/gcc-wrapper)) glibc;
-        wrapGCCCross = { binutils, cross, gcc, libc, name ? "gcc-cross-wrapper", shell ? "" }:
-        forceNativeDrv (import ../build-support/gcc-cross-wrapper {
-          nativeTools = false;
-          nativeLibc = false;
-          noLibc = libc == null;
-          inherit stdenv gcc binutils libc
-          shell name cross;
-        });
-        yap = callPackage ../development/compilers/yap {
-        };
-        yasm = callPackage ../development/compilers/yasm {
-        };
-        acl2 = builderDefsPackage ../development/interpreters/acl2 {
-          inherit sbcl;
-        };
-        angelscript = callPackage ../development/interpreters/angelscript {
-        };
-        clisp = callPackage ../development/interpreters/clisp {
-        };
-        clisp_2_44_1 = callPackage ../development/interpreters/clisp/2.44.1.nix {
-          libsigsegv = libsigsegv_25;
-        };
-        clojure = callPackage ../development/interpreters/clojure {
-        };
-        clooj = callPackage ../development/interpreters/clojure/clooj.nix {
-        };
-        erlangR14 = callPackage ../development/interpreters/erlang/R14.nix {
-        };
-        erlangR15 = callPackage ../development/interpreters/erlang/R15.nix {
-        };
-        erlangR16 = callPackage ../development/interpreters/erlang/R16.nix {
-        };
-        erlangR17 = callPackage ../development/interpreters/erlang/R17.nix {
-        };
-        erlang = erlangR17;
-        rebar = callPackage ../development/tools/build-managers/rebar {
-        };
-        elixir = callPackage ../development/interpreters/elixir {
-        };
-        groovy = callPackage ../development/interpreters/groovy {
-        };
-        guile_1_8 = callPackage ../development/interpreters/guile/1.8.nix {
-        };
-        guile_2_0 = callPackage ../development/interpreters/guile {
-        };
-        guile = guile_2_0;
-        hadoop = callPackage ../applications/networking/cluster/hadoop {
-        };
-        io = callPackage ../development/interpreters/io {
-        };
-        j = callPackage ../development/interpreters/j {
-        };
-        jmeter = callPackage ../applications/networking/jmeter {
-        };
-        davmail = callPackage ../applications/networking/davmail {
-        };
-        lxappearance = callPackage ../applications/misc/lxappearance {
-        };
-        kona = callPackage ../development/interpreters/kona {
-        };
-        love = callPackage ../development/interpreters/love {
-          lua = lua5;
-        };
-        love_luajit = callPackage ../development/interpreters/love {
-          lua = luajit;
-        };
-        love_0_9 = callPackage ../development/interpreters/love/0.9.nix {
-        };
-        lua4 = callPackage ../development/interpreters/lua-4 {
-        };
-        lua5_0 = callPackage ../development/interpreters/lua-5/5.0.3.nix {
-        };
-        lua5_1 = callPackage ../development/interpreters/lua-5/5.1.nix {
-        };
-        lua5_2 = callPackage ../development/interpreters/lua-5/5.2.nix {
-        };
-        lua5_2_compat = callPackage ../development/interpreters/lua-5/5.2.nix {
-          compat = true;
-        };
-        lua5 = lua5_1;
-        lua = lua5;
-        lua5_sockets = callPackage ../development/interpreters/lua-5/sockets.nix {
-        };
-        lua5_expat = callPackage ../development/interpreters/lua-5/expat.nix {
-        };
-        lua5_filesystem = callPackage ../development/interpreters/lua-5/filesystem.nix {
-        };
-        lua5_sec = callPackage ../development/interpreters/lua-5/sec.nix {
-        };
-        luarocks = callPackage ../development/tools/misc/luarocks {
-          lua = lua5;
-        };
-        luajit = callPackage ../development/interpreters/luajit {
-        };
-        lush2 = callPackage ../development/interpreters/lush {
-        };
-        maude = callPackage ../development/interpreters/maude {
-          bison = bison2;
-          flex = flex_2_5_35;
-        };
-        mesos = callPackage ../applications/networking/cluster/mesos {
-          sasl = cyrus_sasl;
-          automake = automake114x;
-          inherit (pythonPackages) python
-          boto setuptools distutils-cfg
-          wrapPython;
-          pythonProtobuf = pythonPackages.protobuf;
-        };
-        octave = callPackage ../development/interpreters/octave {
-          fltk = fltk13;
-          qt = null;
-          ghostscript = null;
-          llvm = null;
-          hdf5 = null;
-          glpk = null;
-          suitesparse = null;
-          openjdk = null;
-          gnuplot = null;
-          readline = readline63;
-        };
-        octaveFull = lowPrio (callPackage ../development/interpreters/octave {
-          fltk = fltk13;
-          qt = qt4;
-        });
-        octaveHG = callPackage ../development/interpreters/octave/hg.nix {
-        };
-        ocropus = callPackage ../applications/misc/ocropus {
-        };
-        perl514 = callPackage ../development/interpreters/perl/5.14 {
-        };
-        perl516 = callPackage ../development/interpreters/perl/5.16 {
-          fetchurl = fetchurlBoot;
-        };
-        perl520 = callPackage ../development/interpreters/perl/5.20 {
-        };
-        perl = if system != "i686-cygwin"
-          then perl516
-          else sysPerl;
-        php = php54;
-        phpPackages = recurseIntoAttrs (import ./php-packages.nix {
-          inherit php pkgs;
-        });
-        php53 = callPackage ../development/interpreters/php/5.3.nix {
-        };
-        php_fpm53 = callPackage ../development/interpreters/php/5.3.nix {
-          config = config // {
-            php = (config.php or { }) // {
-              fpm = true;
-              apxs2 = false;
-            };
-          };
-        };
-        php54 = callPackage ../development/interpreters/php/5.4.nix {
-        };
-        picolisp = callPackage ../development/interpreters/picolisp {
-        };
-        pltScheme = racket;
-        polyml = callPackage ../development/compilers/polyml {
-        };
-        pure = callPackage ../development/interpreters/pure {
-          llvm = llvm_33;
-        };
-        python = python2;
-        python2 = python27;
-        python3 = python34;
-        pythonPackages = python2Packages;
-        python2Packages = python27Packages;
-        python3Packages = python34Packages;
-        pythonFull = python2Full;
-        python2Full = python27Full;
-        python26 = callPackage ../development/interpreters/python/2.6 {
-          db = db47;
-        };
-        python27 = callPackage ../development/interpreters/python/2.7 {
-        };
-        python32 = callPackage ../development/interpreters/python/3.2 {
-        };
-        python33 = callPackage ../development/interpreters/python/3.3 {
-        };
-        python34 = hiPrio (callPackage ../development/interpreters/python/3.4 {
-        });
-        pypy = callPackage ../development/interpreters/pypy/2.3 {
-        };
-        python26Full = callPackage ../development/interpreters/python/wrapper.nix {
-          extraLibs = [ ];
-          postBuild = "";
-          python = python26;
-          inherit (python26Packages) recursivePthLoader;
-        };
-        python27Full = callPackage ../development/interpreters/python/wrapper.nix {
-          extraLibs = [ ];
-          postBuild = "";
-          python = python27;
-          inherit (python27Packages) recursivePthLoader;
-        };
-        pythonDocs = recurseIntoAttrs (import ../development/interpreters/python/docs {
-          inherit stdenv fetchurl lib;
-        });
-        pythonLinkmeWrapper = callPackage ../development/interpreters/python/python-linkme-wrapper.nix {
-        };
-        pypi2nix = python27Packages.pypi2nix;
-        pyrex = pyrex095;
-        pyrex095 = callPackage ../development/interpreters/pyrex/0.9.5.nix {
-        };
-        pyrex096 = callPackage ../development/interpreters/pyrex/0.9.6.nix {
-        };
-        qi = callPackage ../development/compilers/qi {
-        };
-        racket = callPackage ../development/interpreters/racket {
-        };
-        rakudo = callPackage ../development/interpreters/rakudo {
-        };
-        rascal = callPackage ../development/interpreters/rascal {
-        };
-        regina = callPackage ../development/interpreters/regina {
-        };
-        renpy = callPackage ../development/interpreters/renpy {
-          wrapPython = pythonPackages.wrapPython;
-        };
-        ruby18 = callPackage ../development/interpreters/ruby/ruby-18.nix {
-        };
-        ruby19 = callPackage ../development/interpreters/ruby/ruby-19.nix {
-        };
-        ruby2 = lowPrio (callPackage ../development/interpreters/ruby/ruby-2.0.nix {
-        });
-        ruby = ruby19;
-        rubyLibs = recurseIntoAttrs (callPackage ../development/interpreters/ruby/libs.nix {
-        });
-        rake = rubyLibs.rake;
-        rubySqlite3 = callPackage ../development/ruby-modules/sqlite3 {
-        };
-        rubygemsFun = ruby:
-        builderDefsPackage (import ../development/interpreters/ruby/rubygems.nix) {
-          inherit ruby makeWrapper;
-        };
-        rubygems = hiPrio (rubygemsFun ruby);
-        rq = callPackage ../applications/networking/cluster/rq {
-        };
-        scsh = callPackage ../development/interpreters/scsh {
-        };
-        scheme48 = callPackage ../development/interpreters/scheme48 {
-        };
-        spark = callPackage ../applications/networking/cluster/spark {
-        };
-        spidermonkey = callPackage ../development/interpreters/spidermonkey {
-        };
-        spidermonkey_1_8_0rc1 = callPackage ../development/interpreters/spidermonkey/1.8.0-rc1.nix {
-        };
-        spidermonkey_185 = callPackage ../development/interpreters/spidermonkey/185-1.0.0.nix {
-        };
-        spidermonkey_17 = callPackage ../development/interpreters/spidermonkey/17.0.nix {
-        };
-        spidermonkey_24 = callPackage ../development/interpreters/spidermonkey/24.2.nix {
-        };
-        supercollider = callPackage ../development/interpreters/supercollider {
-          qt = qt4;
-          fftw = fftwSinglePrec;
-        };
-        supercollider_scel = supercollider.override {
-          useSCEL = true;
-        };
-        sysPerl = callPackage ../development/interpreters/perl/sys-perl {
-        };
-        tcl = callPackage ../development/interpreters/tcl {
-        };
-        xulrunner = callPackage ../development/interpreters/xulrunner {
-          inherit (gnome) libIDL;
-          inherit (pythonPackages) pysqlite;
-        };
-        xulrunner_30 = firefox30Pkgs.xulrunner;
-        amdadlsdk = callPackage ../development/misc/amdadl-sdk {
-        };
-        amdappsdk26 = callPackage ../development/misc/amdapp-sdk {
-          version = "2.6";
-        };
-        amdappsdk27 = callPackage ../development/misc/amdapp-sdk {
-          version = "2.7";
-        };
-        amdappsdk28 = callPackage ../development/misc/amdapp-sdk {
-          version = "2.8";
-        };
-        amdappsdk = amdappsdk28;
-        amdappsdkFull = callPackage ../development/misc/amdapp-sdk {
-          version = "2.8";
-          samples = true;
-        };
-        avrgcclibc = callPackage ../development/misc/avr-gcc-with-avr-libc {
-          gcc = gcc46;
-          stdenv = overrideGCC stdenv gcc46;
-        };
-        avr8burnomat = callPackage ../development/misc/avr8-burn-omat {
-        };
-        sourceFromHead = import ../build-support/source-from-head-fun.nix {
-          inherit config;
-        };
-        ecj = callPackage ../development/eclipse/ecj {
-        };
-        jdtsdk = callPackage ../development/eclipse/jdt-sdk {
-        };
-        jruby165 = callPackage ../development/interpreters/jruby {
-        };
-        guileCairo = callPackage ../development/guile-modules/guile-cairo {
-        };
-        guileGnome = callPackage ../development/guile-modules/guile-gnome {
-          gconf = gnome.GConf;
-          inherit (gnome) gnome_vfs
-          libglade libgnome libgnomecanvas
-          libgnomeui;
-        };
-        guile_lib = callPackage ../development/guile-modules/guile-lib {
-        };
-        guile_ncurses = callPackage ../development/guile-modules/guile-ncurses {
-        };
-        guile-xcb = callPackage ../development/guile-modules/guile-xcb {
-        };
-        pharo-vm = callPackage_i686 ../development/pharo/vm {
-        };
-        srecord = callPackage ../development/tools/misc/srecord {
-        };
-        windowssdk = import ../development/misc/windows-sdk {
-          inherit fetchurl stdenv
-          cabextract;
-        };
-        ansible = callPackage ../tools/system/ansible {
-        };
-        antlr = callPackage ../development/tools/parsing/antlr/2.7.7.nix {
-        };
-        antlr3 = callPackage ../development/tools/parsing/antlr {
-        };
-        ant = apacheAnt;
-        apacheAnt = callPackage ../development/tools/build-managers/apache-ant {
-        };
-        astyle = callPackage ../development/tools/misc/astyle {
-        };
-        autobuild = callPackage ../development/tools/misc/autobuild {
-        };
-        autoconf = callPackage ../development/tools/misc/autoconf {
-        };
-        autoconf213 = callPackage ../development/tools/misc/autoconf/2.13.nix {
-        };
-        autocutsel = callPackage ../tools/X11/autocutsel {
-        };
-        automake = automake112x;
-        automake111x = callPackage ../development/tools/misc/automake/automake-1.11.x.nix {
-        };
-        automake112x = callPackage ../development/tools/misc/automake/automake-1.12.x.nix {
-        };
-        automake113x = callPackage ../development/tools/misc/automake/automake-1.13.x.nix {
-        };
-        automake114x = callPackage ../development/tools/misc/automake/automake-1.14.x.nix {
-        };
-        automoc4 = callPackage ../development/tools/misc/automoc4 {
-        };
-        avrdude = callPackage ../development/tools/misc/avrdude {
-        };
-        avarice = callPackage ../development/tools/misc/avarice {
-        };
-        babeltrace = callPackage ../development/tools/misc/babeltrace {
-        };
-        bam = callPackage ../development/tools/build-managers/bam {
-        };
-        binutils = callPackage ../development/tools/misc/binutils {
-          inherit noSysDirs;
-        };
-        binutils_nogold = lowPrio (callPackage ../development/tools/misc/binutils {
-          inherit noSysDirs;
-          gold = false;
-        });
-        binutilsCross = if crossSystem != null && crossSystem.libc == "libSystem"
-          then darwin.cctools
-          else lowPrio (forceNativeDrv (import ../development/tools/misc/binutils {
-            inherit stdenv fetchurl zlib
-            bison;
-            noSysDirs = true;
-            cross = assert crossSystem != null; crossSystem;
-          }));
-        bison2 = callPackage ../development/tools/parsing/bison/2.x.nix {
-        };
-        bison3 = callPackage ../development/tools/parsing/bison/3.x.nix {
-        };
-        bison = bison3;
-        buildbot = callPackage ../development/tools/build-managers/buildbot {
-          inherit (pythonPackages) twisted
-          jinja2 sqlalchemy
-          sqlalchemy_migrate;
-          dateutil = pythonPackages.dateutil_1_5;
-        };
-        buildbotSlave = callPackage ../development/tools/build-managers/buildbot-slave {
-          inherit (pythonPackages) twisted;
-        };
-        byacc = callPackage ../development/tools/parsing/byacc {
-        };
-        casperjs = callPackage ../development/tools/casperjs {
-        };
-        cbrowser = callPackage ../development/tools/misc/cbrowser {
-        };
-        ccache = callPackage ../development/tools/misc/ccache {
-        };
-        ccacheWrapper = makeOverridable ({ extraConfig ? "" }:
-        wrapGCC (ccache.links extraConfig)) {
-        };
-        ccacheStdenv = lowPrio (overrideGCC stdenv ccacheWrapper);
-        cccc = callPackage ../development/tools/analysis/cccc {
-        };
-        cgdb = callPackage ../development/tools/misc/cgdb {
-        };
-        chromedriver = callPackage ../development/tools/selenium/chromedriver {
-          gconf = gnome.GConf;
-        };
-        chrpath = callPackage ../development/tools/misc/chrpath {
-        };
-        "cl-launch" = callPackage ../development/tools/misc/cl-launch {
-        };
-        complexity = callPackage ../development/tools/misc/complexity {
-        };
-        ctags = callPackage ../development/tools/misc/ctags {
-        };
-        ctagsWrapped = import ../development/tools/misc/ctags/wrapped.nix {
-          inherit pkgs ctags
-          writeScriptBin;
-        };
-        cmake = callPackage ../development/tools/build-managers/cmake {
-        };
-        cmake264 = callPackage ../development/tools/build-managers/cmake/264.nix {
-        };
-        cmakeCurses = cmake.override {
-          useNcurses = true;
-        };
-        cmakeWithGui = cmakeCurses.override {
-          useQt4 = true;
-        };
-        coccinelle = callPackage ../development/tools/misc/coccinelle {
-        };
-        framac = callPackage ../development/tools/analysis/frama-c {
-        };
-        cppi = callPackage ../development/tools/misc/cppi {
-        };
-        cproto = callPackage ../development/tools/misc/cproto {
-        };
-        cflow = callPackage ../development/tools/misc/cflow {
-        };
-        cov-build = callPackage ../development/tools/analysis/cov-build {
-        };
-        cppcheck = callPackage ../development/tools/analysis/cppcheck {
-        };
-        cscope = callPackage ../development/tools/misc/cscope {
-        };
-        csslint = callPackage ../development/web/csslint {
-        };
-        libcxx = callPackage ../development/libraries/libc++ {
-          stdenv = pkgs.clangStdenv;
-        };
-        libcxxabi = callPackage ../development/libraries/libc++abi {
-          stdenv = pkgs.clangStdenv;
-        };
-        libsigrok = callPackage ../development/tools/libsigrok {
-        };
-        libsigrokdecode = callPackage ../development/tools/libsigrokdecode {
-        };
-        dejagnu = callPackage ../development/tools/misc/dejagnu {
-        };
-        dfeet = callPackage ../development/tools/misc/d-feet {
-          inherit (pythonPackages) pep8;
-        };
-        dfu-programmer = callPackage ../development/tools/misc/dfu-programmer {
-        };
-        ddd = callPackage ../development/tools/misc/ddd {
-        };
-        distcc = callPackage ../development/tools/misc/distcc {
-        };
-        distccWrapper = makeOverridable ({ extraConfig ? "" }:
-        wrapGCC (distcc.links extraConfig)) {
-        };
-        distccStdenv = lowPrio (overrideGCC stdenv distccWrapper);
-        distccMasquerade = callPackage ../development/tools/misc/distcc/masq.nix {
-          gccRaw = gcc.gcc;
-          binutils = binutils;
-        };
-        docutils = builderDefsPackage (import ../development/tools/documentation/docutils) {
-          inherit python pil makeWrapper;
-        };
-        doxygen = callPackage ../development/tools/documentation/doxygen {
-          qt4 = null;
-        };
-        doxygen_gui = lowPrio (doxygen.override {
-          inherit qt4;
-        });
-        drush = callPackage ../development/tools/misc/drush {
-        };
-        eggdbus = callPackage ../development/tools/misc/eggdbus {
-        };
-        elfutils = callPackage ../development/tools/misc/elfutils {
-        };
-        epm = callPackage ../development/tools/misc/epm {
-        };
-        emma = callPackage ../development/tools/analysis/emma {
-        };
-        findbugs = callPackage ../development/tools/analysis/findbugs {
-        };
-        pmd = callPackage ../development/tools/analysis/pmd {
-        };
-        jdepend = callPackage ../development/tools/analysis/jdepend {
-        };
-        checkstyle = callPackage ../development/tools/analysis/checkstyle {
-        };
-        flex_2_5_35 = callPackage ../development/tools/parsing/flex/2.5.35.nix {
-        };
-        flex_2_5_39 = callPackage ../development/tools/parsing/flex/2.5.39.nix {
-        };
-        flex = flex_2_5_39;
-        m4 = gnum4;
-        global = callPackage ../development/tools/misc/global {
-        };
-        gnome_doc_utils = callPackage ../development/tools/documentation/gnome-doc-utils {
-        };
-        gnum4 = callPackage ../development/tools/misc/gnum4 {
-        };
-        gnumake380 = callPackage ../development/tools/build-managers/gnumake/3.80 {
-        };
-        gnumake381 = callPackage ../development/tools/build-managers/gnumake/3.81 {
-        };
-        gnumake382 = callPackage ../development/tools/build-managers/gnumake/3.82 {
-        };
-        gnumake40 = callPackage ../development/tools/build-managers/gnumake/4.0 {
-        };
-        gnumake = gnumake382;
-        gob2 = callPackage ../development/tools/misc/gob2 {
-        };
-        gradle = callPackage ../development/tools/build-managers/gradle {
-        };
-        gperf = callPackage ../development/tools/misc/gperf {
-        };
-        gtk_doc = callPackage ../development/tools/documentation/gtk-doc {
-        };
-        gtkdialog = callPackage ../development/tools/misc/gtkdialog {
-        };
-        guileLint = callPackage ../development/tools/guile/guile-lint {
-        };
-        gwrap = callPackage ../development/tools/guile/g-wrap {
-        };
-        help2man = callPackage ../development/tools/misc/help2man {
-          inherit (perlPackages) LocaleGettext;
-        };
-        hyenae = callPackage ../tools/networking/hyenae {
-        };
-        ibus = callPackage ../development/libraries/ibus {
-        };
-        iconnamingutils = callPackage ../development/tools/misc/icon-naming-utils {
-          inherit (perlPackages) XMLSimple;
-        };
-        indent = callPackage ../development/tools/misc/indent {
-        };
-        ino = callPackage ../development/arduino/ino {
-        };
-        inotifyTools = callPackage ../development/tools/misc/inotify-tools {
-        };
-        intel-gpu-tools = callPackage ../development/tools/misc/intel-gpu-tools {
-          inherit (xorg) libpciaccess
-          dri2proto libX11 libXext libXv
-          libXrandr;
-        };
-        ired = callPackage ../development/tools/analysis/radare/ired.nix {
-        };
-        itstool = callPackage ../development/tools/misc/itstool {
-        };
-        jam = callPackage ../development/tools/build-managers/jam {
-        };
-        jikespg = callPackage ../development/tools/parsing/jikespg {
-        };
-        jenkins = callPackage ../development/tools/continuous-integration/jenkins {
-        };
-        lcov = callPackage ../development/tools/analysis/lcov {
-        };
-        leiningen = callPackage ../development/tools/build-managers/leiningen {
-        };
-        libtool = libtool_2;
-        libtool_1_5 = callPackage ../development/tools/misc/libtool {
-        };
-        libtool_2 = callPackage ../development/tools/misc/libtool/libtool2.nix {
-        };
-        lsof = callPackage ../development/tools/misc/lsof {
-        };
-        ltrace = callPackage ../development/tools/misc/ltrace {
-        };
-        lttng-tools = callPackage ../development/tools/misc/lttng-tools {
-        };
-        lttng-ust = callPackage ../development/tools/misc/lttng-ust {
-        };
-        lttv = callPackage ../development/tools/misc/lttv {
-        };
-        mk = callPackage ../development/tools/build-managers/mk {
-        };
-        neoload = callPackage ../development/tools/neoload {
-          licenseAccepted = config.neoload.accept_license or false;
-        };
-        ninja = callPackage ../development/tools/build-managers/ninja {
-        };
-        nixbang = callPackage ../development/tools/misc/nixbang {
-          pythonPackages = python3Packages;
-        };
-        node_webkit = callPackage ../development/tools/node-webkit {
-          gconf = pkgs.gnome.GConf;
-        };
-        noweb = callPackage ../development/tools/literate-programming/noweb {
-        };
-        omake = callPackage ../development/tools/ocaml/omake {
-        };
-        omake_rc1 = callPackage ../development/tools/ocaml/omake/0.9.8.6-rc1.nix {
-        };
-        opengrok = callPackage ../development/tools/misc/opengrok {
-        };
-        openocd = callPackage ../development/tools/misc/openocd {
-        };
-        oprofile = callPackage ../development/tools/profiling/oprofile {
-        };
-        patchelf = callPackage ../development/tools/misc/patchelf {
-        };
-        peg = callPackage ../development/tools/parsing/peg {
-        };
-        phantomjs = callPackage ../development/tools/phantomjs {
-          stdenv = if stdenv.isDarwin
-            then overrideGCC stdenv gccApple
-            else stdenv;
-        };
-        pmccabe = callPackage ../development/tools/misc/pmccabe {
-        };
-        pkgconfig = forceNativeDrv (callPackage ../development/tools/misc/pkgconfig {
-        });
-        pkgconfigUpstream = lowPrio (pkgconfig.override {
-          vanilla = true;
-        });
-        prelink = callPackage ../development/tools/misc/prelink {
-        };
-        premake3 = callPackage ../development/tools/misc/premake/3.nix {
-        };
-        premake4 = callPackage ../development/tools/misc/premake {
-        };
-        premake = premake4;
-        pstack = callPackage ../development/tools/misc/gdb/pstack.nix {
-        };
-        radare = callPackage ../development/tools/analysis/radare {
-          inherit (gnome) vte;
-          lua = lua5;
-          useX11 = config.radare.useX11 or false;
-          pythonBindings = config.radare.pythonBindings or false;
-          rubyBindings = config.radare.rubyBindings or false;
-          luaBindings = config.radare.luaBindings or false;
-        };
-        ragel = callPackage ../development/tools/parsing/ragel {
-        };
-        re2c = callPackage ../development/tools/parsing/re2c {
-        };
-        remake = callPackage ../development/tools/build-managers/remake {
-        };
-        saleae-logic = callPackage ../development/tools/misc/saleae-logic {
-        };
-        seleniumRCBin = callPackage ../development/tools/selenium/remote-control {
-          jre = jdk;
-        };
-        selenium-server-standalone = callPackage ../development/tools/selenium/server {
-        };
-        scons = callPackage ../development/tools/build-managers/scons {
-        };
-        simpleBuildTool = callPackage ../development/tools/build-managers/simple-build-tool {
-        };
-        sigrok-cli = callPackage ../development/tools/sigrok-cli {
-        };
-        slimerjs = callPackage ../development/tools/slimerjs {
-        };
-        sloccount = callPackage ../development/tools/misc/sloccount {
-        };
-        smatch = callPackage ../development/tools/analysis/smatch {
-          buildllvmsparse = false;
-          buildc2xml = false;
-        };
-        smc = callPackage ../tools/misc/smc {
-        };
-        sparse = callPackage ../development/tools/analysis/sparse {
-        };
-        speedtest_cli = callPackage ../tools/networking/speedtest-cli {
-        };
-        spin = callPackage ../development/tools/analysis/spin {
-        };
-        splint = callPackage ../development/tools/analysis/splint {
-          flex = flex_2_5_35;
-        };
-        stm32flash = callPackage ../development/tools/misc/stm32flash {
-        };
-        strace = callPackage ../development/tools/misc/strace {
-        };
-        swig = callPackage ../development/tools/misc/swig {
-        };
-        swig2 = callPackage ../development/tools/misc/swig/2.x.nix {
-        };
-        swig3 = callPackage ../development/tools/misc/swig/3.x.nix {
-        };
-        swigWithJava = swig;
-        swfmill = callPackage ../tools/video/swfmill {
-        };
-        swftools = callPackage ../tools/video/swftools {
-        };
-        tcptrack = callPackage ../development/tools/misc/tcptrack {
-        };
-        teensy-loader = callPackage ../development/tools/misc/teensy {
-        };
-        texinfo413 = callPackage ../development/tools/misc/texinfo/4.13a.nix {
-        };
-        texinfo5 = callPackage ../development/tools/misc/texinfo/5.2.nix {
-        };
-        texinfo4 = texinfo413;
-        texinfo = texinfo5;
-        texinfoInteractive = appendToName "interactive" (texinfo.override {
-          interactive = true;
-        });
-        texi2html = callPackage ../development/tools/misc/texi2html {
-        };
-        uhd = callPackage ../development/tools/misc/uhd {
-        };
-        uisp = callPackage ../development/tools/misc/uisp {
-        };
-        uncrustify = callPackage ../development/tools/misc/uncrustify {
-        };
-        vagrant = callPackage ../development/tools/vagrant {
-          ruby = ruby2;
-        };
-        gdb = callPackage ../development/tools/misc/gdb {
-          hurd = gnu.hurdCross;
-          readline = readline63;
-          inherit (gnu) mig;
-        };
-        gdbCross = lowPrio (callPackage ../development/tools/misc/gdb {
-          target = crossSystem;
-        });
-        valgrind = callPackage ../development/tools/analysis/valgrind {
-          stdenv = if stdenv.isDarwin
-            then overrideGCC stdenv gccApple
-            else stdenv;
-        };
-        valkyrie = callPackage ../development/tools/analysis/valkyrie {
-        };
-        xc3sprog = callPackage ../development/tools/misc/xc3sprog {
-        };
-        xmlindent = callPackage ../development/web/xmlindent {
-        };
-        xpwn = callPackage ../development/mobile/xpwn {
-        };
-        xxdiff = callPackage ../development/tools/misc/xxdiff {
-          bison = bison2;
-        };
-        yacc = bison;
-        yodl = callPackage ../development/tools/misc/yodl {
-        };
-        a52dec = callPackage ../development/libraries/a52dec {
-        };
-        aacskeys = callPackage ../development/libraries/aacskeys {
-        };
-        aalib = callPackage ../development/libraries/aalib {
-        };
-        accountsservice = callPackage ../development/libraries/accountsservice {
-        };
-        acl = callPackage ../development/libraries/acl {
-        };
-        activemq = callPackage ../development/libraries/apache-activemq {
-        };
-        adns = callPackage ../development/libraries/adns {
-        };
-        afflib = callPackage ../development/libraries/afflib {
-        };
-        agg = callPackage ../development/libraries/agg {
-        };
-        allegro = callPackage ../development/libraries/allegro {
-        };
-        allegro5 = callPackage ../development/libraries/allegro/5.nix {
-        };
-        allegro5unstable = callPackage ../development/libraries/allegro/5-unstable.nix {
-        };
-        amrnb = callPackage ../development/libraries/amrnb {
-        };
-        amrwb = callPackage ../development/libraries/amrwb {
-        };
-        apr = callPackage ../development/libraries/apr {
-        };
-        aprutil = callPackage ../development/libraries/apr-util {
-          bdbSupport = true;
-        };
-        asio = callPackage ../development/libraries/asio {
-        };
-        aspell = callPackage ../development/libraries/aspell {
-        };
-        aspellDicts = recurseIntoAttrs (import ../development/libraries/aspell/dictionaries.nix {
-          inherit fetchurl stdenv aspell
-          which;
-        });
-        aterm = aterm25;
-        aterm25 = callPackage ../development/libraries/aterm/2.5.nix {
-        };
-        aterm28 = lowPrio (callPackage ../development/libraries/aterm/2.8.nix {
-        });
-        attica = callPackage ../development/libraries/attica {
-        };
-        attr = callPackage ../development/libraries/attr {
-        };
-        at_spi2_core = callPackage ../development/libraries/at-spi2-core {
-        };
-        at_spi2_atk = callPackage ../development/libraries/at-spi2-atk {
-        };
-        aqbanking = callPackage ../development/libraries/aqbanking {
-        };
-        aubio = callPackage ../development/libraries/aubio {
-        };
-        audiofile = callPackage ../development/libraries/audiofile {
-        };
-        axis = callPackage ../development/libraries/axis {
-        };
-        babl_0_0_22 = callPackage ../development/libraries/babl/0_0_22.nix {
-        };
-        babl = callPackage ../development/libraries/babl {
-        };
-        beecrypt = callPackage ../development/libraries/beecrypt {
-        };
-        boehmgc = callPackage ../development/libraries/boehm-gc {
-        };
-        boolstuff = callPackage ../development/libraries/boolstuff {
-        };
-        boost144 = callPackage ../development/libraries/boost/1.44.nix {
-        };
-        boost149 = callPackage ../development/libraries/boost/1.49.nix {
-        };
-        boost155 = callPackage ../development/libraries/boost/1.55.nix {
-        };
-        boost = boost155;
-        boostHeaders = callPackage ../development/libraries/boost/header-only-wrapper.nix {
-        };
-        botan = callPackage ../development/libraries/botan {
-        };
-        botanUnstable = callPackage ../development/libraries/botan/unstable.nix {
-        };
-        box2d = callPackage ../development/libraries/box2d {
-        };
-        box2d_2_0_1 = callPackage ../development/libraries/box2d/2.0.1.nix {
-        };
-        buddy = callPackage ../development/libraries/buddy {
-        };
-        bwidget = callPackage ../development/libraries/bwidget {
-        };
-        c-ares = callPackage ../development/libraries/c-ares {
-          fetchurl = fetchurlBoot;
-        };
-        caelum = callPackage ../development/libraries/caelum {
-        };
-        capnproto = callPackage ../development/libraries/capnproto {
-        };
-        scmccid = callPackage ../development/libraries/scmccid {
-        };
-        ccrtp = callPackage ../development/libraries/ccrtp {
-        };
-        ccrtp_1_8 = callPackage ../development/libraries/ccrtp/1.8.nix {
-        };
-        celt = callPackage ../development/libraries/celt {
-        };
-        celt_0_7 = callPackage ../development/libraries/celt/0.7.nix {
-        };
-        celt_0_5_1 = callPackage ../development/libraries/celt/0.5.1.nix {
-        };
-        cgal = callPackage ../development/libraries/CGAL {
-        };
-        cgui = callPackage ../development/libraries/cgui {
-        };
-        check = callPackage ../development/libraries/check {
-        };
-        chipmunk = builderDefsPackage (import ../development/libraries/chipmunk) {
-          inherit cmake freeglut mesa;
-          inherit (xlibs) libX11 xproto
-          inputproto libXi libXmu;
-        };
-        chmlib = callPackage ../development/libraries/chmlib {
-        };
-        chromaprint = callPackage ../development/libraries/chromaprint {
-        };
-        cil = callPackage ../development/libraries/cil {
-        };
-        cilaterm = callPackage ../development/libraries/cil-aterm {
-          stdenv = overrideInStdenv stdenv [
-            gnumake380
-          ];
-        };
-        clanlib = callPackage ../development/libraries/clanlib {
-        };
-        classads = callPackage ../development/libraries/classads {
-        };
-        classpath = callPackage ../development/libraries/java/classpath {
-          javac = gcj;
-          jvm = gcj;
-          gconf = gnome.GConf;
-        };
-        clearsilver = callPackage ../development/libraries/clearsilver {
-        };
-        cln = callPackage ../development/libraries/cln {
-        };
-        clppcre = builderDefsPackage (import ../development/libraries/cl-ppcre) {
-        };
-        clucene_core_2 = callPackage ../development/libraries/clucene-core/2.x.nix {
-        };
-        clucene_core_1 = callPackage ../development/libraries/clucene-core {
-        };
-        clucene_core = clucene_core_1;
-        clutter = callPackage ../development/libraries/clutter {
-        };
-        clutter_1_18 = callPackage ../development/libraries/clutter/1.18.nix {
-          cogl = cogl_1_18;
-        };
-        clutter-gst = callPackage ../development/libraries/clutter-gst {
-        };
-        clutter_gtk = callPackage ../development/libraries/clutter-gtk {
-        };
-        clutter_gtk_0_10 = callPackage ../development/libraries/clutter-gtk/0.10.8.nix {
-        };
-        cminpack = callPackage ../development/libraries/cminpack {
-        };
-        cogl = callPackage ../development/libraries/cogl {
-        };
-        cogl_1_18 = callPackage ../development/libraries/cogl/1.18.nix {
-        };
-        coin3d = callPackage ../development/libraries/coin3d {
-        };
-        commoncpp2 = callPackage ../development/libraries/commoncpp2 {
-        };
-        confuse = callPackage ../development/libraries/confuse {
-        };
-        coredumper = callPackage ../development/libraries/coredumper {
-        };
-        ctl = callPackage ../development/libraries/ctl {
-        };
-        cpp-netlib = callPackage ../development/libraries/cpp-netlib {
-        };
-        cppunit = callPackage ../development/libraries/cppunit {
-        };
-        cppnetlib = callPackage ../development/libraries/cppnetlib {
-          boost = boostHeaders;
-        };
-        cracklib = callPackage ../development/libraries/cracklib {
-        };
-        cryptopp = callPackage ../development/libraries/crypto++ {
-        };
-        cyrus_sasl = callPackage ../development/libraries/cyrus-sasl {
-        };
-        db = db5;
-        db4 = db48;
-        db44 = callPackage ../development/libraries/db/db-4.4.nix {
-        };
-        db45 = callPackage ../development/libraries/db/db-4.5.nix {
-        };
-        db47 = callPackage ../development/libraries/db/db-4.7.nix {
-        };
-        db48 = callPackage ../development/libraries/db/db-4.8.nix {
-        };
-        db5 = db53;
-        db53 = callPackage ../development/libraries/db/db-5.3.nix {
-        };
-        db6 = db60;
-        db60 = callPackage ../development/libraries/db/db-6.0.nix {
-        };
-        dbus = callPackage ../development/libraries/dbus {
-        };
-        dbus_cplusplus = callPackage ../development/libraries/dbus-cplusplus {
-        };
-        dbus_glib = callPackage ../development/libraries/dbus-glib {
-        };
-        dbus_java = callPackage ../development/libraries/java/dbus-java {
-        };
-        dbus_python = callPackage ../development/python-modules/dbus {
-        };
-        dbus_tools = pkgs.dbus.tools;
-        dbus_libs = pkgs.dbus.libs;
-        dbus_daemon = pkgs.dbus.daemon;
-        dhex = callPackage ../applications/editors/dhex {
-        };
-        dclib = callPackage ../development/libraries/dclib {
-        };
-        dillo = callPackage ../applications/networking/browsers/dillo {
-          fltk = fltk13;
-        };
-        directfb = callPackage ../development/libraries/directfb {
-        };
-        dotconf = callPackage ../development/libraries/dotconf {
-        };
-        dssi = callPackage ../development/libraries/dssi {
-        };
-        dragonegg = llvmPackages.dragonegg;
-        dxflib = callPackage ../development/libraries/dxflib {
-        };
-        eigen = callPackage ../development/libraries/eigen {
-        };
-        eigen2 = callPackage ../development/libraries/eigen/2.0.nix {
-        };
-        enchant = callPackage ../development/libraries/enchant {
-        };
-        enet = callPackage ../development/libraries/enet {
-        };
-        enginepkcs11 = callPackage ../development/libraries/enginepkcs11 {
-        };
-        epoxy = callPackage ../development/libraries/epoxy {
-          inherit (xorg) utilmacros
-          libX11;
-        };
-        esdl = callPackage ../development/libraries/esdl {
-        };
-        exiv2 = callPackage ../development/libraries/exiv2 {
-        };
-        expat = callPackage ../development/libraries/expat {
-        };
-        extremetuxracer = builderDefsPackage (import ../games/extremetuxracer) {
-          inherit mesa tcl freeglut SDL
-          SDL_mixer pkgconfig gettext
-          intltool;
-          inherit (xlibs) libX11 xproto
-          libXi inputproto libXmu libXext
-          xextproto libXt libSM libICE;
-          libpng = libpng12;
-        };
-        eventlog = callPackage ../development/libraries/eventlog {
-        };
-        facile = callPackage ../development/libraries/facile {
-        };
-        faac = callPackage ../development/libraries/faac {
-        };
-        faad2 = callPackage ../development/libraries/faad2 {
-        };
-        farsight2 = callPackage ../development/libraries/farsight2 {
-        };
-        farstream = callPackage ../development/libraries/farstream {
-          inherit (gst_all_1) gstreamer
-          gst-plugins-base gst-python
-          gst-plugins-good gst-plugins-bad
-          gst-libav;
-        };
-        fcgi = callPackage ../development/libraries/fcgi {
-        };
-        ffmpeg_0_6 = callPackage ../development/libraries/ffmpeg/0.6.nix {
-          vpxSupport = !stdenv.isMips;
-        };
-        ffmpeg_0_6_90 = callPackage ../development/libraries/ffmpeg/0.6.90.nix {
-          vpxSupport = !stdenv.isMips;
-        };
-        ffmpeg_0_10 = callPackage ../development/libraries/ffmpeg/0.10.nix {
-          vpxSupport = !stdenv.isMips;
-          stdenv = if stdenv.isDarwin
-            then overrideGCC stdenv gccApple
-            else stdenv;
-        };
-        ffmpeg_1 = callPackage ../development/libraries/ffmpeg/1.x.nix {
-          vpxSupport = !stdenv.isMips;
-        };
-        ffmpeg_2 = callPackage ../development/libraries/ffmpeg/2.x.nix {
-        };
-        ffmpeg = ffmpeg_2;
-        ffms = callPackage ../development/libraries/ffms {
-        };
-        fftw = callPackage ../development/libraries/fftw {
-        };
-        fftwSinglePrec = fftw.override {
-          precision = "single";
-        };
-        fftwFloat = fftwSinglePrec;
-        flann = callPackage ../development/libraries/flann {
-        };
-        flite = callPackage ../development/libraries/flite {
-        };
-        fltk13 = callPackage ../development/libraries/fltk/fltk13.nix {
-        };
-        fltk20 = callPackage ../development/libraries/fltk {
-        };
-        fmod = callPackage ../development/libraries/fmod {
-        };
-        freeimage = callPackage ../development/libraries/freeimage {
-        };
-        freetts = callPackage ../development/libraries/freetts {
-        };
-        cfitsio = callPackage ../development/libraries/cfitsio {
-        };
-        fontconfig = callPackage ../development/libraries/fontconfig {
-        };
-        makeFontsConf = let
-          fontconfig_ = fontconfig;
-          in { fontDirectories, fontconfig ? fontconfig_ }:
-          import ../development/libraries/fontconfig/make-fonts-conf.nix {
-            inherit runCommand libxslt
-            fontconfig fontDirectories;
-          };
-        freealut = callPackage ../development/libraries/freealut {
-        };
-        freeglut = callPackage ../development/libraries/freeglut {
-        };
-        freetype = callPackage ../development/libraries/freetype {
-        };
-        frei0r = callPackage ../development/libraries/frei0r {
-        };
-        fribidi = callPackage ../development/libraries/fribidi {
-        };
-        funambol = callPackage ../development/libraries/funambol {
-        };
-        fam = gamin;
-        gamin = callPackage ../development/libraries/gamin {
-        };
-        ganv = callPackage ../development/libraries/ganv {
-        };
-        gav = callPackage ../games/gav {
-        };
-        gsb = callPackage ../games/gsb {
-        };
-        gdome2 = callPackage ../development/libraries/gdome2 {
-          inherit (gnome) gtkdoc;
-        };
-        gdbm = callPackage ../development/libraries/gdbm {
-        };
-        gegl = callPackage ../development/libraries/gegl {
-        };
-        gegl_0_0_22 = callPackage ../development/libraries/gegl/0_0_22.nix {
-          libpng = libpng12;
-        };
-        geoclue = callPackage ../development/libraries/geoclue {
-        };
-        geoclue2 = callPackage ../development/libraries/geoclue/2.0.nix {
-        };
-        geoip = callPackage ../development/libraries/geoip {
-        };
-        geoipjava = callPackage ../development/libraries/java/geoipjava {
-        };
-        geos = callPackage ../development/libraries/geos {
-        };
-        gettext = gettext_0_18;
-        gettext_0_17 = callPackage ../development/libraries/gettext/0.17.nix {
-        };
-        gettext_0_18 = callPackage ../development/libraries/gettext {
-        };
-        gd = callPackage ../development/libraries/gd {
-        };
-        gdal = callPackage ../development/libraries/gdal {
-        };
-        ggz_base_libs = callPackage ../development/libraries/ggz_base_libs {
-        };
-        giblib = callPackage ../development/libraries/giblib {
-        };
-        libgit2 = callPackage ../development/libraries/git2 {
-        };
-        glew = callPackage ../development/libraries/glew {
-        };
-        glfw = glfw3;
-        glfw2 = callPackage ../development/libraries/glfw/2.x.nix {
-        };
-        glfw3 = callPackage ../development/libraries/glfw/3.x.nix {
-        };
-        glibc = callPackage ../development/libraries/glibc/2.19 {
-          kernelHeaders = linuxHeaders;
-          installLocales = config.glibc.locales or false;
-          machHeaders = null;
-          hurdHeaders = null;
-          gccCross = null;
-        };
-        glibc_memusage = callPackage ../development/libraries/glibc/2.19 {
-          kernelHeaders = linuxHeaders;
-          installLocales = false;
-          withGd = true;
-        };
-        glibcCross = forceNativeDrv (makeOverridable (import ../development/libraries/glibc/2.19) (let
-          crossGNU = crossSystem != null && crossSystem.config == "i586-pc-gnu";
-          in {
-            inherit stdenv fetchurl;
-            gccCross = gccCrossStageStatic;
-            kernelHeaders = if crossGNU
-              then gnu.hurdHeaders
-              else linuxHeadersCross;
-            installLocales = config.glibc.locales or false;
-          } // lib.optionalAttrs crossGNU {
-            inherit (gnu) machHeaders
-            hurdHeaders libpthreadHeaders
-            mig;
-            inherit fetchgit;
-          }));
-        libcCrossChooser = name:
-        if name == "glibc"
-          then glibcCross
-          else if name == "uclibc"
-            then uclibcCross
-            else if name == "msvcrt"
-              then windows.mingw_w64
-              else if name == "libSystem"
-                then darwin.xcode
-                else throw "Unknown libc";
-        libcCross = assert crossSystem != null; libcCrossChooser crossSystem.libc;
-        eglibc = callPackage ../development/libraries/eglibc {
-          kernelHeaders = linuxHeaders;
-          installLocales = config.glibc.locales or false;
-        };
-        glibcLocales = callPackage ../development/libraries/glibc/2.19/locales.nix {
-        };
-        glibcInfo = callPackage ../development/libraries/glibc/2.19/info.nix {
-        };
-        glibc_multi = runCommand "${glibc.name}-multi" {
-          glibc64 = glibc;
-          glibc32 = (import ./all-packages.nix {
-            system = "i686-linux";
-          }).glibc;
-        } ''
-          mkdir -p ''$out
-          ln -s ''$glibc64/* ''$out/
-          
-          rm ''$out/lib ''$out/lib64
-          mkdir -p ''$out/lib
-          ln -s ''$glibc64/lib/* ''$out/lib
-          ln -s ''$glibc32/lib ''$out/lib/32
-          ln -s lib ''$out/lib64
-          
-          # fixing ldd RLTDLIST
-          rm ''$out/bin
-          cp -rs ''$glibc64/bin ''$out
-          chmod u+w ''$out/bin
-          rm ''$out/bin/ldd
-          sed -e "s|^RTLDLIST=.*''$|RTLDLIST=\"''$out/lib/ld-2.19.so ''$out/lib/32/ld-linux.so.2\"|g" \
-              ''$glibc64/bin/ldd > ''$out/bin/ldd
-          chmod 555 ''$out/bin/ldd
-          
-          rm ''$out/include
-          cp -rs ''$glibc32/include ''$out
-          chmod -R u+w ''$out/include
-          cp -rsf ''$glibc64/include ''$out
-        '';
-        glm = callPackage ../development/libraries/glm {
-        };
-        glog = callPackage ../development/libraries/glog {
-        };
-        gloox = callPackage ../development/libraries/gloox {
-        };
-        glpk = callPackage ../development/libraries/glpk {
-        };
-        glsurf = callPackage ../applications/science/math/glsurf {
-          inherit (ocamlPackages) lablgl
-          findlib camlimages ocaml_mysql
-          mlgmp;
-          libpng = libpng12;
-          giflib = giflib_4_1;
-        };
-        gmime = callPackage ../development/libraries/gmime {
-        };
-        gmm = callPackage ../development/libraries/gmm {
-        };
-        gmp = gmp5;
-        gmp5 = gmp51;
-        gmpxx = appendToName "with-cxx" (gmp.override {
-          cxx = true;
-        });
-        gmp4 = callPackage ../development/libraries/gmp/4.3.2.nix {
-        };
-        gmp51 = callPackage ../development/libraries/gmp/5.1.x.nix {
-        };
-        mpfr = callPackage ../development/libraries/mpfr/default.nix {
-        };
-        gobjectIntrospection = callPackage ../development/libraries/gobject-introspection {
-        };
-        goocanvas = callPackage ../development/libraries/goocanvas {
-        };
-        google-gflags = callPackage ../development/libraries/google-gflags {
-        };
-        gperftools = callPackage ../development/libraries/gperftools {
-        };
-        gst_all_1 = recurseIntoAttrs (callPackage ../development/libraries/gstreamer {
-          callPackage = pkgs.newScope (pkgs // {
-            libav = pkgs.libav_10;
-          });
-        });
-        gst_all = {
-          inherit (pkgs) gstreamer gnonlin
-          gst_python qt_gstreamer;
-          gstPluginsBase = pkgs.gst_plugins_base;
-          gstPluginsBad = pkgs.gst_plugins_bad;
-          gstPluginsGood = pkgs.gst_plugins_good;
-          gstPluginsUgly = pkgs.gst_plugins_ugly;
-          gstFfmpeg = pkgs.gst_ffmpeg;
-        };
-        gstreamer = callPackage ../development/libraries/gstreamer/legacy/gstreamer {
-          bison = bison2;
-        };
-        gst_plugins_base = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-base {
-        };
-        gst_plugins_good = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-good {
-        };
-        gst_plugins_bad = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-bad {
-        };
-        gst_plugins_ugly = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-ugly {
-        };
-        gst_ffmpeg = callPackage ../development/libraries/gstreamer/legacy/gst-ffmpeg {
-          ffmpeg = ffmpeg_0_10;
-        };
-        gst_python = callPackage ../development/libraries/gstreamer/legacy/gst-python {
-        };
-        gstreamermm = callPackage ../development/libraries/gstreamer/legacy/gstreamermm {
-        };
-        gnonlin = callPackage ../development/libraries/gstreamer/legacy/gnonlin {
-        };
-        gusb = callPackage ../development/libraries/gusb {
-          inherit (gnome) gtkdoc;
-        };
-        qt_gstreamer = callPackage ../development/libraries/gstreamer/legacy/qt-gstreamer {
-        };
-        gnet = callPackage ../development/libraries/gnet {
-        };
-        gnu-efi = callPackage ../development/libraries/gnu-efi {
-        };
-        gnutls = gnutls32;
-        gnutls31 = callPackage ../development/libraries/gnutls/3.1.nix {
-          guileBindings = config.gnutls.guile or false;
-        };
-        gnutls32 = callPackage ../development/libraries/gnutls/3.2.nix {
-          guileBindings = config.gnutls.guile or false;
-        };
-        gnutls_with_guile = lowPrio (gnutls.override {
-          guileBindings = true;
-        });
-        gpac = callPackage ../applications/video/gpac {
-        };
-        gpgme = callPackage ../development/libraries/gpgme {
-          gnupg1 = gnupg1orig;
-        };
-        grantlee = callPackage ../development/libraries/grantlee {
-        };
-        gsasl = callPackage ../development/libraries/gsasl {
-        };
-        gsl = callPackage ../development/libraries/gsl {
-        };
-        gsm = callPackage ../development/libraries/gsm {
-        };
-        gsoap = callPackage ../development/libraries/gsoap {
-        };
-        gss = callPackage ../development/libraries/gss {
-        };
-        gtkimageview = callPackage ../development/libraries/gtkimageview {
-        };
-        gtkmathview = callPackage ../development/libraries/gtkmathview {
-        };
-        gtkLibs = {
-          inherit (pkgs) glib glibmm atk
-          atkmm cairo pango pangomm
-          gdk_pixbuf gtk gtkmm;
-        };
-        glib = callPackage ../development/libraries/glib {
-        };
-        glib-tested = glib.override {
-          doCheck = true;
-        };
-        glibmm = callPackage ../development/libraries/glibmm {
-        };
-        glib_networking = callPackage ../development/libraries/glib-networking {
-        };
-        atk = callPackage ../development/libraries/atk {
-        };
-        atkmm = callPackage ../development/libraries/atkmm {
-        };
-        pixman = callPackage ../development/libraries/pixman {
-        };
-        cairo = callPackage ../development/libraries/cairo {
-          glSupport = config.cairo.gl or stdenv.isLinux && !stdenv.isArm && !stdenv.isMips;
-        };
-        cairomm = callPackage ../development/libraries/cairomm {
-        };
-        pango = callPackage ../development/libraries/pango {
-        };
-        pangomm = callPackage ../development/libraries/pangomm {
-        };
-        pangox_compat = callPackage ../development/libraries/pangox-compat {
-        };
-        gdk_pixbuf = callPackage ../development/libraries/gdk-pixbuf {
-          stdenv = if stdenv.isDarwin
-            then clangStdenv
-            else stdenv;
-        };
-        gtk2 = callPackage ../development/libraries/gtk+/2.x.nix {
-          cupsSupport = config.gtk2.cups or stdenv.isLinux;
-        };
-        gtk3 = callPackage ../development/libraries/gtk+/3.x.nix {
-        };
-        gtk = pkgs.gtk2;
-        gtkmm = callPackage ../development/libraries/gtkmm/2.x.nix {
-        };
-        gtkmm3 = callPackage ../development/libraries/gtkmm/3.x.nix {
-        };
-        gtkmozembedsharp = callPackage ../development/libraries/gtkmozembed-sharp {
-          gtksharp = gtksharp2;
-        };
-        gtksharp1 = callPackage ../development/libraries/gtk-sharp-1 {
-          inherit (gnome) libglade
-          libgtkhtml gtkhtml
-          libgnomecanvas libgnomeui
-          libgnomeprint libgnomeprintui
-          GConf;
-        };
-        gtksharp2 = callPackage ../development/libraries/gtk-sharp-2 {
-          inherit (gnome) libglade
-          libgtkhtml gtkhtml
-          libgnomecanvas libgnomeui
-          libgnomeprint libgnomeprintui
-          GConf gnomepanel;
-        };
-        gtksourceviewsharp = callPackage ../development/libraries/gtksourceview-sharp {
-          inherit (gnome) gtksourceview;
-          gtksharp = gtksharp2;
-        };
-        gtkspell = callPackage ../development/libraries/gtkspell {
-        };
-        gtkspell3 = callPackage ../development/libraries/gtkspell/3.nix {
-        };
-        gts = callPackage ../development/libraries/gts {
-        };
-        gvfs = callPackage ../development/libraries/gvfs {
-          gconf = gnome.GConf;
-        };
-        gwenhywfar = callPackage ../development/libraries/gwenhywfar {
-        };
-        hamlib = callPackage ../development/libraries/hamlib {
-        };
-        kerberos = heimdal;
-        heimdal = callPackage ../development/libraries/kerberos/heimdal.nix {
-        };
-        harfbuzz = callPackage ../development/libraries/harfbuzz {
-        };
-        hawknl = callPackage ../development/libraries/hawknl {
-        };
-        herqq = callPackage ../development/libraries/herqq {
-        };
-        hspell = callPackage ../development/libraries/hspell {
-        };
-        hspellDicts = callPackage ../development/libraries/hspell/dicts.nix {
-        };
-        hsqldb = callPackage ../development/libraries/java/hsqldb {
-        };
-        http-parser = callPackage ../development/libraries/http-parser {
-          inherit (pythonPackages) gyp;
-        };
-        hunspell = callPackage ../development/libraries/hunspell {
-        };
-        hwloc = callPackage ../development/libraries/hwloc {
-          inherit (xlibs) libX11;
-        };
-        hydraAntLogger = callPackage ../development/libraries/java/hydra-ant-logger {
-        };
-        icu = callPackage ../development/libraries/icu {
-        };
-        id3lib = callPackage ../development/libraries/id3lib {
-        };
-        iksemel = callPackage ../development/libraries/iksemel {
-        };
-        ilbc = callPackage ../development/libraries/ilbc {
-        };
-        ilixi = callPackage ../development/libraries/ilixi {
-        };
-        ilmbase = callPackage ../development/libraries/ilmbase {
-        };
-        imlib = callPackage ../development/libraries/imlib {
-          libpng = libpng12;
-        };
-        imlib2 = callPackage ../development/libraries/imlib2 {
-        };
-        incrtcl = callPackage ../development/libraries/incrtcl {
-        };
-        indilib = callPackage ../development/libraries/indilib {
-        };
-        iniparser = callPackage ../development/libraries/iniparser {
-        };
-        intltool = callPackage ../development/tools/misc/intltool {
-        };
-        irrlicht3843 = callPackage ../development/libraries/irrlicht {
-        };
-        isocodes = callPackage ../development/libraries/iso-codes {
-        };
-        itk = callPackage ../development/libraries/itk {
-        };
-        jamp = builderDefsPackage ../games/jamp {
-          inherit mesa SDL SDL_image
-          SDL_mixer;
-        };
-        jasper = callPackage ../development/libraries/jasper {
-        };
-        jama = callPackage ../development/libraries/jama {
-        };
-        jansson = callPackage ../development/libraries/jansson {
-        };
-        jbig2dec = callPackage ../development/libraries/jbig2dec {
-        };
-        jetty_gwt = callPackage ../development/libraries/java/jetty-gwt {
-        };
-        jetty_util = callPackage ../development/libraries/java/jetty-util {
-        };
-        json_glib = callPackage ../development/libraries/json-glib {
-        };
-        json-c-0-11 = callPackage ../development/libraries/json-c/0.11.nix {
-        };
-        json_c = callPackage ../development/libraries/json-c {
-        };
-        jsoncpp = callPackage ../development/libraries/jsoncpp {
-        };
-        libjson = callPackage ../development/libraries/libjson {
-        };
-        judy = callPackage ../development/libraries/judy {
-        };
-        keybinder = callPackage ../development/libraries/keybinder {
-          automake = automake111x;
-          lua = lua5_1;
-        };
-        keybinder3 = callPackage ../development/libraries/keybinder3 {
-          automake = automake111x;
-          lua = lua5_1;
-        };
-        krb5 = callPackage ../development/libraries/kerberos/krb5.nix {
-        };
-        lcms = lcms1;
-        lcms1 = callPackage ../development/libraries/lcms {
-        };
-        lcms2 = callPackage ../development/libraries/lcms2 {
-        };
-        lensfun = callPackage ../development/libraries/lensfun {
-        };
-        lesstif = callPackage ../development/libraries/lesstif {
-        };
-        lesstif93 = callPackage ../development/libraries/lesstif-0.93 {
-        };
-        leveldb = callPackage ../development/libraries/leveldb {
-        };
-        levmar = callPackage ../development/libraries/levmar {
-        };
-        leptonica = callPackage ../development/libraries/leptonica {
-          libpng = libpng12;
-        };
-        lgi = callPackage ../development/libraries/lgi {
-          lua = lua5_1;
-        };
-        lib3ds = callPackage ../development/libraries/lib3ds {
-        };
-        libaacs = callPackage ../development/libraries/libaacs {
-        };
-        libaal = callPackage ../development/libraries/libaal {
-        };
-        libao = callPackage ../development/libraries/libao {
-          usePulseAudio = config.pulseaudio or true;
-        };
-        libarchive = callPackage ../development/libraries/libarchive {
-        };
-        libass = callPackage ../development/libraries/libass {
-        };
-        libassuan1 = callPackage ../development/libraries/libassuan1 {
-        };
-        libassuan = callPackage ../development/libraries/libassuan {
-        };
-        libassuan2_1 = callPackage ../development/libraries/libassuan/git.nix {
-        };
-        libatomic_ops = callPackage ../development/libraries/libatomic_ops {
-        };
-        libav = libav_10;
-        libav_all = callPackage ../development/libraries/libav {
-        };
-        inherit (libav_all) libav_0_8
-        libav_9 libav_10;
-        libavc1394 = callPackage ../development/libraries/libavc1394 {
-        };
-        libbluedevil = callPackage ../development/libraries/libbluedevil {
-        };
-        libbluray = callPackage ../development/libraries/libbluray {
-        };
-        libbs2b = callPackage ../development/libraries/audio/libbs2b {
-        };
-        libcaca = callPackage ../development/libraries/libcaca {
-        };
-        libcanberra = callPackage ../development/libraries/libcanberra {
-        };
-        libcanberra_gtk3 = libcanberra.override {
-          gtk = gtk3;
-        };
-        libcanberra_kde = if config.kde_runtime.libcanberraWithoutGTK or true
-          then libcanberra.override {
-            gtk = null;
-          }
-          else libcanberra;
-        libcello = callPackage ../development/libraries/libcello {
-        };
-        libcdaudio = callPackage ../development/libraries/libcdaudio {
-        };
-        libcddb = callPackage ../development/libraries/libcddb {
-        };
-        libcdio = callPackage ../development/libraries/libcdio {
-        };
-        libcdio082 = callPackage ../development/libraries/libcdio/0.82.nix {
-        };
-        libcdr = callPackage ../development/libraries/libcdr {
-          lcms = lcms2;
-        };
-        libchamplain = callPackage ../development/libraries/libchamplain {
-          inherit (gnome) libsoup;
-        };
-        libchamplain_0_6 = callPackage ../development/libraries/libchamplain/0.6.nix {
-        };
-        libchop = callPackage ../development/libraries/libchop {
-        };
-        libcm = callPackage ../development/libraries/libcm {
-        };
-        inherit (gnome3) libcroco;
-        libcangjie = callPackage ../development/libraries/libcangjie {
-        };
-        libcredis = callPackage ../development/libraries/libcredis {
-        };
-        libctemplate = callPackage ../development/libraries/libctemplate {
-        };
-        libcue = callPackage ../development/libraries/libcue {
-        };
-        libdaemon = callPackage ../development/libraries/libdaemon {
-        };
-        libdbi = callPackage ../development/libraries/libdbi {
-        };
-        libdbiDriversBase = callPackage ../development/libraries/libdbi-drivers {
-          mysql = null;
-          sqlite = null;
-        };
-        libdbiDrivers = libdbiDriversBase.override {
-          inherit sqlite mysql;
-        };
-        libdbusmenu_qt = callPackage ../development/libraries/libdbusmenu-qt {
-        };
-        libdc1394 = callPackage ../development/libraries/libdc1394 {
-        };
-        libdc1394avt = callPackage ../development/libraries/libdc1394avt {
-        };
-        libdevil = callPackage ../development/libraries/libdevil {
-        };
-        libdiscid = callPackage ../development/libraries/libdiscid {
-        };
-        libdivsufsort = callPackage ../development/libraries/libdivsufsort {
-        };
-        libdmtx = callPackage ../development/libraries/libdmtx {
-        };
-        libdnet = callPackage ../development/libraries/libdnet {
-        };
-        libdrm = callPackage ../development/libraries/libdrm {
-          inherit fetchurl stdenv
-          pkgconfig;
-          inherit (xorg) libpthreadstubs;
-        };
-        libdv = callPackage ../development/libraries/libdv {
-        };
-        libdvbpsi = callPackage ../development/libraries/libdvbpsi {
-        };
-        libdwg = callPackage ../development/libraries/libdwg {
-        };
-        libdvdcss = callPackage ../development/libraries/libdvdcss {
-        };
-        libdvdnav = callPackage ../development/libraries/libdvdnav {
-        };
-        libdvdread = callPackage ../development/libraries/libdvdread {
-        };
-        libdwarf = callPackage ../development/libraries/libdwarf {
-        };
-        libeatmydata = callPackage ../development/libraries/libeatmydata {
-        };
-        libebml = callPackage ../development/libraries/libebml {
-        };
-        libedit = callPackage ../development/libraries/libedit {
-        };
-        libelf = callPackage ../development/libraries/libelf {
-        };
-        libfm = callPackage ../development/libraries/libfm {
-        };
-        libgadu = callPackage ../development/libraries/libgadu {
-        };
-        libgdata = gnome3.libgdata;
-        libgig = callPackage ../development/libraries/libgig {
-        };
-        libgnome_keyring = callPackage ../development/libraries/libgnome-keyring {
-        };
-        libgnome_keyring3 = gnome3.libgnome_keyring;
-        libgnurl = callPackage ../development/libraries/libgnurl {
-        };
-        libseccomp = callPackage ../development/libraries/libseccomp {
-        };
-        libsecret = callPackage ../development/libraries/libsecret {
-        };
-        libserialport = callPackage ../development/libraries/libserialport {
-        };
-        libgtop = callPackage ../development/libraries/libgtop {
-        };
-        liblo = callPackage ../development/libraries/liblo {
-        };
-        liblrdf = librdf;
-        liblscp = callPackage ../development/libraries/liblscp {
-        };
-        libe-book = callPackage ../development/libraries/libe-book {
-        };
-        libe-book_00 = callPackage ../development/libraries/libe-book/0.0.nix {
-        };
-        libev = builderDefsPackage ../development/libraries/libev {
-        };
-        libevent14 = callPackage ../development/libraries/libevent/1.4.nix {
-        };
-        libevent = callPackage ../development/libraries/libevent {
-        };
-        libewf = callPackage ../development/libraries/libewf {
-        };
-        libexif = callPackage ../development/libraries/libexif {
-        };
-        libexosip = callPackage ../development/libraries/exosip {
-        };
-        libexosip_3 = callPackage ../development/libraries/exosip/3.x.nix {
-          libosip = libosip_3;
-        };
-        libextractor = callPackage ../development/libraries/libextractor {
-          libmpeg2 = mpeg2dec;
-        };
-        libexttextcat = callPackage ../development/libraries/libexttextcat {
-        };
-        libf2c = callPackage ../development/libraries/libf2c {
-        };
-        libfixposix = callPackage ../development/libraries/libfixposix {
-        };
-        libffcall = builderDefsPackage (import ../development/libraries/libffcall) {
-          inherit fetchcvs;
-        };
-        libffi = callPackage ../development/libraries/libffi {
-        };
-        libftdi = callPackage ../development/libraries/libftdi {
-        };
-        libftdi1 = callPackage ../development/libraries/libftdi/1.x.nix {
-        };
-        libgcrypt = callPackage ../development/libraries/libgcrypt {
-        };
-        libgcrypt_1_6 = lowPrio (callPackage ../development/libraries/libgcrypt/1.6.nix {
-        });
-        libgdiplus = callPackage ../development/libraries/libgdiplus {
-        };
-        libgksu = callPackage ../development/libraries/libgksu {
-        };
-        libgpgerror = callPackage ../development/libraries/libgpg-error {
-        };
-        libgphoto2 = callPackage ../development/libraries/libgphoto2 {
-        };
-        libgphoto2_4 = callPackage ../development/libraries/libgphoto2/2.4.nix {
-        };
-        libgpod = callPackage ../development/libraries/libgpod {
-          inherit (pkgs.pythonPackages) mutagen;
-        };
-        libharu = callPackage ../development/libraries/libharu {
-        };
-        libical = callPackage ../development/libraries/libical {
-        };
-        libicns = callPackage ../development/libraries/libicns {
-        };
-        libimobiledevice = callPackage ../development/libraries/libimobiledevice {
-        };
-        libiodbc = callPackage ../development/libraries/libiodbc {
-          useGTK = config.libiodbc.gtk or false;
-        };
-        libivykis = callPackage ../development/libraries/libivykis {
-        };
-        liblastfmSF = callPackage ../development/libraries/liblastfmSF {
-        };
-        liblastfm = callPackage ../development/libraries/liblastfm {
-        };
-        liblqr1 = callPackage ../development/libraries/liblqr-1 {
-        };
-        liblockfile = callPackage ../development/libraries/liblockfile {
-        };
-        liblogging = callPackage ../development/libraries/liblogging {
-        };
-        libmcrypt = callPackage ../development/libraries/libmcrypt {
-        };
-        libmhash = callPackage ../development/libraries/libmhash {
-        };
-        libmodbus = callPackage ../development/libraries/libmodbus {
-        };
-        libmtp = callPackage ../development/libraries/libmtp {
-        };
-        libmsgpack = callPackage ../development/libraries/libmsgpack {
-        };
-        libnatspec = callPackage ../development/libraries/libnatspec {
-        };
-        libnfc = callPackage ../development/libraries/libnfc {
-        };
-        libnfsidmap = callPackage ../development/libraries/libnfsidmap {
-        };
-        libnice = callPackage ../development/libraries/libnice {
-        };
-        liboping = callPackage ../development/libraries/liboping {
-        };
-        libplist = callPackage ../development/libraries/libplist {
-        };
-        libQGLViewer = callPackage ../development/libraries/libqglviewer {
-        };
-        libre = callPackage ../development/libraries/libre {
-        };
-        librem = callPackage ../development/libraries/librem {
-        };
-        libresample = callPackage ../development/libraries/libresample {
-        };
-        librevenge = callPackage ../development/libraries/librevenge {
-        };
-        librevisa = callPackage ../development/libraries/librevisa {
-        };
-        libsamplerate = callPackage ../development/libraries/libsamplerate {
-        };
-        libspectre = callPackage ../development/libraries/libspectre {
-        };
-        libgsf = callPackage ../development/libraries/libgsf {
-        };
-        libiconv = callPackage ../development/libraries/libiconv {
-        };
-        libiconvOrEmpty = if libiconvOrNull == null
-          then [ ]
-          else [ libiconv ];
-        libiconvOrNull = if gcc.libc or null != null || stdenv.isGlibc
-          then null
-          else libiconv;
-        libiconvOrLibc = if libiconvOrNull == null
-          then gcc.libc
-          else libiconv;
-        libintlOrEmpty = stdenv.lib.optional (!stdenv.isLinux) gettext;
-        libid3tag = callPackage ../development/libraries/libid3tag {
-        };
-        libidn = callPackage ../development/libraries/libidn {
-        };
-        libiec61883 = callPackage ../development/libraries/libiec61883 {
-        };
-        libinfinity = callPackage ../development/libraries/libinfinity {
-          inherit (gnome) gtkdoc;
-        };
-        libiptcdata = callPackage ../development/libraries/libiptcdata {
-        };
-        libjpeg_original = callPackage ../development/libraries/libjpeg {
-        };
-        libjpeg_turbo = callPackage ../development/libraries/libjpeg-turbo {
-        };
-        libjpeg = if stdenv.isLinux
-          then libjpeg_turbo
-          else libjpeg_original;
-        libjpeg62 = callPackage ../development/libraries/libjpeg/62.nix {
-          libtool = libtool_1_5;
-        };
-        libjson_rpc_cpp = callPackage ../development/libraries/libjson-rpc-cpp {
-        };
-        libkate = callPackage ../development/libraries/libkate {
-        };
-        libksba = callPackage ../development/libraries/libksba {
-        };
-        libmad = callPackage ../development/libraries/libmad {
-        };
-        libmatchbox = callPackage ../development/libraries/libmatchbox {
-        };
-        libmatthew_java = callPackage ../development/libraries/java/libmatthew-java {
-        };
-        libmatroska = callPackage ../development/libraries/libmatroska {
-        };
-        libmcs = callPackage ../development/libraries/libmcs {
-        };
-        libmemcached = callPackage ../development/libraries/libmemcached {
-        };
-        libmicrohttpd = callPackage ../development/libraries/libmicrohttpd {
-        };
-        libmikmod = callPackage ../development/libraries/libmikmod {
-          stdenv = if stdenv.isDarwin
-            then overrideGCC stdenv gccApple
-            else stdenv;
-        };
-        libmilter = callPackage ../development/libraries/libmilter {
-        };
-        libmkv = callPackage ../development/libraries/libmkv {
-        };
-        libmms = callPackage ../development/libraries/libmms {
-        };
-        libmowgli = callPackage ../development/libraries/libmowgli {
-        };
-        libmng = callPackage ../development/libraries/libmng {
-        };
-        libmnl = callPackage ../development/libraries/libmnl {
-        };
-        libmodplug = callPackage ../development/libraries/libmodplug {
-        };
-        libmpcdec = callPackage ../development/libraries/libmpcdec {
-        };
-        libmp3splt = callPackage ../development/libraries/libmp3splt {
-        };
-        libmrss = callPackage ../development/libraries/libmrss {
-        };
-        libmsn = callPackage ../development/libraries/libmsn {
-        };
-        libmspack = callPackage ../development/libraries/libmspack {
-        };
-        libmusclecard = callPackage ../development/libraries/libmusclecard {
-        };
-        libmusicbrainz2 = callPackage ../development/libraries/libmusicbrainz/2.x.nix {
-        };
-        libmusicbrainz3 = callPackage ../development/libraries/libmusicbrainz {
-        };
-        libmusicbrainz5 = callPackage ../development/libraries/libmusicbrainz/5.x.nix {
-        };
-        libmusicbrainz = libmusicbrainz3;
-        libmwaw = callPackage ../development/libraries/libmwaw {
-        };
-        libmwaw_02 = callPackage ../development/libraries/libmwaw/0.2.nix {
-        };
-        libmx = callPackage ../development/libraries/libmx {
-        };
-        libnet = callPackage ../development/libraries/libnet {
-        };
-        libnetfilter_conntrack = callPackage ../development/libraries/libnetfilter_conntrack {
-        };
-        libnetfilter_queue = callPackage ../development/libraries/libnetfilter_queue {
-        };
-        libnfnetlink = callPackage ../development/libraries/libnfnetlink {
-        };
-        libnftnl = callPackage ../development/libraries/libnftnl {
-        };
-        libnih = callPackage ../development/libraries/libnih {
-        };
-        libnova = callPackage ../development/libraries/libnova {
-        };
-        libnxml = callPackage ../development/libraries/libnxml {
-        };
-        libodfgen = callPackage ../development/libraries/libodfgen {
-        };
-        libofa = callPackage ../development/libraries/libofa {
-        };
-        libofx = callPackage ../development/libraries/libofx {
-        };
-        libogg = callPackage ../development/libraries/libogg {
-        };
-        liboggz = callPackage ../development/libraries/liboggz {
-        };
-        liboil = callPackage ../development/libraries/liboil {
-        };
-        liboop = callPackage ../development/libraries/liboop {
-        };
-        libopus = callPackage ../development/libraries/libopus {
-        };
-        libosinfo = callPackage ../development/libraries/libosinfo {
-        };
-        libosip = callPackage ../development/libraries/osip {
-        };
-        libosip_3 = callPackage ../development/libraries/osip/3.nix {
-        };
-        libotr = callPackage ../development/libraries/libotr {
-          libgcrypt = libgcrypt_1_6;
-        };
-        libotr_3_2 = callPackage ../development/libraries/libotr/3.2.nix {
-        };
-        libp11 = callPackage ../development/libraries/libp11 {
-        };
-        libpar2 = callPackage ../development/libraries/libpar2 {
-        };
-        libpcap = callPackage ../development/libraries/libpcap {
-        };
-        libpipeline = callPackage ../development/libraries/libpipeline {
-        };
-        libpng = callPackage ../development/libraries/libpng {
-        };
-        libpng_apng = libpng.override {
-          apngSupport = true;
-        };
-        libpng12 = callPackage ../development/libraries/libpng/12.nix {
-        };
-        libpng15 = callPackage ../development/libraries/libpng/15.nix {
-        };
-        libpaper = callPackage ../development/libraries/libpaper {
-        };
-        libproxy = callPackage ../development/libraries/libproxy {
-          stdenv = if stdenv.isDarwin
-            then overrideGCC stdenv gcc
-            else stdenv;
-        };
-        libpseudo = callPackage ../development/libraries/libpseudo {
-        };
-        libpwquality = callPackage ../development/libraries/libpwquality {
-        };
-        libqalculate = callPackage ../development/libraries/libqalculate {
-        };
-        librsvg = callPackage ../development/libraries/librsvg {
-          gtk2 = null;
-          gtk3 = null;
-        };
-        librsync = callPackage ../development/libraries/librsync {
-        };
-        libsearpc = callPackage ../development/libraries/libsearpc {
-        };
-        libsigcxx = callPackage ../development/libraries/libsigcxx {
-        };
-        libsigcxx12 = callPackage ../development/libraries/libsigcxx/1.2.nix {
-        };
-        libsigsegv = callPackage ../development/libraries/libsigsegv {
-        };
-        libsigsegv_25 = callPackage ../development/libraries/libsigsegv/2.5.nix {
-        };
-        libsndfile = callPackage ../development/libraries/libsndfile {
-        };
-        libsodium = callPackage ../development/libraries/libsodium {
-        };
-        libsoup = callPackage ../development/libraries/libsoup {
-        };
-        libssh = callPackage ../development/libraries/libssh {
-        };
-        libssh2 = callPackage ../development/libraries/libssh2 {
-        };
-        libstartup_notification = callPackage ../development/libraries/startup-notification {
-        };
-        libspatialindex = callPackage ../development/libraries/libspatialindex {
-        };
-        libspatialite = callPackage ../development/libraries/libspatialite {
-        };
-        libtar = callPackage ../development/libraries/libtar {
-        };
-        libtasn1 = callPackage ../development/libraries/libtasn1 {
-        };
-        libtheora = callPackage ../development/libraries/libtheora {
-        };
-        libtiff = callPackage ../development/libraries/libtiff {
-        };
-        libtiger = callPackage ../development/libraries/libtiger {
-        };
-        libtommath = callPackage ../development/libraries/libtommath {
-        };
-        libtorrentRasterbar = callPackage ../development/libraries/libtorrent-rasterbar {
-          stdenv = if stdenv.isDarwin
-            then clangStdenv
-            else stdenv;
-        };
-        libtoxcore = callPackage ../development/libraries/libtoxcore {
-        };
-        libtsm = callPackage ../development/libraries/libtsm {
-        };
-        libtunepimp = callPackage ../development/libraries/libtunepimp {
-        };
-        libtxc_dxtn = callPackage ../development/libraries/libtxc_dxtn {
-        };
-        libtxc_dxtn_s2tc = callPackage ../development/libraries/libtxc_dxtn_s2tc {
-        };
-        libgeotiff = callPackage ../development/libraries/libgeotiff {
-        };
-        libunistring = callPackage ../development/libraries/libunistring {
-        };
-        libupnp = callPackage ../development/libraries/pupnp {
-        };
-        giflib = callPackage ../development/libraries/giflib {
-        };
-        giflib_4_1 = callPackage ../development/libraries/giflib/4.1.nix {
-        };
-        libungif = callPackage ../development/libraries/giflib/libungif.nix {
-        };
-        libunibreak = callPackage ../development/libraries/libunibreak {
-        };
-        libunique = callPackage ../development/libraries/libunique/default.nix {
-        };
-        liburcu = callPackage ../development/libraries/liburcu {
-        };
-        libusb = callPackage ../development/libraries/libusb {
-        };
-        libusb1 = callPackage ../development/libraries/libusb1 {
-          stdenv = if stdenv.isDarwin
-            then clangStdenv
-            else stdenv;
-        };
-        libunwind = callPackage ../development/libraries/libunwind {
-        };
-        libuvVersions = callPackage ../development/libraries/libuv {
-        };
-        libv4l = lowPrio (v4l_utils.override {
-          withQt4 = false;
-        });
-        libva = callPackage ../development/libraries/libva {
-        };
-        libvdpau = callPackage ../development/libraries/libvdpau {
-        };
-        libvirt = callPackage ../development/libraries/libvirt {
-        };
-        libvirt-glib = callPackage ../development/libraries/libvirt-glib {
-        };
-        libvisio = callPackage ../development/libraries/libvisio {
-        };
-        libvisual = callPackage ../development/libraries/libvisual {
-        };
-        libvncserver = callPackage ../development/libraries/libvncserver {
-        };
-        libviper = callPackage ../development/libraries/libviper {
-        };
-        libvpx = callPackage ../development/libraries/libvpx {
-        };
-        libvterm = callPackage ../development/libraries/libvterm {
-        };
-        libvorbis = callPackage ../development/libraries/libvorbis {
-        };
-        libwebp = callPackage ../development/libraries/libwebp {
-        };
-        libwmf = callPackage ../development/libraries/libwmf {
-        };
-        libwnck = libwnck2;
-        libwnck2 = callPackage ../development/libraries/libwnck {
-        };
-        libwnck3 = callPackage ../development/libraries/libwnck/3.x.nix {
-        };
-        libwpd = callPackage ../development/libraries/libwpd {
-        };
-        libwpd_08 = callPackage ../development/libraries/libwpd/0.8.nix {
-        };
-        libwpg = callPackage ../development/libraries/libwpg {
-        };
-        libx86 = builderDefsPackage ../development/libraries/libx86 {
-        };
-        libxdg_basedir = callPackage ../development/libraries/libxdg-basedir {
-        };
-        libxkbcommon = callPackage ../development/libraries/libxkbcommon {
-        };
-        libxklavier = callPackage ../development/libraries/libxklavier {
-        };
-        libxmi = callPackage ../development/libraries/libxmi {
-        };
-        libxml2 = callPackage ../development/libraries/libxml2 {
-          pythonSupport = false;
-        };
-        libxml2Python = lowPrio (libxml2.override {
-          pythonSupport = true;
-        });
-        libxmlxx = callPackage ../development/libraries/libxmlxx {
-        };
-        libxmp = callPackage ../development/libraries/libxmp {
-        };
-        libxslt = callPackage ../development/libraries/libxslt {
-        };
-        libixp_for_wmii = lowPrio (import ../development/libraries/libixp_for_wmii {
-          inherit fetchurl stdenv;
-        });
-        libyaml = callPackage ../development/libraries/libyaml {
-        };
-        libyamlcpp = callPackage ../development/libraries/libyaml-cpp {
-        };
-        libyamlcpp03 = callPackage ../development/libraries/libyaml-cpp/0.3.x.nix {
-        };
-        libyubikey = callPackage ../development/libraries/libyubikey {
-        };
-        libzip = callPackage ../development/libraries/libzip {
-        };
-        libzdb = callPackage ../development/libraries/libzdb {
-        };
-        libzrtpcpp = callPackage ../development/libraries/libzrtpcpp {
-        };
-        libzrtpcpp_1_6 = callPackage ../development/libraries/libzrtpcpp/1.6.nix {
-          ccrtp = ccrtp_1_8;
-        };
-        libwacom = callPackage ../development/libraries/libwacom {
-        };
-        lightning = callPackage ../development/libraries/lightning {
-        };
-        lirc = callPackage ../development/libraries/lirc {
-        };
-        liquidwar = builderDefsPackage ../games/liquidwar {
-          inherit (xlibs) xproto libX11
-          libXrender;
-          inherit gmp mesa libjpeg expat
-          gettext perl SDL SDL_image
-          SDL_mixer SDL_ttf curl sqlite
-          libogg libvorbis libcaca csound
-          cunit;
-          guile = guile_1_8;
-          libpng = libpng15;
-        };
-        log4cpp = callPackage ../development/libraries/log4cpp {
-        };
-        log4cxx = callPackage ../development/libraries/log4cxx {
-        };
-        log4cplus = callPackage ../development/libraries/log4cplus {
-        };
-        loudmouth = callPackage ../development/libraries/loudmouth {
-        };
-        lzo = callPackage ../development/libraries/lzo {
-        };
-        mdds_0_7_1 = callPackage ../development/libraries/mdds/0.7.1.nix {
-        };
-        mdds = callPackage ../development/libraries/mdds {
-        };
-        mediastreamer = callPackage ../development/libraries/mediastreamer {
-        };
-        menu-cache = callPackage ../development/libraries/menu-cache {
-        };
-        mesaSupported = lib.elem system lib.platforms.mesaPlatforms;
-        mesaDarwinOr = alternative:
-        if stdenv.isDarwin
-          then callPackage ../development/libraries/mesa-darwin {
-          }
-          else alternative;
-        mesa_noglu = mesaDarwinOr (callPackage ../development/libraries/mesa {
-          grsecEnabled = true;
-        });
-        mesa_glu = mesaDarwinOr (callPackage ../development/libraries/mesa-glu {
-        });
-        mesa_drivers = mesaDarwinOr (let
-          mo = mesa_noglu.override {
-            grsecEnabled = config.grsecurity or false;
-          };
-          in mo.drivers);
-        mesa = mesaDarwinOr (buildEnv {
-          name = "mesa-${mesa_noglu.version}";
-          paths = [ mesa_noglu mesa_glu ];
-        });
-        metaEnvironment = recurseIntoAttrs (let
-          callPackage = newScope pkgs.metaEnvironment;
-          in rec {
-            sdfLibrary = callPackage ../development/libraries/sdf-library {
-              aterm = aterm28;
-            };
-            toolbuslib = callPackage ../development/libraries/toolbuslib {
-              aterm = aterm28;
-              inherit (windows) w32api;
-            };
-            cLibrary = callPackage ../development/libraries/c-library {
-              aterm = aterm28;
-            };
-            errorSupport = callPackage ../development/libraries/error-support {
-              aterm = aterm28;
-            };
-            ptSupport = callPackage ../development/libraries/pt-support {
-              aterm = aterm28;
-            };
-            ptableSupport = callPackage ../development/libraries/ptable-support {
-              aterm = aterm28;
-            };
-            configSupport = callPackage ../development/libraries/config-support {
-              aterm = aterm28;
-            };
-            asfSupport = callPackage ../development/libraries/asf-support {
-              aterm = aterm28;
-            };
-            tideSupport = callPackage ../development/libraries/tide-support {
-              aterm = aterm28;
-            };
-            rstoreSupport = callPackage ../development/libraries/rstore-support {
-              aterm = aterm28;
-            };
-            sdfSupport = callPackage ../development/libraries/sdf-support {
-              aterm = aterm28;
-            };
-            sglr = callPackage ../development/libraries/sglr {
-              aterm = aterm28;
-            };
-            ascSupport = callPackage ../development/libraries/asc-support {
-              aterm = aterm28;
-            };
-            pgen = callPackage ../development/libraries/pgen {
-              aterm = aterm28;
-            };
-          });
-        ming = callPackage ../development/libraries/ming {
-        };
-        minizip = callPackage ../development/libraries/minizip {
-        };
-        minmay = callPackage ../development/libraries/minmay {
-        };
-        miro = callPackage ../applications/video/miro {
-          inherit (pythonPackages) pywebkitgtk
-          pysqlite pycurl mutagen;
-        };
-        mkvtoolnix = callPackage ../applications/video/mkvtoolnix {
-        };
-        mlt-qt4 = callPackage ../development/libraries/mlt {
-          qt = qt4;
-          SDL = SDL_pulseaudio;
-        };
-        mlt-qt5 = callPackage ../development/libraries/mlt {
-          qt = qt5;
-          SDL = SDL_pulseaudio;
-        };
-        movit = callPackage ../development/libraries/movit {
-        };
-        mps = callPackage ../development/libraries/mps {
-        };
-        libmpeg2 = callPackage ../development/libraries/libmpeg2 {
-        };
-        mpeg2dec = libmpeg2;
-        msilbc = callPackage ../development/libraries/msilbc {
-        };
-        mp4v2 = callPackage ../development/libraries/mp4v2 {
-        };
-        mpc = callPackage ../development/libraries/mpc {
-        };
-        mpich2 = callPackage ../development/libraries/mpich2 {
-        };
-        mtdev = callPackage ../development/libraries/mtdev {
-        };
-        mtpfs = callPackage ../tools/filesystems/mtpfs {
-        };
-        mu = callPackage ../tools/networking/mu {
-          texinfo = texinfo4;
-        };
-        muparser = callPackage ../development/libraries/muparser {
-        };
-        mygpoclient = callPackage ../development/python-modules/mygpoclient {
-        };
-        mygui = callPackage ../development/libraries/mygui {
-        };
-        myguiSvn = callPackage ../development/libraries/mygui/svn.nix {
-        };
-        mysocketw = callPackage ../development/libraries/mysocketw {
-        };
-        mythes = callPackage ../development/libraries/mythes {
-        };
-        nanomsg = callPackage ../development/libraries/nanomsg {
-        };
-        ncurses = callPackage ../development/libraries/ncurses {
-          unicode = system != "i686-cygwin";
-        };
-        neon = callPackage ../development/libraries/neon {
-          compressionSupport = true;
-          sslSupport = true;
-        };
-        nethack = builderDefsPackage (import ../games/nethack) {
-          inherit ncurses flex bison;
-        };
-        nettle = callPackage ../development/libraries/nettle {
-        };
-        newt = callPackage ../development/libraries/newt {
-        };
-        nix-plugins = callPackage ../development/libraries/nix-plugins {
-          nix = pkgs.nixUnstable;
-        };
-        nspr = callPackage ../development/libraries/nspr {
-        };
-        nss = lowPrio (callPackage ../development/libraries/nss {
-        });
-        nssTools = callPackage ../development/libraries/nss {
-          includeTools = true;
-        };
-        ntrack = callPackage ../development/libraries/ntrack {
-        };
-        nvidia-texture-tools = callPackage ../development/libraries/nvidia-texture-tools {
-        };
-        ode = builderDefsPackage (import ../development/libraries/ode) {
-        };
-        ogre = callPackage ../development/libraries/ogre {
-        };
-        ogrepaged = callPackage ../development/libraries/ogrepaged {
-        };
-        oniguruma = callPackage ../development/libraries/oniguruma {
-        };
-        openal = callPackage ../development/libraries/openal {
-        };
-        openalSoft = callPackage ../development/libraries/openal-soft {
-        };
-        openbabel = callPackage ../development/libraries/openbabel {
-        };
-        opencascade = callPackage ../development/libraries/opencascade {
-        };
-        opencascade_6_5 = callPackage ../development/libraries/opencascade/6.5.nix {
-          automake = automake111x;
-          ftgl = ftgl212;
-        };
-        opencascade_oce = callPackage ../development/libraries/opencascade/oce.nix {
-        };
-        opencsg = callPackage ../development/libraries/opencsg {
-        };
-        openct = callPackage ../development/libraries/openct {
-        };
-        opencv = callPackage ../development/libraries/opencv {
-        };
-        opencv_2_1 = callPackage ../development/libraries/opencv/2.1.nix {
-          libpng = libpng12;
-        };
-        openexr_ctl = callPackage ../development/libraries/openexr_ctl {
-        };
-        openexr = callPackage ../development/libraries/openexr {
-        };
-        openldap = callPackage ../development/libraries/openldap {
-        };
-        openlierox = callPackage ../games/openlierox {
-        };
-        libopensc_dnie = callPackage ../development/libraries/libopensc-dnie {
-        };
-        opencolorio = callPackage ../development/libraries/opencolorio {
-        };
-        ois = callPackage ../development/libraries/ois {
-        };
-        opal = callPackage ../development/libraries/opal {
-        };
-        openjpeg = callPackage ../development/libraries/openjpeg {
-          lcms = lcms2;
-        };
-        openscenegraph = callPackage ../development/libraries/openscenegraph {
-          giflib = giflib_4_1;
-          ffmpeg = ffmpeg_0_10;
-        };
-        openspades = callPackage ../games/openspades {
-        };
-        libressl = callPackage ../development/libraries/libressl {
-        };
-        boringssl = callPackage ../development/libraries/boringssl {
-        };
-        openssl = callPackage ../development/libraries/openssl {
-          fetchurl = fetchurlBoot;
-          cryptodevHeaders = linuxPackages.cryptodev.override {
-            fetchurl = fetchurlBoot;
-            onlyHeaders = true;
-          };
-        };
-        ortp = callPackage ../development/libraries/ortp {
-          srtp = srtp_linphone;
-        };
-        p11_kit = callPackage ../development/libraries/p11-kit {
-        };
-        paperkey = callPackage ../tools/security/paperkey {
-        };
-        pangoxsl = callPackage ../development/libraries/pangoxsl {
-        };
-        pcl = callPackage ../development/libraries/pcl {
-          vtk = vtkWithQt4;
-        };
-        pcre = callPackage ../development/libraries/pcre {
-          unicodeSupport = config.pcre.unicode or true;
-        };
-        pdf2xml = callPackage ../development/libraries/pdf2xml {
-        };
-        phonon = callPackage ../development/libraries/phonon {
-        };
-        phonon_backend_gstreamer = callPackage ../development/libraries/phonon-backend-gstreamer {
-        };
-        phonon_backend_vlc = callPackage ../development/libraries/phonon-backend-vlc {
-        };
-        physfs = callPackage ../development/libraries/physfs {
-        };
-        pkcs11helper = callPackage ../development/libraries/pkcs11helper {
-        };
-        plib = callPackage ../development/libraries/plib {
-        };
-        pocketsphinx = callPackage ../development/libraries/pocketsphinx {
-        };
-        podofo = callPackage ../development/libraries/podofo {
-        };
-        polkit = callPackage ../development/libraries/polkit {
-          spidermonkey = spidermonkey_185;
-        };
-        polkit_qt_1 = callPackage ../development/libraries/polkit-qt-1 {
-        };
-        policykit = callPackage ../development/libraries/policykit {
-        };
-        poppler = callPackage ../development/libraries/poppler {
-          lcms = lcms2;
-        };
-        popplerQt4 = poppler.poppler_qt4;
-        popt = callPackage ../development/libraries/popt {
-        };
-        portaudio = callPackage ../development/libraries/portaudio {
-          stdenv = if stdenv.isDarwin
-            then clangStdenv
-            else stdenv;
-        };
-        portaudioSVN = callPackage ../development/libraries/portaudio/svn-head.nix {
-        };
-        portmidi = callPackage ../development/libraries/portmidi {
-        };
-        prison = callPackage ../development/libraries/prison {
-        };
-        proj = callPackage ../development/libraries/proj {
-        };
-        postgis = callPackage ../development/libraries/postgis {
-        };
-        protobuf = callPackage ../development/libraries/protobuf {
-        };
-        protobufc = callPackage ../development/libraries/protobufc {
-        };
-        pth = callPackage ../development/libraries/pth {
-        };
-        ptlib = callPackage ../development/libraries/ptlib {
-        };
-        re2 = callPackage ../development/libraries/re2 {
-        };
-        qca2 = callPackage ../development/libraries/qca2 {
-        };
-        qca2_ossl = callPackage ../development/libraries/qca2/ossl.nix {
-        };
-        qimageblitz = callPackage ../development/libraries/qimageblitz {
-        };
-        qjson = callPackage ../development/libraries/qjson {
-        };
-        qoauth = callPackage ../development/libraries/qoauth {
-        };
-        qt3 = callPackage ../development/libraries/qt-3 {
-          openglSupport = mesaSupported;
-          libpng = libpng12;
-        };
-        qt4 = pkgs.kde4.qt4;
-        qt48 = callPackage ../development/libraries/qt-4.x/4.8 {
-          mesa = mesa_noglu;
-          inherit (pkgs.gnome) libgnomeui
-          GConf gnome_vfs;
-          cups = if stdenv.isLinux
-            then cups
-            else null;
-          stdenv = if stdenv.isDarwin
-            then clangStdenv
-            else stdenv;
-        };
-        qt48Full = qt48.override {
-          docs = true;
-          demos = true;
-          examples = true;
-          developerBuild = true;
-        };
-        qt4SDK = qtcreator.override {
-          sdkBuild = true;
-          qtLib = qt48Full;
-        };
-        qt53Full = qt53.override {
-          buildDocs = true;
-          buildExamples = true;
-          buildTests = true;
-          developerBuild = true;
-        };
-        qt53 = callPackage ../development/libraries/qt-5/qt-5.3.nix {
-          mesa = mesa_noglu;
-          cups = if stdenv.isLinux
-            then cups
-            else null;
-          inherit (gnome) libgnomeui GConf
-          gnome_vfs;
-          bison = bison2;
-        };
-        qt5 = callPackage ../development/libraries/qt-5 {
-          mesa = mesa_noglu;
-          cups = if stdenv.isLinux
-            then cups
-            else null;
-          inherit (gnome) libgnomeui GConf
-          gnome_vfs;
-          bison = bison2;
-        };
-        qt5Full = qt5.override {
-          buildDocs = true;
-          buildExamples = true;
-          buildTests = true;
-          developerBuild = true;
-        };
-        qt5SDK = qtcreator.override {
-          sdkBuild = true;
-          qtLib = qt5Full;
-        };
-        qtcreator = callPackage ../development/qtcreator {
-          qtLib = qt48.override {
-            developerBuild = true;
-          };
-        };
-        qtscriptgenerator = callPackage ../development/libraries/qtscriptgenerator {
-        };
-        quesoglc = callPackage ../development/libraries/quesoglc {
-        };
-        qwt = callPackage ../development/libraries/qwt {
-        };
-        qwt6 = callPackage ../development/libraries/qwt/6.nix {
-        };
-        rabbitmq-c = callPackage ../development/libraries/rabbitmq-c {
-        };
-        rabbitmq-java-client = callPackage ../development/libraries/rabbitmq-java-client {
-        };
-        raul = callPackage ../development/libraries/audio/raul {
-        };
-        readline = readline6;
-        readline4 = callPackage ../development/libraries/readline/readline4.nix {
-        };
-        readline5 = callPackage ../development/libraries/readline/readline5.nix {
-        };
-        readline6 = callPackage ../development/libraries/readline/readline6.nix {
-        };
-        readline63 = callPackage ../development/libraries/readline/readline6.3.nix {
-        };
-        librdf_raptor = callPackage ../development/libraries/librdf/raptor.nix {
-        };
-        librdf_raptor2 = callPackage ../development/libraries/librdf/raptor2.nix {
-        };
-        librdf_rasqal = callPackage ../development/libraries/librdf/rasqal.nix {
-        };
-        librdf_redland = callPackage ../development/libraries/librdf/redland.nix {
-        };
-        librdf = callPackage ../development/libraries/librdf {
-        };
-        lilv = callPackage ../development/libraries/audio/lilv {
-        };
-        lv2 = callPackage ../development/libraries/audio/lv2 {
-        };
-        lvtk = callPackage ../development/libraries/audio/lvtk {
-        };
-        qrupdate = callPackage ../development/libraries/qrupdate {
-        };
-        redland = pkgs.librdf_redland;
-        rhino = callPackage ../development/libraries/java/rhino {
-          javac = gcj;
-          jvm = gcj;
-        };
-        rlog = callPackage ../development/libraries/rlog {
-        };
-        rubberband = callPackage ../development/libraries/rubberband {
-          fftw = fftwSinglePrec;
-          inherit (vamp) vampSDK;
-        };
-        sbc = callPackage ../development/libraries/sbc {
-        };
-        schroedinger = callPackage ../development/libraries/schroedinger {
-        };
-        SDL = callPackage ../development/libraries/SDL {
-          openglSupport = mesaSupported;
-          alsaSupport = !stdenv.isDarwin;
-          x11Support = true;
-          pulseaudioSupport = stdenv.isDarwin;
-          stdenv = if stdenv.isDarwin
-            then clangStdenv
-            else stdenv;
-        };
-        SDL_pulseaudio = SDL.override {
-          pulseaudioSupport = true;
-        };
-        SDL_gfx = callPackage ../development/libraries/SDL_gfx {
-        };
-        SDL_image = callPackage ../development/libraries/SDL_image {
-          stdenv = if stdenv.isDarwin
-            then clangStdenv
-            else stdenv;
-        };
-        SDL_mixer = callPackage ../development/libraries/SDL_mixer {
-        };
-        SDL_net = callPackage ../development/libraries/SDL_net {
-        };
-        SDL_sound = callPackage ../development/libraries/SDL_sound {
-        };
-        SDL_ttf = callPackage ../development/libraries/SDL_ttf {
-        };
-        SDL2 = callPackage ../development/libraries/SDL2 {
-          openglSupport = mesaSupported;
-          alsaSupport = true;
-          x11Support = true;
-          pulseaudioSupport = false;
-        };
-        SDL2_image = callPackage ../development/libraries/SDL2_image {
-        };
-        SDL2_mixer = callPackage ../development/libraries/SDL2_mixer {
-        };
-        SDL2_net = callPackage ../development/libraries/SDL2_net {
-        };
-        SDL2_gfx = callPackage ../development/libraries/SDL2_gfx {
-        };
-        serd = callPackage ../development/libraries/serd {
-        };
-        serf = callPackage ../development/libraries/serf {
-        };
-        silgraphite = callPackage ../development/libraries/silgraphite {
-        };
-        graphite2 = callPackage ../development/libraries/silgraphite/graphite2.nix {
-        };
-        simgear = callPackage ../development/libraries/simgear {
-        };
-        sfml_git = callPackage ../development/libraries/sfml {
-        };
-        skalibs = callPackage ../development/libraries/skalibs {
-        };
-        slang = callPackage ../development/libraries/slang {
-        };
-        slibGuile = callPackage ../development/libraries/slib {
-          scheme = guile_1_8;
-          texinfo = texinfo4;
-        };
-        smpeg = callPackage ../development/libraries/smpeg {
-        };
-        snack = callPackage ../development/libraries/snack {
-        };
-        snappy = callPackage ../development/libraries/snappy {
-        };
-        sodium = callPackage ../development/libraries/sodium {
-        };
-        sofia_sip = callPackage ../development/libraries/sofia-sip {
-        };
-        soprano = callPackage ../development/libraries/soprano {
-        };
-        soqt = callPackage ../development/libraries/soqt {
-        };
-        sord = callPackage ../development/libraries/sord {
-        };
-        spandsp = callPackage ../development/libraries/spandsp {
-        };
-        speechd = callPackage ../development/libraries/speechd {
-        };
-        speech_tools = callPackage ../development/libraries/speech-tools {
-        };
-        speex = callPackage ../development/libraries/speex {
-        };
-        sphinxbase = callPackage ../development/libraries/sphinxbase {
-        };
-        spice = callPackage ../development/libraries/spice {
-          celt = celt_0_5_1;
-          inherit (xlibs) libXrandr
-          libXfixes libXext libXrender
-          libXinerama;
-          inherit (pythonPackages) pyparsing;
-        };
-        spice_gtk = callPackage ../development/libraries/spice-gtk {
-        };
-        spice_protocol = callPackage ../development/libraries/spice-protocol {
-        };
-        sratom = callPackage ../development/libraries/audio/sratom {
-        };
-        srtp = callPackage ../development/libraries/srtp {
-        };
-        srtp_linphone = callPackage ../development/libraries/srtp/linphone.nix {
-        };
-        sqlite = lowPrio (callPackage ../development/libraries/sqlite {
-          readline = null;
-          ncurses = null;
-        });
-        sqliteInteractive = appendToName "interactive" (sqlite.override {
-          inherit readline ncurses;
-        });
-        sqlcipher = lowPrio (callPackage ../development/libraries/sqlcipher {
-          readline = null;
-          ncurses = null;
-        });
-        stfl = callPackage ../development/libraries/stfl {
-          stdenv = if stdenv.isDarwin
-            then overrideGCC stdenv gccApple
-            else stdenv;
-        };
-        stlink = callPackage ../development/tools/misc/stlink {
-        };
-        steghide = callPackage ../tools/security/steghide {
-        };
-        stepmania = callPackage ../games/stepmania {
-        };
-        stlport = callPackage ../development/libraries/stlport {
-        };
-        strigi = callPackage ../development/libraries/strigi {
-          clucene_core = clucene_core_2;
-        };
-        subtitleeditor = callPackage ../applications/video/subtitleeditor {
-        };
-        suil = callPackage ../development/libraries/audio/suil {
-        };
-        suitesparse = callPackage ../development/libraries/suitesparse {
-        };
-        sutils = callPackage ../tools/misc/sutils {
-        };
-        sword = callPackage ../development/libraries/sword {
-        };
-        szip = callPackage ../development/libraries/szip {
-        };
-        t1lib = callPackage ../development/libraries/t1lib {
-        };
-        taglib = callPackage ../development/libraries/taglib {
-        };
-        taglib_extras = callPackage ../development/libraries/taglib-extras {
-        };
-        talloc = callPackage ../development/libraries/talloc {
-        };
-        tclap = callPackage ../development/libraries/tclap {
-        };
-        tclgpg = callPackage ../development/libraries/tclgpg {
-        };
-        tcllib = callPackage ../development/libraries/tcllib {
-        };
-        tcltls = callPackage ../development/libraries/tcltls {
-        };
-        tdb = callPackage ../development/libraries/tdb {
-        };
-        tecla = callPackage ../development/libraries/tecla {
-        };
-        telepathy_glib = callPackage ../development/libraries/telepathy/glib {
-        };
-        telepathy_farstream = callPackage ../development/libraries/telepathy/farstream {
-        };
-        telepathy_qt = callPackage ../development/libraries/telepathy/qt {
-        };
-        thrift = callPackage ../development/libraries/thrift {
-        };
-        tinyxml = tinyxml2;
-        tinyxml2 = callPackage ../development/libraries/tinyxml/2.6.2.nix {
-        };
-        tk = callPackage ../development/libraries/tk {
-        };
-        tnt = callPackage ../development/libraries/tnt {
-        };
-        tokyocabinet = callPackage ../development/libraries/tokyo-cabinet {
-        };
-        tokyotyrant = callPackage ../development/libraries/tokyo-tyrant {
-        };
-        tremor = callPackage ../development/libraries/tremor {
-        };
-        unicap = callPackage ../development/libraries/unicap {
-        };
-        tsocks = callPackage ../development/libraries/tsocks {
-        };
-        unixODBC = callPackage ../development/libraries/unixODBC {
-        };
-        unixODBCDrivers = recurseIntoAttrs (import ../development/libraries/unixODBCDrivers {
-          inherit fetchurl stdenv unixODBC
-          glibc libtool openssl zlib;
-          inherit postgresql mysql sqlite;
-        });
-        urt = callPackage ../development/libraries/urt {
-        };
-        ustr = callPackage ../development/libraries/ustr {
-        };
-        usbredir = callPackage ../development/libraries/usbredir {
-          libusb = libusb1;
-        };
-        ucommon = callPackage ../development/libraries/ucommon {
-        };
-        v8 = callPackage ../development/libraries/v8 {
-          inherit (pythonPackages) gyp;
-        };
-        vaapiIntel = callPackage ../development/libraries/vaapi-intel {
-        };
-        vaapiVdpau = callPackage ../development/libraries/vaapi-vdpau {
-        };
-        vamp = callPackage ../development/libraries/audio/vamp {
-        };
-        vcdimager = callPackage ../development/libraries/vcdimager {
-        };
-        vigra = callPackage ../development/libraries/vigra {
-          inherit (pkgs.pythonPackages) numpy;
-        };
-        vlock = callPackage ../misc/screensavers/vlock {
-        };
-        vmime = callPackage ../development/libraries/vmime {
-        };
-        vrpn = callPackage ../development/libraries/vrpn {
-        };
-        vtk = callPackage ../development/libraries/vtk {
-        };
-        vtkWithQt4 = vtk.override {
-          qtLib = qt4;
-        };
-        vxl = callPackage ../development/libraries/vxl {
-          libpng = libpng12;
-        };
-        wayland = callPackage ../development/libraries/wayland {
-        };
-        webkit = webkitgtk;
-        webkitgtk = callPackage ../development/libraries/webkitgtk {
-          harfbuzz = harfbuzz.override {
-            withIcu = true;
-          };
-          gst-plugins-base = gst_all_1.gst-plugins-base;
-        };
-        webkitgtk2 = webkitgtk.override {
-          withGtk2 = true;
-          enableIntrospection = false;
-        };
-        wildmidi = callPackage ../development/libraries/wildmidi {
-        };
-        wvstreams = callPackage ../development/libraries/wvstreams {
-        };
-        wxGTK = wxGTK28;
-        wxGTK28 = callPackage ../development/libraries/wxGTK-2.8 {
-          inherit (gnome) GConf;
-          withMesa = lib.elem system lib.platforms.mesaPlatforms;
-        };
-        wxGTK29 = callPackage ../development/libraries/wxGTK-2.9/default.nix {
-          inherit (gnome) GConf;
-          withMesa = lib.elem system lib.platforms.mesaPlatforms;
-          stdenv = if stdenv.isDarwin
-            then clangStdenv
-            else stdenv;
-        };
-        wxGTK30 = callPackage ../development/libraries/wxGTK-3.0/default.nix {
-          inherit (gnome) GConf;
-          withMesa = lib.elem system lib.platforms.mesaPlatforms;
-          stdenv = if stdenv.isDarwin
-            then clangStdenv
-            else stdenv;
-        };
-        wtk = callPackage ../development/libraries/wtk {
-        };
-        x264 = callPackage ../development/libraries/x264 {
-        };
-        xapian = callPackage ../development/libraries/xapian {
-        };
-        xapianBindings = callPackage ../development/libraries/xapian/bindings {
-        };
-        xapian10 = callPackage ../development/libraries/xapian/1.0.x.nix {
-        };
-        xapianBindings10 = callPackage ../development/libraries/xapian/bindings/1.0.x.nix {
-        };
-        Xaw3d = callPackage ../development/libraries/Xaw3d {
-        };
-        xbase = callPackage ../development/libraries/xbase {
-        };
-        xcb-util-cursor = callPackage ../development/libraries/xcb-util-cursor {
-        };
-        xdo = callPackage ../tools/misc/xdo {
-        };
-        xineLib = callPackage ../development/libraries/xine-lib {
-          ffmpeg = ffmpeg_1;
-        };
-        xautolock = callPackage ../misc/screensavers/xautolock {
-        };
-        xercesc = callPackage ../development/libraries/xercesc {
-        };
-        xlibsWrapper = callPackage ../development/libraries/xlibs-wrapper {
-          packages = [
-            freetype
-            fontconfig
-            xlibs.xproto
-            xlibs.libX11
-            xlibs.libXt
-            xlibs.libXft
-            xlibs.libXext
-            xlibs.libSM
-            xlibs.libICE
-            xlibs.xextproto
-          ];
-        };
-        xmlrpc_c = callPackage ../development/libraries/xmlrpc-c {
-        };
-        xmlsec = callPackage ../development/libraries/xmlsec {
-        };
-        xvidcore = callPackage ../development/libraries/xvidcore {
-        };
-        xylib = callPackage ../development/libraries/xylib {
-        };
-        yajl = callPackage ../development/libraries/yajl {
-        };
-        zangband = builderDefsPackage (import ../games/zangband) {
-          inherit ncurses flex bison
-          autoconf automake m4 coreutils;
-        };
-        zeitgeist = callPackage ../development/libraries/zeitgeist {
-        };
-        zlib = callPackage ../development/libraries/zlib {
-          fetchurl = fetchurlBoot;
-        };
-        zlibStatic = lowPrio (appendToName "static" (callPackage ../development/libraries/zlib {
-          static = true;
-        }));
-        zeromq2 = callPackage ../development/libraries/zeromq/2.x.nix {
-        };
-        zeromq3 = callPackage ../development/libraries/zeromq/3.x.nix {
-        };
-        zeromq4 = callPackage ../development/libraries/zeromq/4.x.nix {
-        };
-        zziplib = callPackage ../development/libraries/zziplib {
-        };
-        atermjava = callPackage ../development/libraries/java/aterm {
-          stdenv = overrideInStdenv stdenv [
-            gnumake380
-          ];
-        };
-        commonsFileUpload = callPackage ../development/libraries/java/jakarta-commons/file-upload {
-        };
-        fastjar = callPackage ../development/tools/java/fastjar {
-        };
-        httpunit = callPackage ../development/libraries/java/httpunit {
-        };
-        gwtdragdrop = callPackage ../development/libraries/java/gwt-dragdrop {
-        };
-        gwtwidgets = callPackage ../development/libraries/java/gwt-widgets {
-        };
-        jakartabcel = callPackage ../development/libraries/java/jakarta-bcel {
-          regexp = jakartaregexp;
-        };
-        jakartaregexp = callPackage ../development/libraries/java/jakarta-regexp {
-        };
-        javaCup = callPackage ../development/libraries/java/cup {
-        };
-        javasvn = callPackage ../development/libraries/java/javasvn {
-        };
-        jclasslib = callPackage ../development/tools/java/jclasslib {
-        };
-        jdom = callPackage ../development/libraries/java/jdom {
-        };
-        jflex = callPackage ../development/libraries/java/jflex {
-        };
-        jjtraveler = callPackage ../development/libraries/java/jjtraveler {
-          stdenv = overrideInStdenv stdenv [
-            gnumake380
-          ];
-        };
-        junit = callPackage ../development/libraries/java/junit {
-          antBuild = releaseTools.antBuild;
-        };
-        junixsocket = callPackage ../development/libraries/java/junixsocket {
-        };
-        jzmq = callPackage ../development/libraries/java/jzmq {
-        };
-        lucene = callPackage ../development/libraries/java/lucene {
-        };
-        mockobjects = callPackage ../development/libraries/java/mockobjects {
-        };
-        saxon = callPackage ../development/libraries/java/saxon {
-        };
-        saxonb = callPackage ../development/libraries/java/saxon/default8.nix {
-        };
-        sharedobjects = callPackage ../development/libraries/java/shared-objects {
-          stdenv = overrideInStdenv stdenv [
-            gnumake380
-          ];
-        };
-        smack = callPackage ../development/libraries/java/smack {
-        };
-        swt = callPackage ../development/libraries/java/swt {
-          inherit (gnome) libsoup;
-        };
-        jquery_ui = callPackage ../development/libraries/javascript/jquery-ui {
-        };
-        yuicompressor = callPackage ../development/tools/yuicompressor {
-        };
-        asdf = callPackage ../development/lisp-modules/asdf {
-          texLive = null;
-        };
-        clwrapperFunction = callPackage ../development/lisp-modules/clwrapper;
-        wrapLisp = lisp:
-        clwrapperFunction {
-          inherit lisp;
-        };
-        lispPackagesFor = clwrapper:
-        callPackage ../development/lisp-modules/lisp-packages.nix {
-          inherit clwrapper;
-        };
-        lispPackagesClisp = lispPackagesFor (wrapLisp clisp);
-        lispPackagesSBCL = lispPackagesFor (wrapLisp sbcl);
-        lispPackages = recurseIntoAttrs lispPackagesSBCL;
-        buildPerlPackage = import ../development/perl-modules/generic perl;
-        perlPackages = recurseIntoAttrs (import ./perl-packages.nix {
-          inherit pkgs;
-          overrides = (config.perlPackageOverrides or p:
-          { }) pkgs;
-        });
-        perl514Packages = import ./perl-packages.nix {
-          pkgs = pkgs // {
-            perl = perl514;
-            buildPerlPackage = import ../development/perl-modules/generic perl514;
-          };
-          overrides = (config.perl514PackageOverrides or p:
-          { }) pkgs;
-        };
-        perlXMLParser = perlPackages.XMLParser;
-        ack = perlPackages.ack;
-        perlArchiveCpio = perlPackages.ArchiveCpio;
-        perlcritic = perlPackages.PerlCritic;
-        planetary_annihilation = callPackage ../games/planetaryannihilation {
-        };
-        buildPythonPackage = pythonPackages.buildPythonPackage;
-        python26Packages = import ./python-packages.nix {
-          inherit pkgs;
-          python = python26;
-        };
-        python27Packages = lib.hiPrioSet (recurseIntoAttrs (import ./python-packages.nix {
-          inherit pkgs;
-          python = python27;
-        }));
-        python32Packages = import ./python-packages.nix {
-          inherit pkgs;
-          python = python32;
-        };
-        python33Packages = recurseIntoAttrs (import ./python-packages.nix {
-          inherit pkgs;
-          python = python33;
-        });
-        python34Packages = recurseIntoAttrs (import ./python-packages.nix {
-          inherit pkgs;
-          python = python34;
-        });
-        pypyPackages = recurseIntoAttrs (import ./python-packages.nix {
-          inherit pkgs;
-          python = pypy;
-        });
-        foursuite = callPackage ../development/python-modules/4suite {
-        };
-        bsddb3 = callPackage ../development/python-modules/bsddb3 {
-        };
-        ecdsa = callPackage ../development/python-modules/ecdsa {
-        };
-        numeric = callPackage ../development/python-modules/numeric {
-        };
-        pil = pythonPackages.pil;
-        psyco = callPackage ../development/python-modules/psyco {
-        };
-        pycairo = pythonPackages.pycairo;
-        pycapnp = pythonPackages.pycapnp;
-        pycrypto = pythonPackages.pycrypto;
-        pycups = callPackage ../development/python-modules/pycups {
-        };
-        pyexiv2 = callPackage ../development/python-modules/pyexiv2 {
-        };
-        pygame = callPackage ../development/python-modules/pygame {
-        };
-        pygobject = pythonPackages.pygobject;
-        pygobject3 = pythonPackages.pygobject3;
-        pygtk = pythonPackages.pygtk;
-        pyGtkGlade = pythonPackages.pyGtkGlade;
-        pylint = callPackage ../development/python-modules/pylint {
-        };
-        pyopenssl = builderDefsPackage (import ../development/python-modules/pyopenssl) {
-          inherit python openssl;
-        };
-        rhpl = callPackage ../development/python-modules/rhpl {
-        };
-        sip = callPackage ../development/python-modules/sip {
-        };
-        pyqt4 = callPackage ../development/python-modules/pyqt/4.x.nix {
-          stdenv = if stdenv.isDarwin
-            then clangStdenv
-            else stdenv;
-        };
-        pysideApiextractor = callPackage ../development/python-modules/pyside/apiextractor.nix {
-        };
-        pysideGeneratorrunner = callPackage ../development/python-modules/pyside/generatorrunner.nix {
-        };
-        pyside = callPackage ../development/python-modules/pyside {
-        };
-        pysideTools = callPackage ../development/python-modules/pyside/tools.nix {
-        };
-        pysideShiboken = callPackage ../development/python-modules/pyside/shiboken.nix {
-        };
-        pyx = callPackage ../development/python-modules/pyx {
-        };
-        pyxml = callPackage ../development/python-modules/pyxml {
-        };
-        rbtools = callPackage ../development/python-modules/rbtools {
-        };
-        setuptools = pythonPackages.setuptools;
-        slowaes = callPackage ../development/python-modules/slowaes {
-        };
-        wxPython = pythonPackages.wxPython;
-        wxPython28 = pythonPackages.wxPython28;
-        twisted = pythonPackages.twisted;
-        ZopeInterface = pythonPackages.zope_interface;
-        R = callPackage ../applications/science/math/R {
-          inherit (xlibs) libX11 libXt;
-          texLive = texLiveAggregationFun {
-            paths = [
-              texLive
-              texLiveExtra
-            ];
-          };
-          withRecommendedPackages = false;
-        };
-        rWrapper = callPackage ../development/r-modules/wrapper.nix {
-          recommendedPackages = with rPackages; [
-            MASS
-            lattice
-            Matrix
-            nlme
-            survival
-            boot
-            cluster
-            codetools
-            foreign
-            KernSmooth
-            rpart
-            class
-            nnet
-            spatial
-            mgcv
-          ];
-          packages = [ ];
-        };
-        rPackages = import ../development/r-modules/cran-packages.nix {
-          inherit pkgs;
-          overrides = (config.rPackageOverrides or p:
-          { }) pkgs;
-        };
-        rdf4store = callPackage ../servers/http/4store {
-        };
-        apacheHttpd = pkgs.apacheHttpd_2_2;
-        apacheHttpd_2_2 = callPackage ../servers/http/apache-httpd/2.2.nix {
-          sslSupport = true;
-        };
-        apacheHttpd_2_4 = lowPrio (callPackage ../servers/http/apache-httpd/2.4.nix {
-          sslSupport = true;
-        });
-        apcupsd = callPackage ../servers/apcupsd {
-        };
-        sabnzbd = callPackage ../servers/sabnzbd {
-        };
-        bind = callPackage ../servers/dns/bind {
-        };
-        bird = callPackage ../servers/bird {
-        };
-        couchdb = callPackage ../servers/http/couchdb {
-          spidermonkey = spidermonkey_185;
-          python = python27;
-          sphinx = python27Packages.sphinx;
-          erlang = erlangR16;
-        };
-        dico = callPackage ../servers/dico {
-        };
-        dict = callPackage ../servers/dict {
-          libmaa = callPackage ../servers/dict/libmaa.nix {
-          };
-        };
-        dictdDBs = recurseIntoAttrs (import ../servers/dict/dictd-db.nix {
-          inherit builderDefs;
-        });
-        dictDBCollector = import ../servers/dict/dictd-db-collector.nix {
-          inherit stdenv lib dict;
-        };
-        dictdWiktionary = callPackage ../servers/dict/dictd-wiktionary.nix {
-        };
-        dictdWordnet = callPackage ../servers/dict/dictd-wordnet.nix {
-        };
-        diod = callPackage ../servers/diod {
-        };
-        dovecot = dovecot21;
-        dovecot21 = callPackage ../servers/mail/dovecot {
-        };
-        dovecot22 = callPackage ../servers/mail/dovecot/2.2.x.nix {
-        };
-        dovecot_pigeonhole = callPackage ../servers/mail/dovecot-pigeonhole {
-        };
-        etcd = callPackage ../servers/etcd {
-        };
-        ejabberd = callPackage ../servers/xmpp/ejabberd {
-          erlang = erlangR16;
-        };
-        elasticmq = callPackage ../servers/elasticmq {
-        };
-        etcdctl = callPackage ../development/tools/etcdctl {
-        };
-        fcgiwrap = callPackage ../servers/fcgiwrap {
-        };
-        felix = callPackage ../servers/felix {
-        };
-        felix_remoteshell = callPackage ../servers/felix/remoteshell.nix {
-        };
-        fingerd_bsd = callPackage ../servers/fingerd/bsd-fingerd {
-        };
-        firebird = callPackage ../servers/firebird {
-          icu = null;
-        };
-        firebirdSuper = callPackage ../servers/firebird {
-          superServer = true;
-        };
-        fleet = callPackage ../servers/fleet {
-        };
-        freepops = callPackage ../servers/mail/freepops {
-        };
-        freeswitch = callPackage ../servers/sip/freeswitch {
-        };
-        ghostOne = callPackage ../servers/games/ghost-one {
-          boost = boost144.override {
-            taggedLayout = true;
-          };
-        };
-        ircdHybrid = callPackage ../servers/irc/ircd-hybrid {
-        };
-        jboss = callPackage ../servers/http/jboss {
-        };
-        jboss_mysql_jdbc = callPackage ../servers/http/jboss/jdbc/mysql {
-        };
-        jetty = callPackage ../servers/http/jetty {
-        };
-        jetty61 = callPackage ../servers/http/jetty/6.1 {
-        };
-        joseki = callPackage ../servers/http/joseki {
-        };
-        leafnode = callPackage ../servers/news/leafnode {
-        };
-        lighttpd = callPackage ../servers/http/lighttpd {
-        };
-        mailman = callPackage ../servers/mail/mailman {
-        };
-        mediatomb = callPackage ../servers/mediatomb {
-        };
-        memcached = callPackage ../servers/memcached {
-        };
-        mod_dnssd = callPackage ../servers/http/apache-modules/mod_dnssd/default.nix {
-        };
-        mod_evasive = callPackage ../servers/http/apache-modules/mod_evasive {
-        };
-        mod_python = callPackage ../servers/http/apache-modules/mod_python {
-        };
-        mod_fastcgi = callPackage ../servers/http/apache-modules/mod_fastcgi {
-        };
-        mod_wsgi = callPackage ../servers/http/apache-modules/mod_wsgi {
-        };
-        mpd = callPackage ../servers/mpd {
-          aacSupport = config.mpd.aacSupport or true;
-          ffmpegSupport = config.mpd.ffmpegSupport or true;
-        };
-        mpd_clientlib = callPackage ../servers/mpd/clientlib.nix {
-        };
-        miniHttpd = callPackage ../servers/http/mini-httpd {
-        };
-        mlmmj = callPackage ../servers/mail/mlmmj {
-        };
-        myserver = callPackage ../servers/http/myserver {
-        };
-        nginx = callPackage ../servers/http/nginx {
-          rtmp = true;
-          fullWebDAV = true;
-          syslog = true;
-          moreheaders = true;
-        };
-        ngircd = callPackage ../servers/irc/ngircd {
-        };
-        nix-binary-cache = callPackage ../servers/http/nix-binary-cache {
-        };
-        nsd = callPackage ../servers/dns/nsd {
-        };
-        nsq = callPackage ../servers/nsq {
-        };
-        openresty = callPackage ../servers/http/openresty {
-        };
-        opensmtpd = callPackage ../servers/mail/opensmtpd {
-        };
-        petidomo = callPackage ../servers/mail/petidomo {
-        };
-        popa3d = callPackage ../servers/mail/popa3d {
-        };
-        postfix = callPackage ../servers/mail/postfix {
-        };
-        postfix211 = callPackage ../servers/mail/postfix/2.11.nix {
-        };
-        pulseaudio = callPackage ../servers/pulseaudio {
-          gconf = gnome.GConf;
-          bluez = null;
-          avahi = null;
-        };
-        pulseaudioFull = pulseaudio.override {
-          bluez = bluez5;
-          avahi = avahi;
-          jackaudioSupport = true;
-          x11Support = true;
-        };
-        tomcat_connectors = callPackage ../servers/http/apache-modules/tomcat-connectors {
-        };
-        pies = callPackage ../servers/pies {
-        };
-        portmap = callPackage ../servers/portmap {
-        };
-        rpcbind = callPackage ../servers/rpcbind {
-        };
-        mariadb = callPackage ../servers/sql/mariadb {
-        };
-        mongodb = callPackage ../servers/nosql/mongodb {
-        };
-        riak = callPackage ../servers/nosql/riak/1.3.1.nix {
-        };
-        influxdb = callPackage ../servers/nosql/influxdb {
-        };
-        mysql51 = import ../servers/sql/mysql/5.1.x.nix {
-          inherit fetchurl ncurses zlib
-          perl openssl stdenv;
-          ps = procps;
-        };
-        mysql55 = callPackage ../servers/sql/mysql/5.5.x.nix {
-        };
-        mysql = mysql51;
-        mysql_jdbc = callPackage ../servers/sql/mysql/jdbc {
-        };
-        nagios = callPackage ../servers/monitoring/nagios {
-        };
-        munin = callPackage ../servers/monitoring/munin {
-        };
-        nagiosPluginsOfficial = callPackage ../servers/monitoring/nagios/plugins/official-2.x.nix {
-        };
-        neo4j = callPackage ../servers/nosql/neo4j {
-        };
-        net_snmp = callPackage ../servers/monitoring/net-snmp {
-        };
-        riemann = callPackage ../servers/monitoring/riemann {
-        };
-        oidentd = callPackage ../servers/identd/oidentd {
-        };
-        openfire = callPackage ../servers/xmpp/openfire {
-        };
-        oracleXE = callPackage ../servers/sql/oracle-xe {
-        };
-        OVMF = callPackage ../applications/virtualization/OVMF {
-        };
-        postgresql = postgresql92;
-        postgresql84 = callPackage ../servers/sql/postgresql/8.4.x.nix {
-        };
-        postgresql90 = callPackage ../servers/sql/postgresql/9.0.x.nix {
-        };
-        postgresql91 = callPackage ../servers/sql/postgresql/9.1.x.nix {
-        };
-        postgresql92 = callPackage ../servers/sql/postgresql/9.2.x.nix {
-        };
-        postgresql93 = callPackage ../servers/sql/postgresql/9.3.x.nix {
-        };
-        postgresql_jdbc = callPackage ../servers/sql/postgresql/jdbc {
-        };
-        psqlodbc = callPackage ../servers/sql/postgresql/psqlodbc {
-        };
-        pyIRCt = builderDefsPackage (import ../servers/xmpp/pyIRCt) {
-          inherit xmpppy pythonIRClib
-          python makeWrapper;
-        };
-        pyMAILt = builderDefsPackage (import ../servers/xmpp/pyMAILt) {
-          inherit xmpppy python
-          makeWrapper fetchcvs;
-        };
-        qpid-cpp = callPackage ../servers/amqp/qpid-cpp {
-        };
-        rabbitmq_server = callPackage ../servers/amqp/rabbitmq-server {
-        };
-        radius = callPackage ../servers/radius {
-        };
-        redis = callPackage ../servers/nosql/redis {
-        };
-        redstore = callPackage ../servers/http/redstore {
-        };
-        restund = callPackage ../servers/restund {
-        };
-        rethinkdb = callPackage ../servers/nosql/rethinkdb {
-        };
-        rippled = callPackage ../servers/rippled {
-        };
-        s6 = callPackage ../servers/s6 {
-        };
-        spamassassin = callPackage ../servers/mail/spamassassin {
-          inherit (perlPackages) HTMLParser
-          NetDNS NetAddrIP DBFile HTTPDate
-          MailDKIM LWP IOSocketSSL;
-        };
-        samba = callPackage ../servers/samba {
-        };
-        samba_light = lowPrio (callPackage ../servers/samba {
-          pam = null;
-          fam = null;
-          cups = null;
-          acl = null;
-          openldap = null;
-          libunwind = null;
-        });
-        serfdom = callPackage ../servers/serfdom {
-        };
-        seyren = callPackage ../servers/monitoring/seyren {
-        };
-        shishi = callPackage ../servers/shishi {
-        };
-        sipwitch = callPackage ../servers/sip/sipwitch {
-        };
-        spawn_fcgi = callPackage ../servers/http/spawn-fcgi {
-        };
-        squids = recurseIntoAttrs (import ../servers/squid/squids.nix {
-          inherit fetchurl stdenv perl lib
-          composableDerivation openldap
-          pam db cyrus_sasl kerberos
-          libcap expat libxml2 libtool
-          openssl;
-        });
-        squid = squids.squid31;
-        thttpd = callPackage ../servers/http/thttpd {
-        };
-        storm = callPackage ../servers/computing/storm {
-        };
-        tomcat5 = callPackage ../servers/http/tomcat/5.0.nix {
-        };
-        tomcat6 = callPackage ../servers/http/tomcat/6.0.nix {
-        };
-        tomcat_mysql_jdbc = callPackage ../servers/http/tomcat/jdbc/mysql {
-        };
-        axis2 = callPackage ../servers/http/tomcat/axis2 {
-        };
-        unifi = callPackage ../servers/unifi {
-        };
-        virtuoso6 = callPackage ../servers/sql/virtuoso/6.x.nix {
-        };
-        virtuoso7 = callPackage ../servers/sql/virtuoso/7.x.nix {
-        };
-        virtuoso = virtuoso6;
-        vsftpd = callPackage ../servers/ftp/vsftpd {
-        };
-        winstone = callPackage ../servers/http/winstone {
-        };
-        xinetd = callPackage ../servers/xinetd {
-        };
-        xquartz = callPackage ../servers/x11/xquartz {
-        };
-        quartz-wm = callPackage ../servers/x11/quartz-wm {
-          stdenv = clangStdenv;
-        };
-        xorg = recurseIntoAttrs (import ../servers/x11/xorg/default.nix {
-          inherit clangStdenv fetchurl
-          fetchgit fetchpatch stdenv
-          pkgconfig intltool freetype
-          fontconfig libxslt expat libpng
-          zlib perl mesa_drivers
-          spice_protocol dbus libuuid
-          openssl gperf m4 autoconf
-          automake libtool xmlto asciidoc
-          flex bison python mtdev pixman;
-          mesa = mesa_noglu;
-          udev = if stdenv.isLinux
-            then udev
-            else null;
-          libdrm = if stdenv.isLinux
-            then libdrm
-            else null;
-        } // {
-          xf86videointel-testing = callPackage ../servers/x11/xorg/xf86-video-intel-testing.nix {
-          };
-        });
-        xorgReplacements = callPackage ../servers/x11/xorg/replacements.nix {
-        };
-        xorgVideoUnichrome = callPackage ../servers/x11/xorg/unichrome/default.nix {
-        };
-        yaws = callPackage ../servers/http/yaws {
-        };
-        zabbix = recurseIntoAttrs (import ../servers/monitoring/zabbix {
-          inherit fetchurl stdenv
-          pkgconfig postgresql curl
-          openssl zlib;
-        });
-        zabbix20 = callPackage ../servers/monitoring/zabbix/2.0.nix {
-        };
-        zabbix22 = callPackage ../servers/monitoring/zabbix/2.2.nix {
-        };
-        afuse = callPackage ../os-specific/linux/afuse {
-        };
-        amdUcode = callPackage ../os-specific/linux/microcode/amd.nix {
-        };
-        autofs5 = callPackage ../os-specific/linux/autofs/autofs-v5.nix {
-        };
-        _915resolution = callPackage ../os-specific/linux/915resolution {
-        };
-        nfsUtils = callPackage ../os-specific/linux/nfs-utils {
-        };
-        acpi = callPackage ../os-specific/linux/acpi {
-        };
-        acpid = callPackage ../os-specific/linux/acpid {
-        };
-        acpitool = callPackage ../os-specific/linux/acpitool {
-        };
-        alienfx = callPackage ../os-specific/linux/alienfx {
-        };
-        alsaLib = callPackage ../os-specific/linux/alsa-lib {
-        };
-        alsaPlugins = callPackage ../os-specific/linux/alsa-plugins {
-          jack2 = null;
-        };
-        alsaPluginWrapper = callPackage ../os-specific/linux/alsa-plugins/wrapper.nix {
-        };
-        alsaUtils = callPackage ../os-specific/linux/alsa-utils {
-        };
-        alsaOss = callPackage ../os-specific/linux/alsa-oss {
-        };
-        microcode2ucode = callPackage ../os-specific/linux/microcode/converter.nix {
-        };
-        microcodeIntel = callPackage ../os-specific/linux/microcode/intel.nix {
-        };
-        apparmor = callPackage ../os-specific/linux/apparmor {
-          inherit (perlPackages) LocaleGettext
-          TermReadKey RpcXML;
-          bison = bison2;
-        };
-        atop = callPackage ../os-specific/linux/atop {
-        };
-        audit = callPackage ../os-specific/linux/audit {
-        };
-        b43Firmware_5_1_138 = callPackage ../os-specific/linux/firmware/b43-firmware/5.1.138.nix {
-        };
-        b43FirmwareCutter = callPackage ../os-specific/linux/firmware/b43-firmware-cutter {
-        };
-        batctl = callPackage ../os-specific/linux/batman-adv/batctl.nix {
-        };
-        bluez4 = callPackage ../os-specific/linux/bluez {
-          pygobject = pygobject3;
-        };
-        bluez5 = lowPrio (callPackage ../os-specific/linux/bluez/bluez5.nix {
-        });
-        bluez = bluez4;
-        inherit (pythonPackages) bedup;
-        beret = callPackage ../games/beret {
-        };
-        bridge_utils = callPackage ../os-specific/linux/bridge-utils {
-        };
-        busybox = callPackage ../os-specific/linux/busybox {
-        };
-        checkpolicy = callPackage ../os-specific/linux/checkpolicy {
-        };
-        checksec = callPackage ../os-specific/linux/checksec {
-        };
-        cifs_utils = callPackage ../os-specific/linux/cifs-utils {
-        };
-        conky = callPackage ../os-specific/linux/conky {
-          mpdSupport = config.conky.mpdSupport or true;
-          x11Support = config.conky.x11Support or false;
-          xdamage = config.conky.xdamage or false;
-          wireless = config.conky.wireless or false;
-          luaSupport = config.conky.luaSupport or false;
-          rss = config.conky.rss or false;
-          weatherMetar = config.conky.weatherMetar or false;
-          weatherXoap = config.conky.weatherXoap or false;
-        };
-        cpufrequtils = callPackage ../os-specific/linux/cpufrequtils {
-        };
-        cryopid = callPackage ../os-specific/linux/cryopid {
-        };
-        criu = callPackage ../os-specific/linux/criu {
-        };
-        cryptsetup = callPackage ../os-specific/linux/cryptsetup {
-        };
-        cramfsswap = callPackage ../os-specific/linux/cramfsswap {
-        };
-        darwin = rec {
-          cctools = forceNativeDrv (callPackage ../os-specific/darwin/cctools-port {
-            cross = assert crossSystem != null; crossSystem;
-            inherit maloader;
-            xctoolchain = xcode.toolchain;
-          });
-          maloader = callPackage ../os-specific/darwin/maloader {
-            inherit opencflite;
-          };
-          opencflite = callPackage ../os-specific/darwin/opencflite {
-          };
-          xcode = callPackage ../os-specific/darwin/xcode {
-          };
-        };
-        devicemapper = lvm2;
-        disk_indicator = callPackage ../os-specific/linux/disk-indicator {
-        };
-        dmidecode = callPackage ../os-specific/linux/dmidecode {
-        };
-        dmtcp = callPackage ../os-specific/linux/dmtcp {
-        };
-        dietlibc = callPackage ../os-specific/linux/dietlibc {
-        };
-        directvnc = builderDefsPackage ../os-specific/linux/directvnc {
-          inherit libjpeg pkgconfig zlib
-          directfb;
-          inherit (xlibs) xproto;
-        };
-        dmraid = callPackage ../os-specific/linux/dmraid {
-        };
-        drbd = callPackage ../os-specific/linux/drbd {
-        };
-        dstat = callPackage ../os-specific/linux/dstat {
-          python = pythonFull;
-        };
-        libossp_uuid = callPackage ../development/libraries/libossp-uuid {
-        };
-        libuuid = if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-          then utillinux // {
-            crossDrv = lib.overrideDerivation utillinux.crossDrv (args:
-            {
-              configureFlags = args.configureFlags + " --disable-libblkid --disable-mount --disable-libmount" + " --disable-fsck --enable-static --disable-partx";
-              doCheck = false;
-              CPPFLAGS = lib.concatStringsSep " " (map (v:
-              "-D${v}=4096") [
-                "PATH_MAX"
-                "MAXPATHLEN"
-                "MAXHOSTNAMELEN"
-              ]);
-            });
-          }
-          else if stdenv.isLinux
-            then utillinux
-            else null;
-        e3cfsprogs = callPackage ../os-specific/linux/e3cfsprogs {
-        };
-        ebtables = callPackage ../os-specific/linux/ebtables {
-        };
-        eject = utillinux;
-        ffado = callPackage ../os-specific/linux/ffado {
-        };
-        fbterm = callPackage ../os-specific/linux/fbterm {
-        };
-        firejail = callPackage ../os-specific/linux/firejail {
-        };
-        fuse = callPackage ../os-specific/linux/fuse {
-        };
-        fxload = callPackage ../os-specific/linux/fxload {
-        };
-        gfxtablet = callPackage ../os-specific/linux/gfxtablet {
-        };
-        gpm = callPackage ../servers/gpm {
-        };
-        gradm = callPackage ../os-specific/linux/gradm {
-          flex = flex_2_5_35;
-        };
-        hdparm = callPackage ../os-specific/linux/hdparm {
-        };
-        hibernate = callPackage ../os-specific/linux/hibernate {
-        };
-        hostapd = callPackage ../os-specific/linux/hostapd {
-        };
-        htop = if stdenv.isLinux
-          then callPackage ../os-specific/linux/htop {
-          }
-          else if stdenv.isDarwin
-            then callPackage ../os-specific/darwin/htop {
-            }
-            else null;
-        gnu = recurseIntoAttrs (callPackage ../os-specific/gnu {
-          inherit platform crossSystem;
-        });
-        hwdata = callPackage ../os-specific/linux/hwdata {
-        };
-        i7z = callPackage ../os-specific/linux/i7z {
-        };
-        ifplugd = callPackage ../os-specific/linux/ifplugd {
-        };
-        iomelt = callPackage ../os-specific/linux/iomelt {
-        };
-        iotop = callPackage ../os-specific/linux/iotop {
-        };
-        iproute = callPackage ../os-specific/linux/iproute {
-        };
-        iputils = callPackage ../os-specific/linux/iputils {
-          sp = spCompat;
-          inherit (perlPackages) SGMLSpm;
-        };
-        iptables = callPackage ../os-specific/linux/iptables {
-        };
-        iw = callPackage ../os-specific/linux/iw {
-        };
-        jujuutils = callPackage ../os-specific/linux/jujuutils {
-        };
-        kbd = callPackage ../os-specific/linux/kbd {
-        };
-        kmscon = callPackage ../os-specific/linux/kmscon {
-        };
-        latencytop = callPackage ../os-specific/linux/latencytop {
-        };
-        ldm = callPackage ../os-specific/linux/ldm {
-        };
-        libaio = callPackage ../os-specific/linux/libaio {
-        };
-        libatasmart = callPackage ../os-specific/linux/libatasmart {
-        };
-        libcgroup = callPackage ../os-specific/linux/libcgroup {
-        };
-        libnl = callPackage ../os-specific/linux/libnl {
-        };
-        libnl_3_2_19 = callPackage ../os-specific/linux/libnl/3.2.19.nix {
-        };
-        linuxConsoleTools = callPackage ../os-specific/linux/consoletools {
-        };
-        linuxHeaders = linuxHeaders_3_7;
-        linuxHeaders24Cross = forceNativeDrv (import ../os-specific/linux/kernel-headers/2.4.nix {
-          inherit stdenv fetchurl perl;
-          cross = assert crossSystem != null; crossSystem;
-        });
-        linuxHeaders26Cross = forceNativeDrv (import ../os-specific/linux/kernel-headers/2.6.32.nix {
-          inherit stdenv fetchurl perl;
-          cross = assert crossSystem != null; crossSystem;
-        });
-        linuxHeaders_3_7 = callPackage ../os-specific/linux/kernel-headers/3.7.nix {
-        };
-        linuxHeaders_3_14 = callPackage ../os-specific/linux/kernel-headers/3.14.nix {
-        };
-        linuxHeadersCrossChooser = ver:
-        if ver == "2.4"
-          then linuxHeaders24Cross
-          else if ver == "2.6"
-            then linuxHeaders26Cross
-            else throw "Unknown linux kernel version";
-        linuxHeadersCross = assert crossSystem != null; linuxHeadersCrossChooser crossSystem.platform.kernelMajor;
-        kernelPatches = callPackage ../os-specific/linux/kernel/patches.nix {
-        };
-        linux_3_2 = makeOverridable (import ../os-specific/linux/kernel/linux-3.2.nix) {
-          inherit fetchurl stdenv perl
-          buildLinux;
-          kernelPatches = [ ];
-        };
-        linux_3_2_xen = lowPrio (linux_3_2.override {
-          extraConfig = ''XEN_DOM0 y'';
-        });
-        linux_3_4 = makeOverridable (import ../os-specific/linux/kernel/linux-3.4.nix) {
-          inherit fetchurl stdenv perl
-          buildLinux;
-          kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips") [
-            kernelPatches.mips_fpureg_emu
-            kernelPatches.mips_fpu_sigill
-          ];
-        };
-        linux_3_6_rpi = makeOverridable (import ../os-specific/linux/kernel/linux-rpi-3.6.nix) {
-          inherit fetchurl stdenv perl
-          buildLinux;
-        };
-        linux_3_10 = makeOverridable (import ../os-specific/linux/kernel/linux-3.10.nix) {
-          inherit fetchurl stdenv perl
-          buildLinux;
-          kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips") [
-            kernelPatches.mips_fpureg_emu
-            kernelPatches.mips_fpu_sigill
-            kernelPatches.mips_ext3_n32
-          ];
-        };
-        linux_3_12 = makeOverridable (import ../os-specific/linux/kernel/linux-3.12.nix) {
-          inherit fetchurl stdenv perl
-          buildLinux;
-          kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips") [
-            kernelPatches.mips_fpureg_emu
-            kernelPatches.mips_fpu_sigill
-            kernelPatches.mips_ext3_n32
-          ];
-        };
-        linux_3_14 = makeOverridable (import ../os-specific/linux/kernel/linux-3.14.nix) {
-          inherit fetchurl stdenv perl
-          buildLinux;
-          kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips") [
-            kernelPatches.mips_fpureg_emu
-            kernelPatches.mips_fpu_sigill
-            kernelPatches.mips_ext3_n32
-          ];
-        };
-        linux_3_15 = makeOverridable (import ../os-specific/linux/kernel/linux-3.15.nix) {
-          inherit fetchurl stdenv perl
-          buildLinux;
-          kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips") [
-            kernelPatches.mips_fpureg_emu
-            kernelPatches.mips_fpu_sigill
-            kernelPatches.mips_ext3_n32
-          ];
-        };
-        linux_3_16 = makeOverridable (import ../os-specific/linux/kernel/linux-3.16.nix) {
-          inherit fetchurl stdenv perl
-          buildLinux;
-          kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips") [
-            kernelPatches.mips_fpureg_emu
-            kernelPatches.mips_fpu_sigill
-            kernelPatches.mips_ext3_n32
-          ];
-        };
-        linux_testing = makeOverridable (import ../os-specific/linux/kernel/linux-testing.nix) {
-          inherit fetchurl stdenv perl
-          buildLinux;
-          kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips") [
-            kernelPatches.mips_fpureg_emu
-            kernelPatches.mips_fpu_sigill
-            kernelPatches.mips_ext3_n32
-          ];
-        };
-        grFlavors = import ../build-support/grsecurity/flavors.nix;
-        mkGrsecurity = opts:
-        import ../build-support/grsecurity {
-          grsecOptions = opts;
-          inherit pkgs lib;
-        };
-        grKernel = opts:
-        (mkGrsecurity opts).grsecKernel;
-        grPackage = opts:
-        recurseIntoAttrs (mkGrsecurity opts).grsecPackage;
-        linux_grsec_stable_desktop = grKernel grFlavors.linux_grsec_stable_desktop;
-        linux_grsec_stable_server = grKernel grFlavors.linux_grsec_stable_server;
-        linux_grsec_stable_server_xen = grKernel grFlavors.linux_grsec_stable_server_xen;
-        linux_grsec_testing_desktop = grKernel grFlavors.linux_grsec_testing_desktop;
-        linux_grsec_testing_server = grKernel grFlavors.linux_grsec_testing_server;
-        linux_grsec_testing_server_xen = grKernel grFlavors.linux_grsec_testing_server_xen;
-        linuxPackagesFor = kernel: self:
-        let
-          callPackage = newScope self;
-          in {
-            inherit kernel;
-            acpi_call = callPackage ../os-specific/linux/acpi-call {
-            };
-            batman_adv = callPackage ../os-specific/linux/batman-adv {
-            };
-            bbswitch = callPackage ../os-specific/linux/bbswitch {
-            };
-            ati_drivers_x11 = callPackage ../os-specific/linux/ati-drivers {
-            };
-            blcr = callPackage ../os-specific/linux/blcr {
-            };
-            cryptodev = callPackage ../os-specific/linux/cryptodev {
-            };
-            cpupower = callPackage ../os-specific/linux/cpupower {
-            };
-            e1000e = callPackage ../os-specific/linux/e1000e {
-            };
-            v4l2loopback = callPackage ../os-specific/linux/v4l2loopback {
-            };
-            frandom = callPackage ../os-specific/linux/frandom {
-            };
-            ktap = callPackage ../os-specific/linux/ktap {
-            };
-            lttng-modules = callPackage ../os-specific/linux/lttng-modules {
-            };
-            broadcom_sta = callPackage ../os-specific/linux/broadcom-sta/default.nix {
-            };
-            nvidiabl = callPackage ../os-specific/linux/nvidiabl {
-            };
-            nvidia_x11 = callPackage ../os-specific/linux/nvidia-x11 {
-            };
-            nvidia_x11_legacy173 = callPackage ../os-specific/linux/nvidia-x11/legacy173.nix {
-            };
-            nvidia_x11_legacy304 = callPackage ../os-specific/linux/nvidia-x11/legacy304.nix {
-            };
-            openafsClient = callPackage ../servers/openafs-client {
-            };
-            openiscsi = callPackage ../os-specific/linux/open-iscsi {
-            };
-            wis_go7007 = callPackage ../os-specific/linux/wis-go7007 {
-            };
-            kernelHeaders = callPackage ../os-specific/linux/kernel-headers {
-            };
-            klibc = callPackage ../os-specific/linux/klibc {
-            };
-            klibcShrunk = lowPrio (callPackage ../os-specific/linux/klibc/shrunk.nix {
-            });
-            ndiswrapper = callPackage ../os-specific/linux/ndiswrapper {
-            };
-            netatop = callPackage ../os-specific/linux/netatop {
-            };
-            perf = callPackage ../os-specific/linux/kernel/perf.nix {
-            };
-            psmouse_alps = callPackage ../os-specific/linux/psmouse-alps {
-            };
-            spl = callPackage ../os-specific/linux/spl {
-            };
-            spl_git = callPackage ../os-specific/linux/spl/git.nix {
-            };
-            sysdig = callPackage ../os-specific/linux/sysdig {
-            };
-            tp_smapi = callPackage ../os-specific/linux/tp_smapi {
-            };
-            v86d = callPackage ../os-specific/linux/v86d {
-            };
-            virtualbox = callPackage ../applications/virtualization/virtualbox {
-              stdenv = stdenv_32bit;
-              inherit (gnome) libIDL;
-              enableExtensionPack = config.virtualbox.enableExtensionPack or false;
-            };
-            virtualboxGuestAdditions = callPackage ../applications/virtualization/virtualbox/guest-additions {
-            };
-            zfs = callPackage ../os-specific/linux/zfs {
-            };
-            zfs_git = callPackage ../os-specific/linux/zfs/git.nix {
-            };
-          };
-        linux = linuxPackages.kernel;
-        linuxPackages = linuxPackages_3_12;
-        linux_latest = pkgs.linux_3_16;
-        linuxPackages_latest = pkgs.linuxPackages_3_16;
-        linuxPackages_3_2 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_2 linuxPackages_3_2);
-        linuxPackages_3_2_xen = linuxPackagesFor pkgs.linux_3_2_xen linuxPackages_3_2_xen;
-        linuxPackages_3_4 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_4 linuxPackages_3_4);
-        linuxPackages_3_6_rpi = linuxPackagesFor pkgs.linux_3_6_rpi linuxPackages_3_6_rpi;
-        linuxPackages_3_10 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_10 linuxPackages_3_10);
-        linuxPackages_3_10_tuxonice = linuxPackagesFor pkgs.linux_3_10_tuxonice linuxPackages_3_10_tuxonice;
-        linuxPackages_3_12 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_12 linuxPackages_3_12);
-        linuxPackages_3_14 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_14 linuxPackages_3_14);
-        linuxPackages_3_15 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_15 linuxPackages_3_15);
-        linuxPackages_3_16 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_16 linuxPackages_3_16);
-        linuxPackages_testing = recurseIntoAttrs (linuxPackagesFor pkgs.linux_testing linuxPackages_testing);
-        linuxPackages_grsec_stable_desktop = grPackage grFlavors.linux_grsec_stable_desktop;
-        linuxPackages_grsec_stable_server = grPackage grFlavors.linux_grsec_stable_server;
-        linuxPackages_grsec_stable_server_xen = grPackage grFlavors.linux_grsec_stable_server_xen;
-        linuxPackages_grsec_testing_desktop = grPackage grFlavors.linux_grsec_testing_desktop;
-        linuxPackages_grsec_testing_server = grPackage grFlavors.linux_grsec_testing_server;
-        linuxPackages_grsec_testing_server_xen = grPackage grFlavors.linux_grsec_testing_server_xen;
-        linuxManualConfig = pkgs.buildLinux;
-        buildLinux = import ../os-specific/linux/kernel/manual-config.nix {
-          inherit (pkgs) stdenv runCommand
-          nettools bc perl kmod
-          writeTextFile ubootChooser;
-        };
-        keyutils = callPackage ../os-specific/linux/keyutils {
-        };
-        libselinux = callPackage ../os-specific/linux/libselinux {
-        };
-        libsemanage = callPackage ../os-specific/linux/libsemanage {
-        };
-        libraw = callPackage ../development/libraries/libraw {
-        };
-        libraw1394 = callPackage ../development/libraries/libraw1394 {
-        };
-        libsexy = callPackage ../development/libraries/libsexy {
-        };
-        libsepol = callPackage ../os-specific/linux/libsepol {
-        };
-        libsmbios = callPackage ../os-specific/linux/libsmbios {
-        };
-        lm_sensors = callPackage ../os-specific/linux/lm-sensors {
-        };
-        lockdep = callPackage ../os-specific/linux/lockdep {
-        };
-        lsiutil = callPackage ../os-specific/linux/lsiutil {
-        };
-        kmod = callPackage ../os-specific/linux/kmod {
-        };
-        kmod-blacklist-ubuntu = callPackage ../os-specific/linux/kmod-blacklist-ubuntu {
-        };
-        kvm = qemu_kvm;
-        libcap = callPackage ../os-specific/linux/libcap {
-        };
-        libcap_progs = callPackage ../os-specific/linux/libcap/progs.nix {
-        };
-        libcap_pam = callPackage ../os-specific/linux/libcap/pam.nix {
-        };
-        libcap_manpages = callPackage ../os-specific/linux/libcap/man.nix {
-        };
-        libcap_ng = callPackage ../os-specific/linux/libcap-ng {
-        };
-        libnscd = callPackage ../os-specific/linux/libnscd {
-        };
-        libnotify = callPackage ../development/libraries/libnotify {
-        };
-        libvolume_id = callPackage ../os-specific/linux/libvolume_id {
-        };
-        lsscsi = callPackage ../os-specific/linux/lsscsi {
-        };
-        lvm2 = callPackage ../os-specific/linux/lvm2 {
-        };
-        mdadm = callPackage ../os-specific/linux/mdadm {
-        };
-        mingetty = callPackage ../os-specific/linux/mingetty {
-        };
-        module_init_tools = callPackage ../os-specific/linux/module-init-tools {
-        };
-        aggregateModules = modules:
-        callPackage ../os-specific/linux/kmod/aggregator.nix {
-          inherit modules;
-        };
-        multipath_tools = callPackage ../os-specific/linux/multipath-tools {
-        };
-        musl = callPackage ../os-specific/linux/musl {
-        };
-        nettools = callPackage ../os-specific/linux/net-tools {
-        };
-        neverball = callPackage ../games/neverball {
-          libpng = libpng15;
-        };
-        nftables = callPackage ../os-specific/linux/nftables {
-        };
-        numactl = callPackage ../os-specific/linux/numactl {
-        };
-        gocode = callPackage ../development/tools/gocode {
-        };
-        gogoclient = callPackage ../os-specific/linux/gogoclient {
-        };
-        nss_ldap = callPackage ../os-specific/linux/nss_ldap {
-        };
-        pam = callPackage ../os-specific/linux/pam {
-        };
-        pam_ccreds = callPackage ../os-specific/linux/pam_ccreds {
-        };
-        pam_console = callPackage ../os-specific/linux/pam_console {
-          libtool = libtool_1_5;
-        };
-        pam_devperm = callPackage ../os-specific/linux/pam_devperm {
-        };
-        pam_krb5 = callPackage ../os-specific/linux/pam_krb5 {
-        };
-        pam_ldap = callPackage ../os-specific/linux/pam_ldap {
-        };
-        pam_login = callPackage ../os-specific/linux/pam_login {
-        };
-        pam_ssh_agent_auth = callPackage ../os-specific/linux/pam_ssh_agent_auth {
-        };
-        pam_usb = callPackage ../os-specific/linux/pam_usb {
-        };
-        paxctl = callPackage ../os-specific/linux/paxctl {
-        };
-        pax-utils = callPackage ../os-specific/linux/pax-utils {
-        };
-        pcmciaUtils = callPackage ../os-specific/linux/pcmciautils {
-          firmware = config.pcmciaUtils.firmware or [
-          ];
-          config = config.pcmciaUtils.config or null;
-        };
-        plymouth = callPackage ../os-specific/linux/plymouth {
-          automake = automake113x;
-        };
-        pmount = callPackage ../os-specific/linux/pmount {
-        };
-        pmutils = callPackage ../os-specific/linux/pm-utils {
-        };
-        pmtools = callPackage ../os-specific/linux/pmtools {
-        };
-        policycoreutils = callPackage ../os-specific/linux/policycoreutils {
-        };
-        powertop = callPackage ../os-specific/linux/powertop {
-        };
-        prayer = callPackage ../servers/prayer {
-        };
-        procps = procps-ng;
-        procps-old = lowPrio (callPackage ../os-specific/linux/procps {
-        });
-        procps-ng = callPackage ../os-specific/linux/procps-ng {
-        };
-        watch = callPackage ../os-specific/linux/procps/watch.nix {
-        };
-        qemu_kvm = lowPrio (qemu.override {
-          x86Only = true;
-        });
-        firmwareLinuxNonfree = callPackage ../os-specific/linux/firmware/firmware-linux-nonfree {
-        };
-        radeontools = callPackage ../os-specific/linux/radeontools {
-        };
-        raspberrypifw = callPackage ../os-specific/linux/firmware/raspberrypi {
-        };
-        regionset = callPackage ../os-specific/linux/regionset {
-        };
-        rfkill = callPackage ../os-specific/linux/rfkill {
-        };
-        rfkill_udev = callPackage ../os-specific/linux/rfkill/udev.nix {
-        };
-        rtkit = callPackage ../os-specific/linux/rtkit {
-        };
-        sdparm = callPackage ../os-specific/linux/sdparm {
-        };
-        sepolgen = callPackage ../os-specific/linux/sepolgen {
-        };
-        setools = callPackage ../os-specific/linux/setools {
-        };
-        shadow = callPackage ../os-specific/linux/shadow {
-        };
-        statifier = builderDefsPackage (import ../os-specific/linux/statifier) {
-        };
-        sysdig = callPackage ../os-specific/linux/sysdig {
-          kernel = null;
-        };
-        sysfsutils = callPackage ../os-specific/linux/sysfsutils {
-        };
-        sysprof = callPackage ../development/tools/profiling/sysprof {
-          inherit (gnome) libglade;
-        };
-        libsysfs = sysfsutils;
-        systool = sysfsutils;
-        sysklogd = callPackage ../os-specific/linux/sysklogd {
-        };
-        syslinux = callPackage ../os-specific/linux/syslinux {
-        };
-        sysstat = callPackage ../os-specific/linux/sysstat {
-        };
-        systemd = callPackage ../os-specific/linux/systemd {
-          linuxHeaders = linuxHeaders_3_14;
-        };
-        systemtap = callPackage ../development/tools/profiling/systemtap {
-          inherit (gnome) libglademm;
-        };
-        systemd_with_lvm2 = pkgs.lib.overrideDerivation pkgs.systemd (p:
-        {
-          name = p.name + "-with-lvm2";
-          postInstall = p.postInstall + ''
-            cp "${pkgs.lvm2}/lib/systemd/system-generators/"* ''$out/lib/systemd/system-generators
-          '';
-        });
-        sysvinit = callPackage ../os-specific/linux/sysvinit {
-        };
-        sysvtools = callPackage ../os-specific/linux/sysvinit {
-          withoutInitTools = true;
-        };
-        tcp_wrappers = callPackage ../os-specific/linux/tcp-wrappers {
-        };
-        trackballs = callPackage ../games/trackballs {
-          debug = false;
-          guile = guile_1_8;
-        };
-        tunctl = callPackage ../os-specific/linux/tunctl {
-        };
-        ubootChooser = name:
-        if name == "upstream"
-          then ubootUpstream
-          else if name == "sheevaplug"
-            then ubootSheevaplug
-            else if name == "guruplug"
-              then ubootGuruplug
-              else if name == "nanonote"
-                then ubootNanonote
-                else throw "Unknown uboot";
-        ubootUpstream = callPackage ../misc/uboot {
-        };
-        ubootSheevaplug = callPackage ../misc/uboot/sheevaplug.nix {
-        };
-        ubootNanonote = callPackage ../misc/uboot/nanonote.nix {
-        };
-        ubootGuruplug = callPackage ../misc/uboot/guruplug.nix {
-        };
-        uclibc = callPackage ../os-specific/linux/uclibc {
-        };
-        uclibcCross = lowPrio (callPackage ../os-specific/linux/uclibc {
-          inherit fetchurl stdenv
-          libiconv;
-          linuxHeaders = linuxHeadersCross;
-          gccCross = gccCrossStageStatic;
-          cross = assert crossSystem != null; crossSystem;
-        });
-        udev145 = callPackage ../os-specific/linux/udev/145.nix {
-        };
-        udev = pkgs.systemd;
-        udisks1 = callPackage ../os-specific/linux/udisks/1-default.nix {
-        };
-        udisks2 = callPackage ../os-specific/linux/udisks/2-default.nix {
-        };
-        udisks = udisks1;
-        udisks_glue = callPackage ../os-specific/linux/udisks-glue {
-        };
-        untie = callPackage ../os-specific/linux/untie {
-        };
-        upower = callPackage ../os-specific/linux/upower {
-        };
-        upower_99 = callPackage ../os-specific/linux/upower/0.99.nix {
-        };
-        upstart = callPackage ../os-specific/linux/upstart {
-        };
-        usbutils = callPackage ../os-specific/linux/usbutils {
-        };
-        usermount = callPackage ../os-specific/linux/usermount {
-        };
-        utillinux = lowPrio (callPackage ../os-specific/linux/util-linux {
-          ncurses = null;
-          perl = null;
-        });
-        utillinuxCurses = utillinux.override {
-          inherit ncurses perl;
-        };
-        v4l_utils = callPackage ../os-specific/linux/v4l-utils {
-          withQt4 = true;
-        };
-        windows = rec {
-          cygwinSetup = callPackage ../os-specific/windows/cygwin-setup {
-          };
-          jom = callPackage ../os-specific/windows/jom {
-          };
-          w32api = callPackage ../os-specific/windows/w32api {
-            gccCross = gccCrossStageStatic;
-            binutilsCross = binutilsCross;
-          };
-          w32api_headers = w32api.override {
-            onlyHeaders = true;
-          };
-          mingw_runtime = callPackage ../os-specific/windows/mingwrt {
-            gccCross = gccCrossMingw2;
-            binutilsCross = binutilsCross;
-          };
-          mingw_runtime_headers = mingw_runtime.override {
-            onlyHeaders = true;
-          };
-          mingw_headers1 = buildEnv {
-            name = "mingw-headers-1";
-            paths = [
-              w32api_headers
-              mingw_runtime_headers
-            ];
-          };
-          mingw_headers2 = buildEnv {
-            name = "mingw-headers-2";
-            paths = [
-              w32api
-              mingw_runtime_headers
-            ];
-          };
-          mingw_headers3 = buildEnv {
-            name = "mingw-headers-3";
-            paths = [
-              w32api
-              mingw_runtime
-            ];
-          };
-          mingw_w64 = callPackage ../os-specific/windows/mingw-w64 {
-            gccCross = gccCrossStageStatic;
-            binutilsCross = binutilsCross;
-          };
-          mingw_w64_headers = callPackage ../os-specific/windows/mingw-w64 {
-            onlyHeaders = true;
-          };
-          mingw_w64_pthreads = callPackage ../os-specific/windows/mingw-w64 {
-            onlyPthreads = true;
-          };
-          pthreads = callPackage ../os-specific/windows/pthread-w32 {
-            mingw_headers = mingw_headers3;
-          };
-          wxMSW = callPackage ../os-specific/windows/wxMSW-2.8 {
-          };
-        };
-        wesnoth = callPackage ../games/wesnoth {
-          lua = lua5;
-        };
-        wirelesstools = callPackage ../os-specific/linux/wireless-tools {
-        };
-        wpa_supplicant = callPackage ../os-specific/linux/wpa_supplicant {
-        };
-        wpa_supplicant_gui = callPackage ../os-specific/linux/wpa_supplicant/gui.nix {
-        };
-        xf86_input_mtrack = callPackage ../os-specific/linux/xf86-input-mtrack {
-          inherit (xorg) utilmacros xproto
-          inputproto xorgserver;
-        };
-        xf86_input_multitouch = callPackage ../os-specific/linux/xf86-input-multitouch {
-        };
-        xf86_input_wacom = callPackage ../os-specific/linux/xf86-input-wacom {
-        };
-        xf86_video_nested = callPackage ../os-specific/linux/xf86-video-nested {
-          inherit (xorg) fontsproto
-          renderproto utilmacros
-          xorgserver;
-        };
-        xf86_video_nouveau = xorg.xf86videonouveau;
-        xmoto = builderDefsPackage (import ../games/xmoto) {
-          inherit chipmunk sqlite curl
-          zlib bzip2 libjpeg libpng
-          freeglut mesa SDL SDL_mixer
-          SDL_image SDL_net SDL_ttf lua5
-          ode libxdg_basedir libxml2;
-        };
-        xorg_sys_opengl = callPackage ../os-specific/linux/opengl/xorg-sys {
-        };
-        zd1211fw = callPackage ../os-specific/linux/firmware/zd1211 {
-        };
-        andagii = callPackage ../data/fonts/andagii {
-        };
-        anonymousPro = callPackage ../data/fonts/anonymous-pro {
-        };
-        arkpandora_ttf = builderDefsPackage (import ../data/fonts/arkpandora) {
-        };
-        aurulent-sans = callPackage ../data/fonts/aurulent-sans {
-        };
-        bakoma_ttf = callPackage ../data/fonts/bakoma-ttf {
-        };
-        cacert = callPackage ../data/misc/cacert {
-        };
-        cantarell_fonts = callPackage ../data/fonts/cantarell-fonts {
-        };
-        corefonts = callPackage ../data/fonts/corefonts {
-        };
-        wrapFonts = paths:
-        import ../data/fonts/fontWrap {
-          inherit fetchurl stdenv
-          builderDefs paths;
-          inherit (xorg) mkfontdir
-          mkfontscale;
-        };
-        clearlyU = callPackage ../data/fonts/clearlyU {
-        };
-        cm_unicode = callPackage ../data/fonts/cm-unicode {
-        };
-        dejavu_fonts = callPackage ../data/fonts/dejavu-fonts {
-          inherit (perlPackages) FontTTF;
-        };
-        docbook5 = callPackage ../data/sgml+xml/schemas/docbook-5.0 {
-        };
-        docbook_sgml_dtd_31 = callPackage ../data/sgml+xml/schemas/sgml-dtd/docbook/3.1.nix {
-        };
-        docbook_sgml_dtd_41 = callPackage ../data/sgml+xml/schemas/sgml-dtd/docbook/4.1.nix {
-        };
-        docbook_xml_dtd_412 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.1.2.nix {
-        };
-        docbook_xml_dtd_42 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.2.nix {
-        };
-        docbook_xml_dtd_43 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.3.nix {
-        };
-        docbook_xml_dtd_45 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.5.nix {
-        };
-        docbook_xml_ebnf_dtd = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook-ebnf {
-        };
-        docbook_xml_xslt = docbook_xsl;
-        docbook_xsl = callPackage ../data/sgml+xml/stylesheets/xslt/docbook-xsl {
-        };
-        docbook5_xsl = docbook_xsl_ns;
-        docbook_xsl_ns = callPackage ../data/sgml+xml/stylesheets/xslt/docbook-xsl-ns {
-        };
-        dosemu_fonts = callPackage ../data/fonts/dosemu-fonts {
-        };
-        eb-garamond = callPackage ../data/fonts/eb-garamond {
-        };
-        fira = callPackage ../data/fonts/fira {
-        };
-        freefont_ttf = callPackage ../data/fonts/freefont-ttf {
-        };
-        freepats = callPackage ../data/misc/freepats {
-        };
-        gentium = callPackage ../data/fonts/gentium {
-        };
-        gnome_user_docs = callPackage ../data/documentation/gnome-user-docs {
-        };
-        inherit (gnome3) gsettings_desktop_schemas;
-        hicolor_icon_theme = callPackage ../data/icons/hicolor-icon-theme {
-        };
-        inconsolata = callPackage ../data/fonts/inconsolata {
-        };
-        ipafont = callPackage ../data/fonts/ipafont {
-        };
-        junicode = callPackage ../data/fonts/junicode {
-        };
-        kochi-substitute = callPackage ../data/fonts/kochi-substitute {
-        };
-        kochi-substitute-naga10 = callPackage ../data/fonts/kochi-substitute-naga10 {
-        };
-        liberation_ttf = callPackage ../data/fonts/redhat-liberation-fonts {
-        };
-        libertine = builderDefsPackage (import ../data/fonts/libertine) {
-          inherit fetchurl fontforge lib;
-        };
-        lmmath = callPackage ../data/fonts/lmodern/lmmath.nix {
-        };
-        lmodern = callPackage ../data/fonts/lmodern {
-        };
-        lohit-fonts = callPackage ../data/fonts/lohit-fonts {
-        };
-        manpages = callPackage ../data/documentation/man-pages {
-        };
-        miscfiles = callPackage ../data/misc/miscfiles {
-        };
-        mobile_broadband_provider_info = callPackage ../data/misc/mobile-broadband-provider-info {
-        };
-        mph_2b_damase = callPackage ../data/fonts/mph-2b-damase {
-        };
-        nafees = callPackage ../data/fonts/nafees {
-        };
-        oldstandard = callPackage ../data/fonts/oldstandard {
-        };
-        opensans-ttf = callPackage ../data/fonts/opensans-ttf {
-        };
-        poly = callPackage ../data/fonts/poly {
-        };
-        posix_man_pages = callPackage ../data/documentation/man-pages-posix {
-        };
-        pthreadmanpages = callPackage ../data/documentation/pthread-man-pages {
-        };
-        shared_mime_info = callPackage ../data/misc/shared-mime-info {
-        };
-        shared_desktop_ontologies = callPackage ../data/misc/shared-desktop-ontologies {
-        };
-        stdmanpages = callPackage ../data/documentation/std-man-pages {
-        };
-        symbola = callPackage ../data/fonts/symbola {
-        };
-        iana_etc = callPackage ../data/misc/iana-etc {
-        };
-        poppler_data = callPackage ../data/misc/poppler-data {
-        };
-        r3rs = callPackage ../data/documentation/rnrs/r3rs.nix {
-        };
-        r4rs = callPackage ../data/documentation/rnrs/r4rs.nix {
-        };
-        r5rs = callPackage ../data/documentation/rnrs/r5rs.nix {
-        };
-        source-code-pro = callPackage ../data/fonts/source-code-pro {
-        };
-        source-sans-pro = callPackage ../data/fonts/source-sans-pro {
-        };
-        source-serif-pro = callPackage ../data/fonts/source-serif-pro {
-        };
-        source-han-sans-japanese = callPackage ../data/fonts/source-han-sans/japanese.nix {
-        };
-        source-han-sans-korean = callPackage ../data/fonts/source-han-sans/korean.nix {
-        };
-        source-han-sans-simplified-chinese = callPackage ../data/fonts/source-han-sans/simplified-chinese.nix {
-        };
-        source-han-sans-traditional-chinese = callPackage ../data/fonts/source-han-sans/traditional-chinese.nix {
-        };
-        tango-icon-theme = callPackage ../data/icons/tango-icon-theme {
-        };
-        themes = name:
-        import (../data/misc/themes + ("/" + name + ".nix")) {
-          inherit fetchurl;
-        };
-        theano = callPackage ../data/fonts/theano {
-        };
-        tempora_lgc = callPackage ../data/fonts/tempora-lgc {
-        };
-        terminus_font = callPackage ../data/fonts/terminus-font {
-        };
-        tipa = callPackage ../data/fonts/tipa {
-        };
-        ttf_bitstream_vera = callPackage ../data/fonts/ttf-bitstream-vera {
-        };
-        tzdata = callPackage ../data/misc/tzdata {
-        };
-        ubuntu_font_family = callPackage ../data/fonts/ubuntu-font-family {
-        };
-        ucsFonts = callPackage ../data/fonts/ucs-fonts {
-        };
-        unifont = callPackage ../data/fonts/unifont {
-        };
-        vistafonts = callPackage ../data/fonts/vista-fonts {
-        };
-        wqy_microhei = callPackage ../data/fonts/wqy-microhei {
-        };
-        wqy_zenhei = callPackage ../data/fonts/wqy-zenhei {
-        };
-        xhtml1 = callPackage ../data/sgml+xml/schemas/xml-dtd/xhtml1 {
-        };
-        xkeyboard_config = xorg.xkeyboardconfig;
-        a2jmidid = callPackage ../applications/audio/a2jmidid {
-        };
-        aangifte2006 = callPackage_i686 ../applications/taxes/aangifte-2006 {
-        };
-        aangifte2007 = callPackage_i686 ../applications/taxes/aangifte-2007 {
-        };
-        aangifte2008 = callPackage_i686 ../applications/taxes/aangifte-2008 {
-        };
-        aangifte2009 = callPackage_i686 ../applications/taxes/aangifte-2009 {
-        };
-        aangifte2010 = callPackage_i686 ../applications/taxes/aangifte-2010 {
-        };
-        aangifte2011 = callPackage_i686 ../applications/taxes/aangifte-2011 {
-        };
-        aangifte2012 = callPackage_i686 ../applications/taxes/aangifte-2012 {
-        };
-        aangifte2013 = callPackage_i686 ../applications/taxes/aangifte-2013 {
-        };
-        abcde = callPackage ../applications/audio/abcde {
-          inherit (perlPackages) DigestSHA
-          MusicBrainz MusicBrainzDiscID;
-          libcdio = libcdio082;
-        };
-        abiword = callPackage ../applications/office/abiword {
-          inherit (gnome) libglade
-          libgnomecanvas;
-        };
-        abook = callPackage ../applications/misc/abook {
-        };
-        adobe-reader = callPackage_i686 ../applications/misc/adobe-reader {
-        };
-        aewan = callPackage ../applications/editors/aewan {
-        };
-        alchemy = callPackage ../applications/graphics/alchemy {
-        };
-        ams-lv2 = callPackage ../applications/audio/ams-lv2 {
-        };
-        amsn = callPackage ../applications/networking/instant-messengers/amsn {
-        };
-        antiword = callPackage ../applications/office/antiword {
-        };
-        ardour = ardour3;
-        ardour3 = lowPrio (callPackage ../applications/audio/ardour {
-          inherit (gnome) libgnomecanvas
-          libgnomecanvasmm;
-        });
-        arora = callPackage ../applications/networking/browsers/arora {
-        };
-        atom = callPackage ../applications/editors/atom {
-          gconf = gnome.GConf;
-        };
-        aseprite = callPackage ../applications/editors/aseprite {
-          giflib = giflib_4_1;
-        };
-        audacious = callPackage ../applications/audio/audacious {
-        };
-        audacity = callPackage ../applications/audio/audacity {
-          ffmpeg = ffmpeg_0_10;
-        };
-        milkytracker = callPackage ../applications/audio/milkytracker {
-        };
-        aumix = callPackage ../applications/audio/aumix {
-          gtkGUI = false;
-        };
-        autopanosiftc = callPackage ../applications/graphics/autopanosiftc {
-        };
-        avidemux = callPackage ../applications/video/avidemux {
-        };
-        avogadro = callPackage ../applications/science/chemistry/avogadro {
-          eigen = eigen2;
-        };
-        avrdudess = callPackage ../applications/misc/avrdudess {
-        };
-        avxsynth = callPackage ../applications/video/avxsynth {
-        };
-        awesome-3-4 = callPackage ../applications/window-managers/awesome/3.4.nix {
-          lua = lua5;
-          cairo = cairo.override {
-            xcbSupport = true;
-          };
-        };
-        awesome-3-5 = callPackage ../applications/window-managers/awesome {
-          lua = lua5_1;
-          cairo = cairo.override {
-            xcbSupport = true;
-          };
-        };
-        awesome = awesome-3-5;
-        inherit (gnome3) baobab;
-        bar = callPackage ../applications/window-managers/bar {
-        };
-        baresip = callPackage ../applications/networking/instant-messengers/baresip {
-          ffmpeg = ffmpeg_1;
-        };
-        batik = callPackage ../applications/graphics/batik {
-        };
-        bazaar = callPackage ../applications/version-management/bazaar {
-        };
-        bazaarTools = builderDefsPackage (import ../applications/version-management/bazaar/tools.nix) {
-          inherit bazaar;
-        };
-        beast = callPackage ../applications/audio/beast {
-          inherit (gnome) libgnomecanvas
-          libart_lgpl;
-          guile = guile_1_8;
-        };
-        bibletime = callPackage ../applications/misc/bibletime {
-        };
-        bitcoin = callPackage ../applications/misc/bitcoin {
-        };
-        bitlbee = callPackage ../applications/networking/instant-messengers/bitlbee {
-          gnutls = gnutls;
-          libotr = libotr_3_2;
-        };
-        blender = callPackage ../applications/misc/blender {
-          python = python34;
-        };
-        bristol = callPackage ../applications/audio/bristol {
-        };
-        bspwm = callPackage ../applications/window-managers/bspwm {
-        };
-        bvi = callPackage ../applications/editors/bvi {
-        };
-        calf = callPackage ../applications/audio/calf {
-          inherit (gnome) libglade;
-        };
-        calibre = callPackage ../applications/misc/calibre {
-          inherit (pythonPackages) pyqt5
-          sip_4_16;
-        };
-        camlistore = callPackage ../applications/misc/camlistore {
-        };
-        carrier = builderDefsPackage (import ../applications/networking/instant-messengers/carrier/2.5.0.nix) {
-          inherit fetchurl stdenv
-          pkgconfig perl perlXMLParser
-          libxml2 openssl nss gtkspell
-          aspell gettext ncurses avahi
-          dbus dbus_glib python libtool
-          automake autoconf gstreamer;
-          inherit gtk glib;
-          inherit (gnome) startupnotification
-          GConf;
-          inherit (xlibs) libXScrnSaver
-          scrnsaverproto libX11 xproto
-          kbproto;
-        };
-        funpidgin = carrier;
-        cc1394 = callPackage ../applications/video/cc1394 {
-        };
-        cddiscid = callPackage ../applications/audio/cd-discid {
-        };
-        cdparanoia = cdparanoiaIII;
-        cdparanoiaIII = callPackage ../applications/audio/cdparanoia {
-        };
-        cdrtools = callPackage ../applications/misc/cdrtools {
-        };
-        centerim = callPackage ../applications/networking/instant-messengers/centerim {
-        };
-        cgit = callPackage ../applications/version-management/git-and-tools/cgit {
-        };
-        cgminer = callPackage ../applications/misc/cgminer {
-          amdappsdk = amdappsdk28;
-        };
-        chatzilla = callPackage ../applications/networking/irc/chatzilla {
-        };
-        chromium = lowPrio (callPackage ../applications/networking/browsers/chromium {
-          channel = "stable";
-          pulseSupport = config.pulseaudio or true;
-          enablePepperFlash = config.chromium.enablePepperFlash or false;
-          enablePepperPDF = config.chromium.enablePepperPDF or false;
-        });
-        chromiumBeta = lowPrio (chromium.override {
-          channel = "beta";
-        });
-        chromiumBetaWrapper = lowPrio (wrapChromium chromiumBeta);
-        chromiumDev = lowPrio (chromium.override {
-          channel = "dev";
-        });
-        chromiumDevWrapper = lowPrio (wrapChromium chromiumDev);
-        chromiumWrapper = wrapChromium chromium;
-        cinelerra = callPackage ../applications/video/cinelerra {
-        };
-        clipit = callPackage ../applications/misc/clipit {
-        };
-        cmus = callPackage ../applications/audio/cmus {
-        };
-        compiz = callPackage ../applications/window-managers/compiz {
-          inherit (gnome) GConf ORBit2
-          metacity;
-          boost = boost149;
-        };
-        coriander = callPackage ../applications/video/coriander {
-          inherit (gnome) libgnomeui
-          GConf;
-        };
-        csound = callPackage ../applications/audio/csound {
-        };
-        cinepaint = callPackage ../applications/graphics/cinepaint {
-          fltk = fltk13;
-          libpng = libpng12;
-        };
-        codeblocks = callPackage ../applications/editors/codeblocks {
-        };
-        codeblocksFull = callPackage ../applications/editors/codeblocks {
-          contribPlugins = true;
-        };
-        codeville = builderDefsPackage (import ../applications/version-management/codeville/0.8.0.nix) {
-          inherit makeWrapper;
-          python = pythonFull;
-        };
-        comical = callPackage ../applications/graphics/comical {
-        };
-        conkeror = callPackage ../applications/networking/browsers/conkeror {
-        };
-        conkerorWrapper = wrapFirefox {
-          browser = conkeror;
-          browserName = "conkeror";
-          desktopName = "Conkeror";
-        };
-        cuneiform = builderDefsPackage (import ../tools/graphics/cuneiform) {
-          inherit cmake patchelf;
-          imagemagick = imagemagick;
-        };
-        cvs = callPackage ../applications/version-management/cvs {
-        };
-        cvsps = callPackage ../applications/version-management/cvsps {
-        };
-        cvs2svn = callPackage ../applications/version-management/cvs2svn {
-        };
-        d4x = callPackage ../applications/misc/d4x {
-        };
-        darcs = with haskellPackages_ghc783; callPackage ../applications/version-management/darcs {
-          cabal = cabal.override {
-            extension = self: super: {
-              isLibrary = false;
-              configureFlags = "-f-library " + (super.configureFlags or "");
-            };
-          };
-        };
-        darktable = callPackage ../applications/graphics/darktable {
-          inherit (gnome) GConf libglade;
-        };
-        dd-agent = callPackage ../tools/networking/dd-agent {
-          inherit (pythonPackages) tornado;
-        };
-        dia = callPackage ../applications/graphics/dia {
-          inherit (pkgs.gnome) libart_lgpl
-          libgnomeui;
-        };
-        diffuse = callPackage ../applications/version-management/diffuse {
-        };
-        distrho = callPackage ../applications/audio/distrho {
-        };
-        djvulibre = callPackage ../applications/misc/djvulibre {
-        };
-        djvu2pdf = callPackage ../tools/typesetting/djvu2pdf {
-        };
-        djview = callPackage ../applications/graphics/djview {
-        };
-        djview4 = pkgs.djview;
-        dmenu = callPackage ../applications/misc/dmenu {
-          enableXft = config.dmenu.enableXft or false;
-        };
-        dmtx = builderDefsPackage (import ../tools/graphics/dmtx) {
-          inherit libpng libtiff libjpeg
-          imagemagick librsvg pkgconfig
-          bzip2 zlib libtool freetype
-          fontconfig ghostscript jasper
-          xz;
-          inherit (xlibs) libX11;
-        };
-        docker = callPackage ../applications/virtualization/docker {
-        };
-        doodle = callPackage ../applications/search/doodle {
-        };
-        dunst = callPackage ../applications/misc/dunst {
-        };
-        dvb_apps = callPackage ../applications/video/dvb-apps {
-        };
-        dvdauthor = callPackage ../applications/video/dvdauthor {
-        };
-        dwb = callPackage ../applications/networking/browsers/dwb {
-          dconf = gnome3.dconf;
-        };
-        dwbWrapper = wrapFirefox {
-          browser = dwb;
-          browserName = "dwb";
-          desktopName = "dwb";
-        };
-        dwm = callPackage ../applications/window-managers/dwm {
-          patches = config.dwm.patches or [
-          ];
-        };
-        dzen2 = callPackage ../applications/window-managers/dzen2 {
-        };
-        eaglemode = callPackage ../applications/misc/eaglemode {
-        };
-        eclipses = recurseIntoAttrs (callPackage ../applications/editors/eclipse {
-        });
-        ed = callPackage ../applications/editors/ed {
-        };
-        ekho = callPackage ../applications/audio/ekho {
-        };
-        electrum = callPackage ../applications/misc/electrum {
-        };
-        elinks = callPackage ../applications/networking/browsers/elinks {
-        };
-        elvis = callPackage ../applications/editors/elvis {
-        };
-        emacs = emacs24;
-        emacs24 = callPackage ../applications/editors/emacs-24 {
-          libXaw = xlibs.libXaw;
-          Xaw3d = null;
-          gconf = null;
-          librsvg = null;
-          alsaLib = null;
-          imagemagick = null;
-        };
-        emacs24-nox = lowPrio (appendToName "nox" (emacs24.override {
-          withX = false;
-        }));
-        emacs24Macport = lowPrio (callPackage ../applications/editors/emacs-24/macport.nix {
-          stdenv = pkgs.clangStdenv;
-        });
-        emacsPackages = emacs: self: let
-          callPackage = newScope self;
-          in rec {
-            inherit emacs;
-            autoComplete = callPackage ../applications/editors/emacs-modes/auto-complete {
-            };
-            bbdb = callPackage ../applications/editors/emacs-modes/bbdb {
-            };
-            bbdb3 = callPackage ../applications/editors/emacs-modes/bbdb/3.nix {
-            };
-            cedet = callPackage ../applications/editors/emacs-modes/cedet {
-            };
-            calfw = callPackage ../applications/editors/emacs-modes/calfw {
-            };
-            coffee = callPackage ../applications/editors/emacs-modes/coffee {
-            };
-            colorTheme = callPackage ../applications/editors/emacs-modes/color-theme {
-            };
-            colorThemeSolarized = callPackage ../applications/editors/emacs-modes/color-theme-solarized {
-            };
-            cryptol = callPackage ../applications/editors/emacs-modes/cryptol {
-            };
-            cua = callPackage ../applications/editors/emacs-modes/cua {
-            };
-            darcsum = callPackage ../applications/editors/emacs-modes/darcsum {
-            };
-            jabber = callPackage ../applications/editors/emacs-modes/jabber {
-            };
-            emacsClangCompleteAsync = callPackage ../applications/editors/emacs-modes/emacs-clang-complete-async {
-            };
-            emacsSessionManagement = callPackage ../applications/editors/emacs-modes/session-management-for-emacs {
-            };
-            emacsw3m = callPackage ../applications/editors/emacs-modes/emacs-w3m {
-            };
-            emms = callPackage ../applications/editors/emacs-modes/emms {
-            };
-            ess = callPackage ../applications/editors/emacs-modes/ess {
-            };
-            flymakeCursor = callPackage ../applications/editors/emacs-modes/flymake-cursor {
-            };
-            gh = callPackage ../applications/editors/emacs-modes/gh {
-            };
-            graphvizDot = callPackage ../applications/editors/emacs-modes/graphviz-dot {
-            };
-            gist = callPackage ../applications/editors/emacs-modes/gist {
-            };
-            idris = callPackage ../applications/editors/emacs-modes/idris {
-            };
-            jade = callPackage ../applications/editors/emacs-modes/jade {
-            };
-            jdee = callPackage ../applications/editors/emacs-modes/jdee {
-            };
-            js2 = callPackage ../applications/editors/emacs-modes/js2 {
-            };
-            stratego = callPackage ../applications/editors/emacs-modes/stratego {
-            };
-            haskellMode = callPackage ../applications/editors/emacs-modes/haskell {
-            };
-            ocamlMode = callPackage ../applications/editors/emacs-modes/ocaml {
-            };
-            structuredHaskellMode = callPackage ../applications/editors/emacs-modes/structured-haskell-mode {
-              inherit (haskellPackages) cabal
-              haskellSrcExts;
-            };
-            tuaregMode = callPackage ../applications/editors/emacs-modes/tuareg {
-            };
-            hol_light_mode = callPackage ../applications/editors/emacs-modes/hol_light {
-            };
-            htmlize = callPackage ../applications/editors/emacs-modes/htmlize {
-            };
-            logito = callPackage ../applications/editors/emacs-modes/logito {
-            };
-            loremIpsum = callPackage ../applications/editors/emacs-modes/lorem-ipsum {
-            };
-            magit = callPackage ../applications/editors/emacs-modes/magit {
-            };
-            maudeMode = callPackage ../applications/editors/emacs-modes/maude {
-            };
-            metaweblog = callPackage ../applications/editors/emacs-modes/metaweblog {
-            };
-            notmuch = lowPrio (callPackage ../applications/networking/mailreaders/notmuch {
-            });
-            offlineimap = callPackage ../applications/editors/emacs-modes/offlineimap {
-            };
-            org = hiPrio (callPackage ../applications/editors/emacs-modes/org {
-            });
-            org2blog = callPackage ../applications/editors/emacs-modes/org2blog {
-            };
-            pcache = callPackage ../applications/editors/emacs-modes/pcache {
-            };
-            phpMode = callPackage ../applications/editors/emacs-modes/php {
-            };
-            prologMode = callPackage ../applications/editors/emacs-modes/prolog {
-            };
-            proofgeneral_4_2 = callPackage ../applications/editors/emacs-modes/proofgeneral/4.2.nix {
-              texinfo = texinfo4;
-              texLive = pkgs.texLiveAggregationFun {
-                paths = [
-                  pkgs.texLive
-                  pkgs.texLiveCMSuper
-                ];
-              };
-            };
-            proofgeneral_4_3_pre = callPackage ../applications/editors/emacs-modes/proofgeneral/4.3pre.nix {
-              texinfo = texinfo4;
-              texLive = pkgs.texLiveAggregationFun {
-                paths = [
-                  pkgs.texLive
-                  pkgs.texLiveCMSuper
-                ];
-              };
-            };
-            proofgeneral = self.proofgeneral_4_2;
-            quack = callPackage ../applications/editors/emacs-modes/quack {
-            };
-            rectMark = callPackage ../applications/editors/emacs-modes/rect-mark {
-            };
-            remember = callPackage ../applications/editors/emacs-modes/remember {
-            };
-            rudel = callPackage ../applications/editors/emacs-modes/rudel {
-            };
-            sbtMode = callPackage ../applications/editors/emacs-modes/sbt-mode {
-            };
-            scalaMode1 = callPackage ../applications/editors/emacs-modes/scala-mode/v1.nix {
-            };
-            scalaMode2 = callPackage ../applications/editors/emacs-modes/scala-mode/v2.nix {
-            };
-            sunriseCommander = callPackage ../applications/editors/emacs-modes/sunrise-commander {
-            };
-            writeGood = callPackage ../applications/editors/emacs-modes/writegood {
-            };
-            xmlRpc = callPackage ../applications/editors/emacs-modes/xml-rpc {
-            };
-          };
-        emacs24Packages = recurseIntoAttrs (emacsPackages emacs24 pkgs.emacs24Packages);
-        inherit (gnome3) empathy;
-        epdfview = callPackage ../applications/misc/epdfview {
-        };
-        inherit (gnome3) epiphany;
-        espeak = callPackage ../applications/audio/espeak {
-        };
-        espeakedit = callPackage ../applications/audio/espeak/edit.nix {
-        };
-        esniper = callPackage ../applications/networking/esniper {
-        };
-        etherape = callPackage ../applications/networking/sniffers/etherape {
-          inherit (gnome) gnomedocutils
-          libgnome libglade libgnomeui
-          scrollkeeper;
-        };
-        evopedia = callPackage ../applications/misc/evopedia {
-        };
-        keepassx = callPackage ../applications/misc/keepassx {
-        };
-        keepassx2 = callPackage ../applications/misc/keepassx/2.0.nix {
-        };
-        inherit (gnome3) evince;
-        evolution_data_server = gnome3.evolution_data_server;
-        keepass = callPackage ../applications/misc/keepass {
-        };
-        exrdisplay = callPackage ../applications/graphics/exrdisplay {
-          fltk = fltk20;
-        };
-        fbpanel = callPackage ../applications/window-managers/fbpanel {
-        };
-        fbreader = callPackage ../applications/misc/fbreader {
-        };
-        fetchmail = import ../applications/misc/fetchmail {
-          inherit stdenv fetchurl openssl;
-        };
-        fldigi = callPackage ../applications/audio/fldigi {
-        };
-        fluidsynth = callPackage ../applications/audio/fluidsynth {
-        };
-        fossil = callPackage ../applications/version-management/fossil {
-        };
-        fribid = callPackage ../applications/networking/browsers/mozilla-plugins/fribid {
-        };
-        fvwm = callPackage ../applications/window-managers/fvwm {
-        };
-        geany = callPackage ../applications/editors/geany {
-        };
-        gksu = callPackage ../applications/misc/gksu {
-        };
-        gnuradio = callPackage ../applications/misc/gnuradio {
-          inherit (pythonPackages) lxml
-          numpy scipy matplotlib pyopengl;
-          fftw = fftwFloat;
-        };
-        gnuradio-osmosdr = callPackage ../applications/misc/gnuradio-osmosdr {
-        };
-        goldendict = callPackage ../applications/misc/goldendict {
-        };
-        google-musicmanager = callPackage ../applications/audio/google-musicmanager {
-        };
-        gpicview = callPackage ../applications/graphics/gpicview {
-        };
-        gqrx = callPackage ../applications/misc/gqrx {
-        };
-        grass = import ../applications/misc/grass {
-          inherit (xlibs) libXmu libXext
-          libXp libX11 libXt libSM libICE
-          libXpm libXaw libXrender;
-          inherit config
-          composableDerivation stdenv
-          fetchurl lib flex bison cairo
-          fontconfig gdal zlib ncurses
-          gdbm proj pkgconfig swig blas
-          liblapack libjpeg libpng mysql
-          unixODBC mesa postgresql python
-          readline sqlite tcl tk libtiff
-          freetype makeWrapper wxGTK;
-          fftw = fftwSinglePrec;
-          ffmpeg = ffmpeg_0_10;
-          motif = lesstif;
-          opendwg = libdwg;
-          wxPython = wxPython28;
-        };
-        grip = callPackage ../applications/misc/grip {
-          inherit (gnome) libgnome
-          libgnomeui vte;
-        };
-        gtimelog = pythonPackages.gtimelog;
-        inherit (gnome3) gucharmap;
-        guitarix = callPackage ../applications/audio/guitarix {
-          fftw = fftwSinglePrec;
-        };
-        photivo = callPackage ../applications/graphics/photivo {
-        };
-        wavesurfer = callPackage ../applications/misc/audio/wavesurfer {
-        };
-        wireshark = callPackage ../applications/networking/sniffers/wireshark {
-        };
-        wvdial = callPackage ../os-specific/linux/wvdial {
-        };
-        fbida = callPackage ../applications/graphics/fbida {
-        };
-        fdupes = callPackage ../tools/misc/fdupes {
-        };
-        feh = callPackage ../applications/graphics/feh {
-        };
-        filezilla = callPackage ../applications/networking/ftp/filezilla {
-        };
-        firefox13Pkgs = callPackage ../applications/networking/browsers/firefox/13.0.nix {
-          inherit (gnome) libIDL;
-        };
-        firefox13Wrapper = wrapFirefox {
-          browser = firefox13Pkgs.firefox;
-        };
-        firefox30Pkgs = callPackage ../applications/networking/browsers/firefox/30.nix {
-          inherit (gnome) libIDL;
-          inherit (pythonPackages) pysqlite;
-          libpng = libpng_apng;
-        };
-        firefox = callPackage ../applications/networking/browsers/firefox {
-          inherit (gnome) libIDL;
-          inherit (pythonPackages) pysqlite;
-        };
-        firefoxWrapper = wrapFirefox {
-          browser = pkgs.firefox;
-        };
-        firefox-bin = callPackage ../applications/networking/browsers/firefox-bin {
-          gconf = pkgs.gnome.GConf;
-          inherit (pkgs.gnome) libgnome
-          libgnomeui;
-          inherit (pkgs.xlibs) libX11
-          libXScrnSaver libXext
-          libXinerama libXrender libXt;
-        };
-        flac = callPackage ../applications/audio/flac {
-        };
-        flashplayer = callPackage ../applications/networking/browsers/mozilla-plugins/flashplayer-11 {
-          debug = config.flashplayer.debug or false;
-        };
-        fluxbox = callPackage ../applications/window-managers/fluxbox {
-        };
-        freecad = callPackage ../applications/graphics/freecad {
-          opencascade = opencascade_6_5;
-          inherit (pythonPackages) matplotlib
-          pycollada;
-        };
-        freemind = callPackage ../applications/misc/freemind {
-          jdk = jdk;
-          jre = jdk;
-        };
-        freenet = callPackage ../applications/networking/p2p/freenet {
-        };
-        freepv = callPackage ../applications/graphics/freepv {
-        };
-        xfontsel = callPackage ../applications/misc/xfontsel {
-        };
-        xlsfonts = callPackage ../applications/misc/xlsfonts {
-        };
-        freerdp = callPackage ../applications/networking/remote/freerdp {
-          ffmpeg = ffmpeg_1;
-        };
-        freerdpUnstable = callPackage ../applications/networking/remote/freerdp/unstable.nix {
-        };
-        freicoin = callPackage ../applications/misc/freicoin {
-        };
-        fspot = callPackage ../applications/graphics/f-spot {
-          inherit (gnome) libgnome
-          libgnomeui;
-          gtksharp = gtksharp1;
-        };
-        fuze = callPackage ../applications/networking/instant-messengers/fuze {
-        };
-        gcolor2 = callPackage ../applications/graphics/gcolor2 {
-        };
-        get_iplayer = callPackage ../applications/misc/get_iplayer {
-        };
-        gimp_2_8 = callPackage ../applications/graphics/gimp/2.8.nix {
-          inherit (gnome) libart_lgpl;
-          webkit = null;
-          lcms = lcms2;
-          wrapPython = pythonPackages.wrapPython;
-        };
-        gimp = gimp_2_8;
-        gimpPlugins = recurseIntoAttrs (import ../applications/graphics/gimp/plugins {
-          inherit pkgs gimp;
-        });
-        gitAndTools = recurseIntoAttrs (import ../applications/version-management/git-and-tools {
-          inherit pkgs;
-        });
-        git = gitAndTools.git;
-        gitFull = gitAndTools.gitFull;
-        gitSVN = gitAndTools.gitSVN;
-        gitRepo = callPackage ../applications/version-management/git-repo {
-          python = python27;
-        };
-        gitolite = callPackage ../applications/version-management/gitolite {
-        };
-        inherit (gnome3) gitg;
-        giv = callPackage ../applications/graphics/giv {
-          pcre = pcre.override {
-            unicodeSupport = true;
-          };
-        };
-        gmrun = callPackage ../applications/misc/gmrun {
-        };
-        gnucash = callPackage ../applications/office/gnucash {
-          inherit (gnome2) libgnomeui
-          libgtkhtml gtkhtml libbonoboui
-          libgnomeprint libglade
-          libart_lgpl;
-          gconf = gnome2.GConf;
-          guile = guile_1_8;
-          slibGuile = slibGuile.override {
-            scheme = guile_1_8;
-          };
-          goffice = goffice_0_8;
-        };
-        goffice_0_8 = callPackage ../desktops/gnome-3/3.10/misc/goffice/0.8.nix {
-          inherit (gnome2) libglade
-          libgnomeui;
-          gconf = gnome2.GConf;
-          libart = gnome2.libart_lgpl;
-        };
-        ideas = recurseIntoAttrs (callPackage ../applications/editors/idea {
-        } // callPackage ../applications/editors/idea/pycharm.nix {
-        });
-        libquvi = callPackage ../applications/video/quvi/library.nix {
-        };
-        mi2ly = callPackage ../applications/audio/mi2ly {
-        };
-        praat = callPackage ../applications/audio/praat {
-        };
-        quvi = callPackage ../applications/video/quvi/tool.nix {
-        };
-        quvi_scripts = callPackage ../applications/video/quvi/scripts.nix {
-        };
-        qjackctl = callPackage ../applications/audio/qjackctl {
-        };
-        gkrellm = callPackage ../applications/misc/gkrellm {
-        };
-        gmu = callPackage ../applications/audio/gmu {
-        };
-        gnash = callPackage ../applications/video/gnash {
-          inherit (gnome) gtkglext;
-        };
-        gnome_mplayer = callPackage ../applications/video/gnome-mplayer {
-          inherit (gnome) GConf;
-        };
-        gnumeric = callPackage ../applications/office/gnumeric {
-          inherit (gnome3) goffice
-          gnome_icon_theme;
-        };
-        gnunet = callPackage ../applications/networking/p2p/gnunet {
-          libgcrypt = libgcrypt_1_6;
-        };
-        gnunet_svn = lowPrio (callPackage ../applications/networking/p2p/gnunet/svn.nix {
-          libgcrypt = libgcrypt_1_6;
-        });
-        gocr = callPackage ../applications/graphics/gocr {
-        };
-        gobby5 = callPackage ../applications/editors/gobby {
-          inherit (gnome) gtksourceview;
-        };
-        gphoto2 = callPackage ../applications/misc/gphoto2 {
-        };
-        gphoto2fs = builderDefsPackage ../applications/misc/gphoto2/gphotofs.nix {
-          inherit libgphoto2 fuse
-          pkgconfig glib libtool;
-        };
-        graphicsmagick = callPackage ../applications/graphics/graphicsmagick {
-        };
-        graphicsmagick_q16 = callPackage ../applications/graphics/graphicsmagick {
-          quantumdepth = 16;
-        };
-        graphicsmagick137 = callPackage ../applications/graphics/graphicsmagick/1.3.7.nix {
-          libpng = libpng12;
-        };
-        gtkpod = callPackage ../applications/audio/gtkpod {
-          inherit (gnome) libglade;
-        };
-        jbidwatcher = callPackage ../applications/misc/jbidwatcher {
-          java = if stdenv.isLinux
-            then jre
-            else jdk;
-        };
-        qrdecode = builderDefsPackage (import ../tools/graphics/qrdecode) {
-          libpng = libpng12;
-          opencv = opencv_2_1;
-        };
-        qrencode = callPackage ../tools/graphics/qrencode {
-        };
-        gecko_mediaplayer = callPackage ../applications/networking/browsers/mozilla-plugins/gecko-mediaplayer {
-          inherit (gnome) GConf;
-          browser = firefox;
-        };
-        geeqie = callPackage ../applications/graphics/geeqie {
-        };
-        gigedit = callPackage ../applications/audio/gigedit {
-        };
-        gqview = callPackage ../applications/graphics/gqview {
-        };
-        gmpc = callPackage ../applications/audio/gmpc {
-        };
-        gmtk = callPackage ../applications/networking/browsers/mozilla-plugins/gmtk {
-          inherit (gnome) GConf;
-        };
-        googleearth = callPackage_i686 ../applications/misc/googleearth {
-        };
-        google_talk_plugin = callPackage ../applications/networking/browsers/mozilla-plugins/google-talk-plugin {
-          libpng = libpng12;
-        };
-        gosmore = builderDefsPackage ../applications/misc/gosmore {
-          inherit fetchsvn curl pkgconfig
-          libxml2 gtk;
-        };
-        gpsbabel = callPackage ../applications/misc/gpsbabel {
-        };
-        gpscorrelate = callPackage ../applications/misc/gpscorrelate {
-        };
-        gpsd = callPackage ../servers/gpsd {
-        };
-        guitone = callPackage ../applications/version-management/guitone {
-        };
-        gv = callPackage ../applications/misc/gv {
-        };
-        guvcview = callPackage ../os-specific/linux/guvcview {
-        };
-        hello = callPackage ../applications/misc/hello/ex-2 {
-        };
-        herbstluftwm = callPackage ../applications/window-managers/herbstluftwm {
-        };
-        hexchat = callPackage ../applications/networking/irc/hexchat {
-        };
-        hexedit = callPackage ../applications/editors/hexedit {
-        };
-        hipchat = callPackage ../applications/networking/instant-messengers/hipchat {
-        };
-        homebank = callPackage ../applications/office/homebank {
-        };
-        htmldoc = callPackage ../applications/misc/htmldoc {
-          fltk = fltk13;
-        };
-        hugin = callPackage ../applications/graphics/hugin {
-        };
-        hydrogen = callPackage ../applications/audio/hydrogen {
-        };
-        i3 = callPackage ../applications/window-managers/i3 {
-        };
-        i3lock = callPackage ../applications/window-managers/i3/lock.nix {
-          inherit (xorg) libxkbfile;
-          cairo = cairo.override {
-            xcbSupport = true;
-          };
-        };
-        i3minator = callPackage ../tools/misc/i3minator {
-        };
-        i3status = callPackage ../applications/window-managers/i3/status.nix {
-        };
-        i810switch = callPackage ../os-specific/linux/i810switch {
-        };
-        icewm = callPackage ../applications/window-managers/icewm {
-        };
-        id3v2 = callPackage ../applications/audio/id3v2 {
-        };
-        ifenslave = callPackage ../os-specific/linux/ifenslave {
-        };
-        ii = callPackage ../applications/networking/irc/ii {
-        };
-        ike = callPackage ../applications/ike {
-        };
-        ikiwiki = callPackage ../applications/misc/ikiwiki {
-          inherit (perlPackages) TextMarkdown
-          URI HTMLParser HTMLScrubber
-          HTMLTemplate TimeDate CGISession
-          DBFile CGIFormBuilder
-          LocaleGettext RpcXML XMLSimple
-          PerlMagick YAML YAMLLibYAML
-          HTMLTree Filechdir
-          AuthenPassphrase
-          NetOpenIDConsumer
-          LWPxParanoidAgent CryptSSLeay;
-        };
-        imagemagick = callPackage ../applications/graphics/ImageMagick {
-          tetex = null;
-          librsvg = null;
-        };
-        imagemagickBig = lowPrio (callPackage ../applications/graphics/ImageMagick {
-        });
-        impressive = callPackage ../applications/office/impressive {
-          inherit (pythonPackages) pyopengl;
-        };
-        inferno = callPackage_i686 ../applications/inferno {
-        };
-        inkscape = callPackage ../applications/graphics/inkscape {
-          inherit (pythonPackages) lxml;
-          lcms = lcms2;
-        };
-        ion3 = callPackage ../applications/window-managers/ion-3 {
-          lua = lua5;
-        };
-        ipe = callPackage ../applications/graphics/ipe {
-        };
-        iptraf = callPackage ../applications/networking/iptraf {
-        };
-        irssi = callPackage ../applications/networking/irc/irssi {
-          stdenv = if stdenv.isDarwin
-            then stdenvAdapters.overrideGCC stdenv gccApple
-            else stdenv;
-        };
-        irssi_fish = callPackage ../applications/networking/irc/irssi/fish {
-        };
-        irssi_otr = callPackage ../applications/networking/irc/irssi/otr {
-        };
-        bip = callPackage ../applications/networking/irc/bip {
-        };
-        jack_capture = callPackage ../applications/audio/jack-capture {
-        };
-        jack_oscrolloscope = callPackage ../applications/audio/jack-oscrolloscope {
-        };
-        jack_rack = callPackage ../applications/audio/jack-rack {
-        };
-        jackmeter = callPackage ../applications/audio/jackmeter {
-        };
-        jalv = callPackage ../applications/audio/jalv {
-        };
-        jedit = callPackage ../applications/editors/jedit {
-        };
-        jigdo = callPackage ../applications/misc/jigdo {
-        };
-        jitsi = callPackage ../applications/networking/instant-messengers/jitsi {
-        };
-        joe = callPackage ../applications/editors/joe {
-        };
-        jbrout = callPackage ../applications/graphics/jbrout {
-          inherit (pythonPackages) lxml;
-        };
-        jwm = callPackage ../applications/window-managers/jwm {
-        };
-        k3d = callPackage ../applications/graphics/k3d {
-          inherit (pkgs.gnome2) gtkglext;
-        };
-        keepnote = callPackage ../applications/office/keepnote {
-          pygtk = pyGtkGlade;
-        };
-        kermit = callPackage ../tools/misc/kermit {
-        };
-        keymon = callPackage ../applications/video/key-mon {
-        };
-        kino = callPackage ../applications/video/kino {
-          inherit (gnome) libglade;
-        };
-        lame = callPackage ../applications/audio/lame {
-        };
-        larswm = callPackage ../applications/window-managers/larswm {
-        };
-        lash = callPackage ../applications/audio/lash {
-        };
-        ladspaH = callPackage ../applications/audio/ladspa-plugins/ladspah.nix {
-        };
-        ladspaPlugins = callPackage ../applications/audio/ladspa-plugins {
-          fftw = fftwSinglePrec;
-        };
-        caps = callPackage ../applications/audio/caps {
-        };
-        lastwatch = callPackage ../applications/audio/lastwatch {
-        };
-        lastfmsubmitd = callPackage ../applications/audio/lastfmsubmitd {
-        };
-        lbdb = callPackage ../tools/misc/lbdb {
-        };
-        lci = callPackage ../applications/science/logic/lci {
-        };
-        ldcpp = callPackage ../applications/networking/p2p/ldcpp {
-          inherit (gnome) libglade;
-        };
-        librecad = callPackage ../applications/misc/librecad {
-        };
-        librecad2 = callPackage ../applications/misc/librecad/2.0.nix {
-        };
-        libreoffice = callPackage ../applications/office/libreoffice {
-          inherit (perlPackages) ArchiveZip
-          CompressZlib;
-          inherit (gnome) GConf ORBit2
-          gnome_vfs;
-          zip = zip.override {
-            enableNLS = false;
-          };
-          boost = boost155;
-          jdk = openjdk;
-          fontsConf = makeFontsConf {
-            fontDirectories = [
-              freefont_ttf
-              xorg.fontmiscmisc
-              xorg.fontbhttf
-            ];
-          };
-          clucene_core = clucene_core_2;
-          lcms = lcms2;
-          harfbuzz = harfbuzz.override {
-            withIcu = true;
-            withGraphite2 = true;
-          };
-        };
-        liferea = callPackage ../applications/networking/newsreaders/liferea {
-        };
-        lingot = callPackage ../applications/audio/lingot {
-          inherit (gnome) libglade;
-        };
-        links = callPackage ../applications/networking/browsers/links {
-        };
-        ledger = callPackage ../applications/office/ledger/2.6.3.nix {
-        };
-        ledger3 = callPackage ../applications/office/ledger/3.0.nix {
-        };
-        lighttable = callPackage ../applications/editors/lighttable {
-        };
-        links2 = callPackage ../applications/networking/browsers/links2 {
-        };
-        linphone = callPackage ../applications/networking/instant-messengers/linphone rec {
-          inherit (gnome) libglade;
-          libexosip = libexosip_3;
-          libosip = libosip_3;
-        };
-        linuxsampler = callPackage ../applications/audio/linuxsampler {
-          bison = bison2;
-        };
-        llpp = callPackage ../applications/misc/llpp {
-          inherit (ocamlPackages) lablgl;
-        };
-        lmms = callPackage ../applications/audio/lmms {
-        };
-        lrzsz = callPackage ../tools/misc/lrzsz {
-        };
-        luminanceHDR = callPackage ../applications/graphics/luminance-hdr {
-        };
-        lxdvdrip = callPackage ../applications/video/lxdvdrip {
-        };
-        handbrake = callPackage ../applications/video/handbrake {
-        };
-        lynx = callPackage ../applications/networking/browsers/lynx {
-        };
-        lyx = callPackage ../applications/misc/lyx {
-        };
-        makeself = callPackage ../applications/misc/makeself {
-        };
-        matchbox = callPackage ../applications/window-managers/matchbox {
-        };
-        mcpp = callPackage ../development/compilers/mcpp {
-        };
-        mda_lv2 = callPackage ../applications/audio/mda-lv2 {
-        };
-        meld = callPackage ../applications/version-management/meld {
-          inherit (gnome) scrollkeeper;
-          pygtk = pyGtkGlade;
-        };
-        mcomix = callPackage ../applications/graphics/mcomix {
-        };
-        mercurial = callPackage ../applications/version-management/mercurial {
-          inherit (pythonPackages) curses
-          docutils;
-          guiSupport = false;
-        };
-        mercurialFull = appendToName "full" (pkgs.mercurial.override {
-          guiSupport = true;
-        });
-        merkaartor = callPackage ../applications/misc/merkaartor {
-        };
-        meshlab = callPackage ../applications/graphics/meshlab {
-        };
-        mhwaveedit = callPackage ../applications/audio/mhwaveedit {
-        };
-        mid2key = callPackage ../applications/audio/mid2key {
-        };
-        midori = callPackage ../applications/networking/browsers/midori {
-        };
-        midoriWrapper = wrapFirefox {
-          browser = midori;
-          browserName = "midori";
-          desktopName = "Midori";
-          icon = "${midori}/share/icons/hicolor/22x22/apps/midori.png";
-        };
-        mikmod = callPackage ../applications/audio/mikmod {
-        };
-        minicom = callPackage ../tools/misc/minicom {
-        };
-        minimodem = callPackage ../applications/audio/minimodem {
-        };
-        minidjvu = callPackage ../applications/graphics/minidjvu {
-        };
-        mirage = callPackage ../applications/graphics/mirage {
-        };
-        mixxx = callPackage ../applications/audio/mixxx {
-          inherit (vamp) vampSDK;
-        };
-        mmex = callPackage ../applications/office/mmex {
-        };
-        moc = callPackage ../applications/audio/moc {
-        };
-        monkeysAudio = callPackage ../applications/audio/monkeys-audio {
-        };
-        monodevelop = callPackage ../applications/editors/monodevelop {
-          inherit (gnome) gnome_vfs
-          libbonobo libglade libgnome
-          GConf;
-          mozilla = firefox;
-          gtksharp = gtksharp2;
-        };
-        monodoc = callPackage ../applications/editors/monodoc {
-          gtksharp = gtksharp1;
-        };
-        monotone = callPackage ../applications/version-management/monotone {
-          lua = lua5;
-          boost = boost149;
-        };
-        monotoneViz = builderDefsPackage (import ../applications/version-management/monotone-viz/mtn-head.nix) {
-          inherit ocaml graphviz pkgconfig
-          autoconf automake libtool glib
-          gtk;
-          inherit (ocamlPackages) lablgtk;
-          inherit (gnome) libgnomecanvas;
-        };
-        mopidy = callPackage ../applications/audio/mopidy {
-        };
-        mopidy-spotify = callPackage ../applications/audio/mopidy-spotify {
-        };
-        mopidy-moped = callPackage ../applications/audio/mopidy-moped {
-        };
-        mozilla = callPackage ../applications/networking/browsers/mozilla {
-          inherit (gnome) libIDL;
-        };
-        mozplugger = builderDefsPackage (import ../applications/networking/browsers/mozilla-plugins/mozplugger) {
-          inherit firefox;
-          inherit (xlibs) libX11 xproto;
-        };
-        easytag = callPackage ../applications/audio/easytag {
-        };
-        mp3info = callPackage ../applications/audio/mp3info {
-        };
-        mp3splt = callPackage ../applications/audio/mp3splt {
-        };
-        mpc123 = callPackage ../applications/audio/mpc123 {
-        };
-        mpg123 = callPackage ../applications/audio/mpg123 {
-        };
-        mpg321 = callPackage ../applications/audio/mpg321 {
-        };
-        mpc_cli = callPackage ../applications/audio/mpc {
-        };
-        ncmpc = callPackage ../applications/audio/ncmpc {
-        };
-        ncmpcpp = callPackage ../applications/audio/ncmpcpp {
-        };
-        normalize = callPackage ../applications/audio/normalize {
-        };
-        mplayer = callPackage ../applications/video/mplayer {
-          pulseSupport = config.pulseaudio or false;
-          vdpauSupport = config.mplayer.vdpauSupport or false;
-        };
-        mplayer2 = callPackage ../applications/video/mplayer2 {
-          ffmpeg = libav_9;
-        };
-        MPlayerPlugin = browser:
-        import ../applications/networking/browsers/mozilla-plugins/mplayerplug-in {
-          inherit browser;
-          inherit fetchurl stdenv
-          pkgconfig gettext;
-          inherit (xlibs) libXpm;
-        };
-        mpv = callPackage ../applications/video/mpv {
-          lua = lua5_1;
-          bs2bSupport = true;
-          quviSupport = true;
-          cacaSupport = true;
-        };
-        mrxvt = callPackage ../applications/misc/mrxvt {
-        };
-        multisync = callPackage ../applications/misc/multisync {
-          inherit (gnome) ORBit2 libbonobo
-          libgnomeui GConf;
-        };
-        mumble = callPackage ../applications/networking/mumble {
-          avahi = avahi.override {
-            withLibdnssdCompat = true;
-          };
-          jackSupport = config.mumble.jackSupport or false;
-          speechdSupport = config.mumble.speechdSupport or false;
-        };
-        murmur = callPackage ../applications/networking/mumble/murmur.nix {
-          avahi = avahi.override {
-            withLibdnssdCompat = true;
-          };
-          iceSupport = config.murmur.iceSupport or true;
-        };
-        mutt = callPackage ../applications/networking/mailreaders/mutt {
-        };
-        pcmanfm = callPackage ../applications/misc/pcmanfm {
-        };
-        ruby_gpgme = callPackage ../development/libraries/ruby_gpgme {
-          ruby = ruby19;
-          hoe = rubyLibs.hoe;
-        };
-        ruby_ncursesw_sup = callPackage ../development/libraries/ruby_ncursesw_sup {
-        };
-        shotcut = callPackage ../applications/video/shotcut {
-          mlt = mlt-qt5;
-        };
-        smplayer = callPackage ../applications/video/smplayer {
-        };
-        sup = with rubyLibs; callPackage ../applications/networking/mailreaders/sup {
-          ruby = ruby19.override {
-            cursesSupport = true;
-          };
-          inherit gettext highline iconv
-          locale lockfile text trollop
-          xapian_ruby which;
-          rmail_sup = "";
-          unicode = "";
-          bundler = pkgs.lib.overrideDerivation pkgs.rubyLibs.bundler (oldAttrs:
-          { dontPatchShebangs = 1; });
-          chronic = chronic;
-          gpgme = ruby_gpgme;
-          mime_types = mime_types;
-          ncursesw_sup = ruby_ncursesw_sup;
-          rake = rake;
-        };
-        synfigstudio = callPackage ../applications/graphics/synfigstudio {
-          fontsConf = makeFontsConf {
-            fontDirectories = [
-              freefont_ttf
-            ];
-          };
-        };
-        sxhkd = callPackage ../applications/window-managers/sxhkd {
-        };
-        msmtp = callPackage ../applications/networking/msmtp {
-        };
-        imapfilter = callPackage ../applications/networking/mailreaders/imapfilter.nix {
-          lua = lua5;
-        };
-        mupdf = callPackage ../applications/misc/mupdf {
-        };
-        mypaint = callPackage ../applications/graphics/mypaint {
-        };
-        mythtv = callPackage ../applications/video/mythtv {
-        };
-        tvtime = callPackage ../applications/video/tvtime {
-          kernel = linux;
-        };
-        nano = callPackage ../applications/editors/nano {
-        };
-        navipowm = callPackage ../applications/misc/navipowm {
-        };
-        navit = callPackage ../applications/misc/navit {
-        };
-        netbeans = callPackage ../applications/editors/netbeans {
-        };
-        ncdu = callPackage ../tools/misc/ncdu {
-        };
-        ncdc = callPackage ../applications/networking/p2p/ncdc {
-        };
-        nedit = callPackage ../applications/editors/nedit {
-          motif = lesstif;
-        };
-        netsurfBrowser = netsurf.browser;
-        netsurf = recurseIntoAttrs (import ../applications/networking/browsers/netsurf {
-          inherit pkgs;
-        });
-        notmuch = callPackage ../applications/networking/mailreaders/notmuch {
-          emacs = null;
-        };
-        nova = callPackage ../applications/virtualization/nova {
-        };
-        novaclient = callPackage ../applications/virtualization/nova/client.nix {
-        };
-        nspluginwrapper = callPackage ../applications/networking/browsers/mozilla-plugins/nspluginwrapper {
-        };
-        nvi = callPackage ../applications/editors/nvi {
-        };
-        nvpy = callPackage ../applications/editors/nvpy {
-        };
-        obconf = callPackage ../tools/X11/obconf {
-          inherit (gnome) libglade;
-        };
-        ocrad = callPackage ../applications/graphics/ocrad {
-        };
-        offrss = callPackage ../applications/networking/offrss {
-        };
-        ogmtools = callPackage ../applications/video/ogmtools {
-        };
-        omxplayer = callPackage ../applications/video/omxplayer {
-        };
-        oneteam = callPackage ../applications/networking/instant-messengers/oneteam {
-        };
-        openbox = callPackage ../applications/window-managers/openbox {
-        };
-        openimageio = callPackage ../applications/graphics/openimageio {
-        };
-        openjump = callPackage ../applications/misc/openjump {
-        };
-        openscad = callPackage ../applications/graphics/openscad {
-        };
-        opera = callPackage ../applications/networking/browsers/opera {
-          inherit (pkgs.kde4) kdelibs;
-        };
-        opusfile = callPackage ../applications/audio/opusfile {
-        };
-        opusTools = callPackage ../applications/audio/opus-tools {
-        };
-        pamixer = callPackage ../applications/audio/pamixer {
-        };
-        pan = callPackage ../applications/networking/newsreaders/pan {
-          spellChecking = false;
-        };
-        panotools = callPackage ../applications/graphics/panotools {
-        };
-        pavucontrol = callPackage ../applications/audio/pavucontrol {
-        };
-        paraview = callPackage ../applications/graphics/paraview {
-        };
-        pencil = callPackage ../applications/graphics/pencil {
-        };
-        petrifoo = callPackage ../applications/audio/petrifoo {
-          inherit (gnome) libgnomecanvas;
-        };
-        pdftk = callPackage ../tools/typesetting/pdftk {
-        };
-        pdfgrep = callPackage ../tools/typesetting/pdfgrep {
-        };
-        pianobar = callPackage ../applications/audio/pianobar {
-        };
-        pianobooster = callPackage ../applications/audio/pianobooster {
-        };
-        picard = callPackage ../applications/audio/picard {
-        };
-        picocom = callPackage ../tools/misc/picocom {
-        };
-        pidgin = callPackage ../applications/networking/instant-messengers/pidgin {
-          openssl = if config.pidgin.openssl or true
-            then openssl
-            else null;
-          gnutls = if config.pidgin.gnutls or false
-            then gnutls
-            else null;
-          libgcrypt = if config.pidgin.gnutls or false
-            then libgcrypt
-            else null;
-          startupnotification = libstartup_notification;
-        };
-        pidginlatex = callPackage ../applications/networking/instant-messengers/pidgin-plugins/pidgin-latex {
-          imagemagick = imagemagickBig;
-        };
-        pidginlatexSF = builderDefsPackage (import ../applications/networking/instant-messengers/pidgin-plugins/pidgin-latex/pidgin-latex-sf.nix) {
-          inherit pkgconfig pidgin texLive
-          imagemagick which glib gtk;
-        };
-        pidginmsnpecan = callPackage ../applications/networking/instant-messengers/pidgin-plugins/msn-pecan {
-        };
-        pidginotr = callPackage ../applications/networking/instant-messengers/pidgin-plugins/otr {
-        };
-        pidginsipe = callPackage ../applications/networking/instant-messengers/pidgin-plugins/sipe {
-        };
-        toxprpl = callPackage ../applications/networking/instant-messengers/pidgin-plugins/tox-prpl {
-        };
-        pinfo = callPackage ../applications/misc/pinfo {
-        };
-        pinta = callPackage ../applications/graphics/pinta {
-          gtksharp = gtksharp2;
-        };
-        pommed = callPackage ../os-specific/linux/pommed {
-          inherit (xorg) libXpm;
-        };
-        potrace = callPackage ../applications/graphics/potrace {
-        };
-        posterazor = callPackage ../applications/misc/posterazor {
-        };
-        pqiv = callPackage ../applications/graphics/pqiv {
-        };
-        qiv = callPackage ../applications/graphics/qiv {
-        };
-        procmail = callPackage ../applications/misc/procmail {
-        };
-        pstree = callPackage ../applications/misc/pstree {
-        };
-        pulseview = callPackage ../applications/science/electronics/pulseview {
-        };
-        puredata = callPackage ../applications/audio/puredata {
-        };
-        pythonmagick = callPackage ../applications/graphics/PythonMagick {
-        };
-        qbittorrent = callPackage ../applications/networking/p2p/qbittorrent {
-        };
-        eiskaltdcpp = callPackage ../applications/networking/p2p/eiskaltdcpp {
-        };
-        qemu = callPackage ../applications/virtualization/qemu {
-        };
-        qmmp = callPackage ../applications/audio/qmmp {
-        };
-        qsampler = callPackage ../applications/audio/qsampler {
-        };
-        qsynth = callPackage ../applications/audio/qsynth {
-        };
-        qtpfsgui = callPackage ../applications/graphics/qtpfsgui {
-        };
-        qtractor = callPackage ../applications/audio/qtractor {
-        };
-        quodlibet = callPackage ../applications/audio/quodlibet {
-          inherit (pythonPackages) mutagen;
-        };
-        quodlibet-with-gst-plugins = callPackage ../applications/audio/quodlibet {
-          inherit (pythonPackages) mutagen;
-          withGstPlugins = true;
-          gst_plugins_bad = null;
-        };
-        rakarrack = callPackage ../applications/audio/rakarrack {
-          inherit (xorg) libXpm libXft;
-          fltk = fltk13;
-        };
-        rapcad = callPackage ../applications/graphics/rapcad {
-        };
-        rapidsvn = callPackage ../applications/version-management/rapidsvn {
-        };
-        ratpoison = callPackage ../applications/window-managers/ratpoison {
-        };
-        rawtherapee = callPackage ../applications/graphics/rawtherapee {
-          fftw = fftwSinglePrec;
-        };
-        rcs = callPackage ../applications/version-management/rcs {
-        };
-        rdesktop = callPackage ../applications/networking/remote/rdesktop {
-        };
-        recode = callPackage ../tools/text/recode {
-        };
-        retroshare = callPackage ../applications/networking/p2p/retroshare {
-          qt = qt4;
-        };
-        retroshare06 = lowPrio (callPackage ../applications/networking/p2p/retroshare/0.6.nix {
-          qt = qt4;
-        });
-        rsync = callPackage ../applications/networking/sync/rsync {
-          enableACLs = !(stdenv.isDarwin || stdenv.isSunOS || stdenv.isFreeBSD);
-          enableCopyDevicesPatch = config.rsync.enableCopyDevicesPatch or false;
-        };
-        rtl-sdr = callPackage ../applications/misc/rtl-sdr {
-        };
-        rubyripper = callPackage ../applications/audio/rubyripper {
-        };
-        rxvt = callPackage ../applications/misc/rxvt {
-        };
-        rxvt_unicode = callPackage ../applications/misc/rxvt_unicode {
-          perlSupport = true;
-          gdkPixbufSupport = true;
-          unicode3Support = true;
-        };
-        sakura = callPackage ../applications/misc/sakura {
-          inherit (gnome) vte;
-        };
-        sbagen = callPackage ../applications/misc/sbagen {
-        };
-        scite = callPackage ../applications/editors/scite {
-        };
-        scribus = callPackage ../applications/office/scribus {
-          inherit (gnome) libart_lgpl;
-        };
-        seafile-client = callPackage ../applications/networking/seafile-client {
-        };
-        seeks = callPackage ../tools/networking/p2p/seeks {
-          opencv = opencv_2_1;
-        };
-        seg3d = callPackage ../applications/graphics/seg3d {
-          wxGTK = wxGTK28.override {
-            unicode = false;
-          };
-        };
-        seq24 = callPackage ../applications/audio/seq24 {
-        };
-        setbfree = callPackage ../applications/audio/setbfree {
-        };
-        sflphone = callPackage ../applications/networking/instant-messengers/sflphone {
-          gtk = gtk3;
-        };
-        siproxd = callPackage ../applications/networking/siproxd {
-        };
-        skype = callPackage_i686 ../applications/networking/instant-messengers/skype {
-        };
-        skype4pidgin = callPackage ../applications/networking/instant-messengers/pidgin-plugins/skype4pidgin {
-        };
-        skype_call_recorder = callPackage ../applications/networking/instant-messengers/skype-call-recorder {
-        };
-        slrn = callPackage ../applications/networking/newsreaders/slrn {
-        };
-        spideroak = callPackage ../applications/networking/spideroak {
-        };
-        ssvnc = callPackage ../applications/networking/remote/ssvnc {
-        };
-        st = callPackage ../applications/misc/st {
-          conf = config.st.conf or null;
-        };
-        linuxstopmotion = callPackage ../applications/video/linuxstopmotion {
-        };
-        sweethome3d = recurseIntoAttrs (callPackage ../applications/misc/sweethome3d {
-        } // callPackage ../applications/misc/sweethome3d/editors.nix {
-          sweethome3dApp = sweethome3d.application;
-        });
-        sxiv = callPackage ../applications/graphics/sxiv {
-        };
-        bittorrentSync = callPackage ../applications/networking/bittorrentsync {
-        };
-        dropbox = callPackage ../applications/networking/dropbox {
-        };
-        dropbox-cli = callPackage ../applications/networking/dropbox-cli {
-        };
-        lightdm = callPackage ../applications/display-managers/lightdm {
-        };
-        lightdm_gtk_greeter = callPackage ../applications/display-managers/lightdm-gtk-greeter {
-        };
-        slic3r = callPackage ../applications/misc/slic3r {
-          perlPackages = perl514Packages;
-          perl = perl514;
-        };
-        curaengine = callPackage ../applications/misc/curaengine {
-        };
-        cura = callPackage ../applications/misc/cura {
-        };
-        printrun = callPackage ../applications/misc/printrun {
-        };
-        slim = callPackage ../applications/display-managers/slim {
-          libpng = libpng12;
-        };
-        smartdeblur = callPackage ../applications/graphics/smartdeblur {
-        };
-        snd = callPackage ../applications/audio/snd {
-        };
-        shntool = callPackage ../applications/audio/shntool {
-        };
-        sonic_visualiser = callPackage ../applications/audio/sonic-visualiser {
-          inherit (pkgs.vamp) vampSDK;
-          inherit (pkgs.xlibs) libX11;
-          fftw = pkgs.fftwSinglePrec;
-        };
-        sox = callPackage ../applications/misc/audio/sox {
-        };
-        soxr = callPackage ../applications/misc/audio/soxr {
-        };
-        spotify = callPackage ../applications/audio/spotify {
-          inherit (gnome) GConf;
-          libpng = libpng12;
-        };
-        libspotify = callPackage ../development/libraries/libspotify {
-          apiKey = config.libspotify.apiKey or null;
-        };
-        stalonetray = callPackage ../applications/window-managers/stalonetray {
-        };
-        stp = callPackage ../applications/science/logic/stp {
-        };
-        stumpwm = lispPackages.stumpwm;
-        sublime = callPackage ../applications/editors/sublime {
-        };
-        sublime3 = lowPrio (callPackage ../applications/editors/sublime3 {
-        });
-        subversion = callPackage ../applications/version-management/subversion/default.nix {
-          bdbSupport = true;
-          httpServer = false;
-          httpSupport = true;
-          pythonBindings = false;
-          perlBindings = false;
-          javahlBindings = false;
-          saslSupport = false;
-          httpd = apacheHttpd;
-          sasl = cyrus_sasl;
-        };
-        subversionClient = appendToName "client" (subversion.override {
-          bdbSupport = false;
-          perlBindings = true;
-          pythonBindings = true;
-        });
-        surf = callPackage ../applications/misc/surf {
-          webkit = webkitgtk2;
-        };
-        svk = perlPackages.SVK;
-        swh_lv2 = callPackage ../applications/audio/swh-lv2 {
-        };
-        sylpheed = callPackage ../applications/networking/mailreaders/sylpheed {
-          sslSupport = true;
-          gpgSupport = true;
-        };
-        symlinks = callPackage ../tools/system/symlinks {
-        };
-        syncthing = callPackage ../applications/networking/syncthing {
-        };
-        synergy = callPackage ../applications/misc/synergy {
-        };
-        tabbed = callPackage ../applications/window-managers/tabbed {
-        };
-        tahoelafs = callPackage ../tools/networking/p2p/tahoe-lafs {
-          inherit (pythonPackages) twisted
-          foolscap simplejson nevow zfec
-          pycryptopp sqlite3 darcsver
-          setuptoolsTrial setuptoolsDarcs
-          numpy pyasn1 mock;
-        };
-        tailor = builderDefsPackage (import ../applications/version-management/tailor) {
-          inherit makeWrapper python;
-        };
-        tangogps = callPackage ../applications/misc/tangogps {
-          gconf = gnome.GConf;
-        };
-        teamspeak_client = callPackage ../applications/networking/instant-messengers/teamspeak/client.nix {
-        };
-        teamspeak_server = callPackage ../applications/networking/instant-messengers/teamspeak/server.nix {
-        };
-        taskjuggler = callPackage ../applications/misc/taskjuggler {
-        };
-        taskwarrior = callPackage ../applications/misc/taskwarrior {
-        };
-        taskserver = callPackage ../servers/misc/taskserver {
-        };
-        telegram-cli = callPackage ../applications/networking/instant-messengers/telegram-cli/default.nix {
-        };
-        telepathy_gabble = callPackage ../applications/networking/instant-messengers/telepathy/gabble {
-        };
-        telepathy_haze = callPackage ../applications/networking/instant-messengers/telepathy/haze {
-        };
-        telepathy_logger = callPackage ../applications/networking/instant-messengers/telepathy/logger {
-        };
-        telepathy_mission_control = callPackage ../applications/networking/instant-messengers/telepathy/mission-control {
-        };
-        telepathy_rakia = callPackage ../applications/networking/instant-messengers/telepathy/rakia {
-        };
-        telepathy_salut = callPackage ../applications/networking/instant-messengers/telepathy/salut {
-        };
-        terminator = callPackage ../applications/misc/terminator {
-          vte = gnome.vte.override {
-            pythonSupport = true;
-          };
-          inherit (pythonPackages) notify;
-        };
-        tesseract = callPackage ../applications/graphics/tesseract {
-        };
-        thinkingRock = callPackage ../applications/misc/thinking-rock {
-        };
-        thunderbird = callPackage ../applications/networking/mailreaders/thunderbird {
-          inherit (gnome) libIDL;
-          inherit (pythonPackages) pysqlite;
-          libpng = libpng_apng;
-        };
-        thunderbird-bin = callPackage ../applications/networking/mailreaders/thunderbird-bin {
-          gconf = pkgs.gnome.GConf;
-          inherit (pkgs.gnome) libgnome
-          libgnomeui;
-          inherit (pkgs.xlibs) libX11
-          libXScrnSaver libXext
-          libXinerama libXrender libXt;
-        };
-        tig = gitAndTools.tig;
-        timidity = callPackage ../tools/misc/timidity {
-        };
-        tint2 = callPackage ../applications/misc/tint2 {
-        };
-        tkcvs = callPackage ../applications/version-management/tkcvs {
-        };
-        tla = callPackage ../applications/version-management/arch {
-        };
-        todo-txt-cli = callPackage ../applications/office/todo.txt-cli {
-        };
-        torchat = callPackage ../applications/networking/instant-messengers/torchat {
-          wrapPython = pythonPackages.wrapPython;
-        };
-        toxic = callPackage ../applications/networking/instant-messengers/toxic {
-        };
-        transcode = callPackage ../applications/audio/transcode {
-        };
-        transmission = callPackage ../applications/networking/p2p/transmission {
-        };
-        transmission_gtk = transmission.override {
-          enableGTK3 = true;
-        };
-        transmission_remote_gtk = callPackage ../applications/networking/p2p/transmission-remote-gtk {
-        };
-        trayer = callPackage ../applications/window-managers/trayer {
-        };
-        tree = callPackage ../tools/system/tree {
-        };
-        tribler = callPackage ../applications/networking/p2p/tribler {
-        };
-        twister = callPackage ../applications/networking/p2p/twister {
-        };
-        twmn = callPackage ../applications/misc/twmn {
-        };
-        twinkle = callPackage ../applications/networking/instant-messengers/twinkle {
-        };
-        umurmur = callPackage ../applications/networking/umurmur {
-        };
-        unison = callPackage ../applications/networking/sync/unison {
-          inherit (ocamlPackages) lablgtk;
-          enableX11 = config.unison.enableX11 or true;
-        };
-        uucp = callPackage ../tools/misc/uucp {
-        };
-        uvccapture = callPackage ../applications/video/uvccapture {
-        };
-        uwimap = callPackage ../tools/networking/uwimap {
-        };
-        uzbl = callPackage ../applications/networking/browsers/uzbl {
-          webkit = webkitgtk2;
-        };
-        uTox = callPackage ../applications/networking/instant-messengers/utox {
-        };
-        vanitygen = callPackage ../applications/misc/vanitygen {
-        };
-        vbindiff = callPackage ../applications/editors/vbindiff {
-        };
-        vcprompt = callPackage ../applications/version-management/vcprompt {
-        };
-        vdpauinfo = callPackage ../tools/X11/vdpauinfo {
-        };
-        veracity = callPackage ../applications/version-management/veracity {
-        };
-        viewMtn = builderDefsPackage (import ../applications/version-management/viewmtn/0.10.nix) {
-          inherit monotone cheetahTemplate
-          highlight ctags makeWrapper
-          graphviz which python;
-          flup = pythonPackages.flup;
-        };
-        vim = callPackage ../applications/editors/vim {
-        };
-        macvim = callPackage ../applications/editors/vim/macvim.nix {
-        };
-        vimHugeX = vim_configurable;
-        vim_configurable = callPackage ../applications/editors/vim/configurable.nix {
-          inherit (pkgs) fetchurl fetchhg
-          stdenv ncurses pkgconfig gettext
-          composableDerivation lib config
-          glib gtk python perl tcl ruby;
-          inherit (pkgs.xlibs) libX11
-          libXext libSM libXpm libXt
-          libXaw libXau libXmu libICE;
-          features = "huge";
-          lua = pkgs.lua5;
-          gui = config.vim.gui or "auto";
-          flags = [ "python" "X11" ];
-          inherit stdenvAdapters gccApple;
-        };
-        vimNox = lowPrio (vim_configurable.override {
-          source = "vim-nox";
-        });
-        qvim = lowPrio (callPackage ../applications/editors/vim/qvim.nix {
-          inherit (pkgs) fetchgit stdenv
-          ncurses pkgconfig gettext
-          composableDerivation lib config
-          python perl tcl ruby qt4;
-          inherit (pkgs.xlibs) libX11
-          libXext libSM libXpm libXt
-          libXaw libXau libXmu libICE;
-          inherit (pkgs) stdenvAdapters
-          gccApple;
-          features = "huge";
-          lua = pkgs.lua5;
-          flags = [ "python" "X11" ];
-        });
-        vimpc = callPackage ../applications/audio/vimpc {
-        };
-        virtviewer = callPackage ../applications/virtualization/virt-viewer {
-          gtkvnc = gtkvnc.override {
-            enableGTK3 = true;
-          };
-          spice_gtk = spice_gtk.override {
-            enableGTK3 = true;
-          };
-        };
-        virtmanager = callPackage ../applications/virtualization/virt-manager {
-          inherit (gnome) gnome_python;
-          vte = gnome3.vte;
-          dconf = gnome3.dconf;
-          gtkvnc = gtkvnc.override {
-            enableGTK3 = true;
-          };
-          spice_gtk = spice_gtk.override {
-            enableGTK3 = true;
-          };
-        };
-        virtinst = callPackage ../applications/virtualization/virtinst {
-        };
-        virtualgl = callPackage ../tools/X11/virtualgl {
-        };
-        bumblebee = callPackage ../tools/X11/bumblebee {
-        };
-        vkeybd = callPackage ../applications/audio/vkeybd {
-          inherit (xlibs) libX11;
-        };
-        vlc = callPackage ../applications/video/vlc {
-        };
-        vmpk = callPackage ../applications/audio/vmpk {
-        };
-        vnstat = callPackage ../applications/networking/vnstat {
-        };
-        vorbisTools = callPackage ../applications/audio/vorbis-tools {
-        };
-        vue = callPackage ../applications/misc/vue {
-          jre = icedtea7_jre;
-        };
-        vwm = callPackage ../applications/window-managers/vwm {
-        };
-        vym = callPackage ../applications/misc/vym {
-        };
-        w3m = callPackage ../applications/networking/browsers/w3m {
-          graphicsSupport = false;
-        };
-        weechat = callPackage ../applications/networking/irc/weechat {
-        };
-        weechatDevel = lowPrio (callPackage ../applications/networking/irc/weechat/devel.nix {
-        });
-        weston = callPackage ../applications/window-managers/weston {
-        };
-        windowmaker = callPackage ../applications/window-managers/windowmaker {
-        };
-        winswitch = callPackage ../tools/X11/winswitch {
-        };
-        wings = callPackage ../applications/graphics/wings {
-          erlang = erlangR14;
-          esdl = esdl.override {
-            erlang = erlangR14;
-          };
-        };
-        wmname = callPackage ../applications/misc/wmname {
-        };
-        wmctrl = callPackage ../tools/X11/wmctrl {
-        };
-        wmiimenu = import ../applications/window-managers/wmii31 {
-          libixp = libixp_for_wmii;
-          inherit fetchurl stdenv gawk;
-          inherit (xlibs) libX11;
-        };
-        wmiiSnap = import ../applications/window-managers/wmii {
-          libixp = libixp_for_wmii;
-          inherit fetchurl stdenv gawk;
-          inherit (xlibs) libX11 xextproto
-          libXt libXext;
-          includeUnpack = config.stdenv.includeUnpack or false;
-        };
-        wordnet = callPackage ../applications/misc/wordnet {
-        };
-        wrapChromium = browser:
-        wrapFirefox {
-          inherit browser;
-          browserName = browser.packageName;
-          desktopName = "Chromium";
-          icon = "${browser}/share/icons/hicolor/48x48/apps/${browser.packageName}.png";
-        };
-        wrapFirefox = { browser, browserName ? "firefox", desktopName ? "Firefox", icon ? "${browser}/lib/${browser.name}/browser/icons/mozicon128.png", nameSuffix ? "" }:
-        let
-          cfg = stdenv.lib.attrByPath [
-            browserName
-          ] { } config;
-          enableAdobeFlash = cfg.enableAdobeFlash or false;
-          enableGnash = cfg.enableGnash or false;
-          in import ../applications/networking/browsers/firefox/wrapper.nix {
-            inherit stdenv lib makeWrapper
-            makeDesktopItem browser
-            browserName desktopName
-            nameSuffix icon;
-            plugins = assert !(enableGnash && enableAdobeFlash); [
-            ] ++ lib.optional enableGnash gnash ++ lib.optional enableAdobeFlash flashplayer ++ lib.optional (cfg.enableDjvu or false) djview4 ++ lib.optional (cfg.enableMPlayer or false) (MPlayerPlugin browser) ++ lib.optional (cfg.enableGeckoMediaPlayer or false) gecko_mediaplayer ++ lib.optional (supportsJDK && (cfg.jre or false && jrePlugin ? mozillaPlugin)) jrePlugin ++ lib.optional (cfg.enableGoogleTalkPlugin or false) google_talk_plugin ++ lib.optional (cfg.enableFriBIDPlugin or false) fribid ++ lib.optional (cfg.enableGnomeExtensions or false) gnome3.gnome_shell;
-            libs = [
-              gstreamer
-              gst_plugins_base
-            ] ++ lib.optionals (cfg.enableQuakeLive or false) (with xlibs; [
-              stdenv.gcc
-              libX11
-              libXxf86dga
-              libXxf86vm
-              libXext
-              libXt
-              alsaLib
-              zlib
-            ]);
-            gtk_modules = [ libcanberra ];
-          };
-        x11vnc = callPackage ../tools/X11/x11vnc {
-        };
-        x2vnc = callPackage ../tools/X11/x2vnc {
-        };
-        xaos = builderDefsPackage (import ../applications/graphics/xaos) {
-          inherit (xlibs) libXt libX11
-          libXext xextproto xproto;
-          inherit gsl aalib zlib intltool
-          gettext perl;
-          libpng = libpng12;
-        };
-        xara = callPackage ../applications/graphics/xara {
-        };
-        xawtv = callPackage ../applications/video/xawtv {
-        };
-        xbindkeys = callPackage ../tools/X11/xbindkeys {
-        };
-        xbmc = callPackage ../applications/video/xbmc {
-          ffmpeg = ffmpeg_1;
-        };
-        xca = callPackage ../applications/misc/xca {
-        };
-        xcalib = callPackage ../tools/X11/xcalib {
-        };
-        xcape = callPackage ../tools/X11/xcape {
-        };
-        xchainkeys = callPackage ../tools/X11/xchainkeys {
-        };
-        xchat = callPackage ../applications/networking/irc/xchat {
-        };
-        xchm = callPackage ../applications/misc/xchm {
-        };
-        xcompmgr = callPackage ../applications/window-managers/xcompmgr {
-        };
-        compton = callPackage ../applications/window-managers/compton {
-        };
-        xdaliclock = callPackage ../tools/misc/xdaliclock {
-        };
-        xdg-user-dirs = callPackage ../tools/X11/xdg-user-dirs {
-        };
-        xdg_utils = callPackage ../tools/X11/xdg-utils {
-        };
-        xdotool = callPackage ../tools/X11/xdotool {
-        };
-        xen = callPackage ../applications/virtualization/xen {
-          stdenv = overrideGCC stdenv gcc45;
-        };
-        xfe = callPackage ../applications/misc/xfe {
-          fox = fox_1_6;
-        };
-        xfig = callPackage ../applications/graphics/xfig {
-        };
-        xineUI = callPackage ../applications/video/xine-ui {
-        };
-        xneur_0_13 = callPackage ../applications/misc/xneur {
-        };
-        xneur_0_8 = callPackage ../applications/misc/xneur/0.8.nix {
-        };
-        xneur = xneur_0_13;
-        gxneur = callPackage ../applications/misc/gxneur {
-          inherit (gnome) libglade GConf;
-        };
-        xournal = callPackage ../applications/graphics/xournal {
-          inherit (gnome) libgnomeprint
-          libgnomeprintui libgnomecanvas;
-        };
-        xpdf = callPackage ../applications/misc/xpdf {
-          motif = lesstif;
-          base14Fonts = "${ghostscript}/share/ghostscript/fonts";
-        };
-        xkb_switch = callPackage ../tools/X11/xkb-switch {
-        };
-        libxpdf = callPackage ../applications/misc/xpdf/libxpdf.nix {
-        };
-        xpra = callPackage ../tools/X11/xpra {
-        };
-        xrestop = callPackage ../tools/X11/xrestop {
-        };
-        xscreensaver = callPackage ../misc/screensavers/xscreensaver {
-          inherit (gnome) libglade;
-        };
-        xsynth_dssi = callPackage ../applications/audio/xsynth-dssi {
-        };
-        xterm = callPackage ../applications/misc/xterm {
-        };
-        finalterm = callPackage ../applications/misc/finalterm {
-        };
-        xtrace = callPackage ../tools/X11/xtrace {
-        };
-        xlaunch = callPackage ../tools/X11/xlaunch {
-        };
-        xmacro = callPackage ../tools/X11/xmacro {
-        };
-        xmove = callPackage ../applications/misc/xmove {
-        };
-        xmp = callPackage ../applications/audio/xmp {
-        };
-        xnee = callPackage ../tools/X11/xnee {
-          stdenv = overrideInStdenv stdenv [
-            gnumake381
-          ];
-        };
-        xvidcap = callPackage ../applications/video/xvidcap {
-          inherit (gnome) scrollkeeper
-          libglade;
-        };
-        yate = callPackage ../applications/misc/yate {
-        };
-        inherit (gnome3) yelp;
-        qgis = callPackage ../applications/misc/qgis {
-        };
-        qtbitcointrader = callPackage ../applications/misc/qtbitcointrader {
-        };
-        ykpers = callPackage ../applications/misc/ykpers {
-        };
-        yoshimi = callPackage ../applications/audio/yoshimi {
-          fltk = fltk13;
-        };
-        zathuraCollection = recurseIntoAttrs (let
-          callPackage = newScope pkgs.zathuraCollection;
-          in import ../applications/misc/zathura {
-            inherit callPackage pkgs
-            fetchurl;
-            useMupdf = config.zathura.useMupdf or false;
-          });
-        zathura = zathuraCollection.zathuraWrapper;
-        zed = callPackage ../applications/editors/zed {
-        };
-        zeroc_ice = callPackage ../development/libraries/zeroc-ice {
-        };
-        girara = callPackage ../applications/misc/girara {
-          gtk = gtk3;
-        };
-        zgrviewer = callPackage ../applications/graphics/zgrviewer {
-        };
-        zotero = callPackage ../applications/office/zotero {
-          xulrunner = xulrunner_30;
-        };
-        zynaddsubfx = callPackage ../applications/audio/zynaddsubfx {
-        };
-        alienarena = callPackage ../games/alienarena {
-        };
-        andyetitmoves = if stdenv.isLinux
-          then callPackage ../games/andyetitmoves {
-          }
-          else null;
-        anki = callPackage ../games/anki {
-        };
-        asc = callPackage ../games/asc {
-          lua = lua5;
-          libsigcxx = libsigcxx12;
-        };
-        astromenace = callPackage ../games/astromenace {
-        };
-        atanks = callPackage ../games/atanks {
-        };
-        ballAndPaddle = callPackage ../games/ball-and-paddle {
-          guile = guile_1_8;
-        };
-        bitsnbots = callPackage ../games/bitsnbots {
-          lua = lua5;
-        };
-        blackshades = callPackage ../games/blackshades {
-        };
-        blackshadeselite = callPackage ../games/blackshadeselite {
-        };
-        blobby = callPackage ../games/blobby {
-        };
-        bsdgames = callPackage ../games/bsdgames {
-        };
-        btanks = callPackage ../games/btanks {
-        };
-        bzflag = callPackage ../games/bzflag {
-        };
-        castle_combat = callPackage ../games/castle-combat {
-        };
-        chessdb = callPackage ../games/chessdb {
-        };
-        construoBase = lowPrio (callPackage ../games/construo {
-          mesa = null;
-          freeglut = null;
-        });
-        construo = construoBase.override {
-          inherit mesa freeglut;
-        };
-        crack_attack = callPackage ../games/crack-attack {
-        };
-        crafty = callPackage ../games/crafty {
-        };
-        craftyFull = appendToName "full" (crafty.override {
-          fullVariant = true;
-        });
-        crrcsim = callPackage ../games/crrcsim {
-        };
-        dhewm3 = callPackage ../games/dhewm3 {
-        };
-        drumkv1 = callPackage ../applications/audio/drumkv1 {
-        };
-        dwarf_fortress = callPackage_i686 ../games/dwarf-fortress {
-          SDL_image = pkgsi686Linux.SDL_image.override {
-            libpng = pkgsi686Linux.libpng12;
-          };
-        };
-        dwarf_fortress_2014 = callPackage_i686 ../games/dwarf-fortress/df2014.nix {
-          SDL_image = pkgsi686Linux.SDL_image.override {
-            libpng = pkgsi686Linux.libpng12;
-          };
-        };
-        dwarf_fortress_modable = appendToName "moddable" (dwarf_fortress.override {
-          copyDataDirectory = true;
-        });
-        dwarf_fortress_2014_modable = appendToName "moddable" (dwarf_fortress_2014.override {
-          copyDataDirectory = true;
-        });
-        dwarf-therapist = callPackage ../games/dwarf-therapist {
-        };
-        d1x_rebirth = callPackage ../games/d1x-rebirth {
-        };
-        d2x_rebirth = callPackage ../games/d2x-rebirth {
-        };
-        eboard = callPackage ../games/eboard {
-        };
-        eduke32 = callPackage ../games/eduke32 {
-        };
-        egoboo = callPackage ../games/egoboo {
-        };
-        exult = callPackage ../games/exult {
-        };
-        flightgear = callPackage ../games/flightgear {
-        };
-        freeciv = callPackage ../games/freeciv {
-        };
-        freeciv_gtk = callPackage ../games/freeciv {
-          gtkClient = true;
-          sdlClient = false;
-        };
-        freedink = callPackage ../games/freedink {
-        };
-        fsg = callPackage ../games/fsg {
-          wxGTK = wxGTK28.override {
-            unicode = false;
-          };
-        };
-        gemrb = callPackage ../games/gemrb {
-        };
-        gl117 = callPackage ../games/gl-117 {
-        };
-        glestae = callPackage ../games/glestae {
-        };
-        globulation2 = callPackage ../games/globulation {
-        };
-        gltron = callPackage ../games/gltron {
-        };
-        gnuchess = callPackage ../games/gnuchess {
-        };
-        gnugo = callPackage ../games/gnugo {
-        };
-        gparted = callPackage ../tools/misc/gparted {
-        };
-        gsmartcontrol = callPackage ../tools/misc/gsmartcontrol {
-          inherit (gnome) libglademm;
-        };
-        gtypist = callPackage ../games/gtypist {
-        };
-        hexen = callPackage ../games/hexen {
-        };
-        icbm3d = callPackage ../games/icbm3d {
-        };
-        ingen = callPackage ../applications/audio/ingen {
-        };
-        instead = callPackage ../games/instead {
-          lua = lua5;
-        };
-        kobodeluxe = callPackage ../games/kobodeluxe {
-        };
-        lincity = builderDefsPackage (import ../games/lincity) {
-          inherit (xlibs) libX11 libXext
-          xextproto libICE libSM xproto;
-          inherit libpng zlib;
-        };
-        lincity_ng = callPackage ../games/lincity/ng.nix {
-        };
-        mars = callPackage ../games/mars {
-        };
-        micropolis = callPackage ../games/micropolis {
-        };
-        mnemosyne = callPackage ../games/mnemosyne {
-          inherit (pythonPackages) matplotlib
-          cherrypy sqlite3;
-        };
-        naev = callPackage ../games/naev {
-        };
-        nexuiz = callPackage ../games/nexuiz {
-        };
-        njam = callPackage ../games/njam {
-        };
-        oilrush = callPackage ../games/oilrush {
-        };
-        openra = callPackage ../games/openra {
-        };
-        openttd = callPackage ../games/openttd {
-          zlib = zlibStatic;
-        };
-        opentyrian = callPackage ../games/opentyrian {
-        };
-        openxcom = callPackage ../games/openxcom {
-        };
-        pingus = callPackage ../games/pingus {
-        };
-        pioneers = callPackage ../games/pioneers {
-        };
-        pong3d = callPackage ../games/pong3d {
-        };
-        prboom = callPackage ../games/prboom {
-        };
-        quake3demo = callPackage ../games/quake3/wrapper {
-          name = "quake3-demo-${quake3game.name}";
-          description = "Demo of Quake 3 Arena, a classic first-person shooter";
-          game = quake3game;
-          paks = [ quake3demodata ];
-        };
-        quake3demodata = callPackage ../games/quake3/demo {
-        };
-        quake3game = callPackage ../games/quake3/game {
-        };
-        quantumminigolf = callPackage ../games/quantumminigolf {
-        };
-        racer = callPackage ../games/racer {
-        };
-        residualvm = callPackage ../games/residualvm {
-          openglSupport = mesaSupported;
-        };
-        rigsofrods = callPackage ../games/rigsofrods {
-          mygui = myguiSvn;
-        };
-        rili = callPackage ../games/rili {
-        };
-        rogue = callPackage ../games/rogue {
-        };
-        samplv1 = callPackage ../applications/audio/samplv1 {
-        };
-        sauerbraten = callPackage ../games/sauerbraten {
-        };
-        scid = callPackage ../games/scid {
-        };
-        scummvm = callPackage ../games/scummvm {
-        };
-        scorched3d = callPackage ../games/scorched3d {
-        };
-        sdlmame = callPackage ../games/sdlmame {
-        };
-        sgtpuzzles = builderDefsPackage (import ../games/sgt-puzzles) {
-          inherit pkgconfig fetchsvn perl
-          gtk;
-          inherit (xlibs) libX11;
-        };
-        simutrans = callPackage ../games/simutrans {
-        };
-        soi = callPackage ../games/soi {
-        };
-        spaceOrbit = callPackage ../games/orbit {
-        };
-        spring = callPackage ../games/spring {
-        };
-        springLobby = callPackage ../games/spring/springlobby.nix {
-        };
-        stardust = callPackage ../games/stardust {
-        };
-        steam = callPackage_i686 ../games/steam {
-        };
-        steamChrootEnv = callPackage_i686 ../games/steam/chrootenv.nix {
-          zenity = gnome2.zenity;
-        };
-        stuntrally = callPackage ../games/stuntrally {
-        };
-        superTux = callPackage ../games/super-tux {
-        };
-        superTuxKart = callPackage ../games/super-tux-kart {
-        };
-        synthv1 = callPackage ../applications/audio/synthv1 {
-        };
-        tbe = callPackage ../games/the-butterfly-effect {
-        };
-        teetertorture = callPackage ../games/teetertorture {
-        };
-        teeworlds = callPackage ../games/teeworlds {
-        };
-        tennix = callPackage ../games/tennix {
-        };
-        tibia = callPackage ../games/tibia {
-        };
-        tintin = callPackage ../games/tintin {
-        };
-        tpm = callPackage ../games/thePenguinMachine {
-        };
-        tremulous = callPackage ../games/tremulous {
-        };
-        speed_dreams = callPackage ../games/speed-dreams {
-          plib = plib.override {
-            enablePIC = !stdenv.isi686;
-          };
-          libpng = libpng12;
-        };
-        torcs = callPackage ../games/torcs {
-          plib = plib.override {
-            enablePIC = !stdenv.isi686;
-          };
-        };
-        trigger = callPackage ../games/trigger {
-        };
-        typespeed = callPackage ../games/typespeed {
-        };
-        ufoai = callPackage ../games/ufoai {
-        };
-        ultimatestunts = callPackage ../games/ultimatestunts {
-        };
-        ultrastardx = callPackage ../games/ultrastardx {
-          ffmpeg = ffmpeg_0_6;
-          lua = lua5;
-        };
-        unvanquished = callPackage ../games/unvanquished {
-        };
-        uqm = callPackage ../games/uqm {
-        };
-        urbanterror = callPackage ../games/urbanterror {
-        };
-        ut2004demo = callPackage ../games/ut2004demo {
-        };
-        vdrift = callPackage ../games/vdrift {
-        };
-        vectoroids = callPackage ../games/vectoroids {
-        };
-        vessel = callPackage_i686 ../games/vessel {
-        };
-        warmux = callPackage ../games/warmux {
-        };
-        warsow = callPackage ../games/warsow {
-          libjpeg = libjpeg62;
-        };
-        warzone2100 = callPackage ../games/warzone2100 {
-        };
-        widelands = callPackage ../games/widelands {
-          lua = lua5_1;
-        };
-        worldofgoo_demo = callPackage ../games/worldofgoo {
-          demo = true;
-        };
-        worldofgoo = callPackage ../games/worldofgoo {
-        };
-        xboard = callPackage ../games/xboard {
-        };
-        xconq = callPackage ../games/xconq {
-        };
-        xonotic = callPackage ../games/xonotic {
-        };
-        xskat = callPackage ../games/xskat {
-        };
-        xsokoban = builderDefsPackage (import ../games/xsokoban) {
-          inherit (xlibs) libX11 xproto
-          libXpm libXt;
-        };
-        zdoom = callPackage ../games/zdoom {
-        };
-        zod = callPackage ../games/zod {
-        };
-        zoom = callPackage ../games/zoom {
-        };
-        keen4 = callPackage ../games/keen4 {
-        };
-        zeroad = callPackage ../games/0ad {
-        };
-        cinnamon = recurseIntoAttrs rec {
-          callPackage = newScope pkgs.cinnamon;
-          inherit (gnome3) gnome_common
-          libgnomekbd gnome-menus zenity;
-          muffin = callPackage ../desktops/cinnamon/muffin.nix {
-          };
-          cinnamon-control-center = callPackage ../desktops/cinnamon/cinnamon-control-center.nix {
-          };
-          cinnamon-settings-daemon = callPackage ../desktops/cinnamon/cinnamon-settings-daemon.nix {
-          };
-          cinnamon-session = callPackage ../desktops/cinnamon/cinnamon-session.nix {
-          };
-          cinnamon-desktop = callPackage ../desktops/cinnamon/cinnamon-desktop.nix {
-          };
-          cinnamon-translations = callPackage ../desktops/cinnamon/cinnamon-translations.nix {
-          };
-          cjs = callPackage ../desktops/cinnamon/cjs.nix {
-          };
-        };
-        enlightenment = callPackage ../desktops/enlightenment {
-        };
-        e17 = recurseIntoAttrs (let
-          callPackage = newScope pkgs.e17;
-          in import ../desktops/e17 {
-            inherit callPackage pkgs;
-          });
-        e18 = recurseIntoAttrs (let
-          callPackage = newScope pkgs.e18;
-          in import ../desktops/e18 {
-            inherit callPackage pkgs;
-          });
-        gnome2 = callPackage ../desktops/gnome-2 {
-          callPackage = pkgs.newScope pkgs.gnome2;
-          self = pkgs.gnome2;
-        } // pkgs.gtkLibs // {
-          inherit (pkgs) libsoup libwnck
-          gtk_doc gnome_doc_utils;
-        };
-        gnome3 = recurseIntoAttrs (callPackage ../desktops/gnome-3/3.10 {
-          callPackage = pkgs.newScope pkgs.gnome3;
-          self = pkgs.gnome3;
-        });
-        gnome3_12 = recurseIntoAttrs (callPackage ../desktops/gnome-3/3.12 {
-          callPackage = pkgs.newScope pkgs.gnome3_12;
-        });
-        gnome = recurseIntoAttrs gnome2;
-        hsetroot = callPackage ../tools/X11/hsetroot {
-        };
-        kakasi = callPackage ../tools/text/kakasi {
-        };
-        kde4 = recurseIntoAttrs pkgs.kde412;
-        kde4_next = recurseIntoAttrs (lib.lowPrioSet pkgs.kde412);
-        kde412 = kdePackagesFor (pkgs.kde412 // {
-          eigen = eigen2;
-          libusb = libusb1;
-          libcanberra = libcanberra_kde;
-        }) ../desktops/kde-4.12;
-        kdePackagesFor = self: dir: let
-          callPackageOrig = callPackage;
-          in let
-            callPackage = newScope self;
-            kde4 = callPackageOrig dir {
-              inherit callPackage
-              callPackageOrig;
-            };
-            in kde4 // {
-              inherit kde4;
-              wrapper = callPackage ../build-support/kdewrapper {
-              };
-              recurseForRelease = true;
-              akunambol = callPackage ../applications/networking/sync/akunambol {
-              };
-              amarok = callPackage ../applications/audio/amarok {
-              };
-              bangarang = callPackage ../applications/video/bangarang {
-              };
-              basket = callPackage ../applications/office/basket {
-              };
-              bluedevil = callPackage ../tools/bluetooth/bluedevil {
-              };
-              calligra = callPackage ../applications/office/calligra {
-              };
-              colord-kde = callPackage ../tools/misc/colord-kde {
-              };
-              digikam = if builtins.compareVersions "4.9" kde4.release == 1
-                then callPackage ../applications/graphics/digikam/2.nix {
-                }
-                else callPackage ../applications/graphics/digikam {
-                };
-              eventlist = callPackage ../applications/office/eventlist {
-              };
-              k3b = callPackage ../applications/misc/k3b {
-              };
-              kadu = callPackage ../applications/networking/instant-messengers/kadu {
-              };
-              kbibtex = callPackage ../applications/office/kbibtex {
-              };
-              kde_gtk_config = callPackage ../tools/misc/kde-gtk-config {
-              };
-              kde_wacomtablet = callPackage ../applications/misc/kde-wacomtablet {
-              };
-              kdeconnect = callPackage ../applications/misc/kdeconnect {
-              };
-              kdenlive = callPackage ../applications/video/kdenlive {
-                mlt = mlt-qt4;
-              };
-              kdesvn = callPackage ../applications/version-management/kdesvn {
-              };
-              kdevelop = callPackage ../applications/editors/kdevelop {
-              };
-              kdevplatform = callPackage ../development/libraries/kdevplatform {
-              };
-              kdiff3 = callPackage ../tools/text/kdiff3 {
-              };
-              kile = callPackage ../applications/editors/kile {
-              };
-              kmplayer = callPackage ../applications/video/kmplayer {
-              };
-              kmymoney = callPackage ../applications/office/kmymoney {
-              };
-              kipi_plugins = callPackage ../applications/graphics/kipi-plugins {
-              };
-              konversation = callPackage ../applications/networking/irc/konversation {
-              };
-              kvirc = callPackage ../applications/networking/irc/kvirc {
-              };
-              krename = callPackage ../applications/misc/krename {
-              };
-              krusader = callPackage ../applications/misc/krusader {
-              };
-              ksshaskpass = callPackage ../tools/security/ksshaskpass {
-              };
-              ktorrent = callPackage ../applications/networking/p2p/ktorrent {
-              };
-              kuickshow = callPackage ../applications/graphics/kuickshow {
-              };
-              libalkimia = callPackage ../development/libraries/libalkimia {
-              };
-              libktorrent = callPackage ../development/libraries/libktorrent {
-              };
-              libkvkontakte = callPackage ../development/libraries/libkvkontakte {
-              };
-              liblikeback = callPackage ../development/libraries/liblikeback {
-              };
-              libmm-qt = callPackage ../development/libraries/libmm-qt {
-              };
-              libnm-qt = callPackage ../development/libraries/libnm-qt {
-              };
-              networkmanagement = callPackage ../tools/networking/networkmanagement {
-              };
-              partitionManager = callPackage ../tools/misc/partition-manager {
-              };
-              plasma-nm = callPackage ../tools/networking/plasma-nm {
-              };
-              polkit_kde_agent = callPackage ../tools/security/polkit-kde-agent {
-              };
-              psi = callPackage ../applications/networking/instant-messengers/psi {
-              };
-              qtcurve = callPackage ../misc/themes/qtcurve {
-              };
-              quassel = callPackage ../applications/networking/irc/quassel {
-                dconf = gnome3.dconf;
-              };
-              quasselWithoutKDE = self.quassel.override {
-                withKDE = false;
-                tag = "-without-kde";
-              };
-              quasselDaemon = self.quassel.override {
-                monolithic = false;
-                daemon = true;
-                tag = "-daemon";
-              };
-              quasselClient = self.quassel.override {
-                monolithic = false;
-                client = true;
-                tag = "-client";
-              };
-              quasselClientWithoutKDE = self.quasselClient.override {
-                withKDE = false;
-                tag = "-client-without-kde";
-              };
-              rekonq = callPackage ../applications/networking/browsers/rekonq {
-              };
-              kwebkitpart = callPackage ../applications/networking/browsers/kwebkitpart {
-              };
-              rsibreak = callPackage ../applications/misc/rsibreak {
-              };
-              semnotes = callPackage ../applications/misc/semnotes {
-              };
-              skrooge = callPackage ../applications/office/skrooge {
-              };
-              telepathy = callPackage ../applications/networking/instant-messengers/telepathy/kde {
-              };
-              yakuake = callPackage ../applications/misc/yakuake {
-              };
-              zanshin = callPackage ../applications/office/zanshin {
-              };
-              kwooty = callPackage ../applications/networking/newsreaders/kwooty {
-              };
-            };
-        redshift = callPackage ../applications/misc/redshift {
-          inherit (xorg) libX11 libXrandr
-          libxcb randrproto libXxf86vm
-          xf86vidmodeproto;
-          inherit (gnome) GConf;
-          inherit (pythonPackages) pyxdg;
-          geoclue = geoclue2;
-        };
-        oxygen_gtk = callPackage ../misc/themes/gtk2/oxygen-gtk {
-        };
-        gtk_engines = callPackage ../misc/themes/gtk2/gtk-engines {
-        };
-        gtk-engine-murrine = callPackage ../misc/themes/gtk2/gtk-engine-murrine {
-        };
-        gnome_themes_standard = gnome3.gnome_themes_standard;
-        mate-icon-theme = callPackage ../misc/themes/mate-icon-theme {
-        };
-        mate-themes = callPackage ../misc/themes/mate-themes {
-        };
-        xfce = xfce4_10;
-        xfce4_10 = recurseIntoAttrs (import ../desktops/xfce {
-          inherit pkgs newScope;
-        });
-        drgeo = builderDefsPackage (import ../applications/science/geometry/drgeo) {
-          inherit (gnome) libglade;
-          inherit libxml2 perl intltool
-          libtool pkgconfig gtk;
-          guile = guile_1_8;
-        };
-        tetgen = callPackage ../applications/science/geometry/tetgen {
-        };
-        alliance = callPackage ../applications/science/electronics/alliance {
-          motif = lesstif;
-        };
-        arb = callPackage ../applications/science/biology/arb {
-          lesstif = lesstif93;
-        };
-        archimedes = callPackage ../applications/science/electronics/archimedes {
-        };
-        biolib = callPackage ../development/libraries/science/biology/biolib {
-        };
-        emboss = callPackage ../applications/science/biology/emboss {
-        };
-        mrbayes = callPackage ../applications/science/biology/mrbayes {
-        };
-        ncbiCTools = builderDefsPackage ../development/libraries/ncbi {
-          inherit tcsh mesa lesstif;
-          inherit (xlibs) libX11 libXaw
-          xproto libXt libSM libICE libXmu
-          libXext;
-        };
-        ncbi_tools = callPackage ../applications/science/biology/ncbi-tools {
-        };
-        paml = callPackage ../applications/science/biology/paml {
-        };
-        pal2nal = callPackage ../applications/science/biology/pal2nal {
-        };
-        plink = callPackage ../applications/science/biology/plink/default.nix {
-        };
-        arpack = callPackage ../development/libraries/science/math/arpack {
-        };
-        atlas = callPackage ../development/libraries/science/math/atlas {
-          tolerateCpuTimingInaccuracy = true;
-        };
-        blas = callPackage ../development/libraries/science/math/blas {
-        };
-        content = builderDefsPackage ../applications/science/math/content {
-          inherit mesa lesstif;
-          inherit (xlibs) libX11 libXaw
-          xproto libXt libSM libICE libXmu
-          libXext libXcursor;
-        };
-        jags = callPackage ../applications/science/math/jags {
-        };
-        liblapack = callPackage ../development/libraries/science/math/liblapack {
-        };
-        liblapack_3_5_0 = callPackage ../development/libraries/science/math/liblapack/3.5.0.nix {
-        };
-        liblbfgs = callPackage ../development/libraries/science/math/liblbfgs {
-        };
-        openblas = callPackage ../development/libraries/science/math/openblas {
-        };
-        openblas_0_2_10 = callPackage ../development/libraries/science/math/openblas/0.2.10.nix {
-          liblapack = liblapack_3_5_0;
-        };
-        mathematica = callPackage ../applications/science/math/mathematica {
-        };
-        sage = callPackage ../applications/science/math/sage {
-        };
-        gromacs = callPackage ../applications/science/molecular-dynamics/gromacs {
-          singlePrec = true;
-          fftw = fftwSinglePrec;
-          cmake = cmakeCurses;
-        };
-        gromacsDouble = lowPrio (callPackage ../applications/science/molecular-dynamics/gromacs {
-          singlePrec = false;
-          fftw = fftw;
-          cmake = cmakeCurses;
-        });
-        abc-verifier = callPackage ../applications/science/logic/abc {
-        };
-        alt-ergo = callPackage ../applications/science/logic/alt-ergo {
-        };
-        coq = callPackage ../applications/science/logic/coq {
-          inherit (ocamlPackages) findlib
-          lablgtk;
-          camlp5 = ocamlPackages.camlp5_transitional;
-        };
-        coq_HEAD = callPackage ../applications/science/logic/coq/HEAD.nix {
-          inherit (ocamlPackages) findlib
-          lablgtk;
-          camlp5 = ocamlPackages.camlp5_transitional;
-        };
-        coq_8_3 = callPackage ../applications/science/logic/coq/8.3.nix {
-          inherit (ocamlPackages) findlib
-          lablgtk;
-          camlp5 = ocamlPackages.camlp5_transitional;
-        };
-        cvc3 = callPackage ../applications/science/logic/cvc3 {
-        };
-        ekrhyper = callPackage ../applications/science/logic/ekrhyper {
-        };
-        eprover = callPackage ../applications/science/logic/eprover {
-          texLive = texLiveAggregationFun {
-            paths = [
-              texLive
-              texLiveExtra
-            ];
-          };
-        };
-        ginac = callPackage ../applications/science/math/ginac {
-        };
-        hol = callPackage ../applications/science/logic/hol {
-        };
-        hol_light = callPackage ../applications/science/logic/hol_light {
-          inherit (ocamlPackages) findlib;
-          camlp5 = ocamlPackages.camlp5_strict;
-        };
-        isabelle = import ../applications/science/logic/isabelle {
-          inherit (pkgs) stdenv fetchurl
-          nettools perl polyml;
-          inherit (pkgs.emacs24Packages) proofgeneral;
-        };
-        iprover = callPackage ../applications/science/logic/iprover {
-        };
-        leo2 = callPackage ../applications/science/logic/leo2 {
-        };
-        logisim = callPackage ../applications/science/logic/logisim {
-        };
-        ltl2ba = callPackage ../applications/science/logic/ltl2ba {
-        };
-        matita = callPackage ../applications/science/logic/matita {
-          ocaml = ocaml_3_11_2;
-          inherit (ocamlPackages_3_11_2) findlib
-          lablgtk ocaml_expat gmetadom
-          ocaml_http lablgtkmathview
-          ocaml_mysql ocaml_sqlite3
-          ocamlnet camlzip ocaml_pcre;
-          ulex08 = ocamlPackages_3_11_2.ulex08.override {
-            camlp5 = ocamlPackages_3_11_2.camlp5_5_transitional;
-          };
-        };
-        matita_130312 = lowPrio (callPackage ../applications/science/logic/matita/130312.nix {
-          inherit (ocamlPackages) findlib
-          lablgtk ocaml_expat gmetadom
-          ocaml_http ocaml_mysql ocamlnet
-          ulex08 camlzip ocaml_pcre;
-        });
-        minisat = callPackage ../applications/science/logic/minisat {
-        };
-        opensmt = callPackage ../applications/science/logic/opensmt {
-        };
-        otter = callPackage ../applications/science/logic/otter {
-        };
-        picosat = callPackage ../applications/science/logic/picosat {
-        };
-        prooftree = callPackage ../applications/science/logic/prooftree {
-          inherit (ocamlPackages) findlib
-          lablgtk;
-          camlp5 = ocamlPackages.camlp5_transitional;
-        };
-        prover9 = callPackage ../applications/science/logic/prover9 {
-        };
-        satallax = callPackage ../applications/science/logic/satallax {
-        };
-        spass = callPackage ../applications/science/logic/spass {
-        };
-        ssreflect = callPackage ../applications/science/logic/ssreflect {
-          camlp5 = ocamlPackages.camlp5_transitional;
-        };
-        tptp = callPackage ../applications/science/logic/tptp {
-        };
-        twelf = callPackage ../applications/science/logic/twelf {
-          smlnj = if stdenv.isDarwin
-            then smlnjBootstrap
-            else smlnj;
-        };
-        verifast = callPackage ../applications/science/logic/verifast {
-        };
-        why3 = callPackage ../applications/science/logic/why3 {
-        };
-        yices = callPackage ../applications/science/logic/yices {
-        };
-        z3 = callPackage ../applications/science/logic/z3 {
-        };
-        boolector = boolector15;
-        boolector15 = callPackage ../applications/science/logic/boolector {
-        };
-        boolector16 = lowPrio (callPackage ../applications/science/logic/boolector {
-          useV16 = true;
-        });
-        eagle = callPackage_i686 ../applications/science/electronics/eagle {
-        };
-        caneda = callPackage ../applications/science/electronics/caneda {
-        };
-        gtkwave = callPackage ../applications/science/electronics/gtkwave {
-        };
-        kicad = callPackage ../applications/science/electronics/kicad {
-          wxGTK = wxGTK29;
-        };
-        ngspice = callPackage ../applications/science/electronics/ngspice {
-        };
-        qucs = callPackage ../applications/science/electronics/qucs {
-        };
-        xoscope = callPackage ../applications/science/electronics/xoscope {
-        };
-        ecm = callPackage ../applications/science/math/ecm {
-        };
-        eukleides = callPackage ../applications/science/math/eukleides {
-          texinfo = texinfo4;
-        };
-        fricas = callPackage ../applications/science/math/fricas {
-        };
-        gap = callPackage ../applications/science/math/gap {
-        };
-        maxima = callPackage ../applications/science/math/maxima {
-        };
-        wxmaxima = callPackage ../applications/science/math/wxmaxima {
-        };
-        pari = callPackage ../applications/science/math/pari {
-        };
-        pspp = callPackage ../applications/science/math/pssp {
-          inherit (gnome) libglade
-          gtksourceview;
-        };
-        singular = callPackage ../applications/science/math/singular {
-        };
-        scilab = callPackage ../applications/science/math/scilab {
-          withXaw3d = false;
-          withTk = true;
-          withGtk = false;
-          withOCaml = true;
-          withX = true;
-        };
-        msieve = callPackage ../applications/science/math/msieve {
-        };
-        weka = callPackage ../applications/science/math/weka {
-        };
-        yad = callPackage ../tools/misc/yad {
-        };
-        yacas = callPackage ../applications/science/math/yacas {
-        };
-        speedcrunch = callPackage ../applications/science/math/speedcrunch {
-          qt = qt4;
-          cmake = cmakeCurses;
-        };
-        boinc = callPackage ../applications/science/misc/boinc {
-        };
-        celestia = callPackage ../applications/science/astronomy/celestia {
-          lua = lua5_1;
-          inherit (xlibs) libXmu;
-          inherit (pkgs.gnome) gtkglext;
-        };
-        fityk = callPackage ../applications/science/misc/fityk {
-        };
-        gravit = callPackage ../applications/science/astronomy/gravit {
-        };
-        golly = callPackage ../applications/science/misc/golly {
-        };
-        megam = callPackage ../applications/science/misc/megam {
-        };
-        root = callPackage ../applications/science/misc/root {
-        };
-        simgrid = callPackage ../applications/science/misc/simgrid {
-        };
-        spyder = callPackage ../applications/science/spyder {
-          inherit (pythonPackages) pyflakes
-          rope sphinx numpy scipy
-          matplotlib;
-          inherit (pythonPackages) ipython
-          pep8;
-          inherit pylint;
-        };
-        stellarium = callPackage ../applications/science/astronomy/stellarium {
-        };
-        tulip = callPackage ../applications/science/misc/tulip {
-        };
-        vite = callPackage ../applications/science/misc/vite {
-        };
-        xplanet = callPackage ../applications/science/astronomy/xplanet {
-        };
-        atari800 = callPackage ../misc/emulators/atari800 {
-        };
-        ataripp = callPackage ../misc/emulators/atari++ {
-        };
-        auctex = callPackage ../tools/typesetting/tex/auctex {
-        };
-        beep = callPackage ../misc/beep {
-        };
-        cups = callPackage ../misc/cups {
-          libusb = libusb1;
-        };
-        cups_pdf_filter = callPackage ../misc/cups/pdf-filter.nix {
-        };
-        gutenprint = callPackage ../misc/drivers/gutenprint {
-        };
-        gutenprintBin = callPackage ../misc/drivers/gutenprint/bin.nix {
-        };
-        cupsBjnp = callPackage ../misc/cups/drivers/cups-bjnp {
-        };
-        darcnes = callPackage ../misc/emulators/darcnes {
-        };
-        dbacl = callPackage ../tools/misc/dbacl {
-        };
-        dblatex = callPackage ../tools/typesetting/tex/dblatex {
-          enableAllFeatures = false;
-        };
-        dblatexFull = appendToName "full" (dblatex.override {
-          enableAllFeatures = true;
-        });
-        dosbox = callPackage ../misc/emulators/dosbox {
-        };
-        dpkg = callPackage ../tools/package-management/dpkg {
-        };
-        ekiga = newScope pkgs.gnome ../applications/networking/instant-messengers/ekiga {
-        };
-        emulationstation = callPackage ../misc/emulators/emulationstation {
-        };
-        electricsheep = callPackage ../misc/screensavers/electricsheep {
-        };
-        fakenes = callPackage ../misc/emulators/fakenes {
-        };
-        fceux = callPackage ../misc/emulators/fceux {
-        };
-        foldingathome = callPackage ../misc/foldingathome {
-        };
-        foo2zjs = callPackage ../misc/drivers/foo2zjs {
-        };
-        foomatic_filters = callPackage ../misc/drivers/foomatic-filters {
-        };
-        freestyle = callPackage ../misc/freestyle {
-        };
-        gajim = callPackage ../applications/networking/instant-messengers/gajim {
-        };
-        gammu = callPackage ../applications/misc/gammu {
-        };
-        gensgs = callPackage_i686 ../misc/emulators/gens-gs {
-        };
-        ghostscript = callPackage ../misc/ghostscript {
-          x11Support = false;
-          cupsSupport = config.ghostscript.cups or !stdenv.isDarwin;
-          gnuFork = config.ghostscript.gnu or false;
-        };
-        ghostscriptX = appendToName "with-X" (ghostscript.override {
-          x11Support = true;
-        });
-        guix = callPackage ../tools/package-management/guix {
-        };
-        gxemul = callPackage ../misc/gxemul {
-        };
-        hatari = callPackage ../misc/emulators/hatari {
-        };
-        hplip = callPackage ../misc/drivers/hplip {
-        };
-        hplipWithPlugin = hplip.override {
-          withPlugin = true;
-        };
-        jack1 = callPackage ../misc/jackaudio/jack1.nix {
-        };
-        jack2 = callPackage ../misc/jackaudio {
-        };
-        keynav = callPackage ../tools/X11/keynav {
-        };
-        lazylist = callPackage ../tools/typesetting/tex/lazylist {
-        };
-        lilypond = callPackage ../misc/lilypond {
-          guile = guile_1_8;
-        };
-        martyr = callPackage ../development/libraries/martyr {
-        };
-        maven = maven3;
-        maven3 = callPackage ../misc/maven {
-          jdk = openjdk;
-        };
-        mess = callPackage ../misc/emulators/mess {
-          inherit (pkgs.gnome) GConf;
-        };
-        mupen64plus = callPackage ../misc/emulators/mupen64plus {
-        };
-        mupen64plus1_5 = callPackage ../misc/emulators/mupen64plus/1.5.nix {
-        };
-        nix = nixStable;
-        nixStable = callPackage ../tools/package-management/nix {
-          storeDir = config.nix.storeDir or "/nix/store";
-          stateDir = config.nix.stateDir or "/nix/var";
-        };
-        nixUnstable = callPackage ../tools/package-management/nix/unstable.nix {
-          storeDir = config.nix.storeDir or "/nix/store";
-          stateDir = config.nix.stateDir or "/nix/var";
-        };
-        nixops = callPackage ../tools/package-management/nixops {
-        };
-        nix-prefetch-scripts = callPackage ../tools/package-management/nix-prefetch-scripts {
-        };
-        nix-repl = callPackage ../tools/package-management/nix-repl {
-        };
-        nut = callPackage ../applications/misc/nut {
-        };
-        solfege = callPackage ../misc/solfege {
-          pysqlite = pkgs.pythonPackages.sqlite3;
-        };
-        disnix = callPackage ../tools/package-management/disnix {
-        };
-        dysnomia = callPackage ../tools/package-management/disnix/dysnomia {
-          enableApacheWebApplication = config.disnix.enableApacheWebApplication or false;
-          enableAxis2WebService = config.disnix.enableAxis2WebService or false;
-          enableEjabberdDump = config.disnix.enableEjabberdDump or false;
-          enableMySQLDatabase = config.disnix.enableMySQLDatabase or false;
-          enablePostgreSQLDatabase = config.disnix.enablePostgreSQLDatabase or false;
-          enableSubversionRepository = config.disnix.enableSubversionRepository or false;
-          enableTomcatWebApplication = config.disnix.enableTomcatWebApplication or false;
-        };
-        disnixos = callPackage ../tools/package-management/disnix/disnixos {
-        };
-        DisnixWebService = callPackage ../tools/package-management/disnix/DisnixWebService {
-        };
-        latex2html = callPackage ../tools/typesetting/tex/latex2html/default.nix {
-          tex = tetex;
-        };
-        lkproof = callPackage ../tools/typesetting/tex/lkproof {
-        };
-        mysqlWorkbench = newScope gnome ../applications/misc/mysql-workbench {
-          lua = lua5;
-          inherit (pythonPackages) pexpect
-          paramiko;
-        };
-        robomongo = callPackage ../applications/misc/robomongo {
-        };
-        opkg = callPackage ../tools/package-management/opkg {
-        };
-        pgadmin = callPackage ../applications/misc/pgadmin {
-        };
-        pgf = pgf2;
-        pgf1 = callPackage ../tools/typesetting/tex/pgf/1.x.nix {
-        };
-        pgf2 = callPackage ../tools/typesetting/tex/pgf/2.x.nix {
-        };
-        pgfplots = callPackage ../tools/typesetting/tex/pgfplots {
-        };
-        pjsip = callPackage ../applications/networking/pjsip {
-        };
-        polytable = callPackage ../tools/typesetting/tex/polytable {
-        };
-        PPSSPP = callPackage ../misc/emulators/ppsspp {
-        };
-        uae = callPackage ../misc/emulators/uae {
-        };
-        putty = callPackage ../applications/networking/remote/putty {
-        };
-        retroarch = callPackage ../misc/emulators/retroarch {
-        };
-        rssglx = callPackage ../misc/screensavers/rss-glx {
-        };
-        xlockmore = callPackage ../misc/screensavers/xlockmore {
-        };
-        samsungUnifiedLinuxDriver = import ../misc/cups/drivers/samsung {
-          inherit fetchurl stdenv;
-          inherit cups ghostscript glibc
-          patchelf;
-          gcc = import ../development/compilers/gcc/4.4 {
-            inherit stdenv fetchurl gmp mpfr
-            noSysDirs gettext which;
-            texinfo = texinfo4;
-            profiledCompiler = true;
-          };
-        };
-        saneBackends = callPackage ../applications/graphics/sane/backends.nix {
-          gt68xxFirmware = config.sane.gt68xxFirmware or null;
-          snapscanFirmware = config.sane.snapscanFirmware or null;
-          hotplugSupport = config.sane.hotplugSupport or true;
-          libusb = libusb1;
-        };
-        saneBackendsGit = callPackage ../applications/graphics/sane/backends-git.nix {
-          gt68xxFirmware = config.sane.gt68xxFirmware or null;
-          snapscanFirmware = config.sane.snapscanFirmware or null;
-          hotplugSupport = config.sane.hotplugSupport or true;
-        };
-        mkSaneConfig = callPackage ../applications/graphics/sane/config.nix {
-        };
-        saneFrontends = callPackage ../applications/graphics/sane/frontends.nix {
-        };
-        seafile-shared = callPackage ../misc/seafile-shared {
-        };
-        slock = callPackage ../misc/screensavers/slock {
-        };
-        sourceAndTags = import ../misc/source-and-tags {
-          inherit pkgs stdenv unzip lib
-          ctags;
-          hasktags = haskellPackages.hasktags;
-        };
-        splix = callPackage ../misc/cups/drivers/splix {
-        };
-        streamripper = callPackage ../applications/audio/streamripper {
-        };
-        sqsh = callPackage ../development/tools/sqsh {
-        };
-        tetex = callPackage ../tools/typesetting/tex/tetex {
-          libpng = libpng12;
-        };
-        tex4ht = callPackage ../tools/typesetting/tex/tex4ht {
-        };
-        texFunctions = import ../tools/typesetting/tex/nix pkgs;
-        texLive = builderDefsPackage (import ../tools/typesetting/tex/texlive) {
-          inherit builderDefs zlib bzip2
-          ncurses libpng ed lesstif ruby
-          potrace gd t1lib freetype icu
-          perl expat curl xz pkgconfig
-          zziplib texinfo libjpeg bison
-          python fontconfig flex poppler
-          libpaper graphite2 makeWrapper;
-          inherit (xlibs) libXaw libX11
-          xproto libXt libXpm libXmu
-          libXext xextproto libSM libICE;
-          ghostscript = ghostscriptX;
-          harfbuzz = harfbuzz.override {
-            withIcu = true;
-            withGraphite2 = true;
-          };
-        };
-        texLiveFull = lib.setName "texlive-full" (texLiveAggregationFun {
-          paths = [
-            texLive
-            texLiveExtra
-            lmodern
-            texLiveCMSuper
-            texLiveLatexXColor
-            texLivePGF
-            texLiveBeamer
-            texLiveModerncv
-            tipa
-            tex4ht
-            texinfo
-            texLiveModerntimeline
-          ];
-        });
-        texLiveAggregationFun = params:
-        builderDefsPackage (import ../tools/typesetting/tex/texlive/aggregate.nix) ({
-          inherit poppler perl
-          makeWrapper;
-        } // params);
-        texDisser = callPackage ../tools/typesetting/tex/disser {
-        };
-        texLiveContext = builderDefsPackage (import ../tools/typesetting/tex/texlive/context.nix) {
-          inherit texLive;
-        };
-        texLiveExtra = builderDefsPackage (import ../tools/typesetting/tex/texlive/extra.nix) {
-          inherit texLive xz;
-        };
-        texLiveCMSuper = builderDefsPackage (import ../tools/typesetting/tex/texlive/cm-super.nix) {
-          inherit texLive;
-        };
-        texLiveLatexXColor = builderDefsPackage (import ../tools/typesetting/tex/texlive/xcolor.nix) {
-          inherit texLive;
-        };
-        texLivePGF = builderDefsPackage (import ../tools/typesetting/tex/texlive/pgf.nix) {
-          inherit texLiveLatexXColor
-          texLive;
-        };
-        texLiveBeamer = builderDefsPackage (import ../tools/typesetting/tex/texlive/beamer.nix) {
-          inherit texLiveLatexXColor
-          texLivePGF texLive;
-        };
-        texLiveModerncv = builderDefsPackage (import ../tools/typesetting/tex/texlive/moderncv.nix) {
-          inherit texLive unzip;
-        };
-        texLiveModerntimeline = builderDefsPackage (import ../tools/typesetting/tex/texlive/moderntimeline.nix) {
-          inherit texLive unzip;
-        };
-        thermald = callPackage ../tools/system/thermald {
-        };
-        thinkfan = callPackage ../tools/system/thinkfan {
-        };
-        vice = callPackage ../misc/emulators/vice {
-          libX11 = xlibs.libX11;
-          giflib = giflib_4_1;
-        };
-        viewnior = callPackage ../applications/graphics/viewnior {
-        };
-        vimPlugins = recurseIntoAttrs (callPackage ../misc/vim-plugins {
-        });
-        vimprobable2 = callPackage ../applications/networking/browsers/vimprobable2 {
-          webkit = webkitgtk2;
-        };
-        vimprobable2Wrapper = wrapFirefox {
-          browser = vimprobable2;
-          browserName = "vimprobable2";
-          desktopName = "Vimprobable2";
-        };
-        vimb = callPackage ../applications/networking/browsers/vimb {
-          webkit = webkitgtk2;
-        };
-        vimbWrapper = wrapFirefox {
-          browser = vimb;
-          browserName = "vimb";
-          desktopName = "Vimb";
-        };
-        VisualBoyAdvance = callPackage ../misc/emulators/VisualBoyAdvance {
-        };
-        wineStable = callPackage_i686 ../misc/emulators/wine/stable.nix {
-          bison = bison2;
-        };
-        wineUnstable = lowPrio (callPackage_i686 ../misc/emulators/wine/unstable.nix {
-          bison = bison2;
-        });
-        wine = wineStable;
-        winetricks = callPackage ../misc/emulators/wine/winetricks.nix {
-          inherit (gnome2) zenity;
-        };
-        wxmupen64plus = callPackage ../misc/emulators/wxmupen64plus {
-        };
-        x2x = callPackage ../tools/X11/x2x {
-        };
-        xboxdrv = callPackage ../misc/drivers/xboxdrv {
-        };
-        xinput_calibrator = callPackage ../tools/X11/xinput_calibrator {
-          inherit (xlibs) libXi
-          inputproto;
-        };
-        xosd = callPackage ../misc/xosd {
-        };
-        xsane = callPackage ../applications/graphics/sane/xsane.nix {
-          libpng = libpng12;
-          saneBackends = saneBackends;
-        };
-        yafc = callPackage ../applications/networking/yafc {
-        };
-        yandex-disk = callPackage ../tools/filesystems/yandex-disk {
-        };
-        myEnvFun = import ../misc/my-env {
-          inherit substituteAll pkgs;
-          inherit (stdenv) mkDerivation;
-        };
-        PatolineEnv = pack: myEnvFun {
-          name = "patoline";
-          buildInputs = [
-            stdenv
-            ncurses
-            mesa
-            freeglut
-            libzip
-            gcc
-            pack.ocaml
-            pack.findlib
-            pack.camomile
-            pack.dypgen
-            pack.ocaml_sqlite3
-            pack.camlzip
-            pack.lablgtk
-            pack.camlimages
-            pack.ocaml_cairo
-            pack.lablgl
-            pack.ocamlnet
-            pack.cryptokit
-            pack.ocaml_pcre
-            pack.patoline
-          ];
-          extraCmds = ''
-            LD_LIBRARY_PATH=\''$LD_LIBRARY_PATH:${gcc.gcc}/lib
-            export LD_LIBRARY_PATH
-          '';
-        };
-        patoline = PatolineEnv ocamlPackages_4_00_1;
-        znc = callPackage ../applications/networking/znc {
-        };
-        zncModules = recurseIntoAttrs (callPackage ../applications/networking/znc/modules.nix {
-        });
-        zsnes = callPackage_i686 ../misc/emulators/zsnes {
-        };
-        snes9x-gtk = callPackage ../misc/emulators/snes9x-gtk {
-        };
-        misc = import ../misc/misc.nix {
-          inherit pkgs stdenv;
-        };
-        bullet = callPackage ../development/libraries/bullet {
-        };
-        dart = callPackage ../development/interpreters/dart {
-        };
-        httrack = callPackage ../tools/backup/httrack {
-        };
-        mg = callPackage ../applications/editors/mg {
-        };
-        adobeReader = adobe-reader;
-        asciidocFull = asciidoc-full;
-        lttngTools = lttng-tools;
-        lttngUst = lttng-ust;
-      };
-      in self;
-    in pkgs
diff --git a/data/nixpkgs-all-packages.nix b/data/nixpkgs-all-packages.nix
deleted file mode 100644
--- a/data/nixpkgs-all-packages.nix
+++ /dev/null
@@ -1,11561 +0,0 @@
-/* This file composes the Nix Packages collection.  That is, it
-   imports the functions that build the various packages, and calls
-   them with appropriate arguments.  The result is a set of all the
-   packages in the Nix Packages collection for some particular
-   platform. */
-
-
-{ # The system (e.g., `i686-linux') for which to build the packages.
-  system ? builtins.currentSystem
-
-, # The standard environment to use.  Only used for bootstrapping.  If
-  # null, the default standard environment is used.
-  bootStdenv ? null
-
-, # Non-GNU/Linux OSes are currently "impure" platforms, with their libc
-  # outside of the store.  Thus, GCC, GFortran, & co. must always look for
-  # files in standard system directories (/usr/include, etc.)
-  noSysDirs ? (system != "x86_64-darwin"
-               && system != "x86_64-freebsd" && system != "i686-freebsd"
-               && system != "x86_64-kfreebsd-gnu")
-
-  # More flags for the bootstrapping of stdenv.
-, gccWithCC ? true
-, gccWithProfiling ? true
-
-, # Allow a configuration attribute set to be passed in as an
-  # argument.  Otherwise, it's read from $NIXPKGS_CONFIG or
-  # ~/.nixpkgs/config.nix.
-  config ? null
-
-, crossSystem ? null
-, platform ? null
-}:
-
-
-let config_ = config; platform_ = platform; in # rename the function arguments
-
-let
-
-  lib = import ../../lib;
-
-  # The contents of the configuration file found at $NIXPKGS_CONFIG or
-  # $HOME/.nixpkgs/config.nix.
-  # for NIXOS (nixos-rebuild): use nixpkgs.config option
-  config =
-    let
-      toPath = builtins.toPath;
-      getEnv = x: if builtins ? getEnv then builtins.getEnv x else "";
-      pathExists = name:
-        builtins ? pathExists && builtins.pathExists (toPath name);
-
-      configFile = getEnv "NIXPKGS_CONFIG";
-      homeDir = getEnv "HOME";
-      configFile2 = homeDir + "/.nixpkgs/config.nix";
-
-      configExpr =
-        if config_ != null then config_
-        else if configFile != "" && pathExists configFile then import (toPath configFile)
-        else if homeDir != "" && pathExists configFile2 then import (toPath configFile2)
-        else {};
-
-    in
-      # allow both:
-      # { /* the config */ } and
-      # { pkgs, ... } : { /* the config */ }
-      if builtins.isFunction configExpr
-        then configExpr { inherit pkgs; }
-        else configExpr;
-
-  # Allow setting the platform in the config file. Otherwise, let's use a reasonable default (pc)
-
-  platformAuto = let
-      platforms = (import ./platforms.nix);
-    in
-      if system == "armv6l-linux" then platforms.raspberrypi
-      else if system == "armv5tel-linux" then platforms.sheevaplug
-      else if system == "mips64el-linux" then platforms.fuloong2f_n32
-      else if system == "x86_64-linux" then platforms.pc64
-      else if system == "i686-linux" then platforms.pc32
-      else platforms.pcBase;
-
-  platform = if platform_ != null then platform_
-    else config.platform or platformAuto;
-
-  # Helper functions that are exported through `pkgs'.
-  helperFunctions =
-    stdenvAdapters //
-    (import ../build-support/trivial-builders.nix { inherit (pkgs) stdenv; inherit (pkgs.xorg) lndir; });
-
-  stdenvAdapters =
-    import ../stdenv/adapters.nix pkgs;
-
-
-  # Allow packages to be overriden globally via the `packageOverrides'
-  # configuration option, which must be a function that takes `pkgs'
-  # as an argument and returns a set of new or overriden packages.
-  # The `packageOverrides' function is called with the *original*
-  # (un-overriden) set of packages, allowing packageOverrides
-  # attributes to refer to the original attributes (e.g. "foo =
-  # ... pkgs.foo ...").
-  pkgs = applyGlobalOverrides (config.packageOverrides or (pkgs: {}));
-
-
-  # Return the complete set of packages, after applying the overrides
-  # returned by the `overrider' function (see above).  Warning: this
-  # function is very expensive!
-  applyGlobalOverrides = overrider:
-    let
-      # Call the overrider function.  We don't want stdenv overrides
-      # in the case of cross-building, or otherwise the basic
-      # overrided packages will not be built with the crossStdenv
-      # adapter.
-      overrides = overrider pkgsOrig //
-        (lib.optionalAttrs (pkgsOrig.stdenv ? overrides && crossSystem == null) (pkgsOrig.stdenv.overrides pkgsOrig));
-
-      # The un-overriden packages, passed to `overrider'.
-      pkgsOrig = pkgsFun pkgs {};
-
-      # The overriden, final packages.
-      pkgs = pkgsFun pkgs overrides;
-    in pkgs;
-
-
-  # The package compositions.  Yes, this isn't properly indented.
-  pkgsFun = pkgs: overrides:
-    with helperFunctions;
-    let defaultScope = pkgs // pkgs.xorg; self = self_ // overrides;
-    self_ = with self; helperFunctions // {
-
-  # Make some arguments passed to all-packages.nix available
-  inherit system platform;
-
-  # Allow callPackage to fill in the pkgs argument
-  inherit pkgs;
-
-
-  # We use `callPackage' to be able to omit function arguments that
-  # can be obtained from `pkgs' or `pkgs.xorg' (i.e. `defaultScope').
-  # Use `newScope' for sets of packages in `pkgs' (see e.g. `gnome'
-  # below).
-  callPackage = newScope {};
-
-  newScope = extra: lib.callPackageWith (defaultScope // extra);
-
-
-  # Override system. This is useful to build i686 packages on x86_64-linux.
-  forceSystem = system: kernel: (import ./all-packages.nix) {
-    inherit system;
-    platform = platform // { kernelArch = kernel; };
-    inherit bootStdenv noSysDirs gccWithCC gccWithProfiling config
-      crossSystem;
-  };
-
-
-  # Used by wine, firefox with debugging version of Flash, ...
-  pkgsi686Linux = forceSystem "i686-linux" "i386";
-
-  callPackage_i686 = lib.callPackageWith (pkgsi686Linux // pkgsi686Linux.xorg);
-
-
-  # For convenience, allow callers to get the path to Nixpkgs.
-  path = ../..;
-
-
-  ### Symbolic names.
-
-  x11 = xlibsWrapper;
-
-  # `xlibs' is the set of X library components.  This used to be the
-  # old modular X llibraries project (called `xlibs') but now it's just
-  # the set of packages in the modular X.org tree (which also includes
-  # non-library components like the server, drivers, fonts, etc.).
-  xlibs = xorg // {xlibs = xlibsWrapper;};
-
-
-  ### Helper functions.
-
-  inherit lib config stdenvAdapters;
-
-  inherit (lib) lowPrio hiPrio appendToName makeOverridable;
-  inherit (misc) versionedDerivation;
-
-  # Applying this to an attribute set will cause nix-env to look
-  # inside the set for derivations.
-  recurseIntoAttrs = attrs: attrs // { recurseForDerivations = true; };
-
-  builderDefs = lib.composedArgsAndFun (import ../build-support/builder-defs/builder-defs.nix) {
-    inherit stringsWithDeps lib stdenv writeScript
-      fetchurl fetchmtn fetchgit;
-  };
-
-  builderDefsPackage = builderDefs.builderDefsPackage builderDefs;
-
-  stringsWithDeps = lib.stringsWithDeps;
-
-
-  ### Nixpkgs maintainer tools
-
-  nix-generate-from-cpan = callPackage ../../maintainers/scripts/nix-generate-from-cpan.nix { };
-
-  nixpkgs-lint = callPackage ../../maintainers/scripts/nixpkgs-lint.nix { };
-
-
-  ### STANDARD ENVIRONMENT
-
-
-  allStdenvs = import ../stdenv {
-    inherit system platform config;
-    allPackages = args: import ./all-packages.nix ({ inherit config system; } // args);
-  };
-
-  defaultStdenv = allStdenvs.stdenv // { inherit platform; };
-
-  stdenvCross = lowPrio (makeStdenvCross defaultStdenv crossSystem binutilsCross gccCrossStageFinal);
-
-  stdenv =
-    if bootStdenv != null then (bootStdenv // {inherit platform;}) else
-      if crossSystem != null then
-        stdenvCross
-      else
-        let
-            changer = config.replaceStdenv or null;
-        in if changer != null then
-          changer {
-            # We import again all-packages to avoid recursivities.
-            pkgs = import ./all-packages.nix {
-              # We remove packageOverrides to avoid recursivities
-              config = removeAttrs config [ "replaceStdenv" ];
-            };
-          }
-      else
-        defaultStdenv;
-
-  stdenvApple = stdenvAdapters.overrideGCC allStdenvs.stdenvNative gccApple;
-
-  forceNativeDrv = drv : if crossSystem == null then drv else
-    (drv // { crossDrv = drv.nativeDrv; });
-
-  # A stdenv capable of building 32-bit binaries.  On x86_64-linux,
-  # it uses GCC compiled with multilib support; on i686-linux, it's
-  # just the plain stdenv.
-  stdenv_32bit = lowPrio (
-    if system == "x86_64-linux" then
-      overrideGCC stdenv gcc48_multi
-    else
-      stdenv);
-
-
-  ### BUILD SUPPORT
-
-  attrSetToDir = arg: import ../build-support/upstream-updater/attrset-to-dir.nix {
-    inherit writeTextFile stdenv lib;
-    theAttrSet = arg;
-  };
-
-  autoreconfHook = makeSetupHook
-    { substitutions = { inherit autoconf automake libtool; }; }
-    ../build-support/setup-hooks/autoreconf.sh;
-
-  buildEnv = import ../build-support/buildenv {
-    inherit (pkgs) runCommand perl;
-  };
-
-  buildFHSChrootEnv = import ../build-support/build-fhs-chrootenv {
-    inherit stdenv glibc glibcLocales gcc coreutils diffutils findutils;
-    inherit gnused gnugrep gnutar gzip bzip2 bashInteractive xz shadow gawk;
-    inherit less buildEnv;
-  };
-
-  dotnetenv = import ../build-support/dotnetenv {
-    inherit stdenv;
-    dotnetfx = dotnetfx40;
-  };
-
-  scatterOutputHook = makeSetupHook {} ../build-support/setup-hooks/scatter_output.sh;
-
-  vsenv = callPackage ../build-support/vsenv {
-    vs = vs90wrapper;
-  };
-
-  fetchbower = import ../build-support/fetchbower {
-    inherit stdenv git;
-    inherit (nodePackages) fetch-bower;
-  };
-
-  fetchbzr = import ../build-support/fetchbzr {
-    inherit stdenv bazaar;
-  };
-
-  fetchcvs = import ../build-support/fetchcvs {
-    inherit stdenv cvs;
-  };
-
-  fetchdarcs = import ../build-support/fetchdarcs {
-    inherit stdenv darcs nix;
-  };
-
-  fetchgit = import ../build-support/fetchgit {
-    inherit stdenv git cacert;
-  };
-
-  fetchgitPrivate = import ../build-support/fetchgit/private.nix {
-    inherit fetchgit writeScript openssh stdenv;
-  };
-
-  fetchgitrevision = import ../build-support/fetchgitrevision runCommand git;
-
-  fetchmtn = callPackage ../build-support/fetchmtn (config.fetchmtn or {});
-
-  packer = callPackage ../development/tools/packer { };
-
-  fetchpatch = callPackage ../build-support/fetchpatch { };
-
-  fetchsvn = import ../build-support/fetchsvn {
-    inherit stdenv subversion openssh;
-    sshSupport = true;
-  };
-
-  fetchsvnrevision = import ../build-support/fetchsvnrevision runCommand subversion;
-
-  fetchsvnssh = import ../build-support/fetchsvnssh {
-    inherit stdenv subversion openssh expect;
-    sshSupport = true;
-  };
-
-  fetchhg = import ../build-support/fetchhg {
-    inherit stdenv mercurial nix;
-  };
-
-  # `fetchurl' downloads a file from the network.
-  fetchurl = import ../build-support/fetchurl {
-    inherit curl stdenv;
-  };
-
-  # A wrapper around fetchurl that generates miror://gnome URLs automatically
-  fetchurlGnome = callPackage ../build-support/fetchurl/gnome.nix { };
-
-  # fetchurlBoot is used for curl and its dependencies in order to
-  # prevent a cyclic dependency (curl depends on curl.tar.bz2,
-  # curl.tar.bz2 depends on fetchurl, fetchurl depends on curl).  It
-  # uses the curl from the previous bootstrap phase (e.g. a statically
-  # linked curl in the case of stdenv-linux).
-  fetchurlBoot = stdenv.fetchurlBoot;
-
-  fetchzip = import ../build-support/fetchzip { inherit lib fetchurl unzip; };
-
-  fetchFromGitHub = { owner, repo, rev, sha256 }: fetchzip {
-    name = "${repo}-${rev}-src";
-    url = "https://github.com/${owner}/${repo}/archive/${rev}.tar.gz";
-    inherit sha256;
-  };
-
-  resolveMirrorURLs = {url}: fetchurl {
-    showURLs = true;
-    inherit url;
-  };
-
-  libredirect = callPackage ../build-support/libredirect { };
-
-  makeDesktopItem = import ../build-support/make-desktopitem {
-    inherit stdenv;
-  };
-
-  makeAutostartItem = import ../build-support/make-startupitem {
-    inherit stdenv;
-    inherit lib;
-  };
-
-  makeInitrd = {contents, compressor ? "gzip -9"}:
-    import ../build-support/kernel/make-initrd.nix {
-      inherit stdenv perl perlArchiveCpio cpio contents ubootChooser compressor;
-    };
-
-  makeWrapper = makeSetupHook { } ../build-support/setup-hooks/make-wrapper.sh;
-
-  makeModulesClosure = { kernel, rootModules, allowMissing ? false }:
-    import ../build-support/kernel/modules-closure.nix {
-      inherit stdenv kmod kernel nukeReferences rootModules allowMissing;
-    };
-
-  pathsFromGraph = ../build-support/kernel/paths-from-graph.pl;
-
-  srcOnly = args: (import ../build-support/src-only) ({inherit stdenv; } // args);
-
-  substituteAll = import ../build-support/substitute/substitute-all.nix {
-    inherit stdenv;
-  };
-
-  replaceDependency = import ../build-support/replace-dependency.nix {
-    inherit runCommand nix lib;
-  };
-
-  nukeReferences = callPackage ../build-support/nuke-references/default.nix { };
-
-  vmTools = import ../build-support/vm/default.nix {
-    inherit pkgs;
-  };
-
-  releaseTools = import ../build-support/release/default.nix {
-    inherit pkgs;
-  };
-
-  composableDerivation = (import ../../lib/composable-derivation.nix) {
-    inherit pkgs lib;
-  };
-
-  platforms = import ./platforms.nix;
-
-  setJavaClassPath = makeSetupHook { } ../build-support/setup-hooks/set-java-classpath.sh;
-
-  fixDarwinDylibNames = makeSetupHook { } ../build-support/setup-hooks/fix-darwin-dylib-names.sh;
-
-  keepBuildTree = makeSetupHook { } ../build-support/setup-hooks/keep-build-tree.sh;
-
-  enableGCOVInstrumentation = makeSetupHook { } ../build-support/setup-hooks/enable-coverage-instrumentation.sh;
-
-  makeGCOVReport = makeSetupHook
-    { deps = [ pkgs.lcov pkgs.enableGCOVInstrumentation ]; }
-    ../build-support/setup-hooks/make-coverage-analysis-report.sh;
-
-
-  ### TOOLS
-
-  abduco = callPackage ../tools/misc/abduco { };
-
-  acct = callPackage ../tools/system/acct { };
-
-  acoustidFingerprinter = callPackage ../tools/audio/acoustid-fingerprinter {
-    ffmpeg = ffmpeg_1;
-  };
-
-  actdiag = pythonPackages.actdiag;
-
-  adom = callPackage ../games/adom { };
-
-  aefs = callPackage ../tools/filesystems/aefs { };
-
-  aegisub = callPackage ../applications/video/aegisub {
-    wxGTK = wxGTK30;
-    lua = lua5_1;
-  };
-
-  aespipe = callPackage ../tools/security/aespipe { };
-
-  aescrypt = callPackage ../tools/misc/aescrypt { };
-
-  ahcpd = callPackage ../tools/networking/ahcpd { };
-
-  aircrackng = callPackage ../tools/networking/aircrack-ng { };
-
-  analog = callPackage ../tools/admin/analog {};
-
-  apktool = callPackage ../development/tools/apktool {
-    buildTools = androidenv.buildTools;
-  };
-
-  apt-offline = callPackage ../tools/misc/apt-offline { };
-
-  archivemount = callPackage ../tools/filesystems/archivemount { };
-
-  arandr = callPackage ../tools/X11/arandr { };
-
-  arcanist = callPackage ../development/tools/misc/arcanist {};
-
-  arduino_core = callPackage ../development/arduino/arduino-core {
-    jdk = jdk;
-    jre = jdk;
-  };
-
-  argyllcms = callPackage ../tools/graphics/argyllcms {};
-
-  arp-scan = callPackage ../tools/misc/arp-scan { };
-
-  ascii = callPackage ../tools/text/ascii { };
-
-  asymptote = builderDefsPackage ../tools/graphics/asymptote {
-    inherit freeglut ghostscriptX imagemagick fftw boehmgc
-      mesa ncurses readline gsl libsigsegv python zlib perl
-      texinfo xz;
-    texLive = texLiveAggregationFun {
-      paths = [ texLive texLiveExtra texLiveCMSuper ];
-    };
-  };
-
-  awscli = callPackage ../tools/admin/awscli { };
-
-  ec2_api_tools = callPackage ../tools/virtualization/ec2-api-tools { };
-
-  ec2_ami_tools = callPackage ../tools/virtualization/ec2-ami-tools { };
-
-  altermime = callPackage ../tools/networking/altermime {};
-
-  amule = callPackage ../tools/networking/p2p/amule { };
-
-  amuleDaemon = appendToName "daemon" (amule.override {
-    monolithic = false;
-    daemon = true;
-  });
-
-  amuleGui = appendToName "gui" (amule.override {
-    monolithic = false;
-    client = true;
-  });
-
-  androidenv = import ../development/mobile/androidenv {
-    inherit pkgs;
-    pkgs_i686 = pkgsi686Linux;
-  };
-
-  apg = callPackage ../tools/security/apg { };
-
-  grc = callPackage ../tools/misc/grc { };
-
-  otool = callPackage ../os-specific/darwin/otool { };
-
-  pass = callPackage ../tools/security/pass {
-    gnupg = gnupg1compat;
-  };
-
-  setfile = callPackage ../os-specific/darwin/setfile { };
-
-  install_name_tool = callPackage ../os-specific/darwin/install_name_tool { };
-
-  xcodeenv = callPackage ../development/mobile/xcodeenv { };
-
-  titaniumenv = callPackage ../development/mobile/titaniumenv {
-    inherit pkgs;
-    pkgs_i686 = pkgsi686Linux;
-  };
-
-  inherit (androidenv) androidsdk_4_1;
-
-  aria2 = callPackage ../tools/networking/aria2 { };
-  aria = aria2;
-
-  at = callPackage ../tools/system/at { };
-
-  atftp = callPackage ../tools/networking/atftp {};
-
-  autogen = callPackage ../development/tools/misc/autogen { };
-
-  autojump = callPackage ../tools/misc/autojump { };
-
-  autorandr = callPackage ../tools/misc/autorandr {
-    inherit (xorg) xrandr xdpyinfo;
-  };
-
-  avahi = callPackage ../development/libraries/avahi {
-    qt4Support = config.avahi.qt4Support or false;
-  };
-
-  aws = callPackage ../tools/virtualization/aws { };
-
-  aws_mturk_clt = callPackage ../tools/misc/aws-mturk-clt { };
-
-  axel = callPackage ../tools/networking/axel { };
-
-  azureus = callPackage ../tools/networking/p2p/azureus { };
-
-  basex = callPackage ../tools/text/xml/basex { };
-
-  babeld = callPackage ../tools/networking/babeld { };
-
-  badvpn = callPackage ../tools/networking/badvpn {};
-
-  banner = callPackage ../games/banner {};
-
-  barcode = callPackage ../tools/graphics/barcode {};
-
-  bc = callPackage ../tools/misc/bc { };
-
-  bcache-tools = callPackage ../tools/filesystems/bcache-tools { };
-
-  bchunk = callPackage ../tools/cd-dvd/bchunk { };
-
-  bfr = callPackage ../tools/misc/bfr { };
-
-  bindfs = callPackage ../tools/filesystems/bindfs { };
-
-  bitbucket-cli = pythonPackages.bitbucket-cli;
-
-  blockdiag = pythonPackages.blockdiag;
-
-  bmon = callPackage ../tools/misc/bmon { };
-
-  bochs = callPackage ../applications/virtualization/bochs { wxSupport = false; };
-
-  boomerang = callPackage ../development/tools/boomerang { };
-
-  bootchart = callPackage ../tools/system/bootchart { };
-
-  bro = callPackage ../applications/networking/ids/bro { };
-
-  bsod = callPackage ../misc/emulators/bsod { };
-
-  btrfsProgs = callPackage ../tools/filesystems/btrfsprogs { };
-
-  bwm_ng = callPackage ../tools/networking/bwm-ng { };
-
-  byobu = callPackage ../tools/misc/byobu { };
-
-  capstone = callPackage ../development/libraries/capstone { };
-
-  catdoc = callPackage ../tools/text/catdoc { };
-
-  ccnet = callPackage ../tools/networking/ccnet { };
-
-  consul = callPackage ../servers/consul { };
-  consul_ui = callPackage ../servers/consul/ui.nix { };
-
-  chntpw = callPackage ../tools/security/chntpw { };
-
-  coprthr = callPackage ../development/libraries/coprthr {
-    flex = flex_2_5_35;
-  };
-
-  crawl = callPackage ../games/crawl { lua = lua5; };
-
-  cv = callPackage ../tools/misc/cv { };
-
-  direnv = callPackage ../tools/misc/direnv { };
-
-  ditaa = callPackage ../tools/graphics/ditaa { };
-
-  dlx = callPackage ../misc/emulators/dlx { };
-
-  eggdrop = callPackage ../tools/networking/eggdrop { };
-
-  enca = callPackage ../tools/text/enca { };
-
-  fasd = callPackage ../tools/misc/fasd {
-    inherit (haskellPackages) pandoc;
-  };
-
-  fop = callPackage ../tools/typesetting/fop { };
-
-  mcrl = callPackage ../tools/misc/mcrl { };
-
-  mcrl2 = callPackage ../tools/misc/mcrl2 { };
-
-  mpdcron = callPackage ../tools/audio/mpdcron { };
-
-  syslogng = callPackage ../tools/system/syslog-ng { };
-
-  syslogng_incubator = callPackage ../tools/system/syslog-ng-incubator { };
-
-  rsyslog = callPackage ../tools/system/rsyslog { };
-
-  mcrypt = callPackage ../tools/misc/mcrypt { };
-
-  mcelog = callPackage ../os-specific/linux/mcelog { };
-
-  apparix = callPackage ../tools/misc/apparix { };
-
-  appdata-tools = callPackage ../tools/misc/appdata-tools { };
-
-  asciidoc = callPackage ../tools/typesetting/asciidoc {
-    inherit (pythonPackages) matplotlib numpy aafigure recursivePthLoader;
-    enableStandardFeatures = false;
-  };
-
-  asciidoc-full = appendToName "full" (asciidoc.override {
-    inherit (pythonPackages) pygments;
-    enableStandardFeatures = true;
-  });
-
-  autossh = callPackage ../tools/networking/autossh { };
-
-  bacula = callPackage ../tools/backup/bacula { };
-
-  beanstalkd = callPackage ../servers/beanstalkd { };
-
-  bgs = callPackage ../tools/X11/bgs { };
-
-  biber = callPackage ../tools/typesetting/biber {
-    inherit (perlPackages)
-      autovivification BusinessISBN BusinessISMN BusinessISSN ConfigAutoConf
-      DataCompare DataDump DateSimple EncodeEUCJPASCII EncodeHanExtra EncodeJIS2K
-      ExtUtilsLibBuilder FileSlurp IPCRun3 Log4Perl LWPProtocolHttps ListAllUtils
-      ListMoreUtils ModuleBuild MozillaCA ReadonlyXS RegexpCommon TextBibTeX
-      UnicodeCollate UnicodeLineBreak URI XMLLibXMLSimple XMLLibXSLT XMLWriter;
-  };
-
-  bibtextools = callPackage ../tools/typesetting/bibtex-tools {
-    inherit (strategoPackages016) strategoxt sdf;
-  };
-
-  bittorrent = callPackage ../tools/networking/p2p/bittorrent {
-    gui = true;
-  };
-
-  bittornado = callPackage ../tools/networking/p2p/bit-tornado { };
-
-  blueman = callPackage ../tools/bluetooth/blueman {
-    inherit (pythonPackages) notify;
-  };
-
-  bmrsa = builderDefsPackage (import ../tools/security/bmrsa/11.nix) {
-    inherit unzip;
-  };
-
-  bogofilter = callPackage ../tools/misc/bogofilter { };
-
-  bsdiff = callPackage ../tools/compression/bsdiff { };
-
-  btar = callPackage ../tools/backup/btar { };
-
-  bud = callPackage ../tools/networking/bud {
-    inherit (pythonPackages) gyp;
-  };
-
-  bup = callPackage ../tools/backup/bup {
-    inherit (pythonPackages) pyxattr pylibacl setuptools fuse;
-    inherit (haskellPackages) pandoc;
-    par2Support = (config.bup.par2Support or false);
-  };
-
-  ori = callPackage ../tools/backup/ori { };
-
-  atool = callPackage ../tools/archivers/atool { };
-
-  bzip2 = callPackage ../tools/compression/bzip2 { };
-
-  cabextract = callPackage ../tools/archivers/cabextract { };
-
-  cadaver = callPackage ../tools/networking/cadaver { };
-
-  cantata = callPackage ../applications/audio/cantata { };
-
-  can-utils = callPackage ../os-specific/linux/can-utils { };
-
-  ccid = callPackage ../tools/security/ccid { };
-
-  ccrypt = callPackage ../tools/security/ccrypt { };
-
-  cdecl = callPackage ../development/tools/cdecl { };
-
-  cdrdao = callPackage ../tools/cd-dvd/cdrdao { };
-
-  cdrkit = callPackage ../tools/cd-dvd/cdrkit { };
-
-  ceph = callPackage ../tools/filesystems/ceph { };
-
-  cfdg = builderDefsPackage ../tools/graphics/cfdg {
-    inherit libpng bison flex ffmpeg;
-  };
-
-  checkinstall = callPackage ../tools/package-management/checkinstall { };
-
-  cheetahTemplate = builderDefsPackage (import ../tools/text/cheetah-template/2.0.1.nix) {
-    inherit makeWrapper python;
-  };
-
-  chkrootkit = callPackage ../tools/security/chkrootkit { };
-
-  chrony = callPackage ../tools/networking/chrony { };
-
-  chunkfs = callPackage ../tools/filesystems/chunkfs { };
-
-  chunksync = callPackage ../tools/backup/chunksync { };
-
-  cjdns = callPackage ../tools/networking/cjdns { };
-
-  cksfv = callPackage ../tools/networking/cksfv { };
-
-  clementine = callPackage ../applications/audio/clementine { };
-
-  ciopfs = callPackage ../tools/filesystems/ciopfs { };
-
-  colord = callPackage ../tools/misc/colord { };
-
-  colord-gtk = callPackage ../tools/misc/colord-gtk { };
-
-  colordiff = callPackage ../tools/text/colordiff { };
-
-  concurrencykit = callPackage ../development/libraries/concurrencykit { };
-
-  connect = callPackage ../tools/networking/connect { };
-
-  conspy = callPackage ../os-specific/linux/conspy {};
-
-  connman = callPackage ../tools/networking/connman { };
-
-  connmanui = callPackage ../tools/networking/connmanui { };
-
-  convertlit = callPackage ../tools/text/convertlit { };
-
-  collectd = callPackage ../tools/system/collectd { };
-
-  colormake = callPackage ../development/tools/build-managers/colormake { };
-
-  cowsay = callPackage ../tools/misc/cowsay { };
-
-  cpuminer = callPackage ../tools/misc/cpuminer { };
-
-  cuetools = callPackage ../tools/cd-dvd/cuetools { };
-
-  unifdef = callPackage ../development/tools/misc/unifdef { };
-
-  "unionfs-fuse" = callPackage ../tools/filesystems/unionfs-fuse { };
-
-  usb_modeswitch = callPackage ../development/tools/misc/usb-modeswitch { };
-
-  biosdevname = callPackage ../tools/networking/biosdevname { };
-
-  clamav = callPackage ../tools/security/clamav { };
-
-  cloc = callPackage ../tools/misc/cloc {
-    inherit (perlPackages) perl AlgorithmDiff RegexpCommon;
-  };
-
-  cloog = callPackage ../development/libraries/cloog { };
-
-  cloogppl = callPackage ../development/libraries/cloog-ppl { };
-
-  convmv = callPackage ../tools/misc/convmv { };
-
-  cool-old-term = callPackage ../applications/misc/cool-old-term { };
-
-  coreutils = callPackage ../tools/misc/coreutils
-    {
-      # TODO: Add ACL support for cross-Linux.
-      aclSupport = crossSystem == null && stdenv.isLinux;
-    };
-
-  cpio = callPackage ../tools/archivers/cpio { };
-
-  cromfs = callPackage ../tools/archivers/cromfs { };
-
-  cron = callPackage ../tools/system/cron { };
-
-  cudatoolkit5 = callPackage ../development/compilers/cudatoolkit/5.5.nix {
-    python = python26;
-  };
-
-  cudatoolkit6 = callPackage ../development/compilers/cudatoolkit/6.0.nix {
-    python = python26;
-  };
-
-  cudatoolkit = cudatoolkit5;
-
-  curl = callPackage ../tools/networking/curl rec {
-    fetchurl = fetchurlBoot;
-    zlibSupport = true;
-    sslSupport = zlibSupport;
-    scpSupport = zlibSupport && !stdenv.isSunOS && !stdenv.isCygwin;
-  };
-
-  curl3 = callPackage ../tools/networking/curl/7.15.nix rec {
-    zlibSupport = true;
-    sslSupport = zlibSupport;
-  };
-
-  cunit = callPackage ../tools/misc/cunit { };
-
-  curlftpfs = callPackage ../tools/filesystems/curlftpfs { };
-
-  cutter = callPackage ../tools/networking/cutter { };
-
-  dadadodo = builderDefsPackage (import ../tools/text/dadadodo) { };
-
-  daq = callPackage ../applications/networking/ids/daq { };
-
-  dar = callPackage ../tools/archivers/dar { };
-
-  davfs2 = callPackage ../tools/filesystems/davfs2 { };
-
-  dbench = callPackage ../development/tools/misc/dbench { };
-
-  dcraw = callPackage ../tools/graphics/dcraw { };
-
-  debian_devscripts = callPackage ../tools/misc/debian-devscripts {
-    inherit (perlPackages) CryptSSLeay LWP TimeDate DBFile FileDesktopEntry;
-  };
-
-  debootstrap = callPackage ../tools/misc/debootstrap { };
-
-  detox = callPackage ../tools/misc/detox { };
-
-  ddclient = callPackage ../tools/networking/ddclient { };
-
-  dd_rescue = callPackage ../tools/system/dd_rescue { };
-
-  ddrescue = callPackage ../tools/system/ddrescue { };
-
-  deluge = pythonPackages.deluge;
-
-  desktop_file_utils = callPackage ../tools/misc/desktop-file-utils { };
-
-  despotify = callPackage ../development/libraries/despotify { };
-
-  dev86 = callPackage ../development/compilers/dev86 { };
-
-  dnsmasq = callPackage ../tools/networking/dnsmasq { };
-
-  dnstop = callPackage ../tools/networking/dnstop { };
-
-  dhcp = callPackage ../tools/networking/dhcp { };
-
-  dhcpcd = callPackage ../tools/networking/dhcpcd { };
-
-  diffstat = callPackage ../tools/text/diffstat { };
-
-  diffutils = callPackage ../tools/text/diffutils { };
-
-  wgetpaste = callPackage ../tools/text/wgetpaste { };
-
-  dirmngr = callPackage ../tools/security/dirmngr { };
-
-  disper = callPackage ../tools/misc/disper { };
-
-  dmd = callPackage ../development/compilers/dmd { };
-
-  dmg2img = callPackage ../tools/misc/dmg2img { };
-
-  docbook2odf = callPackage ../tools/typesetting/docbook2odf {
-    inherit (perlPackages) PerlMagick;
-  };
-
-  docbook2x = callPackage ../tools/typesetting/docbook2x {
-    inherit (perlPackages) XMLSAX XMLParser XMLNamespaceSupport;
-  };
-
-  dosfstools = callPackage ../tools/filesystems/dosfstools { };
-
-  dotnetfx35 = callPackage ../development/libraries/dotnetfx35 { };
-
-  dotnetfx40 = callPackage ../development/libraries/dotnetfx40 { };
-
-  dropbear = callPackage ../tools/networking/dropbear { };
-
-  dtach = callPackage ../tools/misc/dtach { };
-
-  duo-unix = callPackage ../tools/security/duo-unix { };
-
-  duplicity = callPackage ../tools/backup/duplicity {
-    inherit (pythonPackages) boto lockfile;
-    gnupg = gnupg1;
-  };
-
-  duply = callPackage ../tools/backup/duply { };
-
-  dvdplusrwtools = callPackage ../tools/cd-dvd/dvd+rw-tools { };
-
-  dvgrab = callPackage ../tools/video/dvgrab { };
-
-  dvtm = callPackage ../tools/misc/dvtm { };
-
-  e2fsprogs = callPackage ../tools/filesystems/e2fsprogs { };
-
-  easyrsa = callPackage ../tools/networking/easyrsa { };
-
-  ebook_tools = callPackage ../tools/text/ebook-tools { };
-
-  ecryptfs = callPackage ../tools/security/ecryptfs { };
-
-  editres = callPackage ../tools/graphics/editres {
-    inherit (xlibs) libXt libXaw;
-    inherit (xorg) utilmacros;
-  };
-
-  edk2 = callPackage ../development/compilers/edk2 { };
-
-  efibootmgr = callPackage ../tools/system/efibootmgr { };
-
-  efivar = callPackage ../tools/system/efivar { };
-
-  evemu = callPackage ../tools/system/evemu { };
-
-  elasticsearch = callPackage ../servers/search/elasticsearch { };
-
-  elasticsearchPlugins = recurseIntoAttrs (
-    callPackage ../servers/search/elasticsearch/plugins.nix { }
-  );
-
-  emv = callPackage ../tools/misc/emv { };
-
-  enblendenfuse = callPackage ../tools/graphics/enblend-enfuse { };
-
-  encfs = callPackage ../tools/filesystems/encfs { };
-
-  enscript = callPackage ../tools/text/enscript { };
-
-  ethtool = callPackage ../tools/misc/ethtool { };
-
-  ettercap = callPackage ../applications/networking/sniffers/ettercap { };
-
-  euca2ools = callPackage ../tools/virtualization/euca2ools { pythonPackages = python26Packages; };
-
-  evtest = callPackage ../applications/misc/evtest { };
-
-  exempi = callPackage ../development/libraries/exempi { };
-
-  execline = callPackage ../tools/misc/execline { };
-
-  exercism = callPackage ../development/tools/exercism { };
-
-  exif = callPackage ../tools/graphics/exif { };
-
-  exiftags = callPackage ../tools/graphics/exiftags { };
-
-  extundelete = callPackage ../tools/filesystems/extundelete { };
-
-  expect = callPackage ../tools/misc/expect { };
-
-  f2fs-tools = callPackage ../tools/filesystems/f2fs-tools { };
-
-  fabric = pythonPackages.fabric;
-
-  fail2ban = callPackage ../tools/security/fail2ban {
-    systemd = systemd.override {
-      pythonSupport = true;
-    };
-  };
-
-  fakeroot = callPackage ../tools/system/fakeroot { };
-
-  fakechroot = callPackage ../tools/system/fakechroot { };
-
-  fcitx = callPackage ../tools/inputmethods/fcitx { };
-
-  fcron = callPackage ../tools/system/fcron { };
-
-  fdm = callPackage ../tools/networking/fdm {};
-
-  figlet = callPackage ../tools/misc/figlet { };
-
-  file = callPackage ../tools/misc/file { };
-
-  filegive = callPackage ../tools/networking/filegive { };
-
-  fileschanged = callPackage ../tools/misc/fileschanged { };
-
-  findutils = callPackage ../tools/misc/findutils { };
-
-  finger_bsd = callPackage ../tools/networking/bsd-finger { };
-
-  fio = callPackage ../tools/system/fio { };
-
-  flashtool = callPackage_i686 ../development/mobile/flashtool {
-    platformTools = androidenv.platformTools;
-  };
-
-  flpsed = callPackage ../applications/editors/flpsed { };
-
-  flvstreamer = callPackage ../tools/networking/flvstreamer { };
-
-  libbsd = callPackage ../development/libraries/libbsd { };
-
-  lprof = callPackage ../tools/graphics/lprof { };
-
-  fdk_aac = callPackage ../development/libraries/fdk-aac { };
-
-  flvtool2 = callPackage ../tools/video/flvtool2 { };
-
-  fontforge = lowPrio (callPackage ../tools/misc/fontforge { });
-
-  fontforgeX = callPackage ../tools/misc/fontforge {
-    withX11 = true;
-  };
-
-  forktty = callPackage ../os-specific/linux/forktty {};
-
-  fortune = callPackage ../tools/misc/fortune { };
-
-  fox = callPackage ../development/libraries/fox/default.nix {
-    libpng = libpng12;
-  };
-
-  fox_1_6 = callPackage ../development/libraries/fox/fox-1.6.nix { };
-
-  fping = callPackage ../tools/networking/fping {};
-
-  fprot = callPackage ../tools/security/fprot { };
-
-  freeipmi = callPackage ../tools/system/freeipmi {};
-
-  freetalk = callPackage ../applications/networking/instant-messengers/freetalk {
-    guile = guile_1_8;
-  };
-
-  freetds = callPackage ../development/libraries/freetds { };
-
-  ftgl = callPackage ../development/libraries/ftgl { };
-
-  ftgl212 = callPackage ../development/libraries/ftgl/2.1.2.nix { };
-
-  fuppes = callPackage ../tools/networking/fuppes {
-    ffmpeg = ffmpeg_0_6_90;
-  };
-
-  fsfs = callPackage ../tools/filesystems/fsfs { };
-
-  fuse_zip = callPackage ../tools/filesystems/fuse-zip { };
-
-  fuse_exfat = callPackage ../tools/filesystems/fuse-exfat { };
-
-  dos2unix = callPackage ../tools/text/dos2unix { };
-
-  uni2ascii = callPackage ../tools/text/uni2ascii { };
-
-  g500-control = callPackage ../tools/misc/g500-control { };
-
-  galculator = callPackage ../applications/misc/galculator {
-    gtk = gtk3;
-  };
-
-  gawk = callPackage ../tools/text/gawk { };
-
-  gawkInteractive = appendToName "interactive"
-    (gawk.override { readlineSupport = true; });
-
-  gbdfed = callPackage ../tools/misc/gbdfed {
-    gtk = gtk2;
-  };
-
-  gdmap = callPackage ../tools/system/gdmap { };
-
-  genext2fs = callPackage ../tools/filesystems/genext2fs { };
-
-  gengetopt = callPackage ../development/tools/misc/gengetopt { };
-
-  getmail = callPackage ../tools/networking/getmail { };
-
-  getopt = callPackage ../tools/misc/getopt { };
-
-  gftp = callPackage ../tools/networking/gftp { };
-
-  gifsicle = callPackage ../tools/graphics/gifsicle { };
-
-  glusterfs = callPackage ../tools/filesystems/glusterfs { };
-
-  glmark2 = callPackage ../tools/graphics/glmark2 { };
-
-  glxinfo = callPackage ../tools/graphics/glxinfo { };
-
-  gmvault = callPackage ../tools/networking/gmvault { };
-
-  gnokii = builderDefsPackage (import ../tools/misc/gnokii) {
-    inherit intltool perl gettext libusb pkgconfig bluez readline pcsclite
-      libical gtk glib;
-    inherit (xorg) libXpm;
-  };
-
-  gnufdisk = callPackage ../tools/system/fdisk {
-    guile = guile_1_8;
-  };
-
-  gnugrep = callPackage ../tools/text/gnugrep {
-    libiconv = libiconvOrNull;
-  };
-
-  gnulib = callPackage ../development/tools/gnulib { };
-
-  gnupatch = callPackage ../tools/text/gnupatch { };
-
-  gnupg1orig = callPackage ../tools/security/gnupg1 { };
-
-  gnupg1compat = callPackage ../tools/security/gnupg1compat { };
-
-  # use config.packageOverrides if you prefer original gnupg1
-  gnupg1 = gnupg1compat;
-
-  gnupg = callPackage ../tools/security/gnupg { libusb = libusb1; };
-
-  gnupg2_1 = lowPrio (callPackage ../tools/security/gnupg/git.nix {
-    libassuan = libassuan2_1;
-  });
-
-  gnuplot = callPackage ../tools/graphics/gnuplot { };
-
-  gnuplot_qt = gnuplot.override { withQt = true; };
-
-  # must have AquaTerm installed separately
-  gnuplot_aquaterm = gnuplot.override { aquaterm = true; };
-
-  gnused = callPackage ../tools/text/gnused { };
-
-  gnutar = callPackage ../tools/archivers/gnutar { };
-
-  gnuvd = callPackage ../tools/misc/gnuvd { };
-
-  goaccess = callPackage ../tools/misc/goaccess { };
-
-  googleAuthenticator = callPackage ../os-specific/linux/google-authenticator { };
-
-  gource = callPackage ../applications/version-management/gource {};
-
-  gpodder = callPackage ../applications/audio/gpodder { };
-
-  gptfdisk = callPackage ../tools/system/gptfdisk { };
-
-  grafana = callPackage ../development/tools/misc/grafana { };
-
-  grafx2 = callPackage ../applications/graphics/grafx2 {};
-
-  graphviz = callPackage ../tools/graphics/graphviz { };
-
-  /* Readded by Michael Raskin. There are programs in the wild
-   * that do want 2.0 but not 2.22. Please give a day's notice for
-   * objections before removal.
-   */
-  graphviz_2_0 = callPackage ../tools/graphics/graphviz/2.0.nix { };
-
-  grive = callPackage ../tools/filesystems/grive {
-    json_c = json-c-0-11; # won't configure with 0.12; others are vulnerable
-  };
-
-  groff = callPackage ../tools/text/groff {
-    ghostscript = null;
-  };
-
-  grub = callPackage_i686 ../tools/misc/grub {
-    buggyBiosCDSupport = config.grub.buggyBiosCDSupport or true;
-  };
-
-  grub2 = callPackage ../tools/misc/grub/2.0x.nix { libusb = libusb1; flex = flex_2_5_35; };
-
-  grub2_efi = grub2.override { EFIsupport = true; };
-
-  gssdp = callPackage ../development/libraries/gssdp {
-    inherit (gnome) libsoup;
-  };
-
-  gt5 = callPackage ../tools/system/gt5 { };
-
-  gtest = callPackage ../development/libraries/gtest {};
-
-  gtkdatabox = callPackage ../development/libraries/gtkdatabox {};
-
-  gtkgnutella = callPackage ../tools/networking/p2p/gtk-gnutella { };
-
-  gtkvnc = callPackage ../tools/admin/gtk-vnc {};
-
-  gtmess = callPackage ../applications/networking/instant-messengers/gtmess { };
-
-  gummiboot = callPackage ../tools/misc/gummiboot { };
-
-  gupnp = callPackage ../development/libraries/gupnp {
-    inherit (gnome) libsoup;
-  };
-
-  gupnp_av = callPackage ../development/libraries/gupnp-av {};
-
-  gupnp_igd = callPackage ../development/libraries/gupnp-igd {};
-
-  gupnptools = callPackage ../tools/networking/gupnp-tools {};
-
-  gvpe = builderDefsPackage ../tools/networking/gvpe {
-    inherit openssl gmp nettools iproute;
-  };
-
-  gvolicon = callPackage ../tools/audio/gvolicon {};
-
-  gzip = callPackage ../tools/compression/gzip { };
-
-  gzrt = callPackage ../tools/compression/gzrt { };
-
-  partclone = callPackage ../tools/backup/partclone { };
-
-  partimage = callPackage ../tools/backup/partimage { };
-
-  pigz = callPackage ../tools/compression/pigz { };
-
-  haproxy = callPackage ../tools/networking/haproxy { };
-
-  haveged = callPackage ../tools/security/haveged { };
-
-  hardlink = callPackage ../tools/system/hardlink { };
-
-  hashcat = callPackage ../tools/security/hashcat { };
-
-  halibut = callPackage ../tools/typesetting/halibut { };
-
-  hddtemp = callPackage ../tools/misc/hddtemp { };
-
-  hdf5 = callPackage ../tools/misc/hdf5 {
-    szip = null;
-  };
-
-  heimdall = callPackage ../tools/misc/heimdall { };
-
-  hevea = callPackage ../tools/typesetting/hevea { };
-
-  highlight = callPackage ../tools/text/highlight {
-    lua = lua5;
-  };
-
-  host = callPackage ../tools/networking/host { };
-
-  hping = callPackage ../tools/networking/hping { };
-
-  httpie = callPackage ../tools/networking/httpie { };
-
-  httpfs2 = callPackage ../tools/filesystems/httpfs { };
-
-  # FIXME: This Hydra snapshot is outdated and depends on the `nixPerl',
-  # which no longer exists.
-  #
-  # hydra = callPackage ../development/tools/misc/hydra {
-  #   nix = nixUnstable;
-  # };
-
-  iasl = callPackage ../development/compilers/iasl { };
-
-  icecast = callPackage ../servers/icecast { };
-
-  icoutils = callPackage ../tools/graphics/icoutils { };
-
-  idutils = callPackage ../tools/misc/idutils { };
-
-  idle3tools = callPackage ../tools/system/idle3tools { };
-
-  iftop = callPackage ../tools/networking/iftop { };
-
-  imapproxy = callPackage ../tools/networking/imapproxy { };
-
-  imapsync = callPackage ../tools/networking/imapsync {
-    inherit (perlPackages) MailIMAPClient;
-  };
-
-  inadyn = callPackage ../tools/networking/inadyn { };
-
-  inetutils = callPackage ../tools/networking/inetutils { };
-
-  ioping = callPackage ../tools/system/ioping {};
-
-  iodine = callPackage ../tools/networking/iodine { };
-
-  iperf = callPackage ../tools/networking/iperf { };
-
-  ipmitool = callPackage ../tools/system/ipmitool {
-    static = false;
-  };
-
-  ipmiutil = callPackage ../tools/system/ipmiutil {};
-
-  ised = callPackage ../tools/misc/ised {};
-
-  isl = callPackage ../development/libraries/isl { };
-  isl_0_12 = callPackage ../development/libraries/isl/0.12.2.nix { };
-
-  isync = callPackage ../tools/networking/isync { };
-
-  jd-gui = callPackage_i686 ../tools/security/jd-gui { };
-
-  jdiskreport = callPackage ../tools/misc/jdiskreport { };
-
-  jfsrec = callPackage ../tools/filesystems/jfsrec {
-    boost = boost144;
-  };
-
-  jfsutils = callPackage ../tools/filesystems/jfsutils { };
-
-  jhead = callPackage ../tools/graphics/jhead { };
-
-  jing = callPackage ../tools/text/xml/jing { };
-
-  jmtpfs = callPackage ../tools/filesystems/jmtpfs { };
-
-  jnettop = callPackage ../tools/networking/jnettop { };
-
-  jq = callPackage ../development/tools/jq {};
-
-  jscoverage = callPackage ../development/tools/misc/jscoverage { };
-
-  jwhois = callPackage ../tools/networking/jwhois { };
-
-  kazam = callPackage ../applications/video/kazam { };
-
-  kalibrate-rtl = callPackage ../tools/misc/kalibrate-rtl { };
-
-  kexectools = callPackage ../os-specific/linux/kexectools { };
-
-  keychain = callPackage ../tools/misc/keychain { };
-
-  kismet = callPackage ../applications/networking/sniffers/kismet { };
-
-  less = callPackage ../tools/misc/less { };
-
-  lockfileProgs = callPackage ../tools/misc/lockfile-progs { };
-
-  logstash = callPackage ../tools/misc/logstash { };
-
-  logstash-forwarder = callPackage ../tools/misc/logstash-forwarder { };
-
-  kippo = callPackage ../servers/kippo { };
-
-  klavaro = callPackage ../games/klavaro {};
-
-  kzipmix = callPackage_i686 ../tools/compression/kzipmix { };
-
-  minidlna = callPackage ../tools/networking/minidlna {
-    ffmpeg = ffmpeg_0_10;
-  };
-
-  mmv = callPackage ../tools/misc/mmv { };
-
-  most = callPackage ../tools/misc/most { };
-
-  multitail = callPackage ../tools/misc/multitail { };
-
-  netperf = callPackage ../applications/networking/netperf { };
-
-  ninka = callPackage ../development/tools/misc/ninka { };
-
-  nodejs = callPackage ../development/web/nodejs {};
-
-  nodePackages = recurseIntoAttrs (import ./node-packages.nix {
-    inherit pkgs stdenv nodejs fetchurl fetchgit;
-    neededNatives = [python] ++ lib.optional (lib.elem system lib.platforms.linux) utillinux;
-    self = pkgs.nodePackages;
-  });
-
-  ldapvi = callPackage ../tools/misc/ldapvi { };
-
-  ldns = callPackage ../development/libraries/ldns { };
-
-  lftp = callPackage ../tools/networking/lftp { };
-
-  libconfig = callPackage ../development/libraries/libconfig { };
-
-  libee = callPackage ../development/libraries/libee { };
-
-  libestr = callPackage ../development/libraries/libestr { };
-
-  libevdev = callPackage ../development/libraries/libevdev { };
-
-  liboauth = callPackage ../development/libraries/liboauth { };
-
-  libtirpc = callPackage ../development/libraries/ti-rpc { };
-
-  libshout = callPackage ../development/libraries/libshout { };
-
-  libqmi = callPackage ../development/libraries/libqmi { };
-
-  libmbim = callPackage ../development/libraries/libmbim { };
-
-  libtorrent = callPackage ../tools/networking/p2p/libtorrent { };
-
-  logcheck = callPackage ../tools/system/logcheck {
-    inherit (perlPackages) mimeConstruct;
-  };
-
-  logrotate = callPackage ../tools/system/logrotate { };
-
-  logstalgia = callPackage ../tools/graphics/logstalgia {};
-
-  lout = callPackage ../tools/typesetting/lout { };
-
-  lrzip = callPackage ../tools/compression/lrzip { };
-
-  # lsh installs `bin/nettle-lfib-stream' and so does Nettle.  Give the
-  # former a lower priority than Nettle.
-  lsh = lowPrio (callPackage ../tools/networking/lsh { });
-
-  lshw = callPackage ../tools/system/lshw { };
-
-  lxc = callPackage ../os-specific/linux/lxc { };
-
-  lzip = callPackage ../tools/compression/lzip { };
-
-  lzma = xz;
-
-  xz = callPackage ../tools/compression/xz { };
-
-  lzop = callPackage ../tools/compression/lzop { };
-
-  maildrop = callPackage ../tools/networking/maildrop { };
-
-  mailpile = callPackage ../applications/networking/mailreaders/mailpile { };
-
-  mailutils = callPackage ../tools/networking/mailutils {
-    guile = guile_1_8;
-  };
-
-  mairix = callPackage ../tools/text/mairix { };
-
-  makemkv = callPackage ../applications/video/makemkv { };
-
-  man = callPackage ../tools/misc/man { };
-
-  man_db = callPackage ../tools/misc/man-db { };
-
-  memtest86 = callPackage ../tools/misc/memtest86 { };
-
-  memtest86plus = callPackage ../tools/misc/memtest86+ { };
-
-  meo = callPackage ../tools/security/meo { };
-
-  mc = callPackage ../tools/misc/mc { };
-
-  mcabber = callPackage ../applications/networking/instant-messengers/mcabber { };
-
-  mcron = callPackage ../tools/system/mcron {
-    guile = guile_1_8;
-  };
-
-  mdbtools = callPackage ../tools/misc/mdbtools { };
-
-  mdbtools_git = callPackage ../tools/misc/mdbtools/git.nix {
-    inherit (gnome) scrollkeeper;
-  };
-
-  mednafen = callPackage ../misc/emulators/mednafen { };
-
-  mednafen-server = callPackage ../misc/emulators/mednafen/server.nix { };
-
-  megacli = callPackage ../tools/misc/megacli { };
-
-  megatools = callPackage ../tools/networking/megatools { };
-
-  mfcuk = callPackage ../tools/security/mfcuk { };
-
-  minecraft = callPackage ../games/minecraft { };
-
-  minecraft-server = callPackage ../games/minecraft-server { };
-
-  minetest = callPackage ../games/minetest {
-    libpng = libpng12;
-  };
-
-  miniupnpc = callPackage ../tools/networking/miniupnpc { };
-
-  miniupnpd = callPackage ../tools/networking/miniupnpd { };
-
-  minixml = callPackage ../development/libraries/minixml { };
-
-  mjpegtools = callPackage ../tools/video/mjpegtools { };
-
-  mkcue = callPackage ../tools/cd-dvd/mkcue { };
-
-  mkpasswd = callPackage ../tools/security/mkpasswd { };
-
-  mktemp = callPackage ../tools/security/mktemp { };
-
-  mktorrent = callPackage ../tools/misc/mktorrent { };
-
-  modemmanager = callPackage ../tools/networking/modemmanager {};
-
-  monit = callPackage ../tools/system/monit { };
-
-  mosh = callPackage ../tools/networking/mosh {
-    boost = boostHeaders;
-    inherit (perlPackages) IOTty;
-  };
-
-  mpage = callPackage ../tools/text/mpage { };
-
-  mr = callPackage ../applications/version-management/mr { };
-
-  mscgen = callPackage ../tools/graphics/mscgen { };
-
-  msf = builderDefsPackage (import ../tools/security/metasploit/3.1.nix) {
-    inherit ruby makeWrapper;
-  };
-
-  mssys = callPackage ../tools/misc/mssys { };
-
-  mtdutils = callPackage ../tools/filesystems/mtdutils { };
-
-  mtools = callPackage ../tools/filesystems/mtools { };
-
-  mtr = callPackage ../tools/networking/mtr {};
-
-  multitran = recurseIntoAttrs (let callPackage = newScope pkgs.multitran; in rec {
-    multitrandata = callPackage ../tools/text/multitran/data { };
-
-    libbtree = callPackage ../tools/text/multitran/libbtree { };
-
-    libmtsupport = callPackage ../tools/text/multitran/libmtsupport { };
-
-    libfacet = callPackage ../tools/text/multitran/libfacet { };
-
-    libmtquery = callPackage ../tools/text/multitran/libmtquery { };
-
-    mtutils = callPackage ../tools/text/multitran/mtutils { };
-  });
-
-  munge = callPackage ../tools/security/munge { };
-
-  muscleframework = callPackage ../tools/security/muscleframework { };
-
-  muscletool = callPackage ../tools/security/muscletool { };
-
-  mysql2pgsql = callPackage ../tools/misc/mysql2pgsql { };
-
-  namazu = callPackage ../tools/text/namazu { };
-
-  nbd = callPackage ../tools/networking/nbd { };
-
-  ndjbdns = callPackage ../tools/networking/ndjbdns { };
-
-  netatalk = callPackage ../tools/filesystems/netatalk { };
-
-  netcdf = callPackage ../development/libraries/netcdf { };
-
-  nc6 = callPackage ../tools/networking/nc6 { };
-
-  ncat = callPackage ../tools/networking/ncat { };
-
-  ncftp = callPackage ../tools/networking/ncftp { };
-
-  ncompress = callPackage ../tools/compression/ncompress { };
-
-  ndisc6 = callPackage ../tools/networking/ndisc6 { };
-
-  netboot = callPackage ../tools/networking/netboot {};
-
-  netcat = callPackage ../tools/networking/netcat { };
-
-  netcat-openbsd = callPackage ../tools/networking/netcat-openbsd { };
-
-  nethogs = callPackage ../tools/networking/nethogs { };
-
-  netkittftp = callPackage ../tools/networking/netkit/tftp { };
-
-  netpbm = callPackage ../tools/graphics/netpbm { };
-
-  netrw = callPackage ../tools/networking/netrw { };
-
-  netselect = callPackage ../tools/networking/netselect { };
-
-  networkmanager = callPackage ../tools/networking/network-manager { };
-
-  networkmanager_openvpn = callPackage ../tools/networking/network-manager/openvpn.nix { };
-
-  networkmanager_pptp = callPackage ../tools/networking/network-manager/pptp.nix { };
-
-  networkmanager_vpnc = callPackage ../tools/networking/network-manager/vpnc.nix { };
-
-  networkmanager_openconnect = callPackage ../tools/networking/network-manager/openconnect.nix { };
-
-  networkmanagerapplet = newScope gnome ../tools/networking/network-manager-applet { dconf = gnome3.dconf; };
-
-  newsbeuter = callPackage ../applications/networking/feedreaders/newsbeuter { };
-
-  newsbeuter-dev = callPackage ../applications/networking/feedreaders/newsbeuter/dev.nix { };
-
-  ngrep = callPackage ../tools/networking/ngrep { };
-
-  ngrok = callPackage ../tools/misc/ngrok { };
-
-  mpack = callPackage ../tools/networking/mpack { };
-
-  pa_applet = callPackage ../tools/audio/pa-applet { };
-
-  pnmixer = callPackage ../tools/audio/pnmixer { };
-
-  nifskope = callPackage ../tools/graphics/nifskope { };
-
-  nilfs_utils = callPackage ../tools/filesystems/nilfs-utils {};
-
-  nitrogen = callPackage ../tools/X11/nitrogen {};
-
-  nlopt = callPackage ../development/libraries/nlopt {};
-
-  npapi_sdk = callPackage ../development/libraries/npapi-sdk {};
-
-  npth = callPackage ../development/libraries/npth {};
-
-  nmap = callPackage ../tools/security/nmap { };
-
-  nmap_graphical = callPackage ../tools/security/nmap {
-    inherit (pythonPackages) pysqlite;
-    graphicalSupport = true;
-  };
-
-  notbit = callPackage ../applications/networking/notbit { };
-
-  nox = callPackage ../tools/package-management/nox {
-    pythonPackages = python3Packages;
-    nix = nixUnstable;
-  };
-
-  nss_pam_ldapd = callPackage ../tools/networking/nss-pam-ldapd {};
-
-  ntfs3g = callPackage ../tools/filesystems/ntfs-3g { };
-
-  # ntfsprogs are merged into ntfs-3g
-  ntfsprogs = pkgs.ntfs3g;
-
-  ntop = callPackage ../tools/networking/ntop { };
-
-  ntopng = callPackage ../tools/networking/ntopng { };
-
-  ntp = callPackage ../tools/networking/ntp { };
-
-  numdiff = callPackage ../tools/text/numdiff { };
-
-  nssmdns = callPackage ../tools/networking/nss-mdns { };
-
-  nwdiag = pythonPackages.nwdiag;
-
-  nylon = callPackage ../tools/networking/nylon { };
-
-  nzbget = callPackage ../tools/networking/nzbget { };
-
-  oathToolkit = callPackage ../tools/security/oath-toolkit { };
-
-  obex_data_server = callPackage ../tools/bluetooth/obex-data-server { };
-
-  obexd = callPackage ../tools/bluetooth/obexd { };
-
-  obexfs = callPackage ../tools/bluetooth/obexfs { };
-
-  obexftp = callPackage ../tools/bluetooth/obexftp { };
-
-  obnam = callPackage ../tools/backup/obnam { };
-
-  odt2txt = callPackage ../tools/text/odt2txt { };
-
-  offlineimap = callPackage ../tools/networking/offlineimap {
-    inherit (pythonPackages) sqlite3;
-  };
-
-  opendbx = callPackage ../development/libraries/opendbx { };
-
-  opendkim = callPackage ../development/libraries/opendkim { };
-
-  opendylan = callPackage ../development/compilers/opendylan {
-    opendylan-bootstrap = opendylan_bin;
-  };
-
-  opendylan_bin = callPackage ../development/compilers/opendylan/bin.nix { };
-
-  openjade = callPackage ../tools/text/sgml/openjade { };
-
-  openobex = callPackage ../tools/bluetooth/openobex { };
-
-  openopc = callPackage ../tools/misc/openopc {
-    pythonFull = python27Full.override {
-      extraLibs = [ python27Packages.pyro3 ];
-    };
-  };
-
-  openresolv = callPackage ../tools/networking/openresolv { };
-
-  opensc = callPackage ../tools/security/opensc { };
-
-  opensc_dnie_wrapper = callPackage ../tools/security/opensc-dnie-wrapper { };
-
-  openssh =
-    callPackage ../tools/networking/openssh {
-      hpnSupport = false;
-      withKerberos = false;
-      etcDir = "/etc/ssh";
-      pam = if stdenv.isLinux then pam else null;
-    };
-
-  openssh_hpn = pkgs.appendToName "with-hpn" (openssh.override { hpnSupport = true; });
-
-  openssh_with_kerberos = pkgs.appendToName "with-kerberos" (openssh.override { withKerberos = true; });
-
-  opensp = callPackage ../tools/text/sgml/opensp { };
-
-  spCompat = callPackage ../tools/text/sgml/opensp/compat.nix { };
-
-  openvpn = callPackage ../tools/networking/openvpn { };
-
-  openvpn_learnaddress = callPackage ../tools/networking/openvpn/openvpn_learnaddress.nix { };
-
-  optipng = callPackage ../tools/graphics/optipng {
-    libpng = libpng12;
-  };
-
-  oslrd = callPackage ../tools/networking/oslrd { };
-
-  ossec = callPackage ../tools/security/ossec {};
-
-  otpw = callPackage ../os-specific/linux/otpw { };
-
-  p7zip = callPackage ../tools/archivers/p7zip { };
-
-  pal = callPackage ../tools/misc/pal { };
-
-  panomatic = callPackage ../tools/graphics/panomatic { };
-
-  par2cmdline = callPackage ../tools/networking/par2cmdline { };
-
-  parallel = callPackage ../tools/misc/parallel { };
-
-  parcellite = callPackage ../tools/misc/parcellite { };
-
-  patchutils = callPackage ../tools/text/patchutils { };
-
-  parted = callPackage ../tools/misc/parted { hurd = null; };
-
-  pitivi = callPackage ../applications/video/pitivi {
-    gst = gst_all_1;
-    clutter-gtk = clutter_gtk;
-    inherit (gnome3) gnome_icon_theme gnome_icon_theme_symbolic;
-  };
-
-  p0f = callPackage ../tools/security/p0f { };
-
-  pngout = callPackage ../tools/graphics/pngout { };
-
-  hurdPartedCross =
-    if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-    then (makeOverridable
-            ({ hurd }:
-              (parted.override {
-                # Needs the Hurd's libstore.
-                inherit hurd;
-
-                # The Hurd wants a libparted.a.
-                enableStatic = true;
-
-                gettext = null;
-                readline = null;
-                devicemapper = null;
-              }).crossDrv)
-           { hurd = gnu.hurdCrossIntermediate; })
-    else null;
-
-  ipsecTools = callPackage ../os-specific/linux/ipsec-tools { flex = flex_2_5_35; };
-
-  patch = gnupatch;
-
-  pbzip2 = callPackage ../tools/compression/pbzip2 { };
-
-  pciutils = callPackage ../tools/system/pciutils { };
-
-  pcsclite = callPackage ../tools/security/pcsclite { };
-
-  pdf2djvu = callPackage ../tools/typesetting/pdf2djvu { };
-
-  pdfjam = callPackage ../tools/typesetting/pdfjam { };
-
-  jbig2enc = callPackage ../tools/graphics/jbig2enc { };
-
-  pdfread = callPackage ../tools/graphics/pdfread { };
-
-  briss = callPackage ../tools/graphics/briss { };
-
-  bully = callPackage ../tools/networking/bully { };
-
-  pdnsd = callPackage ../tools/networking/pdnsd { };
-
-  peco = callPackage ../tools/text/peco { };
-
-  pg_top = callPackage ../tools/misc/pg_top { };
-
-  pdsh = callPackage ../tools/networking/pdsh {
-    rsh = true;          # enable internal rsh implementation
-    ssh = openssh;
-  };
-
-  pfstools = callPackage ../tools/graphics/pfstools { };
-
-  philter = callPackage ../tools/networking/philter { };
-
-  pinentry = callPackage ../tools/security/pinentry { };
-
-  pius = callPackage ../tools/security/pius { };
-
-  pk2cmd = callPackage ../tools/misc/pk2cmd { };
-
-  plantuml = callPackage ../tools/misc/plantuml { };
-
-  plan9port = callPackage ../tools/system/plan9port { };
-
-  ploticus = callPackage ../tools/graphics/ploticus {
-    libpng = libpng12;
-  };
-
-  plotutils = callPackage ../tools/graphics/plotutils { };
-
-  plowshare = callPackage ../tools/misc/plowshare { };
-
-  pngcrush = callPackage ../tools/graphics/pngcrush { };
-
-  pngnq = callPackage ../tools/graphics/pngnq { };
-
-  pngtoico = callPackage ../tools/graphics/pngtoico {
-    libpng = libpng12;
-  };
-
-  pngquant = callPackage ../tools/graphics/pngquant { };
-
-  podiff = callPackage ../tools/text/podiff { };
-
-  poedit = callPackage ../tools/text/poedit { };
-
-  polipo = callPackage ../servers/polipo { };
-
-  polkit_gnome = callPackage ../tools/security/polkit-gnome { };
-
-  ponysay = callPackage ../tools/misc/ponysay { };
-
-  povray = callPackage ../tools/graphics/povray { };
-
-  ppl = callPackage ../development/libraries/ppl { };
-
-  ppp = callPackage ../tools/networking/ppp { };
-
-  pptp = callPackage ../tools/networking/pptp {};
-
-  prey-bash-client = callPackage ../tools/security/prey { };
-
-  projectm = callPackage ../applications/audio/projectm { };
-
-  proxychains = callPackage ../tools/networking/proxychains { };
-
-  proxytunnel = callPackage ../tools/misc/proxytunnel { };
-
-  cntlm = callPackage ../tools/networking/cntlm { };
-
-  pastebinit = callPackage ../tools/misc/pastebinit { };
-
-  psmisc = callPackage ../os-specific/linux/psmisc { };
-
-  pstoedit = callPackage ../tools/graphics/pstoedit { };
-
-  pv = callPackage ../tools/misc/pv { };
-
-  pwgen = callPackage ../tools/security/pwgen { };
-
-  pwnat = callPackage ../tools/networking/pwnat { };
-
-  pycangjie = callPackage ../development/python-modules/pycangjie { };
-
-  pydb = callPackage ../development/tools/pydb { };
-
-  pystringtemplate = callPackage ../development/python-modules/stringtemplate { };
-
-  pythonDBus = dbus_python;
-
-  pythonIRClib = builderDefsPackage (import ../development/python-modules/irclib) {
-    inherit python;
-  };
-
-  pythonSexy = builderDefsPackage (import ../development/python-modules/libsexy) {
-    inherit python libsexy pkgconfig libxml2 pygtk pango gtk glib;
-  };
-
-  openmpi = callPackage ../development/libraries/openmpi { };
-
-  qhull = callPackage ../development/libraries/qhull { };
-
-  qjoypad = callPackage ../tools/misc/qjoypad { };
-
-  qshowdiff = callPackage ../tools/text/qshowdiff { };
-
-  quilt = callPackage ../development/tools/quilt { };
-
-  radvd = callPackage ../tools/networking/radvd { };
-
-  ranger = callPackage ../applications/misc/ranger { };
-
-  privateer = callPackage ../games/privateer { };
-
-  rtmpdump = callPackage ../tools/video/rtmpdump { };
-
-  reaverwps = callPackage ../tools/networking/reaver-wps {};
-
-  recutils = callPackage ../tools/misc/recutils { };
-
-  recoll = callPackage ../applications/search/recoll { };
-
-  reiser4progs = callPackage ../tools/filesystems/reiser4progs { };
-
-  reiserfsprogs = callPackage ../tools/filesystems/reiserfsprogs { };
-
-  relfs = callPackage ../tools/filesystems/relfs {
-    inherit (gnome) gnome_vfs GConf;
-  };
-
-  remarkjs = callPackage ../development/web/remarkjs { };
-
-  remind = callPackage ../tools/misc/remind { };
-
-  remmina = callPackage ../applications/networking/remote/remmina {};
-
-  renameutils = callPackage ../tools/misc/renameutils { };
-
-  replace = callPackage ../tools/text/replace { };
-
-  reptyr = callPackage ../os-specific/linux/reptyr {};
-
-  rdiff_backup = callPackage ../tools/backup/rdiff-backup { };
-
-  rdmd = callPackage ../development/compilers/rdmd { };
-
-  rhash = callPackage ../tools/security/rhash { };
-
-  riemann_c_client = callPackage ../tools/misc/riemann-c-client { };
-
-  ripmime = callPackage ../tools/networking/ripmime {};
-
-  rkflashtool = callPackage ../tools/misc/rkflashtool { };
-
-  rmlint = callPackage ../tools/misc/rmlint {};
-
-  rng_tools = callPackage ../tools/security/rng-tools { };
-
-  rsnapshot = callPackage ../tools/backup/rsnapshot {
-    # For the `logger' command, we can use either `utillinux' or
-    # GNU Inetutils.  The latter is more portable.
-    logger = inetutils;
-  };
-
-  rlwrap = callPackage ../tools/misc/rlwrap { };
-
-  rockbox_utility = callPackage ../tools/misc/rockbox-utility { };
-
-  rpPPPoE = builderDefsPackage (import ../tools/networking/rp-pppoe) {
-    inherit ppp;
-  };
-
-  rpm = callPackage ../tools/package-management/rpm { };
-
-  rrdtool = callPackage ../tools/misc/rrdtool { };
-
-  rtorrent = callPackage ../tools/networking/p2p/rtorrent { };
-
-  rubber = callPackage ../tools/typesetting/rubber { };
-
-  rxp = callPackage ../tools/text/xml/rxp { };
-
-  rzip = callPackage ../tools/compression/rzip { };
-
-  s3backer = callPackage ../tools/filesystems/s3backer { };
-
-  s3cmd = callPackage ../tools/networking/s3cmd { };
-
-  s3cmd_15_pre_81e3842f7a = lowPrio (callPackage ../tools/networking/s3cmd/git.nix { });
-
-  s3sync = callPackage ../tools/networking/s3sync {
-    ruby = ruby18;
-  };
-
-  sablotron = callPackage ../tools/text/xml/sablotron { };
-
-  safecopy = callPackage ../tools/system/safecopy { };
-
-  salut_a_toi = callPackage ../applications/networking/instant-messengers/salut-a-toi {};
-
-  samplicator = callPackage ../tools/networking/samplicator { };
-
-  screen = callPackage ../tools/misc/screen { };
-
-  scrot = callPackage ../tools/graphics/scrot { };
-
-  scrypt = callPackage ../tools/security/scrypt { };
-
-  sdcv = callPackage ../applications/misc/sdcv { };
-
-  sec = callPackage ../tools/admin/sec { };
-
-  seccure = callPackage ../tools/security/seccure { };
-
-  setserial = builderDefsPackage (import ../tools/system/setserial) {
-    inherit groff;
-  };
-
-  seqdiag = pythonPackages.seqdiag;
-
-  screenfetch = callPackage ../tools/misc/screenfetch { };
-
-  sg3_utils = callPackage ../tools/system/sg3_utils { };
-
-  sharutils = callPackage ../tools/archivers/sharutils { };
-
-  shotwell = callPackage ../applications/graphics/shotwell { };
-
-  shebangfix = callPackage ../tools/misc/shebangfix { };
-
-  shellinabox = callPackage ../servers/shellinabox { };
-
-  siege = callPackage ../tools/networking/siege {};
-
-  silc_client = callPackage ../applications/networking/instant-messengers/silc-client { };
-
-  silc_server = callPackage ../servers/silc-server { };
-
-  silver-searcher = callPackage ../tools/text/silver-searcher { };
-
-  simplescreenrecorder = callPackage ../applications/video/simplescreenrecorder { };
-
-  sleuthkit = callPackage ../tools/system/sleuthkit {};
-
-  slimrat = callPackage ../tools/networking/slimrat {
-    inherit (perlPackages) WWWMechanize LWP;
-  };
-
-  slsnif = callPackage ../tools/misc/slsnif { };
-
-  smartmontools = callPackage ../tools/system/smartmontools { };
-
-  smbldaptools = callPackage ../tools/networking/smbldaptools {
-    inherit (perlPackages) NetLDAP CryptSmbHash DigestSHA1;
-  };
-
-  smbnetfs = callPackage ../tools/filesystems/smbnetfs {};
-
-  snort = callPackage ../applications/networking/ids/snort { };
-
-  snx = callPackage_i686 ../tools/networking/snx {
-    inherit (pkgsi686Linux) pam gcc33;
-    inherit (pkgsi686Linux.xlibs) libX11;
-  };
-
-  solr = callPackage ../servers/search/solr { };
-
-  sparsehash = callPackage ../development/libraries/sparsehash { };
-
-  spiped = callPackage ../tools/networking/spiped { };
-
-  sproxy = haskellPackages.callPackage ../tools/networking/sproxy { };
-
-  sproxy-web = haskellPackages.callPackage ../tools/networking/sproxy-web { };
-
-  stardict = callPackage ../applications/misc/stardict/stardict.nix {
-    inherit (gnome) libgnomeui scrollkeeper;
-  };
-
-  storebrowse = callPackage ../tools/system/storebrowse { };
-
-  fusesmb = callPackage ../tools/filesystems/fusesmb { };
-
-  sl = callPackage ../tools/misc/sl { };
-
-  socat = callPackage ../tools/networking/socat { };
-
-  socat2pre = lowPrio (callPackage ../tools/networking/socat/2.x.nix { });
-
-  sourceHighlight = callPackage ../tools/text/source-highlight {
-    # Boost 1.54 causes the "test_regexranges" test to fail
-    boost = boost149;
-  };
-
-  spaceFM = callPackage ../applications/misc/spacefm { };
-
-  squashfsTools = callPackage ../tools/filesystems/squashfs { };
-
-  sshfsFuse = callPackage ../tools/filesystems/sshfs-fuse { };
-
-  sshuttle = callPackage ../tools/security/sshuttle { };
-
-  sudo = callPackage ../tools/security/sudo { };
-
-  suidChroot = builderDefsPackage (import ../tools/system/suid-chroot) { };
-
-  super = callPackage ../tools/security/super { };
-
-  ssdeep = callPackage ../tools/security/ssdeep { };
-
-  ssmtp = callPackage ../tools/networking/ssmtp {
-    tlsSupport = true;
-  };
-
-  ssss = callPackage ../tools/security/ssss { };
-
-  storeBackup = callPackage ../tools/backup/store-backup { };
-
-  stow = callPackage ../tools/misc/stow { };
-
-  stun = callPackage ../tools/networking/stun { };
-
-  stunnel = callPackage ../tools/networking/stunnel { };
-
-  su = shadow.su;
-
-  surfraw = callPackage ../tools/networking/surfraw { };
-
-  swec = callPackage ../tools/networking/swec {
-    inherit (perlPackages) LWP URI HTMLParser HTTPServerSimple Parent;
-  };
-
-  svnfs = callPackage ../tools/filesystems/svnfs { };
-
-  sysbench = callPackage ../development/tools/misc/sysbench {};
-
-  system_config_printer = callPackage ../tools/misc/system-config-printer {
-    libxml2 = libxml2Python;
-   };
-
-  sitecopy = callPackage ../tools/networking/sitecopy { };
-
-  stricat = callPackage ../tools/security/stricat { };
-
-  privoxy = callPackage ../tools/networking/privoxy { };
-
-  t1utils = callPackage ../tools/misc/t1utils { };
-
-  tarsnap = callPackage ../tools/backup/tarsnap { };
-
-  tcpcrypt = callPackage ../tools/security/tcpcrypt { };
-
-  tboot = callPackage ../tools/security/tboot { };
-
-  tcpdump = callPackage ../tools/networking/tcpdump { };
-
-  tcpflow = callPackage ../tools/networking/tcpflow { };
-
-  teamviewer = callPackage_i686 ../applications/networking/remote/teamviewer { };
-
-  # Work In Progress: it doesn't start unless running a daemon as root
-  teamviewer8 = lowPrio (callPackage_i686 ../applications/networking/remote/teamviewer/8.nix { });
-
-  telnet = callPackage ../tools/networking/telnet { };
-
-  texmacs = callPackage ../applications/editors/texmacs {
-    tex = texLive; /* tetex is also an option */
-    extraFonts = true;
-    guile = guile_1_8;
-  };
-
-  texmaker = callPackage ../applications/editors/texmaker { };
-
-  texstudio = callPackage ../applications/editors/texstudio { };
-
-  tiled-qt = callPackage ../applications/editors/tiled-qt { qt = qt4; };
-
-  tinc = callPackage ../tools/networking/tinc { };
-
-  tiny8086 = callPackage ../applications/virtualization/8086tiny { };
-
-  tmpwatch = callPackage ../tools/misc/tmpwatch  { };
-
-  tmux = callPackage ../tools/misc/tmux { };
-
-  tor = callPackage ../tools/security/tor { };
-
-  torbutton = callPackage ../tools/security/torbutton { };
-
-  torbrowser = callPackage ../tools/security/tor/torbrowser.nix { };
-
-  torsocks = callPackage ../tools/security/tor/torsocks.nix { };
-
-  tpm-quote-tools = callPackage ../tools/security/tpm-quote-tools { };
-
-  tpm-tools = callPackage ../tools/security/tpm-tools { };
-
-  trickle = callPackage ../tools/networking/trickle {};
-
-  trousers = callPackage ../tools/security/trousers { };
-
-  ttf2pt1 = callPackage ../tools/misc/ttf2pt1 { };
-
-  ttysnoop = callPackage ../os-specific/linux/ttysnoop {};
-
-  twitterBootstrap = callPackage ../development/web/twitter-bootstrap {};
-
-  txt2man = callPackage ../tools/misc/txt2man { };
-
-  ucl = callPackage ../development/libraries/ucl { };
-
-  ucspi-tcp = callPackage ../tools/networking/ucspi-tcp { };
-
-  udftools = callPackage ../tools/filesystems/udftools {};
-
-  udptunnel = callPackage ../tools/networking/udptunnel { };
-
-  ufraw = callPackage ../applications/graphics/ufraw { };
-
-  unetbootin = callPackage ../tools/cd-dvd/unetbootin { };
-
-  unfs3 = callPackage ../servers/unfs3 { };
-
-  unoconv = callPackage ../tools/text/unoconv { };
-
-  upx = callPackage ../tools/compression/upx { };
-
-  urlview = callPackage ../applications/misc/urlview {};
-
-  usbmuxd = callPackage ../tools/misc/usbmuxd {};
-
-  vacuum = callPackage ../applications/networking/instant-messengers/vacuum {};
-
-  volatility = callPackage ../tools/security/volatility { };
-
-  vidalia = callPackage ../tools/security/vidalia { };
-
-  vbetool = builderDefsPackage ../tools/system/vbetool {
-    inherit pciutils libx86 zlib;
-  };
-
-  vde2 = callPackage ../tools/networking/vde2 { };
-
-  vboot_reference = callPackage ../tools/system/vboot_reference { };
-
-  vcsh = callPackage ../applications/version-management/vcsh { };
-
-  verilog = callPackage ../applications/science/electronics/verilog {};
-
-  vfdecrypt = callPackage ../tools/misc/vfdecrypt { };
-
-  vifm = callPackage ../applications/misc/vifm { };
-
-  viking = callPackage ../applications/misc/viking {
-    inherit (gnome) scrollkeeper;
-  };
-
-  vnc2flv = callPackage ../tools/video/vnc2flv {};
-
-  vncrec = builderDefsPackage ../tools/video/vncrec {
-    inherit (xlibs) imake libX11 xproto gccmakedep libXt
-      libXmu libXaw libXext xextproto libSM libICE libXpm
-      libXp;
-  };
-
-  vobcopy = callPackage ../tools/cd-dvd/vobcopy { };
-
-  vobsub2srt = callPackage ../tools/cd-dvd/vobsub2srt { };
-
-  vorbisgain = callPackage ../tools/misc/vorbisgain { };
-
-  vpnc = callPackage ../tools/networking/vpnc { };
-
-  openconnect = callPackage ../tools/networking/openconnect.nix { };
-
-  vtun = callPackage ../tools/networking/vtun { };
-
-  wal_e = callPackage ../tools/backup/wal-e { };
-
-  watchman = callPackage ../development/tools/watchman { };
-
-  wbox = callPackage ../tools/networking/wbox {};
-
-  welkin = callPackage ../tools/graphics/welkin {};
-
-  testdisk = callPackage ../tools/misc/testdisk { };
-
-  htmlTidy = callPackage ../tools/text/html-tidy { };
-
-  html-xml-utils = callPackage ../tools/text/xml/html-xml-utils { };
-
-  tftp_hpa = callPackage ../tools/networking/tftp-hpa {};
-
-  tigervnc = callPackage ../tools/admin/tigervnc {
-    fontDirectories = [ xorg.fontadobe75dpi xorg.fontmiscmisc xorg.fontcursormisc
-      xorg.fontbhlucidatypewriter75dpi ];
-    inherit (xorg) xorgserver;
-    fltk = fltk13;
-  };
-
-  tightvnc = callPackage ../tools/admin/tightvnc {
-    fontDirectories = [ xorg.fontadobe75dpi xorg.fontmiscmisc xorg.fontcursormisc
-      xorg.fontbhlucidatypewriter75dpi ];
-  };
-
-  time = callPackage ../tools/misc/time { };
-
-  tkabber = callPackage ../applications/networking/instant-messengers/tkabber { };
-
-  qfsm = callPackage ../applications/science/electronics/qfsm { };
-
-  tkgate = callPackage ../applications/science/electronics/tkgate/1.x.nix {
-    inherit (xlibs) libX11 imake xproto gccmakedep;
-  };
-
-  # The newer package is low-priority because it segfaults at startup.
-  tkgate2 = lowPrio (callPackage ../applications/science/electronics/tkgate/2.x.nix {
-    inherit (xlibs) libX11;
-  });
-
-  tm = callPackage ../tools/system/tm { };
-
-  trang = callPackage ../tools/text/xml/trang { };
-
-  tre = callPackage ../development/libraries/tre { };
-
-  ts = callPackage ../tools/system/ts { };
-
-  transfig = callPackage ../tools/graphics/transfig {
-    libpng = libpng12;
-  };
-
-  truecrypt = callPackage ../applications/misc/truecrypt {
-    wxGUI = config.truecrypt.wxGUI or true;
-  };
-
-  ttmkfdir = callPackage ../tools/misc/ttmkfdir { };
-
-  unclutter = callPackage ../tools/misc/unclutter { };
-
-  unbound = callPackage ../tools/networking/unbound { };
-
-  units = callPackage ../tools/misc/units { };
-
-  unrar = callPackage ../tools/archivers/unrar { };
-
-  xarchive = callPackage ../tools/archivers/xarchive { };
-
-  xarchiver = callPackage ../tools/archivers/xarchiver { };
-
-  xcruiser = callPackage ../applications/misc/xcruiser { };
-
-  unarj = callPackage ../tools/archivers/unarj { };
-
-  unshield = callPackage ../tools/archivers/unshield { };
-
-  unzip = callPackage ../tools/archivers/unzip { };
-
-  unzipNLS = lowPrio (unzip.override { enableNLS = true; });
-
-  uptimed = callPackage ../tools/system/uptimed { };
-
-  varnish = callPackage ../servers/varnish { };
-
-  varnish2 = callPackage ../servers/varnish/2.1.nix { };
-
-  venus = callPackage ../tools/misc/venus {
-    python = python27;
-  };
-
-  vlan = callPackage ../tools/networking/vlan { };
-
-  wakelan = callPackage ../tools/networking/wakelan { };
-
-  wavemon = callPackage ../tools/networking/wavemon { };
-
-  w3cCSSValidator = callPackage ../tools/misc/w3c-css-validator {
-    tomcat = tomcat6;
-  };
-
-  wdfs = callPackage ../tools/filesystems/wdfs { };
-
-  wdiff = callPackage ../tools/text/wdiff { };
-
-  webalizer = callPackage ../tools/networking/webalizer { };
-
-  webdruid = builderDefsPackage ../tools/admin/webdruid {
-    inherit zlib libpng freetype gd which
-      libxml2 geoip;
-  };
-
-  weighttp = callPackage ../tools/networking/weighttp { };
-
-  wget = callPackage ../tools/networking/wget {
-    inherit (perlPackages) LWP;
-  };
-
-  which = callPackage ../tools/system/which { };
-
-  wicd = callPackage ../tools/networking/wicd { };
-
-  wkhtmltopdf = callPackage ../tools/graphics/wkhtmltopdf { };
-
-  wv = callPackage ../tools/misc/wv { };
-
-  wv2 = callPackage ../tools/misc/wv2 { };
-
-  x86info = callPackage ../os-specific/linux/x86info { };
-
-  x11_ssh_askpass = callPackage ../tools/networking/x11-ssh-askpass { };
-
-  xbursttools = assert stdenv ? glibc; import ../tools/misc/xburst-tools {
-    inherit stdenv fetchgit autoconf automake confuse pkgconfig libusb libusb1;
-    # It needs a cross compiler for mipsel to build the firmware it will
-    # load into the Ben Nanonote
-    gccCross =
-      let
-        pkgsCross = (import ./all-packages.nix) {
-          inherit system;
-          inherit bootStdenv noSysDirs gccWithCC gccWithProfiling config;
-          # Ben Nanonote system
-          crossSystem = {
-            config = "mipsel-unknown-linux";
-            bigEndian = true;
-            arch = "mips";
-            float = "soft";
-            withTLS = true;
-            libc = "uclibc";
-            platform = {
-              name = "ben_nanonote";
-              kernelMajor = "2.6";
-              # It's not a bcm47xx processor, but for the headers this should work
-              kernelHeadersBaseConfig = "bcm47xx_defconfig";
-              kernelArch = "mips";
-            };
-            gcc = {
-              arch = "mips32";
-            };
-          };
-        };
-      in
-        pkgsCross.gccCrossStageStatic;
-  };
-
-  xclip = callPackage ../tools/misc/xclip { };
-
-  xtitle = callPackage ../tools/misc/xtitle { };
-
-  xdelta = callPackage ../tools/compression/xdelta { };
-
-  xdummy = callPackage ../tools/misc/xdummy { };
-
-  xfsprogs = callPackage ../tools/filesystems/xfsprogs { };
-
-  xmlroff = callPackage ../tools/typesetting/xmlroff {
-    inherit (gnome) libgnomeprint;
-  };
-
-  xmlstarlet = callPackage ../tools/text/xml/xmlstarlet { };
-
-  xmlto = callPackage ../tools/typesetting/xmlto { };
-
-  xmltv = callPackage ../tools/misc/xmltv { };
-
-  xmpppy = builderDefsPackage (import ../development/python-modules/xmpppy) {
-    inherit python setuptools;
-  };
-
-  xorriso = callPackage ../tools/cd-dvd/xorriso { };
-
-  xpf = callPackage ../tools/text/xml/xpf {
-    libxml2 = libxml2Python;
-  };
-
-  xsel = callPackage ../tools/misc/xsel { };
-
-  xtreemfs = callPackage ../tools/filesystems/xtreemfs {};
-
-  xvfb_run = callPackage ../tools/misc/xvfb-run { inherit (texFunctions) fontsConf; };
-
-  youtubeDL = callPackage ../tools/misc/youtube-dl { };
-
-  zbar = callPackage ../tools/graphics/zbar {
-    pygtk = lib.overrideDerivation pygtk (x: {
-      gtk = gtk2;
-    });
-  };
-
-  zdelta = callPackage ../tools/compression/zdelta { };
-
-  zfstools = callPackage ../tools/filesystems/zfstools {
-    zfs = linuxPackages.zfs;
-  };
-
-  zile = callPackage ../applications/editors/zile { };
-
-  zip = callPackage ../tools/archivers/zip { };
-
-  zpaq = callPackage ../tools/archivers/zpaq { };
-  zpaqd = callPackage ../tools/archivers/zpaq/zpaqd.nix { };
-
-  zsync = callPackage ../tools/compression/zsync { };
-
-
-  ### SHELLS
-
-  bash = lowPrio (callPackage ../shells/bash {
-    texinfo = null;
-  });
-
-  bashInteractive = appendToName "interactive" (callPackage ../shells/bash {
-    interactive = true;
-    readline = readline63; # Includes many vi mode fixes
-  });
-
-  bashCompletion = callPackage ../shells/bash-completion { };
-
-  dash = callPackage ../shells/dash { };
-
-  fish = callPackage ../shells/fish {
-    python = python27Full;
-  };
-
-  tcsh = callPackage ../shells/tcsh { };
-
-  rush = callPackage ../shells/rush { };
-
-  zsh = callPackage ../shells/zsh { };
-
-
-  ### DEVELOPMENT / COMPILERS
-
-  abc =
-    abcPatchable [];
-
-  abcPatchable = patches :
-    import ../development/compilers/abc/default.nix {
-      inherit stdenv fetchurl patches jre apacheAnt;
-      javaCup = callPackage ../development/libraries/java/cup { };
-    };
-
-  aldor = callPackage ../development/compilers/aldor { };
-
-  aliceml = callPackage ../development/compilers/aliceml { };
-
-  aspectj = callPackage ../development/compilers/aspectj { };
-
-  ats = callPackage ../development/compilers/ats { };
-  ats2 = callPackage ../development/compilers/ats2 { };
-
-  avra = callPackage ../development/compilers/avra { };
-
-  bigloo = callPackage ../development/compilers/bigloo { };
-
-  chicken = callPackage ../development/compilers/chicken { };
-
-  ccl = builderDefsPackage ../development/compilers/ccl {};
-
-  clang = wrapClang llvmPackages.clang;
-
-  clang_34 = wrapClang llvmPackages_34.clang;
-  clang_33 = wrapClang (clangUnwrapped llvm_33 ../development/compilers/llvm/3.3/clang.nix);
-
-  clangAnalyzer = callPackage ../development/tools/analysis/clang-analyzer {
-    clang = clang_34;
-    llvmPackages = llvmPackages_34;
-  };
-
-  clangUnwrapped = llvm: pkg: callPackage pkg {
-    stdenv = if stdenv.isDarwin then stdenvApple else stdenv;
-    inherit llvm;
-  };
-
-  clangSelf = clangWrapSelf llvmPackagesSelf.clang;
-
-  clangWrapSelf = build: (import ../build-support/clang-wrapper) {
-    clang = build;
-    stdenv = clangStdenv;
-    libc = glibc;
-    binutils = binutils;
-    shell = bash;
-    inherit libcxx coreutils zlib;
-    nativeTools = false;
-    nativeLibc = false;
-  };
-
-  #Use this instead of stdenv to build with clang
-  clangStdenv = lowPrio (stdenvAdapters.overrideGCC stdenv clang);
-  libcxxStdenv = stdenvAdapters.overrideGCC stdenv (clangWrapSelf llvmPackages.clang);
-
-  clean = callPackage ../development/compilers/clean { };
-
-  closurecompiler = callPackage ../development/compilers/closure { };
-
-  cmucl_binary = callPackage ../development/compilers/cmucl/binary.nix { };
-
-  compcert = callPackage ../development/compilers/compcert {};
-
-  cryptol1 = lowPrio (callPackage ../development/compilers/cryptol/1.8.x.nix {});
-  cryptol2 = with haskellPackages_ghc763; callPackage ../development/compilers/cryptol/2.0.x.nix {
-    Cabal = Cabal_1_18_1_3;
-    cabalInstall = cabalInstall_1_18_0_3;
-    process = process_1_2_0_0;
-  };
-
-  cython = pythonPackages.cython;
-  cython3 = python3Packages.cython;
-
-  dylan = callPackage ../development/compilers/gwydion-dylan {
-    dylan = callPackage ../development/compilers/gwydion-dylan/binary.nix {  };
-  };
-
-  ecl = callPackage ../development/compilers/ecl { };
-
-  eql = callPackage ../development/compilers/eql {};
-
-  adobe_flex_sdk = callPackage ../development/compilers/adobe-flex-sdk { };
-
-  fpc = callPackage ../development/compilers/fpc { };
-  fpc_2_4_0 = callPackage ../development/compilers/fpc/2.4.0.nix { };
-
-  gambit = callPackage ../development/compilers/gambit { };
-
-  gcc = gcc48;
-
-  gcc33 = wrapGCC (import ../development/compilers/gcc/3.3 {
-    inherit fetchurl stdenv noSysDirs;
-  });
-
-  gcc34 = wrapGCC (import ../development/compilers/gcc/3.4 {
-    inherit fetchurl stdenv noSysDirs;
-  });
-
-  gcc48_realCross = lib.addMetaAttrs { hydraPlatforms = []; }
-    (callPackage ../development/compilers/gcc/4.8 {
-      inherit noSysDirs;
-      binutilsCross = binutilsCross;
-      libcCross = libcCross;
-      profiledCompiler = false;
-      enableMultilib = false;
-      crossStageStatic = false;
-      cross = assert crossSystem != null; crossSystem;
-    });
-
-  gcc_realCross = gcc48_realCross;
-
-  gccCrossStageStatic = let
-      libcCross1 =
-        if stdenv.cross.libc == "msvcrt" then windows.mingw_w64_headers
-        else if stdenv.cross.libc == "libSystem" then darwin.xcode
-        else null;
-    in
-      wrapGCCCross {
-      gcc = forceNativeDrv (lib.addMetaAttrs { hydraPlatforms = []; } (
-        gcc_realCross.override {
-          crossStageStatic = true;
-          langCC = false;
-          libcCross = libcCross1;
-          enableShared = false;
-        }));
-      libc = libcCross1;
-      binutils = binutilsCross;
-      cross = assert crossSystem != null; crossSystem;
-  };
-
-  # Only needed for mingw builds
-  gccCrossMingw2 = wrapGCCCross {
-    gcc = gccCrossStageStatic.gcc;
-    libc = windows.mingw_headers2;
-    binutils = binutilsCross;
-    cross = assert crossSystem != null; crossSystem;
-  };
-
-  gccCrossStageFinal = wrapGCCCross {
-    gcc = forceNativeDrv (gcc_realCross.override {
-      libpthreadCross =
-        # FIXME: Don't explicitly refer to `i586-pc-gnu'.
-        if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-        then gnu.libpthreadCross
-        else null;
-
-      # XXX: We have troubles cross-compiling libstdc++ on MinGW (see
-      # <http://hydra.nixos.org/build/4268232>), so don't even try.
-      langCC = (crossSystem == null
-                || crossSystem.config != "i686-pc-mingw32");
-     });
-    libc = libcCross;
-    binutils = binutilsCross;
-    cross = assert crossSystem != null; crossSystem;
-  };
-
-  gcc44 = lowPrio (wrapGCC (makeOverridable (import ../development/compilers/gcc/4.4) {
-    inherit fetchurl stdenv gmp mpfr /* ppl cloogppl */
-      gettext which noSysDirs;
-    texinfo = texinfo4;
-    profiledCompiler = true;
-  }));
-
-  gcc45 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.5 {
-    inherit fetchurl stdenv gmp mpfr mpc libelf zlib perl
-      gettext which noSysDirs;
-    texinfo = texinfo4;
-
-    ppl = null;
-    cloogppl = null;
-
-    # bootstrapping a profiled compiler does not work in the sheevaplug:
-    # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43944
-    profiledCompiler = !stdenv.isArm;
-
-    # When building `gcc.crossDrv' (a "Canadian cross", with host == target
-    # and host != build), `cross' must be null but the cross-libc must still
-    # be passed.
-    cross = null;
-    libcCross = if crossSystem != null then libcCross else null;
-    libpthreadCross =
-      if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-      then gnu.libpthreadCross
-      else null;
-  }));
-
-  gcc46 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.6 {
-    inherit noSysDirs;
-
-    ppl = null;
-    cloog = null;
-
-    # bootstrapping a profiled compiler does not work in the sheevaplug:
-    # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43944
-    profiledCompiler = false;
-
-    # When building `gcc.crossDrv' (a "Canadian cross", with host == target
-    # and host != build), `cross' must be null but the cross-libc must still
-    # be passed.
-    cross = null;
-    libcCross = if crossSystem != null then libcCross else null;
-    libpthreadCross =
-      if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-      then gnu.libpthreadCross
-      else null;
-    texinfo = texinfo413;
-  }));
-
-  gcc48 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.8 {
-    inherit noSysDirs;
-
-    # PGO seems to speed up compilation by gcc by ~10%, see #445 discussion
-    profiledCompiler = with stdenv; (!isDarwin && (isi686 || isx86_64));
-
-    # When building `gcc.crossDrv' (a "Canadian cross", with host == target
-    # and host != build), `cross' must be null but the cross-libc must still
-    # be passed.
-    cross = null;
-    libcCross = if crossSystem != null then libcCross else null;
-    libpthreadCross =
-      if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-      then gnu.libpthreadCross
-      else null;
-  }));
-
-  gcc48_multi =
-    if system == "x86_64-linux" then lowPrio (
-      wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi (gcc48.gcc.override {
-        stdenv = overrideGCC stdenv (wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi gcc.gcc);
-        profiledCompiler = false;
-        enableMultilib = true;
-      }))
-    else throw "Multilib gcc not supported on ‘${system}’";
-
-  gcc48_debug = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.8 {
-    stripped = false;
-
-    inherit noSysDirs;
-    cross = null;
-    libcCross = null;
-    binutilsCross = null;
-  }));
-
-  gcc49 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.9 {
-    inherit noSysDirs;
-
-    # PGO seems to speed up compilation by gcc by ~10%, see #445 discussion
-    profiledCompiler = with stdenv; (!isDarwin && (isi686 || isx86_64));
-
-    # When building `gcc.crossDrv' (a "Canadian cross", with host == target
-    # and host != build), `cross' must be null but the cross-libc must still
-    # be passed.
-    cross = null;
-    libcCross = if crossSystem != null then libcCross else null;
-    libpthreadCross =
-      if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-      then gnu.libpthreadCross
-      else null;
-  }));
-
-  gccApple =
-    assert stdenv.isDarwin;
-    wrapGCC (makeOverridable (import ../development/compilers/gcc/4.2-apple64) {
-      inherit fetchurl noSysDirs;
-      profiledCompiler = true;
-      # Since it fails to build with GCC 4.6, build it with the "native"
-      # Apple-GCC.
-      stdenv = allStdenvs.stdenvNative;
-    });
-
-  gfortran = gfortran48;
-
-  gfortran48 = wrapGCC (gcc48.gcc.override {
-    name = "gfortran";
-    langFortran = true;
-    langCC = false;
-    langC = false;
-    profiledCompiler = false;
-  });
-
-  gcj = gcj48;
-
-  gcj48 = wrapGCC (gcc48.gcc.override {
-    name = "gcj";
-    langJava = true;
-    langFortran = false;
-    langCC = false;
-    langC = false;
-    profiledCompiler = false;
-    inherit zip unzip zlib boehmgc gettext pkgconfig perl;
-    inherit gtk;
-    inherit (gnome) libart_lgpl;
-    inherit (xlibs) libX11 libXt libSM libICE libXtst libXi libXrender
-      libXrandr xproto renderproto xextproto inputproto randrproto;
-  });
-
-  gnat = gnat45;
-
-  gnat45 = wrapGCC (gcc45.gcc.override {
-    name = "gnat";
-    langCC = false;
-    langC = true;
-    langAda = true;
-    profiledCompiler = false;
-    inherit gnatboot;
-    # We can't use the ppl stuff, because we would have
-    # libstdc++ problems.
-    cloogppl = null;
-    ppl = null;
-  });
-
-  gnat46 = wrapGCC (gcc46.gcc.override {
-    name = "gnat";
-    langCC = false;
-    langC = true;
-    langAda = true;
-    profiledCompiler = false;
-    gnatboot = gnat45;
-    # We can't use the ppl stuff, because we would have
-    # libstdc++ problems.
-    ppl = null;
-    cloog = null;
-  });
-
-  gnatboot = wrapGCC (import ../development/compilers/gnatboot {
-    inherit fetchurl stdenv;
-  });
-
-  gccgo = gccgo48;
-
-  gccgo48 = wrapGCC (gcc48.gcc.override {
-    name = "gccgo";
-    langCC = true; #required for go.
-    langC = true;
-    langGo = true;
-  });
-
-  ghdl = wrapGCC (import ../development/compilers/gcc/4.3 {
-    inherit stdenv fetchurl gmp mpfr noSysDirs gnat;
-    texinfo = texinfo4;
-    name = "ghdl";
-    langVhdl = true;
-    langCC = false;
-    langC = false;
-    profiledCompiler = false;
-    enableMultilib = false;
-  });
-
-  ghdl_mcode = callPackage ../development/compilers/ghdl { };
-
-  gcl = builderDefsPackage ../development/compilers/gcl {
-    inherit mpfr m4 binutils fetchcvs emacs zlib which
-      texinfo;
-    gmp = gmp4;
-    inherit (xlibs) libX11 xproto inputproto libXi
-      libXext xextproto libXt libXaw libXmu;
-    inherit stdenv;
-    texLive = texLiveAggregationFun {
-      paths = [
-        texLive texLiveExtra
-      ];
-    };
-  };
-
-  jhc = callPackage ../development/compilers/jhc {
-    inherit (haskellPackages_ghc763) ghc binary zlib utf8String readline fgl
-      regexCompat HsSyck random;
-  };
-
-  gcc-arm-embedded-4_7 = callPackage_i686 ../development/compilers/gcc-arm-embedded {
-    version = "4.7-2013q3-20130916";
-    releaseType = "update";
-    sha256 = "1bd9bi9q80xn2rpy0rn1vvj70rh15kb7dmah0qs4q2rv78fqj40d";
-  };
-  gcc-arm-embedded-4_8 = callPackage_i686 ../development/compilers/gcc-arm-embedded {
-    version = "4.8-2014q1-20140314";
-    releaseType = "update";
-    sha256 = "ce92859550819d4a3d1a6e2672ea64882b30afa2c08cf67fa8e1d93788c2c577";
-  };
-  gcc-arm-embedded = gcc-arm-embedded-4_8;
-
-  # Haskell and GHC
-
-  # Import Haskell infrastructure.
-
-  haskell = let pkgs_       = pkgs // { gmp = gmp.override { withStatic = true; }; };
-                callPackage = newScope pkgs_;
-                newScope    = extra: lib.callPackageWith (pkgs_ // pkgs_.xorg // extra);
-            in callPackage ./haskell-defaults.nix { pkgs = pkgs_; inherit callPackage newScope; };
-
-  # Available GHC versions.
-
-  # For several compiler versions, we export a large set of Haskell-related
-  # packages.
-
-  # NOTE (recurseIntoAttrs): After discussion, we originally decided to
-  # enable it for all GHC versions. However, this is getting too much,
-  # particularly in connection with Hydra builds for all these packages.
-  # So we enable it for selected versions only. We build all ghcs, though
-
-  ghc = recurseIntoAttrs (lib.mapAttrs' (name: value:
-    lib.nameValuePair (builtins.substring (builtins.stringLength "packages_") (builtins.stringLength name) name) value.ghc
-  ) (lib.filterAttrs (name: value:
-    builtins.substring 0 (builtins.stringLength "packages_") name == "packages_"
-  ) haskell));
-
-  haskellPackages = haskellPackages_ghc783;
-  haskellPlatform = haskellPlatformPackages."2013_2_0_0";
-
-  haskellPackages_ghc6104 = haskell.packages_ghc6104;
-  haskellPackages_ghc6123 = haskell.packages_ghc6123;
-  haskellPackages_ghc704  = haskell.packages_ghc704;
-  haskellPackages_ghc722  = haskell.packages_ghc722;
-  haskellPackages_ghc742  = haskell.packages_ghc742;
-  haskellPackages_ghc763  = haskell.packages_ghc763;
-  haskellPackages_ghc783_no_profiling = recurseIntoAttrs haskell.packages_ghc783.noProfiling;
-  haskellPackages_ghc783_profiling    = recurseIntoAttrs haskell.packages_ghc783.profiling;
-  haskellPackages_ghc783              = recurseIntoAttrs haskell.packages_ghc783.highPrio;
-  haskellPackages_ghcHEAD = haskell.packages_ghcHEAD;
-
-  haskellPlatformPackages = recurseIntoAttrs (import ../development/libraries/haskell/haskell-platform { inherit pkgs; });
-
-  haxe = callPackage ../development/compilers/haxe { };
-
-  hhvm = callPackage ../development/compilers/hhvm { };
-  hiphopvm = hhvm; /* Compatibility alias */
-
-  falcon = builderDefsPackage (import ../development/interpreters/falcon) {
-    inherit cmake;
-  };
-
-  fsharp = callPackage ../development/compilers/fsharp {};
-
-  go_1_0 = callPackage ../development/compilers/go { };
-
-  go_1_1 =
-    if stdenv.isDarwin then
-      callPackage ../development/compilers/go/1.1-darwin.nix { }
-    else
-      callPackage ../development/compilers/go/1.1.nix { };
-
-  go_1_2 = callPackage ../development/compilers/go/1.2.nix { };
-
-  go_1_3 = callPackage ../development/compilers/go/1.3.nix { };
-
-  go = go_1_3;
-
-  gox = callPackage ../development/compilers/go/gox.nix { };
-
-  gprolog = callPackage ../development/compilers/gprolog { };
-
-  gwt240 = callPackage ../development/compilers/gwt/2.4.0.nix { };
-
-  icedtea7_jdk = callPackage ../development/compilers/icedtea rec {
-    jdk = openjdk;
-    jdkPath = "${openjdk}/lib/openjdk";
-  } // { outputs = [ "out" ]; };
-
-  icedtea7_jre = (lib.setName "icedtea7-${lib.getVersion pkgs.icedtea7_jdk.jre}" (lib.addMetaAttrs
-    { description = "Free Java runtime environment based on OpenJDK 7.0 and the IcedTea project"; }
-    pkgs.icedtea7_jdk.jre)) // { outputs = [ "jre" ]; };
-
-  icedtea7_web = callPackage ../development/compilers/icedtea-web {
-    jdk = "${icedtea7_jdk}/lib/icedtea";
-  };
-
-  ikarus = callPackage ../development/compilers/ikarus { };
-
-  hugs = callPackage ../development/compilers/hugs { };
-
-  path64 = callPackage ../development/compilers/path64 { };
-
-  openjdk =
-    if stdenv.isDarwin then
-      callPackage ../development/compilers/openjdk-darwin { }
-    else
-      let
-        openjdkBootstrap = callPackage ../development/compilers/openjdk/bootstrap.nix { };
-      in (callPackage ../development/compilers/openjdk {
-        jdk = openjdkBootstrap;
-      }) // { outputs = [ "out" ]; };
-
-  # FIXME: Need a way to set per-output meta attributes.
-  openjre = (lib.setName "openjre-${lib.getVersion pkgs.openjdk.jre}" (lib.addMetaAttrs
-    { description = "The open-source Java Runtime Environment"; }
-    pkgs.openjdk.jre)) // { outputs = [ "jre" ]; };
-
-  jdk = if stdenv.isDarwin || stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux"
-    then pkgs.openjdk
-    else pkgs.oraclejdk;
-  jre = if stdenv.isDarwin || stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux"
-    then pkgs.openjre
-    else pkgs.oraclejre;
-
-  oraclejdk = pkgs.jdkdistro true false;
-
-  oraclejdk7 = pkgs.oraclejdk7distro true false;
-
-  oraclejdk8 = pkgs.oraclejdk8distro true false;
-
-  oraclejre = lowPrio (pkgs.jdkdistro false false);
-
-  oraclejre7 = lowPrio (pkgs.oraclejdk7distro false false);
-
-  oraclejre8 = lowPrio (pkgs.oraclejdk8distro false false);
-
-  jrePlugin = lowPrio (pkgs.jdkdistro false true);
-
-  supportsJDK =
-    system == "i686-linux" ||
-    system == "x86_64-linux";
-
-  jdkdistro = installjdk: pluginSupport:
-    assert supportsJDK;
-    (if pluginSupport then appendToName "with-plugin" else x: x)
-      (callPackage ../development/compilers/oraclejdk/jdk6-linux.nix { });
-
-  oraclejdk7distro = installjdk: pluginSupport:
-    assert supportsJDK;
-    (if pluginSupport then appendToName "with-plugin" else x: x)
-      (callPackage ../development/compilers/oraclejdk/jdk7-linux.nix { inherit installjdk; });
-
-  oraclejdk8distro = installjdk: pluginSupport:
-    assert supportsJDK;
-    (if pluginSupport then appendToName "with-plugin" else x: x)
-      (callPackage ../development/compilers/oraclejdk/jdk8-linux.nix { inherit installjdk; });
-
-  jikes = callPackage ../development/compilers/jikes { };
-
-  juliaGit = callPackage ../development/compilers/julia/git-20131013.nix {
-    liblapack = liblapack.override {shared = true;};
-    llvm = llvm_33;
-  };
-  julia021 = callPackage ../development/compilers/julia/0.2.1.nix {
-    liblapack = liblapack.override {shared = true;};
-    llvm = llvm_33;
-  };
-  julia030 = let
-    liblapack = liblapack_3_5_0.override {shared = true;};
-  in callPackage ../development/compilers/julia/0.3.0.nix {
-    inherit liblapack;
-    suitesparse = suitesparse.override {
-      inherit liblapack;
-    };
-    openblas = openblas_0_2_10;
-    llvm = llvm_34;
-  };
-  julia = julia021;
-
-  lazarus = builderDefsPackage (import ../development/compilers/fpc/lazarus.nix) {
-    inherit makeWrapper gtk glib pango atk gdk_pixbuf;
-    inherit (xlibs) libXi inputproto libX11 xproto libXext xextproto;
-    fpc = fpc;
-  };
-
-  lessc = callPackage ../development/compilers/lessc { };
-
-  llvm = llvmPackages.llvm;
-
-  llvm_34 = llvmPackages_34.llvm;
-  llvm_33 = llvm_v ../development/compilers/llvm/3.3/llvm.nix;
-
-  llvm_v = path: callPackage path {
-    stdenv = if stdenv.isDarwin then stdenvApple else stdenv;
-  };
-
-  llvmPackages = if !stdenv.isDarwin then llvmPackages_34 else llvmPackages_34 // {
-    # until someone solves build problems with _34
-    llvm = llvm_33;
-    clang = clang_33;
-  };
-
-  llvmPackages_34 = recurseIntoAttrs (import ../development/compilers/llvm/3.4 {
-    inherit stdenv newScope fetchurl;
-    isl = isl_0_12;
-  });
-  llvmPackagesSelf = import ../development/compilers/llvm/3.4 { inherit newScope fetchurl; isl = isl_0_12; stdenv = libcxxStdenv; };
-
-  manticore = callPackage ../development/compilers/manticore { };
-
-  mentorToolchains = recurseIntoAttrs (
-    callPackage_i686 ../development/compilers/mentor {}
-  );
-
-  mercury = callPackage ../development/compilers/mercury { };
-
-  mitscheme = callPackage ../development/compilers/mit-scheme { };
-
-  mlton = callPackage ../development/compilers/mlton { };
-
-  mono = callPackage ../development/compilers/mono {
-    inherit (xlibs) libX11;
-  };
-
-  monoDLLFixer = callPackage ../build-support/mono-dll-fixer { };
-
-  mozart = callPackage ../development/compilers/mozart { };
-
-  neko = callPackage ../development/compilers/neko { };
-
-  nasm = callPackage ../development/compilers/nasm { };
-
-  nvidia_cg_toolkit = callPackage ../development/compilers/nvidia-cg-toolkit { };
-
-  ocaml = ocamlPackages.ocaml;
-
-  ocaml_3_08_0 = callPackage ../development/compilers/ocaml/3.08.0.nix { };
-
-  ocaml_3_10_0 = callPackage ../development/compilers/ocaml/3.10.0.nix { };
-
-  ocaml_3_11_2 = callPackage ../development/compilers/ocaml/3.11.2.nix { };
-
-  ocaml_3_12_1 = callPackage ../development/compilers/ocaml/3.12.1.nix { };
-
-  ocaml_4_00_1 = callPackage ../development/compilers/ocaml/4.00.1.nix { };
-
-  ocaml_4_01_0 = callPackage ../development/compilers/ocaml/4.01.0.nix { };
-
-  orc = callPackage ../development/compilers/orc { };
-
-  metaocaml_3_09 = callPackage ../development/compilers/ocaml/metaocaml-3.09.nix { };
-
-  ber_metaocaml_003 = callPackage ../development/compilers/ocaml/ber-metaocaml-003.nix { };
-
-  mkOcamlPackages = ocaml: self: let callPackage = newScope self; in rec {
-    inherit ocaml;
-
-    camlidl = callPackage ../development/tools/ocaml/camlidl { };
-
-    camlp5_5_strict = callPackage ../development/tools/ocaml/camlp5/5.15.nix { };
-
-    camlp5_5_transitional = callPackage ../development/tools/ocaml/camlp5/5.15.nix {
-      transitional = true;
-    };
-
-    camlp5_6_strict = callPackage ../development/tools/ocaml/camlp5 { };
-
-    camlp5_6_transitional = callPackage ../development/tools/ocaml/camlp5 {
-      transitional = true;
-    };
-
-    camlp5_strict = camlp5_6_strict;
-
-    camlp5_transitional = camlp5_6_transitional;
-
-    camlzip = callPackage ../development/ocaml-modules/camlzip { };
-
-    camomile_0_8_2 = callPackage ../development/ocaml-modules/camomile/0.8.2.nix { };
-    camomile = callPackage ../development/ocaml-modules/camomile { };
-
-    camlimages = callPackage ../development/ocaml-modules/camlimages {
-      libpng = libpng12;
-      giflib = giflib_4_1;
-    };
-
-    biniou = callPackage ../development/ocaml-modules/biniou { };
-
-    ocaml_cairo = callPackage ../development/ocaml-modules/ocaml-cairo { };
-
-    cppo = callPackage ../development/tools/ocaml/cppo { };
-
-    cryptokit = callPackage ../development/ocaml-modules/cryptokit { };
-
-    csv = callPackage ../development/ocaml-modules/csv { };
-
-    deriving = callPackage ../development/tools/ocaml/deriving { };
-
-    easy-format = callPackage ../development/ocaml-modules/easy-format { };
-
-    findlib = callPackage ../development/tools/ocaml/findlib { };
-
-    javalib = callPackage ../development/ocaml-modules/javalib {
-      extlib = ocaml_extlib_maximal;
-    };
-
-    dypgen = callPackage ../development/ocaml-modules/dypgen { };
-
-    patoline = callPackage ../tools/typesetting/patoline { };
-
-    gmetadom = callPackage ../development/ocaml-modules/gmetadom { };
-
-    lablgl = callPackage ../development/ocaml-modules/lablgl { };
-
-    lablgtk = callPackage ../development/ocaml-modules/lablgtk {
-      inherit (gnome) libgnomecanvas libglade gtksourceview;
-    };
-
-    lablgtkmathview = callPackage ../development/ocaml-modules/lablgtkmathview {
-      gtkmathview = callPackage ../development/libraries/gtkmathview { };
-    };
-
-    menhir = callPackage ../development/ocaml-modules/menhir { };
-
-    merlin = callPackage ../development/tools/ocaml/merlin { };
-
-    mldonkey = callPackage ../applications/networking/p2p/mldonkey { };
-
-    mlgmp =  callPackage ../development/ocaml-modules/mlgmp { };
-
-    ocaml_batteries = callPackage ../development/ocaml-modules/batteries { };
-
-    ocaml_cryptgps = callPackage ../development/ocaml-modules/cryptgps { };
-
-    ocaml_data_notation = callPackage ../development/ocaml-modules/odn { };
-
-    ocaml_expat = callPackage ../development/ocaml-modules/expat { };
-
-    ocamlgraph = callPackage ../development/ocaml-modules/ocamlgraph { };
-
-    ocaml_http = callPackage ../development/ocaml-modules/http { };
-
-    ocamlify = callPackage ../development/tools/ocaml/ocamlify { };
-
-    ocaml_lwt = callPackage ../development/ocaml-modules/lwt { };
-
-    ocamlmod = callPackage ../development/tools/ocaml/ocamlmod { };
-
-    ocaml_mysql = callPackage ../development/ocaml-modules/mysql { };
-
-    ocamlnet = callPackage ../development/ocaml-modules/ocamlnet { };
-
-    ocaml_oasis = callPackage ../development/tools/ocaml/oasis { };
-
-    ocaml_pcre = callPackage ../development/ocaml-modules/pcre {
-      inherit pcre;
-    };
-
-    ocaml_react = callPackage ../development/ocaml-modules/react { };
-
-    ocamlsdl= callPackage ../development/ocaml-modules/ocamlsdl { };
-
-    ocaml_sqlite3 = callPackage ../development/ocaml-modules/sqlite3 { };
-
-    ocaml_ssl = callPackage ../development/ocaml-modules/ssl { };
-
-    ounit = callPackage ../development/ocaml-modules/ounit { };
-
-    ulex = callPackage ../development/ocaml-modules/ulex { };
-
-    ulex08 = callPackage ../development/ocaml-modules/ulex/0.8 {
-      camlp5 = camlp5_transitional;
-    };
-
-    ocaml_typeconv = callPackage ../development/ocaml-modules/typeconv { };
-
-    ocaml_typeconv_3_0_5 = callPackage ../development/ocaml-modules/typeconv/3.0.5.nix { };
-
-    ocaml_sexplib = callPackage ../development/ocaml-modules/sexplib { };
-
-    ocaml_extlib = callPackage ../development/ocaml-modules/extlib { };
-    ocaml_extlib_maximal = callPackage ../development/ocaml-modules/extlib {
-      minimal = false;
-    };
-
-    pycaml = callPackage ../development/ocaml-modules/pycaml { };
-
-    opam_1_0_0 = callPackage ../development/tools/ocaml/opam/1.0.0.nix { };
-    opam_1_1 = callPackage ../development/tools/ocaml/opam/1.1.nix { };
-    opam = opam_1_1;
-
-    sawja = callPackage ../development/ocaml-modules/sawja { };
-
-    uucd = callPackage ../development/ocaml-modules/uucd { };
-    uunf = callPackage ../development/ocaml-modules/uunf { };
-    uutf = callPackage ../development/ocaml-modules/uutf { };
-    xmlm = callPackage ../development/ocaml-modules/xmlm { };
-
-    yojson = callPackage ../development/ocaml-modules/yojson { };
-
-    zarith = callPackage ../development/ocaml-modules/zarith { };
-  };
-
-  ocamlPackages = recurseIntoAttrs ocamlPackages_4_01_0;
-  ocamlPackages_3_10_0 = mkOcamlPackages ocaml_3_10_0 pkgs.ocamlPackages_3_10_0;
-  ocamlPackages_3_11_2 = mkOcamlPackages ocaml_3_11_2 pkgs.ocamlPackages_3_11_2;
-  ocamlPackages_3_12_1 = mkOcamlPackages ocaml_3_12_1 pkgs.ocamlPackages_3_12_1;
-  ocamlPackages_4_00_1 = mkOcamlPackages ocaml_4_00_1 pkgs.ocamlPackages_4_00_1;
-  ocamlPackages_4_01_0 = mkOcamlPackages ocaml_4_01_0 pkgs.ocamlPackages_4_01_0;
-  ocamlPackages_latest = ocamlPackages_4_01_0;
-
-  ocaml_make = callPackage ../development/ocaml-modules/ocamlmake { };
-
-  opa = let callPackage = newScope pkgs.ocamlPackages_4_00_1; in callPackage ../development/compilers/opa { };
-
-  ocamlnat = let callPackage = newScope pkgs.ocamlPackages_3_12_1; in callPackage ../development/ocaml-modules/ocamlnat { };
-
-  qcmm = callPackage ../development/compilers/qcmm {
-    lua   = lua4;
-    ocaml = ocaml_3_08_0;
-  };
-
-  roadsend = callPackage ../development/compilers/roadsend { };
-
-  rustc       = callPackage ../development/compilers/rustc/0.11.nix {};
-  rustcMaster = callPackage ../development/compilers/rustc/head.nix {};
-
-  rust = rustc;
-
-
-  sbclBootstrap = callPackage ../development/compilers/sbcl/bootstrap.nix {};
-  sbcl = callPackage ../development/compilers/sbcl {
-    clisp = clisp;
-  };
-
-  scala_2_9 = callPackage ../development/compilers/scala/2.9.nix { };
-  scala_2_10 = callPackage ../development/compilers/scala/2.10.nix { };
-  scala_2_11 = callPackage ../development/compilers/scala { };
-  scala = scala_2_11;
-
-  sdcc = callPackage ../development/compilers/sdcc { };
-
-  smlnjBootstrap = callPackage ../development/compilers/smlnj/bootstrap.nix { };
-  smlnj = callPackage_i686 ../development/compilers/smlnj { };
-
-  stalin = callPackage ../development/compilers/stalin { };
-
-  strategoPackages = recurseIntoAttrs strategoPackages018;
-
-  strategoPackages016 = callPackage ../development/compilers/strategoxt/0.16.nix {
-    stdenv = overrideInStdenv stdenv [gnumake380];
-  };
-
-  strategoPackages017 = callPackage ../development/compilers/strategoxt/0.17.nix {
-    readline = readline5;
-  };
-
-  strategoPackages018 = callPackage ../development/compilers/strategoxt/0.18.nix {
-    readline = readline5;
-  };
-
-  metaBuildEnv = callPackage ../development/compilers/meta-environment/meta-build-env { };
-
-  swiProlog = callPackage ../development/compilers/swi-prolog { };
-
-  tbb = callPackage ../development/libraries/tbb { };
-
-  tinycc = callPackage ../development/compilers/tinycc { };
-
-  urweb = callPackage ../development/compilers/urweb { };
-
-  vala = callPackage ../development/compilers/vala/default.nix { };
-
-  visualcpp = callPackage ../development/compilers/visual-c++ { };
-
-  vs90wrapper = callPackage ../development/compilers/vs90wrapper { };
-
-  webdsl = callPackage ../development/compilers/webdsl { };
-
-  win32hello = callPackage ../development/compilers/visual-c++/test { };
-
-  wrapGCCWith = gccWrapper: glibc: baseGCC: gccWrapper {
-    nativeTools = stdenv ? gcc && stdenv.gcc.nativeTools;
-    nativeLibc = stdenv ? gcc && stdenv.gcc.nativeLibc;
-    nativePrefix = if stdenv ? gcc then stdenv.gcc.nativePrefix else "";
-    gcc = baseGCC;
-    libc = glibc;
-    shell = bash;
-    inherit stdenv binutils coreutils zlib;
-  };
-
-  wrapClangWith = clangWrapper: glibc: baseClang: clangWrapper {
-    nativeTools = stdenv.gcc.nativeTools or false;
-    nativeLibc = stdenv.gcc.nativeLibc or false;
-    nativePrefix = stdenv.gcc.nativePrefix or "";
-    clang = baseClang;
-    libc = glibc;
-    shell = bash;
-    binutils = stdenv.gcc.binutils;
-    inherit stdenv coreutils zlib;
-  };
-
-  wrapClang = wrapClangWith (makeOverridable (import ../build-support/clang-wrapper)) glibc;
-
-  wrapGCC = wrapGCCWith (makeOverridable (import ../build-support/gcc-wrapper)) glibc;
-
-  wrapGCCCross =
-    {gcc, libc, binutils, cross, shell ? "", name ? "gcc-cross-wrapper"}:
-
-    forceNativeDrv (import ../build-support/gcc-cross-wrapper {
-      nativeTools = false;
-      nativeLibc = false;
-      noLibc = (libc == null);
-      inherit stdenv gcc binutils libc shell name cross;
-    });
-
-  # prolog
-  yap = callPackage ../development/compilers/yap { };
-
-  yasm = callPackage ../development/compilers/yasm { };
-
-
-  ### DEVELOPMENT / INTERPRETERS
-
-  acl2 = builderDefsPackage ../development/interpreters/acl2 {
-    inherit sbcl;
-  };
-
-  angelscript = callPackage ../development/interpreters/angelscript {};
-
-  clisp = callPackage ../development/interpreters/clisp { };
-
-  # compatibility issues in 2.47 - at list 2.44.1 is known good
-  # for sbcl bootstrap
-  clisp_2_44_1 = callPackage ../development/interpreters/clisp/2.44.1.nix {
-    libsigsegv = libsigsegv_25;
-  };
-
-  clojure = callPackage ../development/interpreters/clojure { };
-
-  clooj = callPackage ../development/interpreters/clojure/clooj.nix { };
-
-  erlangR14 = callPackage ../development/interpreters/erlang/R14.nix { };
-  erlangR15 = callPackage ../development/interpreters/erlang/R15.nix { };
-  erlangR16 = callPackage ../development/interpreters/erlang/R16.nix { };
-  erlangR17 = callPackage ../development/interpreters/erlang/R17.nix { };
-  erlang = erlangR17;
-
-  rebar = callPackage ../development/tools/build-managers/rebar { };
-
-  elixir = callPackage ../development/interpreters/elixir { };
-
-  groovy = callPackage ../development/interpreters/groovy { };
-
-  guile_1_8 = callPackage ../development/interpreters/guile/1.8.nix { };
-
-  guile_2_0 = callPackage ../development/interpreters/guile { };
-
-  guile = guile_2_0;
-
-  hadoop = callPackage ../applications/networking/cluster/hadoop { };
-
-  io = callPackage ../development/interpreters/io { };
-
-  j = callPackage ../development/interpreters/j {};
-
-  jmeter = callPackage ../applications/networking/jmeter {};
-
-  davmail = callPackage ../applications/networking/davmail {};
-
-  lxappearance = callPackage ../applications/misc/lxappearance {};
-
-  kona = callPackage ../development/interpreters/kona {};
-
-  love = callPackage ../development/interpreters/love {lua=lua5;};
-  love_luajit = callPackage ../development/interpreters/love {lua=luajit;};
-  love_0_9 = callPackage ../development/interpreters/love/0.9.nix { };
-
-  lua4 = callPackage ../development/interpreters/lua-4 { };
-  lua5_0 = callPackage ../development/interpreters/lua-5/5.0.3.nix { };
-  lua5_1 = callPackage ../development/interpreters/lua-5/5.1.nix { };
-  lua5_2 = callPackage ../development/interpreters/lua-5/5.2.nix { };
-  lua5_2_compat = callPackage ../development/interpreters/lua-5/5.2.nix {
-    compat = true;
-  };
-  lua5 = lua5_1;
-  lua = lua5;
-
-  lua5_sockets = callPackage ../development/interpreters/lua-5/sockets.nix {};
-  lua5_expat = callPackage ../development/interpreters/lua-5/expat.nix {};
-  lua5_filesystem = callPackage ../development/interpreters/lua-5/filesystem.nix {};
-  lua5_sec = callPackage ../development/interpreters/lua-5/sec.nix {};
-
-  luarocks = callPackage ../development/tools/misc/luarocks {
-     lua = lua5;
-  };
-
-  luajit = callPackage ../development/interpreters/luajit {};
-
-  lush2 = callPackage ../development/interpreters/lush {};
-
-  maude = callPackage ../development/interpreters/maude {
-    bison = bison2;
-    flex = flex_2_5_35;
-  };
-
-  mesos = callPackage ../applications/networking/cluster/mesos {
-    sasl = cyrus_sasl;
-    automake = automake114x;
-    inherit (pythonPackages) python boto setuptools distutils-cfg wrapPython;
-    pythonProtobuf = pythonPackages.protobuf;
-  };
-
-  octave = callPackage ../development/interpreters/octave {
-    fltk = fltk13;
-    qt = null;
-    ghostscript = null;
-    llvm = null;
-    hdf5 = null;
-    glpk = null;
-    suitesparse = null;
-    openjdk = null;
-    gnuplot = null;
-    readline = readline63;
-  };
-  octaveFull = (lowPrio (callPackage ../development/interpreters/octave {
-    fltk = fltk13;
-    qt = qt4;
-  }));
-
-  # mercurial (hg) bleeding edge version
-  octaveHG = callPackage ../development/interpreters/octave/hg.nix { };
-
-  ocropus = callPackage ../applications/misc/ocropus { };
-
-  perl514 = callPackage ../development/interpreters/perl/5.14 { };
-
-  perl516 = callPackage ../development/interpreters/perl/5.16 {
-    fetchurl = fetchurlBoot;
-  };
-
-  perl520 = callPackage ../development/interpreters/perl/5.20 { };
-
-  perl = if system != "i686-cygwin" then perl516 else sysPerl;
-
-  php = php54;
-
-  phpPackages = recurseIntoAttrs (import ./php-packages.nix {
-    inherit php pkgs;
-  });
-
-  php53 = callPackage ../development/interpreters/php/5.3.nix { };
-
-  php_fpm53 = callPackage ../development/interpreters/php/5.3.nix {
-    config = config // {
-      php = (config.php or {}) // {
-        fpm = true;
-        apxs2 = false;
-      };
-    };
-  };
-
-  php54 = callPackage ../development/interpreters/php/5.4.nix { };
-
-  picolisp = callPackage ../development/interpreters/picolisp {};
-
-  pltScheme = racket; # just to be sure
-
-  polyml = callPackage ../development/compilers/polyml { };
-
-  pure = callPackage ../development/interpreters/pure {
-    llvm = llvm_33 ;
-  };
-
-  python = python2;
-  python2 = python27;
-  python3 = python34;
-
-  # pythonPackages further below, but assigned here because they need to be in sync
-  pythonPackages = python2Packages;
-  python2Packages = python27Packages;
-  python3Packages = python34Packages;
-
-  pythonFull = python2Full;
-  python2Full = python27Full;
-
-  python26 = callPackage ../development/interpreters/python/2.6 { db = db47; };
-  python27 = callPackage ../development/interpreters/python/2.7 { };
-  python32 = callPackage ../development/interpreters/python/3.2 { };
-  python33 = callPackage ../development/interpreters/python/3.3 { };
-  python34 = hiPrio (callPackage ../development/interpreters/python/3.4 { });
-
-  pypy = callPackage ../development/interpreters/pypy/2.3 { };
-
-  python26Full = callPackage ../development/interpreters/python/wrapper.nix {
-    extraLibs = [];
-    postBuild = "";
-    python = python26;
-    inherit (python26Packages) recursivePthLoader;
-  };
-  python27Full = callPackage ../development/interpreters/python/wrapper.nix {
-    extraLibs = [];
-    postBuild = "";
-    python = python27;
-    inherit (python27Packages) recursivePthLoader;
-  };
-
-  pythonDocs = recurseIntoAttrs (import ../development/interpreters/python/docs {
-    inherit stdenv fetchurl lib;
-  });
-
-  pythonLinkmeWrapper = callPackage ../development/interpreters/python/python-linkme-wrapper.nix { };
-
-  pypi2nix = python27Packages.pypi2nix;
-
-  pyrex = pyrex095;
-
-  pyrex095 = callPackage ../development/interpreters/pyrex/0.9.5.nix { };
-
-  pyrex096 = callPackage ../development/interpreters/pyrex/0.9.6.nix { };
-
-  qi = callPackage ../development/compilers/qi { };
-
-  racket = callPackage ../development/interpreters/racket { };
-
-  rakudo = callPackage ../development/interpreters/rakudo { };
-
-  rascal = callPackage ../development/interpreters/rascal { };
-
-  regina = callPackage ../development/interpreters/regina { };
-
-  renpy = callPackage ../development/interpreters/renpy {
-    wrapPython = pythonPackages.wrapPython;
-  };
-
-  ruby18 = callPackage ../development/interpreters/ruby/ruby-18.nix { };
-  ruby19 = callPackage ../development/interpreters/ruby/ruby-19.nix { };
-  ruby2 = lowPrio (callPackage ../development/interpreters/ruby/ruby-2.0.nix { });
-
-  ruby = ruby19;
-
-  rubyLibs = recurseIntoAttrs (callPackage ../development/interpreters/ruby/libs.nix { });
-
-  rake = rubyLibs.rake;
-
-  rubySqlite3 = callPackage ../development/ruby-modules/sqlite3 { };
-
-  rubygemsFun = ruby: builderDefsPackage (import ../development/interpreters/ruby/rubygems.nix) {
-    inherit ruby makeWrapper;
-  };
-  rubygems = hiPrio (rubygemsFun ruby);
-
-  rq = callPackage ../applications/networking/cluster/rq { };
-
-  scsh = callPackage ../development/interpreters/scsh { };
-
-  scheme48 = callPackage ../development/interpreters/scheme48 { };
-
-  spark = callPackage ../applications/networking/cluster/spark { };
-
-  spidermonkey = callPackage ../development/interpreters/spidermonkey { };
-  spidermonkey_1_8_0rc1 = callPackage ../development/interpreters/spidermonkey/1.8.0-rc1.nix { };
-  spidermonkey_185 = callPackage ../development/interpreters/spidermonkey/185-1.0.0.nix { };
-  spidermonkey_17 = callPackage ../development/interpreters/spidermonkey/17.0.nix { };
-  spidermonkey_24 = callPackage ../development/interpreters/spidermonkey/24.2.nix { };
-
-  supercollider = callPackage ../development/interpreters/supercollider {
-    qt = qt4;
-    fftw = fftwSinglePrec;
-  };
-
-  supercollider_scel = supercollider.override { useSCEL = true; };
-
-  sysPerl = callPackage ../development/interpreters/perl/sys-perl { };
-
-  tcl = callPackage ../development/interpreters/tcl { };
-
-  xulrunner = callPackage ../development/interpreters/xulrunner {
-    inherit (gnome) libIDL;
-    inherit (pythonPackages) pysqlite;
-  };
-
-  xulrunner_30 = firefox30Pkgs.xulrunner;
-
-
-  ### DEVELOPMENT / MISC
-
-  amdadlsdk = callPackage ../development/misc/amdadl-sdk { };
-
-  amdappsdk26 = callPackage ../development/misc/amdapp-sdk {
-    version = "2.6";
-  };
-
-  amdappsdk27 = callPackage ../development/misc/amdapp-sdk {
-    version = "2.7";
-  };
-
-  amdappsdk28 = callPackage ../development/misc/amdapp-sdk {
-    version = "2.8";
-  };
-
-  amdappsdk = amdappsdk28;
-
-  amdappsdkFull = callPackage ../development/misc/amdapp-sdk {
-    version = "2.8";
-    samples = true;
-  };
-
-  avrgcclibc = callPackage ../development/misc/avr-gcc-with-avr-libc {
-    gcc = gcc46;
-    stdenv = overrideGCC stdenv gcc46;
-  };
-
-  avr8burnomat = callPackage ../development/misc/avr8-burn-omat { };
-
-  sourceFromHead = import ../build-support/source-from-head-fun.nix {
-    inherit config;
-  };
-
-  ecj = callPackage ../development/eclipse/ecj { };
-
-  jdtsdk = callPackage ../development/eclipse/jdt-sdk { };
-
-  jruby165 = callPackage ../development/interpreters/jruby { };
-
-  guileCairo = callPackage ../development/guile-modules/guile-cairo { };
-
-  guileGnome = callPackage ../development/guile-modules/guile-gnome {
-    gconf = gnome.GConf;
-    inherit (gnome) gnome_vfs libglade libgnome libgnomecanvas libgnomeui;
-  };
-
-  guile_lib = callPackage ../development/guile-modules/guile-lib { };
-
-  guile_ncurses = callPackage ../development/guile-modules/guile-ncurses { };
-
-  guile-xcb = callPackage ../development/guile-modules/guile-xcb { };
-
-  pharo-vm = callPackage_i686 ../development/pharo/vm { };
-
-  srecord = callPackage ../development/tools/misc/srecord { };
-
-  windowssdk = (
-    import ../development/misc/windows-sdk {
-      inherit fetchurl stdenv cabextract;
-    });
-
-
-  ### DEVELOPMENT / TOOLS
-
-  ansible = callPackage ../tools/system/ansible { };
-
-  antlr = callPackage ../development/tools/parsing/antlr/2.7.7.nix { };
-
-  antlr3 = callPackage ../development/tools/parsing/antlr { };
-
-  ant = apacheAnt;
-
-  apacheAnt = callPackage ../development/tools/build-managers/apache-ant { };
-
-  astyle = callPackage ../development/tools/misc/astyle { };
-
-  autobuild = callPackage ../development/tools/misc/autobuild { };
-
-  autoconf = callPackage ../development/tools/misc/autoconf { };
-
-  autoconf213 = callPackage ../development/tools/misc/autoconf/2.13.nix { };
-
-  autocutsel = callPackage ../tools/X11/autocutsel{ };
-
-  automake = automake112x;
-
-  automake111x = callPackage ../development/tools/misc/automake/automake-1.11.x.nix { };
-
-  automake112x = callPackage ../development/tools/misc/automake/automake-1.12.x.nix { };
-
-  automake113x = callPackage ../development/tools/misc/automake/automake-1.13.x.nix { };
-
-  automake114x = callPackage ../development/tools/misc/automake/automake-1.14.x.nix { };
-
-  automoc4 = callPackage ../development/tools/misc/automoc4 { };
-
-  avrdude = callPackage ../development/tools/misc/avrdude { };
-
-  avarice = callPackage ../development/tools/misc/avarice { };
-
-  babeltrace = callPackage ../development/tools/misc/babeltrace { };
-
-  bam = callPackage ../development/tools/build-managers/bam {};
-
-  binutils = callPackage ../development/tools/misc/binutils {
-    inherit noSysDirs;
-  };
-
-  binutils_nogold = lowPrio (callPackage ../development/tools/misc/binutils {
-    inherit noSysDirs;
-    gold = false;
-  });
-
-  binutilsCross =
-    if crossSystem != null && crossSystem.libc == "libSystem" then darwin.cctools
-    else lowPrio (forceNativeDrv (import ../development/tools/misc/binutils {
-      inherit stdenv fetchurl zlib bison;
-      noSysDirs = true;
-      cross = assert crossSystem != null; crossSystem;
-    }));
-
-  bison2 = callPackage ../development/tools/parsing/bison/2.x.nix { };
-  bison3 = callPackage ../development/tools/parsing/bison/3.x.nix { };
-  bison = bison3;
-
-  buildbot = callPackage ../development/tools/build-managers/buildbot {
-    inherit (pythonPackages) twisted jinja2 sqlalchemy sqlalchemy_migrate;
-    dateutil = pythonPackages.dateutil_1_5;
-  };
-
-  buildbotSlave = callPackage ../development/tools/build-managers/buildbot-slave {
-    inherit (pythonPackages) twisted;
-  };
-
-  byacc = callPackage ../development/tools/parsing/byacc { };
-
-  casperjs = callPackage ../development/tools/casperjs { };
-
-  cbrowser = callPackage ../development/tools/misc/cbrowser { };
-
-  ccache = callPackage ../development/tools/misc/ccache { };
-
-  # Wrapper that works as gcc or g++
-  # It can be used by setting in nixpkgs config like this, for example:
-  #    replaceStdenv = { pkgs }: pkgs.ccacheStdenv;
-  # But if you build in chroot, you should have that path in chroot
-  # If instantiated directly, it will use the HOME/.ccache as cache directory.
-  # You can use an override in packageOverrides to set extraConfig:
-  #    packageOverrides = pkgs: {
-  #     ccacheWrapper = pkgs.ccacheWrapper.override {
-  #       extraConfig = ''
-  #         CCACHE_COMPRESS=1
-  #         CCACHE_DIR=/bin/.ccache
-  #       '';
-  #     };
-  #
-  ccacheWrapper = makeOverridable ({ extraConfig ? "" }:
-     wrapGCC (ccache.links extraConfig)) {};
-  ccacheStdenv = lowPrio (overrideGCC stdenv ccacheWrapper);
-
-  cccc = callPackage ../development/tools/analysis/cccc { };
-
-  cgdb = callPackage ../development/tools/misc/cgdb { };
-
-  chromedriver = callPackage ../development/tools/selenium/chromedriver { gconf = gnome.GConf; };
-
-  chrpath = callPackage ../development/tools/misc/chrpath { };
-
-  "cl-launch" = callPackage ../development/tools/misc/cl-launch {};
-
-  complexity = callPackage ../development/tools/misc/complexity { };
-
-  ctags = callPackage ../development/tools/misc/ctags { };
-
-  ctagsWrapped = import ../development/tools/misc/ctags/wrapped.nix {
-    inherit pkgs ctags writeScriptBin;
-  };
-
-  cmake = callPackage ../development/tools/build-managers/cmake { };
-
-  cmake264 = callPackage ../development/tools/build-managers/cmake/264.nix { };
-
-  cmakeCurses = cmake.override { useNcurses = true; };
-
-  cmakeWithGui = cmakeCurses.override { useQt4 = true; };
-
-  coccinelle = callPackage ../development/tools/misc/coccinelle { };
-
-  framac = callPackage ../development/tools/analysis/frama-c { };
-
-  cppi = callPackage ../development/tools/misc/cppi { };
-
-  cproto = callPackage ../development/tools/misc/cproto { };
-
-  cflow = callPackage ../development/tools/misc/cflow { };
-
-  cov-build = callPackage ../development/tools/analysis/cov-build {};
-
-  cppcheck = callPackage ../development/tools/analysis/cppcheck { };
-
-  cscope = callPackage ../development/tools/misc/cscope { };
-
-  csslint = callPackage ../development/web/csslint { };
-
-  libcxx = callPackage ../development/libraries/libc++ { stdenv = pkgs.clangStdenv; };
-  libcxxabi = callPackage ../development/libraries/libc++abi { stdenv = pkgs.clangStdenv; };
-
-  libsigrok = callPackage ../development/tools/libsigrok { };
-
-  libsigrokdecode = callPackage ../development/tools/libsigrokdecode { };
-
-  dejagnu = callPackage ../development/tools/misc/dejagnu { };
-
-  dfeet = callPackage ../development/tools/misc/d-feet {
-    inherit (pythonPackages) pep8;
-  };
-
-  dfu-programmer = callPackage ../development/tools/misc/dfu-programmer { };
-
-  ddd = callPackage ../development/tools/misc/ddd { };
-
-  distcc = callPackage ../development/tools/misc/distcc { };
-
-  # distccWrapper: wrapper that works as gcc or g++
-  # It can be used by setting in nixpkgs config like this, for example:
-  #    replaceStdenv = { pkgs }: pkgs.distccStdenv;
-  # But if you build in chroot, a default 'nix' will create
-  # a new net namespace, and won't have network access.
-  # You can use an override in packageOverrides to set extraConfig:
-  #    packageOverrides = pkgs: {
-  #     distccWrapper = pkgs.distccWrapper.override {
-  #       extraConfig = ''
-  #         DISTCC_HOSTS="myhost1 myhost2"
-  #       '';
-  #     };
-  #
-  distccWrapper = makeOverridable ({ extraConfig ? "" }:
-     wrapGCC (distcc.links extraConfig)) {};
-  distccStdenv = lowPrio (overrideGCC stdenv distccWrapper);
-
-  distccMasquerade = callPackage ../development/tools/misc/distcc/masq.nix {
-    gccRaw = gcc.gcc;
-    binutils = binutils;
-  };
-
-  docutils = builderDefsPackage (import ../development/tools/documentation/docutils) {
-    inherit python pil makeWrapper;
-  };
-
-  doxygen = callPackage ../development/tools/documentation/doxygen {
-    qt4 = null;
-  };
-
-  doxygen_gui = lowPrio (doxygen.override { inherit qt4; });
-
-  drush = callPackage ../development/tools/misc/drush { };
-
-  eggdbus = callPackage ../development/tools/misc/eggdbus { };
-
-  elfutils = callPackage ../development/tools/misc/elfutils { };
-
-  epm = callPackage ../development/tools/misc/epm { };
-
-  emma = callPackage ../development/tools/analysis/emma { };
-
-  findbugs = callPackage ../development/tools/analysis/findbugs { };
-
-  pmd = callPackage ../development/tools/analysis/pmd { };
-
-  jdepend = callPackage ../development/tools/analysis/jdepend { };
-
-  checkstyle = callPackage ../development/tools/analysis/checkstyle { };
-
-  flex_2_5_35 = callPackage ../development/tools/parsing/flex/2.5.35.nix { };
-  flex_2_5_39 = callPackage ../development/tools/parsing/flex/2.5.39.nix { };
-  flex = flex_2_5_39;
-
-  m4 = gnum4;
-
-  global = callPackage ../development/tools/misc/global { };
-
-  gnome_doc_utils = callPackage ../development/tools/documentation/gnome-doc-utils {};
-
-  gnum4 = callPackage ../development/tools/misc/gnum4 { };
-
-  gnumake380 = callPackage ../development/tools/build-managers/gnumake/3.80 { };
-  gnumake381 = callPackage ../development/tools/build-managers/gnumake/3.81 { };
-  gnumake382 = callPackage ../development/tools/build-managers/gnumake/3.82 { };
-  gnumake40  = callPackage ../development/tools/build-managers/gnumake/4.0  { };
-  gnumake = gnumake382;
-
-  gob2 = callPackage ../development/tools/misc/gob2 { };
-
-  gradle = callPackage ../development/tools/build-managers/gradle { };
-
-  gperf = callPackage ../development/tools/misc/gperf { };
-
-  gtk_doc = callPackage ../development/tools/documentation/gtk-doc { };
-
-  gtkdialog = callPackage ../development/tools/misc/gtkdialog { };
-
-  guileLint = callPackage ../development/tools/guile/guile-lint { };
-
-  gwrap = callPackage ../development/tools/guile/g-wrap { };
-
-  help2man = callPackage ../development/tools/misc/help2man {
-    inherit (perlPackages) LocaleGettext;
-  };
-
-  hyenae = callPackage ../tools/networking/hyenae { };
-
-  ibus = callPackage ../development/libraries/ibus { };
-
-  iconnamingutils = callPackage ../development/tools/misc/icon-naming-utils {
-    inherit (perlPackages) XMLSimple;
-  };
-
-  indent = callPackage ../development/tools/misc/indent { };
-
-  ino = callPackage ../development/arduino/ino { };
-
-  inotifyTools = callPackage ../development/tools/misc/inotify-tools { };
-
-  intel-gpu-tools = callPackage ../development/tools/misc/intel-gpu-tools {
-    inherit (xorg) libpciaccess dri2proto libX11 libXext libXv libXrandr;
-  };
-
-  ired = callPackage ../development/tools/analysis/radare/ired.nix { };
-
-  itstool = callPackage ../development/tools/misc/itstool { };
-
-  jam = callPackage ../development/tools/build-managers/jam { };
-
-  jikespg = callPackage ../development/tools/parsing/jikespg { };
-
-  jenkins = callPackage ../development/tools/continuous-integration/jenkins { };
-
-  lcov = callPackage ../development/tools/analysis/lcov { };
-
-  leiningen = callPackage ../development/tools/build-managers/leiningen { };
-
-  libtool = libtool_2;
-
-  libtool_1_5 = callPackage ../development/tools/misc/libtool { };
-
-  libtool_2 = callPackage ../development/tools/misc/libtool/libtool2.nix { };
-
-  lsof = callPackage ../development/tools/misc/lsof { };
-
-  ltrace = callPackage ../development/tools/misc/ltrace { };
-
-  lttng-tools = callPackage ../development/tools/misc/lttng-tools { };
-
-  lttng-ust = callPackage ../development/tools/misc/lttng-ust { };
-
-  lttv = callPackage ../development/tools/misc/lttv { };
-
-  mk = callPackage ../development/tools/build-managers/mk { };
-
-  neoload = callPackage ../development/tools/neoload {
-    licenseAccepted = (config.neoload.accept_license or false);
-  };
-
-  ninja = callPackage ../development/tools/build-managers/ninja { };
-
-  nixbang = callPackage ../development/tools/misc/nixbang {
-      pythonPackages = python3Packages;
-  };
-
-  node_webkit = callPackage ../development/tools/node-webkit {
-    gconf = pkgs.gnome.GConf;
-  };
-
-  noweb = callPackage ../development/tools/literate-programming/noweb { };
-
-  omake = callPackage ../development/tools/ocaml/omake { };
-  omake_rc1 = callPackage ../development/tools/ocaml/omake/0.9.8.6-rc1.nix { };
-
-  opengrok = callPackage ../development/tools/misc/opengrok { };
-
-  openocd = callPackage ../development/tools/misc/openocd { };
-
-  oprofile = callPackage ../development/tools/profiling/oprofile { };
-
-  patchelf = callPackage ../development/tools/misc/patchelf { };
-
-  peg = callPackage ../development/tools/parsing/peg { };
-
-  phantomjs = callPackage ../development/tools/phantomjs {
-    stdenv = if stdenv.isDarwin
-      then overrideGCC stdenv gccApple
-      else stdenv;
-  };
-
-  pmccabe = callPackage ../development/tools/misc/pmccabe { };
-
-  /* Make pkgconfig always return a nativeDrv, never a proper crossDrv,
-     because most usage of pkgconfig as buildInput (inheritance of
-     pre-cross nixpkgs) means using it using as nativeBuildInput
-     cross_renaming: we should make all programs use pkgconfig as
-     nativeBuildInput after the renaming.
-     */
-  pkgconfig = forceNativeDrv (callPackage ../development/tools/misc/pkgconfig { });
-  pkgconfigUpstream = lowPrio (pkgconfig.override { vanilla = true; });
-
-  prelink = callPackage ../development/tools/misc/prelink { };
-
-  premake3 = callPackage ../development/tools/misc/premake/3.nix { };
-
-  premake4 = callPackage ../development/tools/misc/premake { };
-
-  premake = premake4;
-
-  pstack = callPackage ../development/tools/misc/gdb/pstack.nix { };
-
-  radare = callPackage ../development/tools/analysis/radare {
-    inherit (gnome) vte;
-    lua = lua5;
-    useX11 = config.radare.useX11 or false;
-    pythonBindings = config.radare.pythonBindings or false;
-    rubyBindings = config.radare.rubyBindings or false;
-    luaBindings = config.radare.luaBindings or false;
-  };
-
-  ragel = callPackage ../development/tools/parsing/ragel { };
-
-  re2c = callPackage ../development/tools/parsing/re2c { };
-
-  remake = callPackage ../development/tools/build-managers/remake { };
-
-  saleae-logic = callPackage ../development/tools/misc/saleae-logic { };
-
-  # couldn't find the source yet
-  seleniumRCBin = callPackage ../development/tools/selenium/remote-control {
-    jre = jdk;
-  };
-
-  selenium-server-standalone = callPackage ../development/tools/selenium/server { };
-
-  scons = callPackage ../development/tools/build-managers/scons { };
-
-  simpleBuildTool = callPackage ../development/tools/build-managers/simple-build-tool { };
-
-  sigrok-cli = callPackage ../development/tools/sigrok-cli { };
-
-  slimerjs = callPackage ../development/tools/slimerjs {};
-
-  sloccount = callPackage ../development/tools/misc/sloccount { };
-
-  smatch = callPackage ../development/tools/analysis/smatch {
-    buildllvmsparse = false;
-    buildc2xml = false;
-  };
-
-  smc = callPackage ../tools/misc/smc { };
-
-  sparse = callPackage ../development/tools/analysis/sparse { };
-
-  speedtest_cli = callPackage ../tools/networking/speedtest-cli { };
-
-  spin = callPackage ../development/tools/analysis/spin { };
-
-  splint = callPackage ../development/tools/analysis/splint {
-    flex = flex_2_5_35;
-  };
-
-  stm32flash = callPackage ../development/tools/misc/stm32flash { };
-
-  strace = callPackage ../development/tools/misc/strace { };
-
-  swig = callPackage ../development/tools/misc/swig { };
-
-  swig2 = callPackage ../development/tools/misc/swig/2.x.nix { };
-
-  swig3 = callPackage ../development/tools/misc/swig/3.x.nix { };
-
-  swigWithJava = swig;
-
-  swfmill = callPackage ../tools/video/swfmill { };
-
-  swftools = callPackage ../tools/video/swftools { };
-
-  tcptrack = callPackage ../development/tools/misc/tcptrack { };
-
-  teensy-loader = callPackage ../development/tools/misc/teensy { };
-
-  texinfo413 = callPackage ../development/tools/misc/texinfo/4.13a.nix { };
-  texinfo5 = callPackage ../development/tools/misc/texinfo/5.2.nix { };
-  texinfo4 = texinfo413;
-  texinfo = texinfo5;
-  texinfoInteractive = appendToName "interactive" (
-    texinfo.override { interactive = true; }
-  );
-
-  texi2html = callPackage ../development/tools/misc/texi2html { };
-
-  uhd = callPackage ../development/tools/misc/uhd { };
-
-  uisp = callPackage ../development/tools/misc/uisp { };
-
-  uncrustify = callPackage ../development/tools/misc/uncrustify { };
-
-  vagrant = callPackage ../development/tools/vagrant {
-    ruby = ruby2;
-  };
-
-  gdb = callPackage ../development/tools/misc/gdb {
-    hurd = gnu.hurdCross;
-    readline = readline63;
-    inherit (gnu) mig;
-  };
-
-  gdbCross = lowPrio (callPackage ../development/tools/misc/gdb {
-    target = crossSystem;
-  });
-
-  valgrind = callPackage ../development/tools/analysis/valgrind {
-    stdenv =
-      # On Darwin, Valgrind 3.7.0 expects Apple's GCC (for
-      # `__private_extern'.)
-      if stdenv.isDarwin
-      then overrideGCC stdenv gccApple
-      else stdenv;
-  };
-
-  valkyrie = callPackage ../development/tools/analysis/valkyrie { };
-
-  xc3sprog = callPackage ../development/tools/misc/xc3sprog { };
-
-  xmlindent = callPackage ../development/web/xmlindent {};
-
-  xpwn = callPackage ../development/mobile/xpwn {};
-
-  xxdiff = callPackage ../development/tools/misc/xxdiff {
-    bison = bison2;
-  };
-
-  yacc = bison;
-
-  yodl = callPackage ../development/tools/misc/yodl { };
-
-
-  ### DEVELOPMENT / LIBRARIES
-
-  a52dec = callPackage ../development/libraries/a52dec { };
-
-  aacskeys = callPackage ../development/libraries/aacskeys { };
-
-  aalib = callPackage ../development/libraries/aalib { };
-
-  accountsservice = callPackage ../development/libraries/accountsservice { };
-
-  acl = callPackage ../development/libraries/acl { };
-
-  activemq = callPackage ../development/libraries/apache-activemq { };
-
-  adns = callPackage ../development/libraries/adns { };
-
-  afflib = callPackage ../development/libraries/afflib {};
-
-  agg = callPackage ../development/libraries/agg { };
-
-  allegro = callPackage ../development/libraries/allegro {};
-  allegro5 = callPackage ../development/libraries/allegro/5.nix {};
-  allegro5unstable = callPackage
-    ../development/libraries/allegro/5-unstable.nix {};
-
-  amrnb = callPackage ../development/libraries/amrnb { };
-
-  amrwb = callPackage ../development/libraries/amrwb { };
-
-  apr = callPackage ../development/libraries/apr { };
-
-  aprutil = callPackage ../development/libraries/apr-util {
-    bdbSupport = true;
-  };
-
-  asio = callPackage ../development/libraries/asio { };
-
-  aspell = callPackage ../development/libraries/aspell { };
-
-  aspellDicts = recurseIntoAttrs (import ../development/libraries/aspell/dictionaries.nix {
-    inherit fetchurl stdenv aspell which;
-  });
-
-  aterm = aterm25;
-
-  aterm25 = callPackage ../development/libraries/aterm/2.5.nix { };
-
-  aterm28 = lowPrio (callPackage ../development/libraries/aterm/2.8.nix { });
-
-  attica = callPackage ../development/libraries/attica { };
-
-  attr = callPackage ../development/libraries/attr { };
-
-  at_spi2_core = callPackage ../development/libraries/at-spi2-core { };
-
-  at_spi2_atk = callPackage ../development/libraries/at-spi2-atk { };
-
-  aqbanking = callPackage ../development/libraries/aqbanking { };
-
-  aubio = callPackage ../development/libraries/aubio { };
-
-  audiofile = callPackage ../development/libraries/audiofile { };
-
-  axis = callPackage ../development/libraries/axis { };
-
-  babl_0_0_22 = callPackage ../development/libraries/babl/0_0_22.nix { };
-
-  babl = callPackage ../development/libraries/babl { };
-
-  beecrypt = callPackage ../development/libraries/beecrypt { };
-
-  boehmgc = callPackage ../development/libraries/boehm-gc { };
-
-  boolstuff = callPackage ../development/libraries/boolstuff { };
-
-  boost144 = callPackage ../development/libraries/boost/1.44.nix { };
-  boost149 = callPackage ../development/libraries/boost/1.49.nix { };
-  boost155 = callPackage ../development/libraries/boost/1.55.nix { };
-  boost = boost155;
-
-  boostHeaders = callPackage ../development/libraries/boost/header-only-wrapper.nix { };
-
-  botan = callPackage ../development/libraries/botan { };
-  botanUnstable = callPackage ../development/libraries/botan/unstable.nix { };
-
-  box2d = callPackage ../development/libraries/box2d { };
-  box2d_2_0_1 = callPackage ../development/libraries/box2d/2.0.1.nix { };
-
-  buddy = callPackage ../development/libraries/buddy { };
-
-  bwidget = callPackage ../development/libraries/bwidget { };
-
-  c-ares = callPackage ../development/libraries/c-ares {
-    fetchurl = fetchurlBoot;
-  };
-
-  caelum = callPackage ../development/libraries/caelum { };
-
-  capnproto = callPackage ../development/libraries/capnproto { };
-
-  scmccid = callPackage ../development/libraries/scmccid { };
-
-  ccrtp = callPackage ../development/libraries/ccrtp { };
-  ccrtp_1_8 = callPackage ../development/libraries/ccrtp/1.8.nix { };
-
-  celt = callPackage ../development/libraries/celt {};
-  celt_0_7 = callPackage ../development/libraries/celt/0.7.nix {};
-  celt_0_5_1 = callPackage ../development/libraries/celt/0.5.1.nix {};
-
-  cgal = callPackage ../development/libraries/CGAL {};
-
-  cgui = callPackage ../development/libraries/cgui {};
-
-  check = callPackage ../development/libraries/check { };
-
-  chipmunk = builderDefsPackage (import ../development/libraries/chipmunk) {
-    inherit cmake freeglut mesa;
-    inherit (xlibs) libX11 xproto inputproto libXi libXmu;
-  };
-
-  chmlib = callPackage ../development/libraries/chmlib { };
-
-  chromaprint = callPackage ../development/libraries/chromaprint { };
-
-  cil = callPackage ../development/libraries/cil { };
-
-  cilaterm = callPackage ../development/libraries/cil-aterm {
-    stdenv = overrideInStdenv stdenv [gnumake380];
-  };
-
-  clanlib = callPackage ../development/libraries/clanlib { };
-
-  classads = callPackage ../development/libraries/classads { };
-
-  classpath = callPackage ../development/libraries/java/classpath {
-    javac = gcj;
-    jvm = gcj;
-    gconf = gnome.GConf;
-  };
-
-  clearsilver = callPackage ../development/libraries/clearsilver { };
-
-  cln = callPackage ../development/libraries/cln { };
-
-  clppcre = builderDefsPackage (import ../development/libraries/cl-ppcre) { };
-
-  clucene_core_2 = callPackage ../development/libraries/clucene-core/2.x.nix { };
-
-  clucene_core_1 = callPackage ../development/libraries/clucene-core { };
-
-  clucene_core = clucene_core_1;
-
-  clutter = callPackage ../development/libraries/clutter { };
-
-  clutter_1_18 = callPackage ../development/libraries/clutter/1.18.nix {
-    cogl = cogl_1_18;
-  };
-
-  clutter-gst = callPackage ../development/libraries/clutter-gst { };
-
-  clutter_gtk = callPackage ../development/libraries/clutter-gtk { };
-  clutter_gtk_0_10 = callPackage ../development/libraries/clutter-gtk/0.10.8.nix { };
-
-  cminpack = callPackage ../development/libraries/cminpack { };
-
-  cogl = callPackage ../development/libraries/cogl { };
-
-  cogl_1_18 = callPackage ../development/libraries/cogl/1.18.nix { };
-
-  coin3d = callPackage ../development/libraries/coin3d { };
-
-  commoncpp2 = callPackage ../development/libraries/commoncpp2 { };
-
-  confuse = callPackage ../development/libraries/confuse { };
-
-  coredumper = callPackage ../development/libraries/coredumper { };
-
-  ctl = callPackage ../development/libraries/ctl { };
-
-  cpp-netlib = callPackage ../development/libraries/cpp-netlib { };
-
-  cppunit = callPackage ../development/libraries/cppunit { };
-
-  cppnetlib = callPackage ../development/libraries/cppnetlib {
-    boost = boostHeaders;
-  };
-
-  cracklib = callPackage ../development/libraries/cracklib { };
-
-  cryptopp = callPackage ../development/libraries/crypto++ { };
-
-  cyrus_sasl = callPackage ../development/libraries/cyrus-sasl { };
-
-  # Make bdb5 the default as it is the last release under the custom
-  # bsd-like license
-  db = db5;
-  db4 = db48;
-  db44 = callPackage ../development/libraries/db/db-4.4.nix { };
-  db45 = callPackage ../development/libraries/db/db-4.5.nix { };
-  db47 = callPackage ../development/libraries/db/db-4.7.nix { };
-  db48 = callPackage ../development/libraries/db/db-4.8.nix { };
-  db5 = db53;
-  db53 = callPackage ../development/libraries/db/db-5.3.nix { };
-  db6 = db60;
-  db60 = callPackage ../development/libraries/db/db-6.0.nix { };
-
-  dbus = callPackage ../development/libraries/dbus { };
-  dbus_cplusplus  = callPackage ../development/libraries/dbus-cplusplus { };
-  dbus_glib       = callPackage ../development/libraries/dbus-glib { };
-  dbus_java       = callPackage ../development/libraries/java/dbus-java { };
-  dbus_python     = callPackage ../development/python-modules/dbus { };
-
-  # Should we deprecate these? Currently there are many references.
-  dbus_tools = pkgs.dbus.tools;
-  dbus_libs = pkgs.dbus.libs;
-  dbus_daemon = pkgs.dbus.daemon;
-
-  dhex = callPackage ../applications/editors/dhex { };
-
-  dclib = callPackage ../development/libraries/dclib { };
-
-  dillo = callPackage ../applications/networking/browsers/dillo {
-    fltk = fltk13;
-  };
-
-  directfb = callPackage ../development/libraries/directfb { };
-
-  dotconf = callPackage ../development/libraries/dotconf { };
-
-  dssi = callPackage ../development/libraries/dssi {};
-
-  dragonegg = llvmPackages.dragonegg;
-
-  dxflib = callPackage ../development/libraries/dxflib {};
-
-  eigen = callPackage ../development/libraries/eigen {};
-
-  eigen2 = callPackage ../development/libraries/eigen/2.0.nix {};
-
-  enchant = callPackage ../development/libraries/enchant { };
-
-  enet = callPackage ../development/libraries/enet { };
-
-  enginepkcs11 = callPackage ../development/libraries/enginepkcs11 { };
-
-  epoxy = callPackage ../development/libraries/epoxy {
-    inherit (xorg) utilmacros libX11;
-  };
-
-  esdl = callPackage ../development/libraries/esdl { };
-
-  exiv2 = callPackage ../development/libraries/exiv2 { };
-
-  expat = callPackage ../development/libraries/expat { };
-
-  extremetuxracer = builderDefsPackage (import ../games/extremetuxracer) {
-    inherit mesa tcl freeglut SDL SDL_mixer pkgconfig
-      gettext intltool;
-    inherit (xlibs) libX11 xproto libXi inputproto
-      libXmu libXext xextproto libXt libSM libICE;
-    libpng = libpng12;
-  };
-
-  eventlog = callPackage ../development/libraries/eventlog { };
-
-  facile = callPackage ../development/libraries/facile { };
-
-  faac = callPackage ../development/libraries/faac { };
-
-  faad2 = callPackage ../development/libraries/faad2 { };
-
-  farsight2 = callPackage ../development/libraries/farsight2 { };
-
-  farstream = callPackage ../development/libraries/farstream {
-    inherit (gst_all_1)
-      gstreamer gst-plugins-base gst-python gst-plugins-good gst-plugins-bad
-      gst-libav;
-  };
-
-  fcgi = callPackage ../development/libraries/fcgi { };
-
-  ffmpeg_0_6 = callPackage ../development/libraries/ffmpeg/0.6.nix {
-    vpxSupport = !stdenv.isMips;
-  };
-
-  ffmpeg_0_6_90 = callPackage ../development/libraries/ffmpeg/0.6.90.nix {
-    vpxSupport = !stdenv.isMips;
-  };
-
-  ffmpeg_0_10 = callPackage ../development/libraries/ffmpeg/0.10.nix {
-    vpxSupport = !stdenv.isMips;
-
-    stdenv = if stdenv.isDarwin
-      then overrideGCC stdenv gccApple
-      else stdenv;
-  };
-
-  ffmpeg_1 = callPackage ../development/libraries/ffmpeg/1.x.nix {
-    vpxSupport = !stdenv.isMips;
-  };
-
-  ffmpeg_2 = callPackage ../development/libraries/ffmpeg/2.x.nix { };
-
-  ffmpeg = ffmpeg_2;
-
-  ffms = callPackage ../development/libraries/ffms { };
-
-  fftw = callPackage ../development/libraries/fftw { };
-  fftwSinglePrec = fftw.override { precision = "single"; };
-  fftwFloat = fftwSinglePrec; # the configure option is just an alias
-
-  flann = callPackage ../development/libraries/flann { };
-
-  flite = callPackage ../development/libraries/flite { };
-
-  fltk13 = callPackage ../development/libraries/fltk/fltk13.nix { };
-
-  fltk20 = callPackage ../development/libraries/fltk { };
-
-  fmod = callPackage ../development/libraries/fmod { };
-
-  freeimage = callPackage ../development/libraries/freeimage { };
-
-  freetts = callPackage ../development/libraries/freetts { };
-
-  cfitsio = callPackage ../development/libraries/cfitsio { };
-
-  fontconfig = callPackage ../development/libraries/fontconfig { };
-
-  makeFontsConf = let fontconfig_ = fontconfig; in {fontconfig ? fontconfig_, fontDirectories}:
-    import ../development/libraries/fontconfig/make-fonts-conf.nix {
-      inherit runCommand libxslt fontconfig fontDirectories;
-    };
-
-  freealut = callPackage ../development/libraries/freealut { };
-
-  freeglut = callPackage ../development/libraries/freeglut { };
-
-  freetype = callPackage ../development/libraries/freetype { };
-
-  frei0r = callPackage ../development/libraries/frei0r { };
-
-  fribidi = callPackage ../development/libraries/fribidi { };
-
-  funambol = callPackage ../development/libraries/funambol { };
-
-  fam = gamin;
-
-  gamin = callPackage ../development/libraries/gamin { };
-
-  ganv = callPackage ../development/libraries/ganv { };
-
-  gav = callPackage ../games/gav { };
-
-  gsb = callPackage ../games/gsb { };
-
-  gdome2 = callPackage ../development/libraries/gdome2 {
-    inherit (gnome) gtkdoc;
-  };
-
-  gdbm = callPackage ../development/libraries/gdbm { };
-
-  gegl = callPackage ../development/libraries/gegl {
-    #  avocodec avformat librsvg
-  };
-
-  gegl_0_0_22 = callPackage ../development/libraries/gegl/0_0_22.nix {
-    #  avocodec avformat librsvg
-    libpng = libpng12;
-  };
-
-  geoclue = callPackage ../development/libraries/geoclue {};
-
-  geoclue2 = callPackage ../development/libraries/geoclue/2.0.nix {};
-
-  geoip = callPackage ../development/libraries/geoip { };
-
-  geoipjava = callPackage ../development/libraries/java/geoipjava { };
-
-  geos = callPackage ../development/libraries/geos { };
-
-  gettext = gettext_0_18;
-
-  gettext_0_17 = callPackage ../development/libraries/gettext/0.17.nix { };
-  gettext_0_18 = callPackage ../development/libraries/gettext { };
-
-  gd = callPackage ../development/libraries/gd { };
-
-  gdal = callPackage ../development/libraries/gdal { };
-
-  ggz_base_libs = callPackage ../development/libraries/ggz_base_libs {};
-
-  giblib = callPackage ../development/libraries/giblib { };
-
-  libgit2 = callPackage ../development/libraries/git2 { };
-
-  glew = callPackage ../development/libraries/glew { };
-
-  glfw = glfw3;
-  glfw2 = callPackage ../development/libraries/glfw/2.x.nix { };
-  glfw3 = callPackage ../development/libraries/glfw/3.x.nix { };
-
-  glibc = callPackage ../development/libraries/glibc/2.19 {
-    kernelHeaders = linuxHeaders;
-    installLocales = config.glibc.locales or false;
-    machHeaders = null;
-    hurdHeaders = null;
-    gccCross = null;
-  };
-
-  glibc_memusage = callPackage ../development/libraries/glibc/2.19 {
-    kernelHeaders = linuxHeaders;
-    installLocales = false;
-    withGd = true;
-  };
-
-  glibcCross = forceNativeDrv (makeOverridable (import ../development/libraries/glibc/2.19)
-    (let crossGNU = crossSystem != null && crossSystem.config == "i586-pc-gnu";
-     in {
-       inherit stdenv fetchurl;
-       gccCross = gccCrossStageStatic;
-       kernelHeaders = if crossGNU then gnu.hurdHeaders else linuxHeadersCross;
-       installLocales = config.glibc.locales or false;
-     }
-     // lib.optionalAttrs crossGNU {
-        inherit (gnu) machHeaders hurdHeaders libpthreadHeaders mig;
-        inherit fetchgit;
-      }));
-
-
-  # We can choose:
-  libcCrossChooser = name : if name == "glibc" then glibcCross
-    else if name == "uclibc" then uclibcCross
-    else if name == "msvcrt" then windows.mingw_w64
-    else if name == "libSystem" then darwin.xcode
-    else throw "Unknown libc";
-
-  libcCross = assert crossSystem != null; libcCrossChooser crossSystem.libc;
-
-  eglibc = callPackage ../development/libraries/eglibc {
-    kernelHeaders = linuxHeaders;
-    installLocales = config.glibc.locales or false;
-  };
-
-  glibcLocales = callPackage ../development/libraries/glibc/2.19/locales.nix { };
-
-  glibcInfo = callPackage ../development/libraries/glibc/2.19/info.nix { };
-
-  glibc_multi =
-    runCommand "${glibc.name}-multi"
-      { glibc64 = glibc;
-        glibc32 = (import ./all-packages.nix {system = "i686-linux";}).glibc;
-      }
-      ''
-        mkdir -p $out
-        ln -s $glibc64/* $out/
-
-        rm $out/lib $out/lib64
-        mkdir -p $out/lib
-        ln -s $glibc64/lib/* $out/lib
-        ln -s $glibc32/lib $out/lib/32
-        ln -s lib $out/lib64
-
-        # fixing ldd RLTDLIST
-        rm $out/bin
-        cp -rs $glibc64/bin $out
-        chmod u+w $out/bin
-        rm $out/bin/ldd
-        sed -e "s|^RTLDLIST=.*$|RTLDLIST=\"$out/lib/ld-2.19.so $out/lib/32/ld-linux.so.2\"|g" \
-            $glibc64/bin/ldd > $out/bin/ldd
-        chmod 555 $out/bin/ldd
-
-        rm $out/include
-        cp -rs $glibc32/include $out
-        chmod -R u+w $out/include
-        cp -rsf $glibc64/include $out
-      '' # */
-      ;
-
-  glm = callPackage ../development/libraries/glm { };
-
-  glog = callPackage ../development/libraries/glog { };
-
-  gloox = callPackage ../development/libraries/gloox { };
-
-  glpk = callPackage ../development/libraries/glpk { };
-
-  glsurf = callPackage ../applications/science/math/glsurf {
-    inherit (ocamlPackages) lablgl findlib camlimages ocaml_mysql mlgmp;
-    libpng = libpng12;
-    giflib = giflib_4_1;
-  };
-
-  gmime = callPackage ../development/libraries/gmime { };
-
-  gmm = callPackage ../development/libraries/gmm { };
-
-  gmp = gmp5;
-  gmp5 = gmp51;
-
-  gmpxx = appendToName "with-cxx" (gmp.override { cxx = true; });
-
-  # The GHC bootstrap binaries link against libgmp.so.3, which is in GMP 4.x.
-  gmp4 = callPackage ../development/libraries/gmp/4.3.2.nix { };
-
-  gmp51 = callPackage ../development/libraries/gmp/5.1.x.nix { };
-
-  #GMP ex-satellite, so better keep it near gmp
-  mpfr = callPackage ../development/libraries/mpfr/default.nix { };
-
-  gobjectIntrospection = callPackage ../development/libraries/gobject-introspection { };
-
-  goocanvas = callPackage ../development/libraries/goocanvas { };
-
-  google-gflags = callPackage ../development/libraries/google-gflags { };
-
-  gperftools = callPackage ../development/libraries/gperftools { };
-
-  gst_all_1 = recurseIntoAttrs(callPackage ../development/libraries/gstreamer {
-    callPackage = pkgs.newScope (pkgs // { libav = pkgs.libav_10; });
-  });
-
-  gst_all = {
-    inherit (pkgs) gstreamer gnonlin gst_python qt_gstreamer;
-    gstPluginsBase = pkgs.gst_plugins_base;
-    gstPluginsBad = pkgs.gst_plugins_bad;
-    gstPluginsGood = pkgs.gst_plugins_good;
-    gstPluginsUgly = pkgs.gst_plugins_ugly;
-    gstFfmpeg = pkgs.gst_ffmpeg;
-  };
-
-  gstreamer = callPackage ../development/libraries/gstreamer/legacy/gstreamer {
-    bison = bison2;
-  };
-
-  gst_plugins_base = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-base {};
-
-  gst_plugins_good = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-good {};
-
-  gst_plugins_bad = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-bad {};
-
-  gst_plugins_ugly = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-ugly {};
-
-  gst_ffmpeg = callPackage ../development/libraries/gstreamer/legacy/gst-ffmpeg {
-    ffmpeg = ffmpeg_0_10;
-  };
-
-  gst_python = callPackage ../development/libraries/gstreamer/legacy/gst-python {};
-
-  gstreamermm = callPackage ../development/libraries/gstreamer/legacy/gstreamermm { };
-
-  gnonlin = callPackage ../development/libraries/gstreamer/legacy/gnonlin {};
-
-  gusb = callPackage ../development/libraries/gusb {
-    inherit (gnome) gtkdoc;
-  };
-
-  qt_gstreamer = callPackage ../development/libraries/gstreamer/legacy/qt-gstreamer {};
-
-  gnet = callPackage ../development/libraries/gnet { };
-
-  gnu-efi = callPackage ../development/libraries/gnu-efi { };
-
-  gnutls = gnutls32;
-
-  gnutls31 = callPackage ../development/libraries/gnutls/3.1.nix {
-    guileBindings = config.gnutls.guile or false;
-  };
-
-  gnutls32 = callPackage ../development/libraries/gnutls/3.2.nix {
-    guileBindings = config.gnutls.guile or false;
-  };
-
-  gnutls_with_guile = lowPrio (gnutls.override { guileBindings = true; });
-
-  gpac = callPackage ../applications/video/gpac { };
-
-  gpgme = callPackage ../development/libraries/gpgme {
-    gnupg1 = gnupg1orig;
-  };
-
-  grantlee = callPackage ../development/libraries/grantlee { };
-
-  gsasl = callPackage ../development/libraries/gsasl { };
-
-  gsl = callPackage ../development/libraries/gsl { };
-
-  gsm = callPackage ../development/libraries/gsm {};
-
-  gsoap = callPackage ../development/libraries/gsoap { };
-
-  gss = callPackage ../development/libraries/gss { };
-
-  gtkimageview = callPackage ../development/libraries/gtkimageview { };
-
-  gtkmathview = callPackage ../development/libraries/gtkmathview { };
-
-  gtkLibs = {
-    inherit (pkgs) glib glibmm atk atkmm cairo pango pangomm gdk_pixbuf gtk
-      gtkmm;
-  };
-
-  glib = callPackage ../development/libraries/glib { };
-  glib-tested = glib.override { doCheck = true; }; # checked version separate to break cycles
-  glibmm = callPackage ../development/libraries/glibmm { };
-
-  glib_networking = callPackage ../development/libraries/glib-networking {};
-
-  atk = callPackage ../development/libraries/atk { };
-  atkmm = callPackage ../development/libraries/atkmm { };
-
-  pixman = callPackage ../development/libraries/pixman { };
-
-  cairo = callPackage ../development/libraries/cairo {
-    glSupport = config.cairo.gl or (stdenv.isLinux &&
-      !stdenv.isArm && !stdenv.isMips);
-  };
-  cairomm = callPackage ../development/libraries/cairomm { };
-
-  pango = callPackage ../development/libraries/pango { };
-  pangomm = callPackage ../development/libraries/pangomm { };
-
-  pangox_compat = callPackage ../development/libraries/pangox-compat { };
-
-  gdk_pixbuf = callPackage ../development/libraries/gdk-pixbuf {
-    # workaround signal 10 in gdk_pixbuf tests
-    stdenv = if stdenv.isDarwin
-      then clangStdenv
-      else stdenv;
-  };
-
-  gtk2 = callPackage ../development/libraries/gtk+/2.x.nix {
-    cupsSupport = config.gtk2.cups or stdenv.isLinux;
-  };
-
-  gtk3 = callPackage ../development/libraries/gtk+/3.x.nix { };
-
-  gtk = pkgs.gtk2;
-
-  gtkmm = callPackage ../development/libraries/gtkmm/2.x.nix { };
-  gtkmm3 = callPackage ../development/libraries/gtkmm/3.x.nix { };
-
-  gtkmozembedsharp = callPackage ../development/libraries/gtkmozembed-sharp {
-    gtksharp = gtksharp2;
-  };
-
-  gtksharp1 = callPackage ../development/libraries/gtk-sharp-1 {
-    inherit (gnome) libglade libgtkhtml gtkhtml
-              libgnomecanvas libgnomeui libgnomeprint
-              libgnomeprintui GConf;
-  };
-
-  gtksharp2 = callPackage ../development/libraries/gtk-sharp-2 {
-    inherit (gnome) libglade libgtkhtml gtkhtml
-              libgnomecanvas libgnomeui libgnomeprint
-              libgnomeprintui GConf gnomepanel;
-  };
-
-  gtksourceviewsharp = callPackage ../development/libraries/gtksourceview-sharp {
-    inherit (gnome) gtksourceview;
-    gtksharp = gtksharp2;
-  };
-
-  gtkspell = callPackage ../development/libraries/gtkspell { };
-
-  gtkspell3 = callPackage ../development/libraries/gtkspell/3.nix { };
-
-  gts = callPackage ../development/libraries/gts { };
-
-  gvfs = callPackage ../development/libraries/gvfs { gconf = gnome.GConf; };
-
-  gwenhywfar = callPackage ../development/libraries/gwenhywfar { };
-
-  hamlib = callPackage ../development/libraries/hamlib { };
-
-  # TODO : Add MIT Kerberos and let admin choose.
-  kerberos = heimdal;
-
-  heimdal = callPackage ../development/libraries/kerberos/heimdal.nix { };
-
-  harfbuzz = callPackage ../development/libraries/harfbuzz { };
-
-  hawknl = callPackage ../development/libraries/hawknl { };
-
-  herqq = callPackage ../development/libraries/herqq { };
-
-  hspell = callPackage ../development/libraries/hspell { };
-
-  hspellDicts = callPackage ../development/libraries/hspell/dicts.nix { };
-
-  hsqldb = callPackage ../development/libraries/java/hsqldb { };
-
-  http-parser = callPackage ../development/libraries/http-parser { inherit (pythonPackages) gyp; };
-
-  hunspell = callPackage ../development/libraries/hunspell { };
-
-  hwloc = callPackage ../development/libraries/hwloc {
-    inherit (xlibs) libX11;
-  };
-
-  hydraAntLogger = callPackage ../development/libraries/java/hydra-ant-logger { };
-
-  icu = callPackage ../development/libraries/icu { };
-
-  id3lib = callPackage ../development/libraries/id3lib { };
-
-  iksemel = callPackage ../development/libraries/iksemel { };
-
-  ilbc = callPackage ../development/libraries/ilbc { };
-
-  ilixi = callPackage ../development/libraries/ilixi { };
-
-  ilmbase = callPackage ../development/libraries/ilmbase { };
-
-  imlib = callPackage ../development/libraries/imlib {
-    libpng = libpng12;
-  };
-
-  imlib2 = callPackage ../development/libraries/imlib2 { };
-
-  incrtcl = callPackage ../development/libraries/incrtcl { };
-
-  indilib = callPackage ../development/libraries/indilib { };
-
-  iniparser = callPackage ../development/libraries/iniparser { };
-
-  intltool = callPackage ../development/tools/misc/intltool { };
-
-  irrlicht3843 = callPackage ../development/libraries/irrlicht { };
-
-  isocodes = callPackage ../development/libraries/iso-codes { };
-
-  itk = callPackage ../development/libraries/itk { };
-
-  jamp = builderDefsPackage ../games/jamp {
-    inherit mesa SDL SDL_image SDL_mixer;
-  };
-
-  jasper = callPackage ../development/libraries/jasper { };
-
-  jama = callPackage ../development/libraries/jama { };
-
-  jansson = callPackage ../development/libraries/jansson { };
-
-  jbig2dec = callPackage ../development/libraries/jbig2dec { };
-
-  jetty_gwt = callPackage ../development/libraries/java/jetty-gwt { };
-
-  jetty_util = callPackage ../development/libraries/java/jetty-util { };
-
-  json_glib = callPackage ../development/libraries/json-glib { };
-
-  json-c-0-11 = callPackage ../development/libraries/json-c/0.11.nix { }; # vulnerable
-  json_c = callPackage ../development/libraries/json-c { };
-
-  jsoncpp = callPackage ../development/libraries/jsoncpp { };
-
-  libjson = callPackage ../development/libraries/libjson { };
-
-  judy = callPackage ../development/libraries/judy { };
-
-  keybinder = callPackage ../development/libraries/keybinder {
-    automake = automake111x;
-    lua = lua5_1;
-  };
-
-  keybinder3 = callPackage ../development/libraries/keybinder3 {
-    automake = automake111x;
-    lua = lua5_1;
-  };
-
-  krb5 = callPackage ../development/libraries/kerberos/krb5.nix { };
-
-  lcms = lcms1;
-
-  lcms1 = callPackage ../development/libraries/lcms { };
-
-  lcms2 = callPackage ../development/libraries/lcms2 { };
-
-  lensfun = callPackage ../development/libraries/lensfun { };
-
-  lesstif = callPackage ../development/libraries/lesstif { };
-
-  lesstif93 = callPackage ../development/libraries/lesstif-0.93 { };
-
-  leveldb = callPackage ../development/libraries/leveldb { };
-
-  levmar = callPackage ../development/libraries/levmar { };
-
-  leptonica = callPackage ../development/libraries/leptonica {
-    libpng = libpng12;
-  };
-
-  lgi = callPackage ../development/libraries/lgi {
-    lua = lua5_1;
-  };
-
-  lib3ds = callPackage ../development/libraries/lib3ds { };
-
-  libaacs = callPackage ../development/libraries/libaacs { };
-
-  libaal = callPackage ../development/libraries/libaal { };
-
-  libao = callPackage ../development/libraries/libao {
-    usePulseAudio = config.pulseaudio or true;
-  };
-
-  libarchive = callPackage ../development/libraries/libarchive { };
-
-  libass = callPackage ../development/libraries/libass { };
-
-  libassuan1 = callPackage ../development/libraries/libassuan1 { };
-
-  libassuan = callPackage ../development/libraries/libassuan { };
-
-  libassuan2_1 = callPackage ../development/libraries/libassuan/git.nix { };
-
-  libatomic_ops = callPackage ../development/libraries/libatomic_ops {};
-
-  libav = libav_10;
-  libav_all = callPackage ../development/libraries/libav { };
-  inherit (libav_all) libav_0_8 libav_9 libav_10;
-
-  libavc1394 = callPackage ../development/libraries/libavc1394 { };
-
-  libbluedevil = callPackage ../development/libraries/libbluedevil { };
-
-  libbluray = callPackage ../development/libraries/libbluray { };
-
-  libbs2b = callPackage ../development/libraries/audio/libbs2b { };
-
-  libcaca = callPackage ../development/libraries/libcaca { };
-
-  libcanberra = callPackage ../development/libraries/libcanberra { };
-  libcanberra_gtk3 = libcanberra.override { gtk = gtk3; };
-  libcanberra_kde = if (config.kde_runtime.libcanberraWithoutGTK or true)
-    then libcanberra.override { gtk = null; }
-    else libcanberra;
-
-  libcello = callPackage ../development/libraries/libcello {};
-
-  libcdaudio = callPackage ../development/libraries/libcdaudio { };
-
-  libcddb = callPackage ../development/libraries/libcddb { };
-
-  libcdio = callPackage ../development/libraries/libcdio { };
-  libcdio082 = callPackage ../development/libraries/libcdio/0.82.nix { };
-
-  libcdr = callPackage ../development/libraries/libcdr { lcms = lcms2; };
-
-  libchamplain = callPackage ../development/libraries/libchamplain {
-    inherit (gnome) libsoup;
-  };
-
-  libchamplain_0_6 = callPackage ../development/libraries/libchamplain/0.6.nix {};
-
-  libchop = callPackage ../development/libraries/libchop { };
-
-  libcm = callPackage ../development/libraries/libcm { };
-
-  inherit (gnome3) libcroco;
-
-  libcangjie = callPackage ../development/libraries/libcangjie { };
-
-  libcredis = callPackage ../development/libraries/libcredis { };
-
-  libctemplate = callPackage ../development/libraries/libctemplate { };
-
-  libcue = callPackage ../development/libraries/libcue { };
-
-  libdaemon = callPackage ../development/libraries/libdaemon { };
-
-  libdbi = callPackage ../development/libraries/libdbi { };
-
-  libdbiDriversBase = callPackage ../development/libraries/libdbi-drivers {
-    mysql = null;
-    sqlite = null;
-  };
-
-  libdbiDrivers = libdbiDriversBase.override {
-    inherit sqlite mysql;
-  };
-
-  libdbusmenu_qt = callPackage ../development/libraries/libdbusmenu-qt { };
-
-  libdc1394 = callPackage ../development/libraries/libdc1394 { };
-
-  libdc1394avt = callPackage ../development/libraries/libdc1394avt { };
-
-  libdevil = callPackage ../development/libraries/libdevil { };
-
-  libdiscid = callPackage ../development/libraries/libdiscid { };
-
-  libdivsufsort = callPackage ../development/libraries/libdivsufsort { };
-
-  libdmtx = callPackage ../development/libraries/libdmtx { };
-
-  libdnet = callPackage ../development/libraries/libdnet { };
-
-  libdrm = callPackage ../development/libraries/libdrm {
-    inherit fetchurl stdenv pkgconfig;
-    inherit (xorg) libpthreadstubs;
-  };
-
-  libdv = callPackage ../development/libraries/libdv { };
-
-  libdvbpsi = callPackage ../development/libraries/libdvbpsi { };
-
-  libdwg = callPackage ../development/libraries/libdwg { };
-
-  libdvdcss = callPackage ../development/libraries/libdvdcss { };
-
-  libdvdnav = callPackage ../development/libraries/libdvdnav { };
-
-  libdvdread = callPackage ../development/libraries/libdvdread { };
-
-  libdwarf = callPackage ../development/libraries/libdwarf { };
-
-  libeatmydata = callPackage ../development/libraries/libeatmydata { };
-
-  libebml = callPackage ../development/libraries/libebml { };
-
-  libedit = callPackage ../development/libraries/libedit { };
-
-  libelf = callPackage ../development/libraries/libelf { };
-
-  libfm = callPackage ../development/libraries/libfm { };
-
-  libgadu = callPackage ../development/libraries/libgadu { };
-
-  libgdata = gnome3.libgdata;
-
-  libgig = callPackage ../development/libraries/libgig { };
-
-  libgnome_keyring = callPackage ../development/libraries/libgnome-keyring { };
-  libgnome_keyring3 = gnome3.libgnome_keyring;
-
-  libgnurl = callPackage ../development/libraries/libgnurl { };
-
-  libseccomp = callPackage ../development/libraries/libseccomp { };
-
-  libsecret = callPackage ../development/libraries/libsecret { };
-
-  libserialport = callPackage ../development/libraries/libserialport { };
-
-  libgtop = callPackage ../development/libraries/libgtop {};
-
-  liblo = callPackage ../development/libraries/liblo { };
-
-  liblrdf = librdf;
-
-  liblscp = callPackage ../development/libraries/liblscp { };
-
-  libe-book = callPackage ../development/libraries/libe-book {};
-  libe-book_00 = callPackage ../development/libraries/libe-book/0.0.nix {};
-
-  libev = builderDefsPackage ../development/libraries/libev { };
-
-  libevent14 = callPackage ../development/libraries/libevent/1.4.nix { };
-  libevent = callPackage ../development/libraries/libevent { };
-
-  libewf = callPackage ../development/libraries/libewf { };
-
-  libexif = callPackage ../development/libraries/libexif { };
-
-  libexosip = callPackage ../development/libraries/exosip {};
-
-  libexosip_3 = callPackage ../development/libraries/exosip/3.x.nix {
-    libosip = libosip_3;
-  };
-
-  libextractor = callPackage ../development/libraries/libextractor {
-    libmpeg2 = mpeg2dec;
-  };
-
-  libexttextcat = callPackage ../development/libraries/libexttextcat {};
-
-  libf2c = callPackage ../development/libraries/libf2c {};
-
-  libfixposix = callPackage ../development/libraries/libfixposix {};
-
-  libffcall = builderDefsPackage (import ../development/libraries/libffcall) {
-    inherit fetchcvs;
-  };
-
-  libffi = callPackage ../development/libraries/libffi { };
-
-  libftdi = callPackage ../development/libraries/libftdi { };
-
-  libftdi1 = callPackage ../development/libraries/libftdi/1.x.nix { };
-
-  libgcrypt = callPackage ../development/libraries/libgcrypt { };
-
-  libgcrypt_1_6 = lowPrio (callPackage ../development/libraries/libgcrypt/1.6.nix { });
-
-  libgdiplus = callPackage ../development/libraries/libgdiplus { };
-
-  libgksu = callPackage ../development/libraries/libgksu { };
-
-  libgpgerror = callPackage ../development/libraries/libgpg-error { };
-
-  libgphoto2 = callPackage ../development/libraries/libgphoto2 { };
-
-  libgphoto2_4 = callPackage ../development/libraries/libgphoto2/2.4.nix { };
-
-  libgpod = callPackage ../development/libraries/libgpod {
-    inherit (pkgs.pythonPackages) mutagen;
-  };
-
-  libharu = callPackage ../development/libraries/libharu { };
-
-  libical = callPackage ../development/libraries/libical { };
-
-  libicns = callPackage ../development/libraries/libicns { };
-
-  libimobiledevice = callPackage ../development/libraries/libimobiledevice { };
-
-  libiodbc = callPackage ../development/libraries/libiodbc {
-    useGTK = config.libiodbc.gtk or false;
-  };
-
-  libivykis = callPackage ../development/libraries/libivykis { };
-
-  liblastfmSF = callPackage ../development/libraries/liblastfmSF { };
-
-  liblastfm = callPackage ../development/libraries/liblastfm { };
-
-  liblqr1 = callPackage ../development/libraries/liblqr-1 { };
-
-  liblockfile = callPackage ../development/libraries/liblockfile { };
-
-  liblogging = callPackage ../development/libraries/liblogging { };
-
-  libmcrypt = callPackage ../development/libraries/libmcrypt {};
-
-  libmhash = callPackage ../development/libraries/libmhash {};
-
-  libmodbus = callPackage ../development/libraries/libmodbus {};
-
-  libmtp = callPackage ../development/libraries/libmtp { };
-
-  libmsgpack = callPackage ../development/libraries/libmsgpack { };
-
-  libnatspec = callPackage ../development/libraries/libnatspec { };
-
-  libnfc = callPackage ../development/libraries/libnfc { };
-
-  libnfsidmap = callPackage ../development/libraries/libnfsidmap { };
-
-  libnice = callPackage ../development/libraries/libnice { };
-
-  liboping = callPackage ../development/libraries/liboping { };
-
-  libplist = callPackage ../development/libraries/libplist { };
-
-  libQGLViewer = callPackage ../development/libraries/libqglviewer { };
-
-  libre = callPackage ../development/libraries/libre {};
-  librem = callPackage ../development/libraries/librem {};
-
-  libresample = callPackage ../development/libraries/libresample {};
-
-  librevenge = callPackage ../development/libraries/librevenge {};
-
-  librevisa = callPackage ../development/libraries/librevisa { };
-
-  libsamplerate = callPackage ../development/libraries/libsamplerate { };
-
-  libspectre = callPackage ../development/libraries/libspectre { };
-
-  libgsf = callPackage ../development/libraries/libgsf { };
-
-  libiconv = callPackage ../development/libraries/libiconv { };
-
-  libiconvOrEmpty = if libiconvOrNull == null then [] else [libiconv];
-
-  libiconvOrNull =
-    if gcc.libc or null != null || stdenv.isGlibc
-    then null
-    else libiconv;
-
-  # The logic behind this attribute is broken: libiconvOrNull==null does
-  # NOT imply libiconv=glibc! On Darwin, for example, we have a native
-  # libiconv library which is not glibc.
-  libiconvOrLibc = if libiconvOrNull == null then gcc.libc else libiconv;
-
-  # On non-GNU systems we need GNU Gettext for libintl.
-  libintlOrEmpty = stdenv.lib.optional (!stdenv.isLinux) gettext;
-
-  libid3tag = callPackage ../development/libraries/libid3tag { };
-
-  libidn = callPackage ../development/libraries/libidn { };
-
-  libiec61883 = callPackage ../development/libraries/libiec61883 { };
-
-  libinfinity = callPackage ../development/libraries/libinfinity {
-    inherit (gnome) gtkdoc;
-  };
-
-  libiptcdata = callPackage ../development/libraries/libiptcdata { };
-
-  libjpeg_original = callPackage ../development/libraries/libjpeg { };
-  libjpeg_turbo = callPackage ../development/libraries/libjpeg-turbo { };
-  libjpeg = if (stdenv.isLinux) then libjpeg_turbo else libjpeg_original; # some problems, both on FreeBSD and Darwin
-
-  libjpeg62 = callPackage ../development/libraries/libjpeg/62.nix {
-    libtool = libtool_1_5;
-  };
-
-  libjson_rpc_cpp = callPackage ../development/libraries/libjson-rpc-cpp { };
-
-  libkate = callPackage ../development/libraries/libkate { };
-
-  libksba = callPackage ../development/libraries/libksba { };
-
-  libmad = callPackage ../development/libraries/libmad { };
-
-  libmatchbox = callPackage ../development/libraries/libmatchbox { };
-
-  libmatthew_java = callPackage ../development/libraries/java/libmatthew-java { };
-
-  libmatroska = callPackage ../development/libraries/libmatroska { };
-
-  libmcs = callPackage ../development/libraries/libmcs { };
-
-  libmemcached = callPackage ../development/libraries/libmemcached { };
-
-  libmicrohttpd = callPackage ../development/libraries/libmicrohttpd { };
-
-  libmikmod = callPackage ../development/libraries/libmikmod {
-    # resolve the "stray '@' in program" errors
-    stdenv = if stdenv.isDarwin
-      then overrideGCC stdenv gccApple
-      else stdenv;
-  };
-
-  libmilter = callPackage ../development/libraries/libmilter { };
-
-  libmkv = callPackage ../development/libraries/libmkv { };
-
-  libmms = callPackage ../development/libraries/libmms { };
-
-  libmowgli = callPackage ../development/libraries/libmowgli { };
-
-  libmng = callPackage ../development/libraries/libmng { };
-
-  libmnl = callPackage ../development/libraries/libmnl { };
-
-  libmodplug = callPackage ../development/libraries/libmodplug {};
-
-  libmpcdec = callPackage ../development/libraries/libmpcdec { };
-
-  libmp3splt = callPackage ../development/libraries/libmp3splt { };
-
-  libmrss = callPackage ../development/libraries/libmrss { };
-
-  libmsn = callPackage ../development/libraries/libmsn { };
-
-  libmspack = callPackage ../development/libraries/libmspack { };
-
-  libmusclecard = callPackage ../development/libraries/libmusclecard { };
-
-  libmusicbrainz2 = callPackage ../development/libraries/libmusicbrainz/2.x.nix { };
-
-  libmusicbrainz3 = callPackage ../development/libraries/libmusicbrainz { };
-
-  libmusicbrainz5 = callPackage ../development/libraries/libmusicbrainz/5.x.nix { };
-
-  libmusicbrainz = libmusicbrainz3;
-
-  libmwaw = callPackage ../development/libraries/libmwaw { };
-  libmwaw_02 = callPackage ../development/libraries/libmwaw/0.2.nix { };
-
-  libmx = callPackage ../development/libraries/libmx { };
-
-  libnet = callPackage ../development/libraries/libnet { };
-
-  libnetfilter_conntrack = callPackage ../development/libraries/libnetfilter_conntrack { };
-
-  libnetfilter_queue = callPackage ../development/libraries/libnetfilter_queue { };
-
-  libnfnetlink = callPackage ../development/libraries/libnfnetlink { };
-
-  libnftnl = callPackage ../development/libraries/libnftnl { };
-
-  libnih = callPackage ../development/libraries/libnih { };
-
-  libnova = callPackage ../development/libraries/libnova { };
-
-  libnxml = callPackage ../development/libraries/libnxml { };
-
-  libodfgen = callPackage ../development/libraries/libodfgen { };
-
-  libofa = callPackage ../development/libraries/libofa { };
-
-  libofx = callPackage ../development/libraries/libofx { };
-
-  libogg = callPackage ../development/libraries/libogg { };
-
-  liboggz = callPackage ../development/libraries/liboggz { };
-
-  liboil = callPackage ../development/libraries/liboil { };
-
-  liboop = callPackage ../development/libraries/liboop { };
-
-  libopus = callPackage ../development/libraries/libopus { };
-
-  libosinfo = callPackage ../development/libraries/libosinfo {};
-
-  libosip = callPackage ../development/libraries/osip {};
-
-  libosip_3 = callPackage ../development/libraries/osip/3.nix {};
-
-  libotr = callPackage ../development/libraries/libotr {
-    libgcrypt = libgcrypt_1_6;
-  };
-
-  libotr_3_2 = callPackage ../development/libraries/libotr/3.2.nix { };
-
-  libp11 = callPackage ../development/libraries/libp11 { };
-
-  libpar2 = callPackage ../development/libraries/libpar2 { };
-
-  libpcap = callPackage ../development/libraries/libpcap { };
-
-  libpipeline = callPackage ../development/libraries/libpipeline { };
-
-  libpng = callPackage ../development/libraries/libpng { };
-  libpng_apng = libpng.override { apngSupport = true; };
-  libpng12 = callPackage ../development/libraries/libpng/12.nix { };
-  libpng15 = callPackage ../development/libraries/libpng/15.nix { };
-
-  libpaper = callPackage ../development/libraries/libpaper { };
-
-  libproxy = callPackage ../development/libraries/libproxy {
-    stdenv = if stdenv.isDarwin
-      then overrideGCC stdenv gcc
-      else stdenv;
-  };
-
-  libpseudo = callPackage ../development/libraries/libpseudo { };
-
-  libpwquality = callPackage ../development/libraries/libpwquality { };
-
-  libqalculate = callPackage ../development/libraries/libqalculate { };
-
-  librsvg = callPackage ../development/libraries/librsvg {
-    gtk2 = null; gtk3 = null; # neither gtk version by default
-  };
-
-  librsync = callPackage ../development/libraries/librsync { };
-
-  libsearpc = callPackage ../development/libraries/libsearpc { };
-
-  libsigcxx = callPackage ../development/libraries/libsigcxx { };
-
-  libsigcxx12 = callPackage ../development/libraries/libsigcxx/1.2.nix { };
-
-  libsigsegv = callPackage ../development/libraries/libsigsegv { };
-
-  # To bootstrap SBCL, I need CLisp 2.44.1; it needs libsigsegv 2.5
-  libsigsegv_25 = callPackage ../development/libraries/libsigsegv/2.5.nix { };
-
-  libsndfile = callPackage ../development/libraries/libsndfile { };
-
-  libsodium = callPackage ../development/libraries/libsodium { };
-
-  libsoup = callPackage ../development/libraries/libsoup { };
-
-  libssh = callPackage ../development/libraries/libssh { };
-
-  libssh2 = callPackage ../development/libraries/libssh2 { };
-
-  libstartup_notification = callPackage ../development/libraries/startup-notification { };
-
-  libspatialindex = callPackage ../development/libraries/libspatialindex { };
-
-  libspatialite = callPackage ../development/libraries/libspatialite { };
-
-  libtar = callPackage ../development/libraries/libtar { };
-
-  libtasn1 = callPackage ../development/libraries/libtasn1 { };
-
-  libtheora = callPackage ../development/libraries/libtheora { };
-
-  libtiff = callPackage ../development/libraries/libtiff { };
-
-  libtiger = callPackage ../development/libraries/libtiger { };
-
-  libtommath = callPackage ../development/libraries/libtommath { };
-
-  libtorrentRasterbar = callPackage ../development/libraries/libtorrent-rasterbar {
-    # fix "unrecognized option -arch" error
-    stdenv = if stdenv.isDarwin
-      then clangStdenv
-      else stdenv;
-  };
-
-  libtoxcore = callPackage ../development/libraries/libtoxcore { };
-
-  libtsm = callPackage ../development/libraries/libtsm { };
-
-  libtunepimp = callPackage ../development/libraries/libtunepimp { };
-
-  libtxc_dxtn = callPackage ../development/libraries/libtxc_dxtn { };
-
-  libtxc_dxtn_s2tc = callPackage ../development/libraries/libtxc_dxtn_s2tc { };
-
-  libgeotiff = callPackage ../development/libraries/libgeotiff { };
-
-  libunistring = callPackage ../development/libraries/libunistring { };
-
-  libupnp = callPackage ../development/libraries/pupnp { };
-
-  giflib = callPackage ../development/libraries/giflib { };
-  giflib_4_1 = callPackage ../development/libraries/giflib/4.1.nix { };
-
-  libungif = callPackage ../development/libraries/giflib/libungif.nix { };
-
-  libunibreak = callPackage ../development/libraries/libunibreak { };
-
-  libunique = callPackage ../development/libraries/libunique/default.nix { };
-
-  liburcu = callPackage ../development/libraries/liburcu { };
-
-  libusb = callPackage ../development/libraries/libusb {};
-
-  libusb1 = callPackage ../development/libraries/libusb1 {
-    stdenv = if stdenv.isDarwin
-      then clangStdenv
-      else stdenv;
-  };
-
-  libunwind = callPackage ../development/libraries/libunwind { };
-
-  libuvVersions = callPackage ../development/libraries/libuv { };
-
-  libv4l = lowPrio (v4l_utils.override {
-    withQt4 = false;
-  });
-
-  libva = callPackage ../development/libraries/libva { };
-
-  libvdpau = callPackage ../development/libraries/libvdpau { };
-
-  libvirt = callPackage ../development/libraries/libvirt { };
-
-  libvirt-glib = callPackage ../development/libraries/libvirt-glib { };
-
-  libvisio = callPackage ../development/libraries/libvisio { };
-
-  libvisual = callPackage ../development/libraries/libvisual { };
-
-  libvncserver = callPackage ../development/libraries/libvncserver {};
-
-  libviper = callPackage ../development/libraries/libviper { };
-
-  libvpx = callPackage ../development/libraries/libvpx { };
-
-  libvterm = callPackage ../development/libraries/libvterm { };
-
-  libvorbis = callPackage ../development/libraries/libvorbis { };
-
-  libwebp = callPackage ../development/libraries/libwebp { };
-
-  libwmf = callPackage ../development/libraries/libwmf { };
-
-  libwnck = libwnck2;
-  libwnck2 = callPackage ../development/libraries/libwnck { };
-  libwnck3 = callPackage ../development/libraries/libwnck/3.x.nix { };
-
-  libwpd = callPackage ../development/libraries/libwpd { };
-
-  libwpd_08 = callPackage ../development/libraries/libwpd/0.8.nix { };
-
-  libwpg = callPackage ../development/libraries/libwpg { };
-
-  libx86 = builderDefsPackage ../development/libraries/libx86 {};
-
-  libxdg_basedir = callPackage ../development/libraries/libxdg-basedir { };
-
-  libxkbcommon = callPackage ../development/libraries/libxkbcommon { };
-
-  libxklavier = callPackage ../development/libraries/libxklavier { };
-
-  libxmi = callPackage ../development/libraries/libxmi { };
-
-  libxml2 = callPackage ../development/libraries/libxml2 {
-    pythonSupport = false;
-  };
-
-  libxml2Python = lowPrio (libxml2.override {
-    pythonSupport = true;
-  });
-
-  libxmlxx = callPackage ../development/libraries/libxmlxx { };
-
-  libxmp = callPackage ../development/libraries/libxmp { };
-
-  libxslt = callPackage ../development/libraries/libxslt { };
-
-  libixp_for_wmii = lowPrio (import ../development/libraries/libixp_for_wmii {
-    inherit fetchurl stdenv;
-  });
-
-  libyaml = callPackage ../development/libraries/libyaml { };
-
-  libyamlcpp = callPackage ../development/libraries/libyaml-cpp { };
-  libyamlcpp03 = callPackage ../development/libraries/libyaml-cpp/0.3.x.nix { };
-
-  libyubikey = callPackage ../development/libraries/libyubikey {};
-
-  libzip = callPackage ../development/libraries/libzip { };
-
-  libzdb = callPackage ../development/libraries/libzdb { };
-
-  libzrtpcpp = callPackage ../development/libraries/libzrtpcpp { };
-  libzrtpcpp_1_6 = callPackage ../development/libraries/libzrtpcpp/1.6.nix {
-    ccrtp = ccrtp_1_8;
-  };
-
-  libwacom = callPackage ../development/libraries/libwacom { };
-
-  lightning = callPackage ../development/libraries/lightning { };
-
-  lirc = callPackage ../development/libraries/lirc { };
-
-  liquidwar = builderDefsPackage ../games/liquidwar {
-    inherit (xlibs) xproto libX11 libXrender;
-    inherit gmp mesa libjpeg
-      expat gettext perl
-      SDL SDL_image SDL_mixer SDL_ttf
-      curl sqlite
-      libogg libvorbis libcaca csound cunit
-      ;
-    guile = guile_1_8;
-    libpng = libpng15; # 0.0.13 needs libpng 1.2--1.5
-  };
-
-  log4cpp = callPackage ../development/libraries/log4cpp { };
-
-  log4cxx = callPackage ../development/libraries/log4cxx { };
-
-  log4cplus = callPackage ../development/libraries/log4cplus { };
-
-  loudmouth = callPackage ../development/libraries/loudmouth { };
-
-  lzo = callPackage ../development/libraries/lzo { };
-
-  mdds_0_7_1 = callPackage ../development/libraries/mdds/0.7.1.nix { };
-  mdds = callPackage ../development/libraries/mdds { };
-
-  # failed to build
-  mediastreamer = callPackage ../development/libraries/mediastreamer { };
-
-  menu-cache = callPackage ../development/libraries/menu-cache { };
-
-  mesaSupported = lib.elem system lib.platforms.mesaPlatforms;
-
-  mesaDarwinOr = alternative: if stdenv.isDarwin
-    then callPackage ../development/libraries/mesa-darwin { }
-    else alternative;
-  mesa_noglu = mesaDarwinOr (callPackage ../development/libraries/mesa {
-    # makes it slower, but during runtime we link against just mesa_drivers
-    # through /run/opengl-driver*, which is overriden according to config.grsecurity
-    grsecEnabled = true;
-  });
-  mesa_glu =  mesaDarwinOr (callPackage ../development/libraries/mesa-glu { });
-  mesa_drivers = mesaDarwinOr (
-    let mo = mesa_noglu.override {
-      grsecEnabled = config.grsecurity or false;
-    };
-    in mo.drivers
-  );
-  mesa = mesaDarwinOr (buildEnv {
-    name = "mesa-${mesa_noglu.version}";
-    paths = [ mesa_noglu mesa_glu ];
-  });
-
-  metaEnvironment = recurseIntoAttrs (let callPackage = newScope pkgs.metaEnvironment; in rec {
-    sdfLibrary    = callPackage ../development/libraries/sdf-library { aterm = aterm28; };
-    toolbuslib    = callPackage ../development/libraries/toolbuslib { aterm = aterm28; inherit (windows) w32api; };
-    cLibrary      = callPackage ../development/libraries/c-library { aterm = aterm28; };
-    errorSupport  = callPackage ../development/libraries/error-support { aterm = aterm28; };
-    ptSupport     = callPackage ../development/libraries/pt-support { aterm = aterm28; };
-    ptableSupport = callPackage ../development/libraries/ptable-support { aterm = aterm28; };
-    configSupport = callPackage ../development/libraries/config-support { aterm = aterm28; };
-    asfSupport    = callPackage ../development/libraries/asf-support { aterm = aterm28; };
-    tideSupport   = callPackage ../development/libraries/tide-support { aterm = aterm28; };
-    rstoreSupport = callPackage ../development/libraries/rstore-support { aterm = aterm28; };
-    sdfSupport    = callPackage ../development/libraries/sdf-support { aterm = aterm28; };
-    sglr          = callPackage ../development/libraries/sglr { aterm = aterm28; };
-    ascSupport    = callPackage ../development/libraries/asc-support { aterm = aterm28; };
-    pgen          = callPackage ../development/libraries/pgen { aterm = aterm28; };
-  });
-
-  ming = callPackage ../development/libraries/ming { };
-
-  minizip = callPackage ../development/libraries/minizip { };
-
-  minmay = callPackage ../development/libraries/minmay { };
-
-  miro = callPackage ../applications/video/miro {
-    inherit (pythonPackages) pywebkitgtk pysqlite pycurl mutagen;
-  };
-
-  mkvtoolnix = callPackage ../applications/video/mkvtoolnix { };
-
-  mlt-qt4 = callPackage ../development/libraries/mlt {
-    qt = qt4;
-    SDL = SDL_pulseaudio;
-  };
-
-  mlt-qt5 = callPackage ../development/libraries/mlt {
-    qt = qt5;
-    SDL = SDL_pulseaudio;
-  };
-
-  movit = callPackage ../development/libraries/movit { };
-
-  mps = callPackage ../development/libraries/mps { };
-
-  libmpeg2 = callPackage ../development/libraries/libmpeg2 { };
-
-  mpeg2dec = libmpeg2;
-
-  msilbc = callPackage ../development/libraries/msilbc { };
-
-  mp4v2 = callPackage ../development/libraries/mp4v2 { };
-
-  mpc = callPackage ../development/libraries/mpc { };
-
-  mpich2 = callPackage ../development/libraries/mpich2 { };
-
-  mtdev = callPackage ../development/libraries/mtdev { };
-
-  mtpfs = callPackage ../tools/filesystems/mtpfs { };
-
-  mu = callPackage ../tools/networking/mu {
-    texinfo = texinfo4;
-  };
-
-  muparser = callPackage ../development/libraries/muparser { };
-
-  mygpoclient = callPackage ../development/python-modules/mygpoclient { };
-
-  mygui = callPackage ../development/libraries/mygui {};
-
-  myguiSvn = callPackage ../development/libraries/mygui/svn.nix {};
-
-  mysocketw = callPackage ../development/libraries/mysocketw { };
-
-  mythes = callPackage ../development/libraries/mythes { };
-
-  nanomsg = callPackage ../development/libraries/nanomsg { };
-
-  ncurses = callPackage ../development/libraries/ncurses {
-    unicode = system != "i686-cygwin";
-  };
-
-  neon = callPackage ../development/libraries/neon {
-    compressionSupport = true;
-    sslSupport = true;
-  };
-
-  nethack = builderDefsPackage (import ../games/nethack) {
-    inherit ncurses flex bison;
-  };
-
-  nettle = callPackage ../development/libraries/nettle { };
-
-  newt = callPackage ../development/libraries/newt { };
-
-  nix-plugins = callPackage ../development/libraries/nix-plugins {
-    nix = pkgs.nixUnstable;
-  };
-
-  nspr = callPackage ../development/libraries/nspr { };
-
-  nss = lowPrio (callPackage ../development/libraries/nss { });
-
-  nssTools = callPackage ../development/libraries/nss {
-    includeTools = true;
-  };
-
-  ntrack = callPackage ../development/libraries/ntrack { };
-
-  nvidia-texture-tools = callPackage ../development/libraries/nvidia-texture-tools { };
-
-  ode = builderDefsPackage (import ../development/libraries/ode) { };
-
-  ogre = callPackage ../development/libraries/ogre {};
-
-  ogrepaged = callPackage ../development/libraries/ogrepaged { };
-
-  oniguruma = callPackage ../development/libraries/oniguruma { };
-
-  openal = callPackage ../development/libraries/openal { };
-
-  # added because I hope that it has been easier to compile on x86 (for blender)
-  openalSoft = callPackage ../development/libraries/openal-soft { };
-
-  openbabel = callPackage ../development/libraries/openbabel { };
-
-  opencascade = callPackage ../development/libraries/opencascade { };
-
-  opencascade_6_5 = callPackage ../development/libraries/opencascade/6.5.nix {
-    automake = automake111x;
-    ftgl = ftgl212;
-  };
-
-  opencascade_oce = callPackage ../development/libraries/opencascade/oce.nix { };
-
-  opencsg = callPackage ../development/libraries/opencsg { };
-
-  openct = callPackage ../development/libraries/openct { };
-
-  opencv = callPackage ../development/libraries/opencv { };
-
-  opencv_2_1 = callPackage ../development/libraries/opencv/2.1.nix {
-    libpng = libpng12;
-  };
-
-  # this ctl version is needed by openexr_viewers
-  openexr_ctl = callPackage ../development/libraries/openexr_ctl { };
-
-  openexr = callPackage ../development/libraries/openexr { };
-
-  openldap = callPackage ../development/libraries/openldap { };
-
-  openlierox = callPackage ../games/openlierox { };
-
-  libopensc_dnie = callPackage ../development/libraries/libopensc-dnie { };
-
-  opencolorio = callPackage ../development/libraries/opencolorio { };
-
-  ois = callPackage ../development/libraries/ois {};
-
-  opal = callPackage ../development/libraries/opal {};
-
-  openjpeg = callPackage ../development/libraries/openjpeg { lcms = lcms2; };
-
-  openscenegraph = callPackage ../development/libraries/openscenegraph {
-    giflib = giflib_4_1;
-    ffmpeg = ffmpeg_0_10;
-  };
-
-  openspades = callPackage ../games/openspades {};
-
-  libressl = callPackage ../development/libraries/libressl { };
-
-  boringssl = callPackage ../development/libraries/boringssl { };
-
-  openssl = callPackage ../development/libraries/openssl {
-    fetchurl = fetchurlBoot;
-    cryptodevHeaders = linuxPackages.cryptodev.override {
-      fetchurl = fetchurlBoot;
-      onlyHeaders = true;
-    };
-  };
-
-  ortp = callPackage ../development/libraries/ortp {
-    srtp = srtp_linphone;
-  };
-
-  p11_kit = callPackage ../development/libraries/p11-kit { };
-
-  paperkey = callPackage ../tools/security/paperkey { };
-
-  pangoxsl = callPackage ../development/libraries/pangoxsl { };
-
-  pcl = callPackage ../development/libraries/pcl {
-    vtk = vtkWithQt4;
-  };
-
-  pcre = callPackage ../development/libraries/pcre {
-    unicodeSupport = config.pcre.unicode or true;
-  };
-
-  pdf2xml = callPackage ../development/libraries/pdf2xml {} ;
-
-  phonon = callPackage ../development/libraries/phonon { };
-
-  phonon_backend_gstreamer = callPackage ../development/libraries/phonon-backend-gstreamer { };
-
-  phonon_backend_vlc = callPackage ../development/libraries/phonon-backend-vlc { };
-
-  physfs = callPackage ../development/libraries/physfs { };
-
-  pkcs11helper = callPackage ../development/libraries/pkcs11helper { };
-
-  plib = callPackage ../development/libraries/plib { };
-
-  pocketsphinx = callPackage ../development/libraries/pocketsphinx { };
-
-  podofo = callPackage ../development/libraries/podofo { };
-
-  polkit = callPackage ../development/libraries/polkit {
-    spidermonkey = spidermonkey_185;
-  };
-
-  polkit_qt_1 = callPackage ../development/libraries/polkit-qt-1 { };
-
-  policykit = callPackage ../development/libraries/policykit { };
-
-  poppler = callPackage ../development/libraries/poppler { lcms = lcms2; };
-  popplerQt4 = poppler.poppler_qt4;
-
-  popt = callPackage ../development/libraries/popt { };
-
-  portaudio = callPackage ../development/libraries/portaudio {
-    # resolves a variety of compile-time errors
-    stdenv = if stdenv.isDarwin
-      then clangStdenv
-      else stdenv;
-  };
-
-  portaudioSVN = callPackage ../development/libraries/portaudio/svn-head.nix { };
-
-  portmidi = callPackage ../development/libraries/portmidi {};
-
-  prison = callPackage ../development/libraries/prison { };
-
-  proj = callPackage ../development/libraries/proj { };
-
-  postgis = callPackage ../development/libraries/postgis { };
-
-  protobuf = callPackage ../development/libraries/protobuf { };
-
-  protobufc = callPackage ../development/libraries/protobufc { };
-
-  pth = callPackage ../development/libraries/pth { };
-
-  ptlib = callPackage ../development/libraries/ptlib {};
-
-  re2 = callPackage ../development/libraries/re2 { };
-
-  qca2 = callPackage ../development/libraries/qca2 {};
-
-  qca2_ossl = callPackage ../development/libraries/qca2/ossl.nix {};
-
-  qimageblitz = callPackage ../development/libraries/qimageblitz {};
-
-  qjson = callPackage ../development/libraries/qjson { };
-
-  qoauth = callPackage ../development/libraries/qoauth { };
-
-  qt3 = callPackage ../development/libraries/qt-3 {
-    openglSupport = mesaSupported;
-    libpng = libpng12;
-  };
-
-  qt4 = pkgs.kde4.qt4;
-
-  qt48 = callPackage ../development/libraries/qt-4.x/4.8 {
-    # GNOME dependencies are not used unless gtkStyle == true
-    mesa = mesa_noglu;
-    inherit (pkgs.gnome) libgnomeui GConf gnome_vfs;
-    cups = if stdenv.isLinux then cups else null;
-
-    # resolve unrecognised flag '-fconstant-cfstrings' errors
-    stdenv = if stdenv.isDarwin
-      then clangStdenv
-      else stdenv;
-  };
-
-  qt48Full = qt48.override {
-    docs = true;
-    demos = true;
-    examples = true;
-    developerBuild = true;
-  };
-
-  qt4SDK = qtcreator.override {
-    sdkBuild = true;
-    qtLib = qt48Full;
-  };
-
-  qt53Full = qt53.override {
-    buildDocs = true;
-    buildExamples = true;
-    buildTests = true;
-    developerBuild = true;
-  };
-
-  qt53 = callPackage ../development/libraries/qt-5/qt-5.3.nix {
-    mesa = mesa_noglu;
-    cups = if stdenv.isLinux then cups else null;
-    # GNOME dependencies are not used unless gtkStyle == true
-    inherit (gnome) libgnomeui GConf gnome_vfs;
-    bison = bison2; # error: too few arguments to function 'int yylex(...
-  };
-
-  qt5 = callPackage ../development/libraries/qt-5 {
-    mesa = mesa_noglu;
-    cups = if stdenv.isLinux then cups else null;
-    # GNOME dependencies are not used unless gtkStyle == true
-    inherit (gnome) libgnomeui GConf gnome_vfs;
-    bison = bison2; # error: too few arguments to function 'int yylex(...
-  };
-
-  qt5Full = qt5.override {
-    buildDocs = true;
-    buildExamples = true;
-    buildTests = true;
-    developerBuild = true;
-  };
-
-  qt5SDK = qtcreator.override {
-    sdkBuild = true;
-    qtLib = qt5Full;
-  };
-
-  qtcreator = callPackage ../development/qtcreator {
-    qtLib = qt48.override { developerBuild = true; };
-  };
-
-  qtscriptgenerator = callPackage ../development/libraries/qtscriptgenerator { };
-
-  quesoglc = callPackage ../development/libraries/quesoglc { };
-
-  qwt = callPackage ../development/libraries/qwt {};
-
-  qwt6 = callPackage ../development/libraries/qwt/6.nix { };
-
-  rabbitmq-c = callPackage ../development/libraries/rabbitmq-c {};
-
-  rabbitmq-java-client = callPackage ../development/libraries/rabbitmq-java-client {};
-
-  raul = callPackage ../development/libraries/audio/raul { };
-
-  readline = readline6; # 6.2 works, 6.3 breaks python, parted
-
-  readline4 = callPackage ../development/libraries/readline/readline4.nix { };
-
-  readline5 = callPackage ../development/libraries/readline/readline5.nix { };
-
-  readline6 = callPackage ../development/libraries/readline/readline6.nix { };
-
-  readline63 = callPackage ../development/libraries/readline/readline6.3.nix { };
-
-  librdf_raptor = callPackage ../development/libraries/librdf/raptor.nix { };
-
-  librdf_raptor2 = callPackage ../development/libraries/librdf/raptor2.nix { };
-
-  librdf_rasqal = callPackage ../development/libraries/librdf/rasqal.nix { };
-
-  librdf_redland = callPackage ../development/libraries/librdf/redland.nix { };
-
-  librdf = callPackage ../development/libraries/librdf { };
-
-  lilv = callPackage ../development/libraries/audio/lilv { };
-
-  lv2 = callPackage ../development/libraries/audio/lv2 { };
-
-  lvtk = callPackage ../development/libraries/audio/lvtk { };
-
-  qrupdate = callPackage ../development/libraries/qrupdate { };
-
-  redland = pkgs.librdf_redland;
-
-  rhino = callPackage ../development/libraries/java/rhino {
-    javac = gcj;
-    jvm = gcj;
-  };
-
-  rlog = callPackage ../development/libraries/rlog { };
-
-  rubberband = callPackage ../development/libraries/rubberband {
-    fftw = fftwSinglePrec;
-    inherit (vamp) vampSDK;
-  };
-
-  sbc = callPackage ../development/libraries/sbc { };
-
-  schroedinger = callPackage ../development/libraries/schroedinger { };
-
-  SDL = callPackage ../development/libraries/SDL {
-    openglSupport = mesaSupported;
-    alsaSupport = (!stdenv.isDarwin);
-    x11Support = true;
-    pulseaudioSupport = stdenv.isDarwin; # better go through ALSA
-
-    # resolve the unrecognized -fpascal-strings option error
-    stdenv = if stdenv.isDarwin
-      then clangStdenv
-      else stdenv;
-  };
-
-  # Fixes major problems with choppy sound in MLT / Kdenlive / Shotcut
-  SDL_pulseaudio = SDL.override { pulseaudioSupport = true; };
-
-  SDL_gfx = callPackage ../development/libraries/SDL_gfx { };
-
-  SDL_image = callPackage ../development/libraries/SDL_image {
-    # provide an Objective-C compiler
-    stdenv = if stdenv.isDarwin
-      then clangStdenv
-      else stdenv;
-  };
-
-  SDL_mixer = callPackage ../development/libraries/SDL_mixer { };
-
-  SDL_net = callPackage ../development/libraries/SDL_net { };
-
-  SDL_sound = callPackage ../development/libraries/SDL_sound { };
-
-  SDL_ttf = callPackage ../development/libraries/SDL_ttf { };
-
-  SDL2 = callPackage ../development/libraries/SDL2 {
-    openglSupport = mesaSupported;
-    alsaSupport = true;
-    x11Support = true;
-    pulseaudioSupport = false; # better go through ALSA
-  };
-
-  SDL2_image = callPackage ../development/libraries/SDL2_image { };
-
-  SDL2_mixer = callPackage ../development/libraries/SDL2_mixer { };
-
-  SDL2_net = callPackage ../development/libraries/SDL2_net { };
-
-  SDL2_gfx = callPackage ../development/libraries/SDL2_gfx { };
-
-  serd = callPackage ../development/libraries/serd {};
-
-  serf = callPackage ../development/libraries/serf {};
-
-  silgraphite = callPackage ../development/libraries/silgraphite {};
-  graphite2 = callPackage ../development/libraries/silgraphite/graphite2.nix {};
-
-  simgear = callPackage ../development/libraries/simgear { };
-
-  sfml_git = callPackage ../development/libraries/sfml { };
-
-  skalibs = callPackage ../development/libraries/skalibs { };
-
-  slang = callPackage ../development/libraries/slang { };
-
-  slibGuile = callPackage ../development/libraries/slib {
-    scheme = guile_1_8;
-    texinfo = texinfo4; # otherwise erros: must be after `@defun' to use `@defunx'
-  };
-
-  smpeg = callPackage ../development/libraries/smpeg { };
-
-  snack = callPackage ../development/libraries/snack {
-        # optional
-  };
-
-  snappy = callPackage ../development/libraries/snappy { };
-
-  sodium = callPackage ../development/libraries/sodium {};
-
-  sofia_sip = callPackage ../development/libraries/sofia-sip { };
-
-  soprano = callPackage ../development/libraries/soprano { };
-
-  soqt = callPackage ../development/libraries/soqt { };
-
-  sord = callPackage ../development/libraries/sord {};
-
-  spandsp = callPackage ../development/libraries/spandsp {};
-
-  speechd = callPackage ../development/libraries/speechd { };
-
-  speech_tools = callPackage ../development/libraries/speech-tools {};
-
-  speex = callPackage ../development/libraries/speex { };
-
-  sphinxbase = callPackage ../development/libraries/sphinxbase { };
-
-  spice = callPackage ../development/libraries/spice {
-    celt = celt_0_5_1;
-    inherit (xlibs) libXrandr libXfixes libXext libXrender libXinerama;
-    inherit (pythonPackages) pyparsing;
-  };
-
-  spice_gtk = callPackage ../development/libraries/spice-gtk { };
-
-  spice_protocol = callPackage ../development/libraries/spice-protocol { };
-
-  sratom = callPackage ../development/libraries/audio/sratom { };
-
-  srtp = callPackage ../development/libraries/srtp {};
-
-  srtp_linphone = callPackage ../development/libraries/srtp/linphone.nix { };
-
-  sqlite = lowPrio (callPackage ../development/libraries/sqlite {
-    readline = null;
-    ncurses = null;
-  });
-
-  sqliteInteractive = appendToName "interactive" (sqlite.override {
-    inherit readline ncurses;
-  });
-
-  sqlcipher = lowPrio (callPackage ../development/libraries/sqlcipher {
-    readline = null;
-    ncurses = null;
-  });
-
-  stfl = callPackage ../development/libraries/stfl {
-    stdenv = if stdenv.isDarwin
-      then overrideGCC stdenv gccApple
-      else stdenv;
-  };
-
-  stlink = callPackage ../development/tools/misc/stlink { };
-
-  steghide = callPackage ../tools/security/steghide {};
-
-  stepmania = callPackage ../games/stepmania {};
-
-  stlport = callPackage ../development/libraries/stlport { };
-
-  strigi = callPackage ../development/libraries/strigi { clucene_core = clucene_core_2; };
-
-  subtitleeditor = callPackage ../applications/video/subtitleeditor { };
-
-  suil = callPackage ../development/libraries/audio/suil { };
-
-  suitesparse = callPackage ../development/libraries/suitesparse { };
-
-  sutils = callPackage ../tools/misc/sutils { };
-
-  sword = callPackage ../development/libraries/sword { };
-
-  szip = callPackage ../development/libraries/szip { };
-
-  t1lib = callPackage ../development/libraries/t1lib { };
-
-  taglib = callPackage ../development/libraries/taglib { };
-
-  taglib_extras = callPackage ../development/libraries/taglib-extras { };
-
-  talloc = callPackage ../development/libraries/talloc { };
-
-  tclap = callPackage ../development/libraries/tclap {};
-
-  tclgpg = callPackage ../development/libraries/tclgpg { };
-
-  tcllib = callPackage ../development/libraries/tcllib { };
-
-  tcltls = callPackage ../development/libraries/tcltls { };
-
-  tdb = callPackage ../development/libraries/tdb { };
-
-  tecla = callPackage ../development/libraries/tecla { };
-
-  telepathy_glib = callPackage ../development/libraries/telepathy/glib { };
-
-  telepathy_farstream = callPackage ../development/libraries/telepathy/farstream {};
-
-  telepathy_qt = callPackage ../development/libraries/telepathy/qt { };
-
-  thrift = callPackage ../development/libraries/thrift { };
-
-  tinyxml = tinyxml2;
-
-  tinyxml2 = callPackage ../development/libraries/tinyxml/2.6.2.nix { };
-
-  tk = callPackage ../development/libraries/tk { };
-
-  tnt = callPackage ../development/libraries/tnt { };
-
-  tokyocabinet = callPackage ../development/libraries/tokyo-cabinet { };
-  tokyotyrant = callPackage ../development/libraries/tokyo-tyrant { };
-
-  tremor = callPackage ../development/libraries/tremor { };
-
-  unicap = callPackage ../development/libraries/unicap {};
-
-  tsocks = callPackage ../development/libraries/tsocks { };
-
-  unixODBC = callPackage ../development/libraries/unixODBC { };
-
-  unixODBCDrivers = recurseIntoAttrs (import ../development/libraries/unixODBCDrivers {
-    inherit fetchurl stdenv unixODBC glibc libtool openssl zlib;
-    inherit postgresql mysql sqlite;
-  });
-
-  urt = callPackage ../development/libraries/urt { };
-
-  ustr = callPackage ../development/libraries/ustr { };
-
-  usbredir = callPackage ../development/libraries/usbredir {
-    libusb = libusb1;
-  };
-
-  ucommon = callPackage ../development/libraries/ucommon { };
-
-  v8 = callPackage ../development/libraries/v8 {
-    inherit (pythonPackages) gyp;
-  };
-
-  vaapiIntel = callPackage ../development/libraries/vaapi-intel { };
-
-  vaapiVdpau = callPackage ../development/libraries/vaapi-vdpau { };
-
-  vamp = callPackage ../development/libraries/audio/vamp { };
-
-  vcdimager = callPackage ../development/libraries/vcdimager { };
-
-  vigra = callPackage ../development/libraries/vigra {
-    inherit (pkgs.pythonPackages) numpy;
-  };
-
-  vlock = callPackage ../misc/screensavers/vlock { };
-
-  vmime = callPackage ../development/libraries/vmime { };
-
-  vrpn = callPackage ../development/libraries/vrpn { };
-
-  vtk = callPackage ../development/libraries/vtk { };
-
-  vtkWithQt4 = vtk.override { qtLib = qt4; };
-
-  vxl = callPackage ../development/libraries/vxl {
-    libpng = libpng12;
-  };
-
-  wayland = callPackage ../development/libraries/wayland { };
-
-  webkit = webkitgtk;
-
-  webkitgtk = callPackage ../development/libraries/webkitgtk {
-    harfbuzz = harfbuzz.override {
-      withIcu = true;
-    };
-    gst-plugins-base = gst_all_1.gst-plugins-base;
-  };
-
-  webkitgtk2 = webkitgtk.override {
-    withGtk2 = true;
-    enableIntrospection = false;
-  };
-
-  wildmidi = callPackage ../development/libraries/wildmidi { };
-
-  wvstreams = callPackage ../development/libraries/wvstreams { };
-
-  wxGTK = wxGTK28;
-
-  wxGTK28 = callPackage ../development/libraries/wxGTK-2.8 {
-    inherit (gnome) GConf;
-    withMesa = lib.elem system lib.platforms.mesaPlatforms;
-  };
-
-  wxGTK29 = callPackage ../development/libraries/wxGTK-2.9/default.nix {
-    inherit (gnome) GConf;
-    withMesa = lib.elem system lib.platforms.mesaPlatforms;
-
-    # use for Objective-C++ compiler
-    stdenv = if stdenv.isDarwin
-      then clangStdenv
-      else stdenv;
-  };
-
-  wxGTK30 = callPackage ../development/libraries/wxGTK-3.0/default.nix {
-    inherit (gnome) GConf;
-    withMesa = lib.elem system lib.platforms.mesaPlatforms;
-
-    # use for Objective-C++ compiler
-    stdenv = if stdenv.isDarwin
-      then clangStdenv
-      else stdenv;
-  };
-
-  wtk = callPackage ../development/libraries/wtk { };
-
-  x264 = callPackage ../development/libraries/x264 { };
-
-  xapian = callPackage ../development/libraries/xapian { };
-
-  xapianBindings = callPackage ../development/libraries/xapian/bindings {  # TODO perl php Java, tcl, C#, python
-  };
-
-  xapian10 = callPackage ../development/libraries/xapian/1.0.x.nix { };
-
-  xapianBindings10 = callPackage ../development/libraries/xapian/bindings/1.0.x.nix {  # TODO perl php Java, tcl, C#, python
-  };
-
-  Xaw3d = callPackage ../development/libraries/Xaw3d { };
-
-  xbase = callPackage ../development/libraries/xbase { };
-
-  xcb-util-cursor = callPackage ../development/libraries/xcb-util-cursor { };
-
-  xdo = callPackage ../tools/misc/xdo { };
-
-  xineLib = callPackage ../development/libraries/xine-lib {
-    ffmpeg = ffmpeg_1;
-  };
-
-  xautolock = callPackage ../misc/screensavers/xautolock { };
-
-  xercesc = callPackage ../development/libraries/xercesc {};
-
-  xlibsWrapper = callPackage ../development/libraries/xlibs-wrapper {
-    packages = [
-      freetype fontconfig xlibs.xproto xlibs.libX11 xlibs.libXt
-      xlibs.libXft xlibs.libXext xlibs.libSM xlibs.libICE
-      xlibs.xextproto
-    ];
-  };
-
-  xmlrpc_c = callPackage ../development/libraries/xmlrpc-c { };
-
-  xmlsec = callPackage ../development/libraries/xmlsec { };
-
-  xvidcore = callPackage ../development/libraries/xvidcore { };
-
-  xylib = callPackage ../development/libraries/xylib { };
-
-  yajl = callPackage ../development/libraries/yajl { };
-
-  zangband = builderDefsPackage (import ../games/zangband) {
-    inherit ncurses flex bison autoconf automake m4 coreutils;
-  };
-
-  zeitgeist = callPackage ../development/libraries/zeitgeist { };
-
-  zlib = callPackage ../development/libraries/zlib {
-    fetchurl = fetchurlBoot;
-  };
-
-  zlibStatic = lowPrio (appendToName "static" (callPackage ../development/libraries/zlib {
-    static = true;
-  }));
-
-  zeromq2 = callPackage ../development/libraries/zeromq/2.x.nix {};
-  zeromq3 = callPackage ../development/libraries/zeromq/3.x.nix {};
-  zeromq4 = callPackage ../development/libraries/zeromq/4.x.nix {};
-
-  zziplib = callPackage ../development/libraries/zziplib { };
-
-
-  ### DEVELOPMENT / LIBRARIES / JAVA
-
-  atermjava = callPackage ../development/libraries/java/aterm {
-    stdenv = overrideInStdenv stdenv [gnumake380];
-  };
-
-  commonsFileUpload = callPackage ../development/libraries/java/jakarta-commons/file-upload { };
-
-  fastjar = callPackage ../development/tools/java/fastjar { };
-
-  httpunit = callPackage ../development/libraries/java/httpunit { };
-
-  gwtdragdrop = callPackage ../development/libraries/java/gwt-dragdrop { };
-
-  gwtwidgets = callPackage ../development/libraries/java/gwt-widgets { };
-
-  jakartabcel = callPackage ../development/libraries/java/jakarta-bcel {
-    regexp = jakartaregexp;
-  };
-
-  jakartaregexp = callPackage ../development/libraries/java/jakarta-regexp { };
-
-  javaCup = callPackage ../development/libraries/java/cup { };
-
-  javasvn = callPackage ../development/libraries/java/javasvn { };
-
-  jclasslib = callPackage ../development/tools/java/jclasslib { };
-
-  jdom = callPackage ../development/libraries/java/jdom { };
-
-  jflex = callPackage ../development/libraries/java/jflex { };
-
-  jjtraveler = callPackage ../development/libraries/java/jjtraveler {
-    stdenv = overrideInStdenv stdenv [gnumake380];
-  };
-
-  junit = callPackage ../development/libraries/java/junit { antBuild = releaseTools.antBuild; };
-
-  junixsocket = callPackage ../development/libraries/java/junixsocket { };
-
-  jzmq = callPackage ../development/libraries/java/jzmq { };
-
-  lucene = callPackage ../development/libraries/java/lucene { };
-
-  mockobjects = callPackage ../development/libraries/java/mockobjects { };
-
-  saxon = callPackage ../development/libraries/java/saxon { };
-
-  saxonb = callPackage ../development/libraries/java/saxon/default8.nix { };
-
-  sharedobjects = callPackage ../development/libraries/java/shared-objects {
-    stdenv = overrideInStdenv stdenv [gnumake380];
-  };
-
-  smack = callPackage ../development/libraries/java/smack { };
-
-  swt = callPackage ../development/libraries/java/swt {
-    inherit (gnome) libsoup;
-  };
-
-
-  ### DEVELOPMENT / LIBRARIES / JAVASCRIPT
-
-  jquery_ui = callPackage ../development/libraries/javascript/jquery-ui { };
-
-  yuicompressor = callPackage ../development/tools/yuicompressor { };
-
-  ### DEVELOPMENT / LISP MODULES
-
-  asdf = callPackage ../development/lisp-modules/asdf {
-    texLive = null;
-  };
-
-  clwrapperFunction = callPackage ../development/lisp-modules/clwrapper;
-
-  wrapLisp = lisp: clwrapperFunction { inherit lisp; };
-
-  lispPackagesFor = clwrapper: callPackage ../development/lisp-modules/lisp-packages.nix {
-    inherit clwrapper;
-  };
-
-  lispPackagesClisp = lispPackagesFor (wrapLisp clisp);
-  lispPackagesSBCL = lispPackagesFor (wrapLisp sbcl);
-  lispPackages = recurseIntoAttrs lispPackagesSBCL;
-
-
-  ### DEVELOPMENT / PERL MODULES
-
-  buildPerlPackage = import ../development/perl-modules/generic perl;
-
-  perlPackages = recurseIntoAttrs (import ./perl-packages.nix {
-    inherit pkgs;
-    overrides = (config.perlPackageOverrides or (p: {})) pkgs;
-  });
-
-  perl514Packages = import ./perl-packages.nix {
-    pkgs = pkgs // {
-      perl = perl514;
-      buildPerlPackage = import ../development/perl-modules/generic perl514;
-    };
-    overrides = (config.perl514PackageOverrides or (p: {})) pkgs;
-  };
-
-  perlXMLParser = perlPackages.XMLParser;
-
-  ack = perlPackages.ack;
-
-  perlArchiveCpio = perlPackages.ArchiveCpio;
-
-  perlcritic = perlPackages.PerlCritic;
-
-  planetary_annihilation = callPackage ../games/planetaryannihilation { };
-
-
-  ### DEVELOPMENT / PYTHON MODULES
-
-  # python function with default python interpreter
-  buildPythonPackage = pythonPackages.buildPythonPackage;
-
-  # `nix-env -i python-nose` installs for 2.7, the default python.
-  # Therefore we do not recurse into attributes here, in contrast to
-  # python27Packages. `nix-env -iA python26Packages.nose` works
-  # regardless.
-  python26Packages = import ./python-packages.nix {
-    inherit pkgs;
-    python = python26;
-  };
-
-  python27Packages = lib.hiPrioSet (recurseIntoAttrs (import ./python-packages.nix {
-    inherit pkgs;
-    python = python27;
-  }));
-
-  python32Packages = import ./python-packages.nix {
-    inherit pkgs;
-    python = python32;
-  };
-
-  python33Packages = recurseIntoAttrs (import ./python-packages.nix {
-    inherit pkgs;
-    python = python33;
-  });
-
-  python34Packages = recurseIntoAttrs (import ./python-packages.nix {
-    inherit pkgs;
-    python = python34;
-  });
-
-  pypyPackages = recurseIntoAttrs (import ./python-packages.nix {
-    inherit pkgs;
-    python = pypy;
-  });
-
-  foursuite = callPackage ../development/python-modules/4suite { };
-
-  bsddb3 = callPackage ../development/python-modules/bsddb3 { };
-
-  ecdsa = callPackage ../development/python-modules/ecdsa { };
-
-  numeric = callPackage ../development/python-modules/numeric { };
-
-  pil = pythonPackages.pil;
-
-  psyco = callPackage ../development/python-modules/psyco { };
-
-  pycairo = pythonPackages.pycairo;
-
-  pycapnp = pythonPackages.pycapnp;
-
-  pycrypto = pythonPackages.pycrypto;
-
-  pycups = callPackage ../development/python-modules/pycups { };
-
-  pyexiv2 = callPackage ../development/python-modules/pyexiv2 { };
-
-  pygame = callPackage ../development/python-modules/pygame { };
-
-  pygobject = pythonPackages.pygobject;
-
-  pygobject3 = pythonPackages.pygobject3;
-
-  pygtk = pythonPackages.pygtk;
-
-  pyGtkGlade = pythonPackages.pyGtkGlade;
-
-  pylint = callPackage ../development/python-modules/pylint { };
-
-  pyopenssl = builderDefsPackage (import ../development/python-modules/pyopenssl) {
-    inherit python openssl;
-  };
-
-  rhpl = callPackage ../development/python-modules/rhpl { };
-
-  sip = callPackage ../development/python-modules/sip { };
-
-  pyqt4 = callPackage ../development/python-modules/pyqt/4.x.nix {
-    stdenv = if stdenv.isDarwin
-      then clangStdenv
-      else stdenv;
-  };
-
-  pysideApiextractor = callPackage ../development/python-modules/pyside/apiextractor.nix { };
-
-  pysideGeneratorrunner = callPackage ../development/python-modules/pyside/generatorrunner.nix { };
-
-  pyside = callPackage ../development/python-modules/pyside { };
-
-  pysideTools = callPackage ../development/python-modules/pyside/tools.nix { };
-
-  pysideShiboken = callPackage ../development/python-modules/pyside/shiboken.nix { };
-
-  pyx = callPackage ../development/python-modules/pyx { };
-
-  pyxml = callPackage ../development/python-modules/pyxml { };
-
-  rbtools = callPackage ../development/python-modules/rbtools { };
-
-  setuptools = pythonPackages.setuptools;
-
-  slowaes = callPackage ../development/python-modules/slowaes { };
-
-  wxPython = pythonPackages.wxPython;
-  wxPython28 = pythonPackages.wxPython28;
-
-  twisted = pythonPackages.twisted;
-
-  ZopeInterface = pythonPackages.zope_interface;
-
-  ### DEVELOPMENT / R MODULES
-
-  R = callPackage ../applications/science/math/R {
-    inherit (xlibs) libX11 libXt;
-    texLive = texLiveAggregationFun { paths = [ texLive texLiveExtra ]; };
-    withRecommendedPackages = false;
-  };
-
-  rWrapper = callPackage ../development/r-modules/wrapper.nix {
-    # Those packages are usually installed as part of the R build.
-    recommendedPackages = with rPackages; [ MASS lattice Matrix nlme
-      survival boot cluster codetools foreign KernSmooth rpart class
-      nnet spatial mgcv ];
-    # Override this attribute to register additional libraries.
-    packages = [];
-  };
-
-  rPackages = import ../development/r-modules/cran-packages.nix {
-    inherit pkgs;
-    overrides = (config.rPackageOverrides or (p: {})) pkgs;
-  };
-
-  ### SERVERS
-
-  rdf4store = callPackage ../servers/http/4store { };
-
-  apacheHttpd = pkgs.apacheHttpd_2_2;
-
-  apacheHttpd_2_2 = callPackage ../servers/http/apache-httpd/2.2.nix {
-    sslSupport = true;
-  };
-
-  apacheHttpd_2_4 = lowPrio (callPackage ../servers/http/apache-httpd/2.4.nix {
-    sslSupport = true;
-  });
-
-  apcupsd = callPackage ../servers/apcupsd { };
-
-  sabnzbd = callPackage ../servers/sabnzbd { };
-
-  bind = callPackage ../servers/dns/bind { };
-
-  bird = callPackage ../servers/bird { };
-
-  couchdb = callPackage ../servers/http/couchdb {
-    spidermonkey = spidermonkey_185;
-    python = python27;
-    sphinx = python27Packages.sphinx;
-    erlang = erlangR16;
-  };
-
-  dico = callPackage ../servers/dico { };
-
-  dict = callPackage ../servers/dict {
-      libmaa = callPackage ../servers/dict/libmaa.nix {};
-  };
-
-  dictdDBs = recurseIntoAttrs (import ../servers/dict/dictd-db.nix {
-    inherit builderDefs;
-  });
-
-  dictDBCollector = import ../servers/dict/dictd-db-collector.nix {
-    inherit stdenv lib dict;
-  };
-
-  dictdWiktionary = callPackage ../servers/dict/dictd-wiktionary.nix {};
-
-  dictdWordnet = callPackage ../servers/dict/dictd-wordnet.nix {};
-
-  diod = callPackage ../servers/diod { };
-
-  dovecot = dovecot21;
-
-  dovecot21 = callPackage ../servers/mail/dovecot { };
-
-  dovecot22 = callPackage ../servers/mail/dovecot/2.2.x.nix { };
-
-  dovecot_pigeonhole = callPackage ../servers/mail/dovecot-pigeonhole { };
-
-  etcd = callPackage ../servers/etcd { };
-
-  ejabberd = callPackage ../servers/xmpp/ejabberd {
-    erlang = erlangR16;
-  };
-
-  elasticmq = callPackage ../servers/elasticmq { };
-
-  etcdctl = callPackage ../development/tools/etcdctl { };
-
-  fcgiwrap = callPackage ../servers/fcgiwrap { };
-
-  felix = callPackage ../servers/felix { };
-
-  felix_remoteshell = callPackage ../servers/felix/remoteshell.nix { };
-
-  fingerd_bsd = callPackage ../servers/fingerd/bsd-fingerd { };
-
-  firebird = callPackage ../servers/firebird { icu = null; };
-  firebirdSuper = callPackage ../servers/firebird { superServer = true; };
-
-  fleet = callPackage ../servers/fleet { };
-
-  freepops = callPackage ../servers/mail/freepops { };
-
-  freeswitch = callPackage ../servers/sip/freeswitch { };
-
-  ghostOne = callPackage ../servers/games/ghost-one {
-    boost = boost144.override { taggedLayout = true; };
-  };
-
-  ircdHybrid = callPackage ../servers/irc/ircd-hybrid { };
-
-  jboss = callPackage ../servers/http/jboss { };
-
-  jboss_mysql_jdbc = callPackage ../servers/http/jboss/jdbc/mysql { };
-
-  jetty = callPackage ../servers/http/jetty { };
-
-  jetty61 = callPackage ../servers/http/jetty/6.1 { };
-
-  joseki = callPackage ../servers/http/joseki {};
-
-  leafnode = callPackage ../servers/news/leafnode { };
-
-  lighttpd = callPackage ../servers/http/lighttpd { };
-
-  mailman = callPackage ../servers/mail/mailman { };
-
-  mediatomb = callPackage ../servers/mediatomb { };
-
-  memcached = callPackage ../servers/memcached {};
-
-  mod_dnssd = callPackage ../servers/http/apache-modules/mod_dnssd/default.nix { };
-
-  mod_evasive = callPackage ../servers/http/apache-modules/mod_evasive { };
-
-  mod_python = callPackage ../servers/http/apache-modules/mod_python { };
-
-  mod_fastcgi = callPackage ../servers/http/apache-modules/mod_fastcgi { };
-
-  mod_wsgi = callPackage ../servers/http/apache-modules/mod_wsgi { };
-
-  mpd = callPackage ../servers/mpd {
-    aacSupport    = config.mpd.aacSupport or true;
-    ffmpegSupport = config.mpd.ffmpegSupport or true;
-  };
-
-  mpd_clientlib = callPackage ../servers/mpd/clientlib.nix { };
-
-  miniHttpd = callPackage ../servers/http/mini-httpd {};
-
-  mlmmj = callPackage ../servers/mail/mlmmj { };
-
-  myserver = callPackage ../servers/http/myserver { };
-
-  nginx = callPackage ../servers/http/nginx {
-    rtmp        = true;
-    fullWebDAV  = true;
-    syslog      = true;
-    moreheaders = true;
-  };
-
-  ngircd = callPackage ../servers/irc/ngircd { };
-
-  nix-binary-cache = callPackage ../servers/http/nix-binary-cache {};
-
-  nsd = callPackage ../servers/dns/nsd { };
-
-  nsq = callPackage ../servers/nsq { };
-
-  openresty = callPackage ../servers/http/openresty { };
-
-  opensmtpd = callPackage ../servers/mail/opensmtpd { };
-
-  petidomo = callPackage ../servers/mail/petidomo { };
-
-  popa3d = callPackage ../servers/mail/popa3d { };
-
-  postfix = callPackage ../servers/mail/postfix { };
-
-  postfix211 = callPackage ../servers/mail/postfix/2.11.nix { };
-
-  pulseaudio = callPackage ../servers/pulseaudio {
-    gconf = gnome.GConf;
-    # The following are disabled in the default build, because if this
-    # functionality is desired, they are only needed in the PulseAudio
-    # server.
-    bluez = null;
-    avahi = null;
-  };
-  pulseaudioFull = pulseaudio.override {
-    bluez = bluez5;
-    avahi = avahi;
-    jackaudioSupport = true;
-    x11Support = true;
-  };
-
-  tomcat_connectors = callPackage ../servers/http/apache-modules/tomcat-connectors { };
-
-  pies = callPackage ../servers/pies { };
-
-  portmap = callPackage ../servers/portmap { };
-
-  rpcbind = callPackage ../servers/rpcbind { };
-
-  #monetdb = callPackage ../servers/sql/monetdb { };
-
-  mariadb = callPackage ../servers/sql/mariadb {};
-
-  mongodb = callPackage ../servers/nosql/mongodb { };
-
-  riak = callPackage ../servers/nosql/riak/1.3.1.nix { };
-
-  influxdb = callPackage ../servers/nosql/influxdb { };
-
-  mysql51 = import ../servers/sql/mysql/5.1.x.nix {
-    inherit fetchurl ncurses zlib perl openssl stdenv;
-    ps = procps; /* !!! Linux only */
-  };
-
-  mysql55 = callPackage ../servers/sql/mysql/5.5.x.nix { };
-
-  mysql = mysql51;
-
-  mysql_jdbc = callPackage ../servers/sql/mysql/jdbc { };
-
-  nagios = callPackage ../servers/monitoring/nagios { };
-
-  munin = callPackage ../servers/monitoring/munin { };
-
-  nagiosPluginsOfficial = callPackage ../servers/monitoring/nagios/plugins/official-2.x.nix { };
-
-  neo4j = callPackage ../servers/nosql/neo4j { };
-
-  net_snmp = callPackage ../servers/monitoring/net-snmp { };
-
-  riemann = callPackage ../servers/monitoring/riemann { };
-
-  oidentd = callPackage ../servers/identd/oidentd { };
-
-  openfire = callPackage ../servers/xmpp/openfire { };
-
-  oracleXE = callPackage ../servers/sql/oracle-xe { };
-
-  OVMF = callPackage ../applications/virtualization/OVMF { };
-
-  postgresql = postgresql92;
-
-  postgresql84 = callPackage ../servers/sql/postgresql/8.4.x.nix { };
-
-  postgresql90 = callPackage ../servers/sql/postgresql/9.0.x.nix { };
-
-  postgresql91 = callPackage ../servers/sql/postgresql/9.1.x.nix { };
-
-  postgresql92 = callPackage ../servers/sql/postgresql/9.2.x.nix { };
-
-  postgresql93 = callPackage ../servers/sql/postgresql/9.3.x.nix { };
-
-  postgresql_jdbc = callPackage ../servers/sql/postgresql/jdbc { };
-
-  psqlodbc = callPackage ../servers/sql/postgresql/psqlodbc { };
-
-  pyIRCt = builderDefsPackage (import ../servers/xmpp/pyIRCt) {
-    inherit xmpppy pythonIRClib python makeWrapper;
-  };
-
-  pyMAILt = builderDefsPackage (import ../servers/xmpp/pyMAILt) {
-    inherit xmpppy python makeWrapper fetchcvs;
-  };
-
-  qpid-cpp = callPackage ../servers/amqp/qpid-cpp { };
-
-  rabbitmq_server = callPackage ../servers/amqp/rabbitmq-server { };
-
-  radius = callPackage ../servers/radius { };
-
-  redis = callPackage ../servers/nosql/redis { };
-
-  redstore = callPackage ../servers/http/redstore { };
-
-  restund = callPackage ../servers/restund {};
-
-  rethinkdb = callPackage ../servers/nosql/rethinkdb { };
-
-  rippled = callPackage ../servers/rippled { };
-
-  s6 = callPackage ../servers/s6 { };
-
-  spamassassin = callPackage ../servers/mail/spamassassin {
-    inherit (perlPackages) HTMLParser NetDNS NetAddrIP DBFile
-      HTTPDate MailDKIM LWP IOSocketSSL;
-  };
-
-  samba = callPackage ../servers/samba { };
-
-  # A lightweight Samba, useful for non-Linux-based OSes.
-  samba_light = lowPrio (callPackage ../servers/samba {
-    pam = null;
-    fam = null;
-    cups = null;
-    acl = null;
-    openldap = null;
-    # libunwind 1.0.1 is not ported to GNU/Hurd.
-    libunwind = null;
-  });
-
-  serfdom = callPackage ../servers/serfdom { };
-
-  seyren = callPackage ../servers/monitoring/seyren { };
-
-  shishi = callPackage ../servers/shishi { };
-
-  sipwitch = callPackage ../servers/sip/sipwitch { };
-
-  spawn_fcgi = callPackage ../servers/http/spawn-fcgi { };
-
-  squids = recurseIntoAttrs( import ../servers/squid/squids.nix {
-    inherit fetchurl stdenv perl lib composableDerivation
-      openldap pam db cyrus_sasl kerberos libcap expat libxml2 libtool
-      openssl;
-  });
-  squid = squids.squid31; # has ipv6 support
-
-  thttpd = callPackage ../servers/http/thttpd { };
-
-  storm = callPackage ../servers/computing/storm { };
-
-  tomcat5 = callPackage ../servers/http/tomcat/5.0.nix { };
-
-  tomcat6 = callPackage ../servers/http/tomcat/6.0.nix { };
-
-  tomcat_mysql_jdbc = callPackage ../servers/http/tomcat/jdbc/mysql { };
-
-  axis2 = callPackage ../servers/http/tomcat/axis2 { };
-
-  unifi = callPackage ../servers/unifi { };
-
-  virtuoso6 = callPackage ../servers/sql/virtuoso/6.x.nix { };
-
-  virtuoso7 = callPackage ../servers/sql/virtuoso/7.x.nix { };
-
-  virtuoso = virtuoso6;
-
-  vsftpd = callPackage ../servers/ftp/vsftpd { };
-
-  winstone = callPackage ../servers/http/winstone { };
-
-  xinetd = callPackage ../servers/xinetd { };
-
-  xquartz = callPackage ../servers/x11/xquartz { };
-  quartz-wm = callPackage ../servers/x11/quartz-wm { stdenv = clangStdenv; };
-
-  xorg = recurseIntoAttrs (import ../servers/x11/xorg/default.nix {
-    inherit clangStdenv fetchurl fetchgit fetchpatch stdenv pkgconfig intltool freetype fontconfig
-      libxslt expat libpng zlib perl mesa_drivers spice_protocol
-      dbus libuuid openssl gperf m4
-      autoconf automake libtool xmlto asciidoc flex bison python mtdev pixman;
-    mesa = mesa_noglu;
-    udev = if stdenv.isLinux then udev else null;
-    libdrm = if stdenv.isLinux then libdrm else null;
-  } // {
-    xf86videointel-testing = callPackage ../servers/x11/xorg/xf86-video-intel-testing.nix { };
-  });
-
-  xorgReplacements = callPackage ../servers/x11/xorg/replacements.nix { };
-
-  xorgVideoUnichrome = callPackage ../servers/x11/xorg/unichrome/default.nix { };
-
-  yaws = callPackage ../servers/http/yaws { };
-
-  zabbix = recurseIntoAttrs (import ../servers/monitoring/zabbix {
-    inherit fetchurl stdenv pkgconfig postgresql curl openssl zlib;
-  });
-
-  zabbix20 = callPackage ../servers/monitoring/zabbix/2.0.nix { };
-  zabbix22 = callPackage ../servers/monitoring/zabbix/2.2.nix { };
-
-
-  ### OS-SPECIFIC
-
-  afuse = callPackage ../os-specific/linux/afuse { };
-
-  amdUcode = callPackage ../os-specific/linux/microcode/amd.nix { };
-
-  autofs5 = callPackage ../os-specific/linux/autofs/autofs-v5.nix { };
-
-  _915resolution = callPackage ../os-specific/linux/915resolution { };
-
-  nfsUtils = callPackage ../os-specific/linux/nfs-utils { };
-
-  acpi = callPackage ../os-specific/linux/acpi { };
-
-  acpid = callPackage ../os-specific/linux/acpid { };
-
-  acpitool = callPackage ../os-specific/linux/acpitool { };
-
-  alienfx = callPackage ../os-specific/linux/alienfx { };
-
-  alsaLib = callPackage ../os-specific/linux/alsa-lib { };
-
-  alsaPlugins = callPackage ../os-specific/linux/alsa-plugins {
-    jack2 = null;
-  };
-
-  alsaPluginWrapper = callPackage ../os-specific/linux/alsa-plugins/wrapper.nix { };
-
-  alsaUtils = callPackage ../os-specific/linux/alsa-utils { };
-  alsaOss = callPackage ../os-specific/linux/alsa-oss { };
-
-  microcode2ucode = callPackage ../os-specific/linux/microcode/converter.nix { };
-
-  microcodeIntel = callPackage ../os-specific/linux/microcode/intel.nix { };
-
-  apparmor = callPackage ../os-specific/linux/apparmor {
-    inherit (perlPackages) LocaleGettext TermReadKey RpcXML;
-    bison = bison2;
-  };
-
-  atop = callPackage ../os-specific/linux/atop { };
-
-  audit = callPackage ../os-specific/linux/audit { };
-
-  b43Firmware_5_1_138 = callPackage ../os-specific/linux/firmware/b43-firmware/5.1.138.nix { };
-
-  b43FirmwareCutter = callPackage ../os-specific/linux/firmware/b43-firmware-cutter { };
-
-  batctl = callPackage ../os-specific/linux/batman-adv/batctl.nix { };
-
-  bluez4 = callPackage ../os-specific/linux/bluez {
-    pygobject = pygobject3;
-  };
-
-  bluez5 = lowPrio (callPackage ../os-specific/linux/bluez/bluez5.nix { });
-
-  bluez = bluez4;
-
-  inherit (pythonPackages) bedup;
-
-  beret = callPackage ../games/beret { };
-
-  bridge_utils = callPackage ../os-specific/linux/bridge-utils { };
-
-  busybox = callPackage ../os-specific/linux/busybox { };
-
-  checkpolicy = callPackage ../os-specific/linux/checkpolicy { };
-
-  checksec = callPackage ../os-specific/linux/checksec { };
-
-  cifs_utils = callPackage ../os-specific/linux/cifs-utils { };
-
-  conky = callPackage ../os-specific/linux/conky {
-    mpdSupport   = config.conky.mpdSupport   or true;
-    x11Support   = config.conky.x11Support   or false;
-    xdamage      = config.conky.xdamage      or false;
-    wireless     = config.conky.wireless     or false;
-    luaSupport   = config.conky.luaSupport   or false;
-    rss          = config.conky.rss          or false;
-    weatherMetar = config.conky.weatherMetar or false;
-    weatherXoap  = config.conky.weatherXoap  or false;
-  };
-
-  cpufrequtils = callPackage ../os-specific/linux/cpufrequtils { };
-
-  cryopid = callPackage ../os-specific/linux/cryopid { };
-
-  criu = callPackage ../os-specific/linux/criu { };
-
-  cryptsetup = callPackage ../os-specific/linux/cryptsetup { };
-
-  cramfsswap = callPackage ../os-specific/linux/cramfsswap { };
-
-  darwin = rec {
-    cctools = forceNativeDrv (callPackage ../os-specific/darwin/cctools-port {
-      cross = assert crossSystem != null; crossSystem;
-      inherit maloader;
-      xctoolchain = xcode.toolchain;
-    });
-
-    maloader = callPackage ../os-specific/darwin/maloader {
-      inherit opencflite;
-    };
-
-    opencflite = callPackage ../os-specific/darwin/opencflite {};
-
-    xcode = callPackage ../os-specific/darwin/xcode {};
-  };
-
-  devicemapper = lvm2;
-
-  disk_indicator = callPackage ../os-specific/linux/disk-indicator { };
-
-  dmidecode = callPackage ../os-specific/linux/dmidecode { };
-
-  dmtcp = callPackage ../os-specific/linux/dmtcp { };
-
-  dietlibc = callPackage ../os-specific/linux/dietlibc { };
-
-  directvnc = builderDefsPackage ../os-specific/linux/directvnc {
-    inherit libjpeg pkgconfig zlib directfb;
-    inherit (xlibs) xproto;
-  };
-
-  dmraid = callPackage ../os-specific/linux/dmraid { };
-
-  drbd = callPackage ../os-specific/linux/drbd { };
-
-  dstat = callPackage ../os-specific/linux/dstat {
-    # pythonFull includes the "curses" standard library module, for pretty
-    # dstat color output
-    python = pythonFull;
-  };
-
-  libossp_uuid = callPackage ../development/libraries/libossp-uuid { };
-
-  libuuid =
-    if crossSystem != null && crossSystem.config == "i586-pc-gnu"
-    then (utillinux // {
-      crossDrv = lib.overrideDerivation utillinux.crossDrv (args: {
-        # `libblkid' fails to build on GNU/Hurd.
-        configureFlags = args.configureFlags
-          + " --disable-libblkid --disable-mount --disable-libmount"
-          + " --disable-fsck --enable-static --disable-partx";
-        doCheck = false;
-        CPPFLAGS =                    # ugly hack for ugly software!
-          lib.concatStringsSep " "
-            (map (v: "-D${v}=4096")
-                 [ "PATH_MAX" "MAXPATHLEN" "MAXHOSTNAMELEN" ]);
-      });
-    })
-    else if stdenv.isLinux
-    then utillinux
-    else null;
-
-  e3cfsprogs = callPackage ../os-specific/linux/e3cfsprogs { };
-
-  ebtables = callPackage ../os-specific/linux/ebtables { };
-
-  eject = utillinux;
-
-  ffado = callPackage ../os-specific/linux/ffado { };
-
-  fbterm = callPackage ../os-specific/linux/fbterm { };
-
-  firejail = callPackage ../os-specific/linux/firejail {};
-
-  fuse = callPackage ../os-specific/linux/fuse { };
-
-  fxload = callPackage ../os-specific/linux/fxload { };
-
-  gfxtablet = callPackage ../os-specific/linux/gfxtablet {};
-
-  gpm = callPackage ../servers/gpm { };
-
-  gradm = callPackage ../os-specific/linux/gradm {
-    flex = flex_2_5_35;
-  };
-
-  hdparm = callPackage ../os-specific/linux/hdparm { };
-
-  hibernate = callPackage ../os-specific/linux/hibernate { };
-
-  hostapd = callPackage ../os-specific/linux/hostapd { };
-
-  htop =
-    if stdenv.isLinux then
-      callPackage ../os-specific/linux/htop { }
-    else if stdenv.isDarwin then
-      callPackage ../os-specific/darwin/htop { }
-    else null;
-
-  # GNU/Hurd core packages.
-  gnu = recurseIntoAttrs (callPackage ../os-specific/gnu {
-    inherit platform crossSystem;
-  });
-
-  hwdata = callPackage ../os-specific/linux/hwdata { };
-
-  i7z = callPackage ../os-specific/linux/i7z { };
-
-  ifplugd = callPackage ../os-specific/linux/ifplugd { };
-
-  iomelt = callPackage ../os-specific/linux/iomelt { };
-
-  iotop = callPackage ../os-specific/linux/iotop { };
-
-  iproute = callPackage ../os-specific/linux/iproute { };
-
-  iputils = callPackage ../os-specific/linux/iputils {
-    sp = spCompat;
-    inherit (perlPackages) SGMLSpm;
-  };
-
-  iptables = callPackage ../os-specific/linux/iptables { };
-
-  iw = callPackage ../os-specific/linux/iw { };
-
-  jujuutils = callPackage ../os-specific/linux/jujuutils { };
-
-  kbd = callPackage ../os-specific/linux/kbd { };
-
-  kmscon = callPackage ../os-specific/linux/kmscon { };
-
-  latencytop = callPackage ../os-specific/linux/latencytop { };
-
-  ldm = callPackage ../os-specific/linux/ldm { };
-
-  libaio = callPackage ../os-specific/linux/libaio { };
-
-  libatasmart = callPackage ../os-specific/linux/libatasmart { };
-
-  libcgroup = callPackage ../os-specific/linux/libcgroup { };
-
-  libnl = callPackage ../os-specific/linux/libnl { };
-  libnl_3_2_19 = callPackage ../os-specific/linux/libnl/3.2.19.nix { };
-
-  linuxConsoleTools = callPackage ../os-specific/linux/consoletools { };
-
-  # -- Linux kernel expressions ------------------------------------------------
-
-  linuxHeaders = linuxHeaders_3_7;
-
-  linuxHeaders24Cross = forceNativeDrv (import ../os-specific/linux/kernel-headers/2.4.nix {
-    inherit stdenv fetchurl perl;
-    cross = assert crossSystem != null; crossSystem;
-  });
-
-  linuxHeaders26Cross = forceNativeDrv (import ../os-specific/linux/kernel-headers/2.6.32.nix {
-    inherit stdenv fetchurl perl;
-    cross = assert crossSystem != null; crossSystem;
-  });
-
-  linuxHeaders_3_7 = callPackage ../os-specific/linux/kernel-headers/3.7.nix { };
-
-  linuxHeaders_3_14 = callPackage ../os-specific/linux/kernel-headers/3.14.nix { };
-
-  # We can choose:
-  linuxHeadersCrossChooser = ver : if ver == "2.4" then linuxHeaders24Cross
-    else if ver == "2.6" then linuxHeaders26Cross
-    else throw "Unknown linux kernel version";
-
-  linuxHeadersCross = assert crossSystem != null;
-    linuxHeadersCrossChooser crossSystem.platform.kernelMajor;
-
-  kernelPatches = callPackage ../os-specific/linux/kernel/patches.nix { };
-
-  linux_3_2 = makeOverridable (import ../os-specific/linux/kernel/linux-3.2.nix) {
-    inherit fetchurl stdenv perl buildLinux;
-    kernelPatches = [];
-  };
-
-  linux_3_2_xen = lowPrio (linux_3_2.override {
-    extraConfig = ''
-      XEN_DOM0 y
-    '';
-  });
-
-  linux_3_4 = makeOverridable (import ../os-specific/linux/kernel/linux-3.4.nix) {
-    inherit fetchurl stdenv perl buildLinux;
-    kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips")
-      [ kernelPatches.mips_fpureg_emu
-        kernelPatches.mips_fpu_sigill
-      ];
-  };
-
-  linux_3_6_rpi = makeOverridable (import ../os-specific/linux/kernel/linux-rpi-3.6.nix) {
-    inherit fetchurl stdenv perl buildLinux;
-  };
-
-  linux_3_10 = makeOverridable (import ../os-specific/linux/kernel/linux-3.10.nix) {
-    inherit fetchurl stdenv perl buildLinux;
-    kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips")
-      [ kernelPatches.mips_fpureg_emu
-        kernelPatches.mips_fpu_sigill
-        kernelPatches.mips_ext3_n32
-      ];
-  };
-
-  linux_3_12 = makeOverridable (import ../os-specific/linux/kernel/linux-3.12.nix) {
-    inherit fetchurl stdenv perl buildLinux;
-    kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips")
-      [ kernelPatches.mips_fpureg_emu
-        kernelPatches.mips_fpu_sigill
-        kernelPatches.mips_ext3_n32
-      ];
-  };
-
-  linux_3_14 = makeOverridable (import ../os-specific/linux/kernel/linux-3.14.nix) {
-    inherit fetchurl stdenv perl buildLinux;
-    kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips")
-      [ kernelPatches.mips_fpureg_emu
-        kernelPatches.mips_fpu_sigill
-        kernelPatches.mips_ext3_n32
-      ];
-  };
-
-  linux_3_15 = makeOverridable (import ../os-specific/linux/kernel/linux-3.15.nix) {
-    inherit fetchurl stdenv perl buildLinux;
-    kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips")
-      [ kernelPatches.mips_fpureg_emu
-        kernelPatches.mips_fpu_sigill
-        kernelPatches.mips_ext3_n32
-      ];
-  };
-
-  linux_3_16 = makeOverridable (import ../os-specific/linux/kernel/linux-3.16.nix) {
-    inherit fetchurl stdenv perl buildLinux;
-    kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips")
-      [ kernelPatches.mips_fpureg_emu
-        kernelPatches.mips_fpu_sigill
-        kernelPatches.mips_ext3_n32
-      ];
-  };
-
-  linux_testing = makeOverridable (import ../os-specific/linux/kernel/linux-testing.nix) {
-    inherit fetchurl stdenv perl buildLinux;
-    kernelPatches = lib.optionals ((platform.kernelArch or null) == "mips")
-      [ kernelPatches.mips_fpureg_emu
-        kernelPatches.mips_fpu_sigill
-        kernelPatches.mips_ext3_n32
-      ];
-  };
-
-  /* grsec configuration
-
-     We build several flavors of 'default' grsec kernels. These are
-     built by default with Hydra. If the user selects a matching
-     'default' flavor, then the pre-canned package set can be
-     chosen. Typically, users will make very basic choices like
-     'security' + 'server' or 'performance' + 'desktop' with
-     virtualisation support. These will then be picked.
-
-     Note: Xen guest kernels are included for e.g. NixOps deployments
-     to EC2, where Xen is the Hypervisor.
-  */
-
-  grFlavors = import ../build-support/grsecurity/flavors.nix;
-
-  mkGrsecurity = opts:
-    (import ../build-support/grsecurity {
-      grsecOptions = opts;
-      inherit pkgs lib;
-    });
-
-  grKernel  = opts: (mkGrsecurity opts).grsecKernel;
-  grPackage = opts: recurseIntoAttrs (mkGrsecurity opts).grsecPackage;
-
-  # Stable kernels
-  linux_grsec_stable_desktop    = grKernel grFlavors.linux_grsec_stable_desktop;
-  linux_grsec_stable_server     = grKernel grFlavors.linux_grsec_stable_server;
-  linux_grsec_stable_server_xen = grKernel grFlavors.linux_grsec_stable_server_xen;
-
-  # Testing kernels
-  linux_grsec_testing_desktop = grKernel grFlavors.linux_grsec_testing_desktop;
-  linux_grsec_testing_server  = grKernel grFlavors.linux_grsec_testing_server;
-  linux_grsec_testing_server_xen = grKernel grFlavors.linux_grsec_testing_server_xen;
-
-  /* Linux kernel modules are inherently tied to a specific kernel.  So
-     rather than provide specific instances of those packages for a
-     specific kernel, we have a function that builds those packages
-     for a specific kernel.  This function can then be called for
-     whatever kernel you're using. */
-
-  linuxPackagesFor = kernel: self: let callPackage = newScope self; in {
-    inherit kernel;
-
-    acpi_call = callPackage ../os-specific/linux/acpi-call {};
-
-    batman_adv = callPackage ../os-specific/linux/batman-adv {};
-
-    bbswitch = callPackage ../os-specific/linux/bbswitch {};
-
-    ati_drivers_x11 = callPackage ../os-specific/linux/ati-drivers { };
-
-    blcr = callPackage ../os-specific/linux/blcr { };
-
-    cryptodev = callPackage ../os-specific/linux/cryptodev { };
-
-    cpupower = callPackage ../os-specific/linux/cpupower { };
-
-    e1000e = callPackage ../os-specific/linux/e1000e {};
-
-    v4l2loopback = callPackage ../os-specific/linux/v4l2loopback { };
-
-    frandom = callPackage ../os-specific/linux/frandom { };
-
-    ktap = callPackage ../os-specific/linux/ktap { };
-
-    lttng-modules = callPackage ../os-specific/linux/lttng-modules { };
-
-    broadcom_sta = callPackage ../os-specific/linux/broadcom-sta/default.nix { };
-
-    nvidiabl = callPackage ../os-specific/linux/nvidiabl { };
-
-    nvidia_x11 = callPackage ../os-specific/linux/nvidia-x11 { };
-
-    nvidia_x11_legacy173 = callPackage ../os-specific/linux/nvidia-x11/legacy173.nix { };
-    nvidia_x11_legacy304 = callPackage ../os-specific/linux/nvidia-x11/legacy304.nix { };
-
-    openafsClient = callPackage ../servers/openafs-client { };
-
-    openiscsi = callPackage ../os-specific/linux/open-iscsi { };
-
-    wis_go7007 = callPackage ../os-specific/linux/wis-go7007 { };
-
-    kernelHeaders = callPackage ../os-specific/linux/kernel-headers { };
-
-    klibc = callPackage ../os-specific/linux/klibc { };
-
-    klibcShrunk = lowPrio (callPackage ../os-specific/linux/klibc/shrunk.nix { });
-
-
-    /* compiles but has to be integrated into the kernel somehow
-       Let's have it uncommented and finish it..
-    */
-    ndiswrapper = callPackage ../os-specific/linux/ndiswrapper { };
-
-    netatop = callPackage ../os-specific/linux/netatop { };
-
-    perf = callPackage ../os-specific/linux/kernel/perf.nix { };
-
-    psmouse_alps = callPackage ../os-specific/linux/psmouse-alps { };
-
-    spl = callPackage ../os-specific/linux/spl { };
-    spl_git = callPackage ../os-specific/linux/spl/git.nix { };
-
-    sysdig = callPackage ../os-specific/linux/sysdig {};
-
-    tp_smapi = callPackage ../os-specific/linux/tp_smapi { };
-
-    v86d = callPackage ../os-specific/linux/v86d { };
-
-    virtualbox = callPackage ../applications/virtualization/virtualbox {
-      stdenv = stdenv_32bit;
-      inherit (gnome) libIDL;
-      enableExtensionPack = config.virtualbox.enableExtensionPack or false;
-    };
-
-    virtualboxGuestAdditions = callPackage ../applications/virtualization/virtualbox/guest-additions { };
-
-    zfs = callPackage ../os-specific/linux/zfs { };
-    zfs_git = callPackage ../os-specific/linux/zfs/git.nix { };
-  };
-
-  # The current default kernel / kernel modules.
-  linux = linuxPackages.kernel;
-  linuxPackages = linuxPackages_3_12;
-
-  # Update this when adding the newest kernel major version!
-  linux_latest = pkgs.linux_3_16;
-  linuxPackages_latest = pkgs.linuxPackages_3_16;
-
-  # Build the kernel modules for the some of the kernels.
-  linuxPackages_3_2 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_2 linuxPackages_3_2);
-  linuxPackages_3_2_xen = linuxPackagesFor pkgs.linux_3_2_xen linuxPackages_3_2_xen;
-  linuxPackages_3_4 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_4 linuxPackages_3_4);
-  linuxPackages_3_6_rpi = linuxPackagesFor pkgs.linux_3_6_rpi linuxPackages_3_6_rpi;
-  linuxPackages_3_10 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_10 linuxPackages_3_10);
-  linuxPackages_3_10_tuxonice = linuxPackagesFor pkgs.linux_3_10_tuxonice linuxPackages_3_10_tuxonice;
-  linuxPackages_3_12 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_12 linuxPackages_3_12);
-  linuxPackages_3_14 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_14 linuxPackages_3_14);
-  linuxPackages_3_15 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_15 linuxPackages_3_15);
-  linuxPackages_3_16 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_16 linuxPackages_3_16);
-  linuxPackages_testing = recurseIntoAttrs (linuxPackagesFor pkgs.linux_testing linuxPackages_testing);
-
-  # grsecurity flavors
-  # Stable kernels
-  linuxPackages_grsec_stable_desktop    = grPackage grFlavors.linux_grsec_stable_desktop;
-  linuxPackages_grsec_stable_server     = grPackage grFlavors.linux_grsec_stable_server;
-  linuxPackages_grsec_stable_server_xen = grPackage grFlavors.linux_grsec_stable_server_xen;
-
-  # Testing kernels
-  linuxPackages_grsec_testing_desktop = grPackage grFlavors.linux_grsec_testing_desktop;
-  linuxPackages_grsec_testing_server  = grPackage grFlavors.linux_grsec_testing_server;
-  linuxPackages_grsec_testing_server_xen = grPackage grFlavors.linux_grsec_testing_server_xen;
-
-  # A function to build a manually-configured kernel
-  linuxManualConfig = pkgs.buildLinux;
-  buildLinux = import ../os-specific/linux/kernel/manual-config.nix {
-    inherit (pkgs) stdenv runCommand nettools bc perl kmod writeTextFile ubootChooser;
-  };
-
-  keyutils = callPackage ../os-specific/linux/keyutils { };
-
-  libselinux = callPackage ../os-specific/linux/libselinux { };
-
-  libsemanage = callPackage ../os-specific/linux/libsemanage { };
-
-  libraw = callPackage ../development/libraries/libraw { };
-
-  libraw1394 = callPackage ../development/libraries/libraw1394 { };
-
-  libsexy = callPackage ../development/libraries/libsexy { };
-
-  libsepol = callPackage ../os-specific/linux/libsepol { };
-
-  libsmbios = callPackage ../os-specific/linux/libsmbios { };
-
-  lm_sensors = callPackage ../os-specific/linux/lm-sensors { };
-
-  lockdep = callPackage ../os-specific/linux/lockdep { };
-
-  lsiutil = callPackage ../os-specific/linux/lsiutil { };
-
-  kmod = callPackage ../os-specific/linux/kmod { };
-
-  kmod-blacklist-ubuntu = callPackage ../os-specific/linux/kmod-blacklist-ubuntu { };
-
-  kvm = qemu_kvm;
-
-  libcap = callPackage ../os-specific/linux/libcap { };
-
-  libcap_progs = callPackage ../os-specific/linux/libcap/progs.nix { };
-
-  libcap_pam = callPackage ../os-specific/linux/libcap/pam.nix { };
-
-  libcap_manpages = callPackage ../os-specific/linux/libcap/man.nix { };
-
-  libcap_ng = callPackage ../os-specific/linux/libcap-ng { };
-
-  libnscd = callPackage ../os-specific/linux/libnscd { };
-
-  libnotify = callPackage ../development/libraries/libnotify { };
-
-  libvolume_id = callPackage ../os-specific/linux/libvolume_id { };
-
-  lsscsi = callPackage ../os-specific/linux/lsscsi { };
-
-  lvm2 = callPackage ../os-specific/linux/lvm2 { };
-
-  mdadm = callPackage ../os-specific/linux/mdadm { };
-
-  mingetty = callPackage ../os-specific/linux/mingetty { };
-
-  module_init_tools = callPackage ../os-specific/linux/module-init-tools { };
-
-  aggregateModules = modules:
-    callPackage ../os-specific/linux/kmod/aggregator.nix {
-      inherit modules;
-    };
-
-  multipath_tools = callPackage ../os-specific/linux/multipath-tools { };
-
-  musl = callPackage ../os-specific/linux/musl { };
-
-  nettools = callPackage ../os-specific/linux/net-tools { };
-
-  neverball = callPackage ../games/neverball {
-    libpng = libpng15;
-  };
-
-  nftables = callPackage ../os-specific/linux/nftables { };
-
-  numactl = callPackage ../os-specific/linux/numactl { };
-
-  gocode = callPackage ../development/tools/gocode { };
-
-  gogoclient = callPackage ../os-specific/linux/gogoclient { };
-
-  nss_ldap = callPackage ../os-specific/linux/nss_ldap { };
-
-  pam = callPackage ../os-specific/linux/pam { };
-
-  # pam_bioapi ( see http://www.thinkwiki.org/wiki/How_to_enable_the_fingerprint_reader )
-
-  pam_ccreds = callPackage ../os-specific/linux/pam_ccreds { };
-
-  pam_console = callPackage ../os-specific/linux/pam_console {
-    libtool = libtool_1_5;
-  };
-
-  pam_devperm = callPackage ../os-specific/linux/pam_devperm { };
-
-  pam_krb5 = callPackage ../os-specific/linux/pam_krb5 { };
-
-  pam_ldap = callPackage ../os-specific/linux/pam_ldap { };
-
-  pam_login = callPackage ../os-specific/linux/pam_login { };
-
-  pam_ssh_agent_auth = callPackage ../os-specific/linux/pam_ssh_agent_auth { };
-
-  pam_usb = callPackage ../os-specific/linux/pam_usb { };
-
-  paxctl = callPackage ../os-specific/linux/paxctl { };
-
-  pax-utils = callPackage ../os-specific/linux/pax-utils { };
-
-  pcmciaUtils = callPackage ../os-specific/linux/pcmciautils {
-    firmware = config.pcmciaUtils.firmware or [];
-    config = config.pcmciaUtils.config or null;
-  };
-
-  plymouth = callPackage ../os-specific/linux/plymouth {
-    automake = automake113x;
-  };
-
-  pmount = callPackage ../os-specific/linux/pmount { };
-
-  pmutils = callPackage ../os-specific/linux/pm-utils { };
-
-  pmtools = callPackage ../os-specific/linux/pmtools { };
-
-  policycoreutils = callPackage ../os-specific/linux/policycoreutils { };
-
-  powertop = callPackage ../os-specific/linux/powertop { };
-
-  prayer = callPackage ../servers/prayer { };
-
-  procps = procps-ng;
-
-  procps-old = lowPrio (callPackage ../os-specific/linux/procps { });
-
-  procps-ng = callPackage ../os-specific/linux/procps-ng { };
-
-  watch = callPackage ../os-specific/linux/procps/watch.nix { };
-
-  qemu_kvm = lowPrio (qemu.override { x86Only = true; });
-
-  firmwareLinuxNonfree = callPackage ../os-specific/linux/firmware/firmware-linux-nonfree { };
-
-  radeontools = callPackage ../os-specific/linux/radeontools { };
-
-  raspberrypifw = callPackage ../os-specific/linux/firmware/raspberrypi {};
-
-  regionset = callPackage ../os-specific/linux/regionset { };
-
-  rfkill = callPackage ../os-specific/linux/rfkill { };
-
-  rfkill_udev = callPackage ../os-specific/linux/rfkill/udev.nix { };
-
-  rtkit = callPackage ../os-specific/linux/rtkit { };
-
-  sdparm = callPackage ../os-specific/linux/sdparm { };
-
-  sepolgen = callPackage ../os-specific/linux/sepolgen { };
-
-  setools = callPackage ../os-specific/linux/setools { };
-
-  shadow = callPackage ../os-specific/linux/shadow { };
-
-  statifier = builderDefsPackage (import ../os-specific/linux/statifier) { };
-
-  sysdig = callPackage ../os-specific/linux/sysdig {
-    kernel = null;
-  }; # pkgs.sysdig is a client, for a driver look at linuxPackagesFor
-
-  sysfsutils = callPackage ../os-specific/linux/sysfsutils { };
-
-  sysprof = callPackage ../development/tools/profiling/sysprof {
-    inherit (gnome) libglade;
-  };
-
-  # Provided with sysfsutils.
-  libsysfs = sysfsutils;
-  systool = sysfsutils;
-
-  sysklogd = callPackage ../os-specific/linux/sysklogd { };
-
-  syslinux = callPackage ../os-specific/linux/syslinux { };
-
-  sysstat = callPackage ../os-specific/linux/sysstat { };
-
-  systemd = callPackage ../os-specific/linux/systemd {
-    linuxHeaders = linuxHeaders_3_14;
-  };
-
-  systemtap = callPackage ../development/tools/profiling/systemtap {
-    inherit (gnome) libglademm;
-  };
-
-  # In nixos, you can set systemd.package = pkgs.systemd_with_lvm2 to get
-  # LVM2 working in systemd.
-  systemd_with_lvm2 = pkgs.lib.overrideDerivation pkgs.systemd (p: {
-      name = p.name + "-with-lvm2";
-      postInstall = p.postInstall + ''
-        cp "${pkgs.lvm2}/lib/systemd/system-generators/"* $out/lib/systemd/system-generators
-      '';
-  });
-
-  sysvinit = callPackage ../os-specific/linux/sysvinit { };
-
-  sysvtools = callPackage ../os-specific/linux/sysvinit {
-    withoutInitTools = true;
-  };
-
-  # FIXME: `tcp-wrapper' is actually not OS-specific.
-  tcp_wrappers = callPackage ../os-specific/linux/tcp-wrappers { };
-
-  trackballs = callPackage ../games/trackballs {
-    debug = false;
-    guile = guile_1_8;
-  };
-
-  tunctl = callPackage ../os-specific/linux/tunctl { };
-
-  ubootChooser = name : if name == "upstream" then ubootUpstream
-    else if name == "sheevaplug" then ubootSheevaplug
-    else if name == "guruplug" then ubootGuruplug
-    else if name == "nanonote" then ubootNanonote
-    else throw "Unknown uboot";
-
-  ubootUpstream = callPackage ../misc/uboot { };
-
-  ubootSheevaplug = callPackage ../misc/uboot/sheevaplug.nix { };
-
-  ubootNanonote = callPackage ../misc/uboot/nanonote.nix { };
-
-  ubootGuruplug = callPackage ../misc/uboot/guruplug.nix { };
-
-  uclibc = callPackage ../os-specific/linux/uclibc { };
-
-  uclibcCross = lowPrio (callPackage ../os-specific/linux/uclibc {
-    inherit fetchurl stdenv libiconv;
-    linuxHeaders = linuxHeadersCross;
-    gccCross = gccCrossStageStatic;
-    cross = assert crossSystem != null; crossSystem;
-  });
-
-  udev145 = callPackage ../os-specific/linux/udev/145.nix { };
-  udev = pkgs.systemd;
-
-  udisks1 = callPackage ../os-specific/linux/udisks/1-default.nix { };
-  udisks2 = callPackage ../os-specific/linux/udisks/2-default.nix { };
-  udisks = udisks1;
-
-  udisks_glue = callPackage ../os-specific/linux/udisks-glue { };
-
-  untie = callPackage ../os-specific/linux/untie { };
-
-  upower = callPackage ../os-specific/linux/upower { };
-
-  upower_99 = callPackage ../os-specific/linux/upower/0.99.nix { };
-
-  upstart = callPackage ../os-specific/linux/upstart { };
-
-  usbutils = callPackage ../os-specific/linux/usbutils { };
-
-  usermount = callPackage ../os-specific/linux/usermount { };
-
-  utillinux = lowPrio (callPackage ../os-specific/linux/util-linux {
-    ncurses = null;
-    perl = null;
-  });
-
-  utillinuxCurses = utillinux.override {
-    inherit ncurses perl;
-  };
-
-  v4l_utils = callPackage ../os-specific/linux/v4l-utils {
-    withQt4 = true;
-  };
-
-  windows = rec {
-    cygwinSetup = callPackage ../os-specific/windows/cygwin-setup { };
-
-    jom = callPackage ../os-specific/windows/jom { };
-
-    w32api = callPackage ../os-specific/windows/w32api {
-      gccCross = gccCrossStageStatic;
-      binutilsCross = binutilsCross;
-    };
-
-    w32api_headers = w32api.override {
-      onlyHeaders = true;
-    };
-
-    mingw_runtime = callPackage ../os-specific/windows/mingwrt {
-      gccCross = gccCrossMingw2;
-      binutilsCross = binutilsCross;
-    };
-
-    mingw_runtime_headers = mingw_runtime.override {
-      onlyHeaders = true;
-    };
-
-    mingw_headers1 = buildEnv {
-      name = "mingw-headers-1";
-      paths = [ w32api_headers mingw_runtime_headers ];
-    };
-
-    mingw_headers2 = buildEnv {
-      name = "mingw-headers-2";
-      paths = [ w32api mingw_runtime_headers ];
-    };
-
-    mingw_headers3 = buildEnv {
-      name = "mingw-headers-3";
-      paths = [ w32api mingw_runtime ];
-    };
-
-    mingw_w64 = callPackage ../os-specific/windows/mingw-w64 {
-      gccCross = gccCrossStageStatic;
-      binutilsCross = binutilsCross;
-    };
-
-    mingw_w64_headers = callPackage ../os-specific/windows/mingw-w64 {
-      onlyHeaders = true;
-    };
-
-    mingw_w64_pthreads = callPackage ../os-specific/windows/mingw-w64 {
-      onlyPthreads = true;
-    };
-
-    pthreads = callPackage ../os-specific/windows/pthread-w32 {
-      mingw_headers = mingw_headers3;
-    };
-
-    wxMSW = callPackage ../os-specific/windows/wxMSW-2.8 { };
-  };
-
-  wesnoth = callPackage ../games/wesnoth {
-    lua = lua5;
-  };
-
-  wirelesstools = callPackage ../os-specific/linux/wireless-tools { };
-
-  wpa_supplicant = callPackage ../os-specific/linux/wpa_supplicant { };
-
-  wpa_supplicant_gui = callPackage ../os-specific/linux/wpa_supplicant/gui.nix { };
-
-  xf86_input_mtrack = callPackage ../os-specific/linux/xf86-input-mtrack {
-    inherit (xorg) utilmacros xproto inputproto xorgserver;
-  };
-
-  xf86_input_multitouch =
-    callPackage ../os-specific/linux/xf86-input-multitouch { };
-
-  xf86_input_wacom = callPackage ../os-specific/linux/xf86-input-wacom { };
-
-  xf86_video_nested = callPackage ../os-specific/linux/xf86-video-nested {
-    inherit (xorg) fontsproto renderproto utilmacros xorgserver;
-  };
-
-  xf86_video_nouveau = xorg.xf86videonouveau;
-
-  xmoto = builderDefsPackage (import ../games/xmoto) {
-    inherit chipmunk sqlite curl zlib bzip2 libjpeg libpng
-      freeglut mesa SDL SDL_mixer SDL_image SDL_net SDL_ttf
-      lua5 ode libxdg_basedir libxml2;
-  };
-
-  xorg_sys_opengl = callPackage ../os-specific/linux/opengl/xorg-sys { };
-
-  zd1211fw = callPackage ../os-specific/linux/firmware/zd1211 { };
-
-
-  ### DATA
-
-  andagii = callPackage ../data/fonts/andagii {};
-
-  anonymousPro = callPackage ../data/fonts/anonymous-pro {};
-
-  arkpandora_ttf = builderDefsPackage (import ../data/fonts/arkpandora) { };
-
-  aurulent-sans = callPackage ../data/fonts/aurulent-sans { };
-
-  bakoma_ttf = callPackage ../data/fonts/bakoma-ttf { };
-
-  cacert = callPackage ../data/misc/cacert { };
-
-  cantarell_fonts = callPackage ../data/fonts/cantarell-fonts { };
-
-  corefonts = callPackage ../data/fonts/corefonts { };
-
-  wrapFonts = paths : ((import ../data/fonts/fontWrap) {
-    inherit fetchurl stdenv builderDefs paths;
-    inherit (xorg) mkfontdir mkfontscale;
-  });
-
-  clearlyU = callPackage ../data/fonts/clearlyU { };
-
-  cm_unicode = callPackage ../data/fonts/cm-unicode {};
-
-  dejavu_fonts = callPackage ../data/fonts/dejavu-fonts {
-    inherit (perlPackages) FontTTF;
-  };
-
-  docbook5 = callPackage ../data/sgml+xml/schemas/docbook-5.0 { };
-
-  docbook_sgml_dtd_31 = callPackage ../data/sgml+xml/schemas/sgml-dtd/docbook/3.1.nix { };
-
-  docbook_sgml_dtd_41 = callPackage ../data/sgml+xml/schemas/sgml-dtd/docbook/4.1.nix { };
-
-  docbook_xml_dtd_412 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.1.2.nix { };
-
-  docbook_xml_dtd_42 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.2.nix { };
-
-  docbook_xml_dtd_43 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.3.nix { };
-
-  docbook_xml_dtd_45 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.5.nix { };
-
-  docbook_xml_ebnf_dtd = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook-ebnf { };
-
-  docbook_xml_xslt = docbook_xsl;
-
-  docbook_xsl = callPackage ../data/sgml+xml/stylesheets/xslt/docbook-xsl { };
-
-  docbook5_xsl = docbook_xsl_ns;
-
-  docbook_xsl_ns = callPackage ../data/sgml+xml/stylesheets/xslt/docbook-xsl-ns { };
-
-  dosemu_fonts = callPackage ../data/fonts/dosemu-fonts { };
-
-  eb-garamond = callPackage ../data/fonts/eb-garamond { };
-
-  fira = callPackage ../data/fonts/fira { };
-
-  freefont_ttf = callPackage ../data/fonts/freefont-ttf { };
-
-  freepats = callPackage ../data/misc/freepats { };
-
-  gentium = callPackage ../data/fonts/gentium {};
-
-  gnome_user_docs = callPackage ../data/documentation/gnome-user-docs { };
-
-  inherit (gnome3) gsettings_desktop_schemas;
-
-  hicolor_icon_theme = callPackage ../data/icons/hicolor-icon-theme { };
-
-  inconsolata = callPackage ../data/fonts/inconsolata {};
-
-  ipafont = callPackage ../data/fonts/ipafont {};
-
-  junicode = callPackage ../data/fonts/junicode { };
-
-  kochi-substitute = callPackage ../data/fonts/kochi-substitute {};
-
-  kochi-substitute-naga10 = callPackage ../data/fonts/kochi-substitute-naga10 {};
-
-  liberation_ttf = callPackage ../data/fonts/redhat-liberation-fonts { };
-
-  libertine = builderDefsPackage (import ../data/fonts/libertine) {
-    inherit fetchurl fontforge lib;
-  };
-
-  lmmath = callPackage ../data/fonts/lmodern/lmmath.nix {};
-
-  lmodern = callPackage ../data/fonts/lmodern { };
-
-  lohit-fonts = callPackage ../data/fonts/lohit-fonts { };
-
-  manpages = callPackage ../data/documentation/man-pages { };
-
-  miscfiles = callPackage ../data/misc/miscfiles { };
-
-  mobile_broadband_provider_info = callPackage ../data/misc/mobile-broadband-provider-info { };
-
-  mph_2b_damase = callPackage ../data/fonts/mph-2b-damase { };
-
-  nafees = callPackage ../data/fonts/nafees { };
-
-  oldstandard = callPackage ../data/fonts/oldstandard { };
-
-  opensans-ttf = callPackage ../data/fonts/opensans-ttf { };
-
-  poly = callPackage ../data/fonts/poly { };
-
-  posix_man_pages = callPackage ../data/documentation/man-pages-posix { };
-
-  pthreadmanpages = callPackage ../data/documentation/pthread-man-pages { };
-
-  shared_mime_info = callPackage ../data/misc/shared-mime-info { };
-
-  shared_desktop_ontologies = callPackage ../data/misc/shared-desktop-ontologies { };
-
-  stdmanpages = callPackage ../data/documentation/std-man-pages { };
-
-  symbola = callPackage ../data/fonts/symbola { };
-
-  iana_etc = callPackage ../data/misc/iana-etc { };
-
-  poppler_data = callPackage ../data/misc/poppler-data { };
-
-  r3rs = callPackage ../data/documentation/rnrs/r3rs.nix { };
-
-  r4rs = callPackage ../data/documentation/rnrs/r4rs.nix { };
-
-  r5rs = callPackage ../data/documentation/rnrs/r5rs.nix { };
-
-  source-code-pro = callPackage ../data/fonts/source-code-pro {};
-
-  source-sans-pro = callPackage ../data/fonts/source-sans-pro { };
-
-  source-serif-pro = callPackage ../data/fonts/source-serif-pro { };
-
-  source-han-sans-japanese = callPackage ../data/fonts/source-han-sans/japanese.nix {};
-  source-han-sans-korean = callPackage ../data/fonts/source-han-sans/korean.nix {};
-  source-han-sans-simplified-chinese = callPackage ../data/fonts/source-han-sans/simplified-chinese.nix {};
-  source-han-sans-traditional-chinese = callPackage ../data/fonts/source-han-sans/traditional-chinese.nix {};
-
-  tango-icon-theme = callPackage ../data/icons/tango-icon-theme { };
-
-  themes = name: import (../data/misc/themes + ("/" + name + ".nix")) {
-    inherit fetchurl;
-  };
-
-  theano = callPackage ../data/fonts/theano { };
-
-  tempora_lgc = callPackage ../data/fonts/tempora-lgc { };
-
-  terminus_font = callPackage ../data/fonts/terminus-font { };
-
-  tipa = callPackage ../data/fonts/tipa { };
-
-  ttf_bitstream_vera = callPackage ../data/fonts/ttf-bitstream-vera { };
-
-  tzdata = callPackage ../data/misc/tzdata { };
-
-  ubuntu_font_family = callPackage ../data/fonts/ubuntu-font-family { };
-
-  ucsFonts = callPackage ../data/fonts/ucs-fonts { };
-
-  unifont = callPackage ../data/fonts/unifont { };
-
-  vistafonts = callPackage ../data/fonts/vista-fonts { };
-
-  wqy_microhei = callPackage ../data/fonts/wqy-microhei { };
-
-  wqy_zenhei = callPackage ../data/fonts/wqy-zenhei { };
-
-  xhtml1 = callPackage ../data/sgml+xml/schemas/xml-dtd/xhtml1 { };
-
-  xkeyboard_config = xorg.xkeyboardconfig;
-
-
-  ### APPLICATIONS
-
-  a2jmidid = callPackage ../applications/audio/a2jmidid { };
-
-  aangifte2006 = callPackage_i686 ../applications/taxes/aangifte-2006 { };
-
-  aangifte2007 = callPackage_i686 ../applications/taxes/aangifte-2007 { };
-
-  aangifte2008 = callPackage_i686 ../applications/taxes/aangifte-2008 { };
-
-  aangifte2009 = callPackage_i686 ../applications/taxes/aangifte-2009 { };
-
-  aangifte2010 = callPackage_i686 ../applications/taxes/aangifte-2010 { };
-
-  aangifte2011 = callPackage_i686 ../applications/taxes/aangifte-2011 { };
-
-  aangifte2012 = callPackage_i686 ../applications/taxes/aangifte-2012 { };
-
-  aangifte2013 = callPackage_i686 ../applications/taxes/aangifte-2013 { };
-
-  abcde = callPackage ../applications/audio/abcde {
-    inherit (perlPackages) DigestSHA MusicBrainz MusicBrainzDiscID;
-    libcdio = libcdio082;
-  };
-
-  abiword = callPackage ../applications/office/abiword {
-    inherit (gnome) libglade libgnomecanvas;
-  };
-
-  abook = callPackage ../applications/misc/abook { };
-
-  adobe-reader = callPackage_i686 ../applications/misc/adobe-reader { };
-
-  aewan = callPackage ../applications/editors/aewan { };
-
-  alchemy = callPackage ../applications/graphics/alchemy { };
-
-  ams-lv2 = callPackage ../applications/audio/ams-lv2 { };
-
-  amsn = callPackage ../applications/networking/instant-messengers/amsn { };
-
-  antiword = callPackage ../applications/office/antiword {};
-
-  ardour = ardour3;
-
-  ardour3 =  lowPrio (callPackage ../applications/audio/ardour {
-    inherit (gnome) libgnomecanvas libgnomecanvasmm;
-  });
-
-  arora = callPackage ../applications/networking/browsers/arora { };
-
-  atom = callPackage ../applications/editors/atom {
-    gconf = gnome.GConf;
-  };
-
-  aseprite = callPackage ../applications/editors/aseprite {
-    giflib = giflib_4_1;
-  };
-
-  audacious = callPackage ../applications/audio/audacious { };
-
-  audacity = callPackage ../applications/audio/audacity {
-    ffmpeg = ffmpeg_0_10;
-  };
-
-  milkytracker = callPackage ../applications/audio/milkytracker { };
-
-  aumix = callPackage ../applications/audio/aumix {
-    gtkGUI = false;
-  };
-
-  autopanosiftc = callPackage ../applications/graphics/autopanosiftc { };
-
-  avidemux = callPackage ../applications/video/avidemux { };
-
-  avogadro = callPackage ../applications/science/chemistry/avogadro {
-    eigen = eigen2;
-  };
-
-  avrdudess = callPackage ../applications/misc/avrdudess { };
-
-  avxsynth = callPackage ../applications/video/avxsynth { };
-
-  awesome-3-4 = callPackage ../applications/window-managers/awesome/3.4.nix {
-    lua = lua5;
-    cairo = cairo.override { xcbSupport = true; };
-  };
-  awesome-3-5 = callPackage ../applications/window-managers/awesome {
-    lua   = lua5_1;
-    cairo = cairo.override { xcbSupport = true; };
-  };
-  awesome = awesome-3-5;
-
-  inherit (gnome3) baobab;
-
-  bar = callPackage ../applications/window-managers/bar { };
-
-  baresip = callPackage ../applications/networking/instant-messengers/baresip {
-    ffmpeg = ffmpeg_1;
-  };
-
-  batik = callPackage ../applications/graphics/batik { };
-
-  bazaar = callPackage ../applications/version-management/bazaar { };
-
-  bazaarTools = builderDefsPackage (import ../applications/version-management/bazaar/tools.nix) {
-    inherit bazaar;
-  };
-
-  beast = callPackage ../applications/audio/beast {
-    inherit (gnome) libgnomecanvas libart_lgpl;
-    guile = guile_1_8;
-  };
-
-  bibletime = callPackage ../applications/misc/bibletime { };
-
-  bitcoin = callPackage ../applications/misc/bitcoin { };
-
-  bitlbee = callPackage ../applications/networking/instant-messengers/bitlbee {
-    gnutls = gnutls;
-    libotr = libotr_3_2;
-  };
-
-  blender = callPackage  ../applications/misc/blender {
-    python = python34;
-  };
-
-  bristol = callPackage ../applications/audio/bristol { };
-
-  bspwm = callPackage ../applications/window-managers/bspwm { };
-
-  bvi = callPackage ../applications/editors/bvi { };
-
-  calf = callPackage ../applications/audio/calf {
-      inherit (gnome) libglade;
-  };
-
-  calibre = callPackage ../applications/misc/calibre {
-    inherit (pythonPackages) pyqt5 sip_4_16;
-  };
-
-  camlistore = callPackage ../applications/misc/camlistore { };
-
-  carrier = builderDefsPackage (import ../applications/networking/instant-messengers/carrier/2.5.0.nix) {
-    inherit fetchurl stdenv pkgconfig perl perlXMLParser libxml2 openssl nss
-      gtkspell aspell gettext ncurses avahi dbus dbus_glib python
-      libtool automake autoconf gstreamer;
-    inherit gtk glib;
-    inherit (gnome) startupnotification GConf ;
-    inherit (xlibs) libXScrnSaver scrnsaverproto libX11 xproto kbproto;
-  };
-  funpidgin = carrier;
-
-  cc1394 = callPackage ../applications/video/cc1394 { };
-
-  cddiscid = callPackage ../applications/audio/cd-discid { };
-
-  cdparanoia = cdparanoiaIII;
-
-  cdparanoiaIII = callPackage ../applications/audio/cdparanoia { };
-
-  cdrtools = callPackage ../applications/misc/cdrtools { };
-
-  centerim = callPackage ../applications/networking/instant-messengers/centerim { };
-
-  cgit = callPackage ../applications/version-management/git-and-tools/cgit { };
-
-  cgminer = callPackage ../applications/misc/cgminer {
-    amdappsdk = amdappsdk28;
-  };
-
-  chatzilla = callPackage ../applications/networking/irc/chatzilla { };
-
-  chromium = lowPrio (callPackage ../applications/networking/browsers/chromium {
-    channel = "stable";
-    pulseSupport = config.pulseaudio or true;
-    enablePepperFlash = config.chromium.enablePepperFlash or false;
-    enablePepperPDF = config.chromium.enablePepperPDF or false;
-  });
-
-  chromiumBeta = lowPrio (chromium.override { channel = "beta"; });
-  chromiumBetaWrapper = lowPrio (wrapChromium chromiumBeta);
-
-  chromiumDev = lowPrio (chromium.override { channel = "dev"; });
-  chromiumDevWrapper = lowPrio (wrapChromium chromiumDev);
-
-  chromiumWrapper = wrapChromium chromium;
-
-  cinelerra = callPackage ../applications/video/cinelerra { };
-
-  clipit = callPackage ../applications/misc/clipit { };
-
-  cmus = callPackage ../applications/audio/cmus { };
-
-  compiz = callPackage ../applications/window-managers/compiz {
-    inherit (gnome) GConf ORBit2 metacity;
-    boost = boost149; # https://bugs.launchpad.net/compiz/+bug/1131864
-  };
-
-  coriander = callPackage ../applications/video/coriander {
-    inherit (gnome) libgnomeui GConf;
-  };
-
-  csound = callPackage ../applications/audio/csound { };
-
-  cinepaint = callPackage ../applications/graphics/cinepaint {
-    fltk = fltk13;
-    libpng = libpng12;
-  };
-
-  codeblocks = callPackage ../applications/editors/codeblocks { };
-  codeblocksFull = callPackage ../applications/editors/codeblocks { contribPlugins = true; };
-
-  codeville = builderDefsPackage (import ../applications/version-management/codeville/0.8.0.nix) {
-    inherit makeWrapper;
-    python = pythonFull;
-  };
-
-  comical = callPackage ../applications/graphics/comical { };
-
-  conkeror = callPackage ../applications/networking/browsers/conkeror { };
-
-  conkerorWrapper = wrapFirefox {
-    browser = conkeror;
-    browserName = "conkeror";
-    desktopName = "Conkeror";
-  };
-
-  cuneiform = builderDefsPackage (import ../tools/graphics/cuneiform) {
-    inherit cmake patchelf;
-    imagemagick = imagemagick;
-  };
-
-  cvs = callPackage ../applications/version-management/cvs { };
-
-  cvsps = callPackage ../applications/version-management/cvsps { };
-
-  cvs2svn = callPackage ../applications/version-management/cvs2svn { };
-
-  d4x = callPackage ../applications/misc/d4x { };
-
-  darcs = with haskellPackages_ghc783; callPackage ../applications/version-management/darcs {
-    cabal = cabal.override {
-      extension = self : super : {
-        isLibrary = false;
-        configureFlags = "-f-library " + super.configureFlags or "";
-      };
-    };
-  };
-
-  darktable = callPackage ../applications/graphics/darktable {
-    inherit (gnome) GConf libglade;
-  };
-
-  dd-agent = callPackage ../tools/networking/dd-agent { inherit (pythonPackages) tornado; };
-
-  dia = callPackage ../applications/graphics/dia {
-    inherit (pkgs.gnome) libart_lgpl libgnomeui;
-  };
-
-  diffuse = callPackage ../applications/version-management/diffuse { };
-
-  distrho = callPackage ../applications/audio/distrho {};
-
-  djvulibre = callPackage ../applications/misc/djvulibre { };
-
-  djvu2pdf = callPackage ../tools/typesetting/djvu2pdf { };
-
-  djview = callPackage ../applications/graphics/djview { };
-  djview4 = pkgs.djview;
-
-  dmenu = callPackage ../applications/misc/dmenu {
-    enableXft = config.dmenu.enableXft or false;
-  };
-
-  dmtx = builderDefsPackage (import ../tools/graphics/dmtx) {
-    inherit libpng libtiff libjpeg imagemagick librsvg
-      pkgconfig bzip2 zlib libtool freetype fontconfig
-      ghostscript jasper xz;
-    inherit (xlibs) libX11;
-  };
-
-  docker = callPackage ../applications/virtualization/docker { };
-
-  doodle = callPackage ../applications/search/doodle { };
-
-  dunst = callPackage ../applications/misc/dunst { };
-
-  dvb_apps  = callPackage ../applications/video/dvb-apps { };
-
-  dvdauthor = callPackage ../applications/video/dvdauthor { };
-
-  dwb = callPackage ../applications/networking/browsers/dwb { dconf = gnome3.dconf; };
-
-  dwbWrapper = wrapFirefox
-    { browser = dwb; browserName = "dwb"; desktopName = "dwb";
-    };
-
-  dwm = callPackage ../applications/window-managers/dwm {
-    patches = config.dwm.patches or [];
-  };
-
-  dzen2 = callPackage ../applications/window-managers/dzen2 { };
-
-  eaglemode = callPackage ../applications/misc/eaglemode { };
-
-  eclipses = recurseIntoAttrs (callPackage ../applications/editors/eclipse { });
-
-  ed = callPackage ../applications/editors/ed { };
-
-  ekho = callPackage ../applications/audio/ekho { };
-
-  electrum = callPackage ../applications/misc/electrum { };
-
-  elinks = callPackage ../applications/networking/browsers/elinks { };
-
-  elvis = callPackage ../applications/editors/elvis { };
-
-  emacs = emacs24;
-
-  emacs24 = callPackage ../applications/editors/emacs-24 {
-    # use override to enable additional features
-    libXaw = xlibs.libXaw;
-    Xaw3d = null;
-    gconf = null;
-    librsvg = null;
-    alsaLib = null;
-    imagemagick = null;
-  };
-
-  emacs24-nox = lowPrio (appendToName "nox" (emacs24.override {
-    withX = false;
-  }));
-
-  emacs24Macport = lowPrio (callPackage ../applications/editors/emacs-24/macport.nix {
-    stdenv = pkgs.clangStdenv;
-  });
-
-  emacsPackages = emacs: self: let callPackage = newScope self; in rec {
-    inherit emacs;
-
-    autoComplete = callPackage ../applications/editors/emacs-modes/auto-complete { };
-
-    bbdb = callPackage ../applications/editors/emacs-modes/bbdb { };
-
-    bbdb3 = callPackage ../applications/editors/emacs-modes/bbdb/3.nix {};
-
-    cedet = callPackage ../applications/editors/emacs-modes/cedet { };
-
-    calfw = callPackage ../applications/editors/emacs-modes/calfw { };
-
-    coffee = callPackage ../applications/editors/emacs-modes/coffee { };
-
-    colorTheme = callPackage ../applications/editors/emacs-modes/color-theme { };
-
-    colorThemeSolarized = callPackage ../applications/editors/emacs-modes/color-theme-solarized { };
-
-    cryptol = callPackage ../applications/editors/emacs-modes/cryptol { };
-
-    cua = callPackage ../applications/editors/emacs-modes/cua { };
-
-    darcsum = callPackage ../applications/editors/emacs-modes/darcsum { };
-
-    # ecb = callPackage ../applications/editors/emacs-modes/ecb { };
-
-    jabber = callPackage ../applications/editors/emacs-modes/jabber { };
-
-    emacsClangCompleteAsync = callPackage ../applications/editors/emacs-modes/emacs-clang-complete-async { };
-
-    emacsSessionManagement = callPackage ../applications/editors/emacs-modes/session-management-for-emacs { };
-
-    emacsw3m = callPackage ../applications/editors/emacs-modes/emacs-w3m { };
-
-    emms = callPackage ../applications/editors/emacs-modes/emms { };
-
-    ess = callPackage ../applications/editors/emacs-modes/ess { };
-
-    flymakeCursor = callPackage ../applications/editors/emacs-modes/flymake-cursor { };
-
-    gh = callPackage ../applications/editors/emacs-modes/gh { };
-
-    graphvizDot = callPackage ../applications/editors/emacs-modes/graphviz-dot { };
-
-    gist = callPackage ../applications/editors/emacs-modes/gist { };
-
-    idris = callPackage ../applications/editors/emacs-modes/idris { };
-
-    jade = callPackage ../applications/editors/emacs-modes/jade { };
-
-    jdee = callPackage ../applications/editors/emacs-modes/jdee {
-      # Requires Emacs 23, for `avl-tree'.
-    };
-
-    js2 = callPackage ../applications/editors/emacs-modes/js2 { };
-
-    stratego = callPackage ../applications/editors/emacs-modes/stratego { };
-
-    haskellMode = callPackage ../applications/editors/emacs-modes/haskell { };
-
-    ocamlMode = callPackage ../applications/editors/emacs-modes/ocaml { };
-
-    structuredHaskellMode = callPackage ../applications/editors/emacs-modes/structured-haskell-mode {
-      inherit (haskellPackages) cabal haskellSrcExts;
-    };
-
-    tuaregMode = callPackage ../applications/editors/emacs-modes/tuareg { };
-
-    hol_light_mode = callPackage ../applications/editors/emacs-modes/hol_light { };
-
-    htmlize = callPackage ../applications/editors/emacs-modes/htmlize { };
-
-    logito = callPackage ../applications/editors/emacs-modes/logito { };
-
-    loremIpsum = callPackage ../applications/editors/emacs-modes/lorem-ipsum { };
-
-    magit = callPackage ../applications/editors/emacs-modes/magit { };
-
-    maudeMode = callPackage ../applications/editors/emacs-modes/maude { };
-
-    metaweblog = callPackage ../applications/editors/emacs-modes/metaweblog { };
-
-    notmuch = lowPrio (callPackage ../applications/networking/mailreaders/notmuch { });
-
-    offlineimap = callPackage ../applications/editors/emacs-modes/offlineimap {};
-
-    # This is usually a newer version of Org-Mode than that found in GNU Emacs, so
-    # we want it to have higher precedence.
-    org = hiPrio (callPackage ../applications/editors/emacs-modes/org { });
-
-    org2blog = callPackage ../applications/editors/emacs-modes/org2blog { };
-
-    pcache = callPackage ../applications/editors/emacs-modes/pcache { };
-
-    phpMode = callPackage ../applications/editors/emacs-modes/php { };
-
-    prologMode = callPackage ../applications/editors/emacs-modes/prolog { };
-
-    proofgeneral_4_2 = callPackage ../applications/editors/emacs-modes/proofgeneral/4.2.nix {
-      texinfo = texinfo4 ;
-      texLive = pkgs.texLiveAggregationFun {
-        paths = [ pkgs.texLive pkgs.texLiveCMSuper ];
-      };
-    };
-    proofgeneral_4_3_pre = callPackage ../applications/editors/emacs-modes/proofgeneral/4.3pre.nix {
-      texinfo = texinfo4 ;
-      texLive = pkgs.texLiveAggregationFun {
-        paths = [ pkgs.texLive pkgs.texLiveCMSuper ];
-      };
-    };
-    proofgeneral = self.proofgeneral_4_2;
-
-    quack = callPackage ../applications/editors/emacs-modes/quack { };
-
-    rectMark = callPackage ../applications/editors/emacs-modes/rect-mark { };
-
-    remember = callPackage ../applications/editors/emacs-modes/remember { };
-
-    rudel = callPackage ../applications/editors/emacs-modes/rudel { };
-
-    sbtMode = callPackage ../applications/editors/emacs-modes/sbt-mode { };
-
-    scalaMode1 = callPackage ../applications/editors/emacs-modes/scala-mode/v1.nix { };
-    scalaMode2 = callPackage ../applications/editors/emacs-modes/scala-mode/v2.nix { };
-
-    sunriseCommander = callPackage ../applications/editors/emacs-modes/sunrise-commander { };
-
-    writeGood = callPackage ../applications/editors/emacs-modes/writegood { };
-
-    xmlRpc = callPackage ../applications/editors/emacs-modes/xml-rpc { };
-  };
-
-  emacs24Packages = recurseIntoAttrs (emacsPackages emacs24 pkgs.emacs24Packages);
-
-  inherit (gnome3) empathy;
-
-  epdfview = callPackage ../applications/misc/epdfview { };
-
-  inherit (gnome3) epiphany;
-
-  espeak = callPackage ../applications/audio/espeak { };
-
-  espeakedit = callPackage ../applications/audio/espeak/edit.nix { };
-
-  esniper = callPackage ../applications/networking/esniper { };
-
-  etherape = callPackage ../applications/networking/sniffers/etherape {
-    inherit (gnome) gnomedocutils libgnome libglade libgnomeui scrollkeeper;
-  };
-
-  evopedia = callPackage ../applications/misc/evopedia { };
-
-  keepassx = callPackage ../applications/misc/keepassx { };
-  keepassx2 = callPackage ../applications/misc/keepassx/2.0.nix { };
-
-  inherit (gnome3) evince;
-  evolution_data_server = gnome3.evolution_data_server;
-
-  keepass = callPackage ../applications/misc/keepass { };
-
-  exrdisplay = callPackage ../applications/graphics/exrdisplay {
-    fltk = fltk20;
-  };
-
-  fbpanel = callPackage ../applications/window-managers/fbpanel { };
-
-  fbreader = callPackage ../applications/misc/fbreader { };
-
-  fetchmail = import ../applications/misc/fetchmail {
-    inherit stdenv fetchurl openssl;
-  };
-
-  fldigi = callPackage ../applications/audio/fldigi { };
-
-  fluidsynth = callPackage ../applications/audio/fluidsynth { };
-
-  fossil = callPackage ../applications/version-management/fossil { };
-
-  fribid = callPackage ../applications/networking/browsers/mozilla-plugins/fribid { };
-
-  fvwm = callPackage ../applications/window-managers/fvwm { };
-
-  geany = callPackage ../applications/editors/geany { };
-
-  gksu = callPackage ../applications/misc/gksu { };
-
-  gnuradio = callPackage ../applications/misc/gnuradio {
-    inherit (pythonPackages) lxml numpy scipy matplotlib pyopengl;
-    fftw = fftwFloat;
-  };
-
-  gnuradio-osmosdr = callPackage ../applications/misc/gnuradio-osmosdr { };
-
-  goldendict = callPackage ../applications/misc/goldendict { };
-
-  google-musicmanager = callPackage ../applications/audio/google-musicmanager { };
-
-  gpicview = callPackage ../applications/graphics/gpicview { };
-
-  gqrx = callPackage ../applications/misc/gqrx { };
-
-  grass = import ../applications/misc/grass {
-    inherit (xlibs) libXmu libXext libXp libX11 libXt libSM libICE libXpm
-      libXaw libXrender;
-    inherit config composableDerivation stdenv fetchurl
-      lib flex bison cairo fontconfig
-      gdal zlib ncurses gdbm proj pkgconfig swig
-      blas liblapack libjpeg libpng mysql unixODBC mesa postgresql python
-      readline sqlite tcl tk libtiff freetype makeWrapper wxGTK;
-    fftw = fftwSinglePrec;
-    ffmpeg = ffmpeg_0_10;
-    motif = lesstif;
-    opendwg = libdwg;
-    wxPython = wxPython28;
-  };
-
-  grip = callPackage ../applications/misc/grip {
-    inherit (gnome) libgnome libgnomeui vte;
-  };
-
-  gtimelog = pythonPackages.gtimelog;
-
-  inherit (gnome3) gucharmap;
-
-  guitarix = callPackage ../applications/audio/guitarix {
-    fftw = fftwSinglePrec;
-  };
-
-  photivo = callPackage ../applications/graphics/photivo { };
-
-  wavesurfer = callPackage ../applications/misc/audio/wavesurfer { };
-
-  wireshark = callPackage ../applications/networking/sniffers/wireshark { };
-
-  wvdial = callPackage ../os-specific/linux/wvdial { };
-
-  fbida = callPackage ../applications/graphics/fbida { };
-
-  fdupes = callPackage ../tools/misc/fdupes { };
-
-  feh = callPackage ../applications/graphics/feh { };
-
-  filezilla = callPackage ../applications/networking/ftp/filezilla { };
-
-  firefox13Pkgs = callPackage ../applications/networking/browsers/firefox/13.0.nix {
-    inherit (gnome) libIDL;
-  };
-
-  firefox13Wrapper = wrapFirefox { browser = firefox13Pkgs.firefox; };
-
-  firefox30Pkgs = callPackage ../applications/networking/browsers/firefox/30.nix {
-    inherit (gnome) libIDL;
-    inherit (pythonPackages) pysqlite;
-    libpng = libpng_apng;
-  };
-
-  firefox = callPackage ../applications/networking/browsers/firefox {
-    inherit (gnome) libIDL;
-    inherit (pythonPackages) pysqlite;
-  };
-
-  firefoxWrapper = wrapFirefox { browser = pkgs.firefox; };
-
-  firefox-bin = callPackage ../applications/networking/browsers/firefox-bin {
-    gconf = pkgs.gnome.GConf;
-    inherit (pkgs.gnome) libgnome libgnomeui;
-    inherit (pkgs.xlibs) libX11 libXScrnSaver libXext
-      libXinerama libXrender libXt;
-  };
-
-  flac = callPackage ../applications/audio/flac { };
-
-  flashplayer = callPackage ../applications/networking/browsers/mozilla-plugins/flashplayer-11 {
-    debug = config.flashplayer.debug or false;
-  };
-
-  fluxbox = callPackage ../applications/window-managers/fluxbox { };
-
-  freecad = callPackage ../applications/graphics/freecad {
-    opencascade = opencascade_6_5;
-    inherit (pythonPackages) matplotlib pycollada;
-  };
-
-  freemind = callPackage ../applications/misc/freemind {
-    jdk = jdk;
-    jre = jdk;
-  };
-
-  freenet = callPackage ../applications/networking/p2p/freenet { };
-
-  freepv = callPackage ../applications/graphics/freepv { };
-
-  xfontsel = callPackage ../applications/misc/xfontsel { };
-  xlsfonts = callPackage ../applications/misc/xlsfonts { };
-
-  freerdp = callPackage ../applications/networking/remote/freerdp {
-    ffmpeg = ffmpeg_1;
-  };
-
-  freerdpUnstable = callPackage ../applications/networking/remote/freerdp/unstable.nix { };
-
-  freicoin = callPackage ../applications/misc/freicoin { };
-
-  fspot = callPackage ../applications/graphics/f-spot {
-    inherit (gnome) libgnome libgnomeui;
-    gtksharp = gtksharp1;
-  };
-
-  fuze = callPackage ../applications/networking/instant-messengers/fuze {};
-
-  gcolor2 = callPackage ../applications/graphics/gcolor2 { };
-
-  get_iplayer = callPackage ../applications/misc/get_iplayer {};
-
-  gimp_2_8 = callPackage ../applications/graphics/gimp/2.8.nix {
-    inherit (gnome) libart_lgpl;
-    webkit = null;
-    lcms = lcms2;
-    wrapPython = pythonPackages.wrapPython;
-  };
-
-  gimp = gimp_2_8;
-
-  gimpPlugins = recurseIntoAttrs (import ../applications/graphics/gimp/plugins {
-    inherit pkgs gimp;
-  });
-
-  gitAndTools = recurseIntoAttrs (import ../applications/version-management/git-and-tools {
-    inherit pkgs;
-  });
-  git = gitAndTools.git;
-  gitFull = gitAndTools.gitFull;
-  gitSVN = gitAndTools.gitSVN;
-
-  gitRepo = callPackage ../applications/version-management/git-repo {
-    python = python27;
-  };
-
-  gitolite = callPackage ../applications/version-management/gitolite { };
-
-  inherit (gnome3) gitg;
-
-  giv = callPackage ../applications/graphics/giv {
-    pcre = pcre.override { unicodeSupport = true; };
-  };
-
-  gmrun = callPackage ../applications/misc/gmrun {};
-
-  gnucash = callPackage ../applications/office/gnucash {
-    inherit (gnome2) libgnomeui libgtkhtml gtkhtml libbonoboui libgnomeprint libglade libart_lgpl;
-    gconf = gnome2.GConf;
-    guile = guile_1_8;
-    slibGuile = slibGuile.override { scheme = guile_1_8; };
-    goffice = goffice_0_8;
-  };
-
-  goffice_0_8 = callPackage ../desktops/gnome-3/3.10/misc/goffice/0.8.nix {
-    inherit (gnome2) libglade libgnomeui;
-    gconf = gnome2.GConf;
-    libart = gnome2.libart_lgpl;
-  }; # latest version: gnome3.goffice
-
-  ideas = recurseIntoAttrs (  (callPackage ../applications/editors/idea { })
-                           // (callPackage ../applications/editors/idea/pycharm.nix { }));
-
-  libquvi = callPackage ../applications/video/quvi/library.nix { };
-
-  mi2ly = callPackage ../applications/audio/mi2ly {};
-
-  praat = callPackage ../applications/audio/praat { };
-
-  quvi = callPackage ../applications/video/quvi/tool.nix { };
-
-  quvi_scripts = callPackage ../applications/video/quvi/scripts.nix { };
-
-  qjackctl = callPackage ../applications/audio/qjackctl { };
-
-  gkrellm = callPackage ../applications/misc/gkrellm { };
-
-  gmu = callPackage ../applications/audio/gmu { };
-
-  gnash = callPackage ../applications/video/gnash {
-    inherit (gnome) gtkglext;
-  };
-
-  gnome_mplayer = callPackage ../applications/video/gnome-mplayer {
-    inherit (gnome) GConf;
-  };
-
-  gnumeric = callPackage ../applications/office/gnumeric {
-    inherit (gnome3) goffice gnome_icon_theme;
-  };
-
-  gnunet = callPackage ../applications/networking/p2p/gnunet {
-    libgcrypt = libgcrypt_1_6;
-  };
-
-  gnunet_svn = lowPrio (callPackage ../applications/networking/p2p/gnunet/svn.nix {
-    libgcrypt = libgcrypt_1_6;
-  });
-
-  gocr = callPackage ../applications/graphics/gocr { };
-
-  gobby5 = callPackage ../applications/editors/gobby {
-    inherit (gnome) gtksourceview;
-  };
-
-  gphoto2 = callPackage ../applications/misc/gphoto2 { };
-
-  gphoto2fs = builderDefsPackage ../applications/misc/gphoto2/gphotofs.nix {
-    inherit libgphoto2 fuse pkgconfig glib libtool;
-  };
-
-  graphicsmagick = callPackage ../applications/graphics/graphicsmagick { };
-  graphicsmagick_q16 = callPackage ../applications/graphics/graphicsmagick { quantumdepth = 16; };
-
-  graphicsmagick137 = callPackage ../applications/graphics/graphicsmagick/1.3.7.nix {
-    libpng = libpng12;
-  };
-
-  gtkpod = callPackage ../applications/audio/gtkpod {
-    inherit (gnome) libglade;
-  };
-
-  jbidwatcher = callPackage ../applications/misc/jbidwatcher {
-    java = if stdenv.isLinux then jre else jdk;
-  };
-
-  qrdecode = builderDefsPackage (import ../tools/graphics/qrdecode) {
-    libpng = libpng12;
-    opencv = opencv_2_1;
-  };
-
-  qrencode = callPackage ../tools/graphics/qrencode { };
-
-  gecko_mediaplayer = callPackage ../applications/networking/browsers/mozilla-plugins/gecko-mediaplayer {
-    inherit (gnome) GConf;
-    browser = firefox;
-  };
-
-  geeqie = callPackage ../applications/graphics/geeqie { };
-
-  gigedit = callPackage ../applications/audio/gigedit { };
-
-  gqview = callPackage ../applications/graphics/gqview { };
-
-  gmpc = callPackage ../applications/audio/gmpc { };
-
-  gmtk = callPackage ../applications/networking/browsers/mozilla-plugins/gmtk {
-    inherit (gnome) GConf;
-  };
-
-  googleearth = callPackage_i686 ../applications/misc/googleearth { };
-
-  google_talk_plugin = callPackage ../applications/networking/browsers/mozilla-plugins/google-talk-plugin {
-    libpng = libpng12;
-  };
-
-  gosmore = builderDefsPackage ../applications/misc/gosmore {
-    inherit fetchsvn curl pkgconfig libxml2 gtk;
-  };
-
-  gpsbabel = callPackage ../applications/misc/gpsbabel { };
-
-  gpscorrelate = callPackage ../applications/misc/gpscorrelate { };
-
-  gpsd = callPackage ../servers/gpsd { };
-
-  guitone = callPackage ../applications/version-management/guitone { };
-
-  gv = callPackage ../applications/misc/gv { };
-
-  guvcview = callPackage ../os-specific/linux/guvcview { };
-
-  hello = callPackage ../applications/misc/hello/ex-2 { };
-
-  herbstluftwm = callPackage ../applications/window-managers/herbstluftwm { };
-
-  hexchat = callPackage ../applications/networking/irc/hexchat { };
-
-  hexedit = callPackage ../applications/editors/hexedit { };
-
-  hipchat = callPackage ../applications/networking/instant-messengers/hipchat { };
-
-  homebank = callPackage ../applications/office/homebank { };
-
-  htmldoc = callPackage ../applications/misc/htmldoc {
-    fltk = fltk13;
-  };
-
-  hugin = callPackage ../applications/graphics/hugin { };
-
-  hydrogen = callPackage ../applications/audio/hydrogen { };
-
-  i3 = callPackage ../applications/window-managers/i3 { };
-
-  i3lock = callPackage ../applications/window-managers/i3/lock.nix {
-    inherit (xorg) libxkbfile;
-    cairo = cairo.override { xcbSupport = true; };
-  };
-
-  i3minator = callPackage ../tools/misc/i3minator { };
-
-  i3status = callPackage ../applications/window-managers/i3/status.nix { };
-
-  i810switch = callPackage ../os-specific/linux/i810switch { };
-
-  icewm = callPackage ../applications/window-managers/icewm { };
-
-  id3v2 = callPackage ../applications/audio/id3v2 { };
-
-  ifenslave = callPackage ../os-specific/linux/ifenslave { };
-
-  ii = callPackage ../applications/networking/irc/ii { };
-
-  ike = callPackage ../applications/ike { };
-
-  ikiwiki = callPackage ../applications/misc/ikiwiki {
-    inherit (perlPackages) TextMarkdown URI HTMLParser HTMLScrubber
-      HTMLTemplate TimeDate CGISession DBFile CGIFormBuilder LocaleGettext
-      RpcXML XMLSimple PerlMagick YAML YAMLLibYAML HTMLTree Filechdir
-      AuthenPassphrase NetOpenIDConsumer LWPxParanoidAgent CryptSSLeay;
-  };
-
-  imagemagick = callPackage ../applications/graphics/ImageMagick {
-    tetex = null;
-    librsvg = null;
-  };
-
-  imagemagickBig = lowPrio (callPackage ../applications/graphics/ImageMagick { });
-
-  # Impressive, formerly known as "KeyJNote".
-  impressive = callPackage ../applications/office/impressive {
-    # XXX These are the PyOpenGL dependencies, which we need here.
-    inherit (pythonPackages) pyopengl;
-  };
-
-  inferno = callPackage_i686 ../applications/inferno { };
-
-  inkscape = callPackage ../applications/graphics/inkscape {
-    inherit (pythonPackages) lxml;
-    lcms = lcms2;
-  };
-
-  ion3 = callPackage ../applications/window-managers/ion-3 {
-    lua = lua5;
-  };
-
-  ipe = callPackage ../applications/graphics/ipe { };
-
-  iptraf = callPackage ../applications/networking/iptraf { };
-
-  irssi = callPackage ../applications/networking/irc/irssi {
-    # compile with gccApple on darwin to support the -no-cpp-precompile flag
-    stdenv = if stdenv.isDarwin
-      then stdenvAdapters.overrideGCC stdenv gccApple
-      else stdenv;
-  };
-
-  irssi_fish = callPackage ../applications/networking/irc/irssi/fish { };
-
-  irssi_otr = callPackage ../applications/networking/irc/irssi/otr { };
-
-  bip = callPackage ../applications/networking/irc/bip { };
-
-  jack_capture = callPackage ../applications/audio/jack-capture { };
-
-  jack_oscrolloscope = callPackage ../applications/audio/jack-oscrolloscope { };
-
-  jack_rack = callPackage ../applications/audio/jack-rack { };
-
-  jackmeter = callPackage ../applications/audio/jackmeter { };
-
-  jalv = callPackage ../applications/audio/jalv { };
-
-  jedit = callPackage ../applications/editors/jedit { };
-
-  jigdo = callPackage ../applications/misc/jigdo { };
-
-  jitsi = callPackage ../applications/networking/instant-messengers/jitsi { };
-
-  joe = callPackage ../applications/editors/joe { };
-
-  jbrout = callPackage ../applications/graphics/jbrout {
-    inherit (pythonPackages) lxml;
-  };
-
-  jwm = callPackage ../applications/window-managers/jwm { };
-
-  k3d = callPackage ../applications/graphics/k3d {
-    inherit (pkgs.gnome2) gtkglext;
-  };
-
-  keepnote = callPackage ../applications/office/keepnote {
-    pygtk = pyGtkGlade;
-  };
-
-  kermit = callPackage ../tools/misc/kermit { };
-
-  keymon = callPackage ../applications/video/key-mon { };
-
-  kino = callPackage ../applications/video/kino {
-    inherit (gnome) libglade;
-  };
-
-  lame = callPackage ../applications/audio/lame { };
-
-  larswm = callPackage ../applications/window-managers/larswm { };
-
-  lash = callPackage ../applications/audio/lash { };
-
-  ladspaH = callPackage ../applications/audio/ladspa-plugins/ladspah.nix { };
-
-  ladspaPlugins = callPackage ../applications/audio/ladspa-plugins {
-    fftw = fftwSinglePrec;
-  };
-
-  caps = callPackage ../applications/audio/caps { };
-
-  lastwatch = callPackage ../applications/audio/lastwatch { };
-
-  lastfmsubmitd = callPackage ../applications/audio/lastfmsubmitd { };
-
-  lbdb = callPackage ../tools/misc/lbdb { };
-
-  lci = callPackage ../applications/science/logic/lci {};
-
-  ldcpp = callPackage ../applications/networking/p2p/ldcpp {
-    inherit (gnome) libglade;
-  };
-
-  librecad = callPackage ../applications/misc/librecad { };
-
-  librecad2 = callPackage ../applications/misc/librecad/2.0.nix { };
-
-  libreoffice = callPackage ../applications/office/libreoffice {
-    inherit (perlPackages) ArchiveZip CompressZlib;
-    inherit (gnome) GConf ORBit2 gnome_vfs;
-    zip = zip.override { enableNLS = false; };
-    boost = boost155;
-    jdk = openjdk;
-    fontsConf = makeFontsConf {
-      fontDirectories = [
-        freefont_ttf xorg.fontmiscmisc xorg.fontbhttf
-      ];
-    };
-    clucene_core = clucene_core_2;
-    lcms = lcms2;
-    harfbuzz = harfbuzz.override {
-      withIcu = true; withGraphite2 = true;
-    };
-  };
-
-  liferea = callPackage ../applications/networking/newsreaders/liferea { };
-
-  lingot = callPackage ../applications/audio/lingot {
-    inherit (gnome) libglade;
-  };
-
-  links = callPackage ../applications/networking/browsers/links { };
-
-  ledger = callPackage ../applications/office/ledger/2.6.3.nix { };
-  ledger3 = callPackage ../applications/office/ledger/3.0.nix { };
-
-  lighttable = callPackage ../applications/editors/lighttable {};
-
-  links2 = callPackage ../applications/networking/browsers/links2 { };
-
-  linphone = callPackage ../applications/networking/instant-messengers/linphone rec {
-    inherit (gnome) libglade;
-    libexosip = libexosip_3;
-    libosip = libosip_3;
-  };
-
-  linuxsampler = callPackage ../applications/audio/linuxsampler {
-    bison = bison2;
-  };
-
-  llpp = callPackage ../applications/misc/llpp { inherit (ocamlPackages) lablgl; };
-
-  lmms = callPackage ../applications/audio/lmms { };
-
-  lrzsz = callPackage ../tools/misc/lrzsz { };
-
-  luminanceHDR = callPackage ../applications/graphics/luminance-hdr { };
-
-  lxdvdrip = callPackage ../applications/video/lxdvdrip { };
-
-  handbrake = callPackage ../applications/video/handbrake { };
-
-  lynx = callPackage ../applications/networking/browsers/lynx { };
-
-  lyx = callPackage ../applications/misc/lyx { };
-
-  makeself = callPackage ../applications/misc/makeself { };
-
-  matchbox = callPackage ../applications/window-managers/matchbox { };
-
-  mcpp = callPackage ../development/compilers/mcpp { };
-
-  mda_lv2 = callPackage ../applications/audio/mda-lv2 { };
-
-  meld = callPackage ../applications/version-management/meld {
-    inherit (gnome) scrollkeeper;
-    pygtk = pyGtkGlade;
-  };
-
-  mcomix = callPackage ../applications/graphics/mcomix { };
-
-  mercurial = callPackage ../applications/version-management/mercurial {
-    inherit (pythonPackages) curses docutils;
-    guiSupport = false; # use mercurialFull to get hgk GUI
-  };
-
-  mercurialFull = appendToName "full" (pkgs.mercurial.override { guiSupport = true; });
-
-  merkaartor = callPackage ../applications/misc/merkaartor { };
-
-  meshlab = callPackage ../applications/graphics/meshlab { };
-
-  mhwaveedit = callPackage ../applications/audio/mhwaveedit {};
-
-  mid2key = callPackage ../applications/audio/mid2key { };
-
-  midori = callPackage ../applications/networking/browsers/midori { };
-
-  midoriWrapper = wrapFirefox
-    { browser = midori; browserName = "midori"; desktopName = "Midori";
-      icon = "${midori}/share/icons/hicolor/22x22/apps/midori.png";
-    };
-
-  mikmod = callPackage ../applications/audio/mikmod { };
-
-  minicom = callPackage ../tools/misc/minicom { };
-
-  minimodem = callPackage ../applications/audio/minimodem { };
-
-  minidjvu = callPackage ../applications/graphics/minidjvu { };
-
-  mirage = callPackage ../applications/graphics/mirage {};
-
-  mixxx = callPackage ../applications/audio/mixxx {
-    inherit (vamp) vampSDK;
-  };
-
-  mmex = callPackage ../applications/office/mmex { };
-
-  moc = callPackage ../applications/audio/moc { };
-
-  monkeysAudio = callPackage ../applications/audio/monkeys-audio { };
-
-  monodevelop = callPackage ../applications/editors/monodevelop {
-    inherit (gnome) gnome_vfs libbonobo libglade libgnome GConf;
-    mozilla = firefox;
-    gtksharp = gtksharp2;
-  };
-
-  monodoc = callPackage ../applications/editors/monodoc {
-    gtksharp = gtksharp1;
-  };
-
-  monotone = callPackage ../applications/version-management/monotone {
-    lua = lua5;
-    boost = boost149;
-  };
-
-  monotoneViz = builderDefsPackage (import ../applications/version-management/monotone-viz/mtn-head.nix) {
-    inherit ocaml graphviz pkgconfig autoconf automake libtool glib gtk;
-    inherit (ocamlPackages) lablgtk;
-    inherit (gnome) libgnomecanvas;
-  };
-
-  mopidy = callPackage ../applications/audio/mopidy { };
-
-  mopidy-spotify = callPackage ../applications/audio/mopidy-spotify { };
-
-  mopidy-moped = callPackage ../applications/audio/mopidy-moped { };
-
-  mozilla = callPackage ../applications/networking/browsers/mozilla {
-    inherit (gnome) libIDL;
-  };
-
-  mozplugger = builderDefsPackage (import ../applications/networking/browsers/mozilla-plugins/mozplugger) {
-    inherit firefox;
-    inherit (xlibs) libX11 xproto;
-  };
-
-  easytag = callPackage ../applications/audio/easytag { };
-
-  mp3info = callPackage ../applications/audio/mp3info { };
-
-  mp3splt = callPackage ../applications/audio/mp3splt { };
-
-  mpc123 = callPackage ../applications/audio/mpc123 { };
-
-  mpg123 = callPackage ../applications/audio/mpg123 { };
-
-  mpg321 = callPackage ../applications/audio/mpg321 { };
-
-  mpc_cli = callPackage ../applications/audio/mpc { };
-
-  ncmpc = callPackage ../applications/audio/ncmpc { };
-
-  ncmpcpp = callPackage ../applications/audio/ncmpcpp { };
-
-  normalize = callPackage ../applications/audio/normalize { };
-
-  mplayer = callPackage ../applications/video/mplayer {
-    pulseSupport = config.pulseaudio or false;
-    vdpauSupport = config.mplayer.vdpauSupport or false;
-  };
-
-  mplayer2 = callPackage ../applications/video/mplayer2 {
-    ffmpeg = libav_9; # see https://trac.macports.org/ticket/44386
-  };
-
-  MPlayerPlugin = browser:
-    import ../applications/networking/browsers/mozilla-plugins/mplayerplug-in {
-      inherit browser;
-      inherit fetchurl stdenv pkgconfig gettext;
-      inherit (xlibs) libXpm;
-      # !!! should depend on MPlayer
-    };
-
-  mpv = callPackage ../applications/video/mpv {
-    lua = lua5_1;
-    bs2bSupport = true;
-    quviSupport = true;
-    cacaSupport = true;
-  };
-
-  mrxvt = callPackage ../applications/misc/mrxvt { };
-
-  multisync = callPackage ../applications/misc/multisync {
-    inherit (gnome) ORBit2 libbonobo libgnomeui GConf;
-  };
-
-  mumble = callPackage ../applications/networking/mumble {
-    avahi = avahi.override {
-      withLibdnssdCompat = true;
-    };
-    jackSupport = config.mumble.jackSupport or false;
-    speechdSupport = config.mumble.speechdSupport or false;
-  };
-
-  murmur = callPackage ../applications/networking/mumble/murmur.nix {
-    avahi = avahi.override {
-      withLibdnssdCompat = true;
-    };
-    iceSupport = config.murmur.iceSupport or true;
-  };
-
-  mutt = callPackage ../applications/networking/mailreaders/mutt { };
-
-  pcmanfm = callPackage ../applications/misc/pcmanfm { };
-
-  ruby_gpgme = callPackage ../development/libraries/ruby_gpgme {
-    ruby = ruby19;
-    hoe = rubyLibs.hoe;
-  };
-
-  ruby_ncursesw_sup = callPackage ../development/libraries/ruby_ncursesw_sup { };
-
-  shotcut = callPackage ../applications/video/shotcut { mlt = mlt-qt5; };
-
-  smplayer = callPackage ../applications/video/smplayer { };
-
-  sup = with rubyLibs; callPackage ../applications/networking/mailreaders/sup {
-    ruby = ruby19.override {
-      cursesSupport = true;
-    };
-
-    inherit gettext highline iconv locale lockfile
-      text trollop xapian_ruby which;
-
-    rmail_sup = ""; # missing
-    unicode = "";
-
-    # See https://github.com/NixOS/nixpkgs/issues/1804 and
-    # https://github.com/NixOS/nixpkgs/issues/2146
-    bundler = pkgs.lib.overrideDerivation pkgs.rubyLibs.bundler (
-      oldAttrs: {
-        dontPatchShebangs = 1;
-      }
-    );
-    chronic      = chronic;
-    gpgme        = ruby_gpgme;
-    mime_types   = mime_types;
-    ncursesw_sup = ruby_ncursesw_sup;
-    rake         = rake;
-  };
-
-  synfigstudio = callPackage ../applications/graphics/synfigstudio {
-    fontsConf = makeFontsConf { fontDirectories = [ freefont_ttf ]; };
-  };
-
-  sxhkd = callPackage ../applications/window-managers/sxhkd { };
-
-  msmtp = callPackage ../applications/networking/msmtp { };
-
-  imapfilter = callPackage ../applications/networking/mailreaders/imapfilter.nix {
-    lua = lua5;
- };
-
-  mupdf = callPackage ../applications/misc/mupdf { };
-
-  mypaint = callPackage ../applications/graphics/mypaint { };
-
-  mythtv = callPackage ../applications/video/mythtv { };
-
-  tvtime = callPackage ../applications/video/tvtime {
-    kernel = linux;
-  };
-
-  nano = callPackage ../applications/editors/nano { };
-
-  navipowm = callPackage ../applications/misc/navipowm { };
-
-  navit = callPackage ../applications/misc/navit { };
-
-  netbeans = callPackage ../applications/editors/netbeans { };
-
-  ncdu = callPackage ../tools/misc/ncdu { };
-
-  ncdc = callPackage ../applications/networking/p2p/ncdc { };
-
-  nedit = callPackage ../applications/editors/nedit {
-    motif = lesstif;
-  };
-
-  netsurfBrowser = netsurf.browser;
-  netsurf = recurseIntoAttrs (import ../applications/networking/browsers/netsurf { inherit pkgs; });
-
-  notmuch = callPackage ../applications/networking/mailreaders/notmuch {
-    # use emacsPackages.notmuch if you want emacs support
-    emacs = null;
-  };
-
-  nova = callPackage ../applications/virtualization/nova { };
-
-  novaclient = callPackage ../applications/virtualization/nova/client.nix { };
-
-  nspluginwrapper = callPackage ../applications/networking/browsers/mozilla-plugins/nspluginwrapper {};
-
-  nvi = callPackage ../applications/editors/nvi { };
-
-  nvpy = callPackage ../applications/editors/nvpy { };
-
-  obconf = callPackage ../tools/X11/obconf {
-    inherit (gnome) libglade;
-  };
-
-  ocrad = callPackage ../applications/graphics/ocrad { };
-
-  offrss = callPackage ../applications/networking/offrss { };
-
-  ogmtools = callPackage ../applications/video/ogmtools { };
-
-  omxplayer = callPackage ../applications/video/omxplayer { };
-
-  oneteam = callPackage ../applications/networking/instant-messengers/oneteam {};
-
-  openbox = callPackage ../applications/window-managers/openbox { };
-
-  openimageio = callPackage ../applications/graphics/openimageio { };
-
-  openjump = callPackage ../applications/misc/openjump { };
-
-  openscad = callPackage ../applications/graphics/openscad {};
-
-  opera = callPackage ../applications/networking/browsers/opera {
-    inherit (pkgs.kde4) kdelibs;
-  };
-
-  opusfile = callPackage ../applications/audio/opusfile { };
-
-  opusTools = callPackage ../applications/audio/opus-tools { };
-
-  pamixer = callPackage ../applications/audio/pamixer { };
-
-  pan = callPackage ../applications/networking/newsreaders/pan {
-    spellChecking = false;
-  };
-
-  panotools = callPackage ../applications/graphics/panotools { };
-
-  pavucontrol = callPackage ../applications/audio/pavucontrol { };
-
-  paraview = callPackage ../applications/graphics/paraview { };
-
-  pencil = callPackage ../applications/graphics/pencil { };
-
-  petrifoo = callPackage ../applications/audio/petrifoo {
-    inherit (gnome) libgnomecanvas;
-  };
-
-  pdftk = callPackage ../tools/typesetting/pdftk { };
-  pdfgrep  = callPackage ../tools/typesetting/pdfgrep { };
-
-  pianobar = callPackage ../applications/audio/pianobar { };
-
-  pianobooster = callPackage ../applications/audio/pianobooster { };
-
-  picard = callPackage ../applications/audio/picard { };
-
-  picocom = callPackage ../tools/misc/picocom { };
-
-  pidgin = callPackage ../applications/networking/instant-messengers/pidgin {
-    openssl = if config.pidgin.openssl or true then openssl else null;
-    gnutls = if config.pidgin.gnutls or false then gnutls else null;
-    libgcrypt = if config.pidgin.gnutls or false then libgcrypt else null;
-    startupnotification = libstartup_notification;
-  };
-
-  pidginlatex = callPackage ../applications/networking/instant-messengers/pidgin-plugins/pidgin-latex {
-    imagemagick = imagemagickBig;
-  };
-
-  pidginlatexSF = builderDefsPackage
-    (import ../applications/networking/instant-messengers/pidgin-plugins/pidgin-latex/pidgin-latex-sf.nix)
-    {
-      inherit pkgconfig pidgin texLive imagemagick which glib gtk;
-    };
-
-  pidginmsnpecan = callPackage ../applications/networking/instant-messengers/pidgin-plugins/msn-pecan { };
-
-  pidginotr = callPackage ../applications/networking/instant-messengers/pidgin-plugins/otr { };
-
-  pidginsipe = callPackage ../applications/networking/instant-messengers/pidgin-plugins/sipe { };
-
-  toxprpl = callPackage ../applications/networking/instant-messengers/pidgin-plugins/tox-prpl { };
-
-  pinfo = callPackage ../applications/misc/pinfo { };
-
-  pinta = callPackage ../applications/graphics/pinta {
-    gtksharp = gtksharp2;
-  };
-
-  pommed = callPackage ../os-specific/linux/pommed {
-    inherit (xorg) libXpm;
-  };
-
-  potrace = callPackage ../applications/graphics/potrace {};
-
-  posterazor = callPackage ../applications/misc/posterazor { };
-
-  pqiv = callPackage ../applications/graphics/pqiv { };
-
-  qiv = callPackage ../applications/graphics/qiv { };
-
-  # perhaps there are better apps for this task? It's how I had configured my preivous system.
-  # And I don't want to rewrite all rules
-  procmail = callPackage ../applications/misc/procmail { };
-
-  pstree = callPackage ../applications/misc/pstree { };
-
-  pulseview = callPackage ../applications/science/electronics/pulseview { };
-
-  puredata = callPackage ../applications/audio/puredata { };
-
-  pythonmagick = callPackage ../applications/graphics/PythonMagick { };
-
-  qbittorrent = callPackage ../applications/networking/p2p/qbittorrent { };
-
-  eiskaltdcpp = callPackage ../applications/networking/p2p/eiskaltdcpp { };
-
-  qemu = callPackage ../applications/virtualization/qemu { };
-
-  qmmp = callPackage ../applications/audio/qmmp { };
-
-  qsampler = callPackage ../applications/audio/qsampler { };
-
-  qsynth = callPackage ../applications/audio/qsynth { };
-
-  qtpfsgui = callPackage ../applications/graphics/qtpfsgui { };
-
-  qtractor = callPackage ../applications/audio/qtractor { };
-
-  quodlibet = callPackage ../applications/audio/quodlibet {
-    inherit (pythonPackages) mutagen;
-  };
-
-  quodlibet-with-gst-plugins = callPackage ../applications/audio/quodlibet {
-    inherit (pythonPackages) mutagen;
-    withGstPlugins = true;
-    gst_plugins_bad = null;
-  };
-
-  rakarrack = callPackage ../applications/audio/rakarrack {
-    inherit (xorg) libXpm libXft;
-    fltk = fltk13;
-  };
-
-  rapcad = callPackage ../applications/graphics/rapcad {};
-
-  rapidsvn = callPackage ../applications/version-management/rapidsvn { };
-
-  ratpoison = callPackage ../applications/window-managers/ratpoison { };
-
-  rawtherapee = callPackage ../applications/graphics/rawtherapee {
-    fftw = fftwSinglePrec;
-  };
-
-  rcs = callPackage ../applications/version-management/rcs { };
-
-  rdesktop = callPackage ../applications/networking/remote/rdesktop { };
-
-  recode = callPackage ../tools/text/recode { };
-
-  retroshare = callPackage ../applications/networking/p2p/retroshare {
-    qt = qt4;
-  };
-
-  retroshare06 = lowPrio (callPackage ../applications/networking/p2p/retroshare/0.6.nix {
-    qt = qt4;
-  });
-
-  rsync = callPackage ../applications/networking/sync/rsync {
-    enableACLs = !(stdenv.isDarwin || stdenv.isSunOS || stdenv.isFreeBSD);
-    enableCopyDevicesPatch = (config.rsync.enableCopyDevicesPatch or false);
-  };
-
-  rtl-sdr = callPackage ../applications/misc/rtl-sdr { };
-
-  rubyripper = callPackage ../applications/audio/rubyripper {};
-
-  rxvt = callPackage ../applications/misc/rxvt { };
-
-  # = urxvt
-  rxvt_unicode = callPackage ../applications/misc/rxvt_unicode {
-    perlSupport = true;
-    gdkPixbufSupport = true;
-    unicode3Support = true;
-  };
-
-  sakura = callPackage ../applications/misc/sakura {
-    inherit (gnome) vte;
-  };
-
-  sbagen = callPackage ../applications/misc/sbagen { };
-
-  scite = callPackage ../applications/editors/scite { };
-
-  scribus = callPackage ../applications/office/scribus {
-    inherit (gnome) libart_lgpl;
-  };
-
-  seafile-client = callPackage ../applications/networking/seafile-client { };
-
-  seeks = callPackage ../tools/networking/p2p/seeks {
-    opencv = opencv_2_1;
-  };
-
-  seg3d = callPackage ../applications/graphics/seg3d {
-    wxGTK = wxGTK28.override { unicode = false; };
-  };
-
-  seq24 = callPackage ../applications/audio/seq24 { };
-
-  setbfree = callPackage ../applications/audio/setbfree { };
-
-  sflphone = callPackage ../applications/networking/instant-messengers/sflphone {
-    gtk = gtk3;
-  };
-
-  siproxd = callPackage ../applications/networking/siproxd { };
-
-  skype = callPackage_i686 ../applications/networking/instant-messengers/skype { };
-
-  skype4pidgin = callPackage ../applications/networking/instant-messengers/pidgin-plugins/skype4pidgin { };
-
-  skype_call_recorder = callPackage ../applications/networking/instant-messengers/skype-call-recorder { };
-
-  slrn = callPackage ../applications/networking/newsreaders/slrn { };
-
-  spideroak = callPackage ../applications/networking/spideroak { };
-
-  ssvnc = callPackage ../applications/networking/remote/ssvnc { };
-
-  st = callPackage ../applications/misc/st {
-    conf = config.st.conf or null;
-  };
-
-  linuxstopmotion = callPackage ../applications/video/linuxstopmotion { };
-
-  sweethome3d = recurseIntoAttrs (  (callPackage ../applications/misc/sweethome3d { })
-                                 // (callPackage ../applications/misc/sweethome3d/editors.nix {
-                                      sweethome3dApp = sweethome3d.application;
-                                    })
-                                 );
-
-  sxiv = callPackage ../applications/graphics/sxiv { };
-
-  bittorrentSync = callPackage ../applications/networking/bittorrentsync { };
-
-  dropbox = callPackage ../applications/networking/dropbox { };
-
-  dropbox-cli = callPackage ../applications/networking/dropbox-cli { };
-
-  lightdm = callPackage ../applications/display-managers/lightdm { };
-
-  lightdm_gtk_greeter = callPackage ../applications/display-managers/lightdm-gtk-greeter { };
-
-  # slic3r 0.9.10b says: "Running Slic3r under Perl >= 5.16 is not supported nor recommended"
-  slic3r = callPackage ../applications/misc/slic3r {
-    perlPackages = perl514Packages;
-    perl = perl514;
-  };
-
-  curaengine = callPackage ../applications/misc/curaengine { };
-
-  cura = callPackage ../applications/misc/cura { };
-
-  printrun = callPackage ../applications/misc/printrun { };
-
-  slim = callPackage ../applications/display-managers/slim {
-    libpng = libpng12;
-  };
-
-  smartdeblur = callPackage ../applications/graphics/smartdeblur { };
-
-  snd = callPackage ../applications/audio/snd { };
-
-  shntool = callPackage ../applications/audio/shntool { };
-
-  sonic_visualiser = callPackage ../applications/audio/sonic-visualiser {
-    inherit (pkgs.vamp) vampSDK;
-    inherit (pkgs.xlibs) libX11;
-    fftw = pkgs.fftwSinglePrec;
-  };
-
-  sox = callPackage ../applications/misc/audio/sox { };
-
-  soxr = callPackage ../applications/misc/audio/soxr { };
-
-  spotify = callPackage ../applications/audio/spotify {
-    inherit (gnome) GConf;
-    libpng = libpng12;
-  };
-
-  libspotify = callPackage ../development/libraries/libspotify {
-    apiKey = config.libspotify.apiKey or null;
-  };
-
-  stalonetray = callPackage ../applications/window-managers/stalonetray {};
-
-  stp = callPackage ../applications/science/logic/stp {};
-
-  stumpwm = lispPackages.stumpwm;
-
-  sublime = callPackage ../applications/editors/sublime { };
-
-  sublime3 = lowPrio (callPackage ../applications/editors/sublime3 { });
-
-  subversion = callPackage ../applications/version-management/subversion/default.nix {
-    bdbSupport = true;
-    httpServer = false;
-    httpSupport = true;
-    pythonBindings = false;
-    perlBindings = false;
-    javahlBindings = false;
-    saslSupport = false;
-    httpd = apacheHttpd;
-    sasl = cyrus_sasl;
-  };
-
-  subversionClient = appendToName "client" (subversion.override {
-    bdbSupport = false;
-    perlBindings = true;
-    pythonBindings = true;
-  });
-
-  surf = callPackage ../applications/misc/surf {
-    webkit = webkitgtk2;
-  };
-
-  svk = perlPackages.SVK;
-
-  swh_lv2 = callPackage ../applications/audio/swh-lv2 { };
-
-  sylpheed = callPackage ../applications/networking/mailreaders/sylpheed {
-    sslSupport = true;
-    gpgSupport = true;
-  };
-
-  symlinks = callPackage ../tools/system/symlinks { };
-
-  syncthing = callPackage ../applications/networking/syncthing { };
-
-  # linux only by now
-  synergy = callPackage ../applications/misc/synergy { };
-
-  tabbed = callPackage ../applications/window-managers/tabbed { };
-
-  tahoelafs = callPackage ../tools/networking/p2p/tahoe-lafs {
-    inherit (pythonPackages) twisted foolscap simplejson nevow zfec
-      pycryptopp sqlite3 darcsver setuptoolsTrial setuptoolsDarcs
-      numpy pyasn1 mock;
-  };
-
-  tailor = builderDefsPackage (import ../applications/version-management/tailor) {
-    inherit makeWrapper python;
-  };
-
-  tangogps = callPackage ../applications/misc/tangogps {
-    gconf = gnome.GConf;
-  };
-
-  teamspeak_client = callPackage ../applications/networking/instant-messengers/teamspeak/client.nix { };
-  teamspeak_server = callPackage ../applications/networking/instant-messengers/teamspeak/server.nix { };
-
-  taskjuggler = callPackage ../applications/misc/taskjuggler { };
-
-  taskwarrior = callPackage ../applications/misc/taskwarrior { };
-
-  taskserver = callPackage ../servers/misc/taskserver { };
-
-  telegram-cli = callPackage ../applications/networking/instant-messengers/telegram-cli/default.nix { };
-
-  telepathy_gabble = callPackage ../applications/networking/instant-messengers/telepathy/gabble { };
-
-  telepathy_haze = callPackage ../applications/networking/instant-messengers/telepathy/haze {};
-
-  telepathy_logger = callPackage ../applications/networking/instant-messengers/telepathy/logger {};
-
-  telepathy_mission_control = callPackage ../applications/networking/instant-messengers/telepathy/mission-control { };
-
-  telepathy_rakia = callPackage ../applications/networking/instant-messengers/telepathy/rakia { };
-
-  telepathy_salut = callPackage ../applications/networking/instant-messengers/telepathy/salut {};
-
-  terminator = callPackage ../applications/misc/terminator {
-    vte = gnome.vte.override { pythonSupport = true; };
-    inherit (pythonPackages) notify;
-  };
-
-  tesseract = callPackage ../applications/graphics/tesseract { };
-
-  thinkingRock = callPackage ../applications/misc/thinking-rock { };
-
-  thunderbird = callPackage ../applications/networking/mailreaders/thunderbird {
-    inherit (gnome) libIDL;
-    inherit (pythonPackages) pysqlite;
-    libpng = libpng_apng;
-  };
-
-  thunderbird-bin = callPackage ../applications/networking/mailreaders/thunderbird-bin {
-    gconf = pkgs.gnome.GConf;
-    inherit (pkgs.gnome) libgnome libgnomeui;
-    inherit (pkgs.xlibs) libX11 libXScrnSaver libXext
-      libXinerama libXrender libXt;
-  };
-
-  tig = gitAndTools.tig;
-
-  timidity = callPackage ../tools/misc/timidity { };
-
-  tint2 = callPackage ../applications/misc/tint2 { };
-
-  tkcvs = callPackage ../applications/version-management/tkcvs { };
-
-  tla = callPackage ../applications/version-management/arch { };
-
-  todo-txt-cli = callPackage ../applications/office/todo.txt-cli { };
-
-  torchat = callPackage ../applications/networking/instant-messengers/torchat {
-    wrapPython = pythonPackages.wrapPython;
-  };
-
-  toxic = callPackage ../applications/networking/instant-messengers/toxic { };
-
-  transcode = callPackage ../applications/audio/transcode { };
-
-  transmission = callPackage ../applications/networking/p2p/transmission { };
-  transmission_gtk = transmission.override { enableGTK3 = true; };
-
-  transmission_remote_gtk = callPackage ../applications/networking/p2p/transmission-remote-gtk {};
-
-  trayer = callPackage ../applications/window-managers/trayer { };
-
-  tree = callPackage ../tools/system/tree {};
-
-  tribler = callPackage ../applications/networking/p2p/tribler { };
-
-  twister = callPackage ../applications/networking/p2p/twister { };
-
-  twmn = callPackage ../applications/misc/twmn { };
-
-  twinkle = callPackage ../applications/networking/instant-messengers/twinkle { };
-
-  umurmur = callPackage ../applications/networking/umurmur { };
-
-  unison = callPackage ../applications/networking/sync/unison {
-    inherit (ocamlPackages) lablgtk;
-    enableX11 = config.unison.enableX11 or true;
-  };
-
-  uucp = callPackage ../tools/misc/uucp { };
-
-  uvccapture = callPackage ../applications/video/uvccapture { };
-
-  uwimap = callPackage ../tools/networking/uwimap { };
-
-  uzbl = callPackage ../applications/networking/browsers/uzbl {
-    webkit = webkitgtk2;
-  };
-
-  uTox = callPackage ../applications/networking/instant-messengers/utox { };
-
-  vanitygen = callPackage ../applications/misc/vanitygen { };
-
-  vbindiff = callPackage ../applications/editors/vbindiff { };
-
-  vcprompt = callPackage ../applications/version-management/vcprompt { };
-
-  vdpauinfo = callPackage ../tools/X11/vdpauinfo { };
-
-  veracity = callPackage ../applications/version-management/veracity {};
-
-  viewMtn = builderDefsPackage (import ../applications/version-management/viewmtn/0.10.nix)
-  {
-    inherit monotone cheetahTemplate highlight ctags
-      makeWrapper graphviz which python;
-    flup = pythonPackages.flup;
-  };
-
-  vim = callPackage ../applications/editors/vim { };
-
-  macvim = callPackage ../applications/editors/vim/macvim.nix { };
-
-  vimHugeX = vim_configurable;
-
-  vim_configurable = callPackage ../applications/editors/vim/configurable.nix {
-    inherit (pkgs) fetchurl fetchhg stdenv ncurses pkgconfig gettext
-      composableDerivation lib config glib gtk python perl tcl ruby;
-    inherit (pkgs.xlibs) libX11 libXext libSM libXpm libXt libXaw libXau libXmu
-      libICE;
-
-    features = "huge"; # one of  tiny, small, normal, big or huge
-    lua = pkgs.lua5;
-    gui = config.vim.gui or "auto";
-
-    # optional features by flags
-    flags = [ "python" "X11" ]; # only flag "X11" by now
-
-    # so that we can use gccApple if we're building on darwin
-    inherit stdenvAdapters gccApple;
-  };
-
-  vimNox = lowPrio (vim_configurable.override { source = "vim-nox"; });
-
-  qvim = lowPrio (callPackage ../applications/editors/vim/qvim.nix {
-    inherit (pkgs) fetchgit stdenv ncurses pkgconfig gettext
-      composableDerivation lib config python perl tcl ruby qt4;
-    inherit (pkgs.xlibs) libX11 libXext libSM libXpm libXt libXaw libXau libXmu
-      libICE;
-
-    inherit (pkgs) stdenvAdapters gccApple;
-
-    features = "huge"; # one of  tiny, small, normal, big or huge
-    lua = pkgs.lua5;
-    flags = [ "python" "X11" ]; # only flag "X11" by now
-  });
-
-  vimpc = callPackage ../applications/audio/vimpc { };
-
-  virtviewer = callPackage ../applications/virtualization/virt-viewer {
-    gtkvnc = gtkvnc.override { enableGTK3 = true; };
-    spice_gtk = spice_gtk.override { enableGTK3 = true; };
-  };
-  virtmanager = callPackage ../applications/virtualization/virt-manager {
-    inherit (gnome) gnome_python;
-    vte = gnome3.vte;
-    dconf = gnome3.dconf;
-    gtkvnc = gtkvnc.override { enableGTK3 = true; };
-    spice_gtk = spice_gtk.override { enableGTK3 = true; };
-  };
-
-  virtinst = callPackage ../applications/virtualization/virtinst {};
-
-  virtualgl = callPackage ../tools/X11/virtualgl { };
-
-  bumblebee = callPackage ../tools/X11/bumblebee { };
-
-  vkeybd = callPackage ../applications/audio/vkeybd {
-    inherit (xlibs) libX11;
-  };
-
-  vlc = callPackage ../applications/video/vlc { };
-
-  vmpk = callPackage ../applications/audio/vmpk { };
-
-  vnstat = callPackage ../applications/networking/vnstat { };
-
-  vorbisTools = callPackage ../applications/audio/vorbis-tools { };
-
-  vue = callPackage ../applications/misc/vue {
-    jre = icedtea7_jre;
-  };
-
-  vwm = callPackage ../applications/window-managers/vwm { };
-
-  vym = callPackage ../applications/misc/vym { };
-
-  w3m = callPackage ../applications/networking/browsers/w3m {
-    graphicsSupport = false;
-  };
-
-  weechat = callPackage ../applications/networking/irc/weechat { };
-
-  weechatDevel = lowPrio (callPackage ../applications/networking/irc/weechat/devel.nix { });
-
-  weston = callPackage ../applications/window-managers/weston { };
-
-  windowmaker = callPackage ../applications/window-managers/windowmaker { };
-
-  winswitch = callPackage ../tools/X11/winswitch { };
-
-  wings = callPackage ../applications/graphics/wings {
-    erlang = erlangR14;
-    esdl = esdl.override { erlang = erlangR14; };
-  };
-
-  wmname = callPackage ../applications/misc/wmname { };
-
-  wmctrl = callPackage ../tools/X11/wmctrl { };
-
-  # I'm keen on wmiimenu only  >wmii-3.5 no longer has it...
-  wmiimenu = import ../applications/window-managers/wmii31 {
-    libixp = libixp_for_wmii;
-    inherit fetchurl /* fetchhg */ stdenv gawk;
-    inherit (xlibs) libX11;
-  };
-
-  wmiiSnap = import ../applications/window-managers/wmii {
-    libixp = libixp_for_wmii;
-    inherit fetchurl /* fetchhg */ stdenv gawk;
-    inherit (xlibs) libX11 xextproto libXt libXext;
-    includeUnpack = config.stdenv.includeUnpack or false;
-  };
-
-  wordnet = callPackage ../applications/misc/wordnet { };
-
-  wrapChromium = browser: wrapFirefox {
-    inherit browser;
-    browserName = browser.packageName;
-    desktopName = "Chromium";
-    icon = "${browser}/share/icons/hicolor/48x48/apps/${browser.packageName}.png";
-  };
-
-  wrapFirefox =
-    { browser, browserName ? "firefox", desktopName ? "Firefox", nameSuffix ? ""
-    , icon ? "${browser}/lib/${browser.name}/browser/icons/mozicon128.png" }:
-    let
-      cfg = stdenv.lib.attrByPath [ browserName ] {} config;
-      enableAdobeFlash = cfg.enableAdobeFlash or false;
-      enableGnash = cfg.enableGnash or false;
-    in
-    import ../applications/networking/browsers/firefox/wrapper.nix {
-      inherit stdenv lib makeWrapper makeDesktopItem browser browserName desktopName nameSuffix icon;
-      plugins =
-         assert !(enableGnash && enableAdobeFlash);
-         ([ ]
-          ++ lib.optional enableGnash gnash
-          ++ lib.optional enableAdobeFlash flashplayer
-          ++ lib.optional (cfg.enableDjvu or false) (djview4)
-          ++ lib.optional (cfg.enableMPlayer or false) (MPlayerPlugin browser)
-          ++ lib.optional (cfg.enableGeckoMediaPlayer or false) gecko_mediaplayer
-          ++ lib.optional (supportsJDK && cfg.jre or false && jrePlugin ? mozillaPlugin) jrePlugin
-          ++ lib.optional (cfg.enableGoogleTalkPlugin or false) google_talk_plugin
-          ++ lib.optional (cfg.enableFriBIDPlugin or false) fribid
-          ++ lib.optional (cfg.enableGnomeExtensions or false) gnome3.gnome_shell
-         );
-      libs = [ gstreamer gst_plugins_base ] ++ lib.optionals (cfg.enableQuakeLive or false)
-             (with xlibs; [ stdenv.gcc libX11 libXxf86dga libXxf86vm libXext libXt alsaLib zlib ]);
-      gtk_modules = [ libcanberra ];
-    };
-
-  x11vnc = callPackage ../tools/X11/x11vnc { };
-
-  x2vnc = callPackage ../tools/X11/x2vnc { };
-
-  xaos = builderDefsPackage (import ../applications/graphics/xaos) {
-    inherit (xlibs) libXt libX11 libXext xextproto xproto;
-    inherit gsl aalib zlib intltool gettext perl;
-    libpng = libpng12;
-  };
-
-  xara = callPackage ../applications/graphics/xara { };
-
-  xawtv = callPackage ../applications/video/xawtv { };
-
-  xbindkeys = callPackage ../tools/X11/xbindkeys { };
-
-  xbmc = callPackage ../applications/video/xbmc {
-    ffmpeg = ffmpeg_1;
-  };
-
-  xca = callPackage ../applications/misc/xca { };
-
-  xcalib = callPackage ../tools/X11/xcalib { };
-
-  xcape = callPackage ../tools/X11/xcape { };
-
-  xchainkeys = callPackage ../tools/X11/xchainkeys { };
-
-  xchat = callPackage ../applications/networking/irc/xchat { };
-
-  xchm = callPackage ../applications/misc/xchm { };
-
-  xcompmgr = callPackage ../applications/window-managers/xcompmgr { };
-
-  compton = callPackage ../applications/window-managers/compton { };
-
-  xdaliclock = callPackage ../tools/misc/xdaliclock {};
-
-  xdg-user-dirs = callPackage ../tools/X11/xdg-user-dirs { };
-
-  xdg_utils = callPackage ../tools/X11/xdg-utils { };
-
-  xdotool = callPackage ../tools/X11/xdotool { };
-
-  xen = callPackage ../applications/virtualization/xen {
-    stdenv = overrideGCC stdenv gcc45;
-  };
-
-  xfe = callPackage ../applications/misc/xfe {
-    fox = fox_1_6;
-  };
-
-  xfig = callPackage ../applications/graphics/xfig { };
-
-  xineUI = callPackage ../applications/video/xine-ui { };
-
-  xneur_0_13 = callPackage ../applications/misc/xneur { };
-
-  xneur_0_8 = callPackage ../applications/misc/xneur/0.8.nix { };
-
-  xneur = xneur_0_13;
-
-  gxneur = callPackage ../applications/misc/gxneur  {
-    inherit (gnome) libglade GConf;
-  };
-
-  xournal = callPackage ../applications/graphics/xournal {
-    inherit (gnome) libgnomeprint libgnomeprintui libgnomecanvas;
-  };
-
-  xpdf = callPackage ../applications/misc/xpdf {
-    motif = lesstif;
-    base14Fonts = "${ghostscript}/share/ghostscript/fonts";
-  };
-
-  xkb_switch = callPackage ../tools/X11/xkb-switch { };
-
-  libxpdf = callPackage ../applications/misc/xpdf/libxpdf.nix { };
-
-  xpra = callPackage ../tools/X11/xpra { };
-
-  xrestop = callPackage ../tools/X11/xrestop { };
-
-  xscreensaver = callPackage ../misc/screensavers/xscreensaver {
-    inherit (gnome) libglade;
-  };
-
-  xsynth_dssi = callPackage ../applications/audio/xsynth-dssi { };
-
-  xterm = callPackage ../applications/misc/xterm { };
-
-  finalterm = callPackage ../applications/misc/finalterm { };
-
-  xtrace = callPackage ../tools/X11/xtrace { };
-
-  xlaunch = callPackage ../tools/X11/xlaunch { };
-
-  xmacro = callPackage ../tools/X11/xmacro { };
-
-  xmove = callPackage ../applications/misc/xmove { };
-
-  xmp = callPackage ../applications/audio/xmp { };
-
-  xnee = callPackage ../tools/X11/xnee {
-    # Work around "missing separator" error.
-    stdenv = overrideInStdenv stdenv [ gnumake381 ];
-  };
-
-  xvidcap = callPackage ../applications/video/xvidcap {
-    inherit (gnome) scrollkeeper libglade;
-  };
-
-  yate = callPackage ../applications/misc/yate { };
-
-  inherit (gnome3) yelp;
-
-  qgis = callPackage ../applications/misc/qgis {};
-
-  qtbitcointrader = callPackage ../applications/misc/qtbitcointrader { };
-
-  ykpers = callPackage ../applications/misc/ykpers {};
-
-  yoshimi = callPackage ../applications/audio/yoshimi {
-    fltk = fltk13;
-  };
-
-  zathuraCollection = recurseIntoAttrs
-    (let callPackage = newScope pkgs.zathuraCollection; in
-      import ../applications/misc/zathura {
-        inherit callPackage pkgs fetchurl;
-        useMupdf = config.zathura.useMupdf or false;
-      });
-
-  zathura = zathuraCollection.zathuraWrapper;
-
-  zed = callPackage ../applications/editors/zed { };
-
-  zeroc_ice = callPackage ../development/libraries/zeroc-ice { };
-
-  girara = callPackage ../applications/misc/girara {
-    gtk = gtk3;
-  };
-
-  zgrviewer = callPackage ../applications/graphics/zgrviewer {};
-
-  zotero = callPackage ../applications/office/zotero {
-    xulrunner = xulrunner_30;
-  };
-
-  zynaddsubfx = callPackage ../applications/audio/zynaddsubfx { };
-
-
-  ### GAMES
-
-  alienarena = callPackage ../games/alienarena { };
-
-  andyetitmoves = if stdenv.isLinux then callPackage ../games/andyetitmoves {} else null;
-
-  anki = callPackage ../games/anki { };
-
-  asc = callPackage ../games/asc {
-    lua = lua5;
-    libsigcxx = libsigcxx12;
-  };
-
-  astromenace = callPackage ../games/astromenace { };
-
-  atanks = callPackage ../games/atanks {};
-
-  ballAndPaddle = callPackage ../games/ball-and-paddle {
-    guile = guile_1_8;
-  };
-
-  bitsnbots = callPackage ../games/bitsnbots {
-    lua = lua5;
-  };
-
-  blackshades = callPackage ../games/blackshades { };
-
-  blackshadeselite = callPackage ../games/blackshadeselite { };
-
-  blobby = callPackage ../games/blobby { };
-
-  bsdgames = callPackage ../games/bsdgames { };
-
-  btanks = callPackage ../games/btanks { };
-
-  bzflag = callPackage ../games/bzflag { };
-
-  castle_combat = callPackage ../games/castle-combat { };
-
-  chessdb = callPackage ../games/chessdb { };
-
-  construoBase = lowPrio (callPackage ../games/construo {
-    mesa = null;
-    freeglut = null;
-  });
-
-  construo = construoBase.override {
-    inherit mesa freeglut;
-  };
-
-  crack_attack = callPackage ../games/crack-attack { };
-
-  crafty = callPackage ../games/crafty { };
-  craftyFull = appendToName "full" (crafty.override { fullVariant = true; });
-
-  crrcsim = callPackage ../games/crrcsim {};
-
-  dhewm3 = callPackage ../games/dhewm3 {};
-
-  drumkv1 = callPackage ../applications/audio/drumkv1 { };
-
-  dwarf_fortress = callPackage_i686 ../games/dwarf-fortress {
-    SDL_image = pkgsi686Linux.SDL_image.override {
-      libpng = pkgsi686Linux.libpng12;
-    };
-  };
-
-  dwarf_fortress_2014 = callPackage_i686 ../games/dwarf-fortress/df2014.nix {
-    SDL_image = pkgsi686Linux.SDL_image.override {
-      libpng = pkgsi686Linux.libpng12;
-    };
-  };
-
-  dwarf_fortress_modable = appendToName "moddable" (dwarf_fortress.override {
-    copyDataDirectory = true;
-  });
-
-  dwarf_fortress_2014_modable = appendToName "moddable" (dwarf_fortress_2014.override {
-    copyDataDirectory = true;
-  });
-
-  dwarf-therapist = callPackage ../games/dwarf-therapist { };
-
-  d1x_rebirth = callPackage ../games/d1x-rebirth { };
-
-  d2x_rebirth = callPackage ../games/d2x-rebirth { };
-
-  eboard = callPackage ../games/eboard { };
-
-  eduke32 = callPackage ../games/eduke32 { };
-
-  egoboo = callPackage ../games/egoboo { };
-
-  exult = callPackage ../games/exult { };
-
-  flightgear = callPackage ../games/flightgear { };
-
-  freeciv = callPackage ../games/freeciv { };
-
-  freeciv_gtk = callPackage ../games/freeciv {
-    gtkClient = true;
-    sdlClient = false;
-  };
-
-  freedink = callPackage ../games/freedink { };
-
-  fsg = callPackage ../games/fsg {
-    wxGTK = wxGTK28.override { unicode = false; };
-  };
-
-  gemrb = callPackage ../games/gemrb { };
-
-  gl117 = callPackage ../games/gl-117 {};
-
-  glestae = callPackage ../games/glestae {};
-
-  globulation2 = callPackage ../games/globulation {};
-
-  gltron = callPackage ../games/gltron { };
-
-  gnuchess = callPackage ../games/gnuchess { };
-
-  gnugo = callPackage ../games/gnugo { };
-
-  gparted = callPackage ../tools/misc/gparted { };
-
-  gsmartcontrol = callPackage ../tools/misc/gsmartcontrol {
-    inherit (gnome) libglademm;
-  };
-
-  gtypist = callPackage ../games/gtypist { };
-
-  hexen = callPackage ../games/hexen { };
-
-  icbm3d = callPackage ../games/icbm3d { };
-
-  ingen = callPackage ../applications/audio/ingen { };
-
-  instead = callPackage ../games/instead {
-    lua = lua5;
-  };
-
-  kobodeluxe = callPackage ../games/kobodeluxe { };
-
-  lincity = builderDefsPackage (import ../games/lincity) {
-    inherit (xlibs) libX11 libXext xextproto
-      libICE libSM xproto;
-    inherit libpng zlib;
-  };
-
-  lincity_ng = callPackage ../games/lincity/ng.nix {};
-
-  mars = callPackage ../games/mars { };
-
-  micropolis = callPackage ../games/micropolis { };
-
-  mnemosyne = callPackage ../games/mnemosyne {
-    inherit (pythonPackages) matplotlib cherrypy sqlite3;
-  };
-
-  naev = callPackage ../games/naev { };
-
-  nexuiz = callPackage ../games/nexuiz { };
-
-  njam = callPackage ../games/njam { };
-
-  oilrush = callPackage ../games/oilrush { };
-
-  openra = callPackage ../games/openra { };
-
-  openttd = callPackage ../games/openttd {
-    zlib = zlibStatic;
-  };
-
-  opentyrian = callPackage ../games/opentyrian { };
-
-  openxcom = callPackage ../games/openxcom { };
-
-  pingus = callPackage ../games/pingus {};
-
-  pioneers = callPackage ../games/pioneers { };
-
-  pong3d = callPackage ../games/pong3d { };
-
-  prboom = callPackage ../games/prboom { };
-
-  quake3demo = callPackage ../games/quake3/wrapper {
-    name = "quake3-demo-${quake3game.name}";
-    description = "Demo of Quake 3 Arena, a classic first-person shooter";
-    game = quake3game;
-    paks = [quake3demodata];
-  };
-
-  quake3demodata = callPackage ../games/quake3/demo { };
-
-  quake3game = callPackage ../games/quake3/game { };
-
-  quantumminigolf = callPackage ../games/quantumminigolf {};
-
-  racer = callPackage ../games/racer { };
-
-  residualvm = callPackage ../games/residualvm {
-    openglSupport = mesaSupported;
-  };
-
-  rigsofrods = callPackage ../games/rigsofrods {
-    mygui = myguiSvn;
-  };
-
-  rili = callPackage ../games/rili { };
-
-  rogue = callPackage ../games/rogue { };
-
-  samplv1 = callPackage ../applications/audio/samplv1 { };
-
-  sauerbraten = callPackage ../games/sauerbraten {};
-
-  scid = callPackage ../games/scid { };
-
-  scummvm = callPackage ../games/scummvm { };
-
-  scorched3d = callPackage ../games/scorched3d { };
-
-  sdlmame = callPackage ../games/sdlmame { };
-
-  sgtpuzzles = builderDefsPackage (import ../games/sgt-puzzles) {
-    inherit pkgconfig fetchsvn perl gtk;
-    inherit (xlibs) libX11;
-  };
-
-  simutrans = callPackage ../games/simutrans { };
-
-  soi = callPackage ../games/soi {};
-
-  # You still can override by passing more arguments.
-  spaceOrbit = callPackage ../games/orbit { };
-
-  spring = callPackage ../games/spring { };
-
-  springLobby = callPackage ../games/spring/springlobby.nix { };
-
-  stardust = callPackage ../games/stardust {};
-
-  steam = callPackage_i686 ../games/steam {};
-
-  steamChrootEnv = callPackage_i686 ../games/steam/chrootenv.nix {
-    zenity = gnome2.zenity;
-  };
-
-  stuntrally = callPackage ../games/stuntrally { };
-
-  superTux = callPackage ../games/super-tux { };
-
-  superTuxKart = callPackage ../games/super-tux-kart { };
-
-  synthv1 = callPackage ../applications/audio/synthv1 { };
-
-  tbe = callPackage ../games/the-butterfly-effect {};
-
-  teetertorture = callPackage ../games/teetertorture { };
-
-  teeworlds = callPackage ../games/teeworlds { };
-
-  tennix = callPackage ../games/tennix { };
-
-  tibia = callPackage ../games/tibia { };
-
-  tintin = callPackage ../games/tintin { };
-
-  tpm = callPackage ../games/thePenguinMachine { };
-
-  tremulous = callPackage ../games/tremulous { };
-
-  speed_dreams = callPackage ../games/speed-dreams {
-    # Torcs wants to make shared libraries linked with plib libraries (it provides static).
-    # i686 is the only platform I know than can do that linking without plib built with -fPIC
-    plib = plib.override { enablePIC = !stdenv.isi686; };
-    libpng = libpng12;
-  };
-
-  torcs = callPackage ../games/torcs {
-    # Torcs wants to make shared libraries linked with plib libraries (it provides static).
-    # i686 is the only platform I know than can do that linking without plib built with -fPIC
-    plib = plib.override { enablePIC = !stdenv.isi686; };
-  };
-
-  trigger = callPackage ../games/trigger { };
-
-  typespeed = callPackage ../games/typespeed { };
-
-  ufoai = callPackage ../games/ufoai { };
-
-  ultimatestunts = callPackage ../games/ultimatestunts { };
-
-  ultrastardx = callPackage ../games/ultrastardx {
-    ffmpeg = ffmpeg_0_6;
-    lua = lua5;
-  };
-
-  unvanquished = callPackage ../games/unvanquished { };
-
-  uqm = callPackage ../games/uqm { };
-
-  urbanterror = callPackage ../games/urbanterror { };
-
-  ut2004demo = callPackage ../games/ut2004demo { };
-
-  vdrift = callPackage ../games/vdrift { };
-
-  vectoroids = callPackage ../games/vectoroids { };
-
-  vessel = callPackage_i686 ../games/vessel { };
-
-  warmux = callPackage ../games/warmux { };
-
-  warsow = callPackage ../games/warsow {
-    libjpeg = libjpeg62;
-  };
-
-  warzone2100 = callPackage ../games/warzone2100 { };
-
-  widelands = callPackage ../games/widelands {
-    lua = lua5_1;
-  };
-
-  worldofgoo_demo = callPackage ../games/worldofgoo {
-    demo = true;
-  };
-
-  worldofgoo = callPackage ../games/worldofgoo { };
-
-  xboard =  callPackage ../games/xboard { };
-
-  xconq = callPackage ../games/xconq {};
-
-  # TODO: the corresponding nix file is missing
-  # xracer = callPackage ../games/xracer { };
-
-  xonotic = callPackage ../games/xonotic { };
-
-  xskat = callPackage ../games/xskat { };
-
-  xsokoban = builderDefsPackage (import ../games/xsokoban) {
-    inherit (xlibs) libX11 xproto libXpm libXt;
-  };
-
-  zdoom = callPackage ../games/zdoom { };
-
-  zod = callPackage ../games/zod { };
-
-  zoom = callPackage ../games/zoom { };
-
-  keen4 = callPackage ../games/keen4 { };
-
-  zeroad = callPackage ../games/0ad { };
-
-  ### DESKTOP ENVIRONMENTS
-
-  cinnamon = recurseIntoAttrs rec {
-    callPackage = newScope pkgs.cinnamon;
-    inherit (gnome3) gnome_common libgnomekbd gnome-menus zenity;
-
-    muffin = callPackage ../desktops/cinnamon/muffin.nix { } ;
-
-    cinnamon-control-center = callPackage ../desktops/cinnamon/cinnamon-control-center.nix{ };
-
-    cinnamon-settings-daemon = callPackage ../desktops/cinnamon/cinnamon-settings-daemon.nix{ };
-
-    cinnamon-session = callPackage ../desktops/cinnamon/cinnamon-session.nix{ } ;
-
-    cinnamon-desktop = callPackage ../desktops/cinnamon/cinnamon-desktop.nix { };
-
-    cinnamon-translations = callPackage ../desktops/cinnamon/cinnamon-translations.nix { };
-
-    cjs = callPackage ../desktops/cinnamon/cjs.nix { };
-  };
-
-  enlightenment = callPackage ../desktops/enlightenment { };
-
-  e17 = recurseIntoAttrs (
-    let callPackage = newScope pkgs.e17; in
-    import ../desktops/e17 { inherit callPackage pkgs; }
-  );
-
-  e18 = recurseIntoAttrs (
-    let callPackage = newScope pkgs.e18; in
-    import ../desktops/e18 { inherit callPackage pkgs; }
-  );
-
-  gnome2 = callPackage ../desktops/gnome-2 {
-    callPackage = pkgs.newScope pkgs.gnome2;
-    self = pkgs.gnome2;
-  }  // pkgs.gtkLibs // {
-    # Backwards compatibility;
-    inherit (pkgs) libsoup libwnck gtk_doc gnome_doc_utils;
-  };
-
-  gnome3 = recurseIntoAttrs (callPackage ../desktops/gnome-3/3.10 {
-    callPackage = pkgs.newScope pkgs.gnome3;
-    self = pkgs.gnome3;
-  });
-
-  gnome3_12 = recurseIntoAttrs (callPackage ../desktops/gnome-3/3.12 {
-    callPackage = pkgs.newScope pkgs.gnome3_12;
-  });
-
-  gnome = recurseIntoAttrs gnome2;
-
-  hsetroot = callPackage ../tools/X11/hsetroot { };
-
-  kakasi = callPackage ../tools/text/kakasi { };
-
-  kde4 = recurseIntoAttrs pkgs.kde412;
-
-  kde4_next = recurseIntoAttrs( lib.lowPrioSet pkgs.kde412 );
-
-  kde412 = kdePackagesFor (pkgs.kde412 // {
-      eigen = eigen2;
-      libusb = libusb1;
-      libcanberra = libcanberra_kde;
-    }) ../desktops/kde-4.12;
-
-  kdePackagesFor = self: dir:
-    let callPackageOrig = callPackage; in
-    let
-      callPackage = newScope self;
-      kde4 = callPackageOrig dir {
-        inherit callPackage callPackageOrig;
-      };
-    in kde4 // {
-      inherit kde4;
-
-      wrapper = callPackage ../build-support/kdewrapper {};
-
-      recurseForRelease = true;
-
-      akunambol = callPackage ../applications/networking/sync/akunambol { };
-
-      amarok = callPackage ../applications/audio/amarok { };
-
-      bangarang = callPackage ../applications/video/bangarang { };
-
-      basket = callPackage ../applications/office/basket { };
-
-      bluedevil = callPackage ../tools/bluetooth/bluedevil { };
-
-      calligra = callPackage ../applications/office/calligra { };
-
-      colord-kde = callPackage ../tools/misc/colord-kde { };
-
-      digikam = if builtins.compareVersions "4.9" kde4.release == 1 then
-          callPackage ../applications/graphics/digikam/2.nix { }
-        else
-          callPackage ../applications/graphics/digikam { };
-
-      eventlist = callPackage ../applications/office/eventlist {};
-
-      k3b = callPackage ../applications/misc/k3b { };
-
-      kadu = callPackage ../applications/networking/instant-messengers/kadu { };
-
-      kbibtex = callPackage ../applications/office/kbibtex { };
-
-      kde_gtk_config = callPackage ../tools/misc/kde-gtk-config { };
-
-      kde_wacomtablet = callPackage ../applications/misc/kde-wacomtablet { };
-
-      kdeconnect = callPackage ../applications/misc/kdeconnect { };
-
-      kdenlive = callPackage ../applications/video/kdenlive { mlt = mlt-qt4; };
-
-      kdesvn = callPackage ../applications/version-management/kdesvn { };
-
-      kdevelop = callPackage ../applications/editors/kdevelop { };
-
-      kdevplatform = callPackage ../development/libraries/kdevplatform { };
-
-      kdiff3 = callPackage ../tools/text/kdiff3 { };
-
-      kile = callPackage ../applications/editors/kile { };
-
-      kmplayer = callPackage ../applications/video/kmplayer { };
-
-      kmymoney = callPackage ../applications/office/kmymoney { };
-
-      kipi_plugins = callPackage ../applications/graphics/kipi-plugins { };
-
-      konversation = callPackage ../applications/networking/irc/konversation { };
-
-      kvirc = callPackage ../applications/networking/irc/kvirc { };
-
-      krename = callPackage ../applications/misc/krename { };
-
-      krusader = callPackage ../applications/misc/krusader { };
-
-      ksshaskpass = callPackage ../tools/security/ksshaskpass {};
-
-      ktorrent = callPackage ../applications/networking/p2p/ktorrent { };
-
-      kuickshow = callPackage ../applications/graphics/kuickshow { };
-
-      libalkimia = callPackage ../development/libraries/libalkimia { };
-
-      libktorrent = callPackage ../development/libraries/libktorrent { };
-
-      libkvkontakte = callPackage ../development/libraries/libkvkontakte { };
-
-      liblikeback = callPackage ../development/libraries/liblikeback { };
-
-      libmm-qt = callPackage ../development/libraries/libmm-qt { };
-
-      libnm-qt = callPackage ../development/libraries/libnm-qt { };
-
-      networkmanagement = callPackage ../tools/networking/networkmanagement { };
-
-      partitionManager = callPackage ../tools/misc/partition-manager { };
-
-      plasma-nm = callPackage ../tools/networking/plasma-nm { };
-
-      polkit_kde_agent = callPackage ../tools/security/polkit-kde-agent { };
-
-      psi = callPackage ../applications/networking/instant-messengers/psi { };
-
-      qtcurve = callPackage ../misc/themes/qtcurve { };
-
-      quassel = callPackage ../applications/networking/irc/quassel { dconf = gnome3.dconf; };
-
-      quasselWithoutKDE = (self.quassel.override {
-        withKDE = false;
-        tag = "-without-kde";
-      });
-
-      quasselDaemon = (self.quassel.override {
-        monolithic = false;
-        daemon = true;
-        tag = "-daemon";
-      });
-
-      quasselClient = (self.quassel.override {
-        monolithic = false;
-        client = true;
-        tag = "-client";
-      });
-
-      quasselClientWithoutKDE = (self.quasselClient.override {
-        withKDE = false;
-        tag = "-client-without-kde";
-      });
-
-      rekonq = callPackage ../applications/networking/browsers/rekonq { };
-
-      kwebkitpart = callPackage ../applications/networking/browsers/kwebkitpart { };
-
-      rsibreak = callPackage ../applications/misc/rsibreak { };
-
-      semnotes = callPackage ../applications/misc/semnotes { };
-
-      skrooge = callPackage ../applications/office/skrooge { };
-
-      telepathy = callPackage ../applications/networking/instant-messengers/telepathy/kde {};
-
-      yakuake = callPackage ../applications/misc/yakuake { };
-
-      zanshin = callPackage ../applications/office/zanshin { };
-
-      kwooty = callPackage ../applications/networking/newsreaders/kwooty { };
-    };
-
-  redshift = callPackage ../applications/misc/redshift {
-    inherit (xorg) libX11 libXrandr libxcb randrproto libXxf86vm
-      xf86vidmodeproto;
-    inherit (gnome) GConf;
-    inherit (pythonPackages) pyxdg;
-    geoclue = geoclue2;
-  };
-
-  oxygen_gtk = callPackage ../misc/themes/gtk2/oxygen-gtk { };
-
-  gtk_engines = callPackage ../misc/themes/gtk2/gtk-engines { };
-
-  gtk-engine-murrine = callPackage ../misc/themes/gtk2/gtk-engine-murrine { };
-
-  gnome_themes_standard = gnome3.gnome_themes_standard;
-
-  mate-icon-theme = callPackage ../misc/themes/mate-icon-theme { };
-
-  mate-themes = callPackage ../misc/themes/mate-themes { };
-
-  xfce = xfce4_10;
-  xfce4_10 = recurseIntoAttrs (import ../desktops/xfce { inherit pkgs newScope; });
-
-
-  ### SCIENCE
-
-  ### SCIENCE/GEOMETRY
-
-  drgeo = builderDefsPackage (import ../applications/science/geometry/drgeo) {
-    inherit (gnome) libglade;
-    inherit libxml2 perl intltool libtool pkgconfig gtk;
-    guile = guile_1_8;
-  };
-
-  tetgen = callPackage ../applications/science/geometry/tetgen { };
-
-
-  ### SCIENCE/BIOLOGY
-
-  alliance = callPackage ../applications/science/electronics/alliance {
-    motif = lesstif;
-  };
-
-  arb = callPackage ../applications/science/biology/arb {
-    lesstif = lesstif93;
-  };
-
-  archimedes = callPackage ../applications/science/electronics/archimedes { };
-
-  biolib = callPackage ../development/libraries/science/biology/biolib { };
-
-  emboss = callPackage ../applications/science/biology/emboss { };
-
-  mrbayes = callPackage ../applications/science/biology/mrbayes { };
-
-  ncbiCTools = builderDefsPackage ../development/libraries/ncbi {
-    inherit tcsh mesa lesstif;
-    inherit (xlibs) libX11 libXaw xproto libXt libSM libICE
-      libXmu libXext;
-  };
-
-  ncbi_tools = callPackage ../applications/science/biology/ncbi-tools { };
-
-  paml = callPackage ../applications/science/biology/paml { };
-
-  pal2nal = callPackage ../applications/science/biology/pal2nal { };
-
-  plink = callPackage ../applications/science/biology/plink/default.nix { };
-
-
-  ### SCIENCE/MATH
-
-  arpack = callPackage ../development/libraries/science/math/arpack { };
-
-  atlas = callPackage ../development/libraries/science/math/atlas {
-    # The build process measures CPU capabilities and optimizes the
-    # library to perform best on that particular machine. That is a
-    # great feature, but it's of limited use with pre-built binaries
-    # coming from a central build farm.
-    tolerateCpuTimingInaccuracy = true;
-  };
-
-  blas = callPackage ../development/libraries/science/math/blas { };
-
-  content = builderDefsPackage ../applications/science/math/content {
-    inherit mesa lesstif;
-    inherit (xlibs) libX11 libXaw xproto libXt libSM libICE
-      libXmu libXext libXcursor;
-  };
-
-  jags = callPackage ../applications/science/math/jags { };
-
-  liblapack = callPackage ../development/libraries/science/math/liblapack { };
-  liblapack_3_5_0 = callPackage ../development/libraries/science/math/liblapack/3.5.0.nix { };
-
-  liblbfgs = callPackage ../development/libraries/science/math/liblbfgs { };
-
-  openblas = callPackage ../development/libraries/science/math/openblas { };
-  openblas_0_2_10 = callPackage ../development/libraries/science/math/openblas/0.2.10.nix { 
-    liblapack = liblapack_3_5_0;
-  };
-
-  mathematica = callPackage ../applications/science/math/mathematica { };
-
-  sage = callPackage ../applications/science/math/sage { };
-
-  ### SCIENCE/MOLECULAR-DYNAMICS
-
-  gromacs = callPackage ../applications/science/molecular-dynamics/gromacs {
-    singlePrec = true;
-    fftw = fftwSinglePrec;
-    cmake = cmakeCurses;
-  };
-
-  gromacsDouble = lowPrio (callPackage ../applications/science/molecular-dynamics/gromacs {
-    singlePrec = false;
-    fftw = fftw;
-    cmake = cmakeCurses;
-  });
-
-
-  ### SCIENCE/LOGIC
-
-  abc-verifier = callPackage ../applications/science/logic/abc {};
-
-  alt-ergo = callPackage ../applications/science/logic/alt-ergo {};
-
-  coq = callPackage ../applications/science/logic/coq {
-    inherit (ocamlPackages) findlib lablgtk;
-    camlp5 = ocamlPackages.camlp5_transitional;
-  };
-
-  coq_HEAD = callPackage ../applications/science/logic/coq/HEAD.nix {
-    inherit (ocamlPackages) findlib lablgtk;
-    camlp5 = ocamlPackages.camlp5_transitional;
-  };
-
-  coq_8_3 = callPackage ../applications/science/logic/coq/8.3.nix {
-    inherit (ocamlPackages) findlib lablgtk;
-    camlp5 = ocamlPackages.camlp5_transitional;
-  };
-
-  cvc3 = callPackage ../applications/science/logic/cvc3 {};
-
-  ekrhyper = callPackage ../applications/science/logic/ekrhyper {};
-
-  eprover = callPackage ../applications/science/logic/eprover {
-    texLive = texLiveAggregationFun {
-      paths = [
-        texLive texLiveExtra
-      ];
-    };
-  };
-
-  ginac = callPackage ../applications/science/math/ginac { };
-
-  hol = callPackage ../applications/science/logic/hol { };
-
-  hol_light = callPackage ../applications/science/logic/hol_light {
-    inherit (ocamlPackages) findlib;
-    camlp5 = ocamlPackages.camlp5_strict;
-  };
-
-  isabelle = import ../applications/science/logic/isabelle {
-    inherit (pkgs) stdenv fetchurl nettools perl polyml;
-    inherit (pkgs.emacs24Packages) proofgeneral;
-  };
-
-  iprover = callPackage ../applications/science/logic/iprover {};
-
-  leo2 = callPackage ../applications/science/logic/leo2 {};
-
-  logisim = callPackage ../applications/science/logic/logisim {};
-
-  ltl2ba = callPackage ../applications/science/logic/ltl2ba {};
-
-  matita = callPackage ../applications/science/logic/matita {
-    ocaml = ocaml_3_11_2;
-    inherit (ocamlPackages_3_11_2) findlib lablgtk ocaml_expat gmetadom ocaml_http
-            lablgtkmathview ocaml_mysql ocaml_sqlite3 ocamlnet camlzip ocaml_pcre;
-    ulex08 = ocamlPackages_3_11_2.ulex08.override { camlp5 = ocamlPackages_3_11_2.camlp5_5_transitional; };
-  };
-
-  matita_130312 = lowPrio (callPackage ../applications/science/logic/matita/130312.nix {
-    inherit (ocamlPackages) findlib lablgtk ocaml_expat gmetadom ocaml_http
-            ocaml_mysql ocamlnet ulex08 camlzip ocaml_pcre;
-  });
-
-  minisat = callPackage ../applications/science/logic/minisat {};
-
-  opensmt = callPackage ../applications/science/logic/opensmt { };
-
-  otter = callPackage ../applications/science/logic/otter {};
-
-  picosat = callPackage ../applications/science/logic/picosat {};
-
-  prooftree = callPackage ../applications/science/logic/prooftree {
-    inherit (ocamlPackages) findlib lablgtk;
-    camlp5 = ocamlPackages.camlp5_transitional;
-  };
-
-  prover9 = callPackage ../applications/science/logic/prover9 { };
-
-  satallax = callPackage ../applications/science/logic/satallax {};
-
-  spass = callPackage ../applications/science/logic/spass {};
-
-  ssreflect = callPackage ../applications/science/logic/ssreflect {
-    camlp5 = ocamlPackages.camlp5_transitional;
-  };
-
-  tptp = callPackage ../applications/science/logic/tptp {};
-
-  twelf = callPackage ../applications/science/logic/twelf {
-    smlnj = if stdenv.isDarwin
-      then smlnjBootstrap
-      else smlnj;
-  };
-
-  verifast = callPackage ../applications/science/logic/verifast {};
-
-  why3 = callPackage ../applications/science/logic/why3 {};
-
-  yices = callPackage ../applications/science/logic/yices {};
-
-  z3 = callPackage ../applications/science/logic/z3 {};
-
-  boolector   = boolector15;
-  boolector15 = callPackage ../applications/science/logic/boolector {};
-  boolector16 = lowPrio (callPackage ../applications/science/logic/boolector {
-    useV16 = true;
-  });
-
-  ### SCIENCE / ELECTRONICS
-
-  eagle = callPackage_i686 ../applications/science/electronics/eagle { };
-
-  caneda = callPackage ../applications/science/electronics/caneda { };
-
-  gtkwave = callPackage ../applications/science/electronics/gtkwave { };
-
-  kicad = callPackage ../applications/science/electronics/kicad {
-    wxGTK = wxGTK29;
-  };
-
-  ngspice = callPackage ../applications/science/electronics/ngspice { };
-
-  qucs = callPackage ../applications/science/electronics/qucs { };
-
-  xoscope = callPackage ../applications/science/electronics/xoscope { };
-
-
-  ### SCIENCE / MATH
-
-  ecm = callPackage ../applications/science/math/ecm { };
-
-  eukleides = callPackage ../applications/science/math/eukleides {
-    texinfo = texinfo4;
-  };
-
-  fricas = callPackage ../applications/science/math/fricas { };
-
-  gap = callPackage ../applications/science/math/gap { };
-
-  maxima = callPackage ../applications/science/math/maxima { };
-
-  wxmaxima = callPackage ../applications/science/math/wxmaxima { };
-
-  pari = callPackage ../applications/science/math/pari {};
-
-  pspp = callPackage ../applications/science/math/pssp {
-    inherit (gnome) libglade gtksourceview;
-  };
-
-  singular = callPackage ../applications/science/math/singular {};
-
-  scilab = callPackage ../applications/science/math/scilab {
-    withXaw3d = false;
-    withTk = true;
-    withGtk = false;
-    withOCaml = true;
-    withX = true;
-  };
-
-  msieve = callPackage ../applications/science/math/msieve { };
-
-  weka = callPackage ../applications/science/math/weka { };
-
-  yad = callPackage ../tools/misc/yad { };
-
-  yacas = callPackage ../applications/science/math/yacas { };
-
-  speedcrunch = callPackage ../applications/science/math/speedcrunch {
-    qt = qt4;
-    cmake = cmakeCurses;
-  };
-
-
-  ### SCIENCE / MISC
-
-  boinc = callPackage ../applications/science/misc/boinc { };
-
-  celestia = callPackage ../applications/science/astronomy/celestia {
-    lua = lua5_1;
-    inherit (xlibs) libXmu;
-    inherit (pkgs.gnome) gtkglext;
-  };
-
-  fityk = callPackage ../applications/science/misc/fityk { };
-
-  gravit = callPackage ../applications/science/astronomy/gravit { };
-
-  golly = callPackage ../applications/science/misc/golly { };
-
-  megam = callPackage ../applications/science/misc/megam { };
-
-  root = callPackage ../applications/science/misc/root { };
-
-  simgrid = callPackage ../applications/science/misc/simgrid { };
-
-  spyder = callPackage ../applications/science/spyder {
-    inherit (pythonPackages) pyflakes rope sphinx numpy scipy matplotlib; # recommended
-    inherit (pythonPackages) ipython pep8; # optional
-    inherit pylint;
-  };
-
-  stellarium = callPackage ../applications/science/astronomy/stellarium { };
-
-  tulip = callPackage ../applications/science/misc/tulip { };
-
-  vite = callPackage ../applications/science/misc/vite { };
-
-  xplanet = callPackage ../applications/science/astronomy/xplanet { };
-
-  ### MISC
-
-  atari800 = callPackage ../misc/emulators/atari800 { };
-
-  ataripp = callPackage ../misc/emulators/atari++ { };
-
-  auctex = callPackage ../tools/typesetting/tex/auctex { };
-
-  beep = callPackage ../misc/beep { };
-
-  cups = callPackage ../misc/cups { libusb = libusb1; };
-
-  cups_pdf_filter = callPackage ../misc/cups/pdf-filter.nix { };
-
-  gutenprint = callPackage ../misc/drivers/gutenprint { };
-
-  gutenprintBin = callPackage ../misc/drivers/gutenprint/bin.nix { };
-
-  cupsBjnp = callPackage ../misc/cups/drivers/cups-bjnp { };
-
-  darcnes = callPackage ../misc/emulators/darcnes { };
-
-  dbacl = callPackage ../tools/misc/dbacl { };
-
-  dblatex = callPackage ../tools/typesetting/tex/dblatex {
-    enableAllFeatures = false;
-  };
-
-  dblatexFull = appendToName "full" (dblatex.override {
-    enableAllFeatures = true;
-  });
-
-  dosbox = callPackage ../misc/emulators/dosbox { };
-
-  dpkg = callPackage ../tools/package-management/dpkg { };
-
-  ekiga = newScope pkgs.gnome ../applications/networking/instant-messengers/ekiga { };
-
-  emulationstation = callPackage ../misc/emulators/emulationstation { };
-
-  electricsheep = callPackage ../misc/screensavers/electricsheep { };
-
-  fakenes = callPackage ../misc/emulators/fakenes { };
-
-  fceux = callPackage ../misc/emulators/fceux { };
-
-  foldingathome = callPackage ../misc/foldingathome { };
-
-  foo2zjs = callPackage ../misc/drivers/foo2zjs {};
-
-  foomatic_filters = callPackage ../misc/drivers/foomatic-filters {};
-
-  freestyle = callPackage ../misc/freestyle { };
-
-  gajim = callPackage ../applications/networking/instant-messengers/gajim { };
-
-  gammu = callPackage ../applications/misc/gammu { };
-
-  gensgs = callPackage_i686 ../misc/emulators/gens-gs { };
-
-  ghostscript = callPackage ../misc/ghostscript {
-    x11Support = false;
-    cupsSupport = config.ghostscript.cups or (!stdenv.isDarwin);
-    gnuFork = config.ghostscript.gnu or false;
-  };
-
-  ghostscriptX = appendToName "with-X" (ghostscript.override {
-    x11Support = true;
-  });
-
-  guix = callPackage ../tools/package-management/guix { };
-
-  gxemul = callPackage ../misc/gxemul { };
-
-  hatari = callPackage ../misc/emulators/hatari { };
-
-  hplip = callPackage ../misc/drivers/hplip { };
-
-  hplipWithPlugin = hplip.override { withPlugin = true; };
-
-  # using the new configuration style proposal which is unstable
-  jack1 = callPackage ../misc/jackaudio/jack1.nix { };
-
-  jack2 = callPackage ../misc/jackaudio { };
-
-  keynav = callPackage ../tools/X11/keynav { };
-
-  lazylist = callPackage ../tools/typesetting/tex/lazylist { };
-
-  lilypond = callPackage ../misc/lilypond { guile = guile_1_8; };
-
-  martyr = callPackage ../development/libraries/martyr { };
-
-  maven = maven3;
-  maven3 = callPackage ../misc/maven { jdk = openjdk; };
-
-  mess = callPackage ../misc/emulators/mess {
-    inherit (pkgs.gnome) GConf;
-  };
-
-  mupen64plus = callPackage ../misc/emulators/mupen64plus { };
-
-  mupen64plus1_5 = callPackage ../misc/emulators/mupen64plus/1.5.nix { };
-
-  nix = nixStable;
-
-  nixStable = callPackage ../tools/package-management/nix {
-    storeDir = config.nix.storeDir or "/nix/store";
-    stateDir = config.nix.stateDir or "/nix/var";
-  };
-
-  nixUnstable = callPackage ../tools/package-management/nix/unstable.nix {
-    storeDir = config.nix.storeDir or "/nix/store";
-    stateDir = config.nix.stateDir or "/nix/var";
-  };
-
-  nixops = callPackage ../tools/package-management/nixops { };
-
-  nix-prefetch-scripts = callPackage ../tools/package-management/nix-prefetch-scripts { };
-
-  nix-repl = callPackage ../tools/package-management/nix-repl { };
-
-  nut = callPackage ../applications/misc/nut { };
-
-  solfege = callPackage ../misc/solfege {
-      pysqlite = pkgs.pythonPackages.sqlite3;
-  };
-
-  disnix = callPackage ../tools/package-management/disnix { };
-
-  dysnomia = callPackage ../tools/package-management/disnix/dysnomia {
-    enableApacheWebApplication = config.disnix.enableApacheWebApplication or false;
-    enableAxis2WebService = config.disnix.enableAxis2WebService or false;
-    enableEjabberdDump = config.disnix.enableEjabberdDump or false;
-    enableMySQLDatabase = config.disnix.enableMySQLDatabase or false;
-    enablePostgreSQLDatabase = config.disnix.enablePostgreSQLDatabase or false;
-    enableSubversionRepository = config.disnix.enableSubversionRepository or false;
-    enableTomcatWebApplication = config.disnix.enableTomcatWebApplication or false;
-  };
-
-  disnixos = callPackage ../tools/package-management/disnix/disnixos { };
-
-  DisnixWebService = callPackage ../tools/package-management/disnix/DisnixWebService { };
-
-  latex2html = callPackage ../tools/typesetting/tex/latex2html/default.nix {
-    tex = tetex;
-  };
-
-  lkproof = callPackage ../tools/typesetting/tex/lkproof { };
-
-  mysqlWorkbench = newScope gnome ../applications/misc/mysql-workbench {
-    lua = lua5;
-    inherit (pythonPackages) pexpect paramiko;
-  };
-
-  robomongo = callPackage ../applications/misc/robomongo { };
-
-  opkg = callPackage ../tools/package-management/opkg { };
-
-  pgadmin = callPackage ../applications/misc/pgadmin { };
-
-  pgf = pgf2;
-
-  # Keep the old PGF since some documents don't render properly with
-  # the new one.
-  pgf1 = callPackage ../tools/typesetting/tex/pgf/1.x.nix { };
-
-  pgf2 = callPackage ../tools/typesetting/tex/pgf/2.x.nix { };
-
-  pgfplots = callPackage ../tools/typesetting/tex/pgfplots { };
-
-  pjsip = callPackage ../applications/networking/pjsip { };
-
-  polytable = callPackage ../tools/typesetting/tex/polytable { };
-
-  PPSSPP = callPackage ../misc/emulators/ppsspp { };
-
-  uae = callPackage ../misc/emulators/uae { };
-
-  putty = callPackage ../applications/networking/remote/putty { };
-
-  retroarch = callPackage ../misc/emulators/retroarch { };
-
-  rssglx = callPackage ../misc/screensavers/rss-glx { };
-
-  xlockmore = callPackage ../misc/screensavers/xlockmore { };
-
-  samsungUnifiedLinuxDriver = import ../misc/cups/drivers/samsung {
-    inherit fetchurl stdenv;
-    inherit cups ghostscript glibc patchelf;
-    gcc = import ../development/compilers/gcc/4.4 {
-      inherit stdenv fetchurl gmp mpfr noSysDirs gettext which;
-      texinfo = texinfo4;
-      profiledCompiler = true;
-    };
-  };
-
-  saneBackends = callPackage ../applications/graphics/sane/backends.nix {
-    gt68xxFirmware = config.sane.gt68xxFirmware or null;
-    snapscanFirmware = config.sane.snapscanFirmware or null;
-    hotplugSupport = config.sane.hotplugSupport or true;
-    libusb = libusb1;
-  };
-
-  saneBackendsGit = callPackage ../applications/graphics/sane/backends-git.nix {
-    gt68xxFirmware = config.sane.gt68xxFirmware or null;
-    snapscanFirmware = config.sane.snapscanFirmware or null;
-    hotplugSupport = config.sane.hotplugSupport or true;
-  };
-
-  mkSaneConfig = callPackage ../applications/graphics/sane/config.nix { };
-
-  saneFrontends = callPackage ../applications/graphics/sane/frontends.nix { };
-
-  seafile-shared = callPackage ../misc/seafile-shared { };
-
-  slock = callPackage ../misc/screensavers/slock { };
-
-  sourceAndTags = import ../misc/source-and-tags {
-    inherit pkgs stdenv unzip lib ctags;
-    hasktags = haskellPackages.hasktags;
-  };
-
-  splix = callPackage ../misc/cups/drivers/splix { };
-
-  streamripper = callPackage ../applications/audio/streamripper { };
-
-  sqsh = callPackage ../development/tools/sqsh { };
-
-  tetex = callPackage ../tools/typesetting/tex/tetex { libpng = libpng12; };
-
-  tex4ht = callPackage ../tools/typesetting/tex/tex4ht { };
-
-  texFunctions = import ../tools/typesetting/tex/nix pkgs;
-
-  texLive = builderDefsPackage (import ../tools/typesetting/tex/texlive) {
-    inherit builderDefs zlib bzip2 ncurses libpng ed lesstif ruby potrace
-      gd t1lib freetype icu perl expat curl xz pkgconfig zziplib texinfo
-      libjpeg bison python fontconfig flex poppler libpaper graphite2
-      makeWrapper;
-    inherit (xlibs) libXaw libX11 xproto libXt libXpm
-      libXmu libXext xextproto libSM libICE;
-    ghostscript = ghostscriptX;
-    harfbuzz = harfbuzz.override {
-      withIcu = true; withGraphite2 = true;
-    };
-  };
-
-  texLiveFull = lib.setName "texlive-full" (texLiveAggregationFun {
-    paths = [ texLive texLiveExtra lmodern texLiveCMSuper texLiveLatexXColor
-              texLivePGF texLiveBeamer texLiveModerncv tipa tex4ht texinfo
-              texLiveModerntimeline ];
-  });
-
-  /* Look in configurations/misc/raskin.nix for usage example (around revisions
-  where TeXLive was added)
-
-  (texLiveAggregationFun {
-    paths = [texLive texLiveExtra texLiveCMSuper
-      texLiveBeamer
-    ];
-  })
-
-  You need to use texLiveAggregationFun to regenerate, say, ls-R (TeX-related file list)
-  Just installing a few packages doesn't work.
-  */
-  texLiveAggregationFun = params:
-    builderDefsPackage (import ../tools/typesetting/tex/texlive/aggregate.nix)
-      ({inherit poppler perl makeWrapper;} // params);
-
-  texDisser = callPackage ../tools/typesetting/tex/disser {};
-
-  texLiveContext = builderDefsPackage (import ../tools/typesetting/tex/texlive/context.nix) {
-    inherit texLive;
-  };
-
-  texLiveExtra = builderDefsPackage (import ../tools/typesetting/tex/texlive/extra.nix) {
-    inherit texLive xz;
-  };
-
-  texLiveCMSuper = builderDefsPackage (import ../tools/typesetting/tex/texlive/cm-super.nix) {
-    inherit texLive;
-  };
-
-  texLiveLatexXColor = builderDefsPackage (import ../tools/typesetting/tex/texlive/xcolor.nix) {
-    inherit texLive;
-  };
-
-  texLivePGF = builderDefsPackage (import ../tools/typesetting/tex/texlive/pgf.nix) {
-    inherit texLiveLatexXColor texLive;
-  };
-
-  texLiveBeamer = builderDefsPackage (import ../tools/typesetting/tex/texlive/beamer.nix) {
-    inherit texLiveLatexXColor texLivePGF texLive;
-  };
-
-  texLiveModerncv = builderDefsPackage (import ../tools/typesetting/tex/texlive/moderncv.nix) {
-    inherit texLive unzip;
-  };
-
-  texLiveModerntimeline = builderDefsPackage (import ../tools/typesetting/tex/texlive/moderntimeline.nix) {
-    inherit texLive unzip;
-  };
-
-  thermald = callPackage ../tools/system/thermald { };
-
-  thinkfan = callPackage ../tools/system/thinkfan { };
-
-  vice = callPackage ../misc/emulators/vice {
-    libX11 = xlibs.libX11;
-    giflib = giflib_4_1;
-  };
-
-  viewnior = callPackage ../applications/graphics/viewnior { };
-
-  vimPlugins = recurseIntoAttrs (callPackage ../misc/vim-plugins { });
-
-  vimprobable2 = callPackage ../applications/networking/browsers/vimprobable2 {
-    webkit = webkitgtk2;
-  };
-
-  vimprobable2Wrapper = wrapFirefox
-    { browser = vimprobable2; browserName = "vimprobable2"; desktopName = "Vimprobable2";
-    };
-
-  vimb = callPackage ../applications/networking/browsers/vimb {
-    webkit = webkitgtk2;
-  };
-
-  vimbWrapper = wrapFirefox {
-    browser = vimb;
-    browserName = "vimb";
-    desktopName = "Vimb";
-  };
-
-  VisualBoyAdvance = callPackage ../misc/emulators/VisualBoyAdvance { };
-
-  # Wine cannot be built in 64-bit; use a 32-bit build instead.
-  wineStable = callPackage_i686 ../misc/emulators/wine/stable.nix {
-    bison = bison2;
-  };
-
-  wineUnstable = lowPrio (callPackage_i686 ../misc/emulators/wine/unstable.nix {
-    bison = bison2;
-  });
-
-  wine = wineStable;
-
-  winetricks = callPackage ../misc/emulators/wine/winetricks.nix {
-    inherit (gnome2) zenity;
-  };
-
-  wxmupen64plus = callPackage ../misc/emulators/wxmupen64plus { };
-
-  x2x = callPackage ../tools/X11/x2x { };
-
-  xboxdrv = callPackage ../misc/drivers/xboxdrv { };
-
-  xinput_calibrator = callPackage ../tools/X11/xinput_calibrator {
-    inherit (xlibs) libXi inputproto;
-  };
-
-  xosd = callPackage ../misc/xosd { };
-
-  xsane = callPackage ../applications/graphics/sane/xsane.nix {
-    libpng = libpng12;
-    saneBackends = saneBackends;
-  };
-
-  yafc = callPackage ../applications/networking/yafc { };
-
-  yandex-disk = callPackage ../tools/filesystems/yandex-disk { };
-
-  myEnvFun = import ../misc/my-env {
-    inherit substituteAll pkgs;
-    inherit (stdenv) mkDerivation;
-  };
-
-  # patoline requires a rather large ocaml compilation environment.
-  # this is why it is build as an environment and not just a normal package.
-  # remark : the emacs mode is also installed, but you have to adjust your load-path.
-  PatolineEnv = pack: myEnvFun {
-      name = "patoline";
-      buildInputs = [ stdenv ncurses mesa freeglut libzip gcc
-                                   pack.ocaml pack.findlib pack.camomile
-                                   pack.dypgen pack.ocaml_sqlite3 pack.camlzip
-                                   pack.lablgtk pack.camlimages pack.ocaml_cairo
-                                   pack.lablgl pack.ocamlnet pack.cryptokit
-                                   pack.ocaml_pcre pack.patoline
-                                   ];
-    # this is to circumvent the bug with libgcc_s.so.1 which is
-    # not found when using thread
-    extraCmds = ''
-       LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:${gcc.gcc}/lib
-       export LD_LIBRARY_PATH
-    '';
-  };
-
-  patoline = PatolineEnv ocamlPackages_4_00_1;
-
-  znc = callPackage ../applications/networking/znc { };
-
-  zncModules = recurseIntoAttrs (
-    callPackage ../applications/networking/znc/modules.nix { }
-  );
-
-  zsnes = callPackage_i686 ../misc/emulators/zsnes { };
-
-  snes9x-gtk = callPackage ../misc/emulators/snes9x-gtk { };
-
-  misc = import ../misc/misc.nix { inherit pkgs stdenv; };
-
-  bullet = callPackage ../development/libraries/bullet {};
-
-  dart = callPackage ../development/interpreters/dart { };
-
-  httrack = callPackage ../tools/backup/httrack { };
-
-  mg = callPackage ../applications/editors/mg { };
-
-
-  # Attributes for backward compatibility.
-  adobeReader = adobe-reader;
-  asciidocFull = asciidoc-full;  # added 2014-06-22
-  lttngTools = lttng-tools;  # added 2014-07-31
-  lttngUst = lttng-ust;  # added 2014-07-31
-
-
-}; in self; in pkgs
diff --git a/data/simple-pretty.nix b/data/simple-pretty.nix
deleted file mode 100644
--- a/data/simple-pretty.nix
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  a = 3;
-  b = 4;
-  c = {
-    inherit ({ a = 3; }) a;
-    e = 4;
-    f = 5;
-  };
-  d = if true
-    then { a = 1; b = 2; c = 3; }
-    else if false
-      then null
-      else {
-        inherit ({
-          a = 3;
-          b = 4;
-          cdefgads = 5;
-        }) cdefgads;
-      };
-  f = x: x;
-  list = [
-    1
-    2
-    (f 3)
-    ((x: x) 3)
-    [ 4 5 ]
-  ];
-}
diff --git a/data/simple.nix b/data/simple.nix
deleted file mode 100644
--- a/data/simple.nix
+++ /dev/null
@@ -1,1 +0,0 @@
-{ a = 3; b = 4; c = { inherit ({a = 3; }) a; e = 4; f = 5; }; d = if true then { a = 1; b = 2; c = 3; } else if false then null else { inherit ({a = 3; b = 4; cdefgads = 5; }) cdefgads; }; f = x: x; list = [ 1 2 (f 3) ((x: x) 3) [ 4 5 ] ]; }
diff --git a/hnix.cabal b/hnix.cabal
--- a/hnix.cabal
+++ b/hnix.cabal
@@ -1,138 +1,291 @@
-Name:                hnix
-Version:             0.4.0
-Synopsis:            Haskell implementation of the Nix language
-Description:
-  Haskell implementation of the Nix language.
+-- This file has been generated from package.yaml by hpack version 0.27.0.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: 98a178891c03317cef1e5f7a984b3d7156bb38b0ca183bea91bab9acdaff4fb3
 
-License:             BSD3
-License-file:        LICENSE
-Author:              John Wiegley
-Maintainer:          johnw@newartisans.com
-Category:            Data, Nix
-Build-type:          Simple
-Cabal-version:       >=1.10
-Homepage:            http://github.com/jwiegley/hnix
+name:           hnix
+version:        0.5.0
+synopsis:       Haskell implementation of the Nix language
+description:    Haskell implementation of the Nix language.
+category:       System, Data, Nix
+homepage:       https://github.com/jwiegley/hnix#readme
+bug-reports:    https://github.com/jwiegley/hnix/issues
+author:         John Wiegley
+maintainer:     johnw@newartisans.com
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+cabal-version:  >= 1.10
 
-Extra-source-files: data/*.nix
+extra-source-files:
+    README.md
 
-Flag Parsec
-  Description: Use parsec instead of Trifecta
-  Default: False
+source-repository head
+  type: git
+  location: https://github.com/jwiegley/hnix
 
-Library
-  Default-language: Haskell2010
-  Exposed-modules:
-    Nix.Atoms
-    Nix.Eval
-    Nix.Parser
-    Nix.Expr
-    Nix.Pretty
-    Nix.Parser.Operators
-    Nix.StringOperations
-  Other-modules:
-    Nix.Parser.Library
-    Nix.Expr.Types
-    Nix.Expr.Types.Annotated
-    Nix.Expr.Shorthands
-  Default-extensions:
-    DataKinds
-    DeriveDataTypeable
-    DeriveFunctor
-    DeriveGeneric
-    FlexibleContexts
-    FlexibleInstances
-    GADTs
-    KindSignatures
-    LambdaCase
-    MultiWayIf
-    NoImplicitPrelude
-    OverloadedStrings
-    PatternGuards
-    RankNTypes
-    TupleSections
-  Build-depends:
-      base                     >= 4.9          && < 5
+flag optimize
+  description: Enable all optimization flags
+  manual: True
+  default: False
+
+flag profiling
+  description: Enable profiling
+  manual: True
+  default: False
+
+flag tracing
+  description: Enable full debug tracing
+  manual: True
+  default: False
+
+library
+  exposed-modules:
+      Nix
+      Nix.Atoms
+      Nix.Builtins
+      Nix.Cache
+      Nix.Context
+      Nix.Convert
+      Nix.Effects
+      Nix.Eval
+      Nix.Exec
+      Nix.Expr
+      Nix.Expr.Shorthands
+      Nix.Expr.Types
+      Nix.Expr.Types.Annotated
+      Nix.Frames
+      Nix.Lint
+      Nix.Normal
+      Nix.Options
+      Nix.Parser
+      Nix.Pretty
+      Nix.Reduce
+      Nix.Render
+      Nix.Render.Frame
+      Nix.Scope
+      Nix.Strings
+      Nix.TH
+      Nix.Thunk
+      Nix.Type.Assumption
+      Nix.Type.Env
+      Nix.Type.Infer
+      Nix.Type.Type
+      Nix.Utils
+      Nix.Value
+      Nix.XML
+  other-modules:
+      Paths_hnix
+  hs-source-dirs:
+      src
+  ghc-options: -Wall
+  build-depends:
+      aeson
     , ansi-wl-pprint
+    , array >=0.4 && <0.6
+    , base >=4.9 && <5
+    , binary
+    , bytestring
     , containers
-    , deriving-compat >= 0.3 && < 0.4
-    , text
-    , transformers
-    , parsers >= 0.10
-    , unordered-containers
     , data-fix
-    , deepseq
-    , semigroups >= 0.18 && < 0.19
+    , deepseq >=1.4.2 && <1.5
+    , deriving-compat >=0.3 && <0.5
+    , directory
+    , exceptions
+    , filepath
+    , hashing
+    , http-client
+    , http-client-tls
+    , http-types
+    , lens-family
+    , lens-family-core
+    , lens-family-th
+    , logict
+    , megaparsec >=6.0 && <6.6
+    , monadlist
+    , mtl
+    , optparse-applicative
+    , process
     , regex-tdfa
     , regex-tdfa-text
-  if flag(parsec)
-    Cpp-options: -DUSE_PARSEC
-    Build-depends: parsec
+    , scientific
+    , semigroups >=0.18 && <0.19
+    , split
+    , syb
+    , template-haskell
+    , text
+    , these
+    , time
+    , transformers
+    , unix
+    , unordered-containers >=0.2.9 && <0.3
+    , vector
+    , xml
+  if !impl(ghcjs)
+    build-depends:
+        base16-bytestring
+      , cryptohash-md5
+      , cryptohash-sha1
+      , cryptohash-sha256
+      , cryptohash-sha512
+      , serialise
+  if impl(ghcjs)
+    build-depends:
+        hashable >=1.2.4 && <1.3
   else
-    Build-depends: trifecta
-  ghc-options: -Wall -fno-warn-name-shadowing
+    exposed-modules:
+        Nix.Options.Parser
+    build-depends:
+        hashable >=1.2.5 && <1.3
+      , haskeline
+      , pretty-show
+  default-language: Haskell2010
 
-Executable hnix
-  Default-language: Haskell2010
-  Main-is: Main.hs
-  Hs-source-dirs: main
-  Default-extensions:
-    DataKinds
-    DeriveDataTypeable
-    DeriveFunctor
-    DeriveGeneric
-    FlexibleContexts
-    FlexibleInstances
-    GADTs
-    KindSignatures
-    LambdaCase
-    MultiWayIf
-    OverloadedStrings
-    PatternGuards
-    RankNTypes
-    TupleSections
-  Build-depends:
-      base                     >= 4.3          && < 5
-    , hnix
-    , containers
+executable hnix
+  main-is: Main.hs
+  other-modules:
+      Repl
+      Paths_hnix
+  hs-source-dirs:
+      main
+  ghc-options: -Wall
+  build-depends:
+      aeson
     , ansi-wl-pprint
+    , base >=4.9 && <5
+    , bytestring
+    , containers
     , data-fix
-    , deepseq
-  Ghc-options: -Wall
+    , deepseq >=1.4.2 && <1.5
+    , exceptions
+    , filepath
+    , hashing
+    , haskeline
+    , hnix
+    , mtl
+    , optparse-applicative
+    , pretty-show
+    , repline
+    , template-haskell
+    , text
+    , time
+    , transformers
+    , unordered-containers >=0.2.9 && <0.3
+  if !impl(ghcjs)
+    build-depends:
+        base16-bytestring
+      , cryptohash-md5
+      , cryptohash-sha1
+      , cryptohash-sha256
+      , cryptohash-sha512
+      , serialise
+  if impl(ghcjs)
+    buildable: False
+  else
+    buildable: True
+  default-language: Haskell2010
 
-Test-suite hnix-tests
-  Type: exitcode-stdio-1.0
-  Hs-source-dirs: tests
-  Default-language: Haskell2010
-  Main-is: Main.hs
-  Other-modules:
-    ParserTests
-    EvalTests
-    ShorthandTests
-    PrettyTests
-  Build-depends:
-      base >= 4.3 && < 5
+test-suite hnix-tests
+  type: exitcode-stdio-1.0
+  main-is: Main.hs
+  other-modules:
+      EvalTests
+      NixLanguageTests
+      ParserTests
+      PrettyParseTests
+      PrettyTests
+      TestCommon
+      Paths_hnix
+  hs-source-dirs:
+      tests
+  ghc-options: -Wall -threaded
+  build-depends:
+      Diff
+    , Glob
+    , QuickCheck
+    , ansi-wl-pprint
+    , base >=4.9 && <5
+    , bytestring
     , containers
-    , text
     , data-fix
+    , deepseq >=1.4.2 && <1.5
+    , directory
+    , exceptions
+    , filepath
+    , generic-random
+    , hashing
     , hnix
+    , interpolate
+    , megaparsec
+    , mtl
+    , optparse-applicative
+    , pretty-show
+    , process
+    , quickcheck-instances
+    , split
     , tasty
-    , tasty-th
     , tasty-hunit
+    , tasty-quickcheck
+    , tasty-th
+    , template-haskell
+    , text
+    , time
+    , transformers
+    , unix
+    , unordered-containers >=0.2.9 && <0.3
+  if !impl(ghcjs)
+    build-depends:
+        base16-bytestring
+      , cryptohash-md5
+      , cryptohash-sha1
+      , cryptohash-sha256
+      , cryptohash-sha512
+      , serialise
+  if impl(ghcjs)
+    buildable: False
+  else
+    buildable: True
+  default-language: Haskell2010
 
-Benchmark hnix-benchmarks
-  Type: exitcode-stdio-1.0
-  Hs-source-dirs: benchmarks
-  Default-language: Haskell2010
-  Main-is: Main.hs
-  Other-modules:
-    ParserBench
-  Build-depends:
-      base >= 4.3 && < 5
+benchmark hnix-benchmarks
+  type: exitcode-stdio-1.0
+  main-is: Main.hs
+  other-modules:
+      ParserBench
+      Paths_hnix
+  hs-source-dirs:
+      benchmarks
+  ghc-options: -Wall
+  build-depends:
+      ansi-wl-pprint
+    , base >=4.9 && <5
+    , bytestring
     , containers
-    , text
-    , hnix
     , criterion
-
-source-repository head
-  type:     git
-  location: git://github.com/jwiegley/hnix.git
+    , data-fix
+    , deepseq >=1.4.2 && <1.5
+    , exceptions
+    , filepath
+    , hashing
+    , hnix
+    , mtl
+    , optparse-applicative
+    , template-haskell
+    , text
+    , time
+    , transformers
+    , unordered-containers >=0.2.9 && <0.3
+  if !impl(ghcjs)
+    build-depends:
+        base16-bytestring
+      , cryptohash-md5
+      , cryptohash-sha1
+      , cryptohash-sha256
+      , cryptohash-sha512
+      , serialise
+  if impl(ghcjs)
+    buildable: False
+  else
+    buildable: True
+  default-language: Haskell2010
diff --git a/main/Main.hs b/main/Main.hs
--- a/main/Main.hs
+++ b/main/Main.hs
@@ -1,38 +1,221 @@
+{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeApplications #-}
+
 module Main where
 
-import Nix.Parser
-import Nix.Pretty
-import Nix.Expr
+import qualified Control.DeepSeq as Deep
+import qualified Control.Exception as Exc
+import           Control.Monad
+import           Control.Monad.Catch
+import           Control.Monad.IO.Class
+-- import           Control.Monad.ST
+import qualified Data.Aeson.Encoding as A
+import qualified Data.Aeson.Text as A
+import qualified Data.HashMap.Lazy as M
+import qualified Data.Map as Map
+import           Data.List (sortOn)
+import           Data.Maybe (fromJust)
+import           Data.Time
+import qualified Data.Text as Text
+import qualified Data.Text.IO as Text
+import qualified Data.Text.Lazy.Encoding as TL
+import qualified Data.Text.Lazy.IO as TL
+import           Nix
+import           Nix.Convert
+import qualified Nix.Eval as Eval
+-- import           Nix.Lint
+import           Nix.Options.Parser
+import qualified Nix.Type.Env as Env
+import qualified Nix.Type.Infer as HM
+import           Nix.Utils
+import           Options.Applicative hiding (ParserResult(..))
+import qualified Repl
+import           System.FilePath
+import           System.IO
+import           Text.PrettyPrint.ANSI.Leijen hiding ((<$>))
+import qualified Text.Show.Pretty as PS
 
-import System.Environment
-import System.IO
-import Text.PrettyPrint.ANSI.Leijen
+main :: IO ()
+main = do
+    time <- liftIO getCurrentTime
+    opts <- execParser (nixOptionsInfo time)
+    runLazyM opts $ case readFrom opts of
+        Just path -> do
+            let file = addExtension (dropExtension path) "nix"
+            process opts (Just file) =<< liftIO (readCache path)
+        Nothing -> case expression opts of
+            Just s -> handleResult opts Nothing (parseNixTextLoc s)
+            Nothing  -> case fromFile opts of
+                Just "-" ->
+                    mapM_ (processFile opts)
+                        =<< (lines <$> liftIO getContents)
+                Just path ->
+                    mapM_ (processFile opts)
+                        =<< (lines <$> liftIO (readFile path))
+                Nothing -> case filePaths opts of
+                    [] -> Repl.shell (pure ())
+                    ["-"] ->
+                        handleResult opts Nothing . parseNixTextLoc
+                            =<< liftIO Text.getContents
+                    paths ->
+                        mapM_ (processFile opts) paths
+  where
+    processFile opts path = do
+        eres <- parseNixFileLoc path
+        handleResult opts (Just path) eres
 
-nix :: FilePath -> IO ()
-nix path = parseNixFile path >>= displayNExpr
+    handleResult opts mpath = \case
+        Failure err ->
+            (if ignoreErrors opts
+             then liftIO . hPutStrLn stderr
+             else errorWithoutStackTrace) $ "Parse failed: " ++ show err
 
-nixString :: String -> IO ()
-nixString = displayNExpr . parseNixString
+        Success expr -> do
+            when (check opts) $ do
+                expr' <- liftIO (reduceExpr mpath expr)
+                case HM.inferTop Env.empty [("it", stripAnnotation expr')] of
+                    Left err ->
+                        errorWithoutStackTrace $ "Type error: " ++ PS.ppShow err
+                    Right ty ->
+                        liftIO $ putStrLn $ "Type of expression: "
+                            ++ PS.ppShow (fromJust (Map.lookup "it" (Env.types ty)))
 
-displayNExpr :: Result NExpr -> IO ()
-displayNExpr = \case
-  Success n -> displayIO stdout $ renderPretty 0.4 80 (prettyNix n)
-  Failure e -> hPutStrLn stderr $ "Parse failed: " ++ show e
+                -- liftIO $ putStrLn $ runST $
+                --     runLintM opts . renderSymbolic =<< lint opts expr
 
-main :: IO ()
-main = do
-  let usageStr = "Parses a nix file and prints to stdout.\n\
-                 \\n\
-                 \Usage:\n\
-                 \  hnix --help\n\
-                 \  hnix <path>\n\
-                 \  hnix --expr <expr>\n"
-  let argErr msg = error $ "Invalid arguments: " ++ msg ++ "\n" ++ usageStr
-  getArgs >>= \case
-    "--help":_ -> putStrLn usageStr
-    "--expr":expr:_ -> nixString expr
-    "--expr":_ -> argErr "Provide an expression."
-    ('-':_):_ -> argErr "Provide a path to a nix file."
-    path:_ -> nix path
-    _ -> argErr "Provide a path to a nix file."
+            catch (process opts mpath expr) $ \case
+                NixException frames ->
+                    errorWithoutStackTrace . show
+                        =<< renderFrames @(NThunk (Lazy IO)) frames
+
+            when (repl opts) $ Repl.shell (pure ())
+
+    process opts mpath expr
+        | evaluate opts, tracing opts =
+              evaluateExpression mpath
+                  Nix.nixTracingEvalExprLoc printer expr
+
+        | evaluate opts, Just path <- reduce opts =
+              evaluateExpression mpath (reduction path) printer expr
+
+        | evaluate opts, not (null (arg opts) && null (argstr opts)) =
+              evaluateExpression mpath
+                  Nix.nixEvalExprLoc printer expr
+
+        | evaluate opts =
+              processResult printer =<< Nix.nixEvalExprLoc mpath expr
+
+        | xml opts =
+              error "Rendering expression trees to XML is not yet implemented"
+
+        | json opts =
+              liftIO $ TL.putStrLn $
+                  A.encodeToLazyText (stripAnnotation expr)
+
+        | verbose opts >= DebugInfo =
+              liftIO $ putStr $ PS.ppShow $ stripAnnotation expr
+
+        | cache opts, Just path <- mpath =
+              liftIO $ writeCache (addExtension (dropExtension path) "nixc") expr
+
+        | parseOnly opts =
+              void $ liftIO $ Exc.evaluate $ Deep.force expr
+
+        | otherwise =
+              liftIO $ displayIO stdout
+                  . renderPretty 0.4 80
+                  . prettyNix
+                  . stripAnnotation $ expr
+      where
+        printer :: forall e m. (MonadNix e m, MonadIO m, Typeable m)
+                => NValue m -> m ()
+        printer
+            | finder opts =
+              fromValue @(AttrSet (NThunk m)) >=> findAttrs
+            | xml opts =
+              liftIO . putStrLn . toXML <=< normalForm
+            | json opts =
+              liftIO . TL.putStrLn
+                     . TL.decodeUtf8
+                     . A.encodingToLazyByteString
+                     . toEncodingSorted
+                     <=< fromNix
+            | normalize opts =
+              liftIO . print . prettyNValueNF <=< normalForm
+            | values opts  =
+              liftIO . print <=< prettyNValueProv
+            | otherwise  =
+              liftIO . print <=< prettyNValue
+          where
+            findAttrs = go ""
+              where
+                go prefix s = do
+                    xs <- forM (sortOn fst (M.toList s))
+                        $ \(k, nv@(NThunk _ t)) -> case t of
+                            Value v -> pure (k, Just v)
+                            Thunk _ _ ref -> do
+                                let path = prefix ++ Text.unpack k
+                                    (_, descend) = filterEntry path k
+                                val <- readVar ref
+                                case val of
+                                    Computed _ -> pure (k, Nothing)
+                                    _ | descend   -> (k,) <$> forceEntry path nv
+                                      | otherwise -> pure (k, Nothing)
+
+                    forM_ xs $ \(k, mv) -> do
+                        let path = prefix ++ Text.unpack k
+                            (report, descend) = filterEntry path k
+                        when report $ do
+                            liftIO $ putStrLn path
+                            when descend $ case mv of
+                                Nothing -> return ()
+                                Just v -> case v of
+                                    NVSet s' _ -> go (path ++ ".") s'
+                                    _ -> return ()
+                  where
+                    filterEntry path k = case (path, k) of
+                        ("stdenv", "stdenv")           -> (True,  True)
+                        (_,        "stdenv")           -> (False, False)
+                        (_,        "out")              -> (True,  False)
+                        (_,        "src")              -> (True,  False)
+                        (_,        "mirrorsFile")      -> (True,  False)
+                        (_,        "buildPhase")       -> (True,  False)
+                        (_,        "builder")          -> (False,  False)
+                        (_,        "drvPath")          -> (False,  False)
+                        (_,        "outPath")          -> (False,  False)
+                        (_,        "__impureHostDeps") -> (False,  False)
+                        (_,        "__sandboxProfile") -> (False,  False)
+                        ("pkgs",   "pkgs")             -> (True,  True)
+                        (_,        "pkgs")             -> (False, False)
+                        (_,        "drvAttrs")         -> (False, False)
+                        _ -> (True, True)
+
+                    forceEntry k v = catch (Just <$> force v pure)
+                        $ \(NixException frames) -> do
+                              liftIO . putStrLn
+                                     . ("Exception forcing " ++)
+                                     . (k ++)
+                                     . (": " ++) . show
+                                  =<< renderFrames @(NThunk (Lazy IO)) frames
+                              return Nothing
+
+    reduction path mp x = do
+        eres <- Nix.withNixContext mp $
+            Nix.reducingEvalExpr (Eval.eval . annotated . getCompose) mp x
+        handleReduced path eres
+
+    handleReduced :: (MonadThrow m, MonadIO m)
+                  => FilePath
+                  -> (NExprLoc, Either SomeException (NValue m))
+                  -> m (NValue m)
+    handleReduced path (expr', eres) = do
+        liftIO $ do
+            putStrLn $ "Wrote winnowed expression tree to " ++ path
+            writeFile path $ show $ prettyNix (stripAnnotation expr')
+        case eres of
+            Left err -> throwM err
+            Right v  -> return v
diff --git a/main/Repl.hs b/main/Repl.hs
new file mode 100644
--- /dev/null
+++ b/main/Repl.hs
@@ -0,0 +1,196 @@
+{- This code was authored by:
+
+     Stephen Diehl
+     Kwang Yul Seo <kwangyul.seo@gmail.com>
+
+   It was made available under the MIT license. See the src/Nix/Type
+   directory for more details.
+-}
+
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+
+{-# OPTIONS_GHC -Wno-unused-matches #-}
+{-# OPTIONS_GHC -Wno-unused-imports #-}
+
+module Repl where
+
+import           Nix
+import           Nix.Convert
+import           Nix.Eval
+import           Nix.Scope
+import qualified Nix.Type.Env as Env
+import           Nix.Type.Infer
+import           Nix.Utils
+
+import qualified Data.HashMap.Lazy as M
+import           Data.List (isPrefixOf, foldl')
+import qualified Data.Map as Map
+import           Data.Monoid
+import           Data.Text (unpack, pack)
+import qualified Data.Text as Text
+import qualified Data.Text.IO as Text
+
+import           Control.Monad.Identity
+import           Control.Monad.Reader
+import           Control.Monad.State.Strict
+
+import           System.Console.Haskeline.MonadException
+import           System.Console.Repline
+import           System.Environment
+import           System.Exit
+
+-------------------------------------------------------------------------------
+-- Types
+-------------------------------------------------------------------------------
+
+data TermEnv
+
+data IState = IState
+  { -- tyctx :: Env.Env  -- Type environment
+  -- ,
+    tmctx :: TermEnv  -- Value environment
+  }
+
+initState :: IState
+initState = IState {-Env.empty-} undefined
+
+type Repl e m a = HaskelineT (StateT IState m) a
+hoistErr :: MonadIO m => Result a -> Repl e m a
+hoistErr (Success val) = return val
+hoistErr (Failure err) = do
+  liftIO $ print err
+  abort
+
+-------------------------------------------------------------------------------
+-- Execution
+-------------------------------------------------------------------------------
+
+exec :: forall e m. (MonadNix e m, MonadIO m, MonadException m)
+     => Bool -> Text.Text -> Repl e m ()
+exec update source = do
+  -- Get the current interpreter state
+  st <- get
+
+  -- Parser ( returns AST )
+  expr <- hoistErr $ parseNixTextLoc source
+
+  -- Type Inference ( returns Typing Environment )
+  -- tyctx' <- hoistErr $ inferTop (tyctx st) expr
+
+  -- Create the new environment
+  let st' = st { tmctx = tmctx st -- foldl' evalDef (tmctx st) expr
+               -- , tyctx = tyctx' <> tyctx st
+               }
+
+  -- Update the interpreter state
+  when update (put st')
+
+  -- If a value is entered, print it.
+  lift $ lift $ do
+    -- jww (2018-04-12): Once the user is able to establish definitions in
+    -- the repl, they should be passed here.
+    pushScope @(NThunk m) M.empty $ catch (go expr) $ \case
+      NixException frames -> do
+        liftIO . print =<< renderFrames @(NThunk m) frames
+ where
+  go expr = do
+    val <- evalExprLoc expr
+    opts :: Nix.Options <- asks (view hasLens)
+    if | normalize opts ->
+         liftIO . print . prettyNValueNF =<< normalForm val
+       | values opts ->
+         liftIO . print =<< prettyNValueProv val
+       | otherwise ->
+         liftIO . print =<< prettyNValue val
+
+cmd :: (MonadNix e m, MonadIO m, MonadException m) => String -> Repl e m ()
+cmd source = exec True (Text.pack source)
+
+-------------------------------------------------------------------------------
+-- Commands
+-------------------------------------------------------------------------------
+
+-- :browse command
+browse :: MonadNix e m => [String] -> Repl e m ()
+browse _ = do
+  st <- get
+  undefined
+  -- liftIO $ mapM_ putStrLn $ ppenv (tyctx st)
+
+-- :load command
+load :: (MonadNix e m, MonadIO m, MonadException m) => [String] -> Repl e m ()
+load args = do
+  contents <- liftIO $ Text.readFile (unwords args)
+  exec True contents
+
+-- :type command
+-- typeof :: [String] -> Repl e m ()
+-- typeof args = do
+--   st <- get
+--   let arg = unwords args
+--   case Env.lookup (pack arg) (tyctx st) of
+--     Just val -> liftIO $ putStrLn $ undefined -- ppsignature (arg, val)
+--     Nothing -> exec False (Text.pack arg)
+
+-- :quit command
+quit :: (MonadNix e m, MonadIO m) => a -> Repl e m ()
+quit _ = liftIO exitSuccess
+
+-------------------------------------------------------------------------------
+-- Interactive Shell
+-------------------------------------------------------------------------------
+
+-- Prefix tab completer
+defaultMatcher :: MonadIO m => [(String, CompletionFunc m)]
+defaultMatcher = [
+    (":load"  , fileCompleter)
+  --, (":type"  , values)
+  ]
+
+-- Default tab completer
+comp :: (Monad m, MonadState IState m) => WordCompleter m
+comp n = do
+  let cmds = [":load", ":type", ":browse", ":quit"]
+  -- Env.TypeEnv ctx <- gets tyctx
+  -- let defs = map unpack $ Map.keys ctx
+  return $ filter (isPrefixOf n) (cmds {-++ defs-})
+
+options :: (MonadNix e m, MonadIO m, MonadException m)
+        => [(String, [String] -> Repl e m ())]
+options = [
+    ("load"   , load)
+  , ("browse" , browse)
+  , ("quit"   , quit)
+  -- , ("type"   , Repl.typeof)
+  ]
+
+-------------------------------------------------------------------------------
+-- Entry Point
+-------------------------------------------------------------------------------
+
+completer :: (MonadNix e m, MonadIO m) => CompleterStyle (StateT IState m)
+completer = Prefix (wordCompleter comp) defaultMatcher
+
+shell :: (MonadNix e m, MonadIO m, MonadException m) => Repl e m a -> m ()
+shell pre = flip evalStateT initState $
+    evalRepl "hnix> " cmd options completer pre
+
+-------------------------------------------------------------------------------
+-- Toplevel
+-------------------------------------------------------------------------------
+
+-- main :: IO ()
+-- main = do
+--   args <- getArgs
+--   case args of
+--     []      -> shell (return ())
+--     [fname] -> shell (load [fname])
+--     ["test", fname] -> shell (load [fname] >> browse [] >> quit ())
+--     _ -> putStrLn "invalid arguments"
diff --git a/src/Nix.hs b/src/Nix.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix.hs
@@ -0,0 +1,151 @@
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE ViewPatterns #-}
+
+module Nix (module Nix.Cache,
+            module Nix.Exec,
+            module Nix.Expr,
+            module Nix.Frames,
+            module Nix.Render.Frame,
+            module Nix.Normal,
+            module Nix.Options,
+            module Nix.Parser,
+            module Nix.Pretty,
+            module Nix.Reduce,
+            module Nix.Thunk,
+            module Nix.Value,
+            module Nix.XML,
+            withNixContext,
+            nixEvalExpr, nixEvalExprLoc, nixTracingEvalExprLoc,
+            evaluateExpression, processResult) where
+
+import           Control.Applicative
+import           Control.Arrow (second)
+import           Control.Monad.Reader
+import           Data.Fix
+import qualified Data.HashMap.Lazy as M
+import qualified Data.Text as Text
+import qualified Data.Text.Read as Text
+import           Nix.Builtins
+import           Nix.Cache
+import qualified Nix.Eval as Eval
+import           Nix.Exec
+import           Nix.Expr
+import           Nix.Frames
+import           Nix.Normal
+import           Nix.Options
+import           Nix.Parser
+import           Nix.Pretty
+import           Nix.Reduce
+import           Nix.Render.Frame
+import           Nix.Scope
+import           Nix.Thunk
+import           Nix.Utils
+import           Nix.Value
+import           Nix.XML
+
+-- | Evaluate a nix expression in the default context
+withNixContext :: forall e m r. (MonadNix e m, Has e Options)
+               => Maybe FilePath -> m r -> m r
+withNixContext mpath action = do
+    base <- builtins
+    opts :: Options <- asks (view hasLens)
+    let i = value @(NValue m) @(NThunk m) @m $ nvList $
+            map (value @(NValue m) @(NThunk m) @m
+                     . flip nvStr mempty . Text.pack) (include opts)
+    pushScope (M.singleton "__includes" i) $
+        pushScopes base $ case mpath of
+            Nothing -> action
+            Just path -> do
+                traceM $ "Setting __cur_file = " ++ show path
+                let ref = value @(NValue m) @(NThunk m) @m $ nvPath path
+                pushScope (M.singleton "__cur_file" ref) action
+
+-- | This is the entry point for all evaluations, whatever the expression tree
+--   type. It sets up the common Nix environment and applies the
+--   transformations, allowing them to be easily composed.
+nixEval :: (MonadNix e m, Has e Options, Functor f)
+        => Maybe FilePath -> Transform f (m a) -> Alg f (m a) -> Fix f -> m a
+nixEval mpath xform alg = withNixContext mpath . adi alg xform
+
+-- | Evaluate a nix expression in the default context
+nixEvalExpr :: forall e m. (MonadNix e m, Has e Options)
+            => Maybe FilePath -> NExpr -> m (NValue m)
+nixEvalExpr mpath = nixEval mpath id Eval.eval
+
+-- | Evaluate a nix expression in the default context
+nixEvalExprLoc :: forall e m. (MonadNix e m, Has e Options)
+               => Maybe FilePath -> NExprLoc -> m (NValue m)
+nixEvalExprLoc mpath =
+    nixEval mpath (Eval.addStackFrames @(NThunk m) . Eval.addSourcePositions)
+            (Eval.eval . annotated . getCompose)
+
+-- | Evaluate a nix expression with tracing in the default context. Note that
+--   this function doesn't do any tracing itself, but 'evalExprLoc' will be
+--   'tracing' is set to 'True' in the Options structure (accessible through
+--   'MonadNix'). All this function does is provide the right type class
+--   context.
+nixTracingEvalExprLoc
+    :: forall e m. (MonadNix e m, Has e Options, MonadIO m, Alternative m)
+    => Maybe FilePath -> NExprLoc -> m (NValue m)
+nixTracingEvalExprLoc mpath = withNixContext mpath . evalExprLoc
+
+evaluateExpression
+    :: (MonadNix e m, Has e Options)
+    => Maybe FilePath
+    -> (Maybe FilePath -> NExprLoc -> m (NValue m))
+    -> (NValue m -> m a)
+    -> NExprLoc
+    -> m a
+evaluateExpression mpath evaluator handler expr = do
+    opts :: Options <- asks (view hasLens)
+    args <- traverse (traverse eval') $
+        map (second parseArg) (arg opts) ++
+        map (second mkStr) (argstr opts)
+    compute evaluator expr (argmap args) handler
+  where
+    parseArg s = case parseNixText s of
+        Success x -> x
+        Failure err -> errorWithoutStackTrace (show err)
+
+    eval' = (normalForm =<<) . nixEvalExpr mpath
+
+    argmap args = embed $ Fix $ NVSetF (M.fromList args) mempty
+
+    compute ev x args p = do
+         f <- ev mpath x
+         processResult p =<< case f of
+             NVClosure _ g -> g args
+             _ -> pure f
+
+processResult :: forall e m a. (MonadNix e m, Has e Options)
+              => (NValue m -> m a) -> NValue m -> m a
+processResult h val = do
+    opts :: Options <- asks (view hasLens)
+    case attr opts of
+        Nothing -> h val
+        Just (Text.splitOn "." -> keys) -> go keys val
+  where
+    go :: [Text.Text] -> NValue m -> m a
+    go [] v = h v
+    go ((Text.decimal -> Right (n,"")):ks) v = case v of
+        NVList xs -> case ks of
+            [] -> force @(NValue m) @(NThunk m) (xs !! n) h
+            _  -> force (xs !! n) (go ks)
+        _ -> errorWithoutStackTrace $
+                "Expected a list for selector '" ++ show n
+                    ++ "', but got: " ++ show v
+    go (k:ks) v = case v of
+        NVSet xs _ -> case M.lookup k xs of
+            Nothing ->
+                errorWithoutStackTrace $
+                    "Set does not contain key '"
+                        ++ Text.unpack k ++ "'"
+            Just v' -> case ks of
+                [] -> force v' h
+                _  -> force v' (go ks)
+        _ -> errorWithoutStackTrace $
+            "Expected a set for selector '" ++ Text.unpack k
+                ++ "', but got: " ++ show v
diff --git a/src/Nix/Atoms.hs b/src/Nix/Atoms.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Atoms.hs
@@ -0,0 +1,43 @@
+{-# LANGUAGE CPP            #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Nix.Atoms where
+
+#if MIN_VERSION_serialise(0, 2, 0)
+import Codec.Serialise
+#endif
+import Control.DeepSeq
+import Data.Data
+import Data.Hashable
+import Data.Text (Text, pack)
+import GHC.Generics
+
+-- | Atoms are values that evaluate to themselves. This means that
+-- they appear in both the parsed AST (in the form of literals) and
+-- the evaluated form.
+data NAtom
+  -- | An integer. The c nix implementation currently only supports
+  -- integers that fit in the range of 'Int64'.
+  = NInt Integer
+  -- | A floating point number
+  | NFloat Float
+  -- | Booleans.
+  | NBool Bool
+  -- | Null values. There's only one of this variant.
+  | NNull
+  deriving (Eq, Ord, Generic, Typeable, Data, Show, Read, NFData,
+            Hashable)
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance Serialise NAtom
+#endif
+
+-- | Translate an atom into its nix representation.
+atomText :: NAtom -> Text
+atomText (NInt i)   = pack (show i)
+atomText (NFloat f) = pack (show f)
+atomText (NBool b)  = if b then "true" else "false"
+atomText NNull      = "null"
diff --git a/src/Nix/Builtins.hs b/src/Nix/Builtins.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Builtins.hs
@@ -0,0 +1,996 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PackageImports #-}
+{-# LANGUAGE PartialTypeSignatures #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE ViewPatterns #-}
+
+{-# OPTIONS_GHC -Wno-missing-signatures #-}
+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
+
+module Nix.Builtins (builtins) where
+
+import           Control.Monad
+import           Control.Monad.Catch
+import           Control.Monad.ListM (sortByM)
+import           Control.Monad.Reader (asks)
+
+-- Using package imports here because there is a bug in cabal2nix that forces
+-- us to put the hashing package in the unconditional dependency list.
+-- See https://github.com/NixOS/cabal2nix/issues/348 for more info
+#if MIN_VERSION_hashing(0, 1, 0)
+import           Crypto.Hash
+import qualified "hashing" Crypto.Hash.MD5 as MD5
+import qualified "hashing" Crypto.Hash.SHA1 as SHA1
+import qualified "hashing" Crypto.Hash.SHA256 as SHA256
+import qualified "hashing" Crypto.Hash.SHA512 as SHA512
+#else
+import           Data.ByteString.Base16 as Base16
+import qualified "cryptohash-md5" Crypto.Hash.MD5 as MD5
+import qualified "cryptohash-sha1" Crypto.Hash.SHA1 as SHA1
+import qualified "cryptohash-sha256" Crypto.Hash.SHA256 as SHA256
+import qualified "cryptohash-sha512" Crypto.Hash.SHA512 as SHA512
+#endif
+import qualified Data.Aeson as A
+import qualified Data.Aeson.Encoding as A
+import           Data.Align (alignWith)
+import           Data.Array
+import           Data.ByteString (ByteString)
+import qualified Data.ByteString as B
+import qualified Data.ByteString.Lazy as LBS
+import           Data.Char (isDigit)
+import           Data.Coerce
+import           Data.Fix
+import           Data.Foldable (foldrM)
+import qualified Data.HashMap.Lazy as M
+import           Data.List
+import           Data.Maybe
+import           Data.Semigroup
+import           Data.Set (Set)
+import qualified Data.Set as S
+import           Data.Text (Text)
+import qualified Data.Text as Text
+import           Data.Text.Encoding
+import qualified Data.Text.Lazy as LazyText
+import qualified Data.Text.Lazy.Builder as Builder
+import           Data.These (fromThese)
+import qualified Data.Time.Clock.POSIX as Time
+import           Data.Traversable (mapM)
+import           Language.Haskell.TH.Syntax (addDependentFile, runIO)
+import           Nix.Atoms
+import           Nix.Convert
+import           Nix.Effects
+import qualified Nix.Eval as Eval
+import           Nix.Exec
+import           Nix.Expr.Types
+import           Nix.Expr.Types.Annotated
+import           Nix.Frames
+import           Nix.Normal
+import           Nix.Options
+import           Nix.Parser
+import           Nix.Render
+import           Nix.Scope
+import           Nix.Thunk
+import           Nix.Utils
+import           Nix.Value
+import           Nix.XML
+import           System.FilePath
+import           System.Posix.Files
+import           Text.Regex.TDFA
+
+builtins :: (MonadNix e m, Scoped e (NThunk m) m)
+         => m (Scopes m (NThunk m))
+builtins = do
+    ref <- thunk $ flip nvSet M.empty <$> buildMap
+    lst <- ([("builtins", ref)] ++) <$> topLevelBuiltins
+    pushScope (M.fromList lst) currentScopes
+  where
+    buildMap = M.fromList . map mapping <$> builtinsList
+    topLevelBuiltins = map mapping <$> fullBuiltinsList
+
+    fullBuiltinsList = map go <$> builtinsList
+      where
+        go b@(Builtin TopLevel _) = b
+        go (Builtin Normal (name, builtin)) =
+            Builtin TopLevel ("__" <> name, builtin)
+
+data BuiltinType = Normal | TopLevel
+data Builtin m = Builtin
+    { _kind   :: BuiltinType
+    , mapping :: (Text, NThunk m)
+    }
+
+valueThunk :: forall e m. MonadNix e m => NValue m -> NThunk m
+valueThunk = value @_ @_ @m
+
+force' :: forall e m. MonadNix e m => NThunk m -> m (NValue m)
+force' = force ?? pure
+
+builtinsList :: forall e m. MonadNix e m => m [ Builtin m ]
+builtinsList = sequence [
+      do version <- toValue ("2.0" :: Text)
+         pure $ Builtin Normal ("nixVersion", version)
+
+    , do version <- toValue (5 :: Int)
+         pure $ Builtin Normal ("langVersion", version)
+
+    , add0 Normal   "nixPath"                    nixPath
+    , add  TopLevel "abort"                      throw_ -- for now
+    , add2 Normal   "add"                        add_
+    , add2 Normal   "all"                        all_
+    , add2 Normal   "any"                        any_
+    , add  Normal   "attrNames"                  attrNames
+    , add  Normal   "attrValues"                 attrValues
+    , add  TopLevel "baseNameOf"                 baseNameOf
+    , add2 Normal   "catAttrs"                   catAttrs
+    , add2 Normal   "compareVersions"            compareVersions_
+    , add  Normal   "concatLists"                concatLists
+    , add' Normal   "concatStringsSep"           (arity2 Text.intercalate)
+    , add0 Normal   "currentSystem"              currentSystem
+    , add0 Normal   "currentTime"                currentTime_
+    , add2 Normal   "deepSeq"                    deepSeq
+#if MIN_VERSION_base(4, 10, 0)
+    -- TODO Remove this CPP after the Lift instance for NExpr works with GHC 8.0
+    , add0 TopLevel "derivation"                 $(do
+          let f = "data/nix/corepkgs/derivation.nix"
+          addDependentFile f
+          Success expr <- runIO $ parseNixFile f
+          [| cata Eval.eval expr |]
+      )
+#endif
+    , add  TopLevel "derivationStrict"           derivationStrict_
+    , add  TopLevel "dirOf"                      dirOf
+    , add2 Normal   "div"                        div_
+    , add2 Normal   "elem"                       elem_
+    , add2 Normal   "elemAt"                     elemAt_
+    , add  Normal   "exec"                       exec_
+    , add0 Normal   "false"                      (return $ nvConstant $ NBool False)
+    , add  Normal   "fetchTarball"               fetchTarball
+    , add  Normal   "fetchurl"                   fetchurl
+    , add2 Normal   "filter"                     filter_
+    , add3 Normal   "foldl'"                     foldl'_
+    , add  Normal   "fromJSON"                   fromJSON
+    , add  Normal   "functionArgs"               functionArgs
+    , add2 Normal   "genList"                    genList
+    , add  Normal   "genericClosure"             genericClosure
+    , add2 Normal   "getAttr"                    getAttr
+    , add  Normal   "getEnv"                     getEnv_
+    , add2 Normal   "hasAttr"                    hasAttr
+    , add  Normal   "hasContext"                 hasContext
+    , add' Normal   "hashString"                 hashString
+    , add  Normal   "head"                       head_
+    , add  TopLevel "import"                     import_
+    , add2 Normal   "intersectAttrs"             intersectAttrs
+    , add  Normal   "isAttrs"                    isAttrs
+    , add  Normal   "isBool"                     isBool
+    , add  Normal   "isFloat"                    isFloat
+    , add  Normal   "isFunction"                 isFunction
+    , add  Normal   "isInt"                      isInt
+    , add  Normal   "isList"                     isList
+    , add  TopLevel "isNull"                     isNull
+    , add  Normal   "isString"                   isString
+    , add  Normal   "length"                     length_
+    , add2 Normal   "lessThan"                   lessThan
+    , add  Normal   "listToAttrs"                listToAttrs
+    , add2 TopLevel "map"                        map_
+    , add2 Normal   "match"                      match_
+    , add2 Normal   "mul"                        mul_
+    , add0 Normal   "null"                       (return $ nvConstant NNull)
+    , add  Normal   "parseDrvName"               parseDrvName
+    , add2 Normal   "partition"                  partition_
+    , add  Normal   "pathExists"                 pathExists_
+    , add  TopLevel "placeholder"                placeHolder
+    , add  Normal   "readDir"                    readDir_
+    , add  Normal   "readFile"                   readFile_
+    , add2 TopLevel "removeAttrs"                removeAttrs
+    , add3 Normal   "replaceStrings"             replaceStrings
+    , add2 TopLevel "scopedImport"               scopedImport
+    , add2 Normal   "seq"                        seq_
+    , add2 Normal   "sort"                       sort_
+    , add2 Normal   "split"                      split_
+    , add  Normal   "splitVersion"               splitVersion_
+    , add0 Normal   "storeDir"                   (return $ nvPath "/nix/store")
+    , add' Normal   "stringLength"               (arity1 Text.length)
+    , add' Normal   "sub"                        (arity2 ((-) @Integer))
+    , add' Normal   "substring"                  substring
+    , add  Normal   "tail"                       tail_
+    , add0 Normal   "true"                       (return $ nvConstant $ NBool True)
+    , add  TopLevel "throw"                      throw_
+    , add' Normal   "toJSON"
+      (arity1 $ decodeUtf8 . LBS.toStrict . A.encodingToLazyByteString
+                           . toEncodingSorted)
+    , add  Normal   "toPath"                     toPath
+    , add  TopLevel "toString"                   toString
+    , add  Normal   "toXML"                      toXML_
+    , add2 TopLevel "trace"                      trace_
+    , add  Normal   "tryEval"                    tryEval
+    , add  Normal   "typeOf"                     typeOf
+    , add  Normal   "unsafeDiscardStringContext" unsafeDiscardStringContext
+    , add2 Normal   "unsafeGetAttrPos"           unsafeGetAttrPos
+    , add  Normal   "valueSize"                  getRecursiveSize
+  ]
+  where
+    wrap t n f = Builtin t (n, f)
+
+    arity1 f = Prim . pure . f
+    arity2 f = ((Prim . pure) .) . f
+
+    mkThunk n = thunk . withFrame Info
+        (ErrorCall $ "While calling builtin " ++ Text.unpack n ++ "\n")
+
+    add0 t n v = wrap t n <$> mkThunk n v
+    add  t n v = wrap t n <$> mkThunk n (builtin  (Text.unpack n) v)
+    add2 t n v = wrap t n <$> mkThunk n (builtin2 (Text.unpack n) v)
+    add3 t n v = wrap t n <$> mkThunk n (builtin3 (Text.unpack n) v)
+
+    add' :: ToBuiltin m a => BuiltinType -> Text -> a -> m (Builtin m)
+    add' t n v = wrap t n <$> mkThunk n (toBuiltin (Text.unpack n) v)
+
+-- Primops
+
+foldNixPath :: forall e m r. MonadNix e m
+            => (FilePath -> Maybe String -> r -> m r) -> r -> m r
+foldNixPath f z = do
+    mres <- lookupVar @_ @(NThunk m) "__includes"
+    dirs <- case mres of
+        Nothing -> return []
+        Just v  -> fromNix @[Text] v
+    menv <- getEnvVar "NIX_PATH"
+    foldrM go z $ dirs ++ case menv of
+        Nothing -> []
+        Just str -> Text.splitOn ":" (Text.pack str)
+  where
+    go x rest = case Text.splitOn "=" x of
+        [p]    -> f (Text.unpack p) Nothing rest
+        [n, p] -> f (Text.unpack p) (Just (Text.unpack n)) rest
+        _ -> throwError $ ErrorCall $ "Unexpected entry in NIX_PATH: " ++ show x
+
+nixPath :: MonadNix e m => m (NValue m)
+nixPath = fmap nvList $ flip foldNixPath [] $ \p mn rest ->
+    pure $ valueThunk
+        (flip nvSet mempty $ M.fromList
+            [ ("path",   valueThunk $ nvPath p)
+            , ("prefix", valueThunk $
+                   nvStr (Text.pack (fromMaybe "" mn)) mempty) ]) : rest
+
+toString :: MonadNix e m => m (NValue m) -> m (NValue m)
+toString str =
+    str >>= normalForm >>= valueText False >>= toNix @(Text, DList Text)
+
+hasAttr :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+hasAttr x y =
+    fromValue @Text x >>= \key ->
+    fromValue @(AttrSet (NThunk m), AttrSet SourcePos) y >>= \(aset, _) ->
+        toNix $ M.member key aset
+
+attrsetGet :: MonadNix e m => Text -> AttrSet t -> m t
+attrsetGet k s = case M.lookup k s of
+    Just v -> pure v
+    Nothing ->
+        throwError $ ErrorCall $ "Attribute '" ++ Text.unpack k ++ "' required"
+
+hasContext :: MonadNix e m => m (NValue m) -> m (NValue m)
+hasContext =
+    toNix . not . null . (appEndo ?? []) . snd <=< fromValue @(Text, DList Text)
+
+getAttr :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+getAttr x y = x >>= \x' -> y >>= \y' -> case (x', y') of
+    (NVStr key _, NVSet aset _) -> attrsetGet key aset >>= force'
+    (x, y) -> throwError $ ErrorCall $ "Invalid types for builtin.getAttr: "
+                 ++ show (x, y)
+
+unsafeGetAttrPos :: forall e m. MonadNix e m
+                 => m (NValue m) -> m (NValue m) -> m (NValue m)
+unsafeGetAttrPos x y = x >>= \x' -> y >>= \y' -> case (x', y') of
+    (NVStr key _, NVSet _ apos) -> case M.lookup key apos of
+        Nothing -> pure $ nvConstant NNull
+        Just delta -> toValue delta
+    (x, y) -> throwError $ ErrorCall $ "Invalid types for builtin.unsafeGetAttrPos: "
+                 ++ show (x, y)
+
+-- This function is a bit special in that it doesn't care about the contents
+-- of the list.
+length_ :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+length_ = toValue . (length :: [NThunk m] -> Int) <=< fromValue
+
+add_ :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+add_ x y = x >>= \x' -> y >>= \y' -> case (x', y') of
+    (NVConstant (NInt x),   NVConstant (NInt y))   ->
+        toNix ( x + y :: Integer)
+    (NVConstant (NFloat x), NVConstant (NInt y))   -> toNix (x + fromInteger y)
+    (NVConstant (NInt x),   NVConstant (NFloat y)) -> toNix (fromInteger x + y)
+    (NVConstant (NFloat x), NVConstant (NFloat y)) -> toNix (x + y)
+    (_, _) ->
+        throwError $ Addition x' y'
+
+mul_ :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+mul_ x y = x >>= \x' -> y >>= \y' -> case (x', y') of
+    (NVConstant (NInt x),   NVConstant (NInt y))   ->
+        toNix ( x * y :: Integer)
+    (NVConstant (NFloat x), NVConstant (NInt y))   -> toNix (x * fromInteger y)
+    (NVConstant (NInt x),   NVConstant (NFloat y)) -> toNix (fromInteger x * y)
+    (NVConstant (NFloat x), NVConstant (NFloat y)) -> toNix (x * y)
+    (_, _) ->
+        throwError $ Multiplication x' y'
+
+div_ :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+div_ x y = x >>= \x' -> y >>= \y' -> case (x', y') of
+    (NVConstant (NInt x),   NVConstant (NInt y))   ->
+        toNix (floor (fromInteger x / fromInteger y :: Double) :: Integer)
+    (NVConstant (NFloat x), NVConstant (NInt y))   -> toNix (x / fromInteger y)
+    (NVConstant (NInt x),   NVConstant (NFloat y)) -> toNix (fromInteger x / y)
+    (NVConstant (NFloat x), NVConstant (NFloat y)) -> toNix (x / y)
+    (_, _) ->
+        throwError $ Division x' y'
+
+anyM :: Monad m => (a -> m Bool) -> [a] -> m Bool
+anyM _ []       = return False
+anyM p (x:xs)   = do
+        q <- p x
+        if q then return True
+             else anyM p xs
+
+any_ :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+any_ fun xs = fun >>= \f ->
+    toNix <=< anyM fromValue <=< mapM ((f `callFunc`) . force')
+          <=< fromValue $ xs
+
+allM :: Monad m => (a -> m Bool) -> [a] -> m Bool
+allM _ []       = return True
+allM p (x:xs)   = do
+        q <- p x
+        if q then allM p xs
+             else return False
+
+all_ :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+all_ fun xs = fun >>= \f ->
+    toNix <=< allM fromValue <=< mapM ((f `callFunc`) . force')
+          <=< fromValue $ xs
+
+foldl'_ :: forall e m. MonadNix e m
+        => m (NValue m) -> m (NValue m) -> m (NValue m) -> m (NValue m)
+foldl'_ fun z xs =
+    fun >>= \f -> fromValue @[NThunk m] xs >>= foldl' (go f) z
+  where
+    go f b a = f `callFunc` b >>= (`callFunc` force' a)
+
+head_ :: MonadNix e m => m (NValue m) -> m (NValue m)
+head_ = fromValue >=> \case
+    [] -> throwError $ ErrorCall "builtins.head: empty list"
+    h:_ -> force' h
+
+tail_ :: MonadNix e m => m (NValue m) -> m (NValue m)
+tail_ = fromValue >=> \case
+    [] -> throwError $ ErrorCall "builtins.tail: empty list"
+    _:t -> return $ nvList t
+
+data VersionComponent
+   = VersionComponent_Pre -- ^ The string "pre"
+   | VersionComponent_String Text -- ^ A string other than "pre"
+   | VersionComponent_Number Integer -- ^ A number
+   deriving (Show, Read, Eq, Ord)
+
+versionComponentToString :: VersionComponent -> Text
+versionComponentToString = \case
+  VersionComponent_Pre -> "pre"
+  VersionComponent_String s -> s
+  VersionComponent_Number n -> Text.pack $ show n
+
+-- | Based on https://github.com/NixOS/nix/blob/4ee4fda521137fed6af0446948b3877e0c5db803/src/libexpr/names.cc#L44
+versionComponentSeparators :: String
+versionComponentSeparators = ".-"
+
+splitVersion :: Text -> [VersionComponent]
+splitVersion s = case Text.uncons s of
+    Nothing -> []
+    Just (h, t)
+      | h `elem` versionComponentSeparators -> splitVersion t
+      | isDigit h ->
+          let (digits, rest) = Text.span isDigit s
+          in VersionComponent_Number (read $ Text.unpack digits) : splitVersion rest
+      | otherwise ->
+          let (chars, rest) = Text.span (\c -> not $ isDigit c || c `elem` versionComponentSeparators) s
+              thisComponent = case chars of
+                  "pre" -> VersionComponent_Pre
+                  x -> VersionComponent_String x
+          in thisComponent : splitVersion rest
+
+splitVersion_ :: MonadNix e m => m (NValue m) -> m (NValue m)
+splitVersion_ = fromValue >=> \s -> do
+    let vals = flip map (splitVersion s) $ \c ->
+            valueThunk $ nvStr (versionComponentToString c) mempty
+    return $ nvList vals
+
+compareVersions :: Text -> Text -> Ordering
+compareVersions s1 s2 =
+    mconcat $ alignWith f (splitVersion s1) (splitVersion s2)
+  where
+    z = VersionComponent_String ""
+    f = uncurry compare . fromThese z z
+
+compareVersions_ :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+compareVersions_ t1 t2 =
+    fromValue t1 >>= \s1 ->
+    fromValue t2 >>= \s2 ->
+        return $ nvConstant $ NInt $ case compareVersions s1 s2 of
+            LT -> -1
+            EQ -> 0
+            GT -> 1
+
+splitDrvName :: Text -> (Text, Text)
+splitDrvName s =
+    let sep = "-"
+        pieces = Text.splitOn sep s
+        isFirstVersionPiece p = case Text.uncons p of
+            Just (h, _) | isDigit h -> True
+            _ -> False
+        -- Like 'break', but always puts the first item into the first result
+        -- list
+        breakAfterFirstItem :: (a -> Bool) -> [a] -> ([a], [a])
+        breakAfterFirstItem f = \case
+            h : t ->
+                let (a, b) = break f t
+                in (h : a, b)
+            [] -> ([], [])
+        (namePieces, versionPieces) =
+          breakAfterFirstItem isFirstVersionPiece pieces
+    in (Text.intercalate sep namePieces, Text.intercalate sep versionPieces)
+
+parseDrvName :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+parseDrvName = fromValue >=> \(s :: Text) -> do
+    let (name :: Text, version :: Text) = splitDrvName s
+    -- jww (2018-04-15): There should be an easier way to write this.
+    (toValue =<<) $ sequence $ M.fromList
+        [ ("name" :: Text, thunk (toValue @_ @_ @(NValue m) name))
+        , ("version",     thunk (toValue version)) ]
+
+match_ :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+match_ pat str =
+    fromValue pat >>= \p ->
+    fromValue str >>= \s -> do
+        let re = makeRegex (encodeUtf8 p) :: Regex
+        case matchOnceText re (encodeUtf8 s) of
+            Just ("", sarr, "") -> do
+                let s = map fst (elems sarr)
+                nvList <$> traverse (toValue . decodeUtf8)
+                    (if length s > 1 then tail s else s)
+            _ -> pure $ nvConstant NNull
+
+split_ :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+split_ pat str =
+    fromValue pat >>= \p ->
+    fromValue str >>= \s -> do
+        let re = makeRegex (encodeUtf8 p) :: Regex
+            haystack = encodeUtf8 s
+        return $ nvList $
+            splitMatches 0 (map elems $ matchAllText re haystack) haystack
+
+splitMatches
+  :: forall e m. MonadNix e m
+  => Int
+  -> [[(ByteString, (Int, Int))]]
+  -> ByteString
+  -> [NThunk m]
+splitMatches _ [] haystack = [thunkStr haystack]
+splitMatches _ ([]:_) _ = error "Error in splitMatches: this should never happen!"
+splitMatches numDropped (((_,(start,len)):captures):mts) haystack =
+    thunkStr before : caps : splitMatches (numDropped + relStart + len) mts (B.drop len rest)
+  where
+    relStart = max 0 start - numDropped
+    (before,rest) = B.splitAt relStart haystack
+    caps = valueThunk $ nvList (map f captures)
+    f (a,(s,_)) = if s < 0 then valueThunk (nvConstant NNull) else thunkStr a
+
+thunkStr s = valueThunk (nvStr (decodeUtf8 s) mempty)
+
+substring :: MonadNix e m => Int -> Int -> Text -> Prim m Text
+substring start len str = Prim $
+    if start < 0 --NOTE: negative values of 'len' are OK
+    then throwError $ ErrorCall $ "builtins.substring: negative start position: " ++ show start
+    else pure $ Text.take len $ Text.drop start str
+
+attrNames :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+attrNames = fromValue @(ValueSet m) >=> toNix . sort . M.keys
+
+attrValues :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+attrValues = fromValue @(ValueSet m) >=>
+    toValue . fmap snd . sortOn (fst @Text @(NThunk m)) . M.toList
+
+map_ :: forall e m. MonadNix e m
+     => m (NValue m) -> m (NValue m) -> m (NValue m)
+map_ fun xs = fun >>= \f ->
+    toNix <=< traverse (thunk . withFrame Debug
+                                    (ErrorCall "While applying f in map:\n")
+                              . (f `callFunc`) . force')
+          <=< fromValue @[NThunk m] $ xs
+
+filter_ :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+filter_ fun xs = fun >>= \f ->
+    toNix <=< filterM (fromValue <=< callFunc f . force')
+          <=< fromValue @[NThunk m] $ xs
+
+catAttrs :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+catAttrs attrName xs =
+    fromValue @Text attrName >>= \n ->
+    fromValue @[NThunk m] xs >>= \l ->
+        fmap (nvList . catMaybes) $
+            forM l $ fmap (M.lookup n) . fromValue
+
+baseNameOf :: MonadNix e m => m (NValue m) -> m (NValue m)
+baseNameOf x = x >>= \case
+    NVStr path ctx -> pure $ nvStr (Text.pack $ takeFileName $ Text.unpack path) ctx
+    NVPath path -> pure $ nvPath $ takeFileName path
+    v -> throwError $ ErrorCall $ "dirOf: expected string or path, got " ++ show v
+
+dirOf :: MonadNix e m => m (NValue m) -> m (NValue m)
+dirOf x = x >>= \case
+    NVStr path ctx -> pure $ nvStr (Text.pack $ takeDirectory $ Text.unpack path) ctx
+    NVPath path -> pure $ nvPath $ takeDirectory path
+    v -> throwError $ ErrorCall $ "dirOf: expected string or path, got " ++ show v
+
+-- jww (2018-04-28): This should only be a string argument, and not coerced?
+unsafeDiscardStringContext :: MonadNix e m => m (NValue m) -> m (NValue m)
+unsafeDiscardStringContext = fromValue @Text >=> toNix
+
+seq_ :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+seq_ a b = a >> b
+
+deepSeq :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+deepSeq a b = do
+    -- We evaluate 'a' only for its effects, so data cycles are ignored.
+    _ <- normalFormBy (forceEffects . coerce . _baseThunk) 0 =<< a
+
+    -- Then we evaluate the other argument to deepseq, thus this function
+    -- should always produce a result (unlike applying 'deepseq' on infinitely
+    -- recursive data structures in Haskell).
+    b
+
+elem_ :: forall e m. MonadNix e m
+      => m (NValue m) -> m (NValue m) -> m (NValue m)
+elem_ x xs = x >>= \x' ->
+    toValue <=< anyM (valueEq x' <=< force') <=< fromValue @[NThunk m] $ xs
+
+elemAt :: [a] -> Int -> Maybe a
+elemAt ls i = case drop i ls of
+   [] -> Nothing
+   a:_ -> Just a
+
+elemAt_ :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+elemAt_ xs n = fromValue n >>= \n' -> fromValue xs >>= \xs' ->
+    case elemAt xs' n' of
+      Just a -> force' a
+      Nothing -> throwError $ ErrorCall $ "builtins.elem: Index " ++ show n'
+          ++ " too large for list of length " ++ show (length xs')
+
+genList :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+genList generator = fromValue @Integer >=> \n ->
+    if n >= 0
+    then generator >>= \f ->
+        toNix =<< forM [0 .. n - 1] (\i -> thunk $ f `callFunc` toNix i)
+    else throwError $ ErrorCall $ "builtins.genList: Expected a non-negative number, got "
+             ++ show n
+
+genericClosure :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+genericClosure = fromValue @(AttrSet (NThunk m)) >=> \s ->
+    case (M.lookup "startSet" s, M.lookup "operator" s) of
+      (Nothing, Nothing) ->
+          throwError $ ErrorCall $
+              "builtins.genericClosure: "
+                  ++ "Attributes 'startSet' and 'operator' required"
+      (Nothing, Just _) ->
+          throwError $ ErrorCall $
+              "builtins.genericClosure: Attribute 'startSet' required"
+      (Just _, Nothing) ->
+          throwError $ ErrorCall $
+              "builtins.genericClosure: Attribute 'operator' required"
+      (Just startSet, Just operator) ->
+          fromValue @[NThunk m] startSet >>= \ss ->
+          force operator $ \op ->
+              toValue @[NThunk m] =<< snd <$> go op ss S.empty
+  where
+    go :: NValue m -> [NThunk m] -> Set (NValue m)
+       -> m (Set (NValue m), [NThunk m])
+    go _ [] ks = pure (ks, [])
+    go op (t:ts) ks =
+        force t $ \v -> fromValue @(AttrSet (NThunk m)) t >>= \s ->
+            case M.lookup "key" s of
+                Nothing ->
+                    throwError $ ErrorCall $
+                        "builtins.genericClosure: Attribute 'key' required"
+                Just k -> force k $ \k' ->
+                    if S.member k' ks
+                        then go op ts ks
+                        else do
+                            ys <- fromValue @[NThunk m] =<< (op `callFunc` pure v)
+                            case S.toList ks of
+                                []  -> checkComparable k' k'
+                                j:_ -> checkComparable k' j
+                            fmap (t:) <$> go op (ts ++ ys) (S.insert k' ks)
+
+replaceStrings :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m) -> m (NValue m)
+replaceStrings tfrom tto ts =
+    fromNix tfrom >>= \(from :: [Text]) ->
+    fromNix tto   >>= \(to   :: [Text]) ->
+    fromValue ts  >>= \(s    :: Text) -> do
+        when (length from /= length to) $
+            throwError $ ErrorCall $
+                "'from' and 'to' arguments to 'replaceStrings'"
+                    ++ " have different lengths"
+        let lookupPrefix s = do
+                (prefix, replacement) <-
+                    find ((`Text.isPrefixOf` s) . fst) $ zip from to
+                let rest = Text.drop (Text.length prefix) s
+                return (prefix, replacement, rest)
+            finish = LazyText.toStrict . Builder.toLazyText
+            go orig result = case lookupPrefix orig of
+                Nothing -> case Text.uncons orig of
+                    Nothing -> finish result
+                    Just (h, t) -> go t $ result <> Builder.singleton h
+                Just (prefix, replacement, rest) -> case prefix of
+                    "" -> case Text.uncons rest of
+                        Nothing -> finish $ result <> Builder.fromText replacement
+                        Just (h, t) -> go t $ mconcat
+                            [ result
+                            , Builder.fromText replacement
+                            , Builder.singleton h
+                            ]
+                    _ -> go rest $ result <> Builder.fromText replacement
+        toNix $ go s mempty
+
+removeAttrs :: forall e m. MonadNix e m
+            => m (NValue m) -> m (NValue m) -> m (NValue m)
+removeAttrs set = fromNix >=> \(toRemove :: [Text]) ->
+    fromValue @(AttrSet (NThunk m),
+                AttrSet SourcePos) set >>= \(m, p) ->
+        toNix (go m toRemove, go p toRemove)
+  where
+    go = foldl' (flip M.delete)
+
+intersectAttrs :: forall e m. MonadNix e m
+               => m (NValue m) -> m (NValue m) -> m (NValue m)
+intersectAttrs set1 set2 =
+    fromValue @(AttrSet (NThunk m),
+                AttrSet SourcePos) set1 >>= \(s1, p1) ->
+    fromValue @(AttrSet (NThunk m),
+                AttrSet SourcePos) set2 >>= \(s2, p2) ->
+        return $ nvSet (s2 `M.intersection` s1) (p2 `M.intersection` p1)
+
+functionArgs :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+functionArgs fun = fun >>= \case
+    NVClosure p _ -> toValue @(AttrSet (NThunk m)) $
+        valueThunk . nvConstant . NBool <$>
+            case p of
+                Param name -> M.singleton name False
+                ParamSet s _ _ -> isJust <$> M.fromList s
+    v -> throwError $ ErrorCall $
+            "builtins.functionArgs: expected function, got " ++ show v
+
+toPath :: MonadNix e m => m (NValue m) -> m (NValue m)
+toPath = fromValue @Path >=> toNix @Path
+
+pathExists_ :: MonadNix e m => m (NValue m) -> m (NValue m)
+pathExists_ path = path >>= \case
+    NVPath p  -> toNix =<< pathExists p
+    NVStr s _ -> toNix =<< pathExists (Text.unpack s)
+    v -> throwError $ ErrorCall $
+            "builtins.pathExists: expected path, got " ++ show v
+
+hasKind :: forall a e m. (MonadNix e m, FromValue a m (NValue m))
+        => m (NValue m) -> m (NValue m)
+hasKind = fromValueMay >=> toNix . \case Just (_ :: a) -> True; _ -> False
+
+isAttrs :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+isAttrs = hasKind @(ValueSet m)
+
+isList :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+isList = hasKind @[NThunk m]
+
+isString :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+isString = hasKind @Text
+
+isInt :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+isInt = hasKind @Int
+
+isFloat :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+isFloat = hasKind @Float
+
+isBool :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+isBool = hasKind @Bool
+
+isNull :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+isNull = hasKind @()
+
+isFunction :: MonadNix e m => m (NValue m) -> m (NValue m)
+isFunction func = func >>= \case
+    NVClosure {} -> toValue True
+    _ -> toValue False
+
+throw_ :: MonadNix e m => m (NValue m) -> m (NValue m)
+throw_ = fromValue >=> throwError . ErrorCall . Text.unpack
+
+import_ :: MonadNix e m => m (NValue m) -> m (NValue m)
+import_ = fromValue >=> importPath M.empty . getPath
+
+scopedImport :: forall e m. MonadNix e m
+             => m (NValue m) -> m (NValue m) -> m (NValue m)
+scopedImport aset path =
+    fromValue aset >>= \s ->
+    fromValue   path >>= \p -> importPath @m s (getPath p)
+
+getEnv_ :: MonadNix e m => m (NValue m) -> m (NValue m)
+getEnv_ = fromValue >=> \s -> do
+    mres <- getEnvVar (Text.unpack s)
+    toNix $ case mres of
+        Nothing -> ""
+        Just v  -> Text.pack v
+
+sort_ :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+sort_ comparator xs = comparator >>= \comp ->
+    fromValue xs >>= sortByM (cmp comp) >>= toValue
+  where
+    cmp f a b = do
+        isLessThan <- f `callFunc` force' a >>= (`callFunc` force' b)
+        fromValue isLessThan >>= \case
+            True -> pure LT
+            False -> do
+                isGreaterThan <- f `callFunc` force' b >>= (`callFunc` force' a)
+                fromValue isGreaterThan <&> \case
+                    True  -> GT
+                    False -> EQ
+
+lessThan :: MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+lessThan ta tb = ta >>= \va -> tb >>= \vb -> do
+    let badType = throwError $ ErrorCall $
+            "builtins.lessThan: expected two numbers or two strings, "
+                ++ "got " ++ show va ++ " and " ++ show vb
+    nvConstant . NBool <$> case (va, vb) of
+        (NVConstant ca, NVConstant cb) -> case (ca, cb) of
+            (NInt   a, NInt   b) -> pure $ a < b
+            (NFloat a, NInt   b) -> pure $ a < fromInteger b
+            (NInt   a, NFloat b) -> pure $ fromInteger a < b
+            (NFloat a, NFloat b) -> pure $ a < b
+            _ -> badType
+        (NVStr a _, NVStr b _) -> pure $ a < b
+        _ -> badType
+
+concatLists :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+concatLists = fromValue @[NThunk m]
+    >=> mapM (fromValue @[NThunk m] >=> pure)
+    >=> toValue . concat
+
+listToAttrs :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+listToAttrs = fromValue @[NThunk m] >=> \l ->
+    fmap (flip nvSet M.empty . M.fromList . reverse) $
+        forM l $ fromValue @(AttrSet (NThunk m)) >=> \s -> do
+            name <- attrsetGet "name" s
+            val  <- attrsetGet "value" s
+            fromValue name <&> (, val)
+
+hashString :: MonadNix e m => Text -> Text -> Prim m Text
+hashString algo s = Prim $ do
+    case algo of
+        "md5"    -> pure $
+#if MIN_VERSION_hashing(0, 1, 0)
+          Text.pack $ show (hash (encodeUtf8 s) :: MD5.MD5)
+#else
+          decodeUtf8 $ Base16.encode $ MD5.hash $ encodeUtf8 s
+#endif
+        "sha1"   -> pure $
+#if MIN_VERSION_hashing(0, 1, 0)
+          Text.pack $ show (hash (encodeUtf8 s) :: SHA1.SHA1)
+#else
+          decodeUtf8 $ Base16.encode $ SHA1.hash $ encodeUtf8 s
+#endif
+        "sha256" -> pure $
+#if MIN_VERSION_hashing(0, 1, 0)
+          Text.pack $ show (hash (encodeUtf8 s) :: SHA256.SHA256)
+#else
+          decodeUtf8 $ Base16.encode $ SHA256.hash $ encodeUtf8 s
+#endif
+        "sha512" -> pure $
+#if MIN_VERSION_hashing(0, 1, 0)
+          Text.pack $ show (hash (encodeUtf8 s) :: SHA512.SHA512)
+#else
+          decodeUtf8 $ Base16.encode $ SHA512.hash $ encodeUtf8 s
+#endif
+        _ -> throwError $ ErrorCall $ "builtins.hashString: "
+            ++ "expected \"md5\", \"sha1\", \"sha256\", or \"sha512\", got " ++ show algo
+
+placeHolder :: MonadNix e m => m (NValue m) -> m (NValue m)
+placeHolder = fromValue @Text >=> \_ -> do
+    h <- runPrim (hashString "sha256" "fdasdfas")
+    toNix h
+
+absolutePathFromValue :: MonadNix e m => NValue m -> m FilePath
+absolutePathFromValue = \case
+    NVStr pathText _ -> do
+        let path = Text.unpack pathText
+        unless (isAbsolute path) $
+            throwError $ ErrorCall $ "string " ++ show path ++ " doesn't represent an absolute path"
+        pure path
+    NVPath path -> pure path
+    v -> throwError $ ErrorCall $ "expected a path, got " ++ show v
+
+readFile_ :: MonadNix e m => m (NValue m) -> m (NValue m)
+readFile_ path =
+    path >>= absolutePathFromValue >>= Nix.Render.readFile >>= toNix
+
+data FileType
+   = FileTypeRegular
+   | FileTypeDirectory
+   | FileTypeSymlink
+   | FileTypeUnknown
+   deriving (Show, Read, Eq, Ord)
+
+instance Applicative m => ToNix FileType m (NValue m) where
+    toNix = toNix . \case
+        FileTypeRegular   -> "regular" :: Text
+        FileTypeDirectory -> "directory"
+        FileTypeSymlink   -> "symlink"
+        FileTypeUnknown   -> "unknown"
+
+readDir_ :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+readDir_ pathThunk = do
+    path  <- absolutePathFromValue =<< pathThunk
+    items <- listDirectory path
+    itemsWithTypes <- forM items $ \item -> do
+        s <- Nix.Effects.getSymbolicLinkStatus $ path </> item
+        let t = if
+                | isRegularFile s  -> FileTypeRegular
+                | isDirectory s    -> FileTypeDirectory
+                | isSymbolicLink s -> FileTypeSymlink
+                | otherwise        -> FileTypeUnknown
+        pure (Text.pack item, t)
+    toNix (M.fromList itemsWithTypes)
+
+fromJSON :: MonadNix e m => m (NValue m) -> m (NValue m)
+fromJSON = fromValue >=> \encoded ->
+    case A.eitherDecodeStrict' @A.Value $ encodeUtf8 encoded of
+        Left jsonError ->
+            throwError $ ErrorCall $ "builtins.fromJSON: " ++ jsonError
+        Right v -> toValue v
+
+toXML_ :: MonadNix e m => m (NValue m) -> m (NValue m)
+toXML_ v = v >>= normalForm >>= \x ->
+    pure $ nvStr (Text.pack (toXML x)) mempty
+
+typeOf :: MonadNix e m => m (NValue m) -> m (NValue m)
+typeOf v = v >>= toNix @Text . \case
+    NVConstant a -> case a of
+        NInt _   -> "int"
+        NFloat _ -> "float"
+        NBool _  -> "bool"
+        NNull    -> "null"
+    NVStr _ _     -> "string"
+    NVList _      -> "list"
+    NVSet _ _     -> "set"
+    NVClosure {}  -> "lambda"
+    NVPath _      -> "path"
+    NVBuiltin _ _ -> "lambda"
+    _ -> error "Pattern synonyms obscure complete patterns"
+
+tryEval :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+tryEval e = catch (onSuccess <$> e) (pure . onError)
+  where
+    onSuccess v = flip nvSet M.empty $ M.fromList
+        [ ("success", valueThunk (nvConstant (NBool True)))
+        , ("value", valueThunk v)
+        ]
+
+    onError :: SomeException -> NValue m
+    onError _ = flip nvSet M.empty $ M.fromList
+        [ ("success", valueThunk (nvConstant (NBool False)))
+        , ("value", valueThunk (nvConstant (NBool False)))
+        ]
+
+trace_ :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
+trace_ msg action = do
+  traceEffect . Text.unpack =<< fromValue @Text msg
+  action
+
+exec_ :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+exec_ xs = do
+  ls <- fromValue @[NThunk m] xs
+  xs <- traverse (fromValue @Text . force') ls
+  exec (map Text.unpack xs)
+
+fetchTarball :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+fetchTarball v = v >>= \case
+    NVSet s _ -> case M.lookup "url" s of
+        Nothing -> throwError $ ErrorCall
+                      "builtins.fetchTarball: Missing url attribute"
+        Just url -> force url $ go (M.lookup "sha256" s)
+    v@NVStr {} -> go Nothing v
+    v -> throwError $ ErrorCall $
+            "builtins.fetchTarball: Expected URI or set, got " ++ show v
+ where
+    go :: Maybe (NThunk m) -> NValue m -> m (NValue m)
+    go msha = \case
+        NVStr uri _ -> fetch uri msha
+        v -> throwError $ ErrorCall $
+                "builtins.fetchTarball: Expected URI or string, got " ++ show v
+
+{- jww (2018-04-11): This should be written using pipes in another module
+    fetch :: Text -> Maybe (NThunk m) -> m (NValue m)
+    fetch uri msha = case takeExtension (Text.unpack uri) of
+        ".tgz" -> undefined
+        ".gz"  -> undefined
+        ".bz2" -> undefined
+        ".xz"  -> undefined
+        ".tar" -> undefined
+        ext -> throwError $ ErrorCall $ "builtins.fetchTarball: Unsupported extension '"
+                  ++ ext ++ "'"
+-}
+
+    fetch :: Text -> Maybe (NThunk m) -> m (NValue m)
+    fetch uri Nothing =
+        nixInstantiateExpr $ "builtins.fetchTarball \"" ++
+            Text.unpack uri ++ "\""
+    fetch url (Just m) = fromValue m >>= \sha ->
+        nixInstantiateExpr $ "builtins.fetchTarball { "
+          ++ "url    = \"" ++ Text.unpack url ++ "\"; "
+          ++ "sha256 = \"" ++ Text.unpack sha ++ "\"; }"
+
+fetchurl :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
+fetchurl v = v >>= \case
+    NVSet s _ -> attrsetGet "url" s >>= force ?? (go (M.lookup "sha256" s))
+    v@NVStr {} -> go Nothing v
+    v -> throwError $ ErrorCall $ "builtins.fetchurl: Expected URI or set, got "
+            ++ show v
+ where
+    go :: Maybe (NThunk m) -> NValue m -> m (NValue m)
+    go _msha = \case
+        NVStr uri _ -> getURL uri -- msha
+        v -> throwError $ ErrorCall $
+                 "builtins.fetchurl: Expected URI or string, got " ++ show v
+
+partition_ :: forall e m. MonadNix e m
+           => m (NValue m) -> m (NValue m) -> m (NValue m)
+partition_ fun xs = fun >>= \f ->
+    fromValue @[NThunk m] xs >>= \l -> do
+        let match t = f `callFunc` force' t >>= fmap (, t) . fromValue
+        selection <- traverse match l
+        let (right, wrong) = partition fst selection
+        let makeSide = valueThunk . nvList . map snd
+        toValue @(AttrSet (NThunk m)) $
+            M.fromList [("right", makeSide right), ("wrong", makeSide wrong)]
+
+currentSystem :: MonadNix e m => m (NValue m)
+currentSystem = do
+  os <- getCurrentSystemOS
+  arch <- getCurrentSystemArch
+  return $ nvStr (arch <> "-" <> os) mempty
+
+currentTime_ :: MonadNix e m => m (NValue m)
+currentTime_ = do
+    opts :: Options <- asks (view hasLens)
+    toNix @Integer $ round $ Time.utcTimeToPOSIXSeconds (currentTime opts)
+
+derivationStrict_ :: MonadNix e m => m (NValue m) -> m (NValue m)
+derivationStrict_ = (>>= derivationStrict)
+
+newtype Prim m a = Prim { runPrim :: m a }
+
+-- | Types that support conversion to nix in a particular monad
+class ToBuiltin m a | a -> m where
+    toBuiltin :: String -> a -> m (NValue m)
+
+instance (MonadNix e m, ToNix a m (NValue m))
+      => ToBuiltin m (Prim m a) where
+    toBuiltin _ p = toNix =<< runPrim p
+
+instance (MonadNix e m, FromNix a m (NValue m), ToBuiltin m b)
+      => ToBuiltin m (a -> b) where
+    toBuiltin name f = return $ nvBuiltin name (fromNix >=> toBuiltin name . f)
diff --git a/src/Nix/Cache.hs b/src/Nix/Cache.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Cache.hs
@@ -0,0 +1,48 @@
+{-# LANGUAGE CPP #-}
+
+module Nix.Cache where
+
+import qualified Data.ByteString.Lazy as BS
+import           Nix.Expr.Types.Annotated
+
+#if defined (__linux__) && MIN_VERSION_base(4, 10, 0)
+#define USE_COMPACT 1
+#endif
+
+#ifdef USE_COMPACT
+import qualified Data.Compact as C
+import qualified Data.Compact.Serialize as C
+#endif
+#if MIN_VERSION_serialise(0, 2, 0)
+import qualified Codec.Serialise as S
+#endif
+
+readCache :: FilePath -> IO NExprLoc
+readCache path = do
+#if USE_COMPACT
+    eres <- C.unsafeReadCompact path
+    case eres of
+        Left err -> error $ "Error reading cache file: " ++ err
+        Right expr -> return $ C.getCompact expr
+#else
+#if MIN_VERSION_serialise(0, 2, 0)
+    eres <- S.deserialiseOrFail <$> BS.readFile path
+    case eres of
+        Left err -> error $ "Error reading cache file: " ++ show err
+        Right expr -> return expr
+#else
+    error "readCache not implemented for this platform"
+#endif
+#endif
+
+writeCache :: FilePath -> NExprLoc -> IO ()
+writeCache path expr =
+#ifdef USE_COMPACT
+    C.writeCompact path =<< C.compact expr
+#else
+#if MIN_VERSION_serialise(0, 2, 0)
+    BS.writeFile path (S.serialise expr)
+#else
+    error "writeCache not implemented for this platform"
+#endif
+#endif
diff --git a/src/Nix/Context.hs b/src/Nix/Context.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Context.hs
@@ -0,0 +1,33 @@
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+module Nix.Context where
+
+import Nix.Options
+import Nix.Scope
+import Nix.Frames
+import Nix.Utils
+import Nix.Expr.Types.Annotated (SrcSpan, nullSpan)
+
+data Context m v = Context
+    { scopes  :: Scopes m v
+    , source  :: SrcSpan
+    , frames  :: Frames
+    , options :: Options
+    }
+
+instance Has (Context m v) (Scopes m v) where
+    hasLens f (Context x y z w) = (\x' -> Context x' y z w) <$> f x
+
+instance Has (Context m v) SrcSpan where
+    hasLens f (Context x y z w) = (\y' -> Context x y' z w) <$> f y
+
+instance Has (Context m v) Frames where
+    hasLens f (Context x y z w) = (\z' -> Context x y z' w) <$> f z
+
+instance Has (Context m v) Options where
+    hasLens f (Context x y z w) = (\w' -> Context x y z w') <$> f w
+
+newContext :: Options -> Context m v
+newContext = Context emptyScopes nullSpan []
diff --git a/src/Nix/Convert.hs b/src/Nix/Convert.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Convert.hs
@@ -0,0 +1,583 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DefaultSignatures #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MonoLocalBinds #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+{-# OPTIONS_GHC -Wno-missing-signatures #-}
+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
+
+-- | Although there are a lot of instances in this file, really it's just a
+--   combinatorial explosion of the following combinations:
+--
+--   - Several Haskell types being converted to/from Nix wrappers
+--   - Several types of Nix wrappers
+--   - Whether to be shallow or deep while unwrapping
+
+module Nix.Convert where
+
+import           Control.Monad
+import           Data.Aeson (toJSON)
+import qualified Data.Aeson as A
+import           Data.ByteString
+import           Data.Fix
+import           Data.HashMap.Lazy (HashMap)
+import qualified Data.HashMap.Lazy as M
+import           Data.Scientific
+import           Data.Text (Text)
+import qualified Data.Text as Text
+import           Data.Text.Encoding (encodeUtf8, decodeUtf8)
+import qualified Data.Vector as V
+import           Nix.Atoms
+import           Nix.Effects
+import           Nix.Expr.Types
+import           Nix.Expr.Types.Annotated
+import           Nix.Frames
+import           Nix.Normal
+import           Nix.Thunk
+import           Nix.Utils
+import           Nix.Value
+
+class FromValue a m v where
+    fromValue    :: v -> m a
+    fromValueMay :: v -> m (Maybe a)
+
+type Convertible e m = (Framed e m, MonadVar m, Typeable m)
+
+instance Convertible e m => FromValue () m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVConstantF NNull) -> pure $ Just ()
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ ExpectationNF TNull v
+
+instance Convertible e m
+      => FromValue () m (NValue m) where
+    fromValueMay = \case
+        NVConstant NNull -> pure $ Just ()
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TNull v
+
+instance Convertible e m
+      => FromValue Bool m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVConstantF (NBool b)) -> pure $ Just b
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ ExpectationNF TBool v
+
+instance Convertible e m
+      => FromValue Bool m (NValue m) where
+    fromValueMay = \case
+        NVConstant (NBool b) -> pure $ Just b
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TBool v
+
+instance Convertible e m
+      => FromValue Int m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVConstantF (NInt b)) -> pure $ Just (fromInteger b)
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ ExpectationNF TInt v
+
+instance Convertible e m
+      => FromValue Int m (NValue m) where
+    fromValueMay = \case
+        NVConstant (NInt b) -> pure $ Just (fromInteger b)
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TInt v
+
+instance Convertible e m
+      => FromValue Integer m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVConstantF (NInt b)) -> pure $ Just b
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ ExpectationNF TInt v
+
+instance Convertible e m
+      => FromValue Integer m (NValue m) where
+    fromValueMay = \case
+        NVConstant (NInt b) -> pure $ Just b
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TInt v
+
+instance Convertible e m
+      => FromValue Float m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVConstantF (NFloat b)) -> pure $ Just b
+        Fix (NVConstantF (NInt i)) -> pure $ Just (fromInteger i)
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ ExpectationNF TFloat v
+
+instance Convertible e m
+      => FromValue Float m (NValue m) where
+    fromValueMay = \case
+        NVConstant (NFloat b) -> pure $ Just b
+        NVConstant (NInt i) -> pure $ Just (fromInteger i)
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TFloat v
+
+instance (Convertible e m, MonadEffects m)
+      => FromValue Text m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVStrF t _) -> pure $ Just t
+        Fix (NVPathF p) -> Just . Text.pack . unStorePath <$> addPath p
+        Fix (NVSetF s _) -> case M.lookup "outPath" s of
+            Nothing -> pure Nothing
+            Just p -> fromValueMay @Text p
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ ExpectationNF TString v
+
+instance (Convertible e m, MonadThunk (NValue m) (NThunk m) m, MonadEffects m)
+      => FromValue Text m (NValue m) where
+    fromValueMay = \case
+        NVStr t _ -> pure $ Just t
+        NVPath p -> Just . Text.pack . unStorePath <$> addPath p
+        NVSet s _ -> case M.lookup "outPath" s of
+            Nothing -> pure Nothing
+            Just p -> fromValueMay @Text p
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TString v
+
+instance (Convertible e m, MonadEffects m)
+      => FromValue (Text, DList Text) m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVStrF t d) -> pure $ Just (t, d)
+        Fix (NVPathF p) -> Just . (,mempty) . Text.pack . unStorePath <$> addPath p
+        Fix (NVSetF s _) -> case M.lookup "outPath" s of
+            Nothing -> pure Nothing
+            Just p -> fmap (,mempty) <$> fromValueMay @Text p
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ ExpectationNF TString v
+
+instance (Convertible e m, MonadThunk (NValue m) (NThunk m) m, MonadEffects m)
+      => FromValue (Text, DList Text) m (NValue m) where
+    fromValueMay = \case
+        NVStr t d -> pure $ Just (t, d)
+        NVPath p -> Just . (,mempty) . Text.pack . unStorePath <$> addPath p
+        NVSet s _ -> case M.lookup "outPath" s of
+            Nothing -> pure Nothing
+            Just p -> fmap (,mempty) <$> fromValueMay @Text p
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TString v
+
+instance Convertible e m
+      => FromValue ByteString m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVStrF t _) -> pure $ Just (encodeUtf8 t)
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ ExpectationNF TString v
+
+instance Convertible e m
+      => FromValue ByteString m (NValue m) where
+    fromValueMay = \case
+        NVStr t _ -> pure $ Just (encodeUtf8 t)
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TString v
+
+newtype Path = Path { getPath :: FilePath }
+    deriving Show
+
+instance Convertible e m => FromValue Path m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVPathF p) -> pure $ Just (Path p)
+        Fix (NVStrF s _) -> pure $ Just (Path (Text.unpack s))
+        Fix (NVSetF s _) -> case M.lookup "outPath" s of
+            Nothing -> pure Nothing
+            Just p -> fromValueMay @Path p
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ ExpectationNF TPath v
+
+instance (Convertible e m, MonadThunk (NValue m) (NThunk m) m)
+      => FromValue Path m (NValue m) where
+    fromValueMay = \case
+        NVPath p -> pure $ Just (Path p)
+        NVStr s _ -> pure $ Just (Path (Text.unpack s))
+        NVSet s _ -> case M.lookup "outPath" s of
+            Nothing -> pure Nothing
+            Just p -> fromValueMay @Path p
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TPath v
+
+instance (Convertible e m, FromValue a m (NValueNF m), Show a)
+      => FromValue [a] m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVListF l) -> sequence <$> traverse fromValueMay l
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ ExpectationNF TList v
+
+instance Convertible e m => FromValue [NThunk m] m (NValue m) where
+    fromValueMay = \case
+        NVList l -> pure $ Just l
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TList v
+
+instance Convertible e m
+      => FromValue (HashMap Text (NValueNF m)) m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVSetF s _) -> pure $ Just s
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ ExpectationNF TSet v
+
+instance Convertible e m
+      => FromValue (HashMap Text (NThunk m)) m (NValue m) where
+    fromValueMay = \case
+        NVSet s _ -> pure $ Just s
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TSet v
+
+instance Convertible e m
+      => FromValue (HashMap Text (NValueNF m),
+                 HashMap Text SourcePos) m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVSetF s p) -> pure $ Just (s, p)
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ ExpectationNF TSet v
+
+instance Convertible e m
+      => FromValue (HashMap Text (NThunk m),
+                   HashMap Text SourcePos) m (NValue m) where
+    fromValueMay = \case
+        NVSet s p -> pure $ Just (s, p)
+        _ -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TSet v
+
+instance (Convertible e m, MonadThunk (NValue m) (NThunk m) m)
+      => FromValue (NThunk m) m (NValue m) where
+    fromValueMay = pure . Just . value @_ @_ @m
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> error "Impossible, see fromValueMay"
+
+instance (Monad m, FromValue a m v) => FromValue a m (m v) where
+    fromValueMay = (>>= fromValueMay)
+    fromValue    = (>>= fromValue)
+
+instance (MonadThunk (NValue m) (NThunk m) m, FromValue a m (NValue m))
+      => FromValue a m (NThunk m) where
+    fromValueMay = force ?? fromValueMay
+    fromValue    = force ?? fromValue
+
+instance (Convertible e m, MonadEffects m)
+      => FromValue A.Value m (NValueNF m) where
+    fromValueMay = \case
+        Fix (NVConstantF a) -> pure $ Just $ case a of
+            NInt n   -> toJSON n
+            NFloat n -> toJSON n
+            NBool b  -> toJSON b
+            NNull    -> A.Null
+        Fix (NVStrF s _)     -> pure $ Just $ toJSON s
+        Fix (NVListF l)      -> fmap (A.Array . V.fromList) . sequence
+                                  <$> traverse fromValueMay l
+        Fix (NVSetF m _)     -> fmap A.Object . sequence <$> traverse fromValueMay m
+        Fix NVClosureF {}    -> pure Nothing
+        Fix (NVPathF p)      -> Just . toJSON . unStorePath <$> addPath p
+        Fix (NVBuiltinF _ _) -> pure Nothing
+    fromValue v = fromValueMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ CoercionToJsonNF v
+
+class ToValue a m v where
+    toValue :: a -> m v
+
+instance Applicative m => ToValue () m (NValueNF m) where
+    toValue _ = pure . Fix . NVConstantF $ NNull
+
+instance Applicative m => ToValue () m (NValue m) where
+    toValue _ = pure . nvConstant $ NNull
+
+instance Applicative m => ToValue Bool m (NValueNF m) where
+    toValue = pure . Fix . NVConstantF . NBool
+
+instance Applicative m => ToValue Bool m (NValue m) where
+    toValue = pure . nvConstant . NBool
+
+instance Applicative m => ToValue Int m (NValueNF m) where
+    toValue = pure . Fix . NVConstantF . NInt . toInteger
+
+instance Applicative m => ToValue Int m (NValue m) where
+    toValue = pure . nvConstant . NInt . toInteger
+
+instance Applicative m => ToValue Integer m (NValueNF m) where
+    toValue = pure . Fix . NVConstantF . NInt
+
+instance Applicative m => ToValue Integer m (NValue m) where
+    toValue = pure . nvConstant . NInt
+
+instance Applicative m => ToValue Float m (NValueNF m) where
+    toValue = pure . Fix . NVConstantF . NFloat
+
+instance Applicative m => ToValue Float m (NValue m) where
+    toValue = pure . nvConstant . NFloat
+
+instance Applicative m => ToValue Text m (NValueNF m) where
+    toValue = pure . Fix . flip NVStrF mempty
+
+instance Applicative m => ToValue Text m (NValue m) where
+    toValue = pure . flip nvStr mempty
+
+instance Applicative m => ToValue (Text, DList Text) m (NValueNF m) where
+    toValue = pure . Fix . uncurry NVStrF
+
+instance Applicative m => ToValue (Text, DList Text) m (NValue m) where
+    toValue = pure . uncurry nvStr
+
+instance Applicative m => ToValue ByteString m (NValueNF m) where
+    toValue = pure . Fix . flip NVStrF mempty . decodeUtf8
+
+instance Applicative m => ToValue ByteString m (NValue m) where
+    toValue = pure . flip nvStr mempty . decodeUtf8
+
+instance Applicative m => ToValue Path m (NValueNF m) where
+    toValue = pure . Fix . NVPathF . getPath
+
+instance Applicative m => ToValue Path m (NValue m) where
+    toValue = pure . nvPath . getPath
+
+instance MonadThunk (NValue m) (NThunk m) m
+      => ToValue SourcePos m (NValue m) where
+    toValue (SourcePos f l c) = do
+        f' <- toValue (Text.pack f)
+        l' <- toValue (unPos l)
+        c' <- toValue (unPos c)
+        let pos = M.fromList
+                [ ("file" :: Text, value @_ @_ @m f')
+                , ("line",        value @_ @_ @m l')
+                , ("column",      value @_ @_ @m c') ]
+        pure $ nvSet pos mempty
+
+instance (ToValue a m (NValueNF m), Applicative m)
+      => ToValue [a] m (NValueNF m) where
+    toValue = fmap (Fix . NVListF) . traverse toValue
+
+instance Applicative m => ToValue [NThunk m] m (NValue m) where
+    toValue = pure . nvList
+
+instance Applicative m
+      => ToValue (HashMap Text (NValueNF m)) m (NValueNF m) where
+    toValue = pure . Fix . flip NVSetF M.empty
+
+instance Applicative m => ToValue (HashMap Text (NThunk m)) m (NValue m) where
+    toValue = pure . flip nvSet M.empty
+
+instance Applicative m => ToValue (HashMap Text (NValueNF m),
+                HashMap Text SourcePos) m (NValueNF m) where
+    toValue (s, p) = pure $ Fix $ NVSetF s p
+
+instance Applicative m => ToValue (HashMap Text (NThunk m),
+                HashMap Text SourcePos) m (NValue m) where
+    toValue (s, p) = pure $ nvSet s p
+
+instance (MonadThunk (NValue m) (NThunk m) m, ToValue a m (NValue m))
+      => ToValue a m (NThunk m) where
+    toValue = fmap (value @(NValue m) @_ @m) . toValue
+
+instance Applicative m => ToValue Bool m (NExprF r) where
+    toValue = pure . NConstant . NBool
+
+instance Applicative m => ToValue () m (NExprF r) where
+    toValue _ = pure . NConstant $ NNull
+
+whileForcingThunk :: forall s e m r. (Framed e m, Exception s, Typeable m)
+                  => s -> m r -> m r
+whileForcingThunk frame =
+    withFrame Debug (ForcingThunk @m) . withFrame Debug frame
+
+instance (Convertible e m, MonadThunk (NValue m) (NThunk m) m)
+      => ToValue A.Value m (NValue m) where
+    toValue = \case
+        A.Object m -> flip nvSet M.empty
+            <$> traverse (thunk . toValue @_ @_ @(NValue m)) m
+        A.Array l -> nvList <$>
+            traverse (\x -> thunk . whileForcingThunk (CoercionFromJson @m x)
+                                 . toValue $ x) (V.toList l)
+        A.String s -> pure $ nvStr s mempty
+        A.Number n -> pure $ nvConstant $ case floatingOrInteger n of
+            Left r -> NFloat r
+            Right i -> NInt i
+        A.Bool b -> pure $ nvConstant $ NBool b
+        A.Null -> pure $ nvConstant NNull
+
+class FromNix a m v where
+    fromNix :: v -> m a
+    default fromNix :: FromValue a m v => v -> m a
+    fromNix = fromValue
+
+    fromNixMay :: v -> m (Maybe a)
+    default fromNixMay :: FromValue a m v => v -> m (Maybe a)
+    fromNixMay = fromValueMay
+
+instance (Convertible e m, MonadThunk (NValue m) (NThunk m) m,
+          FromNix a m (NValue m))
+      => FromNix [a] m (NValue m) where
+    fromNixMay = \case
+        NVList l -> sequence <$> traverse (`force` fromNixMay) l
+        _ -> pure Nothing
+    fromNix v = fromNixMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TList v
+
+instance (Convertible e m, MonadThunk (NValue m) (NThunk m) m,
+          FromNix a m (NValue m))
+      => FromNix (HashMap Text a) m (NValue m) where
+    fromNixMay = \case
+        NVSet s _ -> sequence <$> traverse (`force` fromNixMay) s
+        _ -> pure Nothing
+    fromNix v = fromNixMay v >>= \case
+        Just b -> pure b
+        _ -> throwError $ Expectation TSet v
+
+instance Convertible e m => FromNix () m (NValueNF m) where
+instance Convertible e m => FromNix () m (NValue m) where
+instance Convertible e m => FromNix Bool m (NValueNF m) where
+instance Convertible e m => FromNix Bool m (NValue m) where
+instance Convertible e m => FromNix Int m (NValueNF m) where
+instance Convertible e m => FromNix Int m (NValue m) where
+instance Convertible e m => FromNix Integer m (NValueNF m) where
+instance Convertible e m => FromNix Integer m (NValue m) where
+instance Convertible e m => FromNix Float m (NValueNF m) where
+instance Convertible e m => FromNix Float m (NValue m) where
+instance (Convertible e m, MonadEffects m) => FromNix Text m (NValueNF m) where
+instance (Convertible e m, MonadEffects m, MonadThunk (NValue m) (NThunk m) m) => FromNix Text m (NValue m) where
+instance (Convertible e m, MonadEffects m) => FromNix (Text, DList Text) m (NValueNF m) where
+instance (Convertible e m, MonadEffects m, MonadThunk (NValue m) (NThunk m) m) => FromNix (Text, DList Text) m (NValue m) where
+instance Convertible e m => FromNix ByteString m (NValueNF m) where
+instance Convertible e m => FromNix ByteString m (NValue m) where
+instance Convertible e m => FromNix Path m (NValueNF m) where
+instance (Convertible e m, MonadThunk (NValue m) (NThunk m) m) => FromNix Path m (NValue m) where
+instance (Convertible e m, FromValue a m (NValueNF m), Show a) => FromNix [a] m (NValueNF m) where
+instance Convertible e m => FromNix (HashMap Text (NValueNF m)) m (NValueNF m) where
+instance Convertible e m => FromNix (HashMap Text (NValueNF m), HashMap Text SourcePos) m (NValueNF m) where
+instance Convertible e m => FromNix (HashMap Text (NThunk m), HashMap Text SourcePos) m (NValue m) where
+instance (Convertible e m, MonadEffects m, MonadThunk (NValue m) (NThunk m) m) => FromNix A.Value m (NValueNF m) where
+
+instance (Convertible e m, MonadEffects m,
+          MonadThunk (NValue m) (NThunk m) m) => FromNix A.Value m (NValue m) where
+    fromNixMay = fromNixMay <=< normalForm
+    fromNix    = fromNix <=< normalForm
+
+instance (Monad m, FromNix a m v) => FromNix a m (m v) where
+    fromNixMay = (>>= fromNixMay)
+    fromNix    = (>>= fromNix)
+
+instance (MonadThunk (NValue m) (NThunk m) m, FromNix a m (NValue m))
+      => FromNix a m (NThunk m) where
+    fromNixMay = force ?? fromNixMay
+    fromNix    = force ?? fromNix
+
+instance MonadThunk (NValue m) (NThunk m) m
+      => FromNix (NThunk m) m (NValue m) where
+    fromNixMay = pure . Just . value
+    fromNix    = pure . value
+
+class ToNix a m v where
+    toNix :: a -> m v
+    default toNix :: ToValue a m v => a -> m v
+    toNix = toValue
+
+instance (Convertible e m, MonadThunk (NValue m) (NThunk m) m,
+          ToNix a m (NValue m))
+      => ToNix [a] m (NValue m) where
+    toNix = fmap nvList
+        . traverse (thunk . ((\v -> whileForcingThunk (ConcerningValue v) (pure v))
+                                <=< toNix))
+
+instance (Convertible e m, MonadThunk (NValue m) (NThunk m) m,
+          ToNix a m (NValue m))
+      => ToNix (HashMap Text a) m (NValue m) where
+    toNix = fmap (flip nvSet M.empty)
+        . traverse (thunk . ((\v -> whileForcingThunk (ConcerningValue v) (pure v))
+                                <=< toNix))
+
+instance Applicative m => ToNix () m (NValueNF m) where
+instance Applicative m => ToNix () m (NValue m) where
+instance Applicative m => ToNix Bool m (NValueNF m) where
+instance Applicative m => ToNix Bool m (NValue m) where
+instance Applicative m => ToNix Int m (NValueNF m) where
+instance Applicative m => ToNix Int m (NValue m) where
+instance Applicative m => ToNix Integer m (NValueNF m) where
+instance Applicative m => ToNix Integer m (NValue m) where
+instance Applicative m => ToNix Float m (NValueNF m) where
+instance Applicative m => ToNix Float m (NValue m) where
+instance Applicative m => ToNix Text m (NValueNF m) where
+instance Applicative m => ToNix Text m (NValue m) where
+instance Applicative m => ToNix (Text, DList Text) m (NValueNF m) where
+instance Applicative m => ToNix (Text, DList Text) m (NValue m) where
+instance Applicative m => ToNix ByteString m (NValueNF m) where
+instance Applicative m => ToNix ByteString m (NValue m) where
+instance Applicative m => ToNix Path m (NValueNF m) where
+instance Applicative m => ToNix Path m (NValue m) where
+instance Applicative m => ToNix (HashMap Text (NValueNF m)) m (NValueNF m) where
+instance Applicative m => ToNix (HashMap Text (NValueNF m), HashMap Text SourcePos) m (NValueNF m) where
+instance Applicative m => ToNix (HashMap Text (NThunk m), HashMap Text SourcePos) m (NValue m) where
+instance (Convertible e m, MonadThunk (NValue m) (NThunk m) m) => ToNix A.Value m (NValue m) where
+instance Applicative m => ToNix Bool m (NExprF r) where
+instance Applicative m => ToNix () m (NExprF r) where
+
+instance (MonadThunk (NValue m) (NThunk m) m, ToNix a m (NValue m))
+      => ToNix a m (NThunk m) where
+    toNix = thunk . toNix
+
+instance (Applicative m, ToNix a m (NValueNF m)) => ToNix [a] m (NValueNF m) where
+    toNix = fmap (Fix . NVListF) . traverse toNix
+
+instance MonadThunk (NValue m) (NThunk m) m => ToNix (NThunk m) m (NValue m) where
+    toNix = force ?? pure
+
+convertNix :: forall a t m v. (FromNix a m t, ToNix a m v, Monad m) => t -> m v
+convertNix = fromNix @a >=> toNix
diff --git a/src/Nix/Effects.hs b/src/Nix/Effects.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Effects.hs
@@ -0,0 +1,40 @@
+module Nix.Effects where
+
+import Data.Text (Text)
+import Nix.Render
+import Nix.Utils
+import Nix.Value
+import System.Posix.Files
+
+-- | A path into the nix store
+newtype StorePath = StorePath { unStorePath :: FilePath }
+
+class MonadFile m => MonadEffects m where
+    -- | Import a path into the nix store, and return the resulting path
+    addPath :: FilePath -> m StorePath
+
+    -- | Determine the absolute path of relative path in the current context
+    makeAbsolutePath :: FilePath -> m FilePath
+    findEnvPath :: String -> m FilePath
+
+    pathExists :: FilePath -> m Bool
+    importPath :: AttrSet (NThunk m) -> FilePath -> m (NValue m)
+
+    getEnvVar :: String -> m (Maybe String)
+    getCurrentSystemOS :: m Text
+    getCurrentSystemArch :: m Text
+
+    listDirectory :: FilePath -> m [FilePath]
+    getSymbolicLinkStatus :: FilePath -> m FileStatus
+
+    derivationStrict :: NValue m -> m (NValue m)
+
+    nixInstantiateExpr :: String -> m (NValue m)
+
+    getURL :: Text -> m (NValue m)
+
+    getRecursiveSize :: a -> m (NValue m)
+
+    traceEffect :: String -> m ()
+
+    exec :: [String] -> m (NValue m)
diff --git a/src/Nix/Eval.hs b/src/Nix/Eval.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Eval.hs
@@ -0,0 +1,442 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ApplicativeDo #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE PartialTypeSignatures #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+
+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
+
+module Nix.Eval where
+
+import           Control.Monad
+import           Control.Monad.Fix
+import           Control.Monad.Reader
+import           Control.Monad.State.Strict
+import           Data.Align.Key
+import           Data.Fix
+import           Data.HashMap.Lazy (HashMap)
+import qualified Data.HashMap.Lazy as M
+import           Data.List (partition, foldl')
+import           Data.List.NonEmpty (NonEmpty(..))
+import           Data.Maybe (fromMaybe, catMaybes)
+import           Data.Text (Text)
+import qualified Data.Text as Text
+import           Data.These
+import           Data.Traversable (for)
+import           Nix.Atoms
+import           Nix.Convert
+import           Nix.Expr
+import           Nix.Frames
+import           Nix.Scope
+import           Nix.Strings (runAntiquoted)
+import           Nix.Thunk
+import           Nix.Utils
+
+class (Show v, Monad m) => MonadEval v m | v -> m where
+    freeVariable :: Text -> m v
+    attrMissing  :: NonEmpty Text -> Maybe v -> m v
+    evaledSym    :: Text -> v -> m v
+
+    evalCurPos      :: m v
+    evalConstant    :: NAtom -> m v
+    evalString      :: NString (m v) -> m v
+    evalLiteralPath :: FilePath -> m v
+    evalEnvPath     :: FilePath -> m v
+    evalUnary       :: NUnaryOp -> v -> m v
+    evalBinary      :: NBinaryOp -> v -> m v -> m v
+    -- ^ The second argument is an action because operators such as boolean &&
+    -- and || may not evaluate the second argument.
+    evalWith        :: m v -> m v -> m v
+    evalIf          :: v -> m v -> m v -> m v
+    evalAssert      :: v -> m v -> m v
+    evalApp         :: v -> m v -> m v
+    evalAbs         :: Params (m v)
+                    -> (forall a. m v -> (AttrSet (m v) -> m v -> m (a, v)) -> m (a, v))
+                    -> m v
+
+{-
+    evalSelect     :: v -> NonEmpty Text -> Maybe (m v) -> m v
+    evalHasAttr    :: v -> NonEmpty Text -> m v
+
+    -- | This and the following methods are intended to allow things like
+    --   adding provenance information.
+    evalListElem   :: [m v] -> Int -> m v -> m v
+    evalList       :: [t] -> m v
+    evalSetElem    :: AttrSet (m v) -> Text -> m v -> m v
+    evalSet        :: AttrSet t -> AttrSet SourcePos -> m v
+    evalRecSetElem :: AttrSet (m v) -> Text -> m v -> m v
+    evalRecSet     :: AttrSet t -> AttrSet SourcePos -> m v
+    evalLetElem    :: Text -> m v -> m v
+    evalLet        :: m v -> m v
+-}
+
+    evalError :: Exception s => s -> m a
+
+type MonadNixEval e v t m =
+    (MonadEval v m,
+     Scoped e t m,
+     MonadThunk v t m,
+     MonadFix m,
+     ToValue Bool m v,
+     ToValue [t] m v,
+     FromValue (Text, DList Text) m v,
+     ToValue (AttrSet t, AttrSet SourcePos) m v,
+     FromValue (AttrSet t, AttrSet SourcePos) m v)
+
+data EvalFrame m v
+    = EvaluatingExpr (Scopes m v) NExprLoc
+    | ForcingExpr (Scopes m v) NExprLoc
+    | Calling String SrcSpan
+    deriving (Show, Typeable)
+
+instance (Typeable m, Typeable v) => Exception (EvalFrame m v)
+
+eval :: forall e v t m. MonadNixEval e v t m => NExprF (m v) -> m v
+
+eval (NSym "__curPos") = evalCurPos
+
+eval (NSym var) =
+    lookupVar var >>= maybe (freeVariable var) (force ?? evaledSym var)
+
+eval (NConstant x)          = evalConstant x
+eval (NStr str)             = evalString str
+eval (NLiteralPath p)       = evalLiteralPath p
+eval (NEnvPath p)           = evalEnvPath p
+eval (NUnary op arg)        = evalUnary op =<< arg
+
+eval (NBinary NApp fun arg) = do
+    scope <- currentScopes @_ @t
+    evalApp ?? withScopes scope arg =<< fun
+
+eval (NBinary op larg rarg) = larg >>= \lval -> evalBinary op lval rarg
+
+eval (NSelect aset attr alt) = do
+    traceM "NSelect"
+    mres <- evalSelect aset attr
+    traceM "NSelect..2"
+    case mres of
+        Right v -> v
+        Left (s, ks) -> fromMaybe (attrMissing ks (Just s)) alt
+
+eval (NHasAttr aset attr) =
+    toValue . either (const False) (const True) =<< evalSelect aset attr
+
+eval (NList l) = do
+    scope <- currentScopes
+    toValue =<< for l (thunk . withScopes @t scope)
+
+eval (NSet binds) = do
+    traceM "NSet..1"
+    (s, p) <- evalBinds True False binds
+    traceM $ "NSet..2: s = " ++ show (void s)
+    traceM $ "NSet..2: p = " ++ show (void p)
+    toValue (s, p)
+
+eval (NRecSet binds) = do
+    traceM "NRecSet..1"
+    (s, p) <- evalBinds True True (desugarBinds (eval . NRecSet) binds)
+    traceM $ "NRecSet..2: s = " ++ show (void s)
+    traceM $ "NRecSet..2: p = " ++ show (void p)
+    toValue (s, p)
+
+eval (NLet binds body) = do
+    traceM "Let..1"
+    (s, _) <- evalBinds True True binds
+    traceM $ "Let..2: s = " ++ show (void s)
+    pushScope s body
+
+eval (NIf cond t f) = cond >>= \v -> evalIf v t f
+
+eval (NWith scope body) = evalWith scope body
+
+eval (NAssert cond body) = cond >>= evalAssert ?? body
+
+eval (NAbs params body) = do
+    -- It is the environment at the definition site, not the call site, that
+    -- needs to be used when evaluating the body and default arguments, hence
+    -- we defer here so the present scope is restored when the parameters and
+    -- body are forced during application.
+    scope <- currentScopes @_ @t
+    evalAbs params $ \arg k ->
+        withScopes @t scope $ do
+            args <- buildArgument params arg
+            pushScope args (k (M.map (`force` pure) args) body)
+
+-- | If you know that the 'scope' action will result in an 'AttrSet t', then
+--   this implementation may be used as an implementation for 'evalWith'.
+evalWithAttrSet :: forall e v t m. MonadNixEval e v t m => m v -> m v -> m v
+evalWithAttrSet scope body = do
+    -- The scope is deliberately wrapped in a thunk here, since it is
+    -- evaluated each time a name is looked up within the weak scope, and
+    -- we want to be sure the action it evaluates is to force a thunk, so
+    -- its value is only computed once.
+    cur <- currentScopes @_ @t
+    s <- thunk $ withScopes cur scope
+    pushWeakScope ?? body $ force s $
+        fmap fst . fromValue @(AttrSet t, AttrSet SourcePos)
+
+attrSetAlter :: forall e v t m. MonadNixEval e v t m
+             => [Text]
+             -> AttrSet (m v)
+             -> m v
+             -> m (AttrSet (m v))
+attrSetAlter [] _ _ =
+    evalError @v $ ErrorCall "invalid selector with no components"
+attrSetAlter (p:ps) m val = case M.lookup p m of
+    Nothing
+        | null ps   -> go
+        | otherwise -> recurse M.empty
+    Just x
+        | null ps   -> go
+        | otherwise ->
+          x >>= fromValue @(AttrSet t, AttrSet SourcePos)
+              >>= \(s, _) -> recurse (force ?? pure <$> s)
+  where
+    go = return $ M.insert p val m
+
+    recurse s = attrSetAlter ps s val <&> \m' ->
+        M.insert p (toValue @(AttrSet t, AttrSet SourcePos)
+                        =<< fmap (, mempty)
+                                 (fmap (value @_ @_ @m) <$> sequence m')) m
+
+desugarBinds :: forall r. ([Binding r] -> r) -> [Binding r] -> [Binding r]
+desugarBinds embed binds = evalState (mapM (go <=< collect) binds) M.empty
+  where
+    collect :: Binding r
+            -> State (HashMap VarName (SourcePos, [Binding r]))
+                     (Either VarName (Binding r))
+    collect (NamedVar (StaticKey x :| y:ys) val p) = do
+        m <- get
+        let v = case M.lookup x m of
+                Nothing     -> (p, [NamedVar (y:|ys) val p])
+                Just (p, v) -> (p, NamedVar (y:|ys) val p : v)
+        put $ M.insert x v m
+        pure $ Left x
+    collect x = pure $ Right x
+
+    go :: Either VarName (Binding r)
+       -> State (HashMap VarName (SourcePos, [Binding r]))
+                (Binding r)
+    go (Right x) = pure x
+    go (Left x) = do
+        Just (p, v) <- gets $ M.lookup x
+        pure $ NamedVar (StaticKey x :| []) (embed v) p
+
+evalBinds :: forall e v t m. MonadNixEval e v t m
+          => Bool
+          -> Bool
+          -> [Binding (m v)]
+          -> m (AttrSet t, AttrSet SourcePos)
+evalBinds allowDynamic recursive binds = do
+    scope <- currentScopes @_ @t
+    buildResult scope . concat =<< mapM (go scope) (moveOverridesLast binds)
+  where
+    moveOverridesLast = (\(x, y) -> y ++ x) .
+        partition (\case NamedVar (StaticKey "__overrides" :| []) _ _pos -> True
+                         _ -> False)
+
+    go :: Scopes m t -> Binding (m v) -> m [([Text], SourcePos, m v)]
+    go _ (NamedVar (StaticKey "__overrides" :| []) finalValue pos) =
+        finalValue >>= fromValue >>= \(o', p') ->
+            -- jww (2018-05-09): What to do with the key position here?
+            return $ map (\(k, v) -> ([k], fromMaybe pos (M.lookup k p'),
+                                     force v pure))
+                         (M.toList o')
+
+    go _ (NamedVar pathExpr finalValue pos) = do
+        let go :: NAttrPath (m v) -> m ([Text], SourcePos, m v)
+            go = \case
+                h :| t -> evalSetterKeyName allowDynamic h >>= \case
+                    Nothing ->
+                        pure ([], nullPos,
+                              toValue @(AttrSet t, AttrSet SourcePos)
+                                  (mempty, mempty))
+                    Just k -> case t of
+                        [] -> pure ([k], pos, finalValue)
+                        x:xs -> do
+                            (restOfPath, _, v) <- go (x:|xs)
+                            pure (k : restOfPath, pos, v)
+        go pathExpr <&> \case
+            -- When there are no path segments, e.g. `${null} = 5;`, we don't
+            -- bind anything
+            ([], _, _) -> []
+            result -> [result]
+
+    go scope (Inherit ms names pos) = fmap catMaybes $ forM names $
+        evalSetterKeyName allowDynamic >=> \case
+            Nothing -> return Nothing
+            Just key -> return $ Just ([key], pos, do
+                mv <- case ms of
+                    Nothing -> withScopes scope $ lookupVar key
+                    Just s -> s
+                        >>= fromValue @(AttrSet t, AttrSet SourcePos)
+                        >>= \(s, _) ->
+                            clearScopes @t $ pushScope s $ lookupVar key
+                case mv of
+                    Nothing -> attrMissing (key :| []) Nothing
+                    Just v -> force v pure)
+
+    buildResult :: Scopes m t
+                -> [([Text], SourcePos, m v)]
+                -> m (AttrSet t, AttrSet SourcePos)
+    buildResult scope bindings = do
+        s <- foldM insert M.empty bindings
+        res <- if recursive
+               then loebM (encapsulate <$> s)
+               else traverse (thunk . withScopes scope) s
+        return (res, foldl' go M.empty bindings)
+      where
+        go m ([k], pos, _) = M.insert k pos m
+        go m _ = m
+
+        encapsulate f attrs =
+            thunk . withScopes scope . pushScope attrs $ f
+
+        insert m (path, _, value) = attrSetAlter path m value
+
+evalSelect :: forall e v t m. MonadNixEval e v t m
+           => m v
+           -> NAttrPath (m v)
+           -> m (Either (v, NonEmpty Text) (m v))
+evalSelect aset attr = do
+    traceM "evalSelect"
+    s <- aset
+    traceM "evalSelect..2"
+    path <- evalSelector True attr
+    traceM $ "evalSelect..3: " ++ show path
+    res <- extract s path
+    traceM "evalSelect..4"
+    return res
+  where
+    extract x path@(k:|ks) = fromValueMay x >>= \case
+        Just (s :: AttrSet t, p :: AttrSet SourcePos) ->
+            case M.lookup k s of
+                Just t -> do
+                    traceM $ "Forcing value at selector " ++ Text.unpack k
+                    case ks of
+                        []   -> pure $ Right $ force t pure
+                        y:ys -> force t $ extract ?? (y:|ys)
+                Nothing ->
+                    Left . (, path) <$> toValue (s, p)
+        Nothing ->
+            return $ Left (x, path)
+
+evalSelector :: (MonadEval v m, FromValue (Text, DList Text) m v)
+             => Bool -> NAttrPath (m v) -> m (NonEmpty Text)
+evalSelector = traverse . evalGetterKeyName
+
+-- | Evaluate a component of an attribute path in a context where we are
+-- *retrieving* a value
+evalGetterKeyName :: (MonadEval v m, FromValue (Text, DList Text) m v)
+                  => Bool -> NKeyName (m v) -> m Text
+evalGetterKeyName canBeDynamic
+    | canBeDynamic = evalKeyNameDynamicNotNull
+    | otherwise    = evalKeyNameStatic
+
+evalKeyNameStatic :: forall v m. MonadEval v m => NKeyName (m v) -> m Text
+evalKeyNameStatic = \case
+    StaticKey k -> pure k
+    _ -> evalError @v $ ErrorCall "dynamic attribute not allowed in this context"
+
+evalKeyNameDynamicNotNull
+    :: forall v m. (MonadEval v m, FromValue (Text, DList Text) m v)
+    => NKeyName (m v) -> m Text
+evalKeyNameDynamicNotNull = evalKeyNameDynamicNullable >=> \case
+    Just k -> pure k
+    Nothing -> evalError @v $ ErrorCall "value is null while a string was expected"
+
+-- | Evaluate a component of an attribute path in a context where we are
+-- *binding* a value
+evalSetterKeyName :: (MonadEval v m, FromValue (Text, DList Text) m v)
+                  => Bool -> NKeyName (m v) -> m (Maybe Text)
+evalSetterKeyName canBeDynamic
+    | canBeDynamic = evalKeyNameDynamicNullable
+    | otherwise    = fmap Just . evalKeyNameStatic
+
+-- | Returns Nothing iff the key value is null
+evalKeyNameDynamicNullable
+    :: forall v m. (MonadEval v m, FromValue (Text, DList Text) m v)
+    => NKeyName (m v)
+    -> m (Maybe Text)
+evalKeyNameDynamicNullable = \case
+    StaticKey k -> pure (Just k)
+    DynamicKey k ->
+        runAntiquoted "\n" assembleString (>>= fromValueMay) k
+            <&> \case Just (t, _) -> Just t
+                      _ -> Nothing
+
+assembleString :: forall v m. (MonadEval v m, FromValue (Text, DList Text) m v)
+               => NString (m v) -> m (Maybe (Text, DList Text))
+assembleString = \case
+    Indented _   parts -> fromParts parts
+    DoubleQuoted parts -> fromParts parts
+  where
+    go = runAntiquoted "\n" (pure . Just . (, mempty)) (>>= fromValueMay)
+
+    fromParts parts = fmap mconcat . sequence <$> mapM go parts
+
+buildArgument :: forall e v t m. MonadNixEval e v t m
+              => Params (m v) -> m v -> m (AttrSet t)
+buildArgument params arg = do
+    scope <- currentScopes @_ @t
+    case params of
+        Param name -> M.singleton name
+            <$> thunk (withScopes scope arg)
+        ParamSet s isVariadic m ->
+            arg >>= fromValue @(AttrSet t, AttrSet SourcePos)
+                >>= \(args, _) -> do
+                let inject = case m of
+                        Nothing -> id
+                        Just n -> M.insert n $ const $
+                            thunk (withScopes scope arg)
+                loebM (inject $ alignWithKey (assemble scope isVariadic)
+                                             args (M.fromList s))
+  where
+    assemble :: Scopes m t
+             -> Bool
+             -> Text
+             -> These t (Maybe (m v))
+             -> AttrSet t
+             -> m t
+    assemble scope isVariadic k = \case
+        That Nothing  ->
+            const $ evalError @v $ ErrorCall $
+                "Missing value for parameter: " ++ show k
+        That (Just f) -> \args ->
+            thunk $ withScopes scope $ pushScope args f
+        This x | isVariadic -> const (pure x)
+               | otherwise  ->
+                 const $ evalError @v $ ErrorCall $
+                     "Unexpected parameter: " ++ show k
+        These x _ -> const (pure x)
+
+addSourcePositions :: (MonadReader e m, Has e SrcSpan)
+                   => Transform NExprLocF (m a)
+addSourcePositions f v@(Fix (Compose (Ann ann _))) =
+    local (set hasLens ann) (f v)
+
+addStackFrames
+    :: forall t e m a. (Scoped e t m, Framed e m, Typeable t, Typeable m)
+    => Transform NExprLocF (m a)
+addStackFrames f v = do
+    scopes <- currentScopes @e @t
+    withFrame Info (EvaluatingExpr scopes v) (f v)
+
+framedEvalExprLoc
+    :: forall t e v m.
+      (MonadNixEval e v t m, Framed e m, Has e SrcSpan,
+       Typeable t, Typeable m)
+    => NExprLoc -> m v
+framedEvalExprLoc = adi (eval . annotated . getCompose)
+                        (addStackFrames @t . addSourcePositions)
diff --git a/src/Nix/Exec.hs b/src/Nix/Exec.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Exec.hs
@@ -0,0 +1,758 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ApplicativeDo #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PartialTypeSignatures #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE ViewPatterns #-}
+
+{-# OPTIONS_GHC -Wno-missing-signatures #-}
+{-# OPTIONS_GHC -Wno-orphans #-}
+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
+
+module Nix.Exec where
+
+import           Control.Applicative
+import           Control.Monad
+import           Control.Monad.Catch
+import           Control.Monad.Fix
+import           Control.Monad.IO.Class
+import           Control.Monad.Reader
+import           Control.Monad.State.Strict
+import           Control.Monad.Trans.Reader (ReaderT(..))
+import           Control.Monad.Trans.State.Strict (StateT(..))
+import qualified Data.ByteString as BS
+import           Data.Coerce
+import           Data.Fix
+import           Data.HashMap.Lazy (HashMap)
+import qualified Data.HashMap.Lazy as M
+import           Data.IORef
+import           Data.List
+import qualified Data.List.NonEmpty as NE
+import           Data.List.Split
+import           Data.Text (Text)
+import qualified Data.Text as Text
+import           Data.Typeable
+import           Network.HTTP.Client
+import           Network.HTTP.Client.TLS
+import           Network.HTTP.Types
+import           Nix.Atoms
+import           Nix.Context
+import           Nix.Convert
+import           Nix.Effects
+import           Nix.Eval as Eval
+import           Nix.Expr
+import           Nix.Frames
+import           Nix.Normal
+import           Nix.Options
+import           Nix.Parser
+import           Nix.Pretty
+import           Nix.Render
+import           Nix.Scope
+import           Nix.Thunk
+import           Nix.Utils
+import           Nix.Value
+#if MIN_VERSION_haskeline(0, 4, 7)
+import           System.Console.Haskeline.MonadException hiding (catch)
+#endif
+import           System.Directory
+import           System.Environment
+import           System.Exit (ExitCode (ExitSuccess))
+import           System.FilePath
+import qualified System.Info
+import           System.Posix.Files
+import           System.Process (readProcessWithExitCode)
+import           Text.PrettyPrint.ANSI.Leijen (text)
+import qualified Text.PrettyPrint.ANSI.Leijen as P
+
+#ifdef MIN_VERSION_ghc_datasize
+#if MIN_VERSION_ghc_datasize(0,2,0) && __GLASGOW_HASKELL__ >= 804
+import           GHC.DataSize
+#endif
+#endif
+
+type MonadNix e m =
+    (Scoped e (NThunk m) m, Framed e m, Has e SrcSpan, Has e Options,
+     Typeable m, MonadVar m, MonadEffects m, MonadFix m, MonadCatch m,
+     Alternative m)
+
+data ExecFrame m = Assertion SrcSpan (NValue m)
+    deriving (Show, Typeable)
+
+instance Typeable m => Exception (ExecFrame m)
+
+nverr :: forall s e m a. (MonadNix e m, Exception s) => s -> m a
+nverr = evalError @(NValue m)
+
+currentPos :: forall e m. (MonadReader e m, Has e SrcSpan) => m SrcSpan
+currentPos = asks (view hasLens)
+
+wrapExprLoc :: SrcSpan -> NExprLocF r -> NExprLoc
+wrapExprLoc span x = Fix (Fix (NSym_ span "<?>") <$ x)
+
+instance MonadNix e m => MonadThunk (NValue m) (NThunk m) m where
+    thunk mv = do
+        opts :: Options <- asks (view hasLens)
+
+        if thunks opts
+            then do
+                frames :: Frames <- asks (view hasLens)
+
+                -- Gather the current evaluation context at the time of thunk
+                -- creation, and record it along with the thunk.
+                let go (fromException ->
+                            Just (EvaluatingExpr scope
+                                     (Fix (Compose (Ann span e))))) =
+                        let e' = Compose (Ann span (Nothing <$ e))
+                        in [Provenance scope e']
+                    go _ = []
+                    ps = concatMap (go . frame) frames
+
+                fmap (NThunk ps . coerce) . buildThunk $ mv
+            else
+                fmap (NThunk [] . coerce) . buildThunk $ mv
+
+    -- The ThunkLoop exception is thrown as an exception with MonadThrow,
+    -- which does not capture the current stack frame information to provide
+    -- it in a NixException, so we catch and re-throw it here using
+    -- 'throwError' from Frames.hs.
+    force (NThunk ps t) f = catch go (throwError @ThunkLoop)
+      where
+        go = case ps of
+            [] -> forceThunk t f
+            Provenance scope e@(Compose (Ann span _)):_ ->
+                withFrame Info (ForcingExpr scope (wrapExprLoc span e))
+                    (forceThunk t f)
+
+    value = NThunk [] . coerce . valueRef
+
+{-
+prov :: MonadNix e m
+     => (NValue m -> Provenance m) -> NValue m -> m (NValue m)
+prov p v = do
+    opts :: Options <- asks (view hasLens)
+    pure $ if values opts
+           then addProvenance p v
+           else v
+-}
+
+instance MonadNix e m => MonadEval (NValue m) m where
+    freeVariable var =
+        nverr $ ErrorCall $ "Undefined variable '" ++ Text.unpack var ++ "'"
+
+    attrMissing ks Nothing =
+        evalError @(NValue m) $ ErrorCall $
+            "Inheriting unknown attribute: "
+                ++ intercalate "." (map Text.unpack (NE.toList ks))
+
+    attrMissing ks (Just s) =
+        evalError @(NValue m) $ ErrorCall $ "Could not look up attribute "
+            ++ intercalate "." (map Text.unpack (NE.toList ks))
+            ++ " in " ++ show s
+
+    evalCurPos = do
+        scope <- currentScopes
+        span@(SrcSpan delta _) <- currentPos
+        addProvenance (\_ -> Provenance scope (NSym_ span "__curPos"))
+            <$> toValue delta
+
+    evaledSym name val = do
+        scope <- currentScopes
+        span <- currentPos
+        pure $ addProvenance (const $ Provenance scope (NSym_ span name)) val
+
+    evalConstant c = do
+        scope <- currentScopes
+        span  <- currentPos
+        pure $ nvConstantP (Provenance scope (NConstant_ span c)) c
+
+    evalString = assembleString >=> \case
+        Just (s, c) -> do
+            scope <- currentScopes
+            span  <- currentPos
+            pure $ nvStrP (Provenance scope
+                           (NStr_ span (DoubleQuoted [Plain s]))) s c
+        Nothing -> nverr $ ErrorCall "Failed to assemble string"
+
+    evalLiteralPath p = do
+        scope <- currentScopes
+        span  <- currentPos
+        nvPathP (Provenance scope (NLiteralPath_ span p)) <$> makeAbsolutePath p
+
+    evalEnvPath p = do
+        scope <- currentScopes
+        span  <- currentPos
+        nvPathP (Provenance scope (NEnvPath_ span p)) <$> findEnvPath p
+
+    evalUnary op arg = do
+        scope <- currentScopes
+        span  <- currentPos
+        execUnaryOp scope span op arg
+
+    evalBinary op larg rarg = do
+        scope <- currentScopes
+        span  <- currentPos
+        execBinaryOp scope span op larg rarg
+
+    evalWith c b = do
+        scope <- currentScopes
+        span <- currentPos
+        addProvenance (\b -> Provenance scope (NWith_ span Nothing (Just b)))
+            <$> evalWithAttrSet c b
+
+    evalIf c t f = do
+        scope <- currentScopes
+        span  <- currentPos
+        fromValue c >>= \b ->
+            if b
+            then addProvenance (\t -> Provenance scope (NIf_ span (Just c) (Just t) Nothing)) <$> t
+            else addProvenance (\f -> Provenance scope (NIf_ span (Just c) Nothing (Just f))) <$> f
+
+    evalAssert c body = fromValue c >>= \b -> do
+        span  <- currentPos
+        if b
+            then do
+                scope <- currentScopes
+                addProvenance (\b -> Provenance scope (NAssert_ span (Just c) (Just b))) <$> body
+            else nverr $ Assertion span c
+
+    evalApp f x = do
+        scope <- currentScopes
+        span <- currentPos
+        addProvenance (const $ Provenance scope (NBinary_ span NApp (Just f) Nothing))
+            <$> callFunc f x
+
+    evalAbs p k = do
+        scope <- currentScopes
+        span  <- currentPos
+        pure $ nvClosureP (Provenance scope (NAbs_ span (Nothing <$ p) Nothing))
+            (void p) (\arg -> snd <$> k arg (\_ b -> ((),) <$> b))
+
+    evalError = throwError
+
+infixl 1 `callFunc`
+callFunc :: forall e m. (MonadNix e m, Typeable m)
+         => NValue m -> m (NValue m) -> m (NValue m)
+callFunc fun arg = case fun of
+    NVClosure params f -> do
+        traceM $ "callFunc:NVFunction taking " ++ show params
+        f arg
+    NVBuiltin name f -> do
+        span <- currentPos
+        withFrame Info (Calling @m @(NThunk m) name span) $ f arg
+    s@(NVSet m _) | Just f <- M.lookup "__functor" m -> do
+        traceM "callFunc:__functor"
+        force f $ (`callFunc` pure s) >=> (`callFunc` arg)
+    x -> throwError $ ErrorCall $ "Attempt to call non-function: " ++ show x
+
+execUnaryOp :: (Framed e m, MonadVar m)
+            => Scopes m (NThunk m) -> SrcSpan -> NUnaryOp -> NValue m
+            -> m (NValue m)
+execUnaryOp scope span op arg = do
+    traceM "NUnary"
+    case arg of
+        NVConstant c -> case (op, c) of
+            (NNeg, NInt   i) -> unaryOp $ NInt   (-i)
+            (NNeg, NFloat f) -> unaryOp $ NFloat (-f)
+            (NNot, NBool  b) -> unaryOp $ NBool  (not b)
+            _ -> throwError $ ErrorCall $
+                "unsupported argument type for unary operator " ++ show op
+        x -> throwError $ ErrorCall $ "argument to unary operator"
+                ++ " must evaluate to an atomic type: " ++ show x
+  where
+    unaryOp = pure . nvConstantP (Provenance scope (NUnary_ span op (Just arg)))
+
+execBinaryOp
+    :: forall e m. (MonadNix e m, MonadEval (NValue m) m)
+    => Scopes m (NThunk m)
+    -> SrcSpan
+    -> NBinaryOp
+    -> NValue m
+    -> m (NValue m)
+    -> m (NValue m)
+
+execBinaryOp scope span NOr larg rarg = fromNix larg >>= \l ->
+    if l
+    then orOp Nothing True
+    else rarg >>= \rval -> fromNix @Bool rval >>= orOp (Just rval)
+  where
+    orOp r b = pure $
+        nvConstantP (Provenance scope (NBinary_ span NOr (Just larg) r)) (NBool b)
+
+execBinaryOp scope span NAnd larg rarg = fromNix larg >>= \l ->
+    if l
+    then rarg >>= \rval -> fromNix @Bool rval >>= andOp (Just rval)
+    else andOp Nothing False
+  where
+    andOp r b = pure $
+        nvConstantP (Provenance scope (NBinary_ span NAnd (Just larg) r)) (NBool b)
+
+execBinaryOp scope span op lval rarg = do
+    rval <- rarg
+    let bin :: (Provenance m -> a) -> a
+        bin f  = f (Provenance scope (NBinary_ span op (Just lval) (Just rval)))
+        toBool = pure . bin nvConstantP . NBool
+    case (lval, rval) of
+        (NVConstant lc, NVConstant rc) -> case (op, lc, rc) of
+            (NEq,  _, _)       -> toBool =<< valueEq lval rval
+            (NNEq, _, _)       -> toBool . not =<< valueEq lval rval
+            (NLt,  l, r)       -> toBool $ l <  r
+            (NLte, l, r)       -> toBool $ l <= r
+            (NGt,  l, r)       -> toBool $ l >  r
+            (NGte, l, r)       -> toBool $ l >= r
+            (NAnd,  _, _)      ->
+                nverr $ ErrorCall "should be impossible: && is handled above"
+            (NOr,   _, _)      ->
+                nverr $ ErrorCall "should be impossible: || is handled above"
+            (NPlus,  l, r)     -> numBinOp bin (+) l r
+            (NMinus, l, r)     -> numBinOp bin (-) l r
+            (NMult,  l, r)     -> numBinOp bin (*) l r
+            (NDiv,   l, r)     -> numBinOp' bin div (/) l r
+            (NImpl,
+             NBool l, NBool r) -> toBool $ not l || r
+            _                  -> nverr $ ErrorCall $ unsupportedTypes lval rval
+
+        (NVStr ls lc, NVStr rs rc) -> case op of
+            NPlus -> pure $ bin nvStrP (ls `mappend` rs) (lc `mappend` rc)
+            NEq   -> toBool =<< valueEq lval rval
+            NNEq  -> toBool . not =<< valueEq lval rval
+            NLt   -> toBool $ ls <  rs
+            NLte  -> toBool $ ls <= rs
+            NGt   -> toBool $ ls >  rs
+            NGte  -> toBool $ ls >= rs
+            _     -> nverr $ ErrorCall $ unsupportedTypes lval rval
+
+        (NVStr _ _, NVConstant NNull) -> case op of
+            NEq  -> toBool =<< valueEq lval (nvStr "" mempty)
+            NNEq -> toBool . not =<< valueEq lval (nvStr "" mempty)
+            _    -> nverr $ ErrorCall $ unsupportedTypes lval rval
+
+        (NVConstant NNull, NVStr _ _) -> case op of
+            NEq  -> toBool =<< valueEq (nvStr "" mempty) rval
+            NNEq -> toBool . not =<< valueEq (nvStr "" mempty) rval
+            _    -> nverr $ ErrorCall $ unsupportedTypes lval rval
+
+        (NVSet ls lp, NVSet rs rp) -> case op of
+            NUpdate -> pure $ bin nvSetP (rs `M.union` ls) (rp `M.union` lp)
+            NEq     -> toBool =<< valueEq lval rval
+            NNEq    -> toBool . not =<< valueEq lval rval
+            _       -> nverr $ ErrorCall $ unsupportedTypes lval rval
+
+        (NVSet ls lp, NVConstant NNull) -> case op of
+            NUpdate -> pure $ bin nvSetP ls lp
+            NEq     -> toBool =<< valueEq lval (nvSet M.empty M.empty)
+            NNEq    -> toBool . not =<< valueEq lval (nvSet M.empty M.empty)
+            _       -> nverr $ ErrorCall $ unsupportedTypes lval rval
+
+        (NVConstant NNull, NVSet rs rp) -> case op of
+            NUpdate -> pure $ bin nvSetP rs rp
+            NEq     -> toBool =<< valueEq (nvSet M.empty M.empty) rval
+            NNEq    -> toBool . not =<< valueEq (nvSet M.empty M.empty) rval
+            _       -> nverr $ ErrorCall $ unsupportedTypes lval rval
+
+        (NVList ls, NVList rs) -> case op of
+            NConcat -> pure $ bin nvListP $ ls ++ rs
+            NEq     -> toBool =<< valueEq lval rval
+            NNEq    -> toBool . not =<< valueEq lval rval
+            _       -> nverr $ ErrorCall $ unsupportedTypes lval rval
+
+        (NVList ls, NVConstant NNull) -> case op of
+            NConcat -> pure $ bin nvListP ls
+            NEq     -> toBool =<< valueEq lval (nvList [])
+            NNEq    -> toBool . not =<< valueEq lval (nvList [])
+            _       -> nverr $ ErrorCall $ unsupportedTypes lval rval
+
+        (NVConstant NNull, NVList rs) -> case op of
+            NConcat -> pure $ bin nvListP rs
+            NEq     -> toBool =<< valueEq (nvList []) rval
+            NNEq    -> toBool . not =<< valueEq (nvList []) rval
+            _       -> nverr $ ErrorCall $ unsupportedTypes lval rval
+
+        (NVPath p, NVStr s _) -> case op of
+            NEq   -> toBool $ p == Text.unpack s
+            NNEq  -> toBool $ p /= Text.unpack s
+            NPlus -> bin nvPathP <$> makeAbsolutePath (p `mappend` Text.unpack s)
+            _     -> nverr $ ErrorCall $ unsupportedTypes lval rval
+
+        (NVPath ls, NVPath rs) -> case op of
+            NPlus -> bin nvPathP <$> makeAbsolutePath (ls ++ rs)
+            _     -> nverr $ ErrorCall $ unsupportedTypes lval rval
+
+        _ -> case op of
+            NEq   -> toBool False
+            NNEq  -> toBool True
+            _ -> nverr $ ErrorCall $ unsupportedTypes lval rval
+  where
+    unsupportedTypes :: Show a => a -> a -> String
+    unsupportedTypes lval rval =
+        "Unsupported argument types for binary operator "
+            ++ show op ++ ": " ++ show lval ++ ", " ++ show rval
+
+    numBinOp :: (forall r. (Provenance m -> r) -> r)
+             -> (forall a. Num a => a -> a -> a) -> NAtom -> NAtom -> m (NValue m)
+    numBinOp bin f = numBinOp' bin f f
+
+    numBinOp' :: (forall r. (Provenance m -> r) -> r)
+              -> (Integer -> Integer -> Integer)
+              -> (Float -> Float -> Float)
+              -> NAtom -> NAtom -> m (NValue m)
+    numBinOp' bin intF floatF l r = case (l, r) of
+        (NInt   li, NInt   ri) -> toInt   $             li `intF`               ri
+        (NInt   li, NFloat rf) -> toFloat $ fromInteger li `floatF`             rf
+        (NFloat lf, NInt   ri) -> toFloat $             lf `floatF` fromInteger ri
+        (NFloat lf, NFloat rf) -> toFloat $             lf `floatF`             rf
+        _ -> nverr $ ErrorCall $ unsupportedTypes l r
+      where
+        toInt   = pure . bin nvConstantP . NInt
+        toFloat = pure . bin nvConstantP . NFloat
+
+coerceToString :: MonadNix e m => NValue m -> m String
+coerceToString = \case
+    NVConstant (NBool b)
+        | b               -> pure "1"
+        | otherwise       -> pure ""
+    NVConstant (NInt n)   -> pure $ show n
+    NVConstant (NFloat n) -> pure $ show n
+    NVConstant NNull      -> pure ""
+
+    NVStr t _ -> pure $ Text.unpack t
+    NVPath p  -> unStorePath <$> addPath p
+    NVList l  -> unwords <$> traverse (`force` coerceToString) l
+
+    v@(NVSet s _) | Just p <- M.lookup "__toString" s ->
+        force p $ (`callFunc` pure v) >=> coerceToString
+
+    NVSet s _ | Just p <- M.lookup "outPath" s ->
+        force p coerceToString
+
+    v -> throwError $ ErrorCall $ "Expected a string, but saw: " ++ show v
+
+newtype Lazy m a = Lazy
+    { runLazy :: ReaderT (Context (Lazy m) (NThunk (Lazy m)))
+                        (StateT (HashMap FilePath NExprLoc) m) a }
+    deriving (Functor, Applicative, Alternative, Monad, MonadPlus,
+              MonadFix, MonadIO,
+              MonadReader (Context (Lazy m) (NThunk (Lazy m))))
+
+instance MonadIO m => MonadVar (Lazy m) where
+    type Var (Lazy m) = IORef
+
+    newVar = liftIO . newIORef
+    readVar = liftIO . readIORef
+    writeVar = (liftIO .) . writeIORef
+    atomicModifyVar = (liftIO .) . atomicModifyIORef
+
+instance (MonadIO m, Monad m) => MonadFile m where
+    readFile = liftIO . BS.readFile
+
+instance MonadCatch m => MonadCatch (Lazy m) where
+    catch (Lazy (ReaderT m)) f = Lazy $ ReaderT $ \e ->
+        catch (m e) ((`runReaderT` e) . runLazy . f)
+
+instance MonadThrow m => MonadThrow (Lazy m) where
+    throwM = Lazy . throwM
+
+#if MIN_VERSION_haskeline(0, 4, 7)
+instance MonadException m => MonadException (Lazy m) where
+  controlIO f = Lazy $ controlIO $ \(RunIO run) ->
+      let run' = RunIO (fmap Lazy . run . runLazy)
+      in runLazy <$> f run'
+#endif
+
+instance (MonadFix m, MonadCatch m, MonadIO m, Alternative m,
+          MonadPlus m, Typeable m)
+      => MonadEffects (Lazy m) where
+    addPath path = do
+        (exitCode, out, _) <-
+            liftIO $ readProcessWithExitCode "nix-store" ["--add", path] ""
+        case exitCode of
+          ExitSuccess -> do
+            let dropTrailingLinefeed p = take (length p - 1) p
+            return $ StorePath $ dropTrailingLinefeed out
+          _ -> throwError $ ErrorCall $
+                  "addPath: failed: nix-store --add " ++ show path
+
+    makeAbsolutePath origPath = do
+        origPathExpanded <- liftIO $ expandHomePath origPath
+        absPath <- if isAbsolute origPathExpanded then pure origPathExpanded else do
+            cwd <- do
+                mres <- lookupVar @_ @(NThunk (Lazy m)) "__cur_file"
+                case mres of
+                    Nothing -> liftIO getCurrentDirectory
+                    Just v -> force v $ \case
+                        NVPath s -> return $ takeDirectory s
+                        v -> throwError $ ErrorCall $ "when resolving relative path,"
+                                ++ " __cur_file is in scope,"
+                                ++ " but is not a path; it is: "
+                                ++ show v
+            pure $ cwd <///> origPathExpanded
+        liftIO $ removeDotDotIndirections <$> canonicalizePath absPath
+
+    findEnvPath = findEnvPathM
+
+    pathExists = liftIO . fileExist
+
+    importPath scope origPath = do
+        path <- liftIO $ pathToDefaultNixFile origPath
+        mres <- lookupVar @(Context (Lazy m) (NThunk (Lazy m)))
+                         "__cur_file"
+        path' <- case mres of
+            Nothing  -> do
+                traceM "No known current directory"
+                return path
+            Just p -> fromValue @_ @_ @(NThunk (Lazy m)) p >>= \(Path p') -> do
+                traceM $ "Current file being evaluated is: " ++ show p'
+                return $ takeDirectory p' </> path
+
+        traceM $ "Importing file " ++ path'
+        withFrame Info (ErrorCall $ "While importing file " ++ show path') $ do
+            imports <- Lazy $ ReaderT $ const get
+            expr <- case M.lookup path' imports of
+                Just expr -> pure expr
+                Nothing -> do
+                    eres <- Lazy $ parseNixFileLoc path'
+                    case eres of
+                        Failure err  ->
+                            throwError $ ErrorCall . show $
+                                text "Parse during import failed:" P.</> err
+                        Success expr -> do
+                            Lazy $ ReaderT $ const $
+                                modify (M.insert origPath expr)
+                            pure expr
+
+            let ref = value @_ @_ @(Lazy m) (nvPath path')
+            -- Use this cookie so that when we evaluate the next
+            -- import, we'll remember which directory its containing
+            -- file was in.
+            pushScope (M.singleton "__cur_file" ref) $
+                pushScope scope $ evalExprLoc expr
+
+    getEnvVar = liftIO . lookupEnv
+
+    getCurrentSystemOS = return $ Text.pack System.Info.os
+
+    -- Invert the conversion done by GHC_CONVERT_CPU in GHC's aclocal.m4
+    getCurrentSystemArch = return $ Text.pack $ case System.Info.arch of
+      "i386" -> "i686"
+      arch -> arch
+
+    listDirectory         = liftIO . System.Directory.listDirectory
+    getSymbolicLinkStatus = liftIO . System.Posix.Files.getSymbolicLinkStatus
+
+    derivationStrict = fromValue @(ValueSet (Lazy m)) >=> \s -> do
+        nn <- maybe (pure False) fromNix (M.lookup "__ignoreNulls" s)
+        s' <- M.fromList <$> mapMaybeM (handleEntry nn) (M.toList s)
+        v' <- normalForm =<< toValue @(ValueSet (Lazy m)) s'
+        nixInstantiateExpr $ "derivationStrict " ++ show (prettyNValueNF v')
+      where
+        mapMaybeM :: (a -> Lazy m (Maybe b)) -> [a] -> Lazy m [b]
+        mapMaybeM op = foldr f (return [])
+          where f x xs = op x >>= \case
+                    Nothing -> xs
+                    Just x  -> (x:) <$> xs
+
+        handleEntry ignoreNulls (k, v) = fmap (k,) <$> case k of
+            -- The `args' attribute is special: it supplies the command-line
+            -- arguments to the builder.
+            "args"          -> Just <$> convertNix @[Text] v
+            "__ignoreNulls" -> pure Nothing
+            _               -> force v $ \case
+                NVConstant NNull | ignoreNulls -> pure Nothing
+                v' -> Just <$> (toNix =<< Text.pack <$> coerceToString v')
+
+    nixInstantiateExpr expr = do
+        traceM $ "Executing: "
+            ++ show ["nix-instantiate", "--eval", "--expr ", expr]
+        (exitCode, out, err) <-
+            liftIO $ readProcessWithExitCode "nix-instantiate"
+                [ "--eval", "--expr", expr] ""
+        case exitCode of
+            ExitSuccess -> case parseNixTextLoc (Text.pack out) of
+                Failure err ->
+                    throwError $ ErrorCall $
+                        "Error parsing output of nix-instantiate: " ++ show err
+                Success v -> evalExprLoc v
+            status ->
+                throwError $ ErrorCall $ "nix-instantiate failed: " ++ show status
+                    ++ ": " ++ err
+
+    getRecursiveSize =
+#ifdef MIN_VERSION_ghc_datasize
+#if MIN_VERSION_ghc_datasize(0,2,0) && __GLASGOW_HASKELL__ >= 804
+        toNix @Integer <=< fmap fromIntegral . liftIO . recursiveSize
+#else
+        const $ toNix (0 :: Integer)
+#endif
+#else
+        const $ toNix (0 :: Integer)
+#endif
+
+    getURL url = do
+        let urlstr = Text.unpack url
+        traceM $ "fetching HTTP URL: " ++ urlstr
+        response <- liftIO $ do
+          req <- parseRequest urlstr
+          manager <-
+            if secure req
+            then newTlsManager
+            else newManager defaultManagerSettings
+          -- print req
+          httpLbs (req { method = "GET" }) manager
+          -- return response
+        let status = statusCode (responseStatus response)
+        if  status /= 200
+          then throwError $ ErrorCall $ 
+                 "fail, got " ++ show status ++ " when fetching url:" ++ urlstr
+          else -- do
+            -- let bstr = responseBody response
+            -- liftIO $ print bstr
+            throwError $ ErrorCall $ 
+              "success in downloading but hnix-store is not yet ready; url = " ++ urlstr
+
+    traceEffect = liftIO . putStrLn
+
+    exec = \case
+      [] -> throwError $ ErrorCall "exec: missing program"
+      (prog:args) -> do
+        (exitCode, out, _) <-
+            liftIO $ readProcessWithExitCode prog args ""
+        let t = Text.strip (Text.pack out)
+        let emsg = "program[" ++ prog ++ "] args=" ++ show args
+        case exitCode of
+          ExitSuccess ->
+            if Text.null t
+            then throwError $ ErrorCall $ "exec has no output :" ++ emsg
+            else case parseNixTextLoc t of
+              Failure err ->
+                throwError $ ErrorCall $
+                    "Error parsing output of exec: " ++ show err ++ " " ++ emsg
+              Success v -> evalExprLoc v
+          err -> throwError $ ErrorCall $
+                    "exec  failed: " ++ show err ++ " " ++ emsg
+
+runLazyM :: Options -> MonadIO m => Lazy m a -> m a
+runLazyM opts = (`evalStateT` M.empty)
+              . (`runReaderT` newContext opts)
+              . runLazy
+
+-- | Incorrectly normalize paths by rewriting patterns like @a/b/..@ to @a@.
+--   This is incorrect on POSIX systems, because if @b@ is a symlink, its
+--   parent may be a different directory from @a@. See the discussion at
+--   https://hackage.haskell.org/package/directory-1.3.1.5/docs/System-Directory.html#v:canonicalizePath
+removeDotDotIndirections :: FilePath -> FilePath
+removeDotDotIndirections = intercalate "/" . go [] . splitOn "/"
+    where go s [] = reverse s
+          go (_:s) ("..":rest) = go s rest
+          go s (this:rest) = go (this:s) rest
+
+expandHomePath :: FilePath -> IO FilePath
+expandHomePath ('~' : xs) = flip (++) xs <$> getHomeDirectory
+expandHomePath p = return p
+
+-- Given a path, determine the nix file to load
+pathToDefaultNixFile :: FilePath -> IO FilePath
+pathToDefaultNixFile p = do
+    isDir <- doesDirectoryExist p
+    pure $ if isDir then p </> "default.nix" else p
+
+infixr 9 <///>
+(<///>) :: FilePath -> FilePath -> FilePath
+x <///> y | isAbsolute y || "." `isPrefixOf` y = x </> y
+          | otherwise = joinByLargestOverlap x y
+  where
+    joinByLargestOverlap (splitDirectories -> xs) (splitDirectories -> ys) =
+        joinPath $ head [ xs ++ drop (length tx) ys
+                        | tx <- tails xs, tx `elem` inits ys ]
+
+nixFilePath :: (MonadEffects m, MonadIO m) => FilePath -> m (Maybe FilePath)
+nixFilePath path = do
+    path <- makeAbsolutePath path
+    exists <- liftIO $ doesDirectoryExist path
+    path' <- if exists
+            then makeAbsolutePath $ path </> "default.nix"
+            else return path
+    exists <- liftIO $ doesFileExist path'
+    return $ if exists then Just path' else Nothing
+
+findEnvPathM :: forall e m. (MonadNix e m, MonadIO m)
+             => FilePath -> m FilePath
+findEnvPathM name = do
+    mres <- lookupVar @_ @(NThunk m) "__nixPath"
+    mpath <- case mres of
+        Nothing -> error "impossible"
+        Just x -> force x $ fromValue >=> \(l :: [NThunk m]) ->
+            foldM go Nothing l
+    case mpath of
+        Nothing ->
+            throwError $ ErrorCall $ "file '" ++ name
+                ++ "' was not found in the Nix search path"
+                ++ " (add it using $NIX_PATH or -I)"
+        Just path -> return path
+  where
+    go :: Maybe FilePath -> NThunk m -> m (Maybe FilePath)
+    go p@(Just _) _ = pure p
+    go Nothing l = force l $ fromValue >=> \(s :: HashMap Text (NThunk m)) ->
+        case M.lookup "path" s of
+            Just p -> force p $ fromValue >=> \(Path path) ->
+                case M.lookup "prefix" s of
+                    Nothing -> tryPath path Nothing
+                    Just pf -> force pf $ fromValueMay >=> \case
+                        Just (pfx :: Text) | not (Text.null pfx) ->
+                            tryPath path (Just (Text.unpack pfx))
+                        _ -> tryPath path Nothing
+            Nothing ->
+                throwError $ ErrorCall $ "__nixPath must be a list of attr sets"
+                    ++ " with 'path' elements, but saw: " ++ show s
+
+    tryPath p (Just n) | n':ns <- splitDirectories name, n == n' =
+        nixFilePath $ p <///> joinPath ns
+    tryPath p _ = nixFilePath $ p <///> name
+
+addTracing :: (MonadNix e m, Has e Options, MonadIO m,
+              MonadReader Int n, Alternative n)
+           => Alg NExprLocF (m a) -> Alg NExprLocF (n (m a))
+addTracing k v = do
+    depth <- ask
+    guard (depth < 2000)
+    local succ $ do
+        v'@(Compose (Ann span x)) <- sequence v
+        return $ do
+            opts :: Options <- asks (view hasLens)
+            let rendered =
+                    if verbose opts >= Chatty
+                    then show (void x)
+                    else show (prettyNix (Fix (Fix (NSym "?") <$ x)))
+                msg x = "eval: " ++ replicate depth ' ' ++ x
+            loc <- renderLocation span (text (msg rendered ++ " ..."))
+            liftIO $ putStr $ show loc
+            res <- k v'
+            liftIO $ putStrLn $ msg (rendered ++ " ...done")
+            return res
+
+evalExprLoc :: forall e m. (MonadNix e m, Has e Options, MonadIO m)
+            => NExprLoc -> m (NValue m)
+evalExprLoc expr = do
+    opts :: Options <- asks (view hasLens)
+    if tracing opts
+        then join . (`runReaderT` (0 :: Int)) $
+             adi (addTracing phi)
+                 (raise (addStackFrames @(NThunk m) . addSourcePositions))
+                 expr
+        else adi phi (addStackFrames @(NThunk m) . addSourcePositions) expr
+  where
+    phi = Eval.eval @_ @(NValue m) @(NThunk m) @m . annotated . getCompose
+    raise k f x = ReaderT $ \e -> k (\t -> runReaderT (f t) e) x
diff --git a/src/Nix/Expr.hs b/src/Nix/Expr.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Expr.hs
@@ -0,0 +1,10 @@
+-- | Wraps the expression submodules.
+module Nix.Expr (
+  module Nix.Expr.Types,
+  module Nix.Expr.Types.Annotated,
+  module Nix.Expr.Shorthands
+  ) where
+
+import Nix.Expr.Types
+import Nix.Expr.Shorthands
+import Nix.Expr.Types.Annotated
diff --git a/src/Nix/Expr/Shorthands.hs b/src/Nix/Expr/Shorthands.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Expr/Shorthands.hs
@@ -0,0 +1,231 @@
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | A bunch of shorthands for making nix expressions.
+--
+-- Functions with an @F@ suffix return a more general type without the outer
+-- 'Fix' wrapper.
+module Nix.Expr.Shorthands where
+
+import Data.Fix
+import Data.List.NonEmpty (NonEmpty(..))
+import Data.Monoid
+import Data.Text (Text)
+import Nix.Atoms
+import Nix.Expr.Types
+import Text.Megaparsec.Pos (SourcePos)
+
+-- | Make an integer literal expression.
+mkInt :: Integer -> NExpr
+mkInt = Fix . mkIntF
+
+mkIntF :: Integer -> NExprF a
+mkIntF = NConstant . NInt
+
+-- | Make an floating point literal expression.
+mkFloat :: Float -> NExpr
+mkFloat = Fix . mkFloatF
+
+mkFloatF :: Float -> NExprF a
+mkFloatF = NConstant . NFloat
+
+-- | Make a regular (double-quoted) string.
+mkStr :: Text -> NExpr
+mkStr = Fix . NStr . DoubleQuoted . \case
+  "" -> []
+  x -> [Plain x]
+
+-- | Make an indented string.
+mkIndentedStr :: Int -> Text -> NExpr
+mkIndentedStr w = Fix . NStr . Indented w . \case
+  "" -> []
+  x -> [Plain x]
+
+-- | Make a path. Use 'True' if the path should be read from the
+-- environment, else 'False'.
+mkPath :: Bool -> FilePath -> NExpr
+mkPath b = Fix . mkPathF b
+
+mkPathF :: Bool -> FilePath -> NExprF a
+mkPathF False = NLiteralPath
+mkPathF True = NEnvPath
+
+-- | Make a path expression which pulls from the NIX_PATH env variable.
+mkEnvPath :: FilePath -> NExpr
+mkEnvPath = Fix . mkEnvPathF
+
+mkEnvPathF :: FilePath -> NExprF a
+mkEnvPathF = mkPathF True
+
+-- | Make a path expression which references a relative path.
+mkRelPath :: FilePath -> NExpr
+mkRelPath = Fix . mkRelPathF
+
+mkRelPathF :: FilePath -> NExprF a
+mkRelPathF = mkPathF False
+
+-- | Make a variable (symbol)
+mkSym :: Text -> NExpr
+mkSym = Fix . mkSymF
+
+mkSymF :: Text -> NExprF a
+mkSymF = NSym
+
+mkSelector :: Text -> NAttrPath NExpr
+mkSelector = (:| []) . StaticKey
+
+mkBool :: Bool -> NExpr
+mkBool = Fix . mkBoolF
+
+mkBoolF :: Bool -> NExprF a
+mkBoolF = NConstant . NBool
+
+mkNull :: NExpr
+mkNull = Fix mkNullF
+
+mkNullF :: NExprF a
+mkNullF = NConstant NNull
+
+mkOper :: NUnaryOp -> NExpr -> NExpr
+mkOper op = Fix . NUnary op
+
+mkOper2 :: NBinaryOp -> NExpr -> NExpr -> NExpr
+mkOper2 op a = Fix . NBinary op a
+
+mkParamset :: [(Text, Maybe NExpr)] -> Bool -> Params NExpr
+mkParamset params variadic = ParamSet params variadic Nothing
+
+mkRecSet :: [Binding NExpr] -> NExpr
+mkRecSet = Fix . NRecSet
+
+mkNonRecSet :: [Binding NExpr] -> NExpr
+mkNonRecSet = Fix . NSet
+
+mkLets :: [Binding NExpr] -> NExpr -> NExpr
+mkLets bindings = Fix . NLet bindings
+
+mkList :: [NExpr] -> NExpr
+mkList = Fix . NList
+
+mkWith :: NExpr -> NExpr -> NExpr
+mkWith e = Fix . NWith e
+
+mkAssert :: NExpr -> NExpr -> NExpr
+mkAssert e = Fix . NWith e
+
+mkIf :: NExpr -> NExpr -> NExpr -> NExpr
+mkIf e1 e2 = Fix . NIf e1 e2
+
+mkFunction :: Params NExpr -> NExpr -> NExpr
+mkFunction params = Fix . NAbs params
+
+{-
+mkDot :: NExpr -> Text -> NExpr
+mkDot e key = mkDots e [key]
+
+-- | Create a dotted expression using only text.
+mkDots :: NExpr -> [Text] -> NExpr
+mkDots e [] = e
+mkDots (Fix (NSelect e keys' x)) keys =
+  -- Special case: if the expression in the first argument is already
+  -- a dotted expression, just extend it.
+  Fix (NSelect e (keys' <> map (StaticKey ?? Nothing) keys) x)
+mkDots e keys = Fix $ NSelect e (map (StaticKey ?? Nothing) keys) Nothing
+-}
+
+-- | An `inherit` clause without an expression to pull from.
+inherit :: [NKeyName e] -> SourcePos -> Binding e
+inherit = Inherit Nothing
+
+-- | An `inherit` clause with an expression to pull from.
+inheritFrom :: e -> [NKeyName e] -> SourcePos -> Binding e
+inheritFrom expr = Inherit (Just expr)
+
+-- | Shorthand for producing a binding of a name to an expression.
+bindTo :: Text -> NExpr -> Binding NExpr
+bindTo name x = NamedVar (mkSelector name) x nullPos
+
+-- | Infix version of bindTo.
+($=) :: Text -> NExpr -> Binding NExpr
+($=) = bindTo
+
+infixr 2 $=
+
+-- | Append a list of bindings to a set or let expression.
+-- For example, adding `[a = 1, b = 2]` to `let c = 3; in 4` produces
+-- `let a = 1; b = 2; c = 3; in 4`.
+appendBindings :: [Binding NExpr] -> NExpr -> NExpr
+appendBindings newBindings (Fix e) = case e of
+  NLet bindings e' -> Fix $ NLet (bindings <> newBindings) e'
+  NSet bindings -> Fix $ NSet (bindings <> newBindings)
+  NRecSet bindings -> Fix $ NRecSet (bindings <> newBindings)
+  _ -> error "Can only append bindings to a set or a let"
+
+-- | Applies a transformation to the body of a nix function.
+modifyFunctionBody :: (NExpr -> NExpr) -> NExpr -> NExpr
+modifyFunctionBody f (Fix e) = case e of
+  NAbs params body -> Fix $ NAbs params (f body)
+  _ -> error "Not a function"
+
+-- | A let statement with multiple assignments.
+letsE :: [(Text, NExpr)] -> NExpr -> NExpr
+letsE pairs = Fix . NLet (map (uncurry bindTo) pairs)
+
+-- | Wrapper for a single-variable @let@.
+letE :: Text -> NExpr -> NExpr -> NExpr
+letE varName varExpr = letsE [(varName, varExpr)]
+
+-- | Make an attribute set (non-recursive).
+attrsE :: [(Text, NExpr)] -> NExpr
+attrsE pairs = Fix $ NSet (map (uncurry bindTo) pairs)
+
+-- | Make an attribute set (recursive).
+recAttrsE :: [(Text, NExpr)] -> NExpr
+recAttrsE pairs = Fix $ NRecSet (map (uncurry bindTo) pairs)
+
+-- | Logical negation.
+mkNot :: NExpr -> NExpr
+mkNot = Fix . NUnary NNot
+
+-- -- | Dot-reference into an attribute set.
+-- (!.) :: NExpr -> Text -> NExpr
+-- (!.) = mkDot
+-- infixl 8 !.
+
+mkBinop :: NBinaryOp -> NExpr -> NExpr -> NExpr
+mkBinop op e1 e2 = Fix (NBinary op e1 e2)
+
+-- | Various nix binary operators
+($==), ($!=), ($<), ($<=), ($>), ($>=), ($&&), ($||), ($->),
+  ($//), ($+), ($-), ($*), ($/), ($++)
+  :: NExpr -> NExpr -> NExpr
+e1 $== e2 = mkBinop NEq e1 e2
+e1 $!= e2 = mkBinop NNEq e1 e2
+e1 $< e2 = mkBinop NLt e1 e2
+e1 $<= e2 = mkBinop NLte e1 e2
+e1 $> e2 = mkBinop NGt e1 e2
+e1 $>= e2 = mkBinop NGte e1 e2
+e1 $&& e2 = mkBinop NAnd e1 e2
+e1 $|| e2 = mkBinop NOr e1 e2
+e1 $-> e2 = mkBinop NImpl e1 e2
+e1 $// e2 = mkBinop NUpdate e1 e2
+e1 $+ e2 = mkBinop NPlus e1 e2
+e1 $- e2 = mkBinop NMinus e1 e2
+e1 $* e2 = mkBinop NMult e1 e2
+e1 $/ e2 = mkBinop NDiv e1 e2
+e1 $++ e2 = mkBinop NConcat e1 e2
+
+-- | Function application expression.
+(@@) :: NExpr -> NExpr -> NExpr
+f @@ arg = mkBinop NApp f arg
+infixl 1 @@
+
+-- | Lambda shorthand.
+(==>) :: Params NExpr -> NExpr -> NExpr
+(==>) = mkFunction
+
+infixr 1 ==>
+
+(@.) :: NExpr -> Text -> NExpr
+obj @. name = Fix (NSelect obj (StaticKey name :| []) Nothing)
+infixl 2 @.
diff --git a/src/Nix/Expr/Types.hs b/src/Nix/Expr/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Expr/Types.hs
@@ -0,0 +1,558 @@
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveFoldable #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DeriveTraversable #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+
+{-# OPTIONS_GHC -Wno-orphans #-}
+{-# OPTIONS_GHC -Wno-missing-signatures #-}
+
+-- | The nix expression type and supporting types.
+module Nix.Expr.Types where
+
+#if MIN_VERSION_serialise(0, 2, 0)
+import           Codec.Serialise (Serialise)
+import qualified Codec.Serialise as Ser
+#endif
+import           Control.Applicative
+import           Control.DeepSeq
+import           Control.Monad
+import           Data.Aeson
+import           Data.Aeson.TH
+import           Data.Binary (Binary)
+import qualified Data.Binary as Bin
+import           Data.Data
+import           Data.Eq.Deriving
+import           Data.Fix
+import           Data.Functor.Classes
+import           Data.Hashable
+#if MIN_VERSION_hashable(1, 2, 5)
+import           Data.Hashable.Lifted
+#endif
+import           Data.List (inits, tails)
+import           Data.List.NonEmpty (NonEmpty(..))
+import qualified Data.List.NonEmpty as NE
+import           Data.Maybe (fromMaybe)
+import           Data.Monoid
+import           Data.Ord.Deriving
+import           Data.Text (Text, pack, unpack)
+import           Data.Traversable
+import           GHC.Exts
+import           GHC.Generics
+import           Language.Haskell.TH.Syntax
+import           Lens.Family2
+import           Lens.Family2.TH
+import           Nix.Atoms
+import           Nix.Utils
+import           Text.Megaparsec.Pos
+import           Text.Read.Deriving
+import           Text.Show.Deriving
+#if MIN_VERSION_base(4, 10, 0)
+import           Type.Reflection (eqTypeRep)
+import qualified Type.Reflection as Reflection
+#endif
+
+type VarName = Text
+
+-- unfortunate orphans
+#if MIN_VERSION_hashable(1, 2, 5)
+instance Hashable1 NonEmpty
+#endif
+
+#if !MIN_VERSION_base(4, 10, 0)
+instance Eq1 NonEmpty where
+  liftEq eq (a NE.:| as) (b NE.:| bs) = eq a b && liftEq eq as bs
+instance Show1 NonEmpty where
+  liftShowsPrec shwP shwL p (a NE.:| as) = showParen (p > 5) $
+    shwP 6 a . showString " :| " . shwL as
+#endif
+
+#if !MIN_VERSION_binary(0, 8, 4)
+instance Binary a => Binary (NE.NonEmpty a) where
+  get = fmap NE.fromList Bin.get
+  put = Bin.put . NE.toList
+#endif
+
+-- | The main nix expression type. This is polymorphic so that it can be made
+-- a functor, which allows us to traverse expressions and map functions over
+-- them. The actual 'NExpr' type is a fixed point of this functor, defined
+-- below.
+data NExprF r
+  = NConstant !NAtom
+  -- ^ Constants: ints, bools, URIs, and null.
+  | NStr !(NString r)
+  -- ^ A string, with interpolated expressions.
+  | NSym !VarName
+  -- ^ A variable. For example, in the expression @f a@, @f@ is represented
+  -- as @NSym "f"@ and @a@ as @NSym "a"@.
+  | NList ![r]
+  -- ^ A list literal.
+  | NSet ![Binding r]
+  -- ^ An attribute set literal, not recursive.
+  | NRecSet ![Binding r]
+  -- ^ An attribute set literal, recursive.
+  | NLiteralPath !FilePath
+  -- ^ A path expression, which is evaluated to a store path. The path here
+  -- can be relative, in which case it's evaluated relative to the file in
+  -- which it appears.
+  | NEnvPath !FilePath
+  -- ^ A path which refers to something in the Nix search path (the NIX_PATH
+  -- environment variable. For example, @<nixpkgs/pkgs>@.
+  | NUnary !NUnaryOp !r
+  -- ^ Application of a unary operator to an expression.
+  | NBinary !NBinaryOp !r !r
+  -- ^ Application of a binary operator to two expressions.
+  | NSelect !r !(NAttrPath r) !(Maybe r)
+  -- ^ Dot-reference into an attribute set, optionally providing an
+  -- alternative if the key doesn't exist.
+  | NHasAttr !r !(NAttrPath r)
+  -- ^ Ask if a set contains a given attribute path.
+  | NAbs !(Params r) !r
+  -- ^ A function literal (lambda abstraction).
+  | NLet ![Binding r] !r
+  -- ^ Evaluate the second argument after introducing the bindings.
+  | NIf !r !r !r
+  -- ^ If-then-else statement.
+  | NWith !r !r
+  -- ^ Evaluate an attribute set, bring its bindings into scope, and
+  -- evaluate the second argument.
+  | NAssert !r !r
+  -- ^ Assert that the first returns true before evaluating the second.
+  deriving (Ord, Eq, Generic, Generic1, Typeable, Data, Functor,
+            Foldable, Traversable, Show, NFData,
+            Hashable)
+
+#if MIN_VERSION_hashable(1, 2, 5)
+instance Hashable1 NExprF
+#endif
+
+#if MIN_VERSION_deepseq(1, 4, 3)
+instance NFData1 NExprF
+#endif
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance Serialise r => Serialise (NExprF r)
+#endif
+
+-- | We make an `IsString` for expressions, where the string is interpreted
+-- as an identifier. This is the most common use-case...
+instance IsString NExpr where
+  fromString = Fix . NSym . fromString
+
+#if MIN_VERSION_base(4, 10, 0)
+instance Lift (Fix NExprF) where
+    lift = dataToExpQ $ \b ->
+        case Reflection.typeOf b `eqTypeRep` Reflection.typeRep @Text of
+            Just HRefl -> Just [| pack $(liftString $ unpack b) |]
+            Nothing -> Nothing
+#endif
+
+-- | The monomorphic expression type is a fixed point of the polymorphic one.
+type NExpr = Fix NExprF
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance Serialise NExpr
+#endif
+
+-- | A single line of the bindings section of a let expression or of a set.
+data Binding r
+  = NamedVar !(NAttrPath r) !r !SourcePos
+  -- ^ An explicit naming, such as @x = y@ or @x.y = z@.
+  | Inherit !(Maybe r) ![NKeyName r] !SourcePos
+  -- ^ Using a name already in scope, such as @inherit x;@ which is shorthand
+  --   for @x = x;@ or @inherit (x) y;@ which means @y = x.y;@. The
+  --   unsafeGetAttrPos for every name so inherited is the position of the
+  --   first name, whether that be the first argument to this constructor, or
+  --   the first member of the list in the second argument.
+  deriving (Generic, Generic1, Typeable, Data, Ord, Eq, Functor,
+            Foldable, Traversable, Show, NFData,
+            Hashable)
+
+#if MIN_VERSION_hashable(1, 2, 5)
+instance Hashable1 Binding
+#endif
+
+#if MIN_VERSION_deepseq(1, 4, 3)
+instance NFData1 Binding
+#endif
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance Serialise r => Serialise (Binding r)
+#endif
+
+-- | @Params@ represents all the ways the formal parameters to a
+-- function can be represented.
+data Params r
+  = Param !VarName
+  -- ^ For functions with a single named argument, such as @x: x + 1@.
+  | ParamSet !(ParamSet r) !Bool !(Maybe VarName)
+  -- ^ Explicit parameters (argument must be a set). Might specify a name to
+  -- bind to the set in the function body. The bool indicates whether it is
+  -- variadic or not.
+  deriving (Ord, Eq, Generic, Generic1, Typeable, Data, Functor, Show,
+            Foldable, Traversable, NFData, Hashable)
+
+#if MIN_VERSION_hashable(1, 2, 5)
+instance Hashable1 Params
+#endif
+
+#if MIN_VERSION_deepseq(1, 4, 3)
+instance NFData1 Params
+#endif
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance Serialise r => Serialise (Params r)
+#endif
+
+-- This uses an association list because nix XML serialization preserves the
+-- order of the param set.
+type ParamSet r = [(VarName, Maybe r)]
+
+instance IsString (Params r) where
+  fromString = Param . fromString
+
+-- | 'Antiquoted' represents an expression that is either
+-- antiquoted (surrounded by ${...}) or plain (not antiquoted).
+data Antiquoted (v :: *) (r :: *) = Plain !v | EscapedNewline | Antiquoted !r
+  deriving (Ord, Eq, Generic, Generic1, Typeable, Data, Functor, Foldable,
+            Traversable, Show, Read, NFData, Hashable)
+
+#if MIN_VERSION_hashable(1, 2, 5)
+instance Hashable v => Hashable1 (Antiquoted v)
+
+instance Hashable2 Antiquoted where
+    liftHashWithSalt2 ha _ salt (Plain a) =
+        ha (salt `hashWithSalt` (0 :: Int)) a
+    liftHashWithSalt2 _ _ salt EscapedNewline =
+        salt `hashWithSalt` (1 :: Int)
+    liftHashWithSalt2 _ hb salt (Antiquoted b) =
+        hb (salt `hashWithSalt` (2 :: Int)) b
+#endif
+
+#if MIN_VERSION_deepseq(1, 4, 3)
+instance NFData v => NFData1 (Antiquoted v)
+#endif
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance (Serialise v, Serialise r) => Serialise (Antiquoted v r)
+#endif
+
+-- | An 'NString' is a list of things that are either a plain string
+-- or an antiquoted expression. After the antiquotes have been evaluated,
+-- the final string is constructed by concating all the parts.
+data NString r
+  = DoubleQuoted ![Antiquoted Text r]
+  -- ^ Strings wrapped with double-quotes (") can contain literal newline
+  -- characters, but the newlines are preserved and no indentation is stripped.
+  | Indented !Int ![Antiquoted Text r]
+  -- ^ Strings wrapped with two single quotes ('') can contain newlines, and
+  --   their indentation will be stripped, but the amount stripped is
+  --   remembered.
+  deriving (Eq, Ord, Generic, Generic1, Typeable, Data, Functor, Foldable,
+            Traversable, Show, Read, NFData, Hashable)
+
+#if MIN_VERSION_hashable(1, 2, 5)
+instance Hashable1 NString
+#endif
+
+#if MIN_VERSION_deepseq(1, 4, 3)
+instance NFData1 NString
+#endif
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance Serialise r => Serialise (NString r)
+#endif
+
+-- | For the the 'IsString' instance, we use a plain doublequoted string.
+instance IsString (NString r) where
+  fromString "" = DoubleQuoted []
+  fromString string = DoubleQuoted [Plain $ pack string]
+
+-- | A 'KeyName' is something that can appear on the left side of an
+-- equals sign. For example, @a@ is a 'KeyName' in @{ a = 3; }@, @let a = 3;
+-- in ...@, @{}.a@ or @{} ? a@.
+--
+-- Nix supports both static keynames (just an identifier) and dynamic
+-- identifiers. Dynamic identifiers can be either a string (e.g.:
+-- @{ "a" = 3; }@) or an antiquotation (e.g.: @let a = "example";
+-- in { ${a} = 3; }.example@).
+--
+-- Note: There are some places where a dynamic keyname is not allowed.
+-- In particular, those include:
+--
+--   * The RHS of a @binding@ inside @let@: @let ${"a"} = 3; in ...@
+--     produces a syntax error.
+--   * The attribute names of an 'inherit': @inherit ${"a"};@ is forbidden.
+--
+-- Note: In Nix, a simple string without antiquotes such as @"foo"@ is
+-- allowed even if the context requires a static keyname, but the
+-- parser still considers it a 'DynamicKey' for simplicity.
+data NKeyName r
+  = DynamicKey !(Antiquoted (NString r) r)
+  | StaticKey !VarName
+  deriving (Eq, Ord, Generic, Typeable, Data, Show, Read, NFData,
+            Hashable)
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance Serialise r => Serialise (NKeyName r)
+
+instance Serialise Pos where
+    encode x = Ser.encode (unPos x)
+    decode = mkPos <$> Ser.decode
+
+instance Serialise SourcePos where
+    encode (SourcePos f l c) = Ser.encode f <> Ser.encode l <> Ser.encode c
+    decode = SourcePos <$> Ser.decode <*> Ser.decode <*> Ser.decode
+#endif
+
+instance Hashable Pos where
+    hashWithSalt salt x = hashWithSalt salt (unPos x)
+
+instance Hashable SourcePos where
+    hashWithSalt salt (SourcePos f l c) =
+        salt `hashWithSalt` f `hashWithSalt` l `hashWithSalt` c
+
+instance Generic1 NKeyName where
+  type Rep1 NKeyName = NKeyName
+  from1 = id
+  to1   = id
+
+#if MIN_VERSION_deepseq(1, 4, 3)
+instance NFData1 NKeyName where
+    liftRnf _ (StaticKey !_) = ()
+    liftRnf _ (DynamicKey (Plain !_)) = ()
+    liftRnf _ (DynamicKey EscapedNewline) = ()
+    liftRnf k (DynamicKey (Antiquoted r)) = k r
+#endif
+
+-- | Most key names are just static text, so this instance is convenient.
+instance IsString (NKeyName r) where
+  fromString = StaticKey . fromString
+
+instance Eq1 NKeyName where
+  liftEq eq (DynamicKey a) (DynamicKey b) = liftEq2 (liftEq eq) eq a b
+  liftEq _ (StaticKey a) (StaticKey b) = a == b
+  liftEq _ _ _ = False
+
+#if MIN_VERSION_hashable(1, 2, 5)
+instance Hashable1 NKeyName where
+  liftHashWithSalt h salt (DynamicKey a) =
+      liftHashWithSalt2 (liftHashWithSalt h) h (salt `hashWithSalt` (0 :: Int)) a
+  liftHashWithSalt _ salt (StaticKey n) =
+      salt `hashWithSalt` (1 :: Int) `hashWithSalt` n
+#endif
+
+-- Deriving this instance automatically is not possible because @r@
+-- occurs not only as last argument in @Antiquoted (NString r) r@
+instance Show1 NKeyName where
+  liftShowsPrec sp sl p = \case
+    DynamicKey a -> showsUnaryWith (liftShowsPrec2 (liftShowsPrec sp sl) (liftShowList sp sl) sp sl) "DynamicKey" p a
+    StaticKey t -> showsUnaryWith showsPrec "StaticKey" p t
+
+-- Deriving this instance automatically is not possible because @r@
+-- occurs not only as last argument in @Antiquoted (NString r) r@
+instance Functor NKeyName where
+  fmap = fmapDefault
+
+-- Deriving this instance automatically is not possible because @r@
+-- occurs not only as last argument in @Antiquoted (NString r) r@
+instance Foldable NKeyName where
+  foldMap = foldMapDefault
+
+-- Deriving this instance automatically is not possible because @r@
+-- occurs not only as last argument in @Antiquoted (NString r) r@
+instance Traversable NKeyName where
+  traverse f = \case
+    DynamicKey (Plain str)    -> DynamicKey . Plain <$> traverse f str
+    DynamicKey (Antiquoted e) -> DynamicKey . Antiquoted <$> f e
+    DynamicKey EscapedNewline -> pure $ DynamicKey EscapedNewline
+    StaticKey key -> pure (StaticKey key)
+
+-- | A selector (for example in a @let@ or an attribute set) is made up
+-- of strung-together key names.
+type NAttrPath r = NonEmpty (NKeyName r)
+
+-- | There are two unary operations: logical not and integer negation.
+data NUnaryOp = NNeg | NNot
+  deriving (Eq, Ord, Generic, Typeable, Data, Show, Read, NFData,
+            Hashable)
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance Serialise NUnaryOp
+#endif
+
+-- | Binary operators expressible in the nix language.
+data NBinaryOp
+  = NEq      -- ^ Equality (==)
+  | NNEq     -- ^ Inequality (!=)
+  | NLt      -- ^ Less than (<)
+  | NLte     -- ^ Less than or equal (<=)
+  | NGt      -- ^ Greater than (>)
+  | NGte     -- ^ Greater than or equal (>=)
+  | NAnd     -- ^ Logical and (&&)
+  | NOr      -- ^ Logical or (||)
+  | NImpl    -- ^ Logical implication (->)
+  | NUpdate  -- ^ Joining two attribut sets (//)
+  | NPlus    -- ^ Addition (+)
+  | NMinus   -- ^ Subtraction (-)
+  | NMult    -- ^ Multiplication (*)
+  | NDiv     -- ^ Division (/)
+  | NConcat  -- ^ List concatenation (++)
+  | NApp     -- ^ Apply a function to an argument.
+  deriving (Eq, Ord, Generic, Typeable, Data, Show, Read, NFData,
+            Hashable)
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance Serialise NBinaryOp
+#endif
+
+-- | Get the name out of the parameter (there might be none).
+paramName :: Params r -> Maybe VarName
+paramName (Param n) = Just n
+paramName (ParamSet _ _ n) = n
+
+$(deriveEq1 ''NExprF)
+$(deriveEq1 ''NString)
+$(deriveEq1 ''Binding)
+$(deriveEq1 ''Params)
+$(deriveEq1 ''Antiquoted)
+$(deriveEq2 ''Antiquoted)
+
+$(deriveOrd1 ''NString)
+$(deriveOrd1 ''Params)
+$(deriveOrd1 ''Antiquoted)
+$(deriveOrd2 ''Antiquoted)
+
+$(deriveRead1 ''NString)
+$(deriveRead1 ''Params)
+$(deriveRead1 ''Antiquoted)
+$(deriveRead2 ''Antiquoted)
+
+$(deriveShow1 ''NExprF)
+$(deriveShow1 ''NString)
+$(deriveShow1 ''Params)
+$(deriveShow1 ''Binding)
+$(deriveShow1 ''Antiquoted)
+$(deriveShow2 ''Antiquoted)
+
+-- $(deriveJSON1 defaultOptions ''NExprF)
+$(deriveJSON1 defaultOptions ''NString)
+$(deriveJSON1 defaultOptions ''Params)
+-- $(deriveJSON1 defaultOptions ''Binding)
+$(deriveJSON1 defaultOptions ''Antiquoted)
+$(deriveJSON2 defaultOptions ''Antiquoted)
+
+instance (Binary v, Binary a) => Binary (Antiquoted v a)
+instance Binary a => Binary (NString a)
+instance Binary a => Binary (Binding a)
+instance Binary Pos where
+    put x = Bin.put (unPos x)
+    get = mkPos <$> Bin.get
+instance Binary SourcePos
+instance Binary a => Binary (NKeyName a)
+instance Binary a => Binary (Params a)
+instance Binary NAtom
+instance Binary NUnaryOp
+instance Binary NBinaryOp
+instance Binary a => Binary (NExprF a)
+
+instance (ToJSON v, ToJSON a) => ToJSON (Antiquoted v a)
+instance ToJSON a => ToJSON (NString a)
+instance ToJSON a => ToJSON (Binding a)
+instance ToJSON Pos where
+    toJSON x = toJSON (unPos x)
+instance ToJSON SourcePos
+instance ToJSON a => ToJSON (NKeyName a)
+instance ToJSON a => ToJSON (Params a)
+instance ToJSON NAtom
+instance ToJSON NUnaryOp
+instance ToJSON NBinaryOp
+instance ToJSON a => ToJSON (NExprF a)
+instance ToJSON NExpr
+
+instance (FromJSON v, FromJSON a) => FromJSON (Antiquoted v a)
+instance FromJSON a => FromJSON (NString a)
+instance FromJSON a => FromJSON (Binding a)
+instance FromJSON Pos where
+    parseJSON = fmap mkPos . parseJSON
+instance FromJSON SourcePos
+instance FromJSON a => FromJSON (NKeyName a)
+instance FromJSON a => FromJSON (Params a)
+instance FromJSON NAtom
+instance FromJSON NUnaryOp
+instance FromJSON NBinaryOp
+instance FromJSON a => FromJSON (NExprF a)
+instance FromJSON NExpr
+
+$(makeTraversals ''NExprF)
+$(makeTraversals ''Binding)
+$(makeTraversals ''Params)
+$(makeTraversals ''Antiquoted)
+$(makeTraversals ''NString)
+$(makeTraversals ''NKeyName)
+$(makeTraversals ''NUnaryOp)
+$(makeTraversals ''NBinaryOp)
+
+-- $(makeLenses ''Fix)
+
+class NExprAnn ann g | g -> ann where
+    fromNExpr :: g r -> (NExprF r, ann)
+    toNExpr :: (NExprF r, ann) -> g r
+
+ekey :: NExprAnn ann g
+     => NonEmpty Text
+     -> SourcePos
+     -> Lens' (Fix g) (Maybe (Fix g))
+ekey keys pos f e@(Fix x) | (NSet xs, ann) <- fromNExpr x =
+    case go xs of
+        ((v, []):_) -> fromMaybe e <$> f (Just v)
+        ((v, r:rest):_) -> ekey (r :| rest) pos f v
+
+        _ -> f Nothing <&> \case
+            Nothing -> e
+            Just v  ->
+                let entry = NamedVar (NE.map StaticKey keys) v pos
+                in Fix (toNExpr (NSet (entry : xs), ann))
+  where
+    go xs = do
+        let keys' = NE.toList keys
+        (ks, rest) <- zip (inits keys') (tails keys')
+        case ks of
+            [] -> empty
+            j:js -> do
+                NamedVar ns v _p <- xs
+                guard $ (j:js) == (NE.toList ns ^.. traverse._StaticKey)
+                return (v, rest)
+
+ekey _ _ f e = fromMaybe e <$> f Nothing
+
+stripPositionInfo :: NExpr -> NExpr
+stripPositionInfo = transport phi
+  where
+    phi (NSet binds)         = NSet (map go binds)
+    phi (NRecSet binds)      = NRecSet (map go binds)
+    phi (NLet binds body)    = NLet (map go binds) body
+    phi x = x
+
+    go (NamedVar path r _pos)  = NamedVar path r nullPos
+    go (Inherit ms names _pos) = Inherit ms names nullPos
+
+nullPos :: SourcePos
+nullPos = SourcePos "<string>" (mkPos 1) (mkPos 1)
diff --git a/src/Nix/Expr/Types/Annotated.hs b/src/Nix/Expr/Types/Annotated.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Expr/Types/Annotated.hs
@@ -0,0 +1,240 @@
+{-# LANGUAGE CPP                #-}
+{-# LANGUAGE DeriveAnyClass     #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveFoldable     #-}
+{-# LANGUAGE DeriveFunctor      #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE DeriveTraversable  #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE KindSignatures     #-}
+{-# LANGUAGE LambdaCase         #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE PatternSynonyms    #-}
+{-# LANGUAGE RankNTypes         #-}
+{-# LANGUAGE TemplateHaskell    #-}
+
+-- | The source location annotated nix expression type and supporting types.
+--
+module Nix.Expr.Types.Annotated
+  ( module Nix.Expr.Types.Annotated
+  , module Data.Functor.Compose
+  , SourcePos(..), unPos, mkPos
+  )where
+
+#if MIN_VERSION_serialise(0, 2, 0)
+import Codec.Serialise
+#endif
+import Control.DeepSeq
+import Data.Aeson (ToJSON(..), FromJSON(..))
+import Data.Aeson.TH
+import Data.Binary (Binary(..))
+import Data.Data
+import Data.Eq.Deriving
+import Data.Fix
+import Data.Function (on)
+import Data.Functor.Compose
+import Data.Hashable
+#if MIN_VERSION_hashable(1, 2, 5)
+import Data.Hashable.Lifted
+#endif
+import Data.Ord.Deriving
+import Data.Semigroup
+import Data.Text (Text, pack)
+import GHC.Generics
+import Nix.Atoms
+import Nix.Expr.Types
+import Text.Megaparsec (unPos, mkPos)
+import Text.Megaparsec.Pos (SourcePos(..))
+import Text.Read.Deriving
+import Text.Show.Deriving
+
+-- | A location in a source file
+data SrcSpan = SrcSpan
+    { spanBegin :: SourcePos
+    , spanEnd   :: SourcePos
+    }
+    deriving (Ord, Eq, Generic, Typeable, Data, Show, NFData,
+              Hashable)
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance Serialise SrcSpan
+#endif
+
+-- | A type constructor applied to a type along with an annotation
+--
+-- Intended to be used with 'Fix':
+-- @type MyType = Fix (Compose (Ann Annotation) F)@
+data Ann ann a = Ann
+    { annotation :: ann
+    , annotated  :: a
+    }
+    deriving (Ord, Eq, Data, Generic, Generic1, Typeable, Functor, Foldable,
+              Traversable, Read, Show, NFData, Hashable)
+
+#if MIN_VERSION_hashable(1, 2, 5)
+instance Hashable ann => Hashable1 (Ann ann)
+#endif
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance (Serialise ann, Serialise a) => Serialise (Ann ann a)
+#endif
+
+#if MIN_VERSION_deepseq(1, 4, 3)
+instance NFData ann => NFData1 (Ann ann)
+#endif
+
+$(deriveEq1   ''Ann)
+$(deriveEq2   ''Ann)
+$(deriveOrd1  ''Ann)
+$(deriveOrd2  ''Ann)
+$(deriveRead1 ''Ann)
+$(deriveRead2 ''Ann)
+$(deriveShow1 ''Ann)
+$(deriveShow2 ''Ann)
+$(deriveJSON1 defaultOptions ''Ann)
+$(deriveJSON2 defaultOptions ''Ann)
+
+instance Semigroup SrcSpan where
+  s1 <> s2 = SrcSpan ((min `on` spanBegin) s1 s2)
+                     ((max `on` spanEnd) s1 s2)
+
+type AnnF ann f = Compose (Ann ann) f
+
+annToAnnF :: Ann ann (f (Fix (AnnF ann f))) -> Fix (AnnF ann f)
+annToAnnF (Ann ann a) = AnnE ann a
+
+type NExprLocF = AnnF SrcSpan NExprF
+
+-- | A nix expression with source location at each subexpression.
+type NExprLoc = Fix NExprLocF
+
+#if MIN_VERSION_hashable(1, 2, 5) && MIN_VERSION_deepseq(1, 4, 3)
+-- Needs deepseq-1.4.3 because Compose requires NFData1
+instance NFData NExprLoc
+#endif
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance Serialise NExprLoc
+#endif
+
+#if MIN_VERSION_hashable(1, 2, 5)
+instance Hashable NExprLoc
+#endif
+
+instance Binary SrcSpan
+instance (Binary ann, Binary a) => Binary (Ann ann a)
+instance Binary r => Binary (NExprLocF r)
+instance Binary NExprLoc
+
+instance ToJSON SrcSpan
+instance FromJSON SrcSpan
+
+#if MIN_VERSION_serialise(0, 2, 0)
+instance Serialise r => Serialise (Compose (Ann SrcSpan) NExprF r) where
+    encode (Compose (Ann ann a)) = encode ann <> encode a
+    decode = (Compose .) . Ann <$> decode <*> decode
+#endif
+
+pattern AnnE :: forall ann (g :: * -> *). ann
+             -> g (Fix (Compose (Ann ann) g)) -> Fix (Compose (Ann ann) g)
+pattern AnnE ann a = Fix (Compose (Ann ann a))
+
+stripAnnotation :: Functor f => Fix (AnnF ann f) -> Fix f
+stripAnnotation = ana (annotated . getCompose . unFix)
+
+stripAnn :: AnnF ann f r -> f r
+stripAnn = annotated . getCompose
+
+nUnary :: Ann SrcSpan NUnaryOp -> NExprLoc -> NExprLoc
+nUnary (Ann s1 u) e1@(AnnE s2 _) = AnnE (s1 <> s2) (NUnary u e1)
+nUnary _ _ = error "nUnary: unexpected"
+
+nBinary :: Ann SrcSpan NBinaryOp -> NExprLoc -> NExprLoc -> NExprLoc
+nBinary (Ann s1 b) e1@(AnnE s2 _) e2@(AnnE s3 _) =
+  AnnE (s1 <> s2 <> s3) (NBinary b e1 e2)
+nBinary _ _ _ = error "nBinary: unexpected"
+
+nSelectLoc :: NExprLoc -> Ann SrcSpan (NAttrPath NExprLoc) -> Maybe NExprLoc
+           -> NExprLoc
+nSelectLoc e1@(AnnE s1 _) (Ann s2 ats) d = case d of
+  Nothing               -> AnnE (s1 <> s2) (NSelect e1 ats Nothing)
+  Just (e2@(AnnE s3 _)) -> AnnE (s1 <> s2 <> s3) (NSelect e1 ats (Just e2))
+  _ -> error "nSelectLoc: unexpected"
+nSelectLoc _ _ _ = error "nSelectLoc: unexpected"
+
+nHasAttr :: NExprLoc -> Ann SrcSpan (NAttrPath NExprLoc) -> NExprLoc
+nHasAttr e1@(AnnE s1 _) (Ann s2 ats) = AnnE (s1 <> s2) (NHasAttr e1 ats)
+nHasAttr _ _ = error "nHasAttr: unexpected"
+
+nApp :: NExprLoc -> NExprLoc -> NExprLoc
+nApp e1@(AnnE s1 _) e2@(AnnE s2 _) = AnnE (s1 <> s2) (NBinary NApp e1 e2)
+nApp _ _ = error "nApp: unexpected"
+
+nAbs :: Ann SrcSpan (Params NExprLoc) -> NExprLoc -> NExprLoc
+nAbs (Ann s1 ps) e1@(AnnE s2 _) = AnnE (s1 <> s2) (NAbs ps e1)
+nAbs _ _ = error "nAbs: unexpected"
+
+nStr :: Ann SrcSpan (NString NExprLoc) -> NExprLoc
+nStr (Ann s1 s) = AnnE s1 (NStr s)
+
+deltaInfo :: SourcePos -> (Text, Int, Int)
+deltaInfo (SourcePos fp l c) = (pack fp, unPos l, unPos c)
+
+nNull :: NExprLoc
+nNull = Fix (Compose (Ann nullSpan (NConstant NNull)))
+
+nullSpan :: SrcSpan
+nullSpan = SrcSpan nullPos nullPos
+
+-- | Pattern systems for matching on NExprLocF constructions.
+
+pattern NSym_ :: SrcSpan -> VarName -> NExprLocF r
+pattern NSym_ ann x = Compose (Ann ann (NSym x))
+
+pattern NConstant_ :: SrcSpan -> NAtom -> NExprLocF r
+pattern NConstant_ ann x = Compose (Ann ann (NConstant x))
+
+pattern NStr_ :: SrcSpan -> NString r -> NExprLocF r
+pattern NStr_ ann x = Compose (Ann ann (NStr x))
+
+pattern NList_ :: SrcSpan -> [r] -> NExprLocF r
+pattern NList_ ann x = Compose (Ann ann (NList x))
+
+pattern NSet_ :: SrcSpan -> [Binding r] -> NExprLocF r
+pattern NSet_ ann x = Compose (Ann ann (NSet x))
+
+pattern NRecSet_ :: SrcSpan -> [Binding r] -> NExprLocF r
+pattern NRecSet_ ann x = Compose (Ann ann (NRecSet x))
+
+pattern NLiteralPath_ :: SrcSpan -> FilePath -> NExprLocF r
+pattern NLiteralPath_ ann x = Compose (Ann ann (NLiteralPath x))
+
+pattern NEnvPath_ :: SrcSpan -> FilePath -> NExprLocF r
+pattern NEnvPath_ ann x = Compose (Ann ann (NEnvPath x))
+
+pattern NSelect_ :: SrcSpan -> r -> NAttrPath r -> Maybe r -> NExprLocF r
+pattern NSelect_ ann x p v = Compose (Ann ann (NSelect x p v))
+
+pattern NHasAttr_ :: SrcSpan -> r -> NAttrPath r -> NExprLocF r
+pattern NHasAttr_ ann x p = Compose (Ann ann (NHasAttr x p))
+
+pattern NAbs_ :: SrcSpan -> Params r-> r -> NExprLocF r
+pattern NAbs_ ann x b = Compose (Ann ann (NAbs x b))
+
+pattern NLet_ :: SrcSpan -> [Binding r] -> r -> NExprLocF r
+pattern NLet_ ann x b = Compose (Ann ann (NLet x b))
+
+pattern NIf_ :: SrcSpan -> r -> r -> r -> NExprLocF r
+pattern NIf_ ann c t e = Compose (Ann ann (NIf c t e))
+
+pattern NWith_ :: SrcSpan -> r -> r -> NExprLocF r
+pattern NWith_ ann x y = Compose (Ann ann (NWith x y))
+
+pattern NAssert_ :: SrcSpan -> r -> r -> NExprLocF r
+pattern NAssert_ ann x y = Compose (Ann ann (NAssert x y))
+
+pattern NUnary_ :: SrcSpan -> NUnaryOp -> r -> NExprLocF r
+pattern NUnary_ ann op x = Compose (Ann ann (NUnary op x))
+
+pattern NBinary_ :: SrcSpan -> NBinaryOp -> r -> r -> NExprLocF r
+pattern NBinary_ ann op x y = Compose (Ann ann (NBinary op x y))
diff --git a/src/Nix/Frames.hs b/src/Nix/Frames.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Frames.hs
@@ -0,0 +1,46 @@
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE ExistentialQuantification #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Nix.Frames (NixLevel(..), Frames, Framed, NixFrame(..),
+                   NixException(..), withFrame, throwError,
+                   module Data.Typeable,
+                   module Control.Exception) where
+
+import Control.Exception hiding (catch, evaluate)
+import Control.Monad.Catch
+import Control.Monad.Reader
+import Data.Typeable hiding (typeOf)
+import Nix.Utils
+
+data NixLevel = Fatal | Error | Warning | Info | Debug
+    deriving (Ord, Eq, Bounded, Enum, Show)
+
+data NixFrame = NixFrame
+    { frameLevel :: NixLevel
+    , frame      :: SomeException
+    }
+
+instance Show NixFrame where
+    show (NixFrame level f) =
+        "Nix frame at level " ++ show level ++ ": "++ show f
+
+type Frames = [NixFrame]
+
+type Framed e m = (MonadReader e m, Has e Frames, MonadThrow m)
+
+newtype NixException = NixException Frames
+    deriving Show
+
+instance Exception NixException
+
+withFrame :: forall s e m a. (Framed e m, Exception s) => NixLevel -> s -> m a -> m a
+withFrame level f = local (over hasLens (NixFrame level (toException f) :))
+
+throwError :: forall s e m a. (Framed e m, Exception s, MonadThrow m) => s -> m a
+throwError err = do
+    context <- asks (view hasLens)
+    traceM "Throwing error..."
+    throwM $ NixException (NixFrame Error (toException err):context)
diff --git a/src/Nix/Lint.hs b/src/Nix/Lint.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Lint.hs
@@ -0,0 +1,418 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE DeriveFoldable #-}
+{-# LANGUAGE DeriveTraversable #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
+{-# OPTIONS_GHC -Wno-missing-methods #-}
+
+module Nix.Lint where
+
+import           Control.Exception
+import           Control.Monad
+import           Control.Monad.Catch
+import           Control.Monad.Fix
+import           Control.Monad.Reader (MonadReader)
+import           Control.Monad.ST
+import           Control.Monad.Trans.Reader
+import           Data.Coerce
+import           Data.HashMap.Lazy (HashMap)
+import qualified Data.HashMap.Lazy as M
+import           Data.List
+import qualified Data.List.NonEmpty as NE
+import           Data.STRef
+import           Data.Text (Text)
+import qualified Data.Text as Text
+import           Nix.Atoms
+import           Nix.Context
+import           Nix.Convert
+import           Nix.Eval (MonadEval(..))
+import qualified Nix.Eval as Eval
+import           Nix.Expr
+import           Nix.Frames
+import           Nix.Options
+import           Nix.Scope
+import           Nix.Thunk
+import           Nix.Utils
+
+data TAtom
+  = TInt
+  | TFloat
+  | TBool
+  | TNull
+  deriving (Show, Eq, Ord)
+
+data NTypeF (m :: * -> *) r
+    = TConstant [TAtom]
+    | TStr
+    | TList r
+    | TSet (Maybe (HashMap Text r))
+    | TClosure (Params ())
+    | TPath
+    | TBuiltin String (SThunk m -> m (Symbolic m))
+    deriving Functor
+
+compareTypes :: NTypeF m r -> NTypeF m r -> Ordering
+compareTypes (TConstant _)   (TConstant _)   = EQ
+compareTypes (TConstant _)   _               = LT
+compareTypes _               (TConstant _)   = GT
+compareTypes TStr            TStr            = EQ
+compareTypes TStr            _               = LT
+compareTypes _               TStr            = GT
+compareTypes (TList _)       (TList _)       = EQ
+compareTypes (TList _)       _               = LT
+compareTypes _               (TList _)       = GT
+compareTypes (TSet _)        (TSet _)        = EQ
+compareTypes (TSet _)        _               = LT
+compareTypes _               (TSet _)        = GT
+compareTypes TClosure {}     TClosure {}     = EQ
+compareTypes TClosure {}     _               = LT
+compareTypes _               TClosure {}     = GT
+compareTypes TPath           TPath           = EQ
+compareTypes TPath            _              = LT
+compareTypes _               TPath           = GT
+compareTypes (TBuiltin _ _)  (TBuiltin _ _)  = EQ
+
+data NSymbolicF r
+    = NAny
+    | NMany [r]
+    deriving (Show, Eq, Ord, Functor, Foldable, Traversable)
+
+newtype SThunk m = SThunk { getSThunk :: Thunk m (Symbolic m) }
+
+newtype Symbolic m =
+    Symbolic { getSymbolic :: Var m (NSymbolicF (NTypeF m (SThunk m))) }
+
+instance Show (Symbolic m) where
+    show _ = "<symbolic>"
+
+everyPossible :: MonadVar m => m (Symbolic m)
+everyPossible = packSymbolic NAny
+
+mkSymbolic :: MonadVar m => [NTypeF m (SThunk m)] -> m (Symbolic m)
+mkSymbolic xs = packSymbolic (NMany xs)
+
+packSymbolic :: MonadVar m
+             => NSymbolicF (NTypeF m (SThunk m)) -> m (Symbolic m)
+packSymbolic = fmap coerce . newVar
+
+unpackSymbolic :: MonadVar m
+               => Symbolic m -> m (NSymbolicF (NTypeF m (SThunk m)))
+unpackSymbolic = readVar . coerce
+
+type MonadLint e m = (Scoped e (SThunk m) m, Framed e m, MonadVar m)
+
+symerr :: forall e m a. MonadLint e m => String -> m a
+symerr = evalError @(Symbolic m) . ErrorCall
+
+renderSymbolic :: MonadLint e m => Symbolic m -> m String
+renderSymbolic = unpackSymbolic >=> \case
+    NAny -> return "<any>"
+    NMany xs -> fmap (intercalate ", ") $ forM xs $ \case
+        TConstant ys  -> fmap (intercalate ", ") $ forM ys $ \case
+            TInt   -> return "int"
+            TFloat -> return "float"
+            TBool  -> return "bool"
+            TNull  -> return "null"
+        TStr            -> return "string"
+        TList r         -> do
+            x <- force r renderSymbolic
+            return $ "[" ++ x ++ "]"
+        TSet Nothing    -> return "<any set>"
+        TSet (Just s)   -> do
+            x <- traverse (`force` renderSymbolic) s
+            return $ "{" ++ show x ++ "}"
+        f@(TClosure p) -> do
+            (args, sym) <- do
+                f' <- mkSymbolic [f]
+                lintApp (NAbs (void p) ()) f' everyPossible
+            args' <- traverse renderSymbolic args
+            sym'  <- renderSymbolic sym
+            return $ "(" ++ show args' ++ " -> " ++ sym' ++ ")"
+        TPath           -> return "path"
+        TBuiltin _n _f    -> return "<builtin function>"
+
+-- This function is order and uniqueness preserving (of types).
+merge :: forall e m. MonadLint e m
+      => NExprF () -> [NTypeF m (SThunk m)] -> [NTypeF m (SThunk m)]
+      -> m [NTypeF m (SThunk m)]
+merge context = go
+  where
+    go :: [NTypeF m (SThunk m)] -> [NTypeF m (SThunk m)]
+       -> m [NTypeF m (SThunk m)]
+    go [] _ = return []
+    go _ [] = return []
+    go (x:xs) (y:ys) = case (x, y) of
+        (TStr,  TStr)  -> (TStr :)  <$> go xs ys
+        (TPath, TPath) -> (TPath :) <$> go xs ys
+        (TConstant ls, TConstant rs) ->
+            (TConstant (ls `intersect` rs) :) <$> go xs ys
+        (TList l, TList r) -> force l $ \l' -> force r $ \r' -> do
+            m <- thunk $ unify context l' r'
+            (TList m :) <$> go xs ys
+        (TSet x, TSet Nothing) -> (TSet x :) <$> go xs ys
+        (TSet Nothing, TSet x) -> (TSet x :) <$> go xs ys
+        (TSet (Just l), TSet (Just r)) -> do
+            m <- sequenceA $ M.intersectionWith
+                (\i j -> i >>= \i' -> j >>= \j' ->
+                        force i' $ \i'' -> force j' $ \j'' ->
+                            thunk $ unify context i'' j'')
+                (return <$> l) (return <$> r)
+            if M.null m
+                then go xs ys
+                else (TSet (Just m) :) <$> go xs ys
+        (TClosure {}, TClosure {}) ->
+            throwError $ ErrorCall "Cannot unify functions"
+        (TBuiltin _ _, TBuiltin _ _) ->
+            throwError $ ErrorCall "Cannot unify builtin functions"
+        _ | compareTypes x y == LT -> go xs (y:ys)
+          | compareTypes x y == GT -> go (x:xs) ys
+          | otherwise              -> error "impossible"
+
+{-
+    mergeFunctions pl nl fl pr fr xs ys = do
+        m <- sequenceA $ M.intersectionWith
+            (\i j -> i >>= \i' -> j >>= \j' -> case (i', j') of
+                    (Nothing, Nothing) -> return $ Just Nothing
+                    (_, Nothing) -> return Nothing
+                    (Nothing, _) -> return Nothing
+                    (Just i'', Just j'') ->
+                        Just . Just <$> unify context i'' j'')
+            (return <$> pl) (return <$> pr)
+        let Just m' = sequenceA $ M.filter isJust m
+        if M.null m'
+            then go xs ys
+            else do
+                g <- unify context fl fr
+                (TClosure (ParamSet m' False nl) g :)
+                    <$> go xs ys
+-}
+
+-- | unify raises an error if the result is would be 'NMany []'.
+unify :: forall e m. MonadLint e m
+      => NExprF () -> Symbolic m -> Symbolic m -> m (Symbolic m)
+unify context (Symbolic x) (Symbolic y) = do
+    x' <- readVar x
+    y' <- readVar y
+    case (x', y') of
+        (NAny, _) -> do
+            writeVar x y'
+            return $ Symbolic y
+        (_, NAny) -> do
+            writeVar y x'
+            return $ Symbolic x
+        (NMany xs, NMany ys) -> do
+            m <- merge context xs ys
+            if null m
+                then do
+                    -- x' <- renderSymbolic (Symbolic x)
+                    -- y' <- renderSymbolic (Symbolic y)
+                    throwError $ ErrorCall "Cannot unify "
+                        -- ++ show x' ++ " with " ++ show y'
+                        --  ++ " in context: " ++ show context
+                else do
+                    writeVar x (NMany m)
+                    writeVar y (NMany m)
+                    packSymbolic (NMany m)
+
+-- These aren't worth defining yet, because once we move to Hindley-Milner,
+-- we're not going to be managing Symbolic values this way anymore.
+
+instance ToValue Bool m (Symbolic m) where
+
+instance ToValue [SThunk m] m (Symbolic m) where
+
+instance FromValue (Text, DList Text) m (Symbolic m) where
+
+instance FromValue (AttrSet (SThunk m), AttrSet SourcePos) m (Symbolic m) where
+
+instance ToValue (AttrSet (SThunk m), AttrSet SourcePos) m (Symbolic m) where
+
+instance MonadLint e m => MonadThunk (Symbolic m) (SThunk m) m where
+    thunk = fmap coerce . buildThunk
+    force = forceThunk . coerce
+    value = coerce . valueRef
+
+instance MonadLint e m => MonadEval (Symbolic m) m where
+    freeVariable var = symerr $
+        "Undefined variable '" ++ Text.unpack var ++ "'"
+
+    attrMissing ks Nothing =
+        evalError @(Symbolic m) $ ErrorCall $
+            "Inheriting unknown attribute: "
+                ++ intercalate "." (map Text.unpack (NE.toList ks))
+
+    attrMissing ks (Just s) =
+        evalError @(Symbolic m) $ ErrorCall $ "Could not look up attribute "
+            ++ intercalate "." (map Text.unpack (NE.toList ks))
+            ++ " in " ++ show s
+
+    evalCurPos = do
+        f <- value <$> mkSymbolic [TPath]
+        l <- value <$> mkSymbolic [TConstant [TInt]]
+        c <- value <$> mkSymbolic [TConstant [TInt]]
+        mkSymbolic [TSet (Just (M.fromList (go f l c)))]
+      where
+        go f l c =
+            [ (Text.pack "file", f)
+            , (Text.pack "line", l)
+            , (Text.pack "col",  c) ]
+
+    evalConstant c  = mkSymbolic [TConstant [go c]]
+      where
+        go = \case
+          NInt _   -> TInt
+          NFloat _ -> TFloat
+          NBool _  -> TBool
+          NNull    -> TNull
+
+    evalString      = const $ mkSymbolic [TStr]
+    evalLiteralPath = const $ mkSymbolic [TPath]
+    evalEnvPath     = const $ mkSymbolic [TPath]
+
+    evalUnary op arg =
+        unify (void (NUnary op arg)) arg
+            =<< mkSymbolic [TConstant [TInt, TBool]]
+
+    evalBinary = lintBinaryOp
+
+    evalWith scope body = do
+        -- The scope is deliberately wrapped in a thunk here, since it is
+        -- evaluated each time a name is looked up within the weak scope, and
+        -- we want to be sure the action it evaluates is to force a thunk, so
+        -- its value is only computed once.
+        s <- thunk scope
+        pushWeakScope ?? body $ force s $ unpackSymbolic >=> \case
+            NMany [TSet (Just s')] -> return s'
+            NMany [TSet Nothing] -> error "NYI: with unknown"
+            _ -> throwError $ ErrorCall "scope must be a set in with statement"
+
+    evalIf cond t f = do
+        t' <- t
+        f' <- f
+        let e = NIf cond t' f'
+        _ <- unify (void e) cond =<< mkSymbolic [TConstant [TBool]]
+        unify (void e) t' f'
+
+    evalAssert cond body = do
+        body' <- body
+        let e = NAssert cond body'
+        _ <- unify (void e) cond =<< mkSymbolic [TConstant [TBool]]
+        pure body'
+
+    evalApp = (fmap snd .) . lintApp (NBinary NApp () ())
+    evalAbs params _ = mkSymbolic [TClosure (void params)]
+
+    evalError = throwError
+
+lintBinaryOp
+    :: forall e m. (MonadLint e m, MonadEval (Symbolic m) m)
+    => NBinaryOp -> Symbolic m -> m (Symbolic m) -> m (Symbolic m)
+lintBinaryOp op lsym rarg = do
+    rsym <- rarg
+    y <- thunk everyPossible
+    case op of
+        NApp   -> symerr "lintBinaryOp:NApp: should never get here"
+        NEq    -> check lsym rsym [ TConstant [TInt, TBool, TNull]
+                                 , TStr
+                                 , TList y ]
+        NNEq   -> check lsym rsym [ TConstant [TInt, TBool, TNull]
+                                 , TStr
+                                 , TList y ]
+
+        NLt    -> check lsym rsym [ TConstant [TInt, TBool, TNull] ]
+        NLte   -> check lsym rsym [ TConstant [TInt, TBool, TNull] ]
+        NGt    -> check lsym rsym [ TConstant [TInt, TBool, TNull] ]
+        NGte   -> check lsym rsym [ TConstant [TInt, TBool, TNull] ]
+
+        NAnd   -> check lsym rsym [ TConstant [TBool] ]
+        NOr    -> check lsym rsym [ TConstant [TBool] ]
+        NImpl  -> check lsym rsym [ TConstant [TBool] ]
+
+        -- jww (2018-04-01): NYI: Allow Path + Str
+        NPlus  -> check lsym rsym [ TConstant [TInt], TStr, TPath ]
+        NMinus -> check lsym rsym [ TConstant [TInt] ]
+        NMult  -> check lsym rsym [ TConstant [TInt] ]
+        NDiv   -> check lsym rsym [ TConstant [TInt] ]
+
+        NUpdate -> check lsym rsym [ TSet Nothing ]
+
+        NConcat -> check lsym rsym [ TList y ]
+  where
+    check lsym rsym xs = do
+        let e = NBinary op lsym rsym
+        m <- mkSymbolic xs
+        _ <- unify (void e) lsym m
+        _ <- unify (void e) rsym m
+        unify (void e) lsym rsym
+
+infixl 1 `lintApp`
+lintApp :: forall e m. MonadLint e m
+        => NExprF () -> Symbolic m -> m (Symbolic m)
+        -> m (HashMap VarName (Symbolic m), Symbolic m)
+lintApp context fun arg = unpackSymbolic fun >>= \case
+    NAny -> throwError $ ErrorCall
+        "Cannot apply something not known to be a function"
+    NMany xs -> do
+        (args:_, ys) <- fmap unzip $ forM xs $ \case
+            TClosure _params -> arg >>= unpackSymbolic >>= \case
+                NAny -> do
+                    error "NYI"
+
+                NMany [TSet (Just _)] -> do
+                    error "NYI"
+
+                NMany _ -> throwError $ ErrorCall "NYI: lintApp NMany not set"
+            TBuiltin _ _f -> throwError $ ErrorCall "NYI: lintApp builtin"
+            TSet _m -> throwError $ ErrorCall "NYI: lintApp Set"
+            _x -> throwError $ ErrorCall "Attempt to call non-function"
+
+        y <- everyPossible
+        (args,) <$> foldM (unify context) y ys
+
+newtype Lint s a = Lint
+    { runLint :: ReaderT (Context (Lint s) (SThunk (Lint s))) (ST s) a }
+    deriving (Functor, Applicative, Monad, MonadFix,
+              MonadReader (Context (Lint s) (SThunk (Lint s))))
+
+instance MonadVar (Lint s) where
+    type Var (Lint s) = STRef s
+
+    newVar x     = Lint $ ReaderT $ \_ -> newSTRef x
+    readVar x    = Lint $ ReaderT $ \_ -> readSTRef x
+    writeVar x y = Lint $ ReaderT $ \_ -> writeSTRef x y
+    atomicModifyVar x f = Lint $ ReaderT $ \_ -> do
+        res <- snd . f <$> readSTRef x
+        _ <- modifySTRef x (fst . f)
+        return res
+
+instance MonadThrow (Lint s) where
+    throwM e = Lint $ ReaderT $ \_ -> throw e
+
+runLintM :: Options -> Lint s a -> ST s a
+runLintM opts = flip runReaderT (newContext opts) . runLint
+
+symbolicBaseEnv :: Monad m => m (Scopes m (SThunk m))
+symbolicBaseEnv = return emptyScopes
+
+lint :: Options -> NExprLoc -> ST s (Symbolic (Lint s))
+lint opts expr = runLintM opts $
+    symbolicBaseEnv
+        >>= (`pushScopes`
+                adi (Eval.eval . annotated . getCompose)
+                    Eval.addSourcePositions expr)
diff --git a/src/Nix/Normal.hs b/src/Nix/Normal.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Normal.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+
+module Nix.Normal where
+
+import           Control.Monad
+import           Data.Fix
+import qualified Data.HashMap.Lazy as M
+import           Data.Text (Text)
+import qualified Data.Text as Text
+import           Nix.Atoms
+import           Nix.Effects
+import           Nix.Frames
+import           Nix.Thunk
+import           Nix.Utils
+import           Nix.Value
+
+newtype NormalLoop m = NormalLoop (NValue m)
+    deriving Show
+
+instance Typeable m => Exception (NormalLoop m)
+
+normalFormBy
+    :: forall e m. (Framed e m, MonadVar m, Typeable m)
+    => (forall r. NThunk m -> (NValue m -> m r) -> m r)
+    -> Int
+    -> NValue m
+    -> m (NValueNF m)
+normalFormBy k n v = do
+    when (n > 2000) $ throwError $ NormalLoop v
+    case v of
+        NVConstant a     -> return $ Fix $ NVConstantF a
+        NVStr t s        -> return $ Fix $ NVStrF t s
+        NVList l         ->
+            fmap (Fix . NVListF) $ forM (zip [0..] l) $ \(i :: Int, t) -> do
+                traceM $ replicate n ' ' ++ "normalFormBy: List[" ++ show i ++ "]"
+                t `k` normalFormBy k (succ n)
+        NVSet s p        ->
+            fmap (Fix . flip NVSetF p) $ sequence $ flip M.mapWithKey s $ \ky t -> do
+                traceM $ replicate n ' ' ++ "normalFormBy: Set{" ++ show ky ++ "}"
+                t `k` normalFormBy k (succ n)
+        NVClosure p f    -> return $ Fix $ NVClosureF p f
+        NVPath fp        -> return $ Fix $ NVPathF fp
+        NVBuiltin name f -> return $ Fix $ NVBuiltinF name f
+        _ -> error "Pattern synonyms mask complete matches"
+
+normalForm :: (Framed e m, MonadVar m, Typeable m,
+              MonadThunk (NValue m) (NThunk m) m)
+           => NValue m -> m (NValueNF m)
+normalForm = normalFormBy force 0
+
+embed :: forall m. (MonadThunk (NValue m) (NThunk m) m)
+      => NValueNF m -> m (NValue m)
+embed (Fix x) = case x of
+    NVConstantF a     -> return $ nvConstant a
+    NVStrF t s        -> return $ nvStr t s
+    NVListF l         -> nvList . fmap (value @_ @_ @m)
+        <$> traverse embed l
+    NVSetF s p        -> flip nvSet p . fmap (value @_ @_ @m)
+        <$> traverse embed s
+    NVClosureF p f    -> return $ nvClosure p f
+    NVPathF fp        -> return $ nvPath fp
+    NVBuiltinF name f -> return $ nvBuiltin name f
+
+valueText :: forall e m. (Framed e m, MonadEffects m, Typeable m)
+          => Bool -> NValueNF m -> m (Text, DList Text)
+valueText addPathsToStore = cata phi
+  where
+    phi :: NValueF m (m (Text, DList Text)) -> m (Text, DList Text)
+    phi (NVConstantF a) = pure (atomText a, mempty)
+    phi (NVStrF t c)    = pure (t, c)
+    phi v@(NVListF _)   = coercionFailed v
+    phi v@(NVSetF s _)
+      | Just asString <- M.lookup "__asString" s = asString
+      | otherwise = coercionFailed v
+    phi v@NVClosureF {} = coercionFailed v
+    phi (NVPathF originalPath)
+        | addPathsToStore = do
+            storePath <- addPath originalPath
+            pure (Text.pack $ unStorePath storePath, mempty)
+        | otherwise = pure (Text.pack originalPath, mempty)
+    phi v@(NVBuiltinF _ _) = coercionFailed v
+
+    coercionFailed v =
+        throwError $ Coercion @m (valueType v) TString
+
+valueTextNoContext :: (Framed e m, MonadEffects m, Typeable m)
+                   => Bool -> NValueNF m -> m Text
+valueTextNoContext addPathsToStore = fmap fst . valueText addPathsToStore
diff --git a/src/Nix/Options.hs b/src/Nix/Options.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Options.hs
@@ -0,0 +1,79 @@
+module Nix.Options where
+
+import           Data.Text (Text)
+import           Data.Time
+
+data Options = Options
+    { verbose      :: Verbosity
+    , tracing      :: Bool
+    , thunks       :: Bool
+    , values       :: Bool
+    , reduce       :: Maybe FilePath
+    , reduceSets   :: Bool
+    , reduceLists  :: Bool
+    , parse        :: Bool
+    , parseOnly    :: Bool
+    , finder       :: Bool
+    , findFile     :: Maybe FilePath
+    , strict       :: Bool
+    , normalize    :: Bool
+    , evaluate     :: Bool
+    , json         :: Bool
+    , xml          :: Bool
+    , attr         :: Maybe Text
+    , include      :: [FilePath]
+    , check        :: Bool
+    , readFrom     :: Maybe FilePath
+    , cache        :: Bool
+    , repl         :: Bool
+    , ignoreErrors :: Bool
+    , expression   :: Maybe Text
+    , arg          :: [(Text, Text)]
+    , argstr       :: [(Text, Text)]
+    , fromFile     :: Maybe FilePath
+    , currentTime  :: UTCTime
+    , filePaths    :: [FilePath]
+    }
+    deriving Show
+
+defaultOptions :: UTCTime -> Options
+defaultOptions current = Options
+    { verbose      = ErrorsOnly
+    , tracing      = False
+    , thunks       = False
+    , values       = False
+    , reduce       = Nothing
+    , reduceSets   = False
+    , reduceLists  = False
+    , parse        = False
+    , parseOnly    = False
+    , finder       = False
+    , findFile     = Nothing
+    , strict       = False
+    , normalize    = False
+    , evaluate     = False
+    , json         = False
+    , xml          = False
+    , attr         = Nothing
+    , include      = []
+    , check        = False
+    , readFrom     = Nothing
+    , cache        = False
+    , repl         = False
+    , ignoreErrors = False
+    , expression   = Nothing
+    , arg          = []
+    , argstr       = []
+    , fromFile     = Nothing
+    , currentTime  = current
+    , filePaths    = []
+    }
+
+data Verbosity
+    = ErrorsOnly
+    | Informational
+    | Talkative
+    | Chatty
+    | DebugInfo
+    | Vomit
+    deriving (Eq, Ord, Enum, Bounded, Show)
diff --git a/src/Nix/Options/Parser.hs b/src/Nix/Options/Parser.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Options/Parser.hs
@@ -0,0 +1,130 @@
+module Nix.Options.Parser where
+
+import           Control.Arrow (second)
+import           Data.Char (isDigit)
+import           Data.Maybe (fromMaybe)
+import           Data.Text (Text)
+import qualified Data.Text as Text
+import           Data.Time
+import           Nix.Options
+import           Options.Applicative hiding (ParserResult(..))
+import           Text.PrettyPrint.ANSI.Leijen hiding ((<$>))
+
+decodeVerbosity :: Int -> Verbosity
+decodeVerbosity 0 = ErrorsOnly
+decodeVerbosity 1 = Informational
+decodeVerbosity 2 = Talkative
+decodeVerbosity 3 = Chatty
+decodeVerbosity 4 = DebugInfo
+decodeVerbosity _ = Vomit
+
+argPair :: Mod OptionFields (Text, Text) -> Parser (Text, Text)
+argPair = option $ str >>= \s ->
+    case Text.findIndex (== '=') s of
+        Nothing -> errorWithoutStackTrace
+            "Format of --arg/--argstr in hnix is: name=expr"
+        Just i -> return $ second Text.tail $ Text.splitAt i s
+
+nixOptions :: UTCTime -> Parser Options
+nixOptions current = Options
+    <$> (fromMaybe ErrorsOnly <$>
+         optional
+           (option (do a <- str
+                       if all isDigit a
+                       then pure $ decodeVerbosity (read a)
+                       else fail "Argument to -v/--verbose must be a number")
+            (   short 'v'
+             <> long "verbose"
+             <> help "Verbose output")))
+    <*> switch
+        (   long "trace"
+         <> help "Enable tracing code (even more can be seen if built with --flags=tracing)")
+    <*> switch
+        (   long "thunks"
+         <> help "Enable reporting of thunk tracing as well as regular evaluation")
+    <*> switch
+        (   long "values"
+         <> help "Enable reporting of value provenance in error messages")
+    <*> optional (strOption
+        (   long "reduce"
+         <> help "When done evaluating, output the evaluated part of the expression to FILE"))
+    <*> switch
+        (   long "reduce-sets"
+         <> help "Reduce set members that aren't used; breaks if hasAttr is used")
+    <*> switch
+        (   long "reduce-lists"
+         <> help "Reduce list members that aren't used; breaks if elemAt is used")
+    <*> switch
+        (   long "parse"
+         <> help "Whether to parse the file (also the default right now)")
+    <*> switch
+        (   long "parse-only"
+         <> help "Whether to parse only, no pretty printing or checking")
+    <*> switch
+        (   long "find"
+         <> help "If selected, find paths within attr trees")
+    <*> optional (strOption
+        (   long "find-file"
+         <> help "Look up the given files in Nix's search path"))
+    <*> switch
+        (   long "strict"
+         <> help "When used with --eval, recursively evaluate list elements and attributes")
+    <*> switch
+        (   long "force"
+         <> help "Whether to force the results of evaluation to normal form")
+    <*> switch
+        (   long "eval"
+         <> help "Whether to evaluate, or just pretty-print")
+    <*> switch
+        (   long "json"
+         <> help "Print the resulting value as an JSON representation")
+    <*> switch
+        (   long "xml"
+         <> help "Print the resulting value as an XML representation")
+    <*> optional (strOption
+        (   short 'A'
+         <> long "attr"
+         <> help "Select an attribute from the top-level Nix expression being evaluated"))
+    <*> many (strOption
+        (   short 'I'
+         <> long "include"
+         <> help "Add a path to the Nix expression search path"))
+    <*> switch
+        (   long "check"
+         <> help "Whether to check for syntax errors after parsing")
+    <*> optional (strOption
+        (   long "read"
+         <> help "Read in an expression tree from a binary cache"))
+    <*> switch
+        (   long "cache"
+         <> help "Write out the parsed expression tree to a binary cache")
+    <*> switch
+        (   long "repl"
+         <> help "After performing any indicated actions, enter the REPL")
+    <*> switch
+        (   long "ignore-errors"
+         <> help "Continue parsing files, even if there are errors")
+    <*> optional (strOption
+        (   short 'E'
+         <> long "expr"
+         <> help "Expression to parse or evaluate"))
+    <*> many (argPair
+        (   long "arg"
+         <> help "Argument to pass to an evaluated lambda"))
+    <*> many (argPair
+        (   long "argstr"
+         <> help "Argument string to pass to an evaluated lambda"))
+    <*> optional (strOption
+        (   short 'f'
+         <> long "file"
+         <> help "Parse all of the files given in FILE; - means stdin"))
+    <*> option (parseTimeOrError True defaultTimeLocale "%Y/%m/%d %H:%M:%S" <$> str)
+        (   long "now"
+         <> value current
+         <> help "Set current time for testing purposes")
+    <*> many (strArgument (metavar "FILE" <> help "Path of file to parse"))
+
+nixOptionsInfo :: UTCTime -> ParserInfo Options
+nixOptionsInfo current =
+    info (helper <*> nixOptions current)
+         (fullDesc <> progDesc "" <> header "hnix")
diff --git a/src/Nix/Parser.hs b/src/Nix/Parser.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Parser.hs
@@ -0,0 +1,548 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
+{-# OPTIONS_GHC -Wno-missing-signatures #-}
+
+module Nix.Parser
+    ( parseNixFile
+    , parseNixFileLoc
+    , parseNixText
+    , parseNixTextLoc
+    , parseFromFileEx
+    , parseFromText
+    , Result(..)
+    , reservedNames
+    , OperatorInfo(..)
+    , NSpecialOp(..)
+    , NAssoc(..)
+    , NOperatorDef
+    , getUnaryOperator
+    , getBinaryOperator
+    , getSpecialOperator
+    ) where
+
+import           Control.Applicative hiding (many, some)
+import           Control.DeepSeq
+import           Control.Monad
+import           Control.Monad.IO.Class
+import           Data.Char (isAlpha, isDigit, isSpace)
+import           Data.Data (Data(..))
+import           Data.Foldable (concat)
+import           Data.Functor
+import           Data.Functor.Identity
+import           Data.HashSet (HashSet)
+import qualified Data.HashSet as HashSet
+import           Data.List.NonEmpty (NonEmpty(..))
+import qualified Data.List.NonEmpty as NE
+import qualified Data.Map as Map
+import           Data.Text (Text)
+import           Data.Text hiding (map, foldr1, concat, concatMap, zipWith)
+import qualified Data.Text.IO as T
+import           Data.Typeable (Typeable)
+import           Data.Void
+import           GHC.Generics hiding (Prefix)
+import           Nix.Expr hiding (($>))
+import           Nix.Strings
+import           Text.Megaparsec
+import           Text.Megaparsec.Char
+import qualified Text.Megaparsec.Char.Lexer as L
+import           Text.Megaparsec.Expr
+import           Text.PrettyPrint.ANSI.Leijen (Doc, text)
+
+infixl 3 <+>
+(<+>) :: MonadPlus m => m a -> m a -> m a
+(<+>) = mplus
+
+--------------------------------------------------------------------------------
+
+nixExprLoc :: Parser NExprLoc
+nixExprLoc = makeExprParser nixTerm $ map (map snd) (nixOperators nixSelector)
+
+antiStart :: Parser Text
+antiStart = symbol "${" <?> show ("${" :: String)
+
+nixAntiquoted :: Parser a -> Parser (Antiquoted a NExprLoc)
+nixAntiquoted p =
+        Antiquoted <$> (antiStart *> nixToplevelForm <* symbol "}")
+    <+> Plain <$> p
+    <?> "anti-quotation"
+
+selDot :: Parser ()
+selDot = try (symbol "." *> notFollowedBy nixPath) <?> "."
+
+nixSelect :: Parser NExprLoc -> Parser NExprLoc
+nixSelect term = do
+    res <- build
+        <$> term
+        <*> optional ((,) <$> (selDot *> nixSelector)
+                          <*> optional (reserved "or" *> nixTerm))
+    continues <- optional $ lookAhead selDot
+    case continues of
+        Nothing -> pure res
+        Just _  -> nixSelect (pure res)
+ where
+  build :: NExprLoc
+        -> Maybe (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc)
+        -> NExprLoc
+  build t Nothing = t
+  build t (Just (s,o)) = nSelectLoc t s o
+
+nixSelector :: Parser (Ann SrcSpan (NAttrPath NExprLoc))
+nixSelector = annotateLocation $ do
+    (x:xs) <- keyName `sepBy1` selDot
+    return $ x :| xs
+
+nixTerm :: Parser NExprLoc
+nixTerm = do
+    c <- try $ lookAhead $ satisfy $ \x ->
+        pathChar x ||
+        x == '(' ||
+        x == '{' ||
+        x == '[' ||
+        x == '<' ||
+        x == '/' ||
+        x == '"' ||
+        x == '\''
+    case c of
+        '('  -> nixSelect nixParens
+        '{'  -> nixSelect nixSet
+        '['  -> nixList
+        '<'  -> nixSPath
+        '/'  -> nixPath
+        '"'  -> nixStringExpr
+        '\'' -> nixStringExpr
+        _    -> msum $
+            [ nixSelect nixSet | c == 'r' ] ++
+            [ nixPath | pathChar c ] ++
+            if isDigit c
+            then [ nixFloat
+                 , nixInt ]
+            else [ nixUri | isAlpha c ] ++
+                 [ nixBool | c == 't' || c == 'f' ] ++
+                 [ nixNull | c == 'n' ] ++
+                 [ nixSelect nixSym ]
+
+nixToplevelForm :: Parser NExprLoc
+nixToplevelForm = keywords <+> nixLambda <+> nixExprLoc
+  where
+    keywords = nixLet <+> nixIf <+> nixAssert <+> nixWith
+
+nixSym :: Parser NExprLoc
+nixSym = annotateLocation1 $ mkSymF <$> identifier
+
+nixInt :: Parser NExprLoc
+nixInt = annotateLocation1 (mkIntF <$> integer <?> "integer")
+
+nixFloat :: Parser NExprLoc
+nixFloat = annotateLocation1 (try (mkFloatF . realToFrac <$> float) <?> "float")
+
+nixBool :: Parser NExprLoc
+nixBool = annotateLocation1 (bool "true" True <+>
+                             bool "false" False) <?> "bool" where
+  bool str b = mkBoolF b <$ reserved str
+
+nixNull :: Parser NExprLoc
+nixNull = annotateLocation1 (mkNullF <$ reserved "null" <?> "null")
+
+nixParens :: Parser NExprLoc
+nixParens = parens nixToplevelForm <?> "parens"
+
+nixList :: Parser NExprLoc
+nixList = annotateLocation1 (brackets (NList <$> many nixTerm) <?> "list")
+
+pathChar :: Char -> Bool
+pathChar x = isAlpha x || isDigit x || x == '.' || x == '_' || x == '-' || x == '+' || x == '~'
+
+slash :: Parser Char
+slash = try (char '/' <* notFollowedBy (satisfy (\x -> x == '/' || x == '*' || isSpace x)))
+    <?> "slash"
+
+-- | A path surrounded by angle brackets, indicating that it should be
+-- looked up in the NIX_PATH environment variable at evaluation.
+nixSPath :: Parser NExprLoc
+nixSPath = annotateLocation1
+    (mkPathF True <$> try (char '<' *> many (satisfy pathChar <+> slash) <* symbol ">")
+         <?> "spath")
+
+pathStr :: Parser FilePath
+pathStr = lexeme $ liftM2 (++) (many (satisfy pathChar))
+    (Prelude.concat <$> some (liftM2 (:) slash (some (satisfy pathChar))))
+
+nixPath :: Parser NExprLoc
+nixPath = annotateLocation1 (try (mkPathF False <$> pathStr) <?> "path")
+
+nixLet :: Parser NExprLoc
+nixLet = annotateLocation1 (reserved "let"
+    *> (letBody <+> letBinders)
+    <?> "let block")
+  where
+    letBinders = NLet
+        <$> nixBinders
+        <*> (reserved "in" *> nixToplevelForm)
+    -- Let expressions `let {..., body = ...}' are just desugared
+    -- into `(rec {..., body = ...}).body'.
+    letBody = (\x -> NSelect x (StaticKey "body" :| []) Nothing) <$> aset
+    aset = annotateLocation1 $ NRecSet <$> braces nixBinders
+
+nixIf :: Parser NExprLoc
+nixIf = annotateLocation1 (NIf
+     <$> (reserved "if" *> nixExprLoc)
+     <*> (reserved "then" *> nixToplevelForm)
+     <*> (reserved "else" *> nixToplevelForm)
+     <?> "if")
+
+nixAssert :: Parser NExprLoc
+nixAssert = annotateLocation1 (NAssert
+  <$> (reserved "assert" *> nixExprLoc)
+  <*> (semi *> nixToplevelForm)
+  <?> "assert")
+
+nixWith :: Parser NExprLoc
+nixWith = annotateLocation1 (NWith
+  <$> (reserved "with" *> nixToplevelForm)
+  <*> (semi *> nixToplevelForm)
+  <?> "with")
+
+nixLambda :: Parser NExprLoc
+nixLambda = nAbs <$> annotateLocation (try argExpr) <*> nixToplevelForm
+
+nixStringExpr :: Parser NExprLoc
+nixStringExpr = nStr <$> annotateLocation nixString
+
+nixUri :: Parser NExprLoc
+nixUri = annotateLocation1 $ lexeme $ try $ do
+    start <- letterChar
+    protocol <- many $ satisfy $ \x ->
+        isAlpha x || isDigit x || x `elem` ("+-." :: String)
+    _ <- string ":"
+    address  <- some $ satisfy $ \x ->
+        isAlpha x || isDigit x || x `elem` ("%/?:@&=+$,-_.!~*'" :: String)
+    return $ NStr $
+        DoubleQuoted [Plain $ pack $ start : protocol ++ ':' : address]
+
+nixString :: Parser (NString NExprLoc)
+nixString = lexeme (doubleQuoted <+> indented <?> "string")
+  where
+    doubleQuoted :: Parser (NString NExprLoc)
+    doubleQuoted = DoubleQuoted . removePlainEmpty . mergePlain
+                <$> (doubleQ *> many (stringChar doubleQ (void $ char '\\')
+                                                 doubleEscape)
+                             <* doubleQ)
+                <?> "double quoted string"
+
+    doubleQ = void (char '"')
+    doubleEscape = Plain . singleton <$> (char '\\' *> escapeCode)
+
+    indented :: Parser (NString NExprLoc)
+    indented = stripIndent
+            <$> (indentedQ *> many (stringChar indentedQ indentedQ
+                                               indentedEscape)
+                           <* indentedQ)
+            <?> "indented string"
+
+    indentedQ = void (string "''" <?> "\"''\"")
+    indentedEscape = try $ do
+        indentedQ
+        (Plain <$> ("''" <$ char '\'' <+> "$"  <$ char '$')) <+> do
+            _ <- char '\\'
+            c <- escapeCode
+            pure $ if c == '\n'
+                   then EscapedNewline
+                   else Plain $ singleton c
+
+    stringChar end escStart esc =
+            Antiquoted <$> (antiStart *> nixToplevelForm <* char '}')
+        <+> Plain . singleton <$> char '$'
+        <+> esc
+        <+> Plain . pack <$> some plainChar
+     where
+       plainChar =
+           notFollowedBy (end <+> void (char '$') <+> escStart) *> anyChar
+
+    escapeCode = msum [ c <$ char e | (c,e) <- escapeCodes ] <+> anyChar
+
+-- | Gets all of the arguments for a function.
+argExpr :: Parser (Params NExprLoc)
+argExpr = msum [atLeft, onlyname, atRight] <* symbol ":" where
+  -- An argument not in curly braces. There's some potential ambiguity
+  -- in the case of, for example `x:y`. Is it a lambda function `x: y`, or
+  -- a URI `x:y`? Nix syntax says it's the latter. So we need to fail if
+  -- there's a valid URI parse here.
+  onlyname = msum [nixUri >> unexpected (Label ('v' NE.:| "alid uri")),
+                     Param <$> identifier]
+
+  -- Parameters named by an identifier on the left (`args @ {x, y}`)
+  atLeft = try $ do
+    name <- identifier <* symbol "@"
+    (variadic, params) <- params
+    return $ ParamSet params variadic (Just name)
+
+  -- Parameters named by an identifier on the right, or none (`{x, y} @ args`)
+  atRight = do
+    (variadic, params) <- params
+    name <- optional $ symbol "@" *> identifier
+    return $ ParamSet params variadic name
+
+  -- Return the parameters set.
+  params = do
+    (args, dotdots) <- braces getParams
+    return (dotdots, args)
+
+  -- Collects the parameters within curly braces. Returns the parameters and
+  -- a boolean indicating if the parameters are variadic.
+  getParams :: Parser ([(Text, Maybe NExprLoc)], Bool)
+  getParams = go [] where
+    -- Attempt to parse `...`. If this succeeds, stop and return True.
+    -- Otherwise, attempt to parse an argument, optionally with a
+    -- default. If this fails, then return what has been accumulated
+    -- so far.
+    go acc = ((acc, True) <$ symbol "...") <+> getMore acc
+    getMore acc =
+      -- Could be nothing, in which just return what we have so far.
+      option (acc, False) $ do
+        -- Get an argument name and an optional default.
+        pair <- liftM2 (,) identifier (optional $ question *> nixToplevelForm)
+        -- Either return this, or attempt to get a comma and restart.
+        option (acc ++ [pair], False) $ comma >> go (acc ++ [pair])
+
+nixBinders :: Parser [Binding NExprLoc]
+nixBinders = (inherit <+> namedVar) `endBy` semi where
+  inherit = do
+      x <- reserved "inherit" *> optional scope
+      p <- getPosition
+      Inherit x <$> many keyName <*> pure p <?> "inherited binding"
+  namedVar = do
+      p <- getPosition
+      NamedVar <$> (annotated <$> nixSelector)
+               <*> (equals *> nixToplevelForm)
+               <*> pure p
+               <?> "variable binding"
+  scope = parens nixToplevelForm <?> "inherit scope"
+
+keyName :: Parser (NKeyName NExprLoc)
+keyName = dynamicKey <+> staticKey where
+  staticKey = StaticKey <$> identifier
+  dynamicKey = DynamicKey <$> nixAntiquoted nixString
+
+nixSet :: Parser NExprLoc
+nixSet = annotateLocation1 ((isRec <*> braces nixBinders) <?> "set") where
+  isRec = (reserved "rec" $> NRecSet <?> "recursive set")
+       <+> pure NSet
+
+parseNixFile :: MonadIO m => FilePath -> m (Result NExpr)
+parseNixFile =
+    parseFromFileEx $ stripAnnotation <$> (whiteSpace *> nixToplevelForm <* eof)
+
+parseNixFileLoc :: MonadIO m => FilePath -> m (Result NExprLoc)
+parseNixFileLoc = parseFromFileEx (whiteSpace *> nixToplevelForm <* eof)
+
+parseNixText :: Text -> Result NExpr
+parseNixText =
+    parseFromText $ stripAnnotation <$> (whiteSpace *> nixToplevelForm <* eof)
+
+parseNixTextLoc :: Text -> Result NExprLoc
+parseNixTextLoc = parseFromText (whiteSpace *> nixToplevelForm <* eof)
+
+{- Parser.Library -}
+
+skipLineComment' :: Tokens Text -> Parser ()
+skipLineComment' prefix =
+  string prefix
+      *> void (takeWhileP (Just "character") (\x -> x /= '\n' && x /= '\r'))
+
+whiteSpace :: Parser ()
+whiteSpace = L.space space1 lineCmnt blockCmnt
+  where
+    lineCmnt  = skipLineComment' "#"
+    blockCmnt = L.skipBlockComment "/*" "*/"
+
+lexeme :: Parser a -> Parser a
+lexeme p = p <* whiteSpace
+
+symbol :: Text -> Parser Text
+symbol = lexeme . string
+
+reservedEnd :: Char -> Bool
+reservedEnd x = isSpace x ||
+    x == '{' || x == '(' || x == '[' ||
+    x == '}' || x == ')' || x == ']' ||
+    x == ';' || x == ':' || x == '.' ||
+    x == '"' || x == '\'' || x == ','
+
+reserved :: Text -> Parser ()
+reserved n = lexeme $ try $
+    string n *> lookAhead (void (satisfy reservedEnd) <|> eof)
+
+identifier = lexeme $ try $ do
+    ident <- cons <$> satisfy (\x -> isAlpha x || x == '_')
+                 <*> takeWhileP Nothing identLetter
+    guard (not (ident `HashSet.member` reservedNames))
+    return ident
+  where
+    identLetter x = isAlpha x || isDigit x || x == '_' || x == '\'' || x == '-'
+
+parens    = between (symbol "(") (symbol ")")
+braces    = between (symbol "{") (symbol "}")
+-- angles    = between (symbol "<") (symbol ">")
+brackets  = between (symbol "[") (symbol "]")
+semi      = symbol ";"
+comma     = symbol ","
+-- colon     = symbol ":"
+-- dot       = symbol "."
+equals    = symbol "="
+question  = symbol "?"
+
+integer :: Parser Integer
+integer = lexeme L.decimal
+
+float :: Parser Double
+float = lexeme L.float
+
+reservedNames :: HashSet Text
+reservedNames = HashSet.fromList
+    [ "let", "in"
+    , "if", "then", "else"
+    , "assert"
+    , "with"
+    , "rec"
+    , "inherit"
+    , "true", "false" ]
+
+type Parser = ParsecT Void Text Identity
+
+data Result a = Success a | Failure Doc deriving Show
+
+parseFromFileEx :: MonadIO m => Parser a -> FilePath -> m (Result a)
+parseFromFileEx p path = do
+    txt <- liftIO (T.readFile path)
+    return $ either (Failure . text . parseErrorPretty' txt) Success
+           $ parse p path txt
+
+parseFromText :: Parser a -> Text -> Result a
+parseFromText p txt =
+    either (Failure . text . parseErrorPretty' txt) Success $
+        parse p "<string>" txt
+
+{- Parser.Operators -}
+
+data NSpecialOp = NHasAttrOp | NSelectOp
+  deriving (Eq, Ord, Generic, Typeable, Data, Show, NFData)
+
+data NAssoc = NAssocNone | NAssocLeft | NAssocRight
+  deriving (Eq, Ord, Generic, Typeable, Data, Show, NFData)
+
+data NOperatorDef
+  = NUnaryDef Text NUnaryOp
+  | NBinaryDef Text NBinaryOp NAssoc
+  | NSpecialDef Text NSpecialOp NAssoc
+  deriving (Eq, Ord, Generic, Typeable, Data, Show, NFData)
+
+annotateLocation :: Parser a -> Parser (Ann SrcSpan a)
+annotateLocation p = do
+  begin <- getPosition
+  res   <- p
+  end   <- getPosition
+  pure $ Ann (SrcSpan begin end) res
+
+annotateLocation1 :: Parser (NExprF NExprLoc) -> Parser NExprLoc
+annotateLocation1 = fmap annToAnnF . annotateLocation
+
+manyUnaryOp f = foldr1 (.) <$> some f
+
+operator "-" = lexeme . try $ string "-" <* notFollowedBy (char '>')
+operator "/" = lexeme . try $ string "/" <* notFollowedBy (char '/')
+operator "<" = lexeme . try $ string "<" <* notFollowedBy (char '=')
+operator ">" = lexeme . try $ string ">" <* notFollowedBy (char '=')
+operator n   = symbol n
+
+opWithLoc :: Text -> o -> (Ann SrcSpan o -> a) -> Parser a
+opWithLoc name op f = do
+    Ann ann _ <- annotateLocation $ {- dbg (unpack name) $ -} operator name
+    return $ f (Ann ann op)
+
+binaryN name op = (NBinaryDef name op NAssocNone,
+                   InfixN  (opWithLoc name op nBinary))
+binaryL name op = (NBinaryDef name op NAssocLeft,
+                   InfixL  (opWithLoc name op nBinary))
+binaryR name op = (NBinaryDef name op NAssocRight,
+                   InfixR  (opWithLoc name op nBinary))
+prefix  name op = (NUnaryDef name op,
+                   Prefix  (manyUnaryOp (opWithLoc name op nUnary)))
+-- postfix name op = (NUnaryDef name op,
+--                    Postfix (opWithLoc name op nUnary))
+
+nixOperators
+    :: Parser (Ann SrcSpan (NAttrPath NExprLoc))
+    -> [[(NOperatorDef, Operator Parser NExprLoc)]]
+nixOperators selector =
+  [ -- This is not parsed here, even though technically it's part of the
+    -- expression table. The problem is that in some cases, such as list
+    -- membership, it's also a term. And since terms are effectively the
+    -- highest precedence entities parsed by the expression parser, it ends up
+    -- working out that we parse them as a kind of "meta-term".
+
+    -- {-  1 -} [ (NSpecialDef "." NSelectOp NAssocLeft,
+    --             Postfix $ do
+    --                    sel <- seldot *> selector
+    --                    mor <- optional (reserved "or" *> term)
+    --                    return $ \x -> nSelectLoc x sel mor) ]
+
+    {-  2 -} [ (NBinaryDef " " NApp NAssocLeft,
+                -- Thanks to Brent Yorgey for showing me this trick!
+                InfixL $ nApp <$ symbol "") ]
+  , {-  3 -} [ prefix  "-"  NNeg ]
+  , {-  4 -} [ (NSpecialDef "?" NHasAttrOp NAssocLeft,
+                Postfix $ symbol "?" *> (flip nHasAttr <$> selector)) ]
+  , {-  5 -} [ binaryR "++" NConcat ]
+  , {-  6 -} [ binaryL "*"  NMult
+             , binaryL "/"  NDiv ]
+  , {-  7 -} [ binaryL "+"  NPlus
+             , binaryL "-"  NMinus ]
+  , {-  8 -} [ prefix  "!"  NNot ]
+  , {-  9 -} [ binaryR "//" NUpdate ]
+  , {- 10 -} [ binaryL "<"  NLt
+             , binaryL ">"  NGt
+             , binaryL "<=" NLte
+             , binaryL ">=" NGte ]
+  , {- 11 -} [ binaryN "==" NEq
+             , binaryN "!=" NNEq ]
+  , {- 12 -} [ binaryL "&&" NAnd ]
+  , {- 13 -} [ binaryL "||" NOr ]
+  , {- 14 -} [ binaryN "->" NImpl ]
+  ]
+
+data OperatorInfo = OperatorInfo
+  { precedence    :: Int
+  , associativity :: NAssoc
+  , operatorName  :: Text
+  } deriving (Eq, Ord, Generic, Typeable, Data, Show)
+
+getUnaryOperator :: NUnaryOp -> OperatorInfo
+getUnaryOperator = (m Map.!) where
+  m = Map.fromList $ concat $ zipWith buildEntry [1..]
+          (nixOperators (error "unused"))
+  buildEntry i = concatMap $ \case
+    (NUnaryDef name op, _) -> [(op, OperatorInfo i NAssocNone name)]
+    _ -> []
+
+getBinaryOperator :: NBinaryOp -> OperatorInfo
+getBinaryOperator = (m Map.!) where
+  m = Map.fromList $ concat $ zipWith buildEntry [1..]
+          (nixOperators (error "unused"))
+  buildEntry i = concatMap $ \case
+    (NBinaryDef name op assoc, _) -> [(op, OperatorInfo i assoc name)]
+    _ -> []
+
+getSpecialOperator :: NSpecialOp -> OperatorInfo
+getSpecialOperator NSelectOp = OperatorInfo 1 NAssocLeft "."
+getSpecialOperator o = m Map.! o where
+  m = Map.fromList $ concat $ zipWith buildEntry [1..]
+          (nixOperators (error "unused"))
+  buildEntry i = concatMap $ \case
+    (NSpecialDef name op assoc, _) -> [(op, OperatorInfo i assoc name)]
+    _ -> []
diff --git a/src/Nix/Pretty.hs b/src/Nix/Pretty.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Pretty.hs
@@ -0,0 +1,305 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+{-# LANGUAGE ViewPatterns #-}
+
+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
+{-# OPTIONS_GHC -Wno-orphans #-}
+
+module Nix.Pretty where
+
+import           Control.Monad
+import           Data.Fix
+import           Data.HashMap.Lazy (toList)
+import qualified Data.HashMap.Lazy as M
+import qualified Data.HashSet as HashSet
+import           Data.List (isPrefixOf, sort)
+import           Data.List.NonEmpty (NonEmpty(..))
+import qualified Data.List.NonEmpty as NE
+import           Data.Maybe (isJust, fromMaybe)
+import           Data.Text (pack, unpack, replace, strip)
+import qualified Data.Text as Text
+import           Nix.Atoms
+import           Nix.Expr
+import           Nix.Parser
+import           Nix.Strings
+import           Nix.Thunk
+#if ENABLE_TRACING
+import           Nix.Utils
+#else
+import           Nix.Utils hiding ((<$>))
+#endif
+import           Nix.Value
+import           Prelude hiding ((<$>))
+import           Text.PrettyPrint.ANSI.Leijen
+
+-- | This type represents a pretty printed nix expression
+-- together with some information about the expression.
+data NixDoc = NixDoc
+  { -- | The rendered expression, without any parentheses.
+    withoutParens    :: Doc
+
+    -- | The root operator is the operator at the root of
+    -- the expression tree. For example, in '(a * b) + c', '+' would be the root
+    -- operator. It is needed to determine if we need to wrap the expression in
+    -- parentheses.
+  , rootOp :: OperatorInfo
+  , wasPath :: Bool -- This is needed so that when a path is used in a selector path
+                    -- we can add brackets appropiately
+  }
+
+mkNixDoc :: Doc -> OperatorInfo -> NixDoc
+mkNixDoc d o = NixDoc { withoutParens = d, rootOp = o, wasPath = False }
+
+-- | A simple expression is never wrapped in parentheses. The expression
+--   behaves as if its root operator had a precedence higher than all
+--   other operators (including function application).
+simpleExpr :: Doc -> NixDoc
+simpleExpr d = mkNixDoc d (OperatorInfo minBound NAssocNone "simple expr")
+
+pathExpr :: Doc -> NixDoc
+pathExpr d = (simpleExpr d) { wasPath = True }
+
+-- | An expression that behaves as if its root operator had a precedence lower
+--   than all other operators. That ensures that the expression is wrapped in
+--   parantheses in almost always, but it's still rendered without parentheses
+--   in cases where parentheses are never required (such as in the LHS of a
+--   binding).
+leastPrecedence :: Doc -> NixDoc
+leastPrecedence =
+    flip mkNixDoc $ OperatorInfo maxBound NAssocNone "least precedence"
+
+appOp :: OperatorInfo
+appOp = getBinaryOperator NApp
+
+appOpNonAssoc :: OperatorInfo
+appOpNonAssoc = (getBinaryOperator NApp) { associativity = NAssocNone }
+
+selectOp :: OperatorInfo
+selectOp = getSpecialOperator NSelectOp
+
+hasAttrOp :: OperatorInfo
+hasAttrOp = getSpecialOperator NHasAttrOp
+
+wrapParens :: OperatorInfo -> NixDoc -> Doc
+wrapParens op sub
+  | precedence (rootOp sub) < precedence op = withoutParens sub
+  | precedence (rootOp sub) == precedence op
+    && associativity (rootOp sub) == associativity op
+    && associativity op /= NAssocNone = withoutParens sub
+  | otherwise = parens $ withoutParens sub
+
+-- Used in the selector case to print a path in a selector as
+-- "${./abc}"
+wrapPath :: OperatorInfo -> NixDoc -> Doc
+wrapPath op sub =
+  if wasPath sub then dquotes (text "$" <> braces (withoutParens sub))
+                else wrapParens op sub
+
+prettyString :: NString NixDoc -> Doc
+prettyString (DoubleQuoted parts) = dquotes . hcat . map prettyPart $ parts
+  where prettyPart (Plain t)      = text . concatMap escape . unpack $ t
+        prettyPart EscapedNewline = text "''\\n"
+        prettyPart (Antiquoted r) = text "$" <> braces (withoutParens r)
+        escape '"' = "\\\""
+        escape x = maybe [x] (('\\':) . (:[])) $ toEscapeCode x
+prettyString (Indented _ parts)
+  = group $ nest 2 (squote <> squote <$$> content) <$$> squote <> squote
+ where
+  content = vsep . map prettyLine . stripLastIfEmpty . splitLines $ parts
+  stripLastIfEmpty = reverse . f . reverse where
+    f ([Plain t] : xs) | Text.null (strip t) = xs
+    f xs = xs
+  prettyLine = hcat . map prettyPart
+  prettyPart (Plain t) = text . unpack . replace "${" "''${" . replace "''" "'''" $ t
+  prettyPart EscapedNewline = text "\\n"
+  prettyPart (Antiquoted r) = text "$" <> braces (withoutParens r)
+
+prettyParams :: Params NixDoc -> Doc
+prettyParams (Param n) = text $ unpack n
+prettyParams (ParamSet s v mname) = prettyParamSet s v <> case mname of
+  Nothing -> empty
+  Just name | Text.null name -> empty
+            | otherwise -> text "@" <> text (unpack name)
+
+prettyParamSet :: ParamSet NixDoc -> Bool -> Doc
+prettyParamSet args var =
+    encloseSep (lbrace <> space) (align (space <> rbrace)) sep (map prettySetArg args ++ prettyVariadic)
+  where
+    prettySetArg (n, maybeDef) = case maybeDef of
+      Nothing -> text (unpack n)
+      Just v -> text (unpack n) <+> text "?" <+> withoutParens v
+    prettyVariadic = [text "..." | var]
+    sep = align (comma <> space)
+
+prettyBind :: Binding NixDoc -> Doc
+prettyBind (NamedVar n v _p) =
+    prettySelector n <+> equals <+> withoutParens v <> semi
+prettyBind (Inherit s ns _p)
+  = text "inherit" <+> scope <> align (fillSep (map prettyKeyName ns)) <> semi
+ where scope = maybe empty ((<> space) . parens . withoutParens) s
+
+prettyKeyName :: NKeyName NixDoc -> Doc
+prettyKeyName (StaticKey "") = dquotes $ text ""
+prettyKeyName (StaticKey key)
+  | HashSet.member key reservedNames = dquotes $ text $ unpack key
+prettyKeyName (StaticKey key) = text . unpack $ key
+prettyKeyName (DynamicKey key) =
+    runAntiquoted (DoubleQuoted [Plain "\n"])
+        prettyString ((text "$" <>) . braces . withoutParens) key
+
+prettySelector :: NAttrPath NixDoc -> Doc
+prettySelector = hcat . punctuate dot . map prettyKeyName . NE.toList
+
+prettyAtom :: NAtom -> NixDoc
+prettyAtom atom = simpleExpr $ text $ unpack $ atomText atom
+
+prettyNix :: NExpr -> Doc
+prettyNix = withoutParens . cata exprFNixDoc
+
+prettyOriginExpr :: NExprLocF (Maybe (NValue m)) -> Doc
+prettyOriginExpr = withoutParens . go
+  where
+    go = exprFNixDoc . annotated . getCompose . fmap render
+
+    render Nothing = simpleExpr $ text "_"
+    render (Just (NValue (reverse -> p:_) _)) = go (_originExpr p)
+    render (Just (NValue _ _)) = simpleExpr $ text "?"
+        -- simpleExpr $ foldr ((<$>) . parens . indent 2 . withoutParens
+        --                           . go . originExpr)
+        --     mempty (reverse ps)
+
+exprFNixDoc :: NExprF NixDoc -> NixDoc
+exprFNixDoc = \case
+    NConstant atom -> prettyAtom atom
+    NStr str -> simpleExpr $ prettyString str
+    NList [] -> simpleExpr $ lbracket <> rbracket
+    NList xs -> simpleExpr $ group $
+        nest 2 (vsep $ lbracket : map (wrapParens appOpNonAssoc) xs) <$> rbracket
+    NSet [] -> simpleExpr $ lbrace <> rbrace
+    NSet xs -> simpleExpr $ group $
+        nest 2 (vsep $ lbrace : map prettyBind xs) <$> rbrace
+    NRecSet [] -> simpleExpr $ recPrefix <> lbrace <> rbrace
+    NRecSet xs -> simpleExpr $ group $
+        nest 2 (vsep $ recPrefix <> lbrace : map prettyBind xs) <$> rbrace
+    NAbs args body -> leastPrecedence $
+        nest 2 ((prettyParams args <> colon) <$> withoutParens body)
+    NBinary NApp fun arg ->
+        mkNixDoc (wrapParens appOp fun <+> wrapParens appOpNonAssoc arg) appOp
+    NBinary op r1 r2 -> flip mkNixDoc opInfo $ hsep
+        [ wrapParens (f NAssocLeft) r1
+        , text $ unpack $ operatorName opInfo
+        , wrapParens (f NAssocRight) r2
+        ]
+      where
+        opInfo = getBinaryOperator op
+        f x | associativity opInfo /= x = opInfo { associativity = NAssocNone }
+            | otherwise = opInfo
+    NUnary op r1 ->
+        mkNixDoc (text (unpack (operatorName opInfo)) <> wrapParens opInfo r1) opInfo
+      where opInfo = getUnaryOperator op
+    NSelect r attr o ->
+      (if isJust o then leastPrecedence else flip mkNixDoc selectOp) $
+          wrapPath selectOp r <> dot <> prettySelector attr <> ordoc
+      where ordoc = maybe empty (((space <> text "or") <+>) . wrapParens selectOp) o
+    NHasAttr r attr ->
+        mkNixDoc (wrapParens hasAttrOp r <+> text "?" <+> prettySelector attr) hasAttrOp
+    NEnvPath p -> simpleExpr $ text ("<" ++ p ++ ">")
+    NLiteralPath p -> pathExpr $ text $ case p of
+        "./" -> "./."
+        "../" -> "../."
+        ".." -> "../."
+        txt | "/" `isPrefixOf` txt -> txt
+            | "~/" `isPrefixOf` txt -> txt
+            | "./" `isPrefixOf` txt -> txt
+            | "../" `isPrefixOf` txt -> txt
+            | otherwise -> "./" ++ txt
+    NSym name -> simpleExpr $ text (unpack name)
+    NLet binds body -> leastPrecedence $ group $ text "let" <$> indent 2 (
+        vsep (map prettyBind binds)) <$> text "in" <+> withoutParens body
+    NIf cond trueBody falseBody -> leastPrecedence $
+        group $ nest 2 $ (text "if" <+> withoutParens cond) <$>
+          (  align (text "then" <+> withoutParens trueBody)
+         <$> align (text "else" <+> withoutParens falseBody)
+          )
+    NWith scope body -> leastPrecedence $
+        text "with"  <+> withoutParens scope <> semi <$> align (withoutParens body)
+    NAssert cond body -> leastPrecedence $
+        text "assert" <+> withoutParens cond <> semi <$> align (withoutParens body)
+  where
+    recPrefix = text "rec" <> space
+
+prettyNValueNF :: Functor m => NValueNF m -> Doc
+prettyNValueNF = prettyNix . valueToExpr
+  where valueToExpr :: Functor m => NValueNF m -> NExpr
+        valueToExpr = transport go
+
+        go (NVConstantF a) = NConstant a
+        go (NVStrF t _) = NStr (DoubleQuoted [Plain t])
+        go (NVListF l) = NList l
+        go (NVSetF s p) = NSet
+            [ NamedVar (StaticKey k :| []) v (fromMaybe nullPos (M.lookup k p))
+            | (k, v) <- toList s ]
+        go (NVClosureF _ _) = NSym . pack $ "<closure>"
+        go (NVPathF p) = NLiteralPath p
+        go (NVBuiltinF name _) = NSym $ Text.pack $ "builtins." ++ name
+
+printNix :: Functor m => NValueNF m -> String
+printNix = cata phi
+  where phi :: NValueF m String -> String
+        phi (NVConstantF a) = unpack $ atomText a
+        phi (NVStrF t _) = show t
+        phi (NVListF l) = "[ " ++ unwords l ++ " ]"
+        phi (NVSetF s _) =
+            "{ " ++ concat [ unpack k ++ " = " ++ v ++ "; "
+                           | (k, v) <- sort $ toList s ] ++ "}"
+        phi NVClosureF {} = "<<lambda>>"
+        phi (NVPathF fp) = fp
+        phi (NVBuiltinF name _) = "<<builtin " ++ name ++ ">>"
+
+removeEffects :: Functor m => NValueF m (NThunk m) -> NValueNF m
+removeEffects = Fix . fmap dethunk
+  where
+    dethunk (NThunk _ (Value v)) = removeEffects (_baseValue v)
+    dethunk (NThunk _ _) = Fix $ NVStrF "<thunk>" mempty
+
+removeEffectsM :: MonadVar m => NValueF m (NThunk m) -> m (NValueNF m)
+removeEffectsM = fmap Fix . traverse dethunk
+
+prettyNValueF :: MonadVar m => NValueF m (NThunk m) -> m Doc
+prettyNValueF = fmap prettyNValueNF . removeEffectsM
+
+prettyNValue :: MonadVar m => NValue m -> m Doc
+prettyNValue (NValue _ v) = prettyNValueF v
+
+prettyNValueProv :: MonadVar m => NValue m -> m Doc
+prettyNValueProv = \case
+    NValue [] v -> prettyNValueF v
+    NValue ps v -> do
+        v' <- prettyNValueF v
+        pure $ v' </> indent 2 (parens (mconcat
+            (text "from: " : map (prettyOriginExpr . _originExpr) ps)))
+
+prettyNThunk :: MonadVar m => NThunk m -> m Doc
+prettyNThunk = \case
+    t@(NThunk ps _) -> do
+        v' <- fmap prettyNValueNF (dethunk t)
+        pure $ v' </> indent 2 (parens (mconcat
+            (text "thunk from: " : map (prettyOriginExpr . _originExpr) ps)))
+
+dethunk :: MonadVar m => NThunk m -> m (NValueNF m)
+dethunk = \case
+    NThunk _ (Value v) -> removeEffectsM (_baseValue v)
+    NThunk _ (Thunk _ active ref) -> do
+        nowActive <- atomicModifyVar active (True,)
+        if nowActive
+            then pure $ Fix $ NVStrF "<thunk>" mempty
+            else do
+                eres <- readVar ref
+                case eres of
+                    Computed v -> removeEffectsM (_baseValue v)
+                    _ -> pure $ Fix $ NVStrF "<thunk>" mempty
diff --git a/src/Nix/Reduce.hs b/src/Nix/Reduce.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Reduce.hs
@@ -0,0 +1,363 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ApplicativeDo #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DeriveFoldable #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE DeriveTraversable #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PartialTypeSignatures #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE ViewPatterns #-}
+
+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
+{-# OPTIONS_GHC -Wno-orphans #-}
+
+-- | This module provides a "reducing" expression evaluator, which reduces
+--   away pure, non self-referential aspects of an expression tree, yielding a
+--   new expression tree. It does not yet attempt to reduce everything
+--   possible, and will always yield a tree with the same meaning as the
+--   original. It should be seen as an opportunistic simplifier, but which
+--   gives up easily if faced with any potential for ambiguity in the result.
+
+module Nix.Reduce (reduceExpr, reducingEvalExpr) where
+
+import           Control.Applicative
+import           Control.Arrow (second)
+import           Control.Monad
+import           Control.Monad.Catch
+import           Control.Monad.Fix
+import           Control.Monad.IO.Class
+import           Control.Monad.Reader
+import           Control.Monad.State.Strict
+import           Control.Monad.Trans.Reader (ReaderT(..))
+import           Control.Monad.Trans.State.Strict (StateT(..))
+import           Data.Fix
+-- import           Data.Foldable
+import           Data.HashMap.Lazy (HashMap)
+import qualified Data.HashMap.Lazy as M
+-- import           Data.HashSet (HashSet)
+-- import qualified Data.HashSet as S
+import           Data.IORef
+import           Data.List.NonEmpty (NonEmpty(..))
+import qualified Data.List.NonEmpty as NE
+import           Data.Maybe (fromMaybe, mapMaybe, catMaybes)
+import           Data.Text (Text)
+import           Nix.Atoms
+import           Nix.Exec
+import           Nix.Expr
+import           Nix.Frames
+import           Nix.Options (Options, reduceSets, reduceLists)
+import           Nix.Parser
+import           Nix.Scope
+import           Nix.Utils
+import           System.Directory
+import           System.FilePath
+
+newtype Reducer m a = Reducer
+    { runReducer :: ReaderT (Maybe FilePath, Scopes (Reducer m) NExprLoc)
+                           (StateT (HashMap FilePath NExprLoc) m) a }
+    deriving (Functor, Applicative, Alternative, Monad, MonadPlus,
+              MonadFix, MonadIO,
+              MonadReader (Maybe FilePath, Scopes (Reducer m) NExprLoc),
+              MonadState (HashMap FilePath NExprLoc))
+
+staticImport
+    :: forall e m.
+      (MonadIO m, Scoped e NExprLoc m,
+       MonadReader (Maybe FilePath, Scopes m NExprLoc) m,
+       MonadState (HashMap FilePath NExprLoc) m)
+    => SrcSpan -> FilePath -> m NExprLoc
+staticImport pann path = do
+    imports <- get
+    case M.lookup path imports of
+        Just expr -> pure expr
+        Nothing -> go
+  where
+    go = do
+        mfile <- asks fst
+        path  <- liftIO $ pathToDefaultNixFile path
+        path' <- liftIO $ pathToDefaultNixFile =<< canonicalizePath
+            (maybe path (\p -> takeDirectory p </> path) mfile)
+
+        liftIO $ putStrLn $ "Importing file " ++ path'
+
+        eres <- liftIO $ parseNixFileLoc path'
+        case eres of
+            Failure err  -> error $ "Parse failed: " ++ show err
+            Success x -> do
+                let pos  = SourcePos "Reduce.hs" (mkPos 1) (mkPos 1)
+                    span = SrcSpan pos pos
+                    cur  = NamedVar (StaticKey "__cur_file" :| [])
+                        (Fix (NLiteralPath_ pann path')) pos
+                    x'   = Fix (NLet_ span [cur] x)
+                modify (M.insert path x')
+                local (const (Just path',
+                              emptyScopes @m @NExprLoc)) $ do
+                    x'' <- cata reduce x'
+                    modify (M.insert path x'')
+                    return x''
+
+-- gatherNames :: NExprLoc -> HashSet VarName
+-- gatherNames = cata $ \case
+--     NSym_ _ var -> S.singleton var
+--     Compose (Ann _ x) -> fold x
+
+reduceExpr :: MonadIO m => Maybe FilePath -> NExprLoc -> m NExprLoc
+reduceExpr mpath expr
+    = (`evalStateT` M.empty)
+    . (`runReaderT` (mpath, emptyScopes))
+    . runReducer
+    $ cata reduce expr
+
+reduce :: forall e m.
+           (MonadIO m, Scoped e NExprLoc m,
+            MonadReader (Maybe FilePath, Scopes m NExprLoc) m,
+            MonadState (HashMap FilePath NExprLoc) m)
+       => NExprLocF (m NExprLoc) -> m NExprLoc
+
+reduce (NSym_ ann var) = lookupVar var <&> \case
+    Nothing -> Fix (NSym_ ann var)
+    Just v  -> v
+
+reduce (NUnary_ uann op arg) = arg >>= \x -> case (op, x) of
+    (NNeg, Fix (NConstant_ cann (NInt n))) ->
+        return $ Fix $ NConstant_ cann (NInt (negate n))
+    (NNot, Fix (NConstant_ cann (NBool b))) ->
+        return $ Fix $ NConstant_ cann (NBool (not b))
+    _ -> return $ Fix $ NUnary_ uann op x
+
+reduce (NBinary_ bann NApp fun arg) = fun >>= \case
+    f@(Fix (NSym_ _ "import")) -> arg >>= \case
+        -- Fix (NEnvPath_     pann origPath) -> staticImport pann origPath
+        Fix (NLiteralPath_ pann origPath) -> staticImport pann origPath
+        v -> return $ Fix $ NBinary_ bann NApp f v
+
+    Fix (NAbs_ _ (Param name) body) -> do
+        x <- arg
+        pushScope (M.singleton name x) (cata reduce body)
+
+    f -> Fix . NBinary_ bann NApp f <$> arg
+
+reduce (NBinary_ bann op larg rarg) = do
+    lval <- larg
+    rval <- rarg
+    case (op, lval, rval) of
+        (NPlus, Fix (NConstant_ ann (NInt x)), Fix (NConstant_ _ (NInt y))) ->
+            return $ Fix (NConstant_ ann (NInt (x + y)))
+        _ -> pure $ Fix $ NBinary_ bann op lval rval
+
+-- reduce (NSelect aset attr alt) = do
+
+-- reduce (NHasAttr aset attr) =
+
+reduce e@(NSet_ ann binds) = do
+    let usesInherit = flip any binds $ \case
+            Inherit {} -> True
+            _ -> False
+    if usesInherit
+        then clearScopes @NExprLoc $
+            Fix . NSet_ ann <$> traverse sequence binds
+        else Fix <$> sequence e
+
+-- Encountering a 'rec set' construction eliminates any hope of inlining
+-- definitions.
+reduce (NRecSet_ ann binds) =
+    clearScopes @NExprLoc $ Fix . NRecSet_ ann <$> traverse sequence binds
+
+-- Encountering a 'with' construction eliminates any hope of inlining
+-- definitions.
+reduce (NWith_ ann scope body) =
+    clearScopes @NExprLoc $ fmap Fix $ NWith_ ann <$> scope <*> body
+
+reduce (NLet_ ann binds body) = do
+    s <- fmap (M.fromList . catMaybes) $ forM binds $ \case
+        NamedVar (StaticKey name :| []) def _pos -> def >>= \case
+            d@(Fix NAbs_ {})      -> pure $ Just (name, d)
+            d@(Fix NConstant_ {}) -> pure $ Just (name, d)
+            d@(Fix NStr_ {})      -> pure $ Just (name, d)
+            _ -> pure Nothing
+        _ -> pure Nothing
+    body' <- pushScope s body
+    binds' <- traverse sequence binds
+    -- let names = gatherNames body'
+    -- binds' <- traverse sequence binds <&> \b -> flip filter b $ \case
+    --     NamedVar (StaticKey name _ :| []) _ ->
+    --         name `S.member` names
+    --     _ -> True
+    pure $ Fix $ NLet_ ann binds' body'
+  -- where
+  --   go m [] = pure m
+  --   go m (x:xs) = case x of
+  --       NamedVar (StaticKey name _ :| []) def -> do
+  --           v <- pushScope m def
+  --           go (M.insert name v m) xs
+  --       _ -> go m xs
+
+reduce e@(NIf_ _ b t f) = b >>= \case
+    Fix (NConstant_ _ (NBool b')) -> if b' then t else f
+    _ -> Fix <$> sequence e
+
+reduce e@(NAssert_ _ b body) = b >>= \case
+    Fix (NConstant_ _ (NBool b')) | b' -> body
+    _ -> Fix <$> sequence e
+
+reduce (NAbs_ ann params body) = do
+    params' <- sequence params
+    -- Make sure that variable definitions in scope do not override function
+    -- arguments.
+    let args = case params' of
+            Param name -> M.singleton name (Fix (NSym_ ann name))
+            ParamSet pset _ _ ->
+                M.fromList $ map (\(k, _) -> (k, Fix (NSym_ ann k))) pset
+    Fix . NAbs_ ann params' <$> pushScope args body
+
+reduce v = Fix <$> sequence v
+
+-- newtype FlaggedF f r = FlaggedF { flagged :: (IORef Bool, f r) }
+newtype FlaggedF f r = FlaggedF (IORef Bool, f r)
+    deriving (Functor, Foldable, Traversable)
+
+instance Show (f r) => Show (FlaggedF f r) where
+    show (FlaggedF (_, x)) = show x
+
+type Flagged f = Fix (FlaggedF f)
+
+flagExprLoc :: (MonadIO n, Traversable f)
+            => Fix f -> n (Flagged f)
+flagExprLoc = cataM $ \x -> do
+    flag <- liftIO $ newIORef False
+    pure $ Fix $ FlaggedF (flag, x)
+
+-- stripFlags :: Functor f => Flagged f -> Fix f
+-- stripFlags = cata $ Fix . snd . flagged
+
+pruneTree :: MonadIO n => Options -> Flagged NExprLocF -> n (Maybe NExprLoc)
+pruneTree opts = cataM $ \(FlaggedF (b, Compose x)) -> do
+    used <- liftIO $ readIORef b
+    pure $ if used
+           then Fix . Compose <$> traverse prune x
+           else Nothing
+  where
+    prune :: NExprF (Maybe NExprLoc) -> Maybe (NExprF NExprLoc)
+    prune = \case
+        NStr str                  -> Just $ NStr (pruneString str)
+        NHasAttr (Just aset) attr -> Just $ NHasAttr aset (NE.map pruneKeyName attr)
+        NAbs params (Just body)   -> Just $ NAbs (pruneParams params) body
+
+        NList l       | reduceLists opts -> Just $ NList   (catMaybes l)
+                      | otherwise        -> Just $ NList   (map (fromMaybe nNull) l)
+        NSet binds    | reduceSets opts  -> Just $ NSet    (mapMaybe sequence binds)
+                      | otherwise        -> Just $ NSet    (map (fmap (fromMaybe nNull)) binds)
+        NRecSet binds | reduceSets opts  -> Just $ NRecSet (mapMaybe sequence binds)
+                      | otherwise        -> Just $ NRecSet (map (fmap (fromMaybe nNull)) binds)
+
+        NLet binds (Just body@(Fix (Compose (Ann _ x)))) ->
+            Just $ case mapMaybe pruneBinding binds of
+                [] -> x
+                xs -> NLet xs body
+
+        NSelect (Just aset) attr alt ->
+            Just $ NSelect aset (NE.map pruneKeyName attr) (join alt)
+
+        -- These are the only short-circuiting binary operators
+        NBinary NAnd (Just (Fix (Compose (Ann _ larg)))) _ -> Just larg
+        NBinary NOr  (Just (Fix (Compose (Ann _ larg)))) _ -> Just larg
+
+        -- If the function was never called, it means its argument was in a
+        -- thunk that was forced elsewhere.
+        NBinary NApp Nothing (Just _) -> Nothing
+
+        -- The idea behind emitted a binary operator where one side may be
+        -- invalid is that we're trying to emit what will reproduce whatever
+        -- error the user encountered, which means providing all aspects of
+        -- the evaluation path they ultimately followed.
+        NBinary op Nothing (Just rarg) -> Just $ NBinary op nNull rarg
+        NBinary op (Just larg) Nothing -> Just $ NBinary op larg nNull
+
+        -- If the scope of a with was never referenced, it's not needed
+        NWith Nothing (Just (Fix (Compose (Ann _ body)))) -> Just body
+
+        NAssert Nothing _ ->
+            error "How can an assert be used, but its condition not?"
+
+        NAssert _ (Just (Fix (Compose (Ann _ body)))) -> Just body
+        NAssert (Just cond) _ -> Just $ NAssert cond nNull
+
+        NIf Nothing _ _ ->
+            error "How can an if be used, but its condition not?"
+
+        NIf _ Nothing (Just (Fix (Compose (Ann _ f)))) -> Just f
+        NIf _ (Just (Fix (Compose (Ann _ t)))) Nothing -> Just t
+
+        x -> sequence x
+
+    pruneString :: NString (Maybe NExprLoc) -> NString NExprLoc
+    pruneString (DoubleQuoted xs) =
+        DoubleQuoted (mapMaybe pruneAntiquotedText xs)
+    pruneString (Indented n xs)   =
+        Indented n (mapMaybe pruneAntiquotedText xs)
+
+    pruneAntiquotedText
+        :: Antiquoted Text (Maybe NExprLoc)
+        -> Maybe (Antiquoted Text NExprLoc)
+    pruneAntiquotedText (Plain v)             = Just (Plain v)
+    pruneAntiquotedText EscapedNewline        = Just EscapedNewline
+    pruneAntiquotedText (Antiquoted Nothing)  = Nothing
+    pruneAntiquotedText (Antiquoted (Just k)) = Just (Antiquoted k)
+
+    pruneAntiquoted
+        :: Antiquoted (NString (Maybe NExprLoc)) (Maybe NExprLoc)
+        -> Maybe (Antiquoted (NString NExprLoc) NExprLoc)
+    pruneAntiquoted (Plain v)             = Just (Plain (pruneString v))
+    pruneAntiquoted EscapedNewline        = Just EscapedNewline
+    pruneAntiquoted (Antiquoted Nothing)  = Nothing
+    pruneAntiquoted (Antiquoted (Just k)) = Just (Antiquoted k)
+
+    pruneKeyName :: NKeyName (Maybe NExprLoc) -> NKeyName NExprLoc
+    pruneKeyName (StaticKey n) = StaticKey n
+    pruneKeyName (DynamicKey k)
+        | Just k' <- pruneAntiquoted k = DynamicKey k'
+        | otherwise = StaticKey "<unused?>"
+
+    pruneParams :: Params (Maybe NExprLoc) -> Params NExprLoc
+    pruneParams (Param n) = Param n
+    pruneParams (ParamSet xs b n)
+        | reduceSets opts =
+              ParamSet (map (second (maybe (Just nNull) Just
+                                     . fmap (fromMaybe nNull))) xs) b n
+        | otherwise =
+              ParamSet (map (second (fmap (fromMaybe nNull))) xs) b n
+
+    pruneBinding :: Binding (Maybe NExprLoc) -> Maybe (Binding NExprLoc)
+    pruneBinding (NamedVar _ Nothing _)  = Nothing
+    pruneBinding (NamedVar xs (Just x) pos) =
+        Just (NamedVar (NE.map pruneKeyName xs) x pos)
+    pruneBinding (Inherit _ [] _)  = Nothing
+    pruneBinding (Inherit (join -> Nothing) _ _) = Nothing
+    pruneBinding (Inherit (join -> m) xs pos) =
+        Just (Inherit m (map pruneKeyName xs) pos)
+
+reducingEvalExpr
+    :: (Framed e m, Has e Options, Exception r, MonadCatch m, MonadIO m)
+    => (NExprLocF (m a) -> m a)
+    -> Maybe FilePath
+    -> NExprLoc
+    -> m (NExprLoc, Either r a)
+reducingEvalExpr eval mpath expr = do
+    expr'  <- flagExprLoc =<< liftIO (reduceExpr mpath expr)
+    eres   <- catch (Right <$> cata (addEvalFlags eval) expr') (pure . Left)
+    opts :: Options <- asks (view hasLens)
+    expr'' <- pruneTree opts expr'
+    return (fromMaybe nNull expr'', eres)
+  where
+    addEvalFlags k (FlaggedF (b, x)) = liftIO (writeIORef b True) *> k x
diff --git a/src/Nix/Render.hs b/src/Nix/Render.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Render.hs
@@ -0,0 +1,35 @@
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+
+module Nix.Render where
+
+import           Data.ByteString (ByteString)
+import           Data.List.NonEmpty (NonEmpty((:|)))
+import qualified Data.Set as Set
+import           Data.Void
+import           Nix.Expr.Types.Annotated
+import           Text.Megaparsec.Error
+import           Text.Megaparsec.Pos (SourcePos(..))
+import           Text.PrettyPrint.ANSI.Leijen
+
+class Monad m => MonadFile m where
+    readFile :: FilePath -> m ByteString
+
+posAndMsg :: SourcePos -> Doc -> ParseError t Void
+posAndMsg beg msg =
+    FancyError (beg :| [])
+        (Set.fromList [ErrorFail (show msg) :: ErrorFancy Void])
+
+renderLocation :: MonadFile m => SrcSpan -> Doc -> m Doc
+renderLocation (SrcSpan beg@(SourcePos "<string>" _ _) _) msg =
+    return $ text $ init $ parseErrorPretty @Char (posAndMsg beg msg)
+
+renderLocation (SrcSpan beg@(SourcePos path _ _) _) msg = do
+    contents <- Nix.Render.readFile path
+    return $ text $ init $ parseErrorPretty' contents (posAndMsg beg msg)
diff --git a/src/Nix/Render/Frame.hs b/src/Nix/Render/Frame.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Render/Frame.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+
+module Nix.Render.Frame where
+
+import           Control.Monad.Reader
+import           Data.Fix
+import           Data.Typeable
+import           Nix.Eval
+import           Nix.Exec
+import           Nix.Expr
+import           Nix.Frames
+import           Nix.Normal
+import           Nix.Options
+import           Nix.Pretty
+import           Nix.Render
+import           Nix.Thunk
+import           Nix.Utils
+import           Nix.Value
+import           Text.Megaparsec.Pos
+import qualified Text.PrettyPrint.ANSI.Leijen as P
+import           Text.PrettyPrint.ANSI.Leijen hiding ((<$>))
+#if MIN_VERSION_pretty_show(1, 6, 16)
+import qualified Text.Show.Pretty as PS
+#endif
+
+renderFrames :: forall v e m.
+               (MonadReader e m, Has e Options,
+                MonadVar m, MonadFile m, Typeable m, Typeable v)
+             => Frames -> m Doc
+renderFrames [] = pure mempty
+renderFrames (x:xs) = do
+    opts :: Options <- asks (view hasLens)
+    frames <-
+        if | verbose opts <= ErrorsOnly ->
+             renderFrame @v x
+           | verbose opts <= Informational -> do
+             f <- renderFrame @v x
+             pure $ concatMap go (reverse xs) ++ f
+           | otherwise ->
+             concat <$> mapM (renderFrame @v) (reverse (x:xs))
+    pure $ case frames of
+        [] -> mempty
+        _  -> foldr1 (P.<$>) frames
+  where
+    go :: NixFrame -> [Doc]
+    go f = case framePos @v @m f of
+        Just pos ->
+            [text "While evaluating at "
+                <> text (sourcePosPretty pos)
+                <> colon]
+        Nothing -> []
+
+framePos :: forall v (m :: * -> *). (Typeable m, Typeable v) => NixFrame
+         -> Maybe SourcePos
+framePos (NixFrame _ f)
+    | Just (e :: EvalFrame m v) <- fromException f = case e of
+          EvaluatingExpr _ (Fix (Compose (Ann (SrcSpan beg _) _))) ->
+              Just beg
+          _ -> Nothing
+    | otherwise = Nothing
+
+renderFrame :: forall v e m.
+              (MonadReader e m, Has e Options, MonadVar m,
+               MonadFile m, Typeable m, Typeable v)
+            => NixFrame -> m [Doc]
+renderFrame (NixFrame level f)
+    | Just (e :: EvalFrame m v) <- fromException f = renderEvalFrame level e
+    | Just (e :: ThunkLoop)     <- fromException f = renderThunkLoop level e
+    | Just (e :: ValueFrame m)  <- fromException f = renderValueFrame level e
+    | Just (_ :: NormalLoop m)  <- fromException f =
+      pure [text "<<loop during normalization>>"]
+    | Just (e :: ExecFrame m)   <- fromException f = renderExecFrame level e
+    | Just (e :: ErrorCall)     <- fromException f = pure [text (show e)]
+    | otherwise = error $ "Unrecognized frame: " ++ show f
+
+wrapExpr :: NExprF r -> NExpr
+wrapExpr x = Fix (Fix (NSym "<?>") <$ x)
+
+renderEvalFrame :: (MonadReader e m, Has e Options, MonadFile m)
+                => NixLevel -> EvalFrame m v -> m [Doc]
+renderEvalFrame level f = do
+    opts :: Options <- asks (view hasLens)
+    case f of
+        EvaluatingExpr _scope e@(Fix (Compose (Ann ann _))) ->
+            fmap (:[]) $ renderLocation ann
+                =<< renderExpr level "While evaluating" "Expression" e
+
+        ForcingExpr _scope e@(Fix (Compose (Ann ann _)))
+            | thunks opts ->
+                  fmap (:[]) $ renderLocation ann
+                      =<< renderExpr level "While forcing thunk from"
+                                     "Forcing thunk" e
+
+        Calling name ann ->
+            fmap (:[]) $ renderLocation ann $
+                text "While calling builtins." <> text name
+
+        _ -> pure []
+
+renderExpr :: (MonadReader e m, Has e Options, MonadFile m)
+           => NixLevel -> String -> String -> NExprLoc -> m Doc
+renderExpr _level longLabel shortLabel e@(Fix (Compose (Ann _ x))) = do
+    opts :: Options <- asks (view hasLens)
+    let rendered
+            | verbose opts >= DebugInfo =
+#if MIN_VERSION_pretty_show(1, 6, 16)
+              text (PS.ppShow (stripAnnotation e))
+#else
+              text (show (stripAnnotation e))
+#endif
+            | verbose opts >= Chatty =
+              prettyNix (stripAnnotation e)
+            | otherwise =
+              prettyNix (Fix (Fix (NSym "<?>") <$ x))
+    pure $ if verbose opts >= Chatty
+           then text (longLabel ++ ":\n>>>>>>>>")
+                    P.<$> indent 2 rendered
+                    P.<$> text "<<<<<<<<"
+           else text shortLabel <> text ": " </> rendered
+
+renderValueFrame :: (MonadReader e m, Has e Options, MonadFile m)
+                 => NixLevel -> ValueFrame m -> m [Doc]
+renderValueFrame level = pure . (:[]) . \case
+    ForcingThunk       -> text "ForcingThunk"
+    ConcerningValue _v -> text "ConcerningValue"
+    Comparison _ _     -> text "Comparing"
+    Addition _ _       -> text "Adding"
+    Division _ _       -> text "Dividing"
+    Multiplication _ _ -> text "Multiplying"
+
+    Coercion x y ->
+        text desc <> text (describeValue x)
+            <> text " to " <> text (describeValue y)
+      where
+        desc | level <= Error = "Cannot coerce "
+             | otherwise     = "While coercing "
+
+    CoercionToJsonNF _v -> text "CoercionToJsonNF"
+    CoercionFromJson _j -> text "CoercionFromJson"
+    ExpectationNF _t _v -> text "ExpectationNF"
+    Expectation _t _v   -> text "Expectation"
+
+renderValue :: (MonadReader e m, Has e Options, MonadFile m, MonadVar m)
+            => NixLevel -> String -> String -> NValue m -> m Doc
+renderValue _level _longLabel _shortLabel v = do
+    opts :: Options <- asks (view hasLens)
+    if values opts
+        then prettyNValueProv v
+        else prettyNValue v
+
+renderExecFrame :: (MonadReader e m, Has e Options, MonadVar m, MonadFile m)
+                => NixLevel -> ExecFrame m -> m [Doc]
+renderExecFrame level = \case
+    Assertion ann v ->
+        fmap (:[]) $ renderLocation ann
+            =<< ((text "Assertion failed:" </>)
+                     <$> renderValue level "" "" v)
+
+renderThunkLoop :: (MonadReader e m, Has e Options, MonadFile m)
+                => NixLevel -> ThunkLoop -> m [Doc]
+renderThunkLoop _level = pure . (:[]) . \case
+    ThunkLoop Nothing -> text "<<loop>>"
+    ThunkLoop (Just n) ->
+        text $ "<<loop forcing thunk #" ++ show n ++ ">>"
diff --git a/src/Nix/Scope.hs b/src/Nix/Scope.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Scope.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE DeriveFoldable #-}
+{-# LANGUAGE DeriveTraversable #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+
+module Nix.Scope where
+
+import           Control.Applicative
+import           Control.Monad.Reader
+import qualified Data.HashMap.Lazy as M
+import           Data.Semigroup
+import           Data.Text (Text)
+import           Lens.Family2
+import           Nix.Utils
+
+newtype Scope a = Scope { getScope :: AttrSet a }
+    deriving (Functor, Foldable, Traversable)
+
+instance Show (Scope a) where
+    show (Scope m) = show (M.keys m)
+
+newScope :: AttrSet a -> Scope a
+newScope = Scope
+
+scopeLookup :: Text -> [Scope v] -> Maybe v
+scopeLookup key = foldr go Nothing
+  where
+    go (Scope m) rest = M.lookup key m <|> rest
+
+data Scopes m v = Scopes
+    { lexicalScopes :: [Scope v]
+    , dynamicScopes :: [m (Scope v)]
+    }
+
+instance Show (Scopes m v) where
+    show (Scopes m v) =
+        "Scopes: " ++ show m ++ ", and "
+            ++ show (length v) ++ " with-scopes"
+
+instance Semigroup (Scopes m v) where
+    Scopes ls lw <> Scopes rs rw = Scopes (ls <> rs) (lw <> rw)
+
+instance Monoid (Scopes m v) where
+    mempty  = emptyScopes
+    mappend = (<>)
+
+type Scoped e v m = (MonadReader e m, Has e (Scopes m v))
+
+emptyScopes :: Scopes m v
+emptyScopes = Scopes [] []
+
+currentScopes :: Scoped e v m => m (Scopes m v)
+currentScopes = asks (view hasLens)
+
+clearScopes :: forall v m e r. Scoped e v m => m r -> m r
+clearScopes = local (set hasLens (emptyScopes @m @v))
+
+pushScope :: forall v m e r. Scoped e v m => AttrSet v -> m r -> m r
+pushScope s = pushScopes (Scopes [Scope s] [])
+
+pushWeakScope :: forall v m e r. Scoped e v m => m (AttrSet v) -> m r -> m r
+pushWeakScope s = pushScopes (Scopes [] [Scope <$> s])
+
+pushScopes :: Scoped e v m => Scopes m v -> m r -> m r
+pushScopes s = local (over hasLens (s <>))
+
+lookupVar :: forall e v m. (Scoped e v m, Monad m) => Text -> m (Maybe v)
+lookupVar k = do
+    mres <- asks (scopeLookup k . lexicalScopes @m . view hasLens)
+    case mres of
+        Just sym -> return $ Just sym
+        Nothing -> do
+            ws <- asks (dynamicScopes . view hasLens)
+            foldr (\x -> liftM2 (<|>) (M.lookup k . getScope <$> x))
+                  (return Nothing) ws
+
+withScopes :: forall v m e a. Scoped e v m => Scopes m v -> m a -> m a
+withScopes scope = clearScopes @v . pushScopes scope
diff --git a/src/Nix/Strings.hs b/src/Nix/Strings.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Strings.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Functions for manipulating nix strings.
+module Nix.Strings where
+
+import           Data.List (intercalate, dropWhileEnd, inits)
+import           Data.Monoid ((<>))
+import           Data.Text (Text)
+import qualified Data.Text as T
+import           Data.Tuple (swap)
+import           Nix.Expr
+
+-- | Merge adjacent 'Plain' values with 'mappend'.
+mergePlain :: [Antiquoted Text r] -> [Antiquoted Text r]
+mergePlain [] = []
+mergePlain (Plain a: EscapedNewline : Plain b: xs) =
+    mergePlain (Plain (a <> "\n" <> b) : xs)
+mergePlain (Plain a: Plain b: xs) = mergePlain (Plain (a <> b) : xs)
+mergePlain (x:xs) = x : mergePlain xs
+
+-- | Remove 'Plain' values equal to 'mempty', as they don't have any
+-- informational content.
+removePlainEmpty :: [Antiquoted Text r] -> [Antiquoted Text r]
+removePlainEmpty = filter f where
+  f (Plain x) = x /= mempty
+  f _ = True
+
+  -- trimEnd xs
+  --     | null xs = xs
+  --     | otherwise = case last xs of
+  --           Plain x -> init xs ++ [Plain (T.dropWhileEnd (== ' ') x)]
+  --           _ -> xs
+
+-- | Equivalent to case splitting on 'Antiquoted' strings.
+runAntiquoted :: v -> (v -> a) -> (r -> a) -> Antiquoted v r -> a
+runAntiquoted _  f _ (Plain v)      = f v
+runAntiquoted nl f _ EscapedNewline = f nl
+runAntiquoted _  _ k (Antiquoted r) = k r
+
+-- | Split a stream representing a string with antiquotes on line breaks.
+splitLines :: [Antiquoted Text r] -> [[Antiquoted Text r]]
+splitLines = uncurry (flip (:)) . go where
+  go (Plain t : xs) = (Plain l :) <$> foldr f (go xs) ls where
+    (l : ls) = T.split (=='\n') t
+    f prefix (finished, current) = ((Plain prefix : current) : finished, [])
+  go (Antiquoted a : xs) = (Antiquoted a :) <$> go xs
+  go (EscapedNewline : xs) = (EscapedNewline :) <$> go xs
+  go [] = ([],[])
+
+-- | Join a stream of strings containing antiquotes again. This is the inverse
+-- of 'splitLines'.
+unsplitLines :: [[Antiquoted Text r]] -> [Antiquoted Text r]
+unsplitLines = intercalate [Plain "\n"]
+
+-- | Form an indented string by stripping spaces equal to the minimal indent.
+stripIndent :: [Antiquoted Text r] -> NString r
+stripIndent [] = Indented 0 []
+stripIndent xs =
+  Indented minIndent
+      . removePlainEmpty
+      . mergePlain
+      . map snd
+      . dropWhileEnd cleanup
+      . (\ys -> zip (map (\case [] -> Nothing
+                                x -> Just (last x))
+                        (inits ys)) ys)
+      . unsplitLines $ ls'
+  where
+    ls = stripEmptyOpening $ splitLines xs
+    ls' = map (dropSpaces minIndent) ls
+
+    minIndent = case stripEmptyLines ls of
+      [] -> 0
+      nonEmptyLs -> minimum $ map (countSpaces . mergePlain) nonEmptyLs
+
+    stripEmptyLines = filter $ \case
+      [Plain t] -> not $ T.null $ T.strip t
+      _ -> True
+
+    stripEmptyOpening ([Plain t]:ts) | T.null (T.strip t) = ts
+    stripEmptyOpening ts = ts
+
+    countSpaces (Antiquoted _:_) = 0
+    countSpaces (EscapedNewline:_) = 0
+    countSpaces (Plain t : _) = T.length . T.takeWhile (== ' ') $ t
+    countSpaces [] = 0
+
+    dropSpaces 0 x = x
+    dropSpaces n (Plain t : cs) = Plain (T.drop n t) : cs
+    dropSpaces _ _ = error "stripIndent: impossible"
+
+    cleanup (Nothing, Plain y) = T.all (== ' ') y
+    cleanup (Just (Plain x), Plain y)
+        | "\n" `T.isSuffixOf` x = T.all (== ' ') y
+    cleanup _ = False
+
+escapeCodes :: [(Char, Char)]
+escapeCodes =
+  [ ('\n', 'n' )
+  , ('\r', 'r' )
+  , ('\t', 't' )
+  , ('\\', '\\')
+  , ('$' , '$' )
+  , ('"', '"')
+  ]
+
+fromEscapeCode :: Char -> Maybe Char
+fromEscapeCode = (`lookup` map swap escapeCodes)
+
+toEscapeCode :: Char -> Maybe Char
+toEscapeCode = (`lookup` escapeCodes)
diff --git a/src/Nix/TH.hs b/src/Nix/TH.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/TH.hs
@@ -0,0 +1,36 @@
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+{-# OPTIONS_GHC -Wno-missing-fields #-}
+
+module Nix.TH where
+
+import           Data.Fix
+import           Data.Generics.Aliases
+import           Data.Set (Set)
+import qualified Data.Set as Set
+import qualified Data.Text as Text
+import           Language.Haskell.TH
+import           Language.Haskell.TH.Quote
+import           Nix.Expr
+import           Nix.Parser
+
+quoteExprExp :: String -> ExpQ
+quoteExprExp s = do
+    expr <- case parseNixText (Text.pack s) of
+        Failure err -> fail $ show err
+        Success e   -> return e
+    dataToExpQ (const Nothing `extQ` metaExp (freeVars expr)) expr
+
+freeVars :: NExpr -> Set VarName
+freeVars = error "NYI: Implement an evaluator to find free variables"
+
+metaExp :: Set VarName -> NExpr -> Maybe ExpQ
+metaExp fvs (Fix (NSym x)) | x `Set.member` fvs =
+  Just [| toExpr $(varE (mkName (Text.unpack x))) |]
+metaExp _ _ = Nothing
+
+nix :: QuasiQuoter
+nix = QuasiQuoter
+    { quoteExp = quoteExprExp
+    }
diff --git a/src/Nix/Thunk.hs b/src/Nix/Thunk.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Thunk.hs
@@ -0,0 +1,111 @@
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE DeriveFoldable #-}
+{-# LANGUAGE DeriveTraversable #-}
+{-# LANGUAGE CPP #-}
+
+#if ENABLE_TRACING
+{-# LANGUAGE BangPatterns #-}
+#endif
+
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Nix.Thunk where
+
+import Control.Exception
+import Control.Monad.Catch
+import Data.Typeable
+
+#if ENABLE_TRACING
+import Data.IORef
+import System.IO.Unsafe
+import Nix.Utils
+
+counter :: IORef Int
+counter = unsafePerformIO $ newIORef 0
+{-# NOINLINE counter #-}
+#endif
+
+data Deferred m v = Deferred (m v) | Computed v
+    deriving (Functor, Foldable, Traversable)
+
+class Monad m => MonadVar m where
+    type Var m :: * -> *
+    newVar :: a -> m (Var m a)
+    readVar :: Var m a -> m a
+    writeVar :: Var m a -> a -> m ()
+    atomicModifyVar :: Var m a -> (a -> (a, b)) -> m b
+
+class Monad m => MonadThunk v t m | v -> m, v -> t, t -> m, t -> v where
+    thunk :: m v -> m t
+    force :: t -> (v -> m r) -> m r
+    value :: v -> t
+
+data Thunk m v
+    = Value v
+    | Thunk Int (Var m Bool) (Var m (Deferred m v))
+
+newtype ThunkLoop = ThunkLoop (Maybe Int)
+    deriving (Show, Typeable)
+
+instance Exception ThunkLoop
+
+valueRef :: v -> Thunk m v
+valueRef = Value
+
+buildThunk :: MonadVar m => m v -> m (Thunk m v)
+buildThunk action =
+#if ENABLE_TRACING
+    let !x = unsafePerformIO (atomicModifyIORef' counter (\c -> (succ c, c))) in
+    Thunk x
+#else
+    Thunk 0
+#endif
+        <$> newVar False <*> newVar (Deferred action)
+
+forceThunk :: (MonadVar m, MonadThrow m) => Thunk m v -> (v -> m a) -> m a
+forceThunk (Value ref) k = k ref
+#if ENABLE_TRACING
+forceThunk (Thunk n active ref) k = do
+#else
+forceThunk (Thunk _ active ref) k = do
+#endif
+    eres <- readVar ref
+    case eres of
+        Computed v -> k v
+        Deferred action -> do
+            nowActive <- atomicModifyVar active (True,)
+            if nowActive
+                then
+#if ENABLE_TRACING
+                    throwM $ ThunkLoop (Just n)
+#else
+                    throwM $ ThunkLoop Nothing
+#endif
+                else do
+#if ENABLE_TRACING
+                    traceM $ "Forcing " ++ show n
+#endif
+                    v <- action
+                    writeVar ref (Computed v)
+                    _ <- atomicModifyVar active (False,)
+                    k v
+
+forceEffects :: MonadVar m => Thunk m v -> (v -> m a) -> m a
+forceEffects (Value ref) k = k ref
+forceEffects (Thunk _ active ref) k = do
+    nowActive <- atomicModifyVar active (True,)
+    if nowActive
+        then return $ error "forceEffects: a value was expected"
+        else do
+            eres <- readVar ref
+            case eres of
+                Computed v -> k v
+                Deferred action -> do
+                    v <- action
+                    writeVar ref (Computed v)
+                    _ <- atomicModifyVar active (False,)
+                    k v
diff --git a/src/Nix/Type/Assumption.hs b/src/Nix/Type/Assumption.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Type/Assumption.hs
@@ -0,0 +1,44 @@
+module Nix.Type.Assumption (
+  Assumption(..),
+  empty,
+  lookup,
+  remove,
+  extend,
+  keys,
+  merge,
+  mergeAssumptions,
+  singleton,
+) where
+
+import Prelude hiding (lookup)
+
+import Nix.Type.Type
+
+import Data.Foldable
+
+newtype Assumption = Assumption { assumptions :: [(Name, Type)] }
+  deriving (Eq, Show)
+
+empty :: Assumption
+empty = Assumption []
+
+extend :: Assumption -> (Name, Type) -> Assumption
+extend (Assumption a) (x, s) = Assumption ((x, s) : a)
+
+remove :: Assumption -> Name -> Assumption
+remove (Assumption a) var = Assumption (filter (\(n, _) -> n /= var) a)
+
+lookup :: Name -> Assumption -> [Type]
+lookup key (Assumption a) = map snd (filter (\(n, _) -> n == key) a)
+
+merge :: Assumption -> Assumption -> Assumption
+merge (Assumption a) (Assumption b) = Assumption (a ++ b)
+
+mergeAssumptions :: [Assumption] -> Assumption
+mergeAssumptions = foldl' merge empty
+
+singleton :: Name -> Type -> Assumption
+singleton x y = Assumption [(x, y)]
+
+keys :: Assumption -> [Name]
+keys (Assumption a) = map fst a
diff --git a/src/Nix/Type/Env.hs b/src/Nix/Type/Env.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Type/Env.hs
@@ -0,0 +1,70 @@
+module Nix.Type.Env (
+  Env(..),
+  empty,
+  lookup,
+  remove,
+  extend,
+  extends,
+  merge,
+  mergeEnvs,
+  singleton,
+  keys,
+  fromList,
+  toList,
+) where
+
+import           Prelude hiding (lookup)
+
+import           Nix.Type.Type
+
+import           Data.Foldable hiding (toList)
+import qualified Data.Map as Map
+import           Data.Semigroup
+
+-------------------------------------------------------------------------------
+-- Typing Environment
+-------------------------------------------------------------------------------
+
+newtype Env = TypeEnv { types :: Map.Map Name [Scheme] }
+  deriving (Eq, Show)
+
+empty :: Env
+empty = TypeEnv Map.empty
+
+extend :: Env -> (Name, [Scheme]) -> Env
+extend env (x, s) = env { types = Map.insert x s (types env) }
+
+remove :: Env -> Name -> Env
+remove (TypeEnv env) var = TypeEnv (Map.delete var env)
+
+extends :: Env -> [(Name, [Scheme])] -> Env
+extends env xs =
+    env { types = Map.union (Map.fromList xs) (types env) }
+
+lookup :: Name -> Env -> Maybe [Scheme]
+lookup key (TypeEnv tys) = Map.lookup key tys
+
+merge :: Env -> Env -> Env
+merge (TypeEnv a) (TypeEnv b) = TypeEnv (Map.union a b)
+
+mergeEnvs :: [Env] -> Env
+mergeEnvs = foldl' merge empty
+
+singleton :: Name -> Scheme -> Env
+singleton x y = TypeEnv (Map.singleton x [y])
+
+keys :: Env -> [Name]
+keys (TypeEnv env) = Map.keys env
+
+fromList :: [(Name, [Scheme])] -> Env
+fromList xs = TypeEnv (Map.fromList xs)
+
+toList :: Env -> [(Name, [Scheme])]
+toList (TypeEnv env) = Map.toList env
+
+instance Semigroup Env where
+  (<>) = merge
+
+instance Monoid Env where
+  mempty = empty
+  mappend = merge
diff --git a/src/Nix/Type/Infer.hs b/src/Nix/Type/Infer.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Type/Infer.hs
@@ -0,0 +1,612 @@
+{-# LANGUAGE ExistentialQuantification #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+
+{-# OPTIONS_GHC -Wno-name-shadowing #-}
+
+module Nix.Type.Infer (
+  Constraint(..),
+  TypeError(..),
+  InferError(..),
+  Subst(..),
+  inferTop
+) where
+
+import           Control.Applicative
+import           Control.Arrow
+import           Control.Monad.Catch
+import           Control.Monad.Except
+import           Control.Monad.Logic
+import           Control.Monad.Reader
+import           Control.Monad.ST
+import           Control.Monad.State
+import           Data.Fix
+import           Data.Foldable
+import qualified Data.HashMap.Lazy as M
+import           Data.List (delete, find, nub, intersect, (\\))
+import           Data.Map (Map)
+import qualified Data.Map as Map
+import           Data.Maybe (fromJust)
+import           Data.STRef
+import           Data.Semigroup
+import qualified Data.Set as Set
+import           Data.Text (Text)
+import           Nix.Atoms
+import           Nix.Convert
+import           Nix.Eval (MonadEval(..))
+import qualified Nix.Eval as Eval
+import           Nix.Expr.Types
+import           Nix.Expr.Types.Annotated
+import           Nix.Scope
+import           Nix.Thunk
+import qualified Nix.Type.Assumption as As
+import           Nix.Type.Env
+import qualified Nix.Type.Env as Env
+import           Nix.Type.Type
+import           Nix.Utils
+
+-------------------------------------------------------------------------------
+-- Classes
+-------------------------------------------------------------------------------
+
+-- | Inference monad
+newtype Infer s a = Infer
+    { getInfer ::
+        ReaderT (Set.Set TVar, Scopes (Infer s) (JThunk s))
+            (StateT InferState (ExceptT InferError (ST s))) a
+    }
+    deriving (Functor, Applicative, Alternative, Monad, MonadPlus, MonadFix,
+              MonadReader (Set.Set TVar, Scopes (Infer s) (JThunk s)),
+              MonadState InferState, MonadError InferError)
+
+-- | Inference state
+newtype InferState = InferState { count :: Int }
+
+-- | Initial inference state
+initInfer :: InferState
+initInfer = InferState { count = 0 }
+
+data Constraint
+    = EqConst Type Type
+    | ExpInstConst Type Scheme
+    | ImpInstConst Type (Set.Set TVar) Type
+    deriving (Show, Eq, Ord)
+
+newtype Subst = Subst (Map TVar Type)
+  deriving (Eq, Ord, Show, Semigroup, Monoid)
+
+class Substitutable a where
+  apply :: Subst -> a -> a
+
+instance Substitutable TVar where
+  apply (Subst s) a = tv
+    where t = TVar a
+          (TVar tv) = Map.findWithDefault t a s
+
+instance Substitutable Type where
+  apply _ (TCon a)           = TCon a
+  apply s (TSet b a)         = TSet b (M.map (apply s) a)
+  apply s (TList a)          = TList (map (apply s) a)
+  apply (Subst s) t@(TVar a) = Map.findWithDefault t a s
+  apply s (t1 `TArr` t2)     = apply s t1 `TArr` apply s t2
+  apply s (TMany ts)         = TMany (map (apply s) ts)
+
+instance Substitutable Scheme where
+  apply (Subst s) (Forall as t) = Forall as $ apply s' t
+    where s' = Subst $ foldr Map.delete s as
+
+instance Substitutable Constraint where
+   apply s (EqConst t1 t2)         = EqConst (apply s t1) (apply s t2)
+   apply s (ExpInstConst t sc)     = ExpInstConst (apply s t) (apply s sc)
+   apply s (ImpInstConst t1 ms t2) = ImpInstConst (apply s t1) (apply s ms) (apply s t2)
+
+instance Substitutable a => Substitutable [a] where
+  apply = map . apply
+
+instance (Ord a, Substitutable a) => Substitutable (Set.Set a) where
+  apply = Set.map . apply
+
+
+class FreeTypeVars a where
+  ftv :: a -> Set.Set TVar
+
+instance FreeTypeVars Type where
+  ftv TCon{}         = Set.empty
+  ftv (TVar a)       = Set.singleton a
+  ftv (TSet _ a)     = Set.unions (map ftv (M.elems a))
+  ftv (TList a)      = Set.unions (map ftv a)
+  ftv (t1 `TArr` t2) = ftv t1 `Set.union` ftv t2
+  ftv (TMany ts)     = Set.unions (map ftv ts)
+
+instance FreeTypeVars TVar where
+  ftv = Set.singleton
+
+instance FreeTypeVars Scheme where
+  ftv (Forall as t) = ftv t `Set.difference` Set.fromList as
+
+instance FreeTypeVars a => FreeTypeVars [a] where
+  ftv   = foldr (Set.union . ftv) Set.empty
+
+instance (Ord a, FreeTypeVars a) => FreeTypeVars (Set.Set a) where
+  ftv   = foldr (Set.union . ftv) Set.empty
+
+
+class ActiveTypeVars a where
+  atv :: a -> Set.Set TVar
+
+instance ActiveTypeVars Constraint where
+  atv (EqConst t1 t2)         = ftv t1 `Set.union` ftv t2
+  atv (ImpInstConst t1 ms t2) = ftv t1 `Set.union` (ftv ms `Set.intersection` ftv t2)
+  atv (ExpInstConst t s)      = ftv t `Set.union` ftv s
+
+instance ActiveTypeVars a => ActiveTypeVars [a] where
+  atv = foldr (Set.union . atv) Set.empty
+
+data TypeError
+  = UnificationFail Type Type
+  | InfiniteType TVar Type
+  | UnboundVariables [Text]
+  | Ambigious [Constraint]
+  | UnificationMismatch [Type] [Type]
+  deriving (Eq, Show)
+
+data InferError
+  = TypeInferenceErrors [TypeError]
+  | TypeInferenceAborted
+  | forall s. Exception s => EvaluationError s
+
+typeError :: MonadError InferError m => TypeError -> m ()
+typeError err = throwError $ TypeInferenceErrors [err]
+
+deriving instance Show InferError
+instance Exception InferError
+
+instance Semigroup InferError where
+    x <> _ = x
+
+instance Monoid InferError where
+    mempty  = TypeInferenceAborted
+    mappend = (<>)
+
+-------------------------------------------------------------------------------
+-- Inference
+-------------------------------------------------------------------------------
+
+-- | Run the inference monad
+runInfer' :: Infer s a -> ST s (Either InferError a)
+runInfer' = runExceptT
+          . (`evalStateT` initInfer)
+          . (`runReaderT` (Set.empty, emptyScopes))
+          . getInfer
+
+runInfer :: (forall s. Infer s a) -> Either InferError a
+runInfer m = runST (runInfer' m)
+
+inferType :: Env -> NExpr -> Infer s [(Subst, Type)]
+inferType env ex = do
+  Judgment as cs t <- infer ex
+  let unbounds = Set.fromList (As.keys as) `Set.difference`
+                 Set.fromList (Env.keys env)
+  unless (Set.null unbounds) $
+      typeError $ UnboundVariables (nub (Set.toList unbounds))
+  let cs' = [ ExpInstConst t s
+            | (x, ss) <- Env.toList env
+            , s <- ss
+            , t <- As.lookup x as]
+  inferState <- get
+  let eres = (`evalState` inferState) $ runSolver $ do
+          subst <- solve (cs ++ cs')
+          return (subst, subst `apply` t)
+  case eres of
+      Left errs -> throwError $ TypeInferenceErrors errs
+      Right xs  -> pure xs
+
+-- | Solve for the toplevel type of an expression in a given environment
+inferExpr :: Env -> NExpr -> Either InferError [Scheme]
+inferExpr env ex = case runInfer (inferType env ex) of
+  Left err -> Left err
+  Right xs -> Right $ map (\(subst, ty) -> closeOver (subst `apply` ty)) xs
+
+-- | Canonicalize and return the polymorphic toplevel type.
+closeOver :: Type -> Scheme
+closeOver = normalize . generalize Set.empty
+
+extendMSet :: TVar -> Infer s a -> Infer s a
+extendMSet x = Infer . local (first (Set.insert x)) . getInfer
+
+letters :: [String]
+letters = [1..] >>= flip replicateM ['a'..'z']
+
+fresh :: MonadState InferState m => m Type
+fresh = do
+    s <- get
+    put s{count = count s + 1}
+    return $ TVar $ TV (letters !! count s)
+
+instantiate :: MonadState InferState m => Scheme -> m Type
+instantiate (Forall as t) = do
+    as' <- mapM (const fresh) as
+    let s = Subst $ Map.fromList $ zip as as'
+    return $ apply s t
+
+generalize :: Set.Set TVar -> Type -> Scheme
+generalize free t  = Forall as t
+    where as = Set.toList $ ftv t `Set.difference` free
+
+unops :: Type -> NUnaryOp -> [Constraint]
+unops u1 = \case
+    NNot -> [ EqConst u1 (typeFun [typeBool, typeBool]) ]
+    NNeg -> [ EqConst u1 (TMany [ typeFun [typeInt,   typeInt]
+                               , typeFun [typeFloat, typeFloat] ]) ]
+
+binops :: Type -> NBinaryOp -> [Constraint]
+binops u1 = \case
+    NApp    -> []                -- this is handled separately
+
+    -- Equality tells you nothing about the types, because any two types are
+    -- allowed.
+    NEq     -> []
+    NNEq    -> []
+
+    NGt     -> inequality
+    NGte    -> inequality
+    NLt     -> inequality
+    NLte    -> inequality
+
+    NAnd    -> [ EqConst u1 (typeFun [typeBool, typeBool, typeBool]) ]
+    NOr     -> [ EqConst u1 (typeFun [typeBool, typeBool, typeBool]) ]
+    NImpl   -> [ EqConst u1 (typeFun [typeBool, typeBool, typeBool]) ]
+
+    NConcat -> [ EqConst u1 (TMany [ typeFun [typeList,   typeList,   typeList]
+                                  , typeFun [typeList,   typeNull,   typeList]
+                                  , typeFun [typeNull,   typeList,   typeList]
+                                  ]) ]
+
+    NUpdate -> [ EqConst u1 (TMany [ typeFun [typeSet,    typeSet,    typeSet]
+                                  , typeFun [typeSet,    typeNull,   typeSet]
+                                  , typeFun [typeNull,   typeSet,    typeSet]
+                                  ]) ]
+
+    NPlus   -> [ EqConst u1 (TMany [ typeFun [typeInt,    typeInt,    typeInt]
+                                  , typeFun [typeFloat,  typeFloat,  typeFloat]
+                                  , typeFun [typeInt,    typeFloat,  typeFloat]
+                                  , typeFun [typeFloat,  typeInt,    typeFloat]
+                                  , typeFun [typeString, typeString, typeString]
+                                  , typeFun [typePath,   typePath,   typePath]
+                                  , typeFun [typeString, typeString, typePath]
+                                  ]) ]
+    NMinus  -> arithmetic
+    NMult   -> arithmetic
+    NDiv    -> arithmetic
+  where
+    inequality =
+        [ EqConst u1 (TMany [ typeFun [typeInt,    typeInt,    typeBool]
+                            , typeFun [typeFloat,  typeFloat,  typeBool]
+                            , typeFun [typeInt,    typeFloat,  typeBool]
+                            , typeFun [typeFloat,  typeInt,    typeBool]
+                            ]) ]
+
+    arithmetic =
+        [ EqConst u1 (TMany [ typeFun [typeInt,    typeInt,    typeInt]
+                            , typeFun [typeFloat,  typeFloat,  typeFloat]
+                            , typeFun [typeInt,    typeFloat,  typeFloat]
+                            , typeFun [typeFloat,  typeInt,    typeFloat]
+                            ]) ]
+
+instance MonadVar (Infer s) where
+    type Var (Infer s) = STRef s
+
+    newVar x     = Infer $ lift $ lift $ lift $ newSTRef x
+    readVar x    = Infer $ lift $ lift $ lift $ readSTRef x
+    writeVar x y = Infer $ lift $ lift $ lift $ writeSTRef x y
+    atomicModifyVar x f = Infer $ lift $ lift $ lift $ do
+        res <- snd . f <$> readSTRef x
+        _ <- modifySTRef x (fst . f)
+        return res
+
+newtype JThunk s = JThunk (Thunk (Infer s) (Judgment s))
+
+instance MonadThrow (Infer s) where
+    throwM = throwError . EvaluationError
+
+instance MonadCatch (Infer s) where
+    catch m h = catchError m $ \case
+        EvaluationError e ->
+            maybe (error $ "Exception was not an exception: " ++ show e) h
+                  (fromException (toException e))
+        err -> error $ "Unexpected error: " ++ show err
+
+instance MonadThunk (Judgment s) (JThunk s) (Infer s) where
+    thunk = fmap JThunk . buildThunk
+
+    force (JThunk t) f = catch (forceThunk t f) $ \(_ :: ThunkLoop) ->
+        -- If we have a thunk loop, we just don't know the type.
+        f =<< Judgment As.empty [] <$> fresh
+
+    value = JThunk . valueRef
+
+instance MonadEval (Judgment s) (Infer s) where
+    freeVariable var = do
+        tv <- fresh
+        return $ Judgment (As.singleton var tv) [] tv
+
+    -- If we fail to look up an attribute, we just don't know the type.
+    attrMissing _ _ = Judgment As.empty [] <$> fresh
+
+    evaledSym _ = pure
+
+    evalCurPos =
+        return $ Judgment As.empty [] $ TSet False $ M.fromList
+            [ ("file", typePath)
+            , ("line", typeInt)
+            , ("col",  typeInt) ]
+
+    evalConstant c  = return $ Judgment As.empty [] (go c)
+      where
+        go = \case
+          NInt _   -> typeInt
+          NFloat _ -> typeFloat
+          NBool _  -> typeBool
+          NNull    -> typeNull
+
+    evalString      = const $ return $ Judgment As.empty [] typeString
+    evalLiteralPath = const $ return $ Judgment As.empty [] typePath
+    evalEnvPath     = const $ return $ Judgment As.empty [] typePath
+
+    evalUnary op (Judgment as1 cs1 t1) = do
+        tv <- fresh
+        return $ Judgment as1 (cs1 ++ unops (t1 `TArr` tv) op) tv
+
+    evalBinary op (Judgment as1 cs1 t1) e2 = do
+        Judgment as2 cs2 t2 <- e2
+        tv <- fresh
+        return $ Judgment
+            (as1 `As.merge` as2)
+            (cs1 ++ cs2 ++ binops (t1 `TArr` (t2 `TArr` tv)) op)
+            tv
+
+    evalWith = Eval.evalWithAttrSet
+
+    evalIf (Judgment as1 cs1 t1) t f = do
+        Judgment as2 cs2 t2 <- t
+        Judgment as3 cs3 t3 <- f
+        return $ Judgment
+            (as1 `As.merge` as2 `As.merge` as3)
+            (cs1 ++ cs2 ++ cs3 ++ [EqConst t1 typeBool, EqConst t2 t3])
+            t2
+
+    evalAssert (Judgment as1 cs1 t1) body = do
+        Judgment as2 cs2 t2 <- body
+        return $ Judgment
+            (as1 `As.merge` as2)
+            (cs1 ++ cs2 ++ [EqConst t1 typeBool])
+            t2
+
+    evalApp (Judgment as1 cs1 t1) e2 = do
+        Judgment as2 cs2 t2 <- e2
+        tv <- fresh
+        return $ Judgment
+            (as1 `As.merge` as2)
+            (cs1 ++ cs2 ++ [EqConst t1 (t2 `TArr` tv)])
+            tv
+
+    evalAbs (Param x) k = do
+        tv@(TVar a) <- fresh
+        ((), Judgment as cs t) <-
+            extendMSet a (k (pure (Judgment (As.singleton x tv) [] tv))
+                            (\_ b -> ((),) <$> b))
+        return $ Judgment
+            (as `As.remove` x)
+            (cs ++ [EqConst t' tv | t' <- As.lookup x as])
+            (tv `TArr` t)
+
+    evalAbs (ParamSet ps variadic _mname) k = do
+        js <- fmap concat $ forM ps $ \(name, _) -> do
+                tv <- fresh
+                pure [(name, tv)]
+
+        let (env, tys) = (\f -> foldl' f (As.empty, M.empty) js)
+                $ \(as1, t1) (k, t) ->
+                    (as1 `As.merge` As.singleton k t, M.insert k t t1)
+            arg   = pure $ Judgment env [] (TSet True tys)
+            call  = k arg $ \args b -> (args,) <$> b
+            names = map fst js
+
+        (args, Judgment as cs t) <-
+            foldr (\(_, TVar a) -> extendMSet a) call js
+
+        ty <- TSet variadic <$> traverse (inferredType <$>) args
+
+        return $ Judgment
+            (foldl' As.remove as names)
+            (cs ++ [ EqConst t' (tys M.! x)
+                   | x  <- names
+                   , t' <- As.lookup x as])
+            (ty `TArr` t)
+
+    evalError = throwError . EvaluationError
+
+data Judgment s = Judgment
+    { assumptions     :: As.Assumption
+    , typeConstraints :: [Constraint]
+    , inferredType    :: Type
+    }
+    deriving Show
+
+instance FromValue (Text, DList Text) (Infer s) (Judgment s) where
+    fromValueMay _ = return Nothing
+    fromValue _ = error "Unused"
+
+instance FromValue (AttrSet (JThunk s), AttrSet SourcePos) (Infer s) (Judgment s) where
+    fromValueMay (Judgment _ _ (TSet _ xs)) = do
+        let sing _ = Judgment As.empty []
+        pure $ Just (M.mapWithKey (\k v -> value (sing k v)) xs, M.empty)
+    fromValueMay _ = pure Nothing
+    fromValue = fromValueMay >=> \case
+        Just v  -> pure v
+        Nothing -> pure (M.empty, M.empty)
+
+instance ToValue (AttrSet (JThunk s), AttrSet SourcePos) (Infer s) (Judgment s) where
+    toValue (xs, _) = Judgment
+        <$> foldrM go As.empty xs
+        <*> (concat <$> traverse (`force` (pure . typeConstraints)) xs)
+        <*> (TSet True <$> traverse (`force` (pure . inferredType)) xs)
+      where
+        go x rest = force x $ \x' -> pure $ As.merge (assumptions x') rest
+
+instance ToValue [JThunk s] (Infer s) (Judgment s) where
+    toValue xs = Judgment
+        <$> foldrM go As.empty xs
+        <*> (concat <$> traverse (`force` (pure . typeConstraints)) xs)
+        <*> (TList <$> traverse (`force` (pure . inferredType)) xs)
+      where
+        go x rest = force x $ \x' -> pure $ As.merge (assumptions x') rest
+
+instance ToValue Bool (Infer s) (Judgment s) where
+    toValue _ = pure $ Judgment As.empty [] typeBool
+
+infer :: NExpr -> Infer s (Judgment s)
+infer = cata Eval.eval
+
+inferTop :: Env -> [(Text, NExpr)] -> Either InferError Env
+inferTop env [] = Right env
+inferTop env ((name, ex):xs) = case inferExpr env ex of
+  Left err -> Left err
+  Right ty -> inferTop (extend env (name, ty)) xs
+
+normalize :: Scheme -> Scheme
+normalize (Forall _ body) = Forall (map snd ord) (normtype body)
+  where
+    ord = zip (nub $ fv body) (map TV letters)
+
+    fv (TVar a)    = [a]
+    fv (TArr a b)  = fv a ++ fv b
+    fv (TCon _)    = []
+    fv (TSet _ a)  = concatMap fv (M.elems a)
+    fv (TList a)   = concatMap fv a
+    fv (TMany ts)  = concatMap fv ts
+
+    normtype (TArr a b)  = TArr (normtype a) (normtype b)
+    normtype (TCon a)    = TCon a
+    normtype (TSet b a)  = TSet b (M.map normtype a)
+    normtype (TList a)   = TList (map normtype a)
+    normtype (TMany ts)  = TMany (map normtype ts)
+    normtype (TVar a)    =
+      case Prelude.lookup a ord of
+        Just x -> TVar x
+        Nothing -> error "type variable not in signature"
+
+-------------------------------------------------------------------------------
+-- Constraint Solver
+-------------------------------------------------------------------------------
+
+newtype Solver m a = Solver (LogicT (StateT [TypeError] m) a)
+    deriving (Functor, Applicative, Alternative, Monad, MonadPlus,
+              MonadLogic, MonadState [TypeError])
+
+instance MonadTrans Solver where
+    lift = Solver . lift . lift
+
+instance Monad m => MonadError TypeError (Solver m) where
+    throwError err = Solver $ lift (modify (err:)) >> mzero
+    catchError _ _ = error "This is never used"
+
+runSolver :: Monad m => Solver m a -> m (Either [TypeError] [a])
+runSolver (Solver s) = do
+    res <- runStateT (observeAllT s) []
+    pure $ case res of
+        (x:xs, _) -> Right (x:xs)
+        (_, es)   -> Left (nub es)
+
+-- | The empty substitution
+emptySubst :: Subst
+emptySubst = mempty
+
+-- | Compose substitutions
+compose :: Subst -> Subst -> Subst
+Subst s1 `compose` Subst s2 =
+    Subst $ Map.map (apply (Subst s1)) s2 `Map.union` s1
+
+unifyMany :: Monad m => [Type] -> [Type] -> Solver m Subst
+unifyMany [] [] = return emptySubst
+unifyMany (t1 : ts1) (t2 : ts2) =
+  do su1 <- unifies t1 t2
+     su2 <- unifyMany (apply su1 ts1) (apply su1 ts2)
+     return (su2 `compose` su1)
+unifyMany t1 t2 = throwError $ UnificationMismatch t1 t2
+
+allSameType :: [Type] -> Bool
+allSameType [] = True
+allSameType [_] = True
+allSameType (x:y:ys) = x == y && allSameType (y:ys)
+
+unifies :: Monad m => Type -> Type -> Solver m Subst
+unifies t1 t2 | t1 == t2 = return emptySubst
+unifies (TVar v) t = v `bind` t
+unifies t (TVar v) = v `bind` t
+unifies (TList xs) (TList ys)
+    | allSameType xs && allSameType ys = case (xs, ys) of
+          (x:_, y:_) -> unifies x y
+          _ -> return emptySubst
+    | length xs == length ys = unifyMany xs ys
+-- We assume that lists of different lengths containing various types cannot
+-- be unified.
+unifies t1@(TList _) t2@(TList _) = throwError $ UnificationFail t1 t2
+unifies (TSet True _) (TSet True _) = return emptySubst
+unifies (TSet False b) (TSet True s)
+    | M.keys b `intersect` M.keys s == M.keys s = return emptySubst
+unifies (TSet True s) (TSet False b)
+    | M.keys b `intersect` M.keys s == M.keys b = return emptySubst
+unifies (TSet False s) (TSet False b)
+    | null (M.keys b \\ M.keys s) = return emptySubst
+unifies (TArr t1 t2) (TArr t3 t4) = unifyMany [t1, t2] [t3, t4]
+unifies (TMany t1s) t2 = considering t1s >>- unifies ?? t2
+unifies t1 (TMany t2s) = considering t2s >>- unifies t1
+unifies t1 t2 = throwError $ UnificationFail t1 t2
+
+bind :: Monad m => TVar -> Type -> Solver m Subst
+bind a t | t == TVar a     = return emptySubst
+         | occursCheck a t = throwError $ InfiniteType a t
+         | otherwise       = return (Subst $ Map.singleton a t)
+
+occursCheck ::  FreeTypeVars a => TVar -> a -> Bool
+occursCheck a t = a `Set.member` ftv t
+
+nextSolvable :: [Constraint] -> (Constraint, [Constraint])
+nextSolvable xs = fromJust (find solvable (chooseOne xs))
+  where
+    chooseOne xs = [(x, ys) | x <- xs, let ys = delete x xs]
+
+    solvable (EqConst{}, _)      = True
+    solvable (ExpInstConst{}, _) = True
+    solvable (ImpInstConst _t1 ms t2, cs) =
+        Set.null ((ftv t2 `Set.difference` ms) `Set.intersection` atv cs)
+
+considering :: [a] -> Solver m a
+considering xs = Solver $ LogicT $ \c n -> foldr c n xs
+
+solve :: MonadState InferState m => [Constraint] -> Solver m Subst
+solve [] = return emptySubst
+solve cs = solve' (nextSolvable cs)
+  where
+    solve' (EqConst t1 t2, cs) =
+      unifies t1 t2 >>- \su1 ->
+      solve (apply su1 cs) >>- \su2 ->
+          return (su2 `compose` su1)
+
+    solve' (ImpInstConst t1 ms t2, cs) =
+      solve (ExpInstConst t1 (generalize ms t2) : cs)
+
+    solve' (ExpInstConst t s, cs) = do
+      s' <- lift $ instantiate s
+      solve (EqConst t s' : cs)
diff --git a/src/Nix/Type/Type.hs b/src/Nix/Type/Type.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Type/Type.hs
@@ -0,0 +1,40 @@
+module Nix.Type.Type where
+
+import qualified Data.HashMap.Lazy as M
+import           Data.Text (Text)
+import           Nix.Utils
+
+newtype TVar = TV String
+  deriving (Show, Eq, Ord)
+
+data Type
+  = TVar TVar                -- type variable
+  | TCon String              -- known type
+  | TSet Bool (AttrSet Type) -- heterogenous map, bool if variadic
+  | TList [Type]             -- heterogenous list
+  | TArr Type Type           -- type -> type
+  | TMany [Type]             -- variant type
+  deriving (Show, Eq, Ord)
+
+data Scheme = Forall [TVar] Type -- forall a b. a -> b
+  deriving (Show, Eq, Ord)
+
+-- This models a set that unifies with any other set.
+typeSet :: Type
+typeSet = TSet True M.empty
+
+typeList :: Type
+typeList = TList []
+
+typeFun :: [Type] -> Type
+typeFun = foldr1 TArr
+
+typeInt, typeFloat, typeBool, typeString, typePath, typeNull :: Type
+typeInt    = TCon "integer"
+typeFloat  = TCon "float"
+typeBool   = TCon "boolean"
+typeString = TCon "string"
+typePath   = TCon "path"
+typeNull   = TCon "null"
+
+type Name = Text
diff --git a/src/Nix/Utils.hs b/src/Nix/Utils.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Utils.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TupleSections #-}
+
+module Nix.Utils (module Nix.Utils, module X) where
+
+import           Control.Arrow ((&&&))
+import           Control.Monad
+import           Control.Monad.Fix
+import qualified Data.Aeson as A
+import qualified Data.Aeson.Encoding as A
+import           Data.Fix
+import           Data.HashMap.Lazy (HashMap)
+import qualified Data.HashMap.Lazy as M
+import           Data.List (sortOn)
+import           Data.Monoid (Endo)
+import           Data.Text (Text)
+import qualified Data.Vector as V
+import           Lens.Family2 as X
+import           Lens.Family2.Stock (_1, _2)
+
+#if ENABLE_TRACING
+import           Debug.Trace as X
+#else
+import           Prelude as X
+trace :: String -> a -> a
+trace = const id
+traceM :: Monad m => String -> m ()
+traceM = const (return ())
+#endif
+
+type DList a = Endo [a]
+
+type AttrSet = HashMap Text
+
+-- | An f-algebra defines how to reduced the fixed-point of a functor to a
+--   value.
+type Alg f a = f a -> a
+
+type AlgM f m a = f a -> m a
+
+-- | An "transform" here is a modification of a catamorphism.
+type Transform f a = (Fix f -> a) -> Fix f -> a
+
+(<&>) :: Functor f => f a -> (a -> c) -> f c
+(<&>) = flip (<$>)
+
+(??) :: Functor f => f (a -> b) -> a -> f b
+fab ?? a = fmap ($ a) fab
+
+loeb :: Functor f => f (f a -> a) -> f a
+loeb x = go where go = fmap ($ go) x
+
+loebM :: (MonadFix m, Traversable t) => t (t a -> m a) -> m (t a)
+loebM f = mfix $ \a -> mapM ($ a) f
+
+para :: Functor f => (f (Fix f, a) -> a) -> Fix f -> a
+para f = f . fmap (id &&& para f) . unFix
+
+paraM :: (Traversable f, Monad m) => (f (Fix f, a) -> m a) -> Fix f -> m a
+paraM f = f <=< traverse (\x -> (x,) <$> paraM f x) . unFix
+
+cataP :: Functor f => (Fix f -> f a -> a) -> Fix f -> a
+cataP f x = f x . fmap (cataP f) . unFix $ x
+
+cataPM :: (Traversable f, Monad m) => (Fix f -> f a -> m a) -> Fix f -> m a
+cataPM f x = f x <=< traverse (cataPM f) . unFix $ x
+
+transport :: Functor g => (forall x. f x -> g x) -> Fix f -> Fix g
+transport f (Fix x) = Fix $ fmap (transport f) (f x)
+
+-- | adi is Abstracting Definitional Interpreters:
+--
+--     https://arxiv.org/abs/1707.04755
+--
+--   Essentially, it does for evaluation what recursion schemes do for
+--   representation: allows threading layers through existing structure, only
+--   in this case through behavior.
+adi :: Functor f => (f a -> a) -> ((Fix f -> a) -> Fix f -> a) -> Fix f -> a
+adi f g = g (f . fmap (adi f g) . unFix)
+
+adiM :: (Traversable t, Monad m)
+     => (t a -> m a) -> ((Fix t -> m a) -> Fix t -> m a) -> Fix t -> m a
+adiM f g = g ((f <=< traverse (adiM f g)) . unFix)
+
+class Has a b where
+    hasLens :: Lens' a b
+
+instance Has a a where
+    hasLens f = f
+
+instance Has (a, b) a where
+    hasLens = _1
+
+instance Has (a, b) b where
+    hasLens = _2
+
+toEncodingSorted :: A.Value -> A.Encoding
+toEncodingSorted = \case
+    A.Object m ->
+        A.pairs . mconcat
+                . fmap (\(k, v) -> A.pair k $ toEncodingSorted v)
+                . sortOn fst
+                $ M.toList m
+    A.Array l -> A.list toEncodingSorted $ V.toList l
+    v -> A.toEncoding v
diff --git a/src/Nix/Value.hs b/src/Nix/Value.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/Value.hs
@@ -0,0 +1,346 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveFoldable #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DeriveTraversable #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+
+{-# OPTIONS_GHC -Wno-missing-signatures #-}
+{-# OPTIONS_GHC -Wno-missing-pattern-synonym-signatures #-}
+
+module Nix.Value where
+
+import           Control.Monad
+import           Control.Monad.Catch
+import           Control.Monad.Trans.Class
+import           Control.Monad.Trans.Except
+import qualified Data.Aeson as A
+import           Data.Align
+import           Data.Fix
+import           Data.HashMap.Lazy (HashMap)
+import qualified Data.HashMap.Lazy as M
+import           Data.Hashable
+import           Data.Monoid (appEndo)
+import           Data.Text (Text)
+import           Data.These
+import           Data.Typeable (Typeable)
+import           GHC.Generics
+import           Lens.Family2
+import           Lens.Family2.Stock
+import           Lens.Family2.TH
+import           Nix.Atoms
+import           Nix.Expr.Types
+import           Nix.Expr.Types.Annotated
+import           Nix.Frames
+import           Nix.Scope
+import           Nix.Thunk
+import           Nix.Utils
+
+-- | An 'NValue' is the most reduced form of an 'NExpr' after evaluation is
+--   completed. 's' is related to the type of errors that might occur during
+--   construction or use of a value.
+data NValueF m r
+    = NVConstantF NAtom
+     -- | A string has a value and a context, which can be used to record what a
+     -- string has been build from
+    | NVStrF Text (DList Text)
+    | NVPathF FilePath
+    | NVListF [r]
+    | NVSetF (AttrSet r) (AttrSet SourcePos)
+    | NVClosureF (Params ()) (m (NValue m) -> m (NValue m))
+      -- ^ A function is a closed set of parameters representing the "call
+      --   signature", used at application time to check the type of arguments
+      --   passed to the function. Since it supports default values which may
+      --   depend on other values within the final argument set, this
+      --   dependency is represented as a set of pending evaluations. The
+      --   arguments are finally normalized into a set which is passed to the
+      --   function.
+      --
+      --   Note that 'm r' is being used here because effectively a function
+      --   and its set of default arguments is "never fully evaluated". This
+      --   enforces in the type that it must be re-evaluated for each call.
+    | NVBuiltinF String (m (NValue m) -> m (NValue m))
+      -- ^ A builtin function is itself already in normal form. Also, it may
+      --   or may not choose to evaluate its argument in the production of a
+      --   result.
+    deriving (Generic, Typeable, Functor, Foldable, Traversable)
+
+-- | An 'NValueNF' is a fully evaluated value in normal form. An 'NValue m' is
+--   a value in head normal form, where only the "top layer" has been
+--   evaluated. An action of type 'm (NValue m)' is a pending evualation that
+--   has yet to be performed. An 'NThunk m' is either a pending evaluation, or
+--   a value in head normal form. A 'NThunkSet' is a set of mappings from keys
+--   to thunks.
+
+type NValueNF m = Fix (NValueF m)      -- normal form
+type ValueSet m = AttrSet (NThunk m)
+
+data Provenance m = Provenance
+    { _lexicalScope :: Scopes m (NThunk m)
+    , _originExpr   :: NExprLocF (Maybe (NValue m))
+      -- ^ When calling the function x: x + 2 with argument x = 3, the
+      --   'originExpr' for the resulting value will be 3 + 2, while the
+      --   'contextExpr' will be @(x: x + 2) 3@, preserving not only the
+      --   result of the call, but what was called and with what arguments.
+    }
+
+data NThunk m = NThunk
+    { _thunkProvenance :: [Provenance m]
+    , _baseThunk       :: Thunk m (NValue m)
+    }
+
+data NValue m = NValue
+    { _valueProvenance :: [Provenance m]
+    , _baseValue       :: NValueF m (NThunk m)
+    }
+
+addProvenance :: (NValue m -> Provenance m) -> NValue m -> NValue m
+addProvenance f l@(NValue p v) = NValue (f l : p) v
+
+pattern NVConstant x <- NValue _ (NVConstantF x)
+
+nvConstant x = NValue [] (NVConstantF x)
+nvConstantP p x = NValue [p] (NVConstantF x)
+
+pattern NVStr s d <- NValue _ (NVStrF s d)
+
+nvStr s d = NValue [] (NVStrF s d)
+nvStrP p s d = NValue [p] (NVStrF s d)
+
+pattern NVPath x <- NValue _ (NVPathF x)
+
+nvPath x = NValue [] (NVPathF x)
+nvPathP p x = NValue [p] (NVPathF x)
+
+pattern NVList l <- NValue _ (NVListF l)
+
+nvList l = NValue [] (NVListF l)
+nvListP p l = NValue [p] (NVListF l)
+
+pattern NVSet s x <- NValue _ (NVSetF s x)
+
+nvSet s x = NValue [] (NVSetF s x)
+nvSetP p s x = NValue [p] (NVSetF s x)
+
+pattern NVClosure x f <- NValue _ (NVClosureF x f)
+
+nvClosure x f = NValue [] (NVClosureF x f)
+nvClosureP p x f = NValue [p] (NVClosureF x f)
+
+pattern NVBuiltin name f <- NValue _ (NVBuiltinF name f)
+
+nvBuiltin name f = NValue [] (NVBuiltinF name f)
+nvBuiltinP p name f = NValue [p] (NVBuiltinF name f)
+
+instance Show (NValueF m (Fix (NValueF m))) where
+    showsPrec = flip go where
+      go (NVConstantF atom)  = showsCon1 "NVConstant" atom
+      go (NVStrF txt ctxt)   = showsCon2 "NVStr"      txt (appEndo ctxt [])
+      go (NVListF     lst)   = showsCon1 "NVList"     lst
+      go (NVSetF attrs _)    = showsCon1 "NVSet"      attrs
+      go (NVClosureF p _)    = showsCon1 "NVClosure"  p
+      go (NVPathF p)         = showsCon1 "NVPath"     p
+      go (NVBuiltinF name _) = showsCon1 "NVBuiltin"  name
+
+      showsCon1 :: Show a => String -> a -> Int -> String -> String
+      showsCon1 con a d =
+          showParen (d > 10) $ showString (con ++ " ") . showsPrec 11 a
+
+      showsCon2 :: (Show a, Show b)
+                => String -> a -> b -> Int -> String -> String
+      showsCon2 con a b d =
+          showParen (d > 10)
+              $ showString (con ++ " ")
+              . showsPrec 11 a
+              . showString " "
+              . showsPrec 11 b
+
+instance Eq (NValue m) where
+    NVConstant (NFloat x) == NVConstant (NInt y)   = x == fromInteger y
+    NVConstant (NInt x)   == NVConstant (NFloat y) = fromInteger x == y
+    NVConstant (NInt x)   == NVConstant (NInt y)   = x == y
+    NVConstant (NFloat x) == NVConstant (NFloat y) = x == y
+    NVStr x _ == NVStr y _ = x < y
+    NVPath x  == NVPath y  = x < y
+    _         == _         = False
+
+instance Ord (NValue m) where
+    NVConstant (NFloat x) <= NVConstant (NInt y)   = x <= fromInteger y
+    NVConstant (NInt x)   <= NVConstant (NFloat y) = fromInteger x <= y
+    NVConstant (NInt x)   <= NVConstant (NInt y)   = x <= y
+    NVConstant (NFloat x) <= NVConstant (NFloat y) = x <= y
+    NVStr x _ <= NVStr y _ = x < y
+    NVPath x  <= NVPath y  = x < y
+    _         <= _         = False
+
+checkComparable :: (Framed e m, Typeable m) => NValue m -> NValue m -> m ()
+checkComparable x y = case (x, y) of
+    (NVConstant (NFloat _), NVConstant (NInt _))   -> pure ()
+    (NVConstant (NInt _),   NVConstant (NFloat _)) -> pure ()
+    (NVConstant (NInt _),   NVConstant (NInt _))   -> pure ()
+    (NVConstant (NFloat _), NVConstant (NFloat _)) -> pure ()
+    (NVStr _ _, NVStr _ _) -> pure ()
+    (NVPath _, NVPath _)   -> pure ()
+    _ -> throwError $ Comparison x y
+
+builtin :: Monad m
+        => String -> (m (NValue m) -> m (NValue m)) -> m (NValue m)
+builtin name f = return $ nvBuiltin name f
+
+builtin2 :: Monad m
+         => String -> (m (NValue m) -> m (NValue m) -> m (NValue m))
+         -> m (NValue m)
+builtin2 name f = builtin name (builtin name . f)
+
+builtin3 :: Monad m
+         => String
+         -> (m (NValue m) -> m (NValue m) -> m (NValue m) -> m (NValue m))
+         -> m (NValue m)
+builtin3 name f =
+    builtin name $ \a -> builtin name $ \b -> builtin name $ \c -> f a b c
+
+isClosureNF :: Monad m => NValueNF m -> Bool
+isClosureNF (Fix NVClosureF {}) = True
+isClosureNF _ = False
+
+thunkEq :: MonadThunk (NValue m) (NThunk m) m
+        => NThunk m -> NThunk m -> m Bool
+thunkEq lt rt = force lt $ \lv -> force rt $ \rv -> valueEq lv rv
+
+-- | Checks whether two containers are equal, using the given item equality
+--   predicate. If there are any item slots that don't match between the two
+--   containers, the result will be False.
+alignEqM
+    :: (Align f, Traversable f, Monad m)
+    => (a -> b -> m Bool)
+    -> f a
+    -> f b
+    -> m Bool
+alignEqM eq fa fb = fmap (either (const False) (const True)) $ runExceptT $ do
+    pairs <- forM (Data.Align.align fa fb) $ \case
+        These a b -> return (a, b)
+        _ -> throwE ()
+    forM_ pairs $ \(a, b) -> guard =<< lift (eq a b)
+
+isDerivation :: MonadThunk (NValue m) (NThunk m) m
+             => AttrSet (NThunk m) -> m Bool
+isDerivation m = case M.lookup "type" m of
+    Nothing -> pure False
+    Just t -> force t $ valueEq (nvStr "derivation" mempty)
+
+valueEq :: MonadThunk (NValue m) (NThunk m) m
+        => NValue m -> NValue m -> m Bool
+valueEq l r = case (l, r) of
+    (NVConstant lc, NVConstant rc) -> pure $ lc == rc
+    (NVStr ls _, NVStr rs _) -> pure $ ls == rs
+    (NVStr ls _, NVConstant NNull) -> pure $ ls == ""
+    (NVConstant NNull, NVStr rs _) -> pure $ "" == rs
+    (NVList ls, NVList rs) -> alignEqM thunkEq ls rs
+    (NVSet lm _, NVSet rm _) -> do
+        let compareAttrs = alignEqM thunkEq lm rm
+        isDerivation lm >>= \case
+            True -> isDerivation rm >>= \case
+                True | Just lp <- M.lookup "outPath" lm
+                     , Just rp <- M.lookup "outPath" rm
+                       -> thunkEq lp rp
+                _ -> compareAttrs
+            _ -> compareAttrs
+    (NVPath lp, NVPath rp) -> pure $ lp == rp
+    _ -> pure False
+
+data ValueType
+    = TInt
+    | TFloat
+    | TBool
+    | TNull
+    | TString
+    | TList
+    | TSet
+    | TClosure
+    | TPath
+    | TBuiltin
+    deriving Show
+
+valueType :: NValueF m r -> ValueType
+valueType = \case
+    NVConstantF a -> case a of
+        NInt _    -> TInt
+        NFloat _  -> TFloat
+        NBool _   -> TBool
+        NNull     -> TNull
+    NVStrF {}     -> TString
+    NVListF {}    -> TList
+    NVSetF {}     -> TSet
+    NVClosureF {} -> TClosure
+    NVPathF {}    -> TPath
+    NVBuiltinF {} -> TBuiltin
+
+describeValue :: ValueType -> String
+describeValue = \case
+    TInt     -> "an integer"
+    TFloat   -> "a float"
+    TBool    -> "a boolean"
+    TNull    -> "a null"
+    TString  -> "a string"
+    TList    -> "a list"
+    TSet     -> "an attr set"
+    TClosure -> "a function"
+    TPath    -> "a path"
+    TBuiltin -> "a builtin function"
+
+instance Show (NValueF m (NThunk m)) where
+    show = show . describeValue . valueType
+
+instance Show (NValue m) where
+    show (NValue _ v)  = show v
+
+instance Show (NThunk m) where
+    show (NThunk _ (Value v)) = show v
+    show (NThunk _ _) = "<thunk>"
+
+data ValueFrame m
+    = ForcingThunk
+    | ConcerningValue (NValue m)
+    | Comparison (NValue m) (NValue m)
+    | Addition (NValue m) (NValue m)
+    | Multiplication (NValue m) (NValue m)
+    | Division (NValue m) (NValue m)
+    | Coercion ValueType ValueType
+    | CoercionToJsonNF (NValueNF m)
+    | CoercionFromJson A.Value
+    | ExpectationNF ValueType (NValueNF m)
+    | Expectation ValueType (NValue m)
+    deriving (Show, Typeable)
+
+instance Typeable m => Exception (ValueFrame m)
+
+$(makeTraversals ''NValueF)
+$(makeLenses ''Provenance)
+$(makeLenses ''NThunk)
+$(makeLenses ''NValue)
+
+alterF :: (Eq k, Hashable k, Functor f)
+       => (Maybe v -> f (Maybe v)) -> k -> HashMap k v -> f (HashMap k v)
+alterF f k m = f (M.lookup k m) <&> \case
+    Nothing -> M.delete k m
+    Just v  -> M.insert k v m
+
+hashAt :: VarName -> Lens' (AttrSet v) (Maybe v)
+hashAt = flip alterF
+
+key :: Applicative f => VarName -> LensLike' f (NValue m) (Maybe (NThunk m))
+key k = baseValue._NVSetF._1.hashAt k
diff --git a/src/Nix/XML.hs b/src/Nix/XML.hs
new file mode 100644
--- /dev/null
+++ b/src/Nix/XML.hs
@@ -0,0 +1,54 @@
+{-# LANGUAGE LambdaCase #-}
+
+module Nix.XML where
+
+import           Data.Fix
+import qualified Data.HashMap.Lazy as M
+import           Data.List
+import           Data.Ord
+import qualified Data.Text as Text
+import           Nix.Atoms
+import           Nix.Expr.Types
+import           Nix.Value
+import           Text.XML.Light
+
+toXML :: Functor m => NValueNF m -> String
+toXML = (.) ((++ "\n") .
+             ("<?xml version='1.0' encoding='utf-8'?>\n" ++) .
+             ppElement .
+             (\e -> Element (unqual "expr") [] [Elem e] Nothing))
+        $ cata
+        $ \case
+    NVConstantF a -> case a of
+        NInt n   -> mkElem "int" "value" (show n)
+        NFloat f -> mkElem "float" "value" (show f)
+        NBool b  -> mkElem "bool" "value" (if b then "true" else "false")
+        NNull    -> Element (unqual "null") [] [] Nothing
+
+    NVStrF t _ -> mkElem "string" "value" (Text.unpack t)
+    NVListF l  -> Element (unqual "list") [] (Elem <$> l) Nothing
+
+    NVSetF s _ -> Element (unqual "attrs") []
+        (map (\(k, v) -> Elem (Element (unqual "attr")
+                                      [Attr (unqual "name") (Text.unpack k)]
+                                      [Elem v] Nothing))
+             (sortBy (comparing fst) $ M.toList s)) Nothing
+
+    NVClosureF p _  -> Element (unqual "function") [] (paramsXML p) Nothing
+    NVPathF fp -> mkElem "path" "value" fp
+    NVBuiltinF name _ -> mkElem "function" "name" name
+
+mkElem :: String -> String -> String -> Element
+mkElem n a v = Element (unqual n) [Attr (unqual a) v] [] Nothing
+
+paramsXML :: Params r -> [Content]
+paramsXML (Param name) =
+    [Elem $ mkElem "varpat" "name" (Text.unpack name)]
+paramsXML (ParamSet s b mname) =
+    [Elem $ Element (unqual "attrspat") (battr ++ nattr) (paramSetXML s) Nothing]
+  where
+    battr = [ Attr (unqual "ellipsis") "1" | b ]
+    nattr = maybe [] ((:[]) . Attr (unqual "name") . Text.unpack) mname
+
+paramSetXML :: ParamSet r -> [Content]
+paramSetXML = map (\(k,_) -> Elem $ mkElem "attr" "name" (Text.unpack k))
diff --git a/tests/EvalTests.hs b/tests/EvalTests.hs
--- a/tests/EvalTests.hs
+++ b/tests/EvalTests.hs
@@ -1,51 +1,291 @@
-{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE OverloadedStrings #-}
-module EvalTests (tests) where
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE UndecidableInstances #-}
 
-import Data.Fix
+{-# OPTIONS_GHC -Wno-missing-signatures -Wno-orphans #-}
 
-import Test.Tasty
-import Test.Tasty.HUnit
-import Test.Tasty.TH
+module EvalTests (tests, genEvalCompareTests) where
 
-import Nix.Eval
-import Nix.Parser
-import Nix.Expr
+import           Control.Monad (when)
+import           Control.Monad.IO.Class
+import qualified Data.HashMap.Lazy as M
+import           Data.Maybe (isJust)
+import           Data.String.Interpolate.IsString
+import           Data.Text (Text)
+import           Data.Time
+import           Nix
+import qualified System.Directory as D
+import           System.Environment
+import           System.FilePath
+import           Test.Tasty
+import           Test.Tasty.HUnit
+import           Test.Tasty.TH
+import           TestCommon
 
-import Data.Monoid (Monoid(..))
-import Prelude (String)
+case_basic_sum =
+    constantEqualText "2" "1 + 1"
 
-case_basic_sum :: Assertion
-case_basic_sum = constantEqualStr "2" "1 + 1"
+case_basic_div =
+    constantEqualText "3" "builtins.div 6 2"
 
-case_basic_function :: Assertion
-case_basic_function = constantEqualStr "2" "(a: a) 2"
+case_basic_function =
+    constantEqualText "2" "(a: a) 2"
 
-case_set_attr :: Assertion
-case_set_attr = constantEqualStr "2" "{ a = 2; }.a"
+case_set_attr =
+    constantEqualText "2" "{ a = 2; }.a"
 
-case_function_set_arg :: Assertion
-case_function_set_arg = constantEqualStr "2" "({ a }: 2) { a = 1; }"
+case_function_set_arg =
+    constantEqualText "2" "({ a }: 2) { a = 1; }"
 
-case_function_set_two_arg :: Assertion
-case_function_set_two_arg = constantEqualStr "2" "({ a, b ? 3 }: b - a) { a = 1; }"
+case_function_set_two_arg =
+    constantEqualText "2" "({ a, b ? 3 }: b - a) { a = 1; }"
 
--- case_function_set_two_arg_default_scope :: Assertion
--- case_function_set_two_arg_default_scope = constantEqualStr "2" "({ a, b ? a * 3 }: b - a) { a = 1; }"
+case_function_set_two_arg_default_scope =
+    constantEqualText "2" "({ x ? 1, y ? x * 3 }: y - x) {}"
 
+case_function_default_env =
+    constantEqualText "2" "let default = 2; in ({ a ? default }: a) {}"
+
+case_function_definition_uses_environment =
+    constantEqualText "3" "let f = (let a=1; in x: x+a); in f 2"
+
+case_function_atpattern =
+    -- jww (2018-05-09): This should be constantEqualText
+    constantEqualText' "2" "(({a}@attrs:attrs) {a=2;}).a"
+
+case_function_ellipsis =
+    -- jww (2018-05-09): This should be constantEqualText
+    constantEqualText' "2" "(({a, ...}@attrs:attrs) {a=0; b=2;}).b"
+
+case_function_default_value_not_in_atpattern =
+    constantEqualText "false" "({a ? 2}@attrs: attrs ? a) {}"
+
+case_function_arg_shadowing =
+    constantEqualText "6" "(y: y: x: x: x + y) 1 2 3 4"
+
+case_function_recursive_args =
+    constantEqualText "2" "({ x ? 1, y ? x * 3}: y - x) {}"
+
+case_function_recursive_sets =
+    constantEqualText "[ [ 6 4 100 ] 4 ]" [i|
+        let x = rec {
+
+          y = 2;
+          z = { w = 4; };
+          v = rec {
+            u = 6;
+            t = [ u z.w s ];
+          };
+
+        }; s = 100; in [ x.v.t x.z.w ]
+    |]
+
+case_nested_with =
+    constantEqualText "2" "with { x = 1; }; with { x = 2; }; x"
+
+case_match_failure_null =
+    constantEqualText "null" "builtins.match \"ab\" \"abc\""
+
+case_inherit_in_rec_set =
+    constantEqualText "1" "let x = 1; in (rec { inherit x; }).x"
+
+case_lang_version =
+    constantEqualText "5" "builtins.langVersion"
+
+case_rec_set_attr_path_simpl =
+    constantEqualText "123" [i|
+      let x = rec {
+        foo.number = 123;
+        foo.function = y: foo.number;
+      }; in x.foo.function 1
+    |]
+
+case_inherit_from_set_has_no_scope =
+    constantEqualText' "false" [i|
+      (builtins.tryEval (
+        let x = 1;
+            y = { z = 2; };
+        in { inherit (y) x; }.x
+      )).success
+    |]
+
+case_unsafegetattrpos1 =
+    constantEqualText "[ 6 21 ]" [i|
+      let e = 1;
+          f = 1;
+          t = {};
+          s = {
+            inherit t e f;
+            a = 1;
+            "b" = 2;
+            c.d = 3;
+          };
+          p = builtins.unsafeGetAttrPos "e" s; in
+      [ p.line p.column ]
+    |]
+
+case_unsafegetattrpos2 =
+    constantEqualText "[ 6 21 ]" [i|
+      let e = 1;
+          f = 1;
+          t = {};
+          s = {
+            inherit t e f;
+            a = 1;
+            "b" = 2;
+            c.d = 3;
+          };
+          p = builtins.unsafeGetAttrPos "f" s; in
+      [ p.line p.column ]
+    |]
+
+case_unsafegetattrpos3 =
+    constantEqualText "[ 7 13 ]" [i|
+      let e = 1;
+          f = 1;
+          t = {};
+          s = {
+            inherit t e f;
+            a = 1;
+            "b" = 2;
+            c.d = 3;
+          };
+          p = builtins.unsafeGetAttrPos "a" s; in
+      [ p.line p.column ]
+    |]
+
+case_unsafegetattrpos4 =
+    constantEqualText "[ 8 13 ]" [i|
+      let e = 1;
+          f = 1;
+          t = {};
+          s = {
+            inherit t e f;
+            a = 1;
+            "b" = 2;
+            c.d = 3;
+          };
+          p = builtins.unsafeGetAttrPos "b" s; in
+      [ p.line p.column ]
+    |]
+
+-- jww (2018-05-09): These two are failing but they shouldn't be
+
+-- case_unsafegetattrpos5 =
+--     constantEqualText "[ 7 13 ]" [i|
+--       let e = 1;
+--           f = 1;
+--           t = {};
+--           s = {
+--             inherit t e f;
+--             a = 1;
+--             "b" = 2;
+--             c.d = 3;
+--           };
+--           p = builtins.unsafeGetAttrPos "c.d" s; in
+--       [ p.line p.column ]
+--     |]
+
+-- case_unsafegetattrpos6 =
+--     constantEqualText "[ 7 13 ]" [i|
+--       let e = 1;
+--           f = 1;
+--           t = {};
+--           s = {
+--             inherit t e f;
+--             a = 1;
+--             "b" = 2;
+--             c.d = 3;
+--           };
+--           p = builtins.unsafeGetAttrPos "d" s; in
+--       [ p.line p.column ]
+--     |]
+
+case_fixed_points =
+    constantEqualText [i|[
+  {
+    foobar = "foobar";
+    foo = "foo";
+    bar = "bar";
+  }
+  {
+    foobar = "foo + bar";
+    foo = "foo + ";
+    bar = "bar";
+  }
+]|] [i|
+    let
+      fix = f: let x = f x; in x;
+      extends = f: rattrs: self:
+        let super = rattrs self; in super // f self super;
+      f = self: { foo = "foo";
+                  bar = "bar";
+                  foobar = self.foo + self.bar; };
+      g = self: super: { foo = super.foo + " + "; };
+    in [ (fix f) (fix (extends g f)) ]
+|]
+
+case_fixed_points_and_fold =
+    constantEqualText [i|[ {} {} ]|] [i|
+let
+  extends = f: rattrs: self:
+    let super = rattrs self; in super // f self super;
+  flip = f: a: b: f b a;
+  toFixFold = builtins.foldl' (flip extends) (self: {}) ([(self: super: {})]);
+  toFix = extends (self: super: {}) (self: {});
+  fix = f: let x = f x; in x;
+in [ (fix toFixFold) (fix toFix) ]
+|]
+
+-- jww (2018-05-02): This constantly changes!
+-- case_placeholder =
+--   constantEqualText
+--       "\"/1rz4g4znpzjwh1xymhjpm42vipw92pr73vdgl6xs1hycac8kf2n9\""
+--       "builtins.placeholder \"out\""
+
+-----------------------
+
 tests :: TestTree
 tests = $testGroupGenerator
 
------------------------
+genEvalCompareTests = do
+    files <- filter ((==".nix") . takeExtension) <$> D.listDirectory testDir
+    return $ testGroup "Eval comparison tests" $ map mkTestCase files
+  where
+    testDir = "tests/eval-compare"
+    mkTestCase f = testCase f $ assertEvalFileMatchesNix (testDir </> f)
 
-constantEqual :: NExpr -> NExpr -> Assertion
+instance (Show r, Show (NValueF m r), Eq r) => Eq (NValueF m r) where
+    NVConstantF x == NVConstantF y = x == y
+    NVStrF x _ == NVStrF y _ = x == y
+    NVListF x == NVListF y = and (zipWith (==) x y)
+    NVSetF x _ == NVSetF y _ =
+        M.keys x == M.keys y &&
+        and (zipWith (==) (M.elems x) (M.elems y))
+    x == y = error $ "Need to add comparison for values: "
+                 ++ show x ++ " == " ++ show y
+
+constantEqual :: NExprLoc -> NExprLoc -> Assertion
 constantEqual a b = do
-    Fix (NVConstant a') <- evalExpr a (Fix (NVSet mempty))
-    Fix (NVConstant b') <- evalExpr b (Fix (NVSet mempty))
+    time <- liftIO getCurrentTime
+    let opts = defaultOptions time
+    -- putStrLn =<< lint (stripAnnotation a)
+    a' <- runLazyM opts $ normalForm =<< nixEvalExprLoc Nothing a
+    -- putStrLn =<< lint (stripAnnotation b)
+    b' <- runLazyM opts $ normalForm =<< nixEvalExprLoc Nothing b
     assertEqual "" a' b'
 
-constantEqualStr :: String -> String -> Assertion
-constantEqualStr a b =
-  let Success a' = parseNixString a
-      Success b' = parseNixString b
-  in constantEqual a' b'
+constantEqualText' :: Text -> Text -> Assertion
+constantEqualText' a b = do
+  let Success a' = parseNixTextLoc a
+      Success b' = parseNixTextLoc b
+  constantEqual a' b'
+
+constantEqualText :: Text -> Text -> Assertion
+constantEqualText a b = do
+  constantEqualText' a b
+  mres <- liftIO $ lookupEnv "MATCHING_TESTS"
+  when (isJust mres) $
+      assertEvalMatchesNix b
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -1,18 +1,104 @@
-module Main where
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE OverloadedStrings #-}
 
-import Test.Tasty
+module Main where
 
-import qualified ParserTests
+import           Control.DeepSeq
+import qualified Control.Exception as Exc
+import           Control.Monad
+import           Control.Monad.IO.Class
+import           Data.Fix
+import           Data.List (isInfixOf)
+import           Data.Maybe (isJust, fromMaybe)
+import           Data.String.Interpolate.IsString
+import           Data.Text (unpack)
+import           Data.Time
 import qualified EvalTests
-import qualified ShorthandTests
+import qualified Nix
+import           Nix.Exec
+import           Nix.Expr.Types
+import           Nix.Options
+import           Nix.Parser
+import           Nix.Value
+import qualified NixLanguageTests
+import qualified ParserTests
 import qualified PrettyTests
+import qualified PrettyParseTests
+import           System.Directory
+import           System.Environment
+import           System.FilePath.Glob
+import           System.Posix.Files
+import           System.Process
+import           Test.Tasty
+import           Test.Tasty.HUnit
 
-import Prelude (IO, ($))
+cabalCorrectlyGenerated :: Assertion
+cabalCorrectlyGenerated = do
+  output <- readCreateProcess (shell "hpack") ""
+  when ("modified manually" `isInfixOf` output) $
+    errorWithoutStackTrace
+      "Edit package.yaml and re-generate hnix.cabal by running \"hpack\""
 
+ensureLangTestsPresent :: Assertion
+ensureLangTestsPresent = do
+  exist <- fileExist "data/nix/tests/local.mk"
+  unless exist $
+    errorWithoutStackTrace $ unlines
+      [ "Directory data/nix does not have any files."
+      , "Did you forget to run"
+          ++ " \"git submodule update --init --recursive\"?" ]
+
+ensureNixpkgsCanParse :: Assertion
+ensureNixpkgsCanParse =
+  consider "default.nix" (parseNixFile "default.nix") $ \case
+    Fix (NAbs (ParamSet params _ _) _) -> do
+      let rev    = getString "rev" params
+          sha256 = getString "sha256" params
+      consider "fetchTarball expression" (pure $ parseNixTextLoc [i|
+        builtins.fetchTarball {
+          url    = "https://github.com/NixOS/nixpkgs/archive/#{rev}.tar.gz";
+          sha256 = "#{sha256}";
+        }|]) $ \expr -> do
+        NVStr dir _ <- do
+            time <- liftIO getCurrentTime
+            runLazyM (defaultOptions time) $ Nix.nixEvalExprLoc Nothing expr
+        files <- globDir1 (compile "**/*.nix") (unpack dir)
+        forM_ files $ \file ->
+          -- Parse and deepseq the resulting expression tree, to ensure the
+          -- parser is fully executed.
+          consider file (parseNixFileLoc file) $ Exc.evaluate . force
+    v -> error $ "Unexpected parse from default.nix: " ++ show v
+ where
+  getExpr   k m = let Just (Just r) = lookup k m in r
+  getString k m =
+      let Fix (NStr (DoubleQuoted [Plain str])) = getExpr k m in str
+
+  consider path action k = action >>= \case
+    Failure err -> errorWithoutStackTrace $
+      "Parsing " ++ path ++ " failed: " ++ show err
+    Success expr -> k expr
+
 main :: IO ()
-main = defaultMain $ testGroup "hnix"
-  [ ParserTests.tests
-  , EvalTests.tests
-  , ShorthandTests.tests
-  , PrettyTests.tests
-  ]
+main = do
+  nixLanguageTests    <- NixLanguageTests.genTests
+  evalComparisonTests <- EvalTests.genEvalCompareTests
+  nixpkgsTestsEnv     <- lookupEnv "NIXPKGS_TESTS"
+  prettyTestsEnv      <- lookupEnv "PRETTY_TESTS"
+
+  pwd <- getCurrentDirectory
+  setEnv "NIX_REMOTE" ("local?root=" ++ pwd ++ "/")
+
+  defaultMain $ testGroup "hnix" $
+    [ testCase "hnix.cabal correctly generated" cabalCorrectlyGenerated ] ++
+    [ ParserTests.tests
+    , EvalTests.tests
+    , PrettyTests.tests ] ++
+    [ PrettyParseTests.tests (read (fromMaybe "0" prettyTestsEnv)) ] ++
+    [ evalComparisonTests ] ++
+    [ testCase "Nix language tests present" ensureLangTestsPresent
+    , nixLanguageTests ] ++
+    [ testCase "Nixpkgs parses without errors" ensureNixpkgsCanParse
+      | isJust nixpkgsTestsEnv ]
+
diff --git a/tests/NixLanguageTests.hs b/tests/NixLanguageTests.hs
new file mode 100644
--- /dev/null
+++ b/tests/NixLanguageTests.hs
@@ -0,0 +1,159 @@
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module NixLanguageTests (genTests) where
+
+import           Control.Arrow ((&&&))
+import           Control.Exception
+import           Control.Monad
+import           Control.Monad.IO.Class
+import           Control.Monad.ST
+import           Data.List (delete, sort)
+import           Data.List.Split (splitOn)
+import           Data.Map (Map)
+import qualified Data.Map as Map
+import qualified Data.Text as Text
+import qualified Data.Text.IO as Text
+import           Data.Time
+import           GHC.Exts
+import           Nix.Lint
+import           Nix.Options
+import           Nix.Options.Parser
+import           Nix.Parser
+import           Nix.Pretty
+import           Nix.Utils
+import           Nix.XML
+import qualified Options.Applicative as Opts
+import           System.Environment
+import           System.FilePath
+import           System.FilePath.Glob (compile, globDir1)
+import           Test.Tasty
+import           Test.Tasty.HUnit
+import           TestCommon
+
+{-
+From (git://nix)/tests/lang.sh we see that
+
+    lang/parse-fail-*.nix -> parsing should fail
+    lang/parse-okay-*.nix -> parsing should succeed
+    lang/eval-fail-*.nix -> eval should fail
+
+    lang/eval-okay-*.{nix,xml} -> eval should succeed,
+        xml dump should be the same as the .xml
+    lang/eval-okay-*.{nix,exp} -> eval should succeed,
+        plain text output should be the same as the .exp
+    lang/eval-okay-*.{nix,exp,flags} -> eval should succeed,
+        plain text output should be the same as the .exp,
+        pass the extra flags to nix-instantiate
+
+    NIX_PATH=lang/dir3:lang/dir4 should be in the environment of all
+        eval-okay-*.nix evaluations
+    TEST_VAR=foo should be in all the environments # for eval-okay-getenv.nix
+-}
+
+groupBy :: Ord k => (v -> k) -> [v] -> Map k [v]
+groupBy key = Map.fromListWith (++) . map (key &&& pure)
+
+genTests :: IO TestTree
+genTests = do
+  testFiles <- sort
+        -- jww (2018-05-07): Temporarily disable this test until #128 is fixed.
+      . filter ((/= "eval-okay-path") . takeBaseName)
+      . filter ((/= ".xml") . takeExtension)
+      <$> globDir1 (compile "*-*-*.*") "data/nix/tests/lang"
+  let testsByName = groupBy (takeFileName . dropExtensions) testFiles
+  let testsByType = groupBy testType (Map.toList testsByName)
+  let testGroups  = map mkTestGroup (Map.toList testsByType)
+  return $ localOption (mkTimeout 2000000)
+         $ testGroup "Nix (upstream) language tests" testGroups
+  where
+    testType (fullpath, _files) =
+        take 2 $ splitOn "-" $ takeFileName fullpath
+    mkTestGroup (kind, tests) =
+        testGroup (unwords kind) $ map (mkTestCase kind) tests
+    mkTestCase kind (basename, files) =
+        testCase (takeFileName basename) $ do
+            time <- liftIO getCurrentTime
+            let opts = defaultOptions time
+            case kind of
+                ["parse", "okay"] -> assertParse opts $ the files
+                ["parse", "fail"] -> assertParseFail opts $ the files
+                ["eval", "okay"]  -> assertEval opts files
+                ["eval", "fail"]  -> assertEvalFail $ the files
+                _ -> error $ "Unexpected: " ++ show kind
+
+assertParse :: Options -> FilePath -> Assertion
+assertParse _opts file = parseNixFileLoc file >>= \case
+  Success _expr -> return () -- pure $! runST $ void $ lint opts expr
+  Failure err  ->
+      assertFailure $ "Failed to parse " ++ file ++ ":\n" ++ show err
+
+assertParseFail :: Options -> FilePath -> Assertion
+assertParseFail opts file = do
+    eres <- parseNixFileLoc file
+    catch (case eres of
+               Success expr -> do
+                   _ <- pure $! runST $ void $ lint opts expr
+                   assertFailure $ "Unexpected success parsing `"
+                       ++ file ++ ":\nParsed value: " ++ show expr
+               Failure _ -> return ()) $ \(_ :: SomeException) ->
+        return ()
+
+assertLangOk :: Options -> FilePath -> Assertion
+assertLangOk opts file = do
+  actual <- printNix <$> hnixEvalFile opts (file ++ ".nix")
+  expected <- Text.readFile $ file ++ ".exp"
+  assertEqual "" expected $ Text.pack (actual ++ "\n")
+
+assertLangOkXml :: Options -> FilePath -> Assertion
+assertLangOkXml opts file = do
+  actual <- toXML <$> hnixEvalFile opts (file ++ ".nix")
+  expected <- Text.readFile $ file ++ ".exp.xml"
+  assertEqual "" expected $ Text.pack actual
+
+assertEval :: Options -> [FilePath] -> Assertion
+assertEval _opts files = do
+    time <- liftIO getCurrentTime
+    let opts = defaultOptions time
+    case delete ".nix" $ sort $ map takeExtensions files of
+        [] -> () <$ hnixEvalFile opts (name ++ ".nix")
+        [".exp"] -> assertLangOk opts name
+        [".exp.xml"] -> assertLangOkXml opts name
+        [".exp.disabled"] -> return ()
+        [".exp-disabled"] -> return ()
+        [".exp", ".flags"] -> do
+            liftIO $ unsetEnv "NIX_PATH"
+            flags <- Text.readFile (name ++ ".flags")
+            let flags' | Text.last flags == '\n' = Text.init flags
+                       | otherwise = flags
+            case Opts.execParserPure Opts.defaultPrefs (nixOptionsInfo time)
+                     (fixup (map Text.unpack (Text.splitOn " " flags'))) of
+                Opts.Failure err -> errorWithoutStackTrace $
+                    "Error parsing flags from " ++ name ++ ".flags: "
+                        ++ show err
+                Opts.Success opts' ->
+                    assertLangOk
+                        (opts' { include = include opts' ++
+                                   [ "nix=../../../../data/nix/corepkgs"
+                                   , "lang/dir4"
+                                   , "lang/dir5" ] })
+                        name
+                Opts.CompletionInvoked _ -> error "unused"
+        _ -> assertFailure $ "Unknown test type " ++ show files
+  where
+    name = "data/nix/tests/lang/"
+        ++ the (map (takeFileName . dropExtensions) files)
+
+    fixup ("--arg":x:y:rest) = "--arg":(x ++ "=" ++ y):fixup rest
+    fixup ("--argstr":x:y:rest) = "--argstr":(x ++ "=" ++ y):fixup rest
+    fixup (x:rest) = x:fixup rest
+    fixup [] = []
+
+assertEvalFail :: FilePath -> Assertion
+assertEvalFail file = catch ?? (\(_ :: SomeException) -> return ()) $ do
+  time <- liftIO getCurrentTime
+  evalResult <- printNix <$> hnixEvalFile (defaultOptions time) file
+  evalResult `seq` assertFailure $
+      file ++ " should not evaluate.\nThe evaluation result was `"
+           ++ evalResult ++ "`."
diff --git a/tests/ParserTests.hs b/tests/ParserTests.hs
--- a/tests/ParserTests.hs
+++ b/tests/ParserTests.hs
@@ -1,131 +1,133 @@
+{-# LANGUAGE QuasiQuotes #-}
 {-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE OverloadedStrings #-}
-module ParserTests (tests) where
+{-# LANGUAGE RankNTypes #-}
 
-import Data.Fix
-import Data.Text (pack)
-import Test.Tasty
-import Test.Tasty.HUnit
-import Test.Tasty.TH
+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
+{-# OPTIONS_GHC -Wno-missing-signatures -Wno-orphans #-}
 
-import qualified Data.Map as Map
+module ParserTests (tests) where
 
+import Data.Fix
+import Data.List.NonEmpty (NonEmpty(..))
+import Data.Semigroup
+import Data.String.Interpolate.IsString
+import Data.Text (Text, unpack, pack)
 import Nix.Atoms
 import Nix.Expr
 import Nix.Parser
-import Nix.StringOperations
-
-import Prelude
+import Nix.Pretty
+import Test.Tasty
+import Test.Tasty.HUnit
+import Test.Tasty.TH
+import Text.PrettyPrint.ANSI.Leijen hiding ((<$>), (<>))
 
-case_constant_int :: Assertion
-case_constant_int = assertParseString "234" $ mkInt 234
+case_constant_int = assertParseText "234" $ mkInt 234
 
-case_constant_bool :: Assertion
 case_constant_bool = do
-  assertParseString "true" $ mkBool True
-  assertParseString "false" $ mkBool False
+  assertParseText "true" $ mkBool True
+  assertParseText "false" $ mkBool False
 
-case_constant_path :: Assertion
+case_constant_bool_respects_attributes = do
+  assertParseText "true-foo"  $ mkSym "true-foo"
+  assertParseText "false-bar" $ mkSym "false-bar"
+
 case_constant_path = do
-  assertParseString "./." $ mkPath False "./."
-  assertParseString "./+-_/cdef/09ad+-" $ mkPath False "./+-_/cdef/09ad+-"
-  assertParseString "/abc" $ mkPath False "/abc"
-  assertParseString "../abc" $ mkPath False "../abc"
-  assertParseString "<abc>" $ mkPath True "abc"
-  assertParseString "<../cdef>" $ mkPath True "../cdef"
-  assertParseString "a//b" $ mkOper2 NUpdate (mkSym "a") (mkSym "b")
-  assertParseString "rec+def/cdef" $ mkPath False "rec+def/cdef"
-  assertParseString "a/b//c/def//<g> < def/d" $ mkOper2 NLt
+  assertParseText "./." $ mkPath False "./."
+  assertParseText "./+-_/cdef/09ad+-" $ mkPath False "./+-_/cdef/09ad+-"
+  assertParseText "/abc" $ mkPath False "/abc"
+  assertParseText "../abc" $ mkPath False "../abc"
+  assertParseText "<abc>" $ mkPath True "abc"
+  assertParseText "<../cdef>" $ mkPath True "../cdef"
+  assertParseText "a//b" $ mkOper2 NUpdate (mkSym "a") (mkSym "b")
+  assertParseText "rec+def/cdef" $ mkPath False "rec+def/cdef"
+  assertParseText "a/b//c/def//<g> < def/d" $ mkOper2 NLt
     (mkOper2 NUpdate (mkPath False "a/b") $ mkOper2 NUpdate
       (mkPath False "c/def") (mkPath True "g"))
     (mkPath False "def/d")
-  assertParseString "a'b/c" $ Fix $ NApp (mkSym "a'b") (mkPath False "/c")
+  assertParseText "a'b/c" $ Fix $ NBinary NApp (mkSym "a'b") (mkPath False "/c")
+  assertParseText "a/b" $ mkPath False "a/b"
+  assertParseText "4/2" $ mkPath False "4/2"
   assertParseFail "."
   assertParseFail ".."
   assertParseFail "/"
   assertParseFail "a/"
   assertParseFail "a/def/"
+  assertParseFail "~"
+  assertParseFail "~/"
+  assertParseText "~/a" $ mkPath False "~/a"
+  assertParseText "~/a/b" $ mkPath False "~/a/b"
 
-case_constant_uri :: Assertion
 case_constant_uri = do
-  assertParseString "a:a" $ mkUri "a:a"
-  assertParseString "http://foo.bar" $ mkUri "http://foo.bar"
-  assertParseString "a+de+.adA+-:%%%ads%5asdk&/" $ mkUri "a+de+.adA+-:%%%ads%5asdk&/"
-  assertParseString "rec+def:c" $ mkUri "rec+def:c"
-  assertParseString "f.foo:bar" $ mkUri "f.foo:bar"
+  assertParseText "a:a" $ mkStr "a:a"
+  assertParseText "http://foo.bar" $ mkStr "http://foo.bar"
+  assertParseText "a+de+.adA+-:%%%ads%5asdk&/" $ mkStr "a+de+.adA+-:%%%ads%5asdk&/"
+  assertParseText "rec+def:c" $ mkStr "rec+def:c"
+  assertParseText "f.foo:bar" $ mkStr "f.foo:bar"
   assertParseFail "http://foo${\"bar\"}"
   assertParseFail ":bcdef"
   assertParseFail "a%20:asda"
   assertParseFail ".:adasd"
   assertParseFail "+:acdcd"
 
-case_simple_set :: Assertion
 case_simple_set = do
-  assertParseString "{ a = 23; b = 4; }" $ Fix $ NSet
-    [ NamedVar (mkSelector "a") $ mkInt 23
-    , NamedVar (mkSelector "b") $ mkInt 4
+  assertParseText "{ a = 23; b = 4; }" $ Fix $ NSet
+    [ NamedVar (mkSelector "a") (mkInt 23) nullPos
+    , NamedVar (mkSelector "b") (mkInt 4) nullPos
     ]
   assertParseFail "{ a = 23 }"
 
-case_set_inherit :: Assertion
 case_set_inherit = do
-  assertParseString "{ e = 3; inherit a b; }" $ Fix $ NSet
-    [ NamedVar (mkSelector "e") $ mkInt 3
-    , Inherit Nothing $ StaticKey <$> ["a", "b"]
+  assertParseText "{ e = 3; inherit a b; }" $ Fix $ NSet
+    [ NamedVar (mkSelector "e") (mkInt 3) nullPos
+    , Inherit Nothing (StaticKey <$> ["a", "b"]) nullPos
     ]
-  assertParseString "{ inherit; }" $ Fix $ NSet [ Inherit Nothing [] ]
+  assertParseText "{ inherit; }" $ Fix $ NSet [ Inherit Nothing [] nullPos ]
 
-case_set_scoped_inherit :: Assertion
-case_set_scoped_inherit = assertParseString "{ inherit (a) b c; e = 4; inherit(a)b c; }" $ Fix $ NSet
-  [ Inherit (Just (mkSym "a")) $ StaticKey <$> ["b", "c"]
-  , NamedVar (mkSelector "e") $ mkInt 4
-  , Inherit (Just (mkSym "a")) $ StaticKey <$> ["b", "c"]
+case_set_scoped_inherit = assertParseText "{ inherit (a) b c; e = 4; inherit(a)b c; }" $ Fix $ NSet
+  [ Inherit (Just (mkSym "a")) (StaticKey <$> ["b", "c"]) nullPos
+  , NamedVar (mkSelector "e") (mkInt 4) nullPos
+  , Inherit (Just (mkSym "a")) (StaticKey <$> ["b", "c"]) nullPos
   ]
 
-case_set_rec :: Assertion
-case_set_rec = assertParseString "rec { a = 3; b = a; }" $ Fix $ NRecSet
-  [ NamedVar (mkSelector "a") $ mkInt 3
-  , NamedVar (mkSelector "b") $ mkSym "a"
+case_set_rec = assertParseText "rec { a = 3; b = a; }" $ Fix $ NRecSet
+  [ NamedVar (mkSelector "a") (mkInt 3) nullPos
+  , NamedVar (mkSelector "b") (mkSym "a") nullPos
   ]
 
-case_set_complex_keynames :: Assertion
 case_set_complex_keynames = do
-  assertParseString "{ \"\" = null; }" $ Fix $ NSet
-    [ NamedVar [DynamicKey (Plain "")] mkNull ]
-  assertParseString "{ a.b = 3; a.c = 4; }" $ Fix $ NSet
-    [ NamedVar [StaticKey "a", StaticKey "b"] $ mkInt 3
-    , NamedVar [StaticKey "a", StaticKey "c"] $ mkInt 4
+  assertParseText "{ \"\" = null; }" $ Fix $ NSet
+    [ NamedVar (DynamicKey (Plain (DoubleQuoted [])) :| []) mkNull nullPos ]
+  assertParseText "{ a.b = 3; a.c = 4; }" $ Fix $ NSet
+    [ NamedVar (StaticKey "a" :| [StaticKey "b"]) (mkInt 3) nullPos
+    , NamedVar (StaticKey "a" :| [StaticKey "c"]) (mkInt 4) nullPos
     ]
-  assertParseString "{ ${let a = \"b\"; in a} = 4; }" $ Fix $ NSet
-    [ NamedVar [DynamicKey (Antiquoted letExpr)] $ mkInt 4 ]
-  assertParseString "{ \"a${let a = \"b\"; in a}c\".e = 4; }" $ Fix $ NSet
-    [ NamedVar [DynamicKey (Plain str), StaticKey "e"] $ mkInt 4 ]
+  assertParseText "{ ${let a = \"b\"; in a} = 4; }" $ Fix $ NSet
+    [ NamedVar (DynamicKey (Antiquoted letExpr) :| []) (mkInt 4) nullPos ]
+  assertParseText "{ \"a${let a = \"b\"; in a}c\".e = 4; }" $ Fix $ NSet
+    [ NamedVar (DynamicKey (Plain str) :| [StaticKey "e"]) (mkInt 4) nullPos ]
  where
-  letExpr = Fix $ NLet [ NamedVar (mkSelector "a") (mkStr "b") ] (mkSym "a")
+  letExpr = Fix $ NLet [NamedVar (mkSelector "a") (mkStr "b") nullPos] (mkSym "a")
   str = DoubleQuoted [Plain "a", Antiquoted letExpr, Plain "c"]
 
-case_set_inherit_direct :: Assertion
-case_set_inherit_direct = assertParseString "{ inherit ({a = 3;}); }" $ Fix $ NSet
-  [ flip Inherit [] $ Just $ Fix $ NSet [NamedVar (mkSelector "a") $ mkInt 3]
+case_set_inherit_direct = assertParseText "{ inherit ({a = 3;}); }" $ Fix $ NSet
+  [ Inherit (Just $ Fix $ NSet [NamedVar (mkSelector "a") (mkInt 3) nullPos]) [] nullPos
   ]
 
-case_inherit_selector :: Assertion
 case_inherit_selector = do
-  assertParseString "{ inherit \"a\"; }" $ Fix $ NSet
-    [Inherit Nothing [DynamicKey (Plain "a")]]
+  assertParseText "{ inherit \"a\"; }" $ Fix $ NSet
+    [Inherit Nothing [DynamicKey (Plain (DoubleQuoted [Plain "a"]))] nullPos]
   assertParseFail "{ inherit a.x; }"
 
-case_int_list :: Assertion
-case_int_list = assertParseString "[1 2 3]" $ Fix $ NList
+case_int_list = assertParseText "[1 2 3]" $ Fix $ NList
   [ mkInt i | i <- [1,2,3] ]
 
-case_int_null_list :: Assertion
-case_int_null_list = assertParseString "[1 2 3 null 4]" $ Fix (NList (map (Fix . NConstant) [NInt 1, NInt 2, NInt 3, NNull, NInt 4]))
+case_int_null_list = assertParseText "[1 2 3 null 4]" $ Fix (NList (map (Fix . NConstant) [NInt 1, NInt 2, NInt 3, NNull, NInt 4]))
 
-case_mixed_list :: Assertion
 case_mixed_list = do
-  assertParseString "[{a = 3;}.a (if true then null else false) null false 4 [] c.d or null]" $ Fix $ NList
-    [ Fix (NSelect (Fix (NSet [NamedVar (mkSelector "a") (mkInt 3)])) (mkSelector "a") Nothing)
+  assertParseText "[{a = 3;}.a (if true then null else false) null false 4 [] c.d or null]" $ Fix $ NList
+    [ Fix (NSelect (Fix (NSet [NamedVar (mkSelector "a") (mkInt 3) nullPos]))
+                   (mkSelector "a") Nothing)
     , Fix (NIf (mkBool True) mkNull (mkBool False))
     , mkNull, mkBool False, mkInt 4, Fix (NList [])
     , Fix (NSelect (mkSym "c") (mkSelector "d") (Just mkNull))
@@ -135,161 +137,156 @@
   assertParseFail "[a : a]"
   assertParseFail "[${\"test\")]"
 
-case_simple_lambda :: Assertion
-case_simple_lambda = assertParseString "a: a" $ Fix $ NAbs (Param "a") (mkSym "a")
+case_simple_lambda = assertParseText "a: a" $ Fix $ NAbs (Param "a") (mkSym "a")
 
-case_lambda_or_uri :: Assertion
 case_lambda_or_uri = do
-  assertParseString "a :b" $ Fix $ NAbs (Param "a") (mkSym "b")
-  assertParseString "a c:def" $ Fix $ NApp (mkSym "a") (mkUri "c:def")
-  assertParseString "c:def: c" $ Fix $ NApp (mkUri "c:def:") (mkSym "c")
-  assertParseString "a:{}" $ Fix $ NAbs (Param "a") $ Fix $ NSet []
-  assertParseString "a:[a]" $ Fix $ NAbs (Param "a") $ Fix $ NList [mkSym "a"]
+  assertParseText "a :b" $ Fix $ NAbs (Param "a") (mkSym "b")
+  assertParseText "a c:def" $ Fix $ NBinary NApp (mkSym "a") (mkStr "c:def")
+  assertParseText "c:def: c" $ Fix $ NBinary NApp (mkStr "c:def:") (mkSym "c")
+  assertParseText "a:{}" $ Fix $ NAbs (Param "a") $ Fix $ NSet []
+  assertParseText "a:[a]" $ Fix $ NAbs (Param "a") $ Fix $ NList [mkSym "a"]
   assertParseFail "def:"
 
-case_lambda_pattern :: Assertion
 case_lambda_pattern = do
-  assertParseString "{b, c ? 1}: b" $
+  assertParseText "{b, c ? 1}: b" $
     Fix $ NAbs (fixed args Nothing) (mkSym "b")
-  assertParseString "{ b ? x: x  }: b" $
+  assertParseText "{ b ? x: x  }: b" $
     Fix $ NAbs (fixed args2 Nothing) (mkSym "b")
-  assertParseString "a@{b,c ? 1}: b" $
+  assertParseText "a@{b,c ? 1}: b" $
     Fix $ NAbs (fixed args (Just "a")) (mkSym "b")
-  assertParseString "{b,c?1}@a: c" $
+  assertParseText "{b,c?1}@a: c" $
     Fix $ NAbs (fixed args (Just "a")) (mkSym "c")
-  assertParseString "{b,c?1,...}@a: c" $
+  assertParseText "{b,c?1,...}@a: c" $
     Fix $ NAbs (variadic vargs (Just "a")) (mkSym "c")
-  assertParseString "{...}: 1" $
+  assertParseText "{...}: 1" $
     Fix $ NAbs (variadic mempty Nothing) (mkInt 1)
   assertParseFail "a@b: a"
   assertParseFail "{a}@{b}: a"
  where
-  fixed args mname = ParamSet (FixedParamSet args) mname
-  variadic args mname = ParamSet (VariadicParamSet args) mname
-  args = Map.fromList [("b", Nothing), ("c", Just $ mkInt 1)]
-  vargs = Map.fromList [("b", Nothing), ("c", Just $ mkInt 1)]
-  args2 = Map.fromList [("b", Just lam)]
+  fixed args = ParamSet args False
+  variadic args = ParamSet args True
+  args = [("b", Nothing), ("c", Just $ mkInt 1)]
+  vargs = [("b", Nothing), ("c", Just $ mkInt 1)]
+  args2 = [("b", Just lam)]
   lam = Fix $ NAbs (Param "x") (mkSym "x")
 
-case_lambda_app_int :: Assertion
-case_lambda_app_int = assertParseString "(a: a) 3" $ Fix (NApp lam int) where
+case_lambda_app_int = assertParseText "(a: a) 3" $ Fix (NBinary NApp lam int) where
   int = mkInt 3
   lam = Fix (NAbs (Param "a") asym)
   asym = mkSym "a"
 
-case_simple_let :: Assertion
 case_simple_let = do
-  assertParseString "let a = 4; in a" $ Fix (NLet binds $ mkSym "a")
+  assertParseText "let a = 4; in a" $ Fix (NLet binds $ mkSym "a")
   assertParseFail "let a = 4 in a"
  where
-  binds = [NamedVar (mkSelector "a") $ mkInt 4]
+  binds = [NamedVar (mkSelector "a") (mkInt 4) nullPos]
 
-case_nested_let :: Assertion
+case_let_body = assertParseText "let { body = 1; }" letBody
+  where
+    letBody = Fix $ NSelect aset (mkSelector "body") Nothing
+    aset = Fix $ NRecSet [NamedVar (mkSelector "body") (mkInt 1) nullPos]
+
 case_nested_let = do
-  assertParseString "let a = 4; in let b = 5; in a" $ Fix $ NLet
-    [ NamedVar (mkSelector "a") $ mkInt 4 ]
-    (Fix $ NLet [NamedVar (mkSelector "b") $ mkInt 5] $ mkSym "a")
+  assertParseText "let a = 4; in let b = 5; in a" $ Fix $ NLet
+    [NamedVar (mkSelector "a") (mkInt 4) nullPos]
+    (Fix $ NLet [NamedVar (mkSelector "b") (mkInt 5) nullPos] $ mkSym "a")
   assertParseFail "let a = 4; let b = 3; in b"
 
-case_let_scoped_inherit :: Assertion
 case_let_scoped_inherit = do
-  assertParseString "let a = null; inherit (b) c; in c" $ Fix $ NLet
-    [ NamedVar (mkSelector "a") mkNull
-    , Inherit (Just $ mkSym "b") [StaticKey "c"] ]
+  assertParseText "let a = null; inherit (b) c; in c" $ Fix $ NLet
+    [ NamedVar (mkSelector "a") mkNull nullPos
+    , Inherit (Just $ mkSym "b") [StaticKey "c"] nullPos ]
     (mkSym "c")
   assertParseFail "let inherit (b) c in c"
 
-case_if :: Assertion
 case_if = do
-  assertParseString "if true then true else false" $ Fix $ NIf (mkBool True) (mkBool True) (mkBool False)
+  assertParseText "if true then true else false" $
+      Fix $ NIf (mkBool True) (mkBool True) (mkBool False)
   assertParseFail "if true then false"
   assertParseFail "else"
   assertParseFail "if true then false else"
   assertParseFail "if true then false else false else"
   assertParseFail "1 + 2 then"
 
-case_identifier_special_chars :: Assertion
 case_identifier_special_chars = do
-  assertParseString "_a" $ mkSym "_a"
-  assertParseString "a_b" $ mkSym "a_b"
-  assertParseString "a'b" $ mkSym "a'b"
-  assertParseString "a''b" $ mkSym "a''b"
-  assertParseString "a-b" $ mkSym "a-b"
-  assertParseString "a--b" $ mkSym "a--b"
-  assertParseString "a12a" $ mkSym "a12a"
+  assertParseText "_a" $ mkSym "_a"
+  assertParseText "a_b" $ mkSym "a_b"
+  assertParseText "a'b" $ mkSym "a'b"
+  assertParseText "a''b" $ mkSym "a''b"
+  assertParseText "a-b" $ mkSym "a-b"
+  assertParseText "a--b" $ mkSym "a--b"
+  assertParseText "a12a" $ mkSym "a12a"
   assertParseFail ".a"
   assertParseFail "'a"
 
-case_identifier_keyword_prefix :: Assertion
 case_identifier_keyword_prefix = do
-  assertParseString "true-name" $ mkSym "true-name"
-  assertParseString "trueName" $ mkSym "trueName"
-  assertParseString "null-name" $ mkSym "null-name"
-  assertParseString "nullName" $ mkSym "nullName"
-  assertParseString "[ null-name ]" $ mkList [ mkSym "null-name" ]
+  assertParseText "true-name" $ mkSym "true-name"
+  assertParseText "trueName" $ mkSym "trueName"
+  assertParseText "null-name" $ mkSym "null-name"
+  assertParseText "nullName" $ mkSym "nullName"
+  assertParseText "[ null-name ]" $ mkList [ mkSym "null-name" ]
 
-makeStringParseTest :: String -> Assertion
-makeStringParseTest str = assertParseString ("\"" ++ str ++ "\"") $ mkStr $ pack str
+makeTextParseTest str = assertParseText ("\"" <> str <> "\"") $ mkStr str
 
-case_simple_string :: Assertion
-case_simple_string = mapM_ makeStringParseTest ["abcdef", "a", "A", "   a a  ", ""]
+case_simple_string = mapM_ makeTextParseTest ["abcdef", "a", "A", "   a a  ", ""]
 
-case_string_dollar :: Assertion
-case_string_dollar = mapM_ makeStringParseTest ["a$b", "a$$b", "$cdef", "gh$i"]
+case_string_dollar = mapM_ makeTextParseTest ["a$b", "a$$b", "$cdef", "gh$i"]
 
-case_string_escape :: Assertion
 case_string_escape = do
-  assertParseString "\"\\$\\n\\t\\r\\\\\"" $ mkStr "$\n\t\r\\"
-  assertParseString "\" \\\" \\' \"" $ mkStr " \" ' "
+  assertParseText "\"\\$\\n\\t\\r\\\\\"" $ mkStr "$\n\t\r\\"
+  assertParseText "\" \\\" \\' \"" $ mkStr " \" ' "
 
-case_string_antiquote :: Assertion
 case_string_antiquote = do
-  assertParseString "\"abc${  if true then \"def\" else \"abc\"  } g\"" $
+  assertParseText "\"abc${  if true then \"def\" else \"abc\"  } g\"" $
     Fix $ NStr $ DoubleQuoted
       [ Plain "abc"
       , Antiquoted $ Fix $ NIf (mkBool True) (mkStr "def") (mkStr "abc")
       , Plain " g"
       ]
-  assertParseString "\"\\${a}\"" $ mkStr "${a}"
+  assertParseText "\"\\${a}\"" $ mkStr "${a}"
   assertParseFail "\"a"
   assertParseFail "${true}"
   assertParseFail "\"${true\""
 
-case_select :: Assertion
 case_select = do
-  assertParseString "a .  e .di. f" $ Fix $ NSelect (mkSym "a")
-    [ StaticKey "e", StaticKey "di", StaticKey "f" ]
+  assertParseText "a .  e .di. f" $ Fix $ NSelect (mkSym "a")
+    (StaticKey "e" :| [StaticKey "di", StaticKey "f"])
     Nothing
-  assertParseString "a.e . d    or null" $ Fix $ NSelect (mkSym "a")
-    [ StaticKey "e", StaticKey "d" ]
+  assertParseText "a.e . d    or null" $ Fix $ NSelect (mkSym "a")
+    (StaticKey "e" :| [StaticKey "d"])
     (Just mkNull)
-  assertParseString "{}.\"\"or null" $ Fix $ NSelect (Fix (NSet []))
-    [ DynamicKey (Plain "") ] (Just mkNull)
+  assertParseText "{}.\"\"or null" $ Fix $ NSelect (Fix (NSet []))
+    (DynamicKey (Plain (DoubleQuoted [])) :| []) (Just mkNull)
+  assertParseText "{ a = [1]; }.a or [2] ++ [3]" $ Fix $ NBinary NConcat
+      (Fix (NSelect
+                (Fix (NSet [NamedVar (StaticKey "a" :| [])
+                                     (Fix (NList [Fix (NConstant (NInt 1))]))
+                                     nullPos]))
+                (StaticKey "a" :| [])
+                (Just (Fix (NList [Fix (NConstant (NInt 2))])))))
+      (Fix (NList [Fix (NConstant (NInt 3))]))
 
-case_select_path :: Assertion
 case_select_path = do
-  assertParseString "f ./." $ Fix $ NApp (mkSym "f") (mkPath False "./.")
-  assertParseString "f.b ../a" $ Fix $ NApp select (mkPath False "../a")
-  assertParseString "{}./def" $ Fix $ NApp (Fix (NSet [])) (mkPath False "./def")
-  assertParseString "{}.\"\"./def" $ Fix $ NApp
-    (Fix $ NSelect (Fix (NSet [])) [DynamicKey (Plain "")] Nothing)
+  assertParseText "f ./." $ Fix $ NBinary NApp (mkSym "f") (mkPath False "./.")
+  assertParseText "f.b ../a" $ Fix $ NBinary NApp select (mkPath False "../a")
+  assertParseText "{}./def" $ Fix $ NBinary NApp (Fix (NSet [])) (mkPath False "./def")
+  assertParseText "{}.\"\"./def" $ Fix $ NBinary NApp
+    (Fix $ NSelect (Fix (NSet [])) (DynamicKey (Plain (DoubleQuoted [])) :| []) Nothing)
     (mkPath False "./def")
  where select = Fix $ NSelect (mkSym "f") (mkSelector "b") Nothing
 
-case_fun_app :: Assertion
 case_fun_app = do
-  assertParseString "f a b" $ Fix $ NApp (Fix $ NApp (mkSym "f") (mkSym "a")) (mkSym "b")
-  assertParseString "f a.x or null" $ Fix $ NApp (mkSym "f") $ Fix $
+  assertParseText "f a b" $ Fix $ NBinary NApp (Fix $ NBinary NApp (mkSym "f") (mkSym "a")) (mkSym "b")
+  assertParseText "f a.x or null" $ Fix $ NBinary NApp (mkSym "f") $ Fix $
     NSelect (mkSym "a") (mkSelector "x") (Just mkNull)
   assertParseFail "f if true then null else null"
 
-case_indented_string :: Assertion
 case_indented_string = do
-  assertParseString "''a''" $ mkIndentedStr "a"
-  assertParseString "''\n  foo\n  bar''" $ mkIndentedStr "foo\nbar"
-  assertParseString "''        ''" $ mkIndentedStr ""
-  assertParseString "'''''''" $ mkIndentedStr "''"
-  assertParseString "''   ${null}\n   a${null}''" $ Fix $ NStr $ Indented
+  assertParseText "''a''" $ mkIndentedStr 0 "a"
+  assertParseText "''\n  foo\n  bar''" $ mkIndentedStr 2 "foo\nbar"
+  assertParseText "''        ''" $ mkIndentedStr 0 ""
+  assertParseText "'''''''" $ mkIndentedStr 0 "''"
+  assertParseText "''   ${null}\n   a${null}''" $ Fix $ NStr $ Indented 3
     [ Antiquoted mkNull
     , Plain "\na"
     , Antiquoted mkNull
@@ -297,58 +294,106 @@
   assertParseFail "'''''"
   assertParseFail "''   '"
 
-case_indented_string_escape :: Assertion
-case_indented_string_escape = assertParseString
+case_indented_string_escape = assertParseText
   "'' ''\\n ''\\t ''\\\\ ''${ \\ \\n ' ''' ''" $
-  mkIndentedStr  "\n \t \\ ${ \\ \\n ' '' "
+  mkIndentedStr 1 "\n \t \\ ${ \\ \\n ' '' "
 
-case_operator_fun_app :: Assertion
 case_operator_fun_app = do
-  assertParseString "a ++ b" $ mkOper2 NConcat (mkSym "a") (mkSym "b")
-  assertParseString "a ++ f b" $ mkOper2 NConcat (mkSym "a") $ Fix $ NApp
+  assertParseText "a ++ b" $ mkOper2 NConcat (mkSym "a") (mkSym "b")
+  assertParseText "a ++ f b" $ mkOper2 NConcat (mkSym "a") $ Fix $ NBinary NApp
     (mkSym "f") (mkSym "b")
 
-case_operators :: Assertion
 case_operators = do
-  assertParseString "1 + 2 - 3" $ mkOper2 NMinus
+  assertParseText "1 + 2 - 3" $ mkOper2 NMinus
     (mkOper2 NPlus (mkInt 1) (mkInt 2)) (mkInt 3)
   assertParseFail "1 + if true then 1 else 2"
-  assertParseString "1 + (if true then 2 else 3)" $ mkOper2 NPlus (mkInt 1) $ Fix $ NIf
+  assertParseText "1 + (if true then 2 else 3)" $ mkOper2 NPlus (mkInt 1) $ Fix $ NIf
    (mkBool True) (mkInt 2) (mkInt 3)
-  assertParseString "{ a = 3; } // rec { b = 4; }" $ mkOper2 NUpdate
-    (Fix $ NSet [NamedVar (mkSelector "a") (mkInt 3)])
-    (Fix $ NRecSet [NamedVar (mkSelector "b") (mkInt 4)])
-  assertParseString "--a" $ mkOper NNeg $ mkOper NNeg $ mkSym "a"
-  assertParseString "a - b - c" $ mkOper2 NMinus
+  assertParseText "{ a = 3; } // rec { b = 4; }" $ mkOper2 NUpdate
+    (Fix $ NSet [NamedVar (mkSelector "a") (mkInt 3) nullPos])
+    (Fix $ NRecSet [NamedVar (mkSelector "b") (mkInt 4) nullPos])
+  assertParseText "--a" $ mkOper NNeg $ mkOper NNeg $ mkSym "a"
+  assertParseText "a - b - c" $ mkOper2 NMinus
     (mkOper2 NMinus (mkSym "a") (mkSym "b")) $
     mkSym "c"
-  assertParseString "foo<bar" $ mkOper2 NLt (mkSym "foo") (mkSym "bar")
+  assertParseText "foo<bar" $ mkOper2 NLt (mkSym "foo") (mkSym "bar")
   assertParseFail "+ 3"
   assertParseFail "foo +"
 
-case_comments :: Assertion
 case_comments = do
   Success expected <- parseNixFile "data/let.nix"
   assertParseFile "let-comments-multiline.nix" expected
   assertParseFile "let-comments.nix" expected
 
+case_select_or_precedence =
+    assertParsePrint [i|let
+  matchDef = def:   matcher:
+                      v:   let
+                             case = builtins.head (builtins.attrNames v);
+                           in (matcher.case or def case) (v.case);
+in null|] [i|let
+  matchDef = def:
+    matcher:
+      v:
+        let
+          case = builtins.head (builtins.attrNames v);
+        in (matcher.case or def) case (v.case);
+in null|]
+
+case_select_or_precedence2 =
+    assertParsePrint [i|let
+  matchDef = def:   matcher:
+                      v:   let
+                             case = builtins.head (builtins.attrNames v);
+                           in (matcher.case or null.foo) (v.case);
+in null|] [i|let
+  matchDef = def:
+    matcher:
+      v:
+        let
+          case = builtins.head (builtins.attrNames v);
+        in (matcher.case or null).foo (v.case);
+in null|]
+
 tests :: TestTree
 tests = $testGroupGenerator
 
 --------------------------------------------------------------------------------
-assertParseString :: String -> NExpr -> Assertion
-assertParseString str expected = case parseNixString str of
-  Success actual -> assertEqual ("When parsing " ++ str) expected actual
-  Failure err    -> assertFailure $ "Unexpected error parsing `" ++ str ++ "':\n" ++ show err
 
+assertParseText :: Text -> NExpr -> Assertion
+assertParseText str expected = case parseNixText str of
+  Success actual ->
+      assertEqual ("When parsing " ++ unpack str)
+          (stripPositionInfo expected) (stripPositionInfo actual)
+  Failure err    ->
+      assertFailure $ "Unexpected error parsing `" ++ unpack str ++ "':\n" ++ show err
+
 assertParseFile :: FilePath -> NExpr -> Assertion
 assertParseFile file expected = do
   res <- parseNixFile $ "data/" ++ file
   case res of
-    Success actual -> assertEqual ("Parsing data file " ++ file) expected actual
-    Failure err    -> assertFailure $ "Unexpected error parsing data file `" ++ file ++ "':\n" ++ show err
+    Success actual -> assertEqual ("Parsing data file " ++ file)
+          (stripPositionInfo expected) (stripPositionInfo actual)
+    Failure err    ->
+        assertFailure $ "Unexpected error parsing data file `"
+            ++ file ++ "':\n" ++ show err
 
-assertParseFail :: String -> Assertion
-assertParseFail str = case parseNixString str of
+assertParseFail :: Text -> Assertion
+assertParseFail str = case parseNixText str of
   Failure _ -> return ()
-  Success r -> assertFailure $ "Unexpected success parsing `" ++ str ++ ":\nParsed value: " ++ show r
+  Success r ->
+      assertFailure $ "Unexpected success parsing `"
+          ++ unpack str ++ ":\nParsed value: " ++ show r
+
+-- assertRoundTrip :: Text -> Assertion
+-- assertRoundTrip src = assertParsePrint src src
+
+assertParsePrint :: Text -> Text -> Assertion
+assertParsePrint src expect =
+  let Success expr = parseNixTextLoc src
+      result = displayS
+             . renderPretty 0.4 80
+             . prettyNix
+             . stripAnnotation
+             $ expr
+  in assertEqual "" expect (pack (result ""))
diff --git a/tests/PrettyParseTests.hs b/tests/PrettyParseTests.hs
new file mode 100644
--- /dev/null
+++ b/tests/PrettyParseTests.hs
@@ -0,0 +1,244 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MonoLocalBinds #-}
+{-# LANGUAGE NoMonomorphismRestriction #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+{-# OPTIONS -Wno-orphans#-}
+
+module PrettyParseTests  where
+
+import           Control.Monad
+import           Data.Algorithm.Diff
+import           Data.Algorithm.DiffOutput
+import           Data.Char
+import           Data.Fix
+import qualified Data.List.NonEmpty as NE
+import           Data.Text (Text, pack)
+import           Generic.Random
+import           Nix.Atoms
+import           Nix.Expr
+import           Nix.Parser
+import           Nix.Pretty
+import           Test.QuickCheck.Instances.Semigroup ()
+import           Test.QuickCheck.Instances.Text ()
+import qualified Test.QuickCheck.Property as P
+import           Test.Tasty
+import           Test.Tasty.QuickCheck hiding (Success, Failure)
+import           Text.Megaparsec (Pos, SourcePos, mkPos)
+import           Text.PrettyPrint.ANSI.Leijen ((</>), text)
+import qualified Text.PrettyPrint.ANSI.Leijen as P
+import qualified Text.Show.Pretty as PS
+
+-- Instead of using the Generic arbitrary instance (which doesn't exist anyway
+-- for Text), we use a different generator which just prints sensible looking
+-- variable names
+custom :: GenList '[Text]
+custom = asciiText :@ Nil
+
+asciiString :: Gen String
+asciiString = do
+  n <- choose (1, 15)
+  replicateM n (elements ['a'..'z'])
+
+asciiText :: Gen Text
+asciiText = pack <$> asciiString
+
+pcustom :: GenList '[Pos]
+pcustom = arbitrary :@ Nil
+
+-- | This generator generates selects one of the constructors uniformly and
+--   also decreases the size of the generator by dividing by the branching
+--   factor. This ensures sensible termination.
+genArb :: (GArbitrary (Options 'Sized '[Text]) a, GUniformWeight a) =>  Gen a
+genArb = genericArbitraryWith (setGenerators custom sizedOpts) uniform
+
+-- Might want to replace this instance with a constant value
+instance Arbitrary Pos where
+  arbitrary = mkPos <$> (getSmall <$> arbitrary `suchThat` (> 0))
+
+instance Arbitrary (f (Fix f)) => Arbitrary (Fix f) where
+  arbitrary = genArb
+
+instance Arbitrary f => Arbitrary (NString f) where
+  arbitrary = genArb
+
+instance Arbitrary SourcePos where
+  arbitrary = genericArbitraryWith (setGenerators pcustom sizedOpts) uniform
+
+instance Arbitrary f => Arbitrary (Binding f) where
+  arbitrary = genArb
+
+instance Arbitrary f => Arbitrary (NKeyName f) where
+  arbitrary = oneof [ DynamicKey <$> arbitrary
+                    , StaticKey <$> asciiText ]
+
+instance Arbitrary f => Arbitrary (Params f) where
+  arbitrary =
+      oneof [ Param    <$> asciiText
+            , ParamSet <$> listOf ((,) <$> asciiText <*> arbitrary) <*> arbitrary
+                       <*> oneof [pure Nothing, Just <$> asciiText]
+            ]
+
+instance Arbitrary NAtom where
+  arbitrary =
+      oneof [ NInt   <$> arbitrary `suchThat` (>= 0)
+            , NFloat <$> arbitrary `suchThat` (>= 0)
+            , NBool  <$> arbitrary
+            , pure NNull ]
+
+instance Arbitrary NUnaryOp where
+  arbitrary = genArb
+
+instance Arbitrary NBinaryOp where
+  arbitrary = genArb
+
+instance (Arbitrary f) => Arbitrary (Antiquoted Text f) where
+  arbitrary = genArb
+
+instance (Arbitrary f) => Arbitrary (Antiquoted (NString f) f) where
+  arbitrary = genArb
+
+-- This is written by hand so we can use `fairList` rather than the normal
+-- list Arbitrary instance which makes the generator terminate. The
+-- distribution is not scientifically chosen.
+instance Arbitrary f => Arbitrary (NExprF f) where
+  arbitrary =
+    sized $ \n ->
+        if n < 2
+          then oneof [genConstant, genStr, genSym, genLiteralPath, genEnvPath ]
+          else
+            frequency
+              [ ( 1, genConstant)
+              , ( 1, genSym)
+              , ( 4, resize (n `div` 3) genIf)
+              , (10, genRecSet )
+              , (20, genSet )
+              , ( 5, genList )
+              , ( 2, genUnary )
+              , ( 2, resize (n `div` 3) genBinary )
+              , ( 3, resize (n `div` 3) genSelect )
+              , (20, resize (n `div` 2) genAbs )
+              , ( 2, resize (n `div` 2) genHasAttr )
+              , (10, resize (n `div` 2) genLet )
+              , (10, resize (n `div` 2) genWith )
+              , ( 1, resize (n `div` 2) genAssert)
+              ]
+   where
+    genConstant    = NConstant    <$> arbitrary
+    genStr         = NStr         <$> arbitrary
+    genSym         = NSym         <$> asciiText
+    genList        = NList        <$> fairList arbitrary
+    genSet         = NSet         <$> fairList arbitrary
+    genRecSet      = NRecSet      <$> fairList arbitrary
+    genLiteralPath = NLiteralPath . ("./" ++) <$> asciiString
+    genEnvPath     = NEnvPath     <$> asciiString
+    genUnary       = NUnary       <$> arbitrary <*> arbitrary
+    genBinary      = NBinary      <$> arbitrary <*> arbitrary <*> arbitrary
+    genSelect      = NSelect      <$> arbitrary <*> arbitrary <*> arbitrary
+    genHasAttr     = NHasAttr     <$> arbitrary <*> arbitrary
+    genAbs         = NAbs         <$> arbitrary <*> arbitrary
+    genLet         = NLet         <$> fairList arbitrary <*> arbitrary
+    genIf          = NIf          <$> arbitrary <*> arbitrary <*> arbitrary
+    genWith        = NWith        <$> arbitrary <*> arbitrary
+    genAssert      = NAssert      <$> arbitrary <*> arbitrary
+
+-- | Useful when there are recursive positions at each element of the list as
+--   it divides the size by the length of the generated list.
+fairList :: Gen a -> Gen [a]
+fairList g = do
+  s <- getSize
+  k <- choose (0, s)
+  -- Use max here to avoid dividing by zero when there is the empty list
+  resize (s `div` max 1 k) $ vectorOf k g
+
+equivUpToNormalization :: NExpr -> NExpr -> Bool
+equivUpToNormalization x y = normalize x == normalize y
+
+normalize :: NExpr -> NExpr
+normalize = cata $ \case
+  NConstant (NInt n)   | n < 0 -> Fix (NUnary NNeg (Fix (NConstant (NInt (negate n)))))
+  NConstant (NFloat n) | n < 0 -> Fix (NUnary NNeg (Fix (NConstant (NFloat (negate n)))))
+
+  NSet binds      -> Fix (NSet (map normBinding binds))
+  NRecSet binds   -> Fix (NRecSet (map normBinding binds))
+  NLet binds r    -> Fix (NLet (map normBinding binds) r)
+
+  NAbs params r   -> Fix (NAbs (normParams params) r)
+
+  r               -> Fix r
+
+ where
+  normBinding (NamedVar path r pos) = NamedVar (NE.map normKey path) r pos
+  normBinding (Inherit mr names pos) = Inherit mr (map normKey names) pos
+
+  normKey (DynamicKey quoted) = DynamicKey (normAntiquotedString quoted)
+  normKey (StaticKey name) = StaticKey name
+
+  normAntiquotedString :: Antiquoted (NString NExpr) NExpr
+                       -> Antiquoted (NString NExpr) NExpr
+  normAntiquotedString (Plain (DoubleQuoted [EscapedNewline])) =
+      EscapedNewline
+  normAntiquotedString (Plain (DoubleQuoted strs)) =
+      let strs' = map normAntiquotedText strs
+      in if strs == strs'
+         then Plain (DoubleQuoted strs)
+         else normAntiquotedString (Plain (DoubleQuoted strs'))
+  normAntiquotedString r = r
+
+  normAntiquotedText :: Antiquoted Text NExpr -> Antiquoted Text NExpr
+  normAntiquotedText (Plain "\n")   = EscapedNewline
+  normAntiquotedText (Plain "''\n") = EscapedNewline
+  normAntiquotedText r = r
+
+  normParams (ParamSet binds var (Just "")) = ParamSet binds var Nothing
+  normParams r = r
+
+-- | Test that parse . pretty == id up to attribute position information.
+prop_prettyparse :: NExpr -> P.Result
+prop_prettyparse p =
+  let prog = show (pretty p)
+  in case parse (pack prog) of
+    Failure s -> P.rejected
+        { P.reason = show $
+            text "Parse failed:" </> text (show s)
+              P.<$> P.indent 2 (pretty p) }
+    Success v
+        | equivUpToNormalization p v -> P.succeeded
+        | otherwise ->
+          let pp = normalise prog
+              pv = normalise (show (pretty v))
+          in (P.liftBool (pp == pv))
+            { P.reason = show $
+                      text "----------------------------------------"
+                P.<$> text "Expr before:" P.<$> P.indent 2 (text (PS.ppShow p))
+                P.<$> text "----------------------------------------"
+                P.<$> text "Expr after:"  P.<$> P.indent 2 (text (PS.ppShow v))
+                P.<$> text "----------------------------------------"
+                P.<$> text "Pretty before:" P.<$> P.indent 2 (text prog)
+                P.<$> text "----------------------------------------"
+                P.<$> text "Pretty after:"  P.<$> P.indent 2 (pretty v)
+                P.<$> text "----------------------------------------"
+                P.<$> text "Normalised before:" P.<$> P.indent 2 (text pp)
+                P.<$> text "----------------------------------------"
+                P.<$> text "Normalised after:"  P.<$> P.indent 2 (text pv)
+                P.<$> text "========================================"
+                P.<$> text "Normalised diff:"
+                P.<$> text (ppDiff (diff pp pv))
+                P.<$> text "========================================"
+            }
+  where
+    pretty = prettyNix
+    parse  = parseNixText
+
+    normalise = unlines . map (reverse . dropWhile isSpace . reverse) . lines
+
+    diff :: String -> String -> [Diff [String]]
+    diff s1 s2 = getDiff (map (:[]) (lines s1)) (map (:[]) (lines s2))
+
+tests :: Int -> TestTree
+tests n = testProperty "Pretty/Parse Property" $
+    withMaxSuccess n prop_prettyparse
diff --git a/tests/PrettyTests.hs b/tests/PrettyTests.hs
--- a/tests/PrettyTests.hs
+++ b/tests/PrettyTests.hs
@@ -11,14 +11,23 @@
 
 case_indented_antiquotation :: Assertion
 case_indented_antiquotation = do
-    assertPretty (mkIndentedStr "echo $foo") "''echo $foo''"
-    assertPretty (mkIndentedStr "echo ${foo}") "''echo ''${foo}''"
+    assertPretty (mkIndentedStr 0 "echo $foo") "''echo $foo''"
+    assertPretty (mkIndentedStr 0 "echo ${foo}") "''echo ''${foo}''"
 
 case_string_antiquotation :: Assertion
 case_string_antiquotation = do
-    -- TODO: plain $ doesn't need to be escaped here either
     assertPretty (mkStr "echo $foo") "\"echo \\$foo\""
     assertPretty (mkStr "echo ${foo}") "\"echo \\${foo}\""
+
+case_function_params :: Assertion
+case_function_params =
+    assertPretty (mkFunction (mkParamset [] True) (mkInt 3)) "{ ... }:\n  3"
+
+case_paths :: Assertion
+case_paths = do
+    assertPretty (mkPath False "~/test.nix") "~/test.nix"
+    assertPretty (mkPath False "/test.nix") "/test.nix"
+    assertPretty (mkPath False "./test.nix") "./test.nix"
 
 tests :: TestTree
 tests = $testGroupGenerator
diff --git a/tests/ShorthandTests.hs b/tests/ShorthandTests.hs
deleted file mode 100644
--- a/tests/ShorthandTests.hs
+++ /dev/null
@@ -1,39 +0,0 @@
-{-# LANGUAGE TemplateHaskell, OverloadedStrings #-}
-module ShorthandTests (tests) where
-
-import Prelude
-
-import Test.Tasty
-import Test.Tasty.HUnit
-import Test.Tasty.TH
-
-import Control.Monad (forM_)
-import Data.Monoid ((<>))
-import Data.Fix
-
-import Nix.Expr
-
-
-case_mkDotsSymbolEscaping :: Assertion
-case_mkDotsSymbolEscaping = do
-  let check xs errmsg assert =
-        forM_ xs $ \x -> assertBool (errmsg <> ": " <> show x) $ assert x
-  check plain "not a plain value" $ assertIsSingle
-  check nonPlain "not a non-plain value" $ not . assertIsSingle
-  where
-    plain = [ "abc09", "_A_'-", "AbC" ]
-    nonPlain = [ "abc def", "\\", "'abc", "\"", "-foo", "a.b.c" ]
-    assertIsSingle = isPlainSingle . getKey . mkDot "dummy"
-    getKey (Fix (NSelect _ [key] _)) = key
-    getKey _ = error "invalid"
-    isPlainSingle (StaticKey _) = True
-    isPlainSingle (DynamicKey (Plain (DoubleQuoted [Plain _]))) = False
-    isPlainSingle _ = error "invalid"
-
-
----------------------------
-
-tests :: TestTree
-tests = $(testGroupGenerator)
-
-
diff --git a/tests/TestCommon.hs b/tests/TestCommon.hs
new file mode 100644
--- /dev/null
+++ b/tests/TestCommon.hs
@@ -0,0 +1,67 @@
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE TypeApplications #-}
+
+module TestCommon where
+
+import Control.Monad.Catch
+import Control.Monad.IO.Class
+import Data.Text (Text, unpack)
+import Data.Time
+import Nix
+import System.Environment
+import System.IO
+import System.Posix.Files
+import System.Posix.Temp
+import System.Process
+import Test.Tasty.HUnit
+
+hnixEvalFile :: Options -> FilePath -> IO (NValueNF (Lazy IO))
+hnixEvalFile opts file = do
+  parseResult <- parseNixFileLoc file
+  case parseResult of
+    Failure err        ->
+        error $ "Parsing failed for file `" ++ file ++ "`.\n" ++ show err
+    Success expr -> do
+        setEnv "TEST_VAR" "foo"
+        runLazyM opts $
+            catch (evaluateExpression (Just file) nixEvalExprLoc
+                                      normalForm expr) $ \case
+                NixException frames ->
+                    errorWithoutStackTrace . show
+                        =<< renderFrames @(NThunk (Lazy IO)) frames
+
+hnixEvalText :: Options -> Text -> IO (NValueNF (Lazy IO))
+hnixEvalText opts src = case parseNixText src of
+    Failure err        ->
+        error $ "Parsing failed for expressien `"
+            ++ unpack src ++ "`.\n" ++ show err
+    Success expr ->
+        runLazyM opts $ normalForm =<< nixEvalExpr Nothing expr
+
+nixEvalString :: String -> IO String
+nixEvalString expr = do
+  (fp,h) <- mkstemp "nix-test-eval"
+  hPutStr h expr
+  hClose h
+  res <- nixEvalFile fp
+  removeLink fp
+  return res
+
+nixEvalFile :: FilePath -> IO String
+nixEvalFile fp = readProcess "nix-instantiate" ["--eval", "--strict", fp] ""
+
+assertEvalFileMatchesNix :: FilePath -> Assertion
+assertEvalFileMatchesNix fp = do
+  time <- liftIO getCurrentTime
+  hnixVal <- (++"\n") . printNix <$> hnixEvalFile (defaultOptions time) fp
+  nixVal <- nixEvalFile fp
+  assertEqual fp nixVal hnixVal
+
+assertEvalMatchesNix :: Text -> Assertion
+assertEvalMatchesNix expr = do
+  time <- liftIO getCurrentTime
+  hnixVal <- (++"\n") . printNix <$> hnixEvalText (defaultOptions time) expr
+  nixVal <- nixEvalString expr'
+  assertEqual expr' nixVal hnixVal
+ where
+  expr' = unpack expr
