Add hidden tests
diff --git a/help_test.go b/help_test.go
index 33f67a3..33d21bf 100644
--- a/help_test.go
+++ b/help_test.go
@@ -22,6 +22,7 @@
 	EnvDefault2       string            `long:"env-default2" env:"ENV_DEFAULT" description:"Test env-default2 value"`
 	OptionWithArgName string            `long:"opt-with-arg-name" value-name:"something" description:"Option with named argument"`
 	OptionWithChoices string            `long:"opt-with-choices" value-name:"choice" choice:"dog" choice:"cat" description:"Option with choices"`
+	Hidden            string            `long:"hidden" description:"Hidden option" hidden:"yes"`
 
 	OnlyIni string `ini-name:"only-ini" description:"Option only available in ini"`
 
@@ -30,8 +31,13 @@
 		IntMap      map[string]int `long:"intmap" default:"a:1" description:"A map from string to int" ini-name:"int-map"`
 	} `group:"Other Options"`
 
+	HiddenGroup struct {
+		InsideHiddenGroup string `long:"inside-hidden-group" description:"Inside hidden group"`
+	} `group:"Hidden group" hidden:"yes"`
+
 	Group struct {
-		Opt string `long:"opt" description:"This is a subgroup option"`
+		Opt               string `long:"opt" description:"This is a subgroup option"`
+		HiddenInsideGroup string `long:"hidden-inside-group" description:"Hidden inside group" hidden:"yes"`
 
 		Group struct {
 			Opt string `long:"opt" description:"This is a subsubgroup option"`
@@ -42,6 +48,10 @@
 		ExtraVerbose []bool `long:"extra-verbose" description:"Use for extra verbosity"`
 	} `command:"command" alias:"cm" alias:"cmd" description:"A command"`
 
+	HiddenCommand struct {
+		ExtraVerbose []bool `long:"extra-verbose" description:"Use for extra verbosity"`
+	} `command:"hidden-command" description:"A hidden command" hidden:"yes"`
+
 	Args struct {
 		Filename string `positional-arg-name:"filename" description:"A filename"`
 		Number   int    `positional-arg-name:"num" description:"A number"`
diff --git a/ini_private.go b/ini_private.go
index 887aa76..45434ec 100644
--- a/ini_private.go
+++ b/ini_private.go
@@ -83,7 +83,7 @@
 	comments := (options & IniIncludeComments) != IniNone
 
 	for _, option := range group.options {
-		if option.isFunc() {
+		if option.isFunc() || option.Hidden {
 			continue
 		}
 
@@ -186,12 +186,18 @@
 
 func writeCommandIni(command *Command, namespace string, writer io.Writer, options IniOptions) {
 	command.eachGroup(func(group *Group) {
-		writeGroupIni(command, group, namespace, writer, options)
+		if !group.Hidden {
+			writeGroupIni(command, group, namespace, writer, options)
+		}
 	})
 
 	for _, c := range command.commands {
 		var nns string
 
+		if c.Hidden {
+			continue
+		}
+
 		if len(namespace) != 0 {
 			nns = c.Name + "." + nns
 		} else {
diff --git a/man.go b/man.go
index 5529d92..8e4a8b7 100644
--- a/man.go
+++ b/man.go
@@ -38,7 +38,7 @@
 
 func writeManPageOptions(wr io.Writer, grp *Group) {
 	grp.eachGroup(func(group *Group) {
-		if grp.Hidden {
+		if group.Hidden {
 			return
 		}