diff --git a/defaults/main.yml b/defaults/main.yml
index 48f53dbf..3a40c31e 100644
--- a/defaults/main.yml
+++ b/defaults/main.yml
@@ -113,6 +113,8 @@ ironic_recreate_keys: False
 
 ironic_bin: "{{ ironic_venv_bin }}"
 
+ironic_venv_download_url: http://127.0.0.1/venvs/untagged/ubuntu/ironic.tgz
+
 ironic_common_apt_packages:
   - python-dev
   - python-pip
@@ -122,6 +124,7 @@ ironic_requires_pip_packages:
   - virtualenv
   - virtualenv-tools
   - python-keystoneclient # Keystoneclient needed for the OSA keystone lib
+  - httplib2 # for Ansible's uri module
 
 ironic_pip_packages:
   - MySQL-python
diff --git a/tasks/ironic_install.yml b/tasks/ironic_install.yml
index 707cd712..a7167c5b 100644
--- a/tasks/ironic_install.yml
+++ b/tasks/ironic_install.yml
@@ -71,6 +71,107 @@
     - ironic-install
     - ironic-pip-packages
 
+- name: Get local venv checksum
+  stat:
+    path: "/var/cache/{{ ironic_venv_download_url | basename }}"
+    get_md5: False
+  when:
+    - not ironic_developer_mode | bool
+    - ironic_venv_enabled | bool
+  register: local_venv_stat
+  tags:
+    - ironic-install
+    - ironic-pip-packages
+
+- name: Get remote venv checksum
+  uri:
+    url: "{{ ironic_venv_download_url | replace('tgz', 'checksum') }}"
+    return_content: True
+  when:
+    - not ironic_developer_mode | bool
+    - ironic_venv_enabled | bool
+  register: remote_venv_checksum
+  tags:
+    - ironic-install
+    - ironic-pip-packages
+
+# TODO: When project moves to ansible 2 we can pass this a sha256sum which will:
+#       a) allow us to remove force: yes
+#       b) allow the module to calculate the checksum of dest file which would
+#          result in file being downloaded only if provided and dest sha256sum
+#          checksums differ
+- name: Attempt venv download
+  get_url:
+    url: "{{ ironic_venv_download_url }}"
+    dest: "/var/cache/{{ ironic_venv_download_url | basename }}"
+    force: yes
+  ignore_errors: true
+  register: get_venv
+  when:
+    - not ironic_developer_mode | bool
+    - ironic_venv_enabled | bool
+    - (local_venv_stat.stat.exists == False or
+        {{ local_venv_stat.stat.checksum is defined and local_venv_stat.stat.checksum != remote_venv_checksum.content | trim }})
+  tags:
+    - ironic-install
+    - ironic-pip-packages
+
+- name: Set ironic get_venv fact
+  set_fact:
+    ironic_get_venv: "{{ get_venv }}"
+  when: ironic_venv_enabled | bool
+  tags:
+    - ironic-install
+    - ironic-pip-packages
+
+- name: Remove existing venv
+  file:
+    path: "{{ ironic_venv_bin | dirname }}"
+    state: absent
+  when:
+    - ironic_venv_enabled | bool
+    - ironic_get_venv | changed
+  tags:
+    - ironic-install
+    - ironic-pip-packages
+
+- name: Create ironic venv dir
+  file:
+    path: "{{ ironic_venv_bin | dirname }}"
+    state: directory
+  when:
+    - not ironic_developer_mode | bool
+    - ironic_venv_enabled | bool
+    - ironic_get_venv | changed
+  tags:
+    - ironic-install
+    - ironic-pip-packages
+
+- name: Unarchive pre-built venv
+  unarchive:
+    src: "/var/cache/{{ ironic_venv_download_url | basename }}"
+    dest: "{{ ironic_venv_bin | dirname }}"
+    copy: "no"
+  when:
+    - not ironic_developer_mode | bool
+    - ironic_venv_enabled | bool
+    - ironic_get_venv | changed
+  notify: Restart ironic services
+  tags:
+    - ironic-install
+    - ironic-pip-packages
+
+- name: Update virtualenv path
+  command: >
+    virtualenv-tools --update-path=auto {{ ironic_venv_bin | dirname }}
+  when:
+    - not ironic_developer_mode | bool
+    - ironic_venv_enabled | bool
+    - ironic_get_venv | success
+  tags:
+    - ironic-install
+    - ironic-pip-packages
+
 - name: Install pip packages (venv)
   pip:
     name: "{{ item }}"
@@ -85,7 +186,8 @@
   with_items: ironic_pip_packages
   when:
     - ironic_venv_enabled | bool
-    - ironic_developer_mode | bool
+    - ironic_get_venv | failed or ironic_developer_mode | bool
+  notify: Restart ironic services
   tags:
     - ironic-install
     - ironic-pip-packages
@@ -103,6 +205,7 @@
   when:
     - not ironic_venv_enabled | bool
     - not ironic_developer_mode | bool
+  notify: Restart ironic services
   tags:
     - ironic-install
     - ironic-pip-packages