diff --git a/debian-build.cabal b/debian-build.cabal
--- a/debian-build.cabal
+++ b/debian-build.cabal
@@ -1,5 +1,5 @@
 name:                debian-build
-version:             0.3.0.0
+version:             0.4.0.0
 synopsis:            Debian package build sequence tools
 description:         This package provides build sequence functions
                      for debian package, and includes on-the-fly
diff --git a/mains/odebuild.hs b/mains/odebuild.hs
--- a/mains/odebuild.hs
+++ b/mains/odebuild.hs
@@ -4,13 +4,16 @@
 
 import Debian.Package.Data (Source, Hackage)
 import Debian.Package.Build
-  (BuildMode (All), buildPackage, debi,
+  (BuildMode (Bin, Src), buildPackage, debi,
    baseDirCurrent, defaultConfig, Build, runBuild, liftTrace,
    sourceDir, removeBuildDir, genSources, removeGhcLibrary)
 
 
+defualtModes :: [BuildMode]
+defualtModes =  [Bin, Src]
+
 remove' :: Hackage -> Build ()
-remove' =  liftTrace . removeGhcLibrary All
+remove' hkg = liftTrace $ sequence_ [removeGhcLibrary m hkg | m <- defualtModes]
 
 install' :: Source -> Build ()
 install' src = do
@@ -43,7 +46,7 @@
 build :: Maybe String -> [String] -> Build (Source, Maybe Hackage)
 build mayRev opts = do
   ((_, dir), src, mayH) <- source mayRev
-  liftTrace $ buildPackage dir All opts
+  liftTrace $ sequence_ [buildPackage dir m opts | m <- defualtModes]
   return (src, mayH)
 
 install :: Maybe String -> [String] -> Build ()
diff --git a/src/Debian/Package/Build/Command.hs b/src/Debian/Package/Build/Command.hs
--- a/src/Debian/Package/Build/Command.hs
+++ b/src/Debian/Package/Build/Command.hs
@@ -35,6 +35,7 @@
 import Data.Maybe (fromMaybe)
 import Control.Arrow ((&&&))
 import Control.Applicative ((<$>))
+import Control.Monad (unless)
 import Control.Monad.Trans.Class (lift)
 import System.FilePath ((<.>), takeDirectory)
 import qualified System.Directory as D
@@ -42,7 +43,9 @@
 import System.Exit (ExitCode (..))
 import Data.Version (Version, versionBranch, showVersion)
 
-import Debian.Package.Data (Hackage, ghcLibraryBinPackages, ghcLibraryPackages, Source, parseChangeLog, DebianVersion, readDebianVersion, origVersion')
+import Debian.Package.Data
+  (Hackage, ghcLibraryBinPackages, ghcLibraryPackages, ghcLibraryDocPackage,
+   Source, parseChangeLog, DebianVersion, readDebianVersion, origVersion')
 import Debian.Package.Build.Monad (Trace, traceCommand, traceOut, putLog, bracketTrace_)
 
 
@@ -194,13 +197,16 @@
 debi dir = withCurrentDir' dir . rawSystem' . (["sudo", "debi"] ++)
 
 -- | Build mode, all or binary only
-data BuildMode = All | Bin
+data BuildMode = All | Bin | Src | Dep | Indep
 
 -- | Build package using /debuild/ under specified directory
 buildPackage :: FilePath -> BuildMode -> [String] -> Trace ()
 buildPackage dir mode opts = do
-  let modeOpt All = []
-      modeOpt Bin = ["-B"]
+  let modeOpt All    =  []
+      modeOpt Bin    =  ["-b"]
+      modeOpt Src    =  ["-S"]
+      modeOpt Dep    =  ["-B"]
+      modeOpt Indep  =  ["-A"]
   debuild dir $ ["-uc", "-us"] ++ modeOpt mode ++ opts
 
 -- | Clean and build package using /debuild/ under specified directory
@@ -212,6 +218,11 @@
 -- | Remove ghc library packages under specified source package directory
 removeGhcLibrary :: BuildMode -> Hackage -> Trace ()
 removeGhcLibrary mode hkg = do
-  let pkgs All = ghcLibraryBinPackages
-      pkgs Bin = ghcLibraryPackages
-  system' $ unwords ["echo '' |", "sudo apt-get remove", unwords $ pkgs mode hkg, "|| true"]
+  let pkgs All   =  ghcLibraryPackages
+      pkgs Bin   =  ghcLibraryPackages
+      pkgs Src   =  const []
+      pkgs Dep   =  ghcLibraryBinPackages
+      pkgs Indep =  (:[]) . ghcLibraryDocPackage
+      pkgs' = pkgs mode hkg
+  unless (null pkgs') . system'
+    $ unwords ["echo '' |", "sudo apt-get remove", unwords pkgs', "|| true"]
diff --git a/src/Debian/Package/Build/Sequence.hs b/src/Debian/Package/Build/Sequence.hs
--- a/src/Debian/Package/Build/Sequence.hs
+++ b/src/Debian/Package/Build/Sequence.hs
@@ -216,7 +216,7 @@
 cabalAutogenSources hname mayRev = do
   debDir   <-  cabalAutogenDebianDir mayRev
   pkg      <-  liftTrace . dpkgParseChangeLog $ debDir </> "changelog"
-  hpkg     <-  either fail return $ haskellPackageFromPackage hname pkg
+  let hpkg =   haskellPackageFromPackage hname pkg
   pair@(_, srcDir)  <-  cabalGenOrigSources hpkg
   liftTrace $ renameDirectory debDir (srcDir </> takeFileName debDir)
   return (pair, hpkg)
@@ -242,7 +242,7 @@
   do clog <- findDebianChangeLog
      src  <- lift . liftTrace $ dpkgParseChangeLog clog
      (do hname <- takeBaseName <$> findCabalDescription
-         hpkg  <- either fail return $ haskellPackageFromPackage hname src
+         let hpkg = haskellPackageFromPackage hname src
          p <- lift $ cabalGenSources hpkg
          return (p, src, Just $ hackage hpkg)
       <|>
diff --git a/src/Debian/Package/Data/Hackage.hs b/src/Debian/Package/Data/Hackage.hs
--- a/src/Debian/Package/Data/Hackage.hs
+++ b/src/Debian/Package/Data/Hackage.hs
@@ -9,7 +9,7 @@
 --
 -- This module provides data types of hackage meta information.
 module Debian.Package.Data.Hackage
-       ( HackageVersion, mkHackageVersion, hackageVersionNumbers
+       ( HackageVersion, mkHackageVersion, mkHackageVersion', hackageVersionNumbers
 
        , Hackage, mkHackage, hackageName, hackageVersion
        , debianShortName, mkHackageDefault
@@ -34,14 +34,16 @@
 newtype HackageVersion = HackageVersion (Version)
 
 -- | Make 'HackageVersion'
+mkHackageVersion' :: [Int] -> HackageVersion
+mkHackageVersion' =  HackageVersion . (`Version` [])
+
+-- | Make 'HackageVersion'
 mkHackageVersion :: Int -> Int -> Int -> Int -> HackageVersion
-mkHackageVersion v0 v1 v2 v3 = HackageVersion $ Version [v0, v1, v2, v3] []
+mkHackageVersion v0 v1 v2 v3 = mkHackageVersion' [v0, v1, v2, v3]
 
 -- | Extract hackage version numbers.
-hackageVersionNumbers :: HackageVersion -> (Int, Int, Int, Int)
-hackageVersionNumbers = d  where
-  d (HackageVersion (Version [v0, v1, v2, v3] [])) = (v0, v1, v2, v3)
-  d hv                                             = error $ "HackageVersion: Invalid structure: " ++ show hv
+hackageVersionNumbers :: HackageVersion -> [Int]
+hackageVersionNumbers (HackageVersion (Version ns _)) = ns
 
 instance Show HackageVersion where
   show (HackageVersion v) = showVersion v
diff --git a/src/Debian/Package/Data/Source.hs b/src/Debian/Package/Data/Source.hs
--- a/src/Debian/Package/Data/Source.hs
+++ b/src/Debian/Package/Data/Source.hs
@@ -31,7 +31,7 @@
 import System.FilePath ((<.>))
 
 import Debian.Package.Data.Hackage
-  (HackageVersion, mkHackageVersion, hackageVersionNumbers,
+  (HackageVersion, mkHackageVersion', hackageVersionNumbers,
    Hackage, mkHackageDefault, NameRule (Simple), debianNamesFromSourceName)
 
 
@@ -73,9 +73,9 @@
 -- | Make deebian version from hackage version
 versionFromHackageVersion :: HackageVersion -> Maybe String -> DebianVersion
 versionFromHackageVersion hv = d where
-  d (Just rev) = debianNonNativeVersion [v0, v1, v2, v3] rev
-  d Nothing    = debianNativeVersion    [v0, v1, v2, v3] Nothing
-  (v0, v1, v2, v3) = hackageVersionNumbers hv
+  d (Just rev) = debianNonNativeVersion ns rev
+  d Nothing    = debianNativeVersion    ns Nothing
+  ns = hackageVersionNumbers hv
 
 -- | Version without debian revision
 origVersion' :: DebianVersion -> Version
@@ -166,10 +166,8 @@
 sourceDirName pkg = sourceName pkg ++ '-' : showVersion (origVersion pkg)
 
 -- | Try to make 'HackageVersion' from 'Source'
-deriveHackageVersion :: Source -> Maybe HackageVersion
-deriveHackageVersion =  d . versionBranch . origVersion where
-  d [v0, v1, v2, v3] = Just $ mkHackageVersion v0 v1 v2 v3
-  d _                = Nothing
+deriveHackageVersion :: Source -> HackageVersion
+deriveHackageVersion =  mkHackageVersion' . versionBranch . origVersion where
 
 -- | Try to generate 'Source' from debian changelog string
 parseChangeLog :: String       -- ^ dpkg-parsechangelog result string
@@ -213,11 +211,9 @@
     (sn, _) = debianNamesFromSourceName rule hname
 
 -- | Generate 'HaskellPackage' with hackage name and debian package meta-info
-haskellPackageFromPackage :: String                       -- ^ Hackage name string
-                          -> Source                       -- ^ Debian package meta info
-                          -> Either String HaskellPackage -- ^ Result
-haskellPackageFromPackage hname pkg = do
-  hv <- maybe (Left "Fail to derive hackage version") Right
-        $ deriveHackageVersion pkg
-  let hkg = mkHackageDefault Simple hname hv
-  return $ HaskellPackage hkg pkg
+haskellPackageFromPackage :: String         -- ^ Hackage name string
+                          -> Source         -- ^ Debian package meta info
+                          -> HaskellPackage -- ^ Result
+haskellPackageFromPackage hname pkg = HaskellPackage hkg pkg  where
+  hv  = deriveHackageVersion pkg
+  hkg = mkHackageDefault Simple hname hv
