diff --git a/.gitignore b/.gitignore
index 0fb347a55404138f2b502170a1c4b5f9da5c5a1c..88e889980cb489d9f9f2ed5f9f2230c790edf139 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
-zshrc.local
 cache
+zshrc.local
diff --git a/README.md b/README.md
index 9b20eca6332808d3fbc8dbc6868c45f8cef724fe..e1d8bed08ec2283ccd189666863554b44eca57b6 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@
 
 # Customizing
 
-Customizing can be done by editing the .zsh/zshrc.local file.
+Customizing can be done by adding files to ~/.zsh/zshrc_local.d/ directory and editing the ~/.zsh/zshrc.local file.
 
 If you have something awesome to contribute, please consider adding it to zshrc.d/.
 
diff --git a/completion/.gitignore b/completion/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..5e7d2734cfc60289debf74293817c0a8f572ff32
--- /dev/null
+++ b/completion/.gitignore
@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/contrib/awit-ssh-completion/INSTALL b/contrib/awit-ssh-completion/INSTALL
index 5b4e5bff97db1930e5017b1e3888ee3a56195ace..3b76f6af6c801a6358c4bd34d9c79cadcd7a840f 100755
--- a/contrib/awit-ssh-completion/INSTALL
+++ b/contrib/awit-ssh-completion/INSTALL
@@ -20,10 +20,10 @@ fi
 
 if [ ! -e ~/.zsh/zshrc.d/51-completion-awit-ssh.zsh ]; then
 	# Install
-	ln -s ~/.zsh/contrib/awit-ssh-completion/51-completion-awit-ssh.zsh ~/.zsh/zshrc.d/
+	ln -s ~/.zsh/contrib/awit-ssh-completion/51-completion-awit-ssh.zsh ~/.zsh/zshrc_local.d/
 	echo "Installed ~/.zsh/zshrc.d/51-completion-awit-ssh.zsh"
 else
 	# Uninstall
-	rm -f ~/.zsh/zshrc.d/51-completion-awit-ssh.zsh
-	echo "Uninstalled ~/.zsh/zshrc.d/51-completion-awit-ssh.zsh"
+	rm -f ~/.zsh/zshrc.d/51-completion-awit-ssh.zsh ~/.zsh/zshrc_local.d/51-completion-awit-ssh.zsh
+	echo "Uninstalled ~/.zsh/zshrc.d/51-completion-awit-ssh.zsh and ~/.zsh/zshrc_local.d/51-completion-awit-ssh.zsh"
 fi
diff --git a/custom/.gitignore b/custom/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..cf1c3b0cfc1b81011853e3e1e29a7102dd911721
--- /dev/null
+++ b/custom/.gitignore
@@ -0,0 +1,2 @@
+# https://github.com/robbyrussell/oh-my-zsh/wiki/Customization#overriding-internals
+*.zsh
diff --git a/custom/lib/.gitignore b/custom/lib/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..cf1c3b0cfc1b81011853e3e1e29a7102dd911721
--- /dev/null
+++ b/custom/lib/.gitignore
@@ -0,0 +1,2 @@
+# https://github.com/robbyrussell/oh-my-zsh/wiki/Customization#overriding-internals
+*.zsh
diff --git a/custom/plugins/.gitignore b/custom/plugins/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..22568852588b5353b40ea95411b3788cd272a64a
--- /dev/null
+++ b/custom/plugins/.gitignore
@@ -0,0 +1,6 @@
+# https://github.com/robbyrussell/oh-my-zsh/wiki/Customization#overriding-and-adding-plugins
+#
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/custom/themes/.gitignore b/custom/themes/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..98903b43edd81279b6f126a6710ededfe5348319
--- /dev/null
+++ b/custom/themes/.gitignore
@@ -0,0 +1,6 @@
+# https://github.com/robbyrussell/oh-my-zsh/wiki/Customization#overriding-and-adding-themes
+#
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/zshrc b/zshrc
index 60a34170855dfd5bad9ab07b4ad8467d873afc71..8a38c619ab98c5cdea93bbceb1e8038f312d1310 100644
--- a/zshrc
+++ b/zshrc
@@ -2,10 +2,24 @@
 setopt EXTENDED_GLOB
 
 # Source in resources
-for F in ~/.zsh/zshrc.d/([a-zA-Z0-9-]##).zsh; do
-	source $F
+find ~/.zsh/zshrc{,_local}.d/([a-zA-Z0-9-]##).zsh | sort -t/ -k6,6 | while read LINE; do
+	DIR="${LINE%/*}"
+	FILE="${LINE##*/}"
+
+	# If there's a file in zshrc_local.d with the same name as one
+	# in zshrc.d, ignore the file in zshrc.d
+	if [[ "$DIR" =~ "zshrc.d" ]] && [ -e "~/.zsh/zshrc_local.d/$FILE" ]; then
+		# Do nothing
+		:
+	else
+		source "$LINE"
+	fi
 done
 
+# NB: Note that precedence matters, so some settings will not yield the
+# expected results when put into ~/.zsh/zshrc.local. In that case you need
+# to figure out the file number and put it into ~/.zsh/zshrc_local.d/
+
 # Source in local stuff
 if [ -f ~/.zsh/zshrc.local ]
 then
diff --git a/zshrc_local.d/.gitignore b/zshrc_local.d/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..5e7d2734cfc60289debf74293817c0a8f572ff32
--- /dev/null
+++ b/zshrc_local.d/.gitignore
@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore