diff --git a/Angel/Config.hs b/Angel/Config.hs
--- a/Angel/Config.hs
+++ b/Angel/Config.hs
@@ -1,5 +1,6 @@
 module Angel.Config where
 
+import Data.Maybe (isJust)
 import Control.Exception (try, SomeException)
 import qualified Data.Map as M
 import Control.Monad (when, mapM_)
@@ -28,38 +29,53 @@
     return $! HM.foldlWithKey' addToMap M.empty $ cfg
   where
     addToMap :: SpecKey -> Name -> Value -> SpecKey
-    addToMap m key value =
+    addToMap m 
+             (split "." . T.unpack -> [basekey, localkey])
+             value =
         let !newprog = case M.lookup basekey m of
                           Just prog -> modifyProg prog localkey value
                           Nothing   -> modifyProg defaultProgram{name=basekey} localkey value
             in
         M.insert basekey newprog m
-      where
-        (basekey:localkey:[]) = split "." (T.unpack key)
+    addToMap m _ _ = m
 
 checkConfigValues :: SpecKey -> IO SpecKey
 checkConfigValues progs = (mapM_ checkProgram $ M.elems progs) >> (return progs)
   where
-    checkProgram p = void $ when (exec p == "") $ error $ name p ++ " does not have an 'exec' specification"
+    checkProgram p = void $ when (exec p == Nothing) $ error $ name p ++ " does not have an 'exec' specification"
 
 modifyProg :: Program -> String -> Value -> Program
-modifyProg prog "exec" (String s) = prog{exec = (T.unpack s)}
+modifyProg prog "exec" (String s) | isJust (exec prog) = 
+    error $ "redefinition of '" ++ (name prog) ++ ".exec'"
+                                  | otherwise          = 
+    prog{exec = Just (T.unpack s)}
 modifyProg prog "exec" _ = error "wrong type for field 'exec'; string required"
 
-modifyProg prog "delay" (Number n) | n < 0     = error "delay value must be >= 0"
-                                   | otherwise = prog{delay = round n}
+modifyProg prog "delay" (Number n) | isJust (delay prog) =
+    error $ "redefinition of '" ++ (name prog) ++ ".prog'"
+                                   | n < 0     = error "delay value must be >= 0"
+                                   | otherwise = prog{delay = Just $ round n}
 modifyProg prog "delay" _ = error "wrong type for field 'delay'; integer"
 
-modifyProg prog "stdout" (String s) = prog{stdout = (T.unpack s)}
+modifyProg prog "stdout" (String s) | isJust (stdout prog) =
+    error $ "redefinition of '" ++ (name prog) ++ ".stdout'"
+                                    | otherwise = 
+    prog{stdout = Just (T.unpack s)}
 modifyProg prog "stdout" _ = error "wrong type for field 'stdout'; string required"
 
-modifyProg prog "stderr" (String s) = prog{stderr = (T.unpack s)}
+modifyProg prog "stderr" (String s) | isJust (stderr prog) = 
+    error $ "redefinition of '" ++ (name prog) ++ ".stderr'"
+                                    | otherwise =
+    prog{stderr = Just (T.unpack s)}
 modifyProg prog "stderr" _ = error "wrong type for field 'stderr'; string required"
 
-modifyProg prog "directory" (String s) = prog{workingDir = (Just $ T.unpack s)}
+modifyProg prog "directory" (String s) | isJust (workingDir prog) = 
+    error $ "redefinition of '" ++ (name prog) ++ ".directory'"
+                                       | otherwise =
+    prog{workingDir = (Just $ T.unpack s)}
 modifyProg prog "directory" _ = error "wrong type for field 'directory'; string required"
 
-modifyProg prog n _ = error $ "unrecognized field: " ++ n
+modifyProg prog n _ = prog
 
 
 -- |invoke the parser to process the file at configPath
diff --git a/Angel/Data.hs b/Angel/Data.hs
--- a/Angel/Data.hs
+++ b/Angel/Data.hs
@@ -24,10 +24,10 @@
 -- |read from the config file
 data Program = Program {
     name :: String,
-    exec :: String,
-    delay :: Int,
-    stdout :: String,
-    stderr :: String,
+    exec :: Maybe String,
+    delay :: Maybe Int,
+    stdout :: Maybe String,
+    stderr :: Maybe String,
     workingDir :: Maybe FilePath
 } deriving (Show, Eq, Ord)
 
@@ -36,11 +36,7 @@
 
 -- |a template for an empty program; the variable set to ""
 -- |are required, and must be overridden in the config file
-defaultProgram = Program{
-    name="",
-    exec="",
-    delay=5,
-    stdout="/dev/null",
-    stderr="/dev/null",
-    workingDir = Nothing
-}
+defaultProgram = Program "" Nothing Nothing Nothing Nothing Nothing
+defaultDelay = 5 :: Int
+defaultStdout = "/dev/null"
+defaultStderr = "/dev/null"
diff --git a/Angel/Job.hs b/Angel/Job.hs
--- a/Angel/Job.hs
+++ b/Angel/Job.hs
@@ -1,7 +1,7 @@
 module Angel.Job where
 
 import Data.String.Utils (split, strip)
-import Data.Maybe (isJust, fromJust)
+import Data.Maybe (isJust, fromJust, fromMaybe)
 import System.Process (createProcess, proc, waitForProcess, ProcessHandle)
 import System.Process (terminateProcess, CreateProcess(..), StdStream(..))
 import Control.Concurrent
@@ -34,7 +34,7 @@
         (do
             (attachOut, attachErr) <- makeFiles my_spec cfg
 
-            let (cmd, args) = cmdSplit $ exec my_spec
+            let (cmd, args) = cmdSplit $ (fromJust $ exec my_spec)
             
             (_, _, _, p) <- createProcess (proc cmd args){
             std_out = attachOut,
@@ -57,7 +57,7 @@
 
                 else do 
                 log  "WAITING"
-                sleepSecs $ delay my_spec
+                sleepSecs $ (fromMaybe defaultDelay $ delay my_spec)
                 log  "RESTART"
                 supervise sharedGroupConfig id
         )
@@ -79,14 +79,13 @@
                 running=M.delete id (running wcfg)
             }
             
-        makeFiles my_spec cfg = do  
-            attachOut <- case stdout my_spec of
-                ""    -> return Inherit
-                other -> UseHandle `fmap` getFile other cfg
-  
-            attachErr <- case stderr my_spec of
-                ""    -> return Inherit
-                other -> UseHandle `fmap` getFile other cfg
+        makeFiles my_spec cfg = do
+            let useout = fromMaybe defaultStdout $ stdout my_spec
+            attachOut <- UseHandle `fmap` getFile useout cfg
+
+            let useerr = fromMaybe defaultStderr $ stderr my_spec
+            attachErr <- UseHandle `fmap` getFile useerr cfg
+
             return $ (attachOut, attachErr)
 
 
diff --git a/angel.cabal b/angel.cabal
--- a/angel.cabal
+++ b/angel.cabal
@@ -7,7 +7,7 @@
 -- The package version. See the Haskell package versioning policy
 -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for
 -- standards guiding when and how versions should be incremented.
-Version:             0.3.2
+Version:             0.3.3
 
 -- A short (one-line) description of the package.
 -- Synopsis:            
@@ -92,6 +92,6 @@
   -- Extra tools (e.g. alex, hsc2hs, ...) needed to build the source.
   -- Build-tools:         
 
-  Extensions: OverloadedStrings,ScopedTypeVariables,BangPatterns
+  Extensions: OverloadedStrings,ScopedTypeVariables,BangPatterns,ViewPatterns
   
   Ghc-Options: -threaded 
