diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -7,7 +7,9 @@
 main = getArgs >>= parse
 
 parse :: [String] -> IO ()
-parse ["add"] = with_db add
+parse ["add"] = do
+  _ <- with_db add
+  return ()
 parse ["dump"] = with_db dump
 parse [] = with_db pick
 parse _ = urge_to_add
@@ -20,7 +22,6 @@
       [r] -> focus conn r
       _ -> undefined
 
-
 focus :: IConnection t => t -> [SqlValue] -> IO ()
 focus conn [i,name,SqlNull] = do
   putStrLn $ fromSql name
@@ -47,16 +48,22 @@
 add_wait :: IConnection conn => SqlValue -> conn -> IO ()
 add_wait i conn = do
   dump conn
+  putStrLn "n: a new task"
   putStrLn "after which task?"
   putStr "> "
   hFlush stdout
   number <- getLine
-  count <- quickQuery' conn "SELECT * FROM htodo WHERE id = ?" [toSql number]
-  if ((count == []) || (toSql number == i)) then
-     error "invalid task number specified"
-     else do
-       _ <- run conn "UPDATE htodo SET waiting = ? WHERE id = ?" [toSql number, i]
-       commit conn
+  if number == "n" then do
+    added <- add conn
+    _ <- run conn "UPDATE htodo SET waiting = ? WHERE id = ?" [toSql added, i]
+    commit conn
+    else do
+      count <- quickQuery' conn "SELECT * FROM htodo WHERE id = ?" [toSql number]
+      if ((count == []) || (toSql number == i)) then
+        error "invalid task number specified"
+        else do
+          _ <- run conn "UPDATE htodo SET waiting = ? WHERE id = ?" [toSql number, i]
+          commit conn
 
 dump :: IConnection conn => conn -> IO ()
 dump conn = do
@@ -69,26 +76,28 @@
         pp tl
       pp _ = error "should not happen"
 
-add :: Connection -> IO ()
+add :: IConnection conn => conn -> IO Integer
 add conn = do
   putStr "a task to: "
   hFlush stdout
   task <- getLine
   _ <- run conn "INSERT INTO htodo (name, waiting) VALUES (?, ?)" [toSql task, SqlNull]
   commit conn
-  return ()
+  [i] : _  <- quickQuery' conn "SELECT id FROM htodo WHERE name = ?" [toSql task]
+  return $ fromSql i
 
 db :: IO String
 db = do
   home <- getEnv "HOME"
   return $ home ++ "/.htodo.db"
 
-with_db :: (Connection -> IO ()) -> IO ()
+with_db :: (Connection -> IO a) -> IO a
 with_db f = do
   conn <- db >>= connectSqlite3
   _ <- run conn schema []
-  f conn
+  r <- f conn
   disconnect conn
+  return r
 
 schema :: String
 schema = "CREATE TABLE IF NOT EXISTS htodo (id INTEGER PRIMARY KEY, name TEXT, waiting INTEGER)"
diff --git a/htodo.cabal b/htodo.cabal
--- a/htodo.cabal
+++ b/htodo.cabal
@@ -1,6 +1,6 @@
 name:          htodo
 category:      Other
-version:       0.0.3
+version:       0.0.4
 license:       BSD3
 cabal-version: >= 1.6
 license-file:  LICENSE
