diff --git a/doc/vcsh.1.ronn b/doc/vcsh.1.ronn
index 05da4fad8bfe18dce47ab8aaa2c3dc9f9c619275..ebc9896f845b2363c385139285fe281acbf9c343 100644
--- a/doc/vcsh.1.ronn
+++ b/doc/vcsh.1.ronn
@@ -254,6 +254,17 @@ Available hooks are <pre-clone>, <post-clone>, <post-clone-retired>,
 If you need more, vcsh is trivial to patch, but please let upstream know so
 we can ship them by default.
 
+## OVERLAY SYSTEM
+
+`vcsh` also provides an overlay system. Similar to hooks, the recommended
+locations are <$XDG_CONFIG_HOME/vcsh/overlays-available> and
+<$XDG_CONFIG_HOME/vcsh/overlays-enabled>.
+
+Overlays follow the same rules as hooks and you are free to overwrite any
+and all functions. As the overlays will be sourced and you are replacing
+arbitrary functions, any and all features may stop working, or you may even
+lose data. You have been warned.
+
 ## DETAILED HOWTO AND FURTHER READING
 
 Manpages are often short and sometimes useless to glean best practices from.
diff --git a/vcsh b/vcsh
index 0b4c45269d7cc30b862256ccd98cf5b74b99758e..301151a1d6d83ca10e678957300819ff50de5c3d 100755
--- a/vcsh
+++ b/vcsh
@@ -75,6 +75,7 @@ fi
 # Read defaults
 : ${VCSH_REPO_D:="$XDG_CONFIG_HOME/vcsh/repo.d"}
 : ${VCSH_HOOK_D:="$XDG_CONFIG_HOME/vcsh/hooks-enabled"}
+: ${VCSH_OVERLAY_D:="$XDG_CONFIG_HOME/vcsh/overlays-enabled"}
 : ${VCSH_BASE:="$HOME"}
 : ${VCSH_GITIGNORE:=exact}
 : ${VCSH_GITATTRIBUTES:=none}
@@ -511,6 +512,14 @@ check_dir "$VCSH_REPO_D"
 
 verbose "$VCSH_COMMAND begin"
 VCSH_COMMAND=$(echo "$VCSH_COMMAND" | sed 's/-/_/g'); export VCSH_COMMAND
+
+# source overlay functions
+for overlay in "$VCSH_OVERLAY_D/$VCSH_COMMAND"* "$VCSH_OVERLAY_D/$VCSH_REPO_NAME.$VCSH_COMMAND"*; do
+	[ -r "$overlay" ] || continue
+	info "sourcing '$overlay'"
+	. "$overlay"
+done
+
 hook pre-command
 $VCSH_COMMAND "$@"
 hook post-command