diff --git a/Nemesis b/Nemesis
--- a/Nemesis
+++ b/Nemesis
@@ -8,15 +8,29 @@
     , "nemesis-tmp.*"
     ]
   
+
   desc "prepare cabal dist"
   task "dist" $ do
     sh "cabal clean"
     sh "cabal configure"
     sh "cabal sdist"
 
-  desc "start console"
-  task "i" (sh "ghci -isrc src/System/Nemesis.hs")
 
   desc "put all .hs files in manifest"
   task "manifest" $ do
     sh "find . | grep 'hs$' > manifest"
+
+
+  desc "start console"
+  task "i" (sh "ghci -isrc src/System/Nemesis/DSL.hs")
+
+  namespace "eat" $ do
+    
+    task "bread: salad" $ putStrLn "eating bread"
+    task "salad: /drink/coke" $ putStrLn "nice salad"
+    
+  
+  namespace "drink" $ do
+    
+    task "coke" $ putStrLn "drinking coke"
+    
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,10 @@
+2009.6.14.3
+-----------
+
+### Feature
+
+* new keyword namespace
+
 2009.6.14.2
 -----------
 
diff --git a/nemesis.cabal b/nemesis.cabal
--- a/nemesis.cabal
+++ b/nemesis.cabal
@@ -1,5 +1,5 @@
 Name:                 nemesis
-Version:              2009.6.14.2
+Version:              2009.6.14.3
 Build-type:           Simple
 Synopsis:             a rake like task management tool
 Description:
diff --git a/readme.md b/readme.md
--- a/readme.md
+++ b/readme.md
@@ -69,6 +69,32 @@
     Haskell is awesome!
     
 
+### Namespace
+
+Suppose you have the following tasks
+
+    namespace "eat" $ do
+
+      task "bread: salad" $ putStrLn "eating bread"
+      task "salad: /drink/coke" $ putStrLn "nice salad"
+
+
+    namespace "drink" $ do
+
+      task "coke" $ putStrLn "drinking coke"
+
+then
+
+    ./.nemesis bread =>
+    .nemesis: bread does not exist!
+    
+    ./.nemesis eat/bread =>
+    drinking coke
+    nice salad
+    eating bread
+    
+    
+
 Advance usage
 -------------
 
diff --git a/src/System/Nemesis.hs b/src/System/Nemesis.hs
--- a/src/System/Nemesis.hs
+++ b/src/System/Nemesis.hs
@@ -16,6 +16,7 @@
   , action :: IO ()
   , deps :: [String]
   , description :: Maybe String
+  , namespace :: [String]
   }
 
 data Nemesis = Nemesis
@@ -23,27 +24,34 @@
     tasks :: Map String Task
   , target :: String
   , current_desc :: Maybe String
+  , current_namespace :: [String]
   }
   deriving (Show)
 
 instance Default Nemesis where
-  def = Nemesis empty def def
+  def = Nemesis empty def def def
 
 instance Default Task where
-  def = Task def (return ()) def def
+  def = Task def (return ()) def def def
 
+full_name :: Task -> String
+full_name t = (t.name : t.namespace).reverse.join "/"
+
+display_name :: Task -> String
+display_name t = (t.name : t.namespace).reverse.map (rjust 10 ' ') .join " "
+
 instance Show Task where
   show x = case x.description of
     Nothing -> title
     Just s -> title ++ s
     where
-      title = x.name.ljust 20 ' ' ++ ": "
+      title = x.display_name.rjust 34 ' ' ++ ": "
 
 instance Eq Task where
   a == b = a.name == b.name
 
 instance Ord Task where
-  compare = compare_by name
+  compare = compare_by full_name
 
 type Unit = StateT Nemesis IO ()
 
@@ -67,9 +75,16 @@
 insert_task t = do
   n <- get
   let description = n.current_desc
-      tasks' = n.tasks.insert (t.name) t {description}
-     
+      namespace   = n.current_namespace
+      deps'       = t.deps.map (with_current namespace)
+      task        = t {deps = deps', description, namespace}
+      tasks'      = n.tasks.insert (task.full_name) task
+
   put n {tasks = tasks', current_desc = Nothing}
+  where
+    with_current namespace x
+      | x.starts_with "/" = x.tail
+      | otherwise = (x : namespace).reverse.join "/"
 
 run_nemesis :: Nemesis -> IO ()
 run_nemesis n = run' (n.target)
diff --git a/src/System/Nemesis/DSL.hs b/src/System/Nemesis/DSL.hs
--- a/src/System/Nemesis/DSL.hs
+++ b/src/System/Nemesis/DSL.hs
@@ -31,6 +31,23 @@
     task' name deps = insert_task def {name, deps, action}
     strip = dropWhile (== ' ') > reverse > dropWhile (== ' ') > reverse
 
+namespace :: String -> Unit -> Unit
+namespace name unit = do
+  push name
+  unit
+  pop
+  
+  where
+    push s = do
+      n <- get
+      let current_namespace' = s : n.current_namespace
+      put n {current_namespace = current_namespace'}
+    
+    pop = do
+      n <- get
+      let current_namespace' = n.current_namespace.tail
+      put n {current_namespace = current_namespace'}
+      
 sh :: String -> IO ()
 sh s = do
   status <- system s
diff --git a/src/System/Nemesis/Util.hs b/src/System/Nemesis/Util.hs
--- a/src/System/Nemesis/Util.hs
+++ b/src/System/Nemesis/Util.hs
@@ -32,11 +32,15 @@
 join' :: [[a]] -> [a]
 join'   = concat
 
-ljust :: Int -> a -> [a] -> [a]
+ljust, rjust :: Int -> a -> [a] -> [a]
 ljust n x xs 
   | n < xs.length = xs
   | otherwise     = ( n.times x ++ xs ).reverse.take n.reverse
 
+rjust n x xs
+  | n < xs.length = xs
+  | otherwise     = ( xs ++ n.times x ).take n
+    
 compare_by :: (Ord b) => (a -> b) -> a -> a -> Ordering
 compare_by = on compare
 
