diff --git a/command.go b/command.go
index ede3243e..c5a19774 100644
--- a/command.go
+++ b/command.go
@@ -65,6 +65,10 @@ type Command struct {
 	// PostRun runs the command after run.
 	// The args are the arguments after the command name.
 	PostRun func(cmd *Command, args []string)
+	// PreRun which children of this command will inherit.
+	PersistentPreRun func(cmd *Command, args []string)
+	// PostRun which children of this command will inherit.
+	PersistentPostRun func(cmd *Command, args []string)
 	// Commands is the list of commands supported by this program.
 	commands []*Command
 	// Parent Command for this command
@@ -455,6 +459,9 @@ func (c *Command) execute(a []string) (err error) {
 	c.preRun()
 	argWoFlags := c.Flags().Args()
 
+	if c.PersistentPreRun != nil {
+		c.PersistentPreRun(c, argWoFlags)
+	}
 	if c.PreRun != nil {
 		c.PreRun(c, argWoFlags)
 	}
@@ -464,6 +471,9 @@ func (c *Command) execute(a []string) (err error) {
 	if c.PostRun != nil {
 		c.PostRun(c, argWoFlags)
 	}
+	if c.PersistentPostRun != nil {
+		c.PersistentPostRun(c, argWoFlags)
+	}
 
 	return nil
 }
@@ -545,7 +555,9 @@ func (c *Command) initHelp() {
 			Short: "Help about any command",
 			Long: `Help provides help for any command in the application.
     Simply type ` + c.Name() + ` help [path to command] for full details.`,
-			Run: c.HelpFunc(),
+			Run:               c.HelpFunc(),
+			PersistentPreRun:  func(cmd *Command, args []string) {},
+			PersistentPostRun: func(cmd *Command, args []string) {},
 		}
 	}
 	c.AddCommand(c.helpCommand)
@@ -585,6 +597,14 @@ func (c *Command) AddCommand(cmds ...*Command) {
 			c.commandsMaxNameLen = nameLen
 		}
 		c.commands = append(c.commands, x)
+
+		// Pass on peristent pre/post functions to children
+		if x.PersistentPreRun == nil {
+			x.PersistentPreRun = c.PersistentPreRun
+		}
+		if x.PersistentPostRun == nil {
+			x.PersistentPostRun = c.PersistentPostRun
+		}
 	}
 }