diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh
index c3fae6efb7f727adce57e42ca140961b76c9950d..30259372cd9f828a9308f3bd4a013afa85c95574 100644
--- a/oh-my-zsh.sh
+++ b/oh-my-zsh.sh
@@ -97,25 +97,12 @@ done
 unset config_file
 
 # Load the theme
-if [[ "$ZSH_THEME" == "random" ]]; then
-  if [[ "${(t)ZSH_THEME_RANDOM_CANDIDATES}" = "array" ]] && [[ "${#ZSH_THEME_RANDOM_CANDIDATES[@]}" -gt 0 ]]; then
-    themes=($ZSH/themes/${^ZSH_THEME_RANDOM_CANDIDATES}.zsh-theme)
+if [ ! "$ZSH_THEME" = ""  ]; then
+  if [ -f "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme" ]; then
+    source "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme"
+  elif [ -f "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme" ]; then
+    source "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme"
   else
-    themes=($ZSH/themes/*zsh-theme)
-  fi
-  N=${#themes[@]}
-  ((N=(RANDOM%N)+1))
-  RANDOM_THEME=${themes[$N]}
-  source "$RANDOM_THEME"
-  echo "[oh-my-zsh] Random theme '$RANDOM_THEME' loaded..."
-else
-  if [ ! "$ZSH_THEME" = ""  ]; then
-    if [ -f "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme" ]; then
-      source "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme"
-    elif [ -f "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme" ]; then
-      source "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme"
-    else
-      source "$ZSH/themes/$ZSH_THEME.zsh-theme"
-    fi
+    source "$ZSH/themes/$ZSH_THEME.zsh-theme"
   fi
 fi
diff --git a/plugins/themes/_theme b/plugins/themes/_theme
deleted file mode 100644
index 8214ddb0dd14f3e996da7f678140a1c913e45430..0000000000000000000000000000000000000000
--- a/plugins/themes/_theme
+++ /dev/null
@@ -1,3 +0,0 @@
-#compdef theme
-
-_arguments "1: :($(lstheme | tr "\n" " "))"
diff --git a/plugins/themes/themes.plugin.zsh b/plugins/themes/themes.plugin.zsh
index 2cd0ee3277006e079bd4c20dc09419976f6150a4..1fbde5b6463565ad2925aad780ac6fbfd25cc18f 100644
--- a/plugins/themes/themes.plugin.zsh
+++ b/plugins/themes/themes.plugin.zsh
@@ -1,26 +1,27 @@
-function theme
-{
-    if [ -z "$1" ] || [ "$1" = "random" ]; then
-	themes=($ZSH/themes/*zsh-theme)
-	N=${#themes[@]}
-	((N=(RANDOM%N)+1))
-	RANDOM_THEME=${themes[$N]}
-	source "$RANDOM_THEME"
-	echo "[oh-my-zsh] Random theme '$RANDOM_THEME' loaded..."
+function theme {
+    : ${1:=random} # Use random theme if none provided
+
+    if [[ -f "$ZSH_CUSTOM/$1.zsh-theme" ]]; then
+        source "$ZSH_CUSTOM/$1.zsh-theme"
+    elif [[ -f "$ZSH_CUSTOM/themes/$1.zsh-theme" ]]; then
+        source "$ZSH_CUSTOM/themes/$1.zsh-theme"
+    elif [[ -f "$ZSH/themes/$1.zsh-theme" ]]; then
+        source "$ZSH/themes/$1.zsh-theme"
     else
-	if [ -f "$ZSH_CUSTOM/themes/$1.zsh-theme" ]
-	then
-	    source "$ZSH_CUSTOM/themes/$1.zsh-theme"
-	else
-	    source "$ZSH/themes/$1.zsh-theme"
-	fi
+        echo "$0: Theme '$1' not found"
+        return 1
     fi
 }
 
-function lstheme
-{
+function _theme {
+    _arguments "1: :($(lstheme))"
+}
+
+compdef _theme theme
+
+function lstheme {
     # Resources:
     # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers
     # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Qualifiers
-    print -l {$ZSH,$ZSH_CUSTOM}/themes/*.zsh-theme(N:t:r)
+    print "$ZSH_CUSTOM"/*.zsh-theme(N:t:r) {"$ZSH_CUSTOM","$ZSH"}/themes/*.zsh-theme(N:t:r)
 }
diff --git a/themes/random.zsh-theme b/themes/random.zsh-theme
new file mode 100644
index 0000000000000000000000000000000000000000..43f6cbb60b5e9b4db46aec9cba2e5c0bb03ce2d2
--- /dev/null
+++ b/themes/random.zsh-theme
@@ -0,0 +1,38 @@
+# Make themes a unique array
+typeset -Ua themes
+
+if [[ "${(t)ZSH_THEME_RANDOM_CANDIDATES}" = array && ${#ZSH_THEME_RANDOM_CANDIDATES[@]} -gt 0 ]]; then
+  # Use ZSH_THEME_RANDOM_CANDIDATES if properly defined
+  themes=($ZSH_THEME_RANDOM_CANDIDATES)
+else
+  # Look for themes in $ZSH_CUSTOM and $ZSH and add only the theme name
+  themes=(
+    "$ZSH_CUSTOM"/*.zsh-theme(N:t:r)
+    "$ZSH_CUSTOM"/themes/*.zsh-theme(N:t:r)
+    "$ZSH"/themes/*.zsh-theme(N:t:r)
+  )
+  # Remove blacklisted themes from the list
+  for theme in ${ZSH_THEME_RANDOM_BLACKLIST[@]}; do
+    themes=("${(@)themes:#$theme}")
+  done
+fi
+
+# Choose a theme out of the pool of candidates
+N=${#themes[@]}
+(( N = (RANDOM%N) + 1 ))
+RANDOM_THEME="${themes[$N]}"
+unset N themes theme
+
+# Source theme
+if [[ -f "$ZSH_CUSTOM/$RANDOM_THEME.zsh-theme" ]]; then
+  source "$ZSH_CUSTOM/$RANDOM_THEME.zsh-theme"
+elif [[ -f "$ZSH_CUSTOM/themes/$RANDOM_THEME.zsh-theme" ]]; then
+  source "$ZSH_CUSTOM/themes/$RANDOM_THEME.zsh-theme"
+elif [[ -f "$ZSH/themes/$RANDOM_THEME.zsh-theme" ]]; then
+  source "$ZSH/themes/$RANDOM_THEME.zsh-theme"
+else
+  echo "[oh-my-zsh] Random theme '${RANDOM_THEME}' not found"
+  return 1
+fi
+
+echo "[oh-my-zsh] Random theme '${RANDOM_THEME}' loaded"