diff --git a/roles/zsh/files/.zshenv b/roles/zsh/files/.zshenv
index 97226809..803725dc 100644
--- a/roles/zsh/files/.zshenv
+++ b/roles/zsh/files/.zshenv
@@ -1,3 +1,5 @@
+export ZDOTDIR="$HOME/.config/zsh"
+
 PROMPT_EOL_MARK=''
 TERM=xterm-256color
 WORDCHARS='*?_-.[]~=&;!#$%^(){}<>'
diff --git a/roles/zsh/files/.zshrc b/roles/zsh/files/config/.zshrc
similarity index 88%
rename from roles/zsh/files/.zshrc
rename to roles/zsh/files/config/.zshrc
index f26e05f8..7ab803cc 100644
--- a/roles/zsh/files/.zshrc
+++ b/roles/zsh/files/config/.zshrc
@@ -15,9 +15,8 @@ sources=(
   'prompt'
   'post/completion'
 )
-
 for s in "${sources[@]}"; do
-  source $HOME/.zsh/configs/${s}.zsh
+  source $ZDOTDIR/configs/${s}.zsh
 done
 
 # Local config
diff --git a/roles/zsh/files/.zsh/completion-scripts/_g b/roles/zsh/files/config/completion-scripts/_g
similarity index 100%
rename from roles/zsh/files/.zsh/completion-scripts/_g
rename to roles/zsh/files/config/completion-scripts/_g
diff --git a/roles/zsh/files/.zsh/completion-scripts/_m b/roles/zsh/files/config/completion-scripts/_m
similarity index 100%
rename from roles/zsh/files/.zsh/completion-scripts/_m
rename to roles/zsh/files/config/completion-scripts/_m
diff --git a/roles/zsh/files/.zsh/configs/aliases.zsh b/roles/zsh/files/config/configs/aliases.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/aliases.zsh
rename to roles/zsh/files/config/configs/aliases.zsh
diff --git a/roles/zsh/files/.zsh/configs/colour.zsh b/roles/zsh/files/config/configs/colour.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/colour.zsh
rename to roles/zsh/files/config/configs/colour.zsh
diff --git a/roles/zsh/files/.zsh/configs/functions.zsh b/roles/zsh/files/config/configs/functions.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/functions.zsh
rename to roles/zsh/files/config/configs/functions.zsh
diff --git a/roles/zsh/files/.zsh/configs/fzf.zsh b/roles/zsh/files/config/configs/fzf.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/fzf.zsh
rename to roles/zsh/files/config/configs/fzf.zsh
diff --git a/roles/zsh/files/.zsh/configs/general.zsh b/roles/zsh/files/config/configs/general.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/general.zsh
rename to roles/zsh/files/config/configs/general.zsh
diff --git a/roles/zsh/files/.zsh/configs/git.zsh b/roles/zsh/files/config/configs/git.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/git.zsh
rename to roles/zsh/files/config/configs/git.zsh
diff --git a/roles/zsh/files/.zsh/configs/history.zsh b/roles/zsh/files/config/configs/history.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/history.zsh
rename to roles/zsh/files/config/configs/history.zsh
diff --git a/roles/zsh/files/.zsh/configs/navigation.zsh b/roles/zsh/files/config/configs/navigation.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/navigation.zsh
rename to roles/zsh/files/config/configs/navigation.zsh
diff --git a/roles/zsh/files/.zsh/configs/nvm.zsh b/roles/zsh/files/config/configs/nvm.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/nvm.zsh
rename to roles/zsh/files/config/configs/nvm.zsh
diff --git a/roles/zsh/files/.zsh/configs/options.zsh b/roles/zsh/files/config/configs/options.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/options.zsh
rename to roles/zsh/files/config/configs/options.zsh
diff --git a/roles/zsh/files/.zsh/configs/path.zsh b/roles/zsh/files/config/configs/path.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/path.zsh
rename to roles/zsh/files/config/configs/path.zsh
diff --git a/roles/zsh/files/.zsh/configs/platformsh.zsh b/roles/zsh/files/config/configs/platformsh.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/platformsh.zsh
rename to roles/zsh/files/config/configs/platformsh.zsh
diff --git a/roles/zsh/files/.zsh/configs/plugins.zsh b/roles/zsh/files/config/configs/plugins.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/plugins.zsh
rename to roles/zsh/files/config/configs/plugins.zsh
diff --git a/roles/zsh/files/.zsh/configs/plugins.zsh.zwc b/roles/zsh/files/config/configs/plugins.zsh.zwc
similarity index 100%
rename from roles/zsh/files/.zsh/configs/plugins.zsh.zwc
rename to roles/zsh/files/config/configs/plugins.zsh.zwc
diff --git a/roles/zsh/files/.zsh/configs/post/completion.zsh b/roles/zsh/files/config/configs/post/completion.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/post/completion.zsh
rename to roles/zsh/files/config/configs/post/completion.zsh
diff --git a/roles/zsh/files/.zsh/configs/prompt.zsh b/roles/zsh/files/config/configs/prompt.zsh
similarity index 100%
rename from roles/zsh/files/.zsh/configs/prompt.zsh
rename to roles/zsh/files/config/configs/prompt.zsh
diff --git a/roles/zsh/tasks/main.yaml b/roles/zsh/tasks/main.yaml
index cb36c203..225e5989 100644
--- a/roles/zsh/tasks/main.yaml
+++ b/roles/zsh/tasks/main.yaml
@@ -14,12 +14,21 @@
 
 - name: Configuration
   ansible.builtin.file:
-    src: "{{ role_path }}/files/{{ zsh_config_item }}"
-    dest: "{{ ansible_user_dir }}/{{ zsh_config_item }}"
+    src: "{{ role_path }}/files/{{ zsh_config_item.src }}"
+    path: "{{ zsh_config_item.path }}"
     state: link
   loop_control:
     loop_var: zsh_config_item
   with_items:
-    - .zsh
-    - .zshenv
-    - .zshrc
+    - { src: config, path: "{{ ansible_user_dir }}/.config/zsh" }
+    - { src: .zshenv, path: "{{ ansible_user_dir }}/.zshenv" }
+
+- name: Delete old files
+  ansible.builtin.file:
+    path: "{{ old_files_item }}"
+    state: absent
+  loop_control:
+    loop_var: old_files_item
+  with_items:
+    - "{{ ansible_user_dir }}/.zsh"
+    - "{{ ansible_user_dir }}/.zshrc"