diff --git a/ansible/roles/vitrage/defaults/main.yml b/ansible/roles/vitrage/defaults/main.yml
index a5c8bd5a1e06245b2c5f7bc06c255785ce3dfb46..d5719cfc57768ac9479098977fae47749ddf7711 100644
--- a/ansible/roles/vitrage/defaults/main.yml
+++ b/ansible/roles/vitrage/defaults/main.yml
@@ -10,6 +10,7 @@ vitrage_services:
     volumes:
       - "{{ node_config_directory }}/vitrage-api/:{{ container_config_directory }}/:ro"
       - "/etc/localtime:/etc/localtime:ro"
+      - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
       - "kolla_logs:/var/log/kolla/"
   vitrage-collector:
     container_name: vitrage_collector
@@ -19,6 +20,7 @@ vitrage_services:
     volumes:
       - "{{ node_config_directory }}/vitrage-collector/:{{ container_config_directory }}/:ro"
       - "/etc/localtime:/etc/localtime:ro"
+      - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
       - "kolla_logs:/var/log/kolla/"
   vitrage-notifier:
     container_name: vitrage_notifier
@@ -28,6 +30,7 @@ vitrage_services:
     volumes:
       - "{{ node_config_directory }}/vitrage-notifier/:{{ container_config_directory }}/:ro"
       - "/etc/localtime:/etc/localtime:ro"
+      - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
       - "kolla_logs:/var/log/kolla/"
   vitrage-graph:
     container_name: vitrage_graph
@@ -37,6 +40,7 @@ vitrage_services:
     volumes:
       - "{{ node_config_directory }}/vitrage-graph/:{{ container_config_directory }}/:ro"
       - "/etc/localtime:/etc/localtime:ro"
+      - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
       - "kolla_logs:/var/log/kolla/"
   vitrage-ml:
     container_name: vitrage_ml
@@ -46,6 +50,7 @@ vitrage_services:
     volumes:
       - "{{ node_config_directory }}/vitrage-ml/:{{ container_config_directory }}/:ro"
       - "/etc/localtime:/etc/localtime:ro"
+      - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
       - "kolla_logs:/var/log/kolla/"
 
 ####################
@@ -127,3 +132,11 @@ vitrage_datasource:
     enabled: "no"
 
 vitrage_datasources: "{{ vitrage_datasource | selectattr('enabled', 'equalto', true) | list }}"
+
+
+####################
+# Kolla
+####################
+vitrage_git_repository: "{{ kolla_dev_repos_git }}/{{ project_name }}"
+vitrage_dev_repos_pull: "{{ kolla_dev_repos_pull }}"
+vitrage_dev_mode: "{{ kolla_dev_mode }}"
diff --git a/ansible/roles/vitrage/handlers/main.yml b/ansible/roles/vitrage/handlers/main.yml
index 6e32a90f10a0286ff43a68827df0ad2cbf4b6698..b7573b47b7cdf18d67d65a7f9f1ca05ec61c201f 100644
--- a/ansible/roles/vitrage/handlers/main.yml
+++ b/ansible/roles/vitrage/handlers/main.yml
@@ -13,7 +13,7 @@
     common_options: "{{ docker_common_options }}"
     name: "{{ service.container_name }}"
     image: "{{ service.image }}"
-    volumes: "{{ service.volumes }}"
+    volumes: "{{ service.volumes | reject('equalto', '') | list }}"
   when:
     - kolla_action != "config"
     - inventory_hostname in groups[service.group]
@@ -37,7 +37,7 @@
     common_options: "{{ docker_common_options }}"
     name: "{{ service.container_name }}"
     image: "{{ service.image }}"
-    volumes: "{{ service.volumes }}"
+    volumes: "{{ service.volumes | reject('equalto', '') | list }}"
   when:
     - kolla_action != "config"
     - inventory_hostname in groups[service.group]
@@ -61,7 +61,7 @@
     common_options: "{{ docker_common_options }}"
     name: "{{ service.container_name }}"
     image: "{{ service.image }}"
-    volumes: "{{ service.volumes }}"
+    volumes: "{{ service.volumes | reject('equalto', '') | list }}"
   when:
     - kolla_action != "config"
     - inventory_hostname in groups[service.group]
@@ -85,7 +85,7 @@
     common_options: "{{ docker_common_options }}"
     name: "{{ service.container_name }}"
     image: "{{ service.image }}"
-    volumes: "{{ service.volumes }}"
+    volumes: "{{ service.volumes | reject('equalto', '') | list }}"
   when:
     - kolla_action != "config"
     - inventory_hostname in groups[service.group]
@@ -109,7 +109,7 @@
     common_options: "{{ docker_common_options }}"
     name: "{{ service.container_name }}"
     image: "{{ service.image }}"
-    volumes: "{{ service.volumes }}"
+    volumes: "{{ service.volumes | reject('equalto', '') | list }}"
   when:
     - kolla_action != "config"
     - inventory_hostname in groups[service.group]
diff --git a/ansible/roles/vitrage/tasks/bootstrap_service.yml b/ansible/roles/vitrage/tasks/bootstrap_service.yml
index debea107b248e599bae359e968cf200dccddf4fa..96daedfe483cb2b7dcb81adf2bba520ed43abb21 100644
--- a/ansible/roles/vitrage/tasks/bootstrap_service.yml
+++ b/ansible/roles/vitrage/tasks/bootstrap_service.yml
@@ -15,6 +15,6 @@
       BOOTSTRAP:
     name: "bootstrap_vitrage"
     restart_policy: "never"
-    volumes: "{{ vitrage_api.volumes }}"
+    volumes: "{{ vitrage_api.volumes | reject('equalto', '') | list }}"
   run_once: True
   delegate_to: "{{ groups[vitrage_api.group][0] }}"
diff --git a/ansible/roles/vitrage/tasks/clone.yml b/ansible/roles/vitrage/tasks/clone.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6a44ee63c6354ba99cd95e80da648363bee81066
--- /dev/null
+++ b/ansible/roles/vitrage/tasks/clone.yml
@@ -0,0 +1,6 @@
+---
+- name: Cloning vitrage source repository for development
+  git:
+    repo: "{{ vitrage_git_repository }}"
+    dest: "{{ kolla_dev_repos_directory }}/{{ project_name }}"
+    update: "{{ vitrage_dev_repos_pull }}"
diff --git a/ansible/roles/vitrage/tasks/config.yml b/ansible/roles/vitrage/tasks/config.yml
index 7165d9ea4a165eba01b3b915c9cc5089bbd30684..6890f1bbcde5389d294558aba2ca4cbb9e168cbf 100644
--- a/ansible/roles/vitrage/tasks/config.yml
+++ b/ansible/roles/vitrage/tasks/config.yml
@@ -110,7 +110,7 @@
     common_options: "{{ docker_common_options }}"
     name: "{{ item.value.container_name }}"
     image: "{{ item.value.image }}"
-    volumes: "{{ item.value.volumes }}"
+    volumes: "{{ item.value.volumes | reject('equalto', '') | list }}"
   register: check_vitrage_containers
   when:
     - kolla_action != "config"
diff --git a/ansible/roles/vitrage/tasks/deploy.yml b/ansible/roles/vitrage/tasks/deploy.yml
index ebb653b500014752404540f7f4112f1394fbb391..67b6bacde2b3c709e9ffea87024c7926c736e4ed 100644
--- a/ansible/roles/vitrage/tasks/deploy.yml
+++ b/ansible/roles/vitrage/tasks/deploy.yml
@@ -9,6 +9,9 @@
         inventory_hostname in groups['vitrage-notifier'] or
         inventory_hostname in groups['vitrage-collector']
 
+- include: clone.yml
+  when: vitrage_dev_mode | bool
+
 - include: bootstrap.yml
   when: inventory_hostname in groups['vitrage-api']