diff --git a/.gitignore b/.gitignore
new file mode 100644
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,1 @@
+dist/
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "cabal"]
+	path = cabal
+	url = git://github.com/gentoo-haskell/cabal.git
diff --git a/Cabal2Ebuild.hs b/Cabal2Ebuild.hs
--- a/Cabal2Ebuild.hs
+++ b/Cabal2Ebuild.hs
@@ -55,6 +55,7 @@
                                                else Cabal.description pkg,
     E.homepage        = thisHomepage,
     E.license         = Cabal.license pkg,
+    E.slot            = (E.slot E.ebuildTemplate) ++ maybe [] (const "/${PV}") (Cabal.library pkg),
     E.my_pn           = if any isUpper cabalPkgName then Just cabalPkgName else Nothing,
     E.features        = E.features E.ebuildTemplate
                    ++ (if hasExe then ["bin"] else [])
@@ -84,13 +85,13 @@
             Nothing -> Portage.PackageName category (Portage.normalizeCabalPackageName pname)
     convert :: Cabal.VersionRange -> [Dependency]
     convert =  Cabal.foldVersionRange'
-             (          [AnyVersionOf                            pn []] -- ^ @\"-any\"@ version
-            )(\v     -> [ThisVersionOf      (fromCabalVersion v) pn []] -- ^ @\"== v\"@
-            )(\v     -> [LaterVersionOf     (fromCabalVersion v) pn []] -- ^ @\"> v\"@
-            )(\v     -> [EarlierVersionOf   (fromCabalVersion v) pn []] -- ^ @\"< v\"@
-            )(\v     -> [OrLaterVersionOf   (fromCabalVersion v) pn []] -- ^ @\">= v\"@
-            )(\v     -> [OrEarlierVersionOf (fromCabalVersion v) pn []] -- ^ @\"<= v\"@
-            )(\v _   -> [ThisMajorOf        (fromCabalVersion v) pn []] -- ^ @\"== v.*\"@ wildcard. (incl lower, excl upper)
+             (          [AnyVersionOf                            pn AnySlot []] -- ^ @\"-any\"@ version
+            )(\v     -> [ThisVersionOf      (fromCabalVersion v) pn AnySlot []] -- ^ @\"== v\"@
+            )(\v     -> [LaterVersionOf     (fromCabalVersion v) pn AnySlot []] -- ^ @\"> v\"@
+            )(\v     -> [EarlierVersionOf   (fromCabalVersion v) pn AnySlot []] -- ^ @\"< v\"@
+            )(\v     -> [OrLaterVersionOf   (fromCabalVersion v) pn AnySlot []] -- ^ @\">= v\"@
+            )(\v     -> [OrEarlierVersionOf (fromCabalVersion v) pn AnySlot []] -- ^ @\"<= v\"@
+            )(\v _   -> [ThisMajorOf        (fromCabalVersion v) pn AnySlot []] -- ^ @\"== v.*\"@ wildcard. (incl lower, excl upper)
             )(\g1 g2 -> [DependEither                       (g1 ++ g2)] -- ^ @\"_ || _\"@ union
             )(\r1 r2 -> r1 ++ r2                                     -- ^ @\"_ && _\"@ intersection
             )(\dp    -> [AllOf dp                                  ] -- ^ @\"(_)\"@ parentheses
diff --git a/Merge/Dependencies.hs b/Merge/Dependencies.hs
--- a/Merge/Dependencies.hs
+++ b/Merge/Dependencies.hs
@@ -113,7 +113,7 @@
     hasBuildableExes p = any (buildable . buildInfo) . executables $ p
     treatAsLibrary = (not . hasBuildableExes) pkg || hasLibs pkg
     haskell_deps
-        | treatAsLibrary = add_profile $ haskellDependencies overlay pkg
+        | treatAsLibrary = map set_build_slot $ map add_profile $ haskellDependencies overlay pkg
         | otherwise      = haskellDependencies overlay pkg
     test_deps
         | (not . null) (testSuites pkg) = testDependencies overlay pkg
@@ -130,7 +130,7 @@
                           : build_tools
                           ++ test_deps,
                     dep_e = [ "${RDEPEND}" ],
-                    rdep = ghc_dep
+                    rdep = set_build_slot ghc_dep
                             : haskell_deps
                             ++ extra_libs
                             ++ pkg_config
@@ -145,7 +145,8 @@
                     dep_e = [ "${RDEPEND}" ],
                     rdep = extra_libs ++ pkg_config
                   }
-    add_profile = map (flip Portage.addDepUseFlag (Portage.mkQUse "profile"))
+    add_profile    = Portage.addDepUseFlag (Portage.mkQUse "profile")
+    set_build_slot = Portage.setSlotDep Portage.AnyBuildTimeSlot
 
 ---------------------------------------------------------------
 -- Test-suite dependencies
@@ -198,7 +199,7 @@
 
 compilerIdToDependency :: CompilerId -> Portage.Dependency
 compilerIdToDependency (CompilerId GHC versionNumbers) =
-  Portage.OrLaterVersionOf (Portage.fromCabalVersion versionNumbers) (Portage.mkPackageName "dev-lang" "ghc") []
+  Portage.OrLaterVersionOf (Portage.fromCabalVersion versionNumbers) (Portage.mkPackageName "dev-lang" "ghc") Portage.AnySlot []
 
 ---------------------------------------------------------------
 -- C Libraries
@@ -207,7 +208,7 @@
 findCLibs :: PackageDescription -> [Portage.Dependency]
 findCLibs (PackageDescription { library = lib, executables = exes }) =
   [ trace ("WARNING: This package depends on a C library we don't know the portage name for: " ++ p ++ ". Check the generated ebuild.")
-          (Portage.AnyVersionOf (Portage.mkPackageName "unknown-c-lib" p) [])
+          (Portage.AnyVersionOf (Portage.mkPackageName "unknown-c-lib" p) Portage.AnySlot [])
   | p <- notFound
   ] ++ 
   found
@@ -222,16 +223,17 @@
 staticTranslateExtraLib :: String -> Maybe Portage.Dependency
 staticTranslateExtraLib lib = lookup lib m
   where
-  m = [ ("z", Portage.AnyVersionOf (Portage.mkPackageName "sys-libs" "zlib") [])
-      , ("bz2", Portage.AnyVersionOf (Portage.mkPackageName "sys-libs" "bzlib") [])
-      , ("mysqlclient", Portage.LaterVersionOf (Portage.Version [4,0] Nothing [] 0) (Portage.mkPackageName "virtual" "mysql") [])
-      , ("pq", Portage.LaterVersionOf (Portage.Version [7] Nothing [] 0) (Portage.mkPackageName "dev-db" "postgresql-base") [])
-      , ("ev", Portage.AnyVersionOf (Portage.mkPackageName "dev-libs" "libev") [])
-      , ("expat", Portage.AnyVersionOf (Portage.mkPackageName "dev-libs" "expat") [])
-      , ("curl", Portage.AnyVersionOf (Portage.mkPackageName "net-misc" "curl") [])
-      , ("xml2", Portage.AnyVersionOf (Portage.mkPackageName "dev-libs" "libxml2") [])
-      , ("mecab", Portage.AnyVersionOf (Portage.mkPackageName "app-text" "mecab") [])
-      , ("zmq", Portage.AnyVersionOf (Portage.mkPackageName "net-libs" "zeromq") [])
+  m = [ ("z", Portage.AnyVersionOf (Portage.mkPackageName "sys-libs" "zlib") Portage.AnySlot [])
+      , ("bz2", Portage.AnyVersionOf (Portage.mkPackageName "sys-libs" "bzlib") Portage.AnySlot [])
+      , ("mysqlclient", Portage.LaterVersionOf (Portage.Version [4,0] Nothing [] 0) (Portage.mkPackageName "virtual" "mysql") Portage.AnySlot [])
+      , ("pq", Portage.LaterVersionOf (Portage.Version [7] Nothing [] 0) (Portage.mkPackageName "dev-db" "postgresql-base") Portage.AnySlot [])
+      , ("ev", Portage.AnyVersionOf (Portage.mkPackageName "dev-libs" "libev") Portage.AnySlot [])
+      , ("expat", Portage.AnyVersionOf (Portage.mkPackageName "dev-libs" "expat") Portage.AnySlot [])
+      , ("curl", Portage.AnyVersionOf (Portage.mkPackageName "net-misc" "curl") Portage.AnySlot [])
+      , ("xml2", Portage.AnyVersionOf (Portage.mkPackageName "dev-libs" "libxml2") Portage.AnySlot [])
+      , ("mecab", Portage.AnyVersionOf (Portage.mkPackageName "app-text" "mecab") Portage.AnySlot [])
+      , ("zmq", Portage.AnyVersionOf (Portage.mkPackageName "net-libs" "zeromq") Portage.AnySlot [])
+      , ("SDL", Portage.AnyVersionOf (Portage.mkPackageName "media-libs" "libsdl") Portage.AnySlot [])
       ]
 
 ---------------------------------------------------------------
@@ -243,7 +245,7 @@
   [ case pkg of
       Just p -> p
       Nothing -> trace ("WARNING: Unknown build tool '" ++ pn ++ "'. Check the generated ebuild.")
-                       (Portage.AnyVersionOf (Portage.mkPackageName "unknown-build-tool" pn) [])
+                       (Portage.AnyVersionOf (Portage.mkPackageName "unknown-build-tool" pn) Portage.AnySlot [])
   | Cabal.Dependency (Cabal.PackageName pn) _range <- cabalDeps
   , pkg <- return (lookup pn buildToolsTable) 
   ]
@@ -255,13 +257,13 @@
 
 buildToolsTable :: [(String, Portage.Dependency)]
 buildToolsTable =
-  [ ("happy", Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "happy") [])
-  , ("alex", Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "alex") [])
-  , ("c2hs", Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "c2hs") [])
-  , ("cabal-install", Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "cabal-install") [])
-  , ("gtk2hsTypeGen",       Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "gtk2hs-buildtools") [])
-  , ("gtk2hsHookGenerator", Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "gtk2hs-buildtools") [])
-  , ("gtk2hsC2hs",          Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "gtk2hs-buildtools") [])
+  [ ("happy", Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "happy") Portage.AnySlot [])
+  , ("alex", Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "alex") Portage.AnySlot [])
+  , ("c2hs", Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "c2hs") Portage.AnySlot [])
+  , ("cabal-install", Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "cabal-install") Portage.AnySlot [])
+  , ("gtk2hsTypeGen",       Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "gtk2hs-buildtools") Portage.AnySlot [])
+  , ("gtk2hsHookGenerator", Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "gtk2hs-buildtools") Portage.AnySlot [])
+  , ("gtk2hsC2hs",          Portage.AnyVersionOf (Portage.mkPackageName "dev-haskell" "gtk2hs-buildtools") Portage.AnySlot [])
   ]
 
 -- tools that are provided by ghc or some other existing program
@@ -286,76 +288,76 @@
   [ case resolvePkgConfig overlay pkg of
       Just d -> d
       Nothing -> trace ("WARNING: Could not resolve pkg-config: " ++ pn ++ ". Check generated ebuild.")
-                       (Portage.AnyVersionOf (Portage.mkPackageName "unknown-pkg-config" pn) [])
+                       (Portage.AnyVersionOf (Portage.mkPackageName "unknown-pkg-config" pn) Portage.AnySlot [])
   | pkg@(Cabal.Dependency (Cabal.PackageName pn) _range) <- cdeps ]
 
 resolvePkgConfig :: Portage.Overlay -> Cabal.Dependency -> Maybe Portage.Dependency
 resolvePkgConfig overlay (Cabal.Dependency (Cabal.PackageName pn) _cabalVersion) = do
-  (cat,portname) <- lookup pn table
-  return $ Portage.AnyVersionOf (Portage.mkPackageName cat portname) []
+  (cat,portname, slot) <- lookup pn table
+  return $ Portage.AnyVersionOf (Portage.mkPackageName cat portname) slot []
 
-table :: [(String, (String, String))]
+table :: [(String, (String, String, Portage.SlotDepend))]
 table =
   [
-   ("alsa",         ("media-libs", "alsa-lib"))
-  ,("gconf-2.0",    ("gnome-base", "gconf"))
+   ("alsa",         ("media-libs", "alsa-lib", Portage.AnySlot))
+  ,("gconf-2.0",    ("gnome-base", "gconf", Portage.AnySlot))
 
-  ,("gio-2.0",                ("dev-libs", "glib:2"))
-  ,("gio-unix-2.0",           ("dev-libs", "glib:2"))
-  ,("glib-2.0",               ("dev-libs", "glib:2"))
-  ,("gmodule-2.0",            ("dev-libs", "glib:2"))
-  ,("gmodule-export-2.0",     ("dev-libs", "glib:2"))
-  ,("gmodule-no-export-2.0",  ("dev-libs", "glib:2"))
-  ,("gobject-2.0",            ("dev-libs", "glib:2"))
-  ,("gthread-2.0",            ("dev-libs", "glib:2"))
+  ,("gio-2.0",                ("dev-libs", "glib", Portage.GivenSlot "2"))
+  ,("gio-unix-2.0",           ("dev-libs", "glib", Portage.GivenSlot "2"))
+  ,("glib-2.0",               ("dev-libs", "glib", Portage.GivenSlot "2"))
+  ,("gmodule-2.0",            ("dev-libs", "glib", Portage.GivenSlot "2"))
+  ,("gmodule-export-2.0",     ("dev-libs", "glib", Portage.GivenSlot "2"))
+  ,("gmodule-no-export-2.0",  ("dev-libs", "glib", Portage.GivenSlot "2"))
+  ,("gobject-2.0",            ("dev-libs", "glib", Portage.GivenSlot "2"))
+  ,("gthread-2.0",            ("dev-libs", "glib", Portage.GivenSlot "2"))
 
-  ,("gtk+-2.0",            ("x11-libs", "gtk+:2"))
-  ,("gdk-2.0",             ("x11-libs", "gtk+:2"))
-  ,("gdk-pixbuf-2.0",      ("x11-libs", "gtk+:2"))
-  ,("gdk-pixbuf-xlib-2.0", ("x11-libs", "gtk+:2"))
-  ,("gdk-x11-2.0",         ("x11-libs", "gtk+:2"))
-  ,("gtk+-unix-print-2.0", ("x11-libs", "gtk+:2"))
-  ,("gtk+-x11-2.0",        ("x11-libs", "gtk+:2"))
+  ,("gtk+-2.0",            ("x11-libs", "gtk+", Portage.GivenSlot "2"))
+  ,("gdk-2.0",             ("x11-libs", "gtk+", Portage.GivenSlot "2"))
+  ,("gdk-pixbuf-2.0",      ("x11-libs", "gtk+", Portage.GivenSlot "2"))
+  ,("gdk-pixbuf-xlib-2.0", ("x11-libs", "gtk+", Portage.GivenSlot "2"))
+  ,("gdk-x11-2.0",         ("x11-libs", "gtk+", Portage.GivenSlot "2"))
+  ,("gtk+-unix-print-2.0", ("x11-libs", "gtk+", Portage.GivenSlot "2"))
+  ,("gtk+-x11-2.0",        ("x11-libs", "gtk+", Portage.GivenSlot "2"))
 
-  ,("cairo",            ("x11-libs", "cairo")) -- need [svg] for dev-haskell/cairo
-  ,("cairo-ft",         ("x11-libs", "cairo"))
-  ,("cairo-ps",         ("x11-libs", "cairo"))
-  ,("cairo-png",        ("x11-libs", "cairo"))
-  ,("cairo-pdf",        ("x11-libs", "cairo"))
-  ,("cairo-svg",        ("x11-libs", "cairo"))
-  ,("cairo-xlib",         ("x11-libs", "cairo"))
-  ,("cairo-xlib-xrender", ("x11-libs", "cairo"))
+  ,("cairo",            ("x11-libs", "cairo", Portage.AnySlot)) -- need [svg] for dev-haskell/cairo
+  ,("cairo-ft",         ("x11-libs", "cairo", Portage.AnySlot))
+  ,("cairo-ps",         ("x11-libs", "cairo", Portage.AnySlot))
+  ,("cairo-png",        ("x11-libs", "cairo", Portage.AnySlot))
+  ,("cairo-pdf",        ("x11-libs", "cairo", Portage.AnySlot))
+  ,("cairo-svg",        ("x11-libs", "cairo", Portage.AnySlot))
+  ,("cairo-xlib",         ("x11-libs", "cairo", Portage.AnySlot))
+  ,("cairo-xlib-xrender", ("x11-libs", "cairo", Portage.AnySlot))
 
-  ,("pangocairo",       ("x11-libs", "pango"))
-  ,("pangoft2",         ("x11-libs", "pango"))
-  ,("pango",            ("x11-libs", "pango"))
-  ,("pangoxft",         ("x11-libs", "pango"))
-  ,("pangox",           ("x11-libs", "pango"))
+  ,("pangocairo",       ("x11-libs", "pango", Portage.AnySlot))
+  ,("pangoft2",         ("x11-libs", "pango", Portage.AnySlot))
+  ,("pango",            ("x11-libs", "pango", Portage.AnySlot))
+  ,("pangoxft",         ("x11-libs", "pango", Portage.AnySlot))
+  ,("pangox",           ("x11-libs", "pango", Portage.AnySlot))
 
-  ,("libglade-2.0", ("gnome-base", "libglade"))
-  ,("gnome-vfs-2.0", ("gnome-base", "gnome-vfs"))
-  ,("gnome-vfs-module-2.0", ("gnome-base", "gnome-vfs"))
-  ,("webkit-1.0", ("net-libs","webkit-gtk:2"))
+  ,("libglade-2.0", ("gnome-base", "libglade", Portage.AnySlot))
+  ,("gnome-vfs-2.0", ("gnome-base", "gnome-vfs", Portage.AnySlot))
+  ,("gnome-vfs-module-2.0", ("gnome-base", "gnome-vfs", Portage.AnySlot))
+  ,("webkit-1.0", ("net-libs","webkit-gtk", Portage.GivenSlot "2"))
 
-  ,("gstreamer-0.10",              ("media-libs", "gstreamer"))
-  ,("gstreamer-base-0.10",         ("media-libs", "gstreamer"))
-  ,("gstreamer-check-0.10",        ("media-libs", "gstreamer"))
-  ,("gstreamer-controller-0.10",   ("media-libs", "gstreamer"))
-  ,("gstreamer-dataprotocol-0.10", ("media-libs", "gstreamer"))
-  ,("gstreamer-net-0.10",          ("media-libs", "gstreamer"))
+  ,("gstreamer-0.10",              ("media-libs", "gstreamer", Portage.AnySlot))
+  ,("gstreamer-base-0.10",         ("media-libs", "gstreamer", Portage.AnySlot))
+  ,("gstreamer-check-0.10",        ("media-libs", "gstreamer", Portage.AnySlot))
+  ,("gstreamer-controller-0.10",   ("media-libs", "gstreamer", Portage.AnySlot))
+  ,("gstreamer-dataprotocol-0.10", ("media-libs", "gstreamer", Portage.AnySlot))
+  ,("gstreamer-net-0.10",          ("media-libs", "gstreamer", Portage.AnySlot))
 
-  ,("gstreamer-app-0.10",          ("media-libs", "gst-plugins-base"))
-  ,("gstreamer-audio-0.10",        ("media-libs", "gst-plugins-base"))
-  ,("gstreamer-video-0.10",        ("media-libs", "gst-plugins-base"))
-  ,("gstreamer-plugins-base-0.10", ("media-libs", "gst-plugins-base"))
+  ,("gstreamer-app-0.10",          ("media-libs", "gst-plugins-base", Portage.AnySlot))
+  ,("gstreamer-audio-0.10",        ("media-libs", "gst-plugins-base", Portage.AnySlot))
+  ,("gstreamer-video-0.10",        ("media-libs", "gst-plugins-base", Portage.AnySlot))
+  ,("gstreamer-plugins-base-0.10", ("media-libs", "gst-plugins-base", Portage.AnySlot))
 
-  ,("gtksourceview-2.0",           ("x11-libs", "gtksourceview:2.0"))
-  ,("librsvg-2.0",                 ("gnome-base","librsvg"))
-  ,("vte",                         ("x11-libs","vte:0"))
-  ,("gtkglext-1.0",                ("x11-libs","gtkglext"))
+  ,("gtksourceview-2.0",           ("x11-libs", "gtksourceview", Portage.GivenSlot "2.0"))
+  ,("librsvg-2.0",                 ("gnome-base","librsvg", Portage.AnySlot))
+  ,("vte",                         ("x11-libs","vte", Portage.GivenSlot "0"))
+  ,("gtkglext-1.0",                ("x11-libs","gtkglext", Portage.AnySlot))
 
-  ,("curl",                        ("net-misc", "curl"))
-  ,("libxml2",                     ("dev-libs", "libxml2"))
-  ,("libgsasl",                    ("virtual", "gsasl"))
+  ,("curl",                        ("net-misc", "curl", Portage.AnySlot))
+  ,("libxml2",                     ("dev-libs", "libxml2", Portage.AnySlot))
+  ,("libgsasl",                    ("virtual", "gsasl", Portage.AnySlot))
 
   ]
diff --git a/Portage/Dependency.hs b/Portage/Dependency.hs
--- a/Portage/Dependency.hs
+++ b/Portage/Dependency.hs
@@ -1,8 +1,10 @@
-module Portage.Dependency (
-  Dependency(..),
-  simplify_deps,
-  simplifyUseDeps,
-  addDepUseFlag
+module Portage.Dependency
+  ( Dependency(..)
+  , SlotDepend(..)
+  , simplify_deps
+  , simplifyUseDeps
+  , addDepUseFlag
+  , setSlotDep
   ) where
 
 import Portage.Version
@@ -18,15 +20,25 @@
 import Data.List ( nub, groupBy, partition, sortBy )
 import Data.Ord           (comparing)
 
-data Dependency = AnyVersionOf               PackageName [UseFlag]
-                | ThisVersionOf      Version PackageName [UseFlag]  -- ~package-version
-                | LaterVersionOf     Version PackageName [UseFlag]  -- >package-version
-                | EarlierVersionOf   Version PackageName [UseFlag]  -- <package-version
-                | OrLaterVersionOf   Version PackageName [UseFlag]  -- >=package-version
-                | OrEarlierVersionOf Version PackageName [UseFlag]  -- <=package-version
-                | DependEither [Dependency]                         -- || ( depend1 depend2 ... )
+data SlotDepend = AnySlot          -- nothing special
+                | AnyBuildTimeSlot -- ':='
+                | GivenSlot String -- ':slotno'
+    deriving (Eq, Show)
+
+dispSlot :: SlotDepend -> Disp.Doc
+dispSlot AnySlot          = Disp.empty
+dispSlot AnyBuildTimeSlot = Disp.text ":="
+dispSlot (GivenSlot slot) = Disp.text (':' : slot)
+
+data Dependency = AnyVersionOf               PackageName SlotDepend [UseFlag]
+                | ThisVersionOf      Version PackageName SlotDepend [UseFlag]  -- ~package-version
+                | LaterVersionOf     Version PackageName SlotDepend [UseFlag]  -- >package-version
+                | EarlierVersionOf   Version PackageName SlotDepend [UseFlag]  -- <package-version
+                | OrLaterVersionOf   Version PackageName SlotDepend [UseFlag]  -- >=package-version
+                | OrEarlierVersionOf Version PackageName SlotDepend [UseFlag]  -- <=package-version
+                | ThisMajorOf        Version PackageName SlotDepend [UseFlag]  -- =package-version*
                 | DependIfUse  UseFlag    Dependency                -- use? ( depend )
-                | ThisMajorOf        Version PackageName [UseFlag]  -- =package-version*
+                | DependEither [Dependency]                         -- || ( depend1 depend2 ... )
                 | AllOf        [Dependency]                         -- ( depend1 depend2 ... )
     deriving (Eq,Show)
 
@@ -37,18 +49,18 @@
 a <-> b = a <> Disp.char '-' <> b
 
 showDepend :: Dependency -> Disp.Doc
-showDepend (AnyVersionOf         p u) = disp p <> dispUses u 
-showDepend (ThisVersionOf      v p u) = Disp.char '~' <> disp p <-> disp v { versionRevision = 0 } <> dispUses u
-showDepend (LaterVersionOf     v p u) = Disp.char '>' <> disp p <-> disp v <> dispUses u
-showDepend (EarlierVersionOf   v p u) = Disp.char '<' <> disp p <-> disp v <> dispUses u
-showDepend (OrLaterVersionOf   v p u) = Disp.text ">=" <> disp p <-> disp v <> dispUses u
-showDepend (OrEarlierVersionOf v p u) = Disp.text "<=" <> disp p <-> disp v <> dispUses u
+showDepend (AnyVersionOf         p s u) = disp p <> dispSlot s <> dispUses u
+showDepend (ThisVersionOf      v p s u) = Disp.char '~' <> disp p <-> disp v { versionRevision = 0 } <> dispSlot s <> dispUses u
+showDepend (LaterVersionOf     v p s u) = Disp.char '>' <> disp p <-> disp v <> dispSlot s <> dispUses u
+showDepend (EarlierVersionOf   v p s u) = Disp.char '<' <> disp p <-> disp v <> dispSlot s <> dispUses u
+showDepend (OrLaterVersionOf   v p s u) = Disp.text ">=" <> disp p <-> disp v <> dispSlot s <> dispUses u
+showDepend (OrEarlierVersionOf v p s u) = Disp.text "<=" <> disp p <-> disp v <> dispSlot s <> dispUses u
+showDepend (ThisMajorOf        v p s u) = Disp.char '='  <> disp p <-> disp v <> Disp.char '*' <> dispSlot s <> dispUses u
 showDepend (DependEither       dp ) = Disp.text "|| ( " <> hsep (map showDepend dp) <> Disp.text " )"
 showDepend (DependIfUse        useflag dep) = disp useflag <> Disp.text "? " <> pp_deps dep
     where -- special case to avoid double braces: test? ( ( ) )
           pp_deps (AllOf _) =                               disp dep
           pp_deps         _ = Disp.parens (Disp.text " " <> disp dep <> Disp.text " ")
-showDepend (ThisMajorOf        v p u) = Disp.char '=' <> disp p <-> disp v <> Disp.char '*' <> dispUses u
 showDepend (AllOf []) = Disp.empty
 showDepend (AllOf              (d:dp) ) =
     Disp.text "( " <> showDepend d <> line
@@ -59,6 +71,7 @@
 {- Here goes code for dependencies simplification -}
 
 simplify_group_table :: PackageName ->
+                        SlotDepend  ->
                         [UseFlag]   ->
                         Maybe Version ->
                         Maybe Version ->
@@ -68,36 +81,37 @@
 
 -- simplify_group_table p ol       l        e        oe       exact
 -- 1) trivial cases:
-simplify_group_table    p u Nothing  Nothing  Nothing  Nothing  Nothing  = error $ display p ++ ": unsolvable constraints"
-simplify_group_table    p u (Just v) Nothing  Nothing  Nothing  Nothing  = [OrLaterVersionOf v p u]
-simplify_group_table    p u Nothing  (Just v) Nothing  Nothing  Nothing  = [LaterVersionOf v p u]
-simplify_group_table    p u Nothing  Nothing  (Just v) Nothing  Nothing  = [EarlierVersionOf v p u]
-simplify_group_table    p u Nothing  Nothing  Nothing  (Just v) Nothing  = [OrEarlierVersionOf v p u]
-simplify_group_table    p u Nothing  Nothing  Nothing  Nothing  (Just v) = [ThisVersionOf v p u]
+simplify_group_table    p _s _u Nothing  Nothing  Nothing  Nothing  Nothing  = error $ display p ++ ": unsolvable constraints"
+simplify_group_table    p s u (Just v) Nothing  Nothing  Nothing  Nothing  = [OrLaterVersionOf v p s u]
+simplify_group_table    p s u Nothing  (Just v) Nothing  Nothing  Nothing  = [LaterVersionOf v p s u]
+simplify_group_table    p s u Nothing  Nothing  (Just v) Nothing  Nothing  = [EarlierVersionOf v p s u]
+simplify_group_table    p s u Nothing  Nothing  Nothing  (Just v) Nothing  = [OrEarlierVersionOf v p s u]
+simplify_group_table    p s u Nothing  Nothing  Nothing  Nothing  (Just v) = [ThisVersionOf v p s u]
 
 -- 2) simplification passes
-simplify_group_table    p u (Just (Version v1 _ _ _)) Nothing (Just (Version v2 _ _ _)) Nothing Nothing
+simplify_group_table    p s u (Just (Version v1 _ _ _)) Nothing (Just (Version v2 _ _ _)) Nothing Nothing
     -- special case: >=a-v.N a<v.(N+1)   => =a-v.N*
-    | (init v1 == init v2) && (last v2 == last v1 + 1) = [ThisMajorOf (Version v1 Nothing [] 0) p u]
-    | otherwise                                        = [OrLaterVersionOf (Version v1 Nothing [] 0) p u, EarlierVersionOf (Version v2 Nothing [] 0) p u]
+    | (init v1 == init v2) && (last v2 == last v1 + 1) = [ThisMajorOf (Version v1 Nothing [] 0) p s u]
+    | otherwise                                        = [OrLaterVersionOf (Version v1 Nothing [] 0) p s u, EarlierVersionOf (Version v2 Nothing [] 0) p s u]
 
 -- TODO: simplify constraints of type: >=a-v1; > a-v2 and such
 
 -- 3) otherwise sink:
-simplify_group_table    p u (Just v)     l@(_)       e@(_)        oe@(_)       exact@(_) =   OrLaterVersionOf v p u: simplify_group_table p u Nothing  l e oe exact
-simplify_group_table    p u ol@(Nothing) (Just v)    e@(_)        oe@(_)       exact@(_) =     LaterVersionOf v p u: simplify_group_table p u ol Nothing e oe exact
-simplify_group_table    p u ol@(Nothing) l@(Nothing) (Just v)     oe@(_)       exact@(_) =   EarlierVersionOf v p u: simplify_group_table p u ol l Nothing oe exact
-simplify_group_table    p u ol@(Nothing) l@(Nothing) e@(Nothing)  (Just v)     exact@(_) = OrEarlierVersionOf v p u: simplify_group_table p u ol l e Nothing  exact
+simplify_group_table    p s u (Just v)     l@(_)       e@(_)        oe@(_)       exact@(_) =   OrLaterVersionOf v p s u: simplify_group_table p s u Nothing  l e oe exact
+simplify_group_table    p s u ol@(Nothing) (Just v)    e@(_)        oe@(_)       exact@(_) =     LaterVersionOf v p s u: simplify_group_table p s u ol Nothing e oe exact
+simplify_group_table    p s u ol@(Nothing) l@(Nothing) (Just v)     oe@(_)       exact@(_) =   EarlierVersionOf v p s u: simplify_group_table p s u ol l Nothing oe exact
+simplify_group_table    p s u ol@(Nothing) l@(Nothing) e@(Nothing)  (Just v)     exact@(_) = OrEarlierVersionOf v p s u: simplify_group_table p s u ol l e Nothing  exact
 -- already defined earlier
--- simplify_group_table    p ol@(Nothing) l@(Nothing) e@(Nothing)  oe@(Nothing) (Just v)  = OrEarlierVersionOf v p : simplify_group_table p ol l e oe Nothing
+-- simplify_group_table    p s u ol@(Nothing) l@(Nothing) e@(Nothing)  oe@(Nothing) (Just v)  = OrEarlierVersionOf v p : simplify_group_table p ol l e oe Nothing
 
 --  >a-v1 >a-v2         => >a-(max v1 v2)
 -- key idea: all constraints are enforcing constraints, so we can't get
 -- more, than one interval.
 simplify_group :: [Dependency] -> [Dependency]
-simplify_group [dep@(AnyVersionOf _package _u)] = [dep]
-simplify_group [dep@(ThisMajorOf _v    _p _u)]  = [dep]
+simplify_group [dep@(AnyVersionOf _package _s _u)] = [dep]
+simplify_group [dep@(ThisMajorOf _v    _p _s _u)]  = [dep]
 simplify_group deps = simplify_group_table package
+                                           slot
                                            uses
                                            min_or_later_v   -- >=
                                            min_later_v      -- >
@@ -106,6 +120,7 @@
                                            exact_this_v     -- ==
     where
           package = fromJust.getPackage $ head deps
+          slot    = fromJust.getSlot    $ head deps
           uses    = fromJust.getUses    $ head deps
           max_earlier_v    = safe_minimum $ map earlier_v deps
           max_or_earlier_v = safe_minimum $ map or_earlier_v deps
@@ -116,19 +131,19 @@
                                   [v] -> Just v
                                   xs  -> error $ "too many exact versions:" ++ show xs
           --
-          earlier_v (EarlierVersionOf v _p _u) = Just v
+          earlier_v (EarlierVersionOf v _p _s _u) = Just v
           earlier_v _                       = Nothing
 
-          or_earlier_v (OrEarlierVersionOf v _p _u) = Just v
+          or_earlier_v (OrEarlierVersionOf v _p _s _u) = Just v
           or_earlier_v _                         = Nothing
 
-          later_v (LaterVersionOf v _p _u) = Just v
+          later_v (LaterVersionOf v _p _s _u) = Just v
           later_v _                     = Nothing
 
-          or_later_v (OrLaterVersionOf v _p _u) = Just v
+          or_later_v (OrLaterVersionOf v _p _s _u) = Just v
           or_later_v _                     = Nothing
 
-          this_v (ThisVersionOf v  _p _u) = Just v
+          this_v (ThisVersionOf v  _p _s _u) = Just v
           this_v _                     = Nothing
           --
           safe_minimum xs = case catMaybes xs of
@@ -152,45 +167,69 @@
           --
 getPackage :: Dependency -> Maybe PackageName
 getPackage (AllOf _dependency) = Nothing
-getPackage (AnyVersionOf package _uses) = Just package
-getPackage (ThisVersionOf      _version package _uses) = Just package
-getPackage (LaterVersionOf     _version package _uses) = Just package
-getPackage (EarlierVersionOf   _version package _uses) = Just package
-getPackage (OrLaterVersionOf   _version package _uses) = Just package
-getPackage (OrEarlierVersionOf _version package _uses) = Just package
+getPackage (AnyVersionOf package _s _uses) = Just package
+getPackage (ThisVersionOf      _version package _s _uses) = Just package
+getPackage (LaterVersionOf     _version package _s _uses) = Just package
+getPackage (EarlierVersionOf   _version package _s _uses) = Just package
+getPackage (OrLaterVersionOf   _version package _s _uses) = Just package
+getPackage (OrEarlierVersionOf _version package _s _uses) = Just package
+getPackage (ThisMajorOf        _version package _s _uses) = Just package
 getPackage (DependEither _dependency           ) = Nothing
 getPackage (DependIfUse  _useFlag    _Dependency) = Nothing
-getPackage (ThisMajorOf        _version package _uses) = Just package
 
 getUses  :: Dependency -> Maybe [UseFlag]
 getUses (AllOf _d) = Nothing
-getUses (AnyVersionOf _p u) = Just u
-getUses (ThisVersionOf _v _p u) = Just u
-getUses (LaterVersionOf _v _p u) = Just u
-getUses (EarlierVersionOf _v _p u) = Just u
-getUses (OrLaterVersionOf _v _p u) = Just u
-getUses (OrEarlierVersionOf _v _p u) = Just u
+getUses (AnyVersionOf _p _s u) = Just u
+getUses (ThisVersionOf _v _p _s u) = Just u
+getUses (LaterVersionOf _v _p _s u) = Just u
+getUses (EarlierVersionOf _v _p _s u) = Just u
+getUses (OrLaterVersionOf _v _p _s u) = Just u
+getUses (OrEarlierVersionOf _v _p _s u) = Just u
+getUses (ThisMajorOf _v _p _s u) = Just u
 getUses (DependEither _d) = Nothing
 getUses (DependIfUse _u _d) = Nothing
-getUses (ThisMajorOf _v _p u) = Just u
 
+getSlot :: Dependency -> Maybe SlotDepend
+getSlot (AllOf _d) = Nothing
+getSlot (AnyVersionOf _p s _u) = Just s
+getSlot (ThisVersionOf _v _p s _u) = Just s
+getSlot (LaterVersionOf _v _p s _u) = Just s
+getSlot (EarlierVersionOf _v _p s _u) = Just s
+getSlot (OrLaterVersionOf _v _p s _u) = Just s
+getSlot (OrEarlierVersionOf _v _p s _u) = Just s
+getSlot (ThisMajorOf _v _p s _u) = Just s
+getSlot (DependEither _d) = Nothing
+getSlot (DependIfUse _u _d) = Nothing
+
 --
 getPackagePart :: Dependency -> PackageName
 getPackagePart dep = fromJust (getPackage dep)
 
 --
-addDepUseFlag :: Dependency -> UseFlag -> Dependency
-addDepUseFlag (AllOf d) n = AllOf $ map (flip addDepUseFlag n) d
-addDepUseFlag (AnyVersionOf p u) n = AnyVersionOf p (n:u)
-addDepUseFlag (ThisVersionOf v p u) n = ThisVersionOf v p (n:u)
-addDepUseFlag (LaterVersionOf v p u) n = LaterVersionOf v p (n:u)
-addDepUseFlag (EarlierVersionOf v p u) n = EarlierVersionOf v p (n:u)
-addDepUseFlag (OrLaterVersionOf v p u) n = OrLaterVersionOf v p (n:u)
-addDepUseFlag (OrEarlierVersionOf v p u) n = OrEarlierVersionOf v p (n:u)
-addDepUseFlag (ThisMajorOf v p u) n = ThisMajorOf v p (n:u)
-addDepUseFlag (DependEither d) n = DependEither $ map (flip addDepUseFlag n) d
-addDepUseFlag (DependIfUse u d) n = DependIfUse u (addDepUseFlag d n)
+setSlotDep :: SlotDepend -> Dependency -> Dependency
+setSlotDep n (AllOf d) = AllOf $ map (setSlotDep n) d
+setSlotDep n (AnyVersionOf p _s u) = AnyVersionOf p n u
+setSlotDep n (ThisVersionOf v p _s u) = ThisVersionOf v p n u
+setSlotDep n (LaterVersionOf v p _s u) = LaterVersionOf v p n u
+setSlotDep n (EarlierVersionOf v p _s u) = EarlierVersionOf v p n u
+setSlotDep n (OrLaterVersionOf v p _s u) = OrLaterVersionOf v p n u
+setSlotDep n (OrEarlierVersionOf v p _s u) = OrEarlierVersionOf v p n u
+setSlotDep n (ThisMajorOf v p _s u) = ThisMajorOf v p n u
+setSlotDep n (DependEither d) = DependEither $ map (setSlotDep n) d
+setSlotDep n (DependIfUse u d) = DependIfUse u (setSlotDep n d)
 
+addDepUseFlag :: UseFlag -> Dependency -> Dependency
+addDepUseFlag n (AllOf d) = AllOf $ map (addDepUseFlag n) d
+addDepUseFlag n (AnyVersionOf p s u) = AnyVersionOf p s (n:u)
+addDepUseFlag n (ThisVersionOf v p s u) = ThisVersionOf v p s (n:u)
+addDepUseFlag n (LaterVersionOf v p s u) = LaterVersionOf v p s (n:u)
+addDepUseFlag n (EarlierVersionOf v p s u) = EarlierVersionOf v p s (n:u)
+addDepUseFlag n (OrLaterVersionOf v p s u) = OrLaterVersionOf v p s (n:u)
+addDepUseFlag n (OrEarlierVersionOf v p s u) = OrEarlierVersionOf v p s (n:u)
+addDepUseFlag n (ThisMajorOf v p s u) = ThisMajorOf v p s (n:u)
+addDepUseFlag n (DependEither d) = DependEither $ map (addDepUseFlag n) d
+addDepUseFlag n (DependIfUse u d) = DependIfUse u (addDepUseFlag n d)
+
 --
 -- | remove all Use dependencies that overlap with normal dependencies
 simplifyUseDeps :: [Dependency]         -- list where use deps is taken
@@ -216,4 +255,3 @@
 isUseDep :: Dependency -> Bool
 isUseDep (DependIfUse _ _) = True
 isUseDep _ = False
---
diff --git a/Portage/EBuild.hs b/Portage/EBuild.hs
--- a/Portage/EBuild.hs
+++ b/Portage/EBuild.hs
@@ -81,7 +81,7 @@
   ss "# Distributed under the terms of the GNU General Public License v2". nl.
   ss "# $Header: $". nl.
   nl.
-  ss "EAPI=4". nl.
+  ss "EAPI=5". nl.
   nl.
   ss ("# ebuild generated by hackport " ++ hackportVersion ebuild). nl.
   nl.
diff --git a/cabal/.git b/cabal/.git
new file mode 100644
--- /dev/null
+++ b/cabal/.git
@@ -0,0 +1,1 @@
+gitdir: /home/slyfox/portage/hackport/.git/modules/cabal
diff --git a/cabal/.gitignore b/cabal/.gitignore
new file mode 100644
--- /dev/null
+++ b/cabal/.gitignore
@@ -0,0 +1,25 @@
+# trivial gitignore file
+
+cabal-dev/
+Cabal/dist/
+cabal-install/dist/
+.hpc/
+*.hi
+*.o
+*.p_hi
+*.prof
+*.tix
+
+# editor temp files
+
+*#
+.#*
+*~
+.*.swp
+
+# GHC build
+
+Cabal/GNUmakefile
+Cabal/dist-boot/
+Cabal/dist-install/
+Cabal/ghc.mk
diff --git a/cabal/Cabal/tests/PackageTests/BuildDeps/GlobalBuildDepsNotAdditive1/GlobalBuildDeps b/cabal/Cabal/tests/PackageTests/BuildDeps/GlobalBuildDepsNotAdditive1/GlobalBuildDeps
deleted file mode 100644
--- a/cabal/Cabal/tests/PackageTests/BuildDeps/GlobalBuildDepsNotAdditive1/GlobalBuildDeps
+++ /dev/null
@@ -1,20 +0,0 @@
-name: GlobalBuildDepsNotAdditive1
-version: 0.1
-license: BSD3
-cabal-version: >= 1.6
-author: Stephen Blackheath
-stability: stable
-category: PackageTests
-build-type: Simple
-
-description:
-    If you specify 'base' in the global build dependencies, then define
-    a library without base, it fails to find 'base' for the library.
-
----------------------------------------
-
-build-depends: base
-
-Library
-    exposed-modules: MyLibrary
-    build-depends: bytestring, old-time
diff --git a/cabal/Cabal/tests/PackageTests/BuildDeps/GlobalBuildDepsNotAdditive1/GlobalBuildDepsNot b/cabal/Cabal/tests/PackageTests/BuildDeps/GlobalBuildDepsNotAdditive1/GlobalBuildDepsNot
new file mode 100644
--- /dev/null
+++ b/cabal/Cabal/tests/PackageTests/BuildDeps/GlobalBuildDepsNotAdditive1/GlobalBuildDepsNot
@@ -0,0 +1,20 @@
+name: GlobalBuildDepsNotAdditive1
+version: 0.1
+license: BSD3
+cabal-version: >= 1.6
+author: Stephen Blackheath
+stability: stable
+category: PackageTests
+build-type: Simple
+
+description:
+    If you specify 'base' in the global build dependencies, then define
+    a library without base, it fails to find 'base' for the library.
+
+---------------------------------------
+
+build-depends: base
+
+Library
+    exposed-modules: MyLibrary
+    build-depends: bytestring, old-time
diff --git a/cabal/Cabal/tests/PackageTests/BuildDeps/GlobalBuildDepsNotAdditive2/GlobalBuildDeps b/cabal/Cabal/tests/PackageTests/BuildDeps/GlobalBuildDepsNotAdditive2/GlobalBuildDeps
deleted file mode 100644
--- a/cabal/Cabal/tests/PackageTests/BuildDeps/GlobalBuildDepsNotAdditive2/GlobalBuildDeps
+++ /dev/null
@@ -1,20 +0,0 @@
-name: GlobalBuildDepsNotAdditive1
-version: 0.1
-license: BSD3
-cabal-version: >= 1.6
-author: Stephen Blackheath
-stability: stable
-category: PackageTests
-build-type: Simple
-
-description:
-    If you specify 'base' in the global build dependencies, then define
-    an executable without base, it fails to find 'base' for the executable
-
----------------------------------------
-
-build-depends: base
-
-Executable lemon
-    main-is: lemon.hs
-    build-depends: bytestring, old-time
diff --git a/cabal/Cabal/tests/PackageTests/BuildDeps/GlobalBuildDepsNotAdditive2/GlobalBuildDepsNot b/cabal/Cabal/tests/PackageTests/BuildDeps/GlobalBuildDepsNotAdditive2/GlobalBuildDepsNot
new file mode 100644
--- /dev/null
+++ b/cabal/Cabal/tests/PackageTests/BuildDeps/GlobalBuildDepsNotAdditive2/GlobalBuildDepsNot
@@ -0,0 +1,20 @@
+name: GlobalBuildDepsNotAdditive1
+version: 0.1
+license: BSD3
+cabal-version: >= 1.6
+author: Stephen Blackheath
+stability: stable
+category: PackageTests
+build-type: Simple
+
+description:
+    If you specify 'base' in the global build dependencies, then define
+    an executable without base, it fails to find 'base' for the executable
+
+---------------------------------------
+
+build-depends: base
+
+Executable lemon
+    main-is: lemon.hs
+    build-depends: bytestring, old-time
diff --git a/hackport.cabal b/hackport.cabal
--- a/hackport.cabal
+++ b/hackport.cabal
@@ -1,5 +1,5 @@
 Name:           hackport
-Version:	0.2.19
+Version:	0.3
 License:	GPL
 License-file:   LICENSE
 Author:		Henning Günther, Duncan Coutts, Lennart Kolmodin
