diff --git a/System/Console/CmdArgs/Implicit.hs b/System/Console/CmdArgs/Implicit.hs
--- a/System/Console/CmdArgs/Implicit.hs
+++ b/System/Console/CmdArgs/Implicit.hs
@@ -16,7 +16,7 @@
     
     * The help message: 'help', 'typ', 'details', 'summary', 'program', 'groupname'
     
-    * Flag behaviour: 'opt', 'enum', 'verbosity'
+    * Flag behaviour: 'opt', 'enum', 'verbosity', 'ignore'
     
     * Flag name assignment: 'name', 'explicit'
     
diff --git a/System/Console/CmdArgs/Implicit/Ann.hs b/System/Console/CmdArgs/Implicit/Ann.hs
--- a/System/Console/CmdArgs/Implicit/Ann.hs
+++ b/System/Console/CmdArgs/Implicit/Ann.hs
@@ -9,6 +9,7 @@
     = Help String
     | Name String
     | Explicit
+    | Ignore
     | GroupName String
 
     | FlagOptional String
diff --git a/System/Console/CmdArgs/Implicit/Global.hs b/System/Console/CmdArgs/Implicit/Global.hs
--- a/System/Console/CmdArgs/Implicit/Global.hs
+++ b/System/Console/CmdArgs/Implicit/Global.hs
@@ -26,7 +26,8 @@
 collapse :: Prog_ -> Mode (CmdArgs Any)
 collapse x | length ms == 1 = (head ms){modeNames=[progProgram x]}
            | length auto > 1 = err "prog" "Multiple automatic modes"
-           | otherwise = (head $ map zeroMode auto ++ map emptyMode ms){modeNames=[progProgram x], modeGroupModes = toGroup ms}
+           | otherwise = (head $ map zeroMode auto ++ map emptyMode ms)
+                {modeNames=[progProgram x], modeGroupModes = toGroup ms, modeHelp = progHelp x}
     where
         ms = map collapseMode $ progModes x
         auto = [m | (m,True) <- zip ms $ map modeDefault $ progModes x]
diff --git a/System/Console/CmdArgs/Implicit/Local.hs b/System/Console/CmdArgs/Implicit/Local.hs
--- a/System/Console/CmdArgs/Implicit/Local.hs
+++ b/System/Console/CmdArgs/Implicit/Local.hs
@@ -79,19 +79,21 @@
 
 prog_ :: Capture Ann -> Prog_
 prog_ (Ann a b) = progAnn a $ prog_ b
-prog_ (Many xs) = def{progModes=map mode_ xs, progProgram=prog}
+prog_ (Many xs) = def{progModes=concatMap mode_ xs, progProgram=prog}
     where prog = map toLower $ typeShell $ fromCapture $ head xs
 prog_ x@Ctor{} = prog_ $ Many [x]
 prog_ x = err "program" $ show x
 
 
-mode_ :: Capture Ann -> Mode_
-mode_ (Ann a b) = modeAnn a $ mode_ b
-mode_ o@(Ctor x ys) = withMode def{modeFlags_=concat $ zipWith flag_ (fields x) ys} $ \x -> x{modeValue=embed $ fromCapture o}
+mode_ :: Capture Ann -> [Mode_]
+mode_ (Ann Ignore _) = []
+mode_ (Ann a b) = map (modeAnn a) $ mode_ b
+mode_ o@(Ctor x ys) = [withMode def{modeFlags_=concat $ zipWith flag_ (fields x) ys} $ \x -> x{modeValue=embed $ fromCapture o}]
 mode_ x = err "mode" $ show x
 
 
 flag_ :: String -> Capture Ann -> [Flag_]
+flag_ name (Ann Ignore _) = []
 flag_ name (Ann a b) = map (flagAnn a) $ flag_ name b
 flag_ name (Value x) = [def{flagField=name, flagFlag = remap embed reembed $ value_ name x}]
 flag_ name x@Ctor{} = flag_ name $ Value $ fromCapture x
diff --git a/System/Console/CmdArgs/Implicit/UI.hs b/System/Console/CmdArgs/Implicit/UI.hs
--- a/System/Console/CmdArgs/Implicit/UI.hs
+++ b/System/Console/CmdArgs/Implicit/UI.hs
@@ -152,6 +152,16 @@
 explicit = Explicit
 
 
+-- | Flag/Mode: \"Ignore this field, don't let the user set it.\"
+--
+--   A mode or field is not dealt with by CmdArgs.
+--
+-- > {hello = def, extra = def &= ignore}
+-- >   --hello=VALUE
+ignore :: Ann
+ignore = Ignore
+
+
 -- | Modes: \"My program needs verbosity flags.\"
 --
 --   Add @--verbose@ and @--quiet@ flags.
diff --git a/System/Console/CmdArgs/Test/Implicit/Maker.hs b/System/Console/CmdArgs/Test/Implicit/Maker.hs
--- a/System/Console/CmdArgs/Test/Implicit/Maker.hs
+++ b/System/Console/CmdArgs/Test/Implicit/Maker.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE DeriveDataTypeable, RecordWildCards #-}
-{-# OPTIONS_GHC -fno-cse -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-cse -fno-warn-unused-binds -fno-warn-missing-fields #-}
 module System.Console.CmdArgs.Test.Implicit.Maker where
 import System.Console.CmdArgs
 import System.Console.CmdArgs.Test.Implicit.Util
@@ -61,6 +61,7 @@
     isHelpNot ["-?=one"] ["  -d --debug  Debug build"]
     isHelp ["-?=all"] ["maker [build] [OPTIONS] [ITEM]"]
     isHelp ["build","-?=one"] ["maker [build] [OPTIONS] [ITEM]"]
+    isHelp ["-?=one"] ["  Build helper program"]
     ["build","foo","--profile"] === build{files=["foo"],method=Profile}
     ["foo","--profile"] === build{files=["foo"],method=Profile}
     ["foo","--profile","--release"] === build{files=["foo"],method=Release}
diff --git a/System/Console/CmdArgs/Test/Implicit/Tests.hs b/System/Console/CmdArgs/Test/Implicit/Tests.hs
--- a/System/Console/CmdArgs/Test/Implicit/Tests.hs
+++ b/System/Console/CmdArgs/Test/Implicit/Tests.hs
@@ -227,13 +227,18 @@
     ["test12b"] === Test12B
     ["t"] === Test12B
 
--- #350, check help gets attached to modes properly
-data Test13 = Test13A | Test13B deriving (Eq,Show,Data,Typeable)
 
-mode13 = cmdArgsMode_ $ modes_ [record Test13A [] += help "foo", record Test13B [] += help "bar"]
-                        += help "all"
+-- the ignore annotation
+data Test13 = Test13A {foo13 :: Int, bar13 :: Either Int Int}
+            | Test13B {foo13 :: Int}
+            | Test13C {foo13 :: Int}
+              deriving (Eq,Show,Data,Typeable)
 
+mode13 = cmdArgsMode $ modes [Test13A 1 (Left 1 &= ignore), Test13B 1 &= ignore, Test13C{}]
+
 test13 = do
     let Tester{..} = tester "Test13" mode13
-    fails []
-    ["test13a"] === Test13A
+    fails ["test13b"]
+    fails ["test13a --bar13=1"]
+    ["test13a","--foo13=13"] === Test13A 13 (Left 1)
+    ["test13c","--foo13=13"] === Test13C 13
diff --git a/cmdargs.cabal b/cmdargs.cabal
--- a/cmdargs.cabal
+++ b/cmdargs.cabal
@@ -1,7 +1,7 @@
 cabal-version:      >= 1.6
 build-type:         Simple
 name:               cmdargs
-version:            0.5
+version:            0.6
 license:            BSD3
 license-file:       LICENSE
 category:           Console
