diff --git a/.gitignore b/.gitignore
index 9858f9b9f4dd7a5ec41a66526625ed73e0ecdcfb..7593647134c72fcd869b9308e4d771b06f5cff68 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,7 @@ __pycache__/
 inventories/*
 !inventories/example
 !inventories/local*
+!inventories/offline*
 inventories/local*/host_vars/localhost.yml
 playbooks/_*
 roles/_*
diff --git a/inventories/offline-mediaserver/host_vars/localhost.dist.yml b/inventories/offline-mediaserver/host_vars/localhost.dist.yml
new file mode 100644
index 0000000000000000000000000000000000000000..da378679e47cec7fe7a3360b517dc2b3e9f621f4
--- /dev/null
+++ b/inventories/offline-mediaserver/host_vars/localhost.dist.yml
@@ -0,0 +1,5 @@
+---
+
+offline_mode: true
+
+...
diff --git a/inventories/offline-mediaserver/hosts b/inventories/offline-mediaserver/hosts
new file mode 100644
index 0000000000000000000000000000000000000000..9cb3341cd7dfd0af928eb1339c8707ea1c8ca9f0
--- /dev/null
+++ b/inventories/offline-mediaserver/hosts
@@ -0,0 +1,24 @@
+localhost ansible_connection=local
+
+[msmonitor]
+localhost
+
+[postgres]
+localhost
+
+[mirismanager]
+localhost
+
+[mediaserver]
+localhost
+
+;[wowza]
+;localhost
+
+[celerity]
+localhost
+
+[mediaimport]
+localhost
+
+; vim:ft=dosini
diff --git a/inventories/offline-mediaworker/host_vars/localhost.dist.yml b/inventories/offline-mediaworker/host_vars/localhost.dist.yml
new file mode 100644
index 0000000000000000000000000000000000000000..da378679e47cec7fe7a3360b517dc2b3e9f621f4
--- /dev/null
+++ b/inventories/offline-mediaworker/host_vars/localhost.dist.yml
@@ -0,0 +1,5 @@
+---
+
+offline_mode: true
+
+...
diff --git a/inventories/offline-mediaworker/hosts b/inventories/offline-mediaworker/hosts
new file mode 100644
index 0000000000000000000000000000000000000000..4b3a22ad384791913472451b37df48fcacba6d7b
--- /dev/null
+++ b/inventories/offline-mediaworker/hosts
@@ -0,0 +1,6 @@
+localhost ansible_connection=local
+
+[mediaworker]
+localhost
+
+; vim:ft=dosini
diff --git a/roles/conf/tasks/main.yml b/roles/conf/tasks/main.yml
index f48c0c8deecffe00071d05b533902566425f1a98..5b30b0c7d006e60956b37c26bcb2d8128e94e365 100644
--- a/roles/conf/tasks/main.yml
+++ b/roles/conf/tasks/main.yml
@@ -14,6 +14,7 @@
     name: "{{ conf_req_packages }}"
 
 - name: clone envsetup repository
+  when: not offline_mode | d(false)
   ignore_errors: true
   register: conf_clone
   git:
@@ -22,7 +23,9 @@
     dest: "{{ conf_repo_dest }}"
 
 - name: ask to continue
-  when: conf_clone is failed
+  when:
+    - not offline_mode | d(false)
+    - conf_clone is failed
   pause:
     prompt: "Previous task failed, it may be normal if you have local changes in the commited files, do you want to continue anyway?"
     seconds: 30
@@ -110,7 +113,7 @@
     prefix: envsetup_
     lower: true
 
-- name: load generated conf if exists
+- name: load generated conf
   changed_when: false
   check_mode: false
   source_file:
@@ -118,7 +121,7 @@
     prefix: envsetup_
     lower: true
 
-- name: load local conf if exists
+- name: load local conf
   changed_when: false
   check_mode: false
   source_file:
diff --git a/roles/repos/tasks/main.yml b/roles/repos/tasks/main.yml
index df93360655aa0feeea173143c75e716f10654754..3439586cb911b714f5384a8b23eaa18b2f002518 100644
--- a/roles/repos/tasks/main.yml
+++ b/roles/repos/tasks/main.yml
@@ -1,7 +1,9 @@
 ---
 
 - name: ubuntu apt repo sources list
-  when: ansible_distribution == 'Ubuntu'
+  when:
+    - not offline_mode | d(false)
+    - ansible_distribution == 'Ubuntu'
   notify: update cache
   copy:
     dest: /etc/apt/sources.list
@@ -12,7 +14,9 @@
       deb {{ repos_prefix }}security.ubuntu.com/ubuntu {{ repos_release }}-security main restricted universe multiverse
 
 - name: debian apt repo sources list
-  when: ansible_distribution == 'Debian'
+  when:
+    - not offline_mode | d(false)
+    - ansible_distribution == 'Debian'
   notify: update cache
   copy:
     dest: /etc/apt/sources.list
@@ -22,12 +26,16 @@
       deb {{ repos_prefix }}{{ repos_deb_sec }}/debian-security {{ repos_release }}/updates main contrib non-free
 
 - name: add skyreach apt repo key
-  when: repos_skyreach_token | d(false)
+  when:
+    - not offline_mode | d(false)
+    - repos_skyreach_token | d(false)
   apt_key:
     url: https://{{ repos_skyreach_host }}/media/public.gpg
 
 - name: add skyreach apt repo
-  when: repos_skyreach_token | d(false)
+  when:
+    - not offline_mode | d(false)
+    - repos_skyreach_token | d(false)
   apt_repository:
     repo: deb https://{{ repos_skyreach_host }} packaging/apt/{{ repos_skyreach_token }}/
     filename: skyreach