diff --git a/roles/move_homedir/tasks/main.yml b/roles/move_homedir/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ffdba302991441178a25ca86b1042814f5c09cd5
--- /dev/null
+++ b/roles/move_homedir/tasks/main.yml
@@ -0,0 +1,31 @@
+- name: make /local_home
+  file: path=/local_home owner=root group=root state=directory
+  sudo: true 
+
+- name: copy the {{ ansible_ssh_user }} home
+  shell: cp -ar /home/{{ ansible_ssh_user }} /local_home
+  ignore_errors: true
+  sudo: true
+  register: home_copied
+
+
+- name: edit passwd file
+  lineinfile:
+  args:
+    dest: /etc/passwd
+    regexp: "{{ ansible_ssh_user }}:x:1001:1001::/home/{{ ansible_ssh_user }}:.*"
+    line: "{{ ansible_ssh_user }}:x:1001:1001::/local_home/{{ ansible_ssh_user }}:/bin/bash"
+    backrefs: yes
+  sudo: true
+  register: edit1
+
+- name: edit passwd file
+  lineinfile:
+  args:
+    dest: /etc/passwd
+    regexp: "{{ ansible_ssh_user }}:x:500:500::/home/{{ ansible_ssh_user }}:.*"
+    line: "{{ ansible_ssh_user }}:x:500:500::/local_home/{{ ansible_ssh_user }}:/bin/bash"
+    backrefs: yes
+  sudo: true
+  register: edit2
+
diff --git a/roles/nfs-client/handlers/main.yml b/roles/nfs-client/handlers/main.yml
index a6017dcc2e3a7da12af17494cb3911fa29fe31fd..15acb0658980b561ad5a3b6243b65f2815bea721 100644
--- a/roles/nfs-client/handlers/main.yml
+++ b/roles/nfs-client/handlers/main.yml
@@ -1,7 +1,10 @@
 ---
+- name: restart rpcbind
+  service: name=rpcbind state=restarted
+  sudo: true
+
 - name: restart idmap 
-  service: name={{ item }} state=restarted
-  with_items:
-    - rpcbind
-    - rpcidmapd
+  service: name=rpcidmapd state=restarted
   sudo: true
+  when: ansible_os_family == "RedHat"
+
diff --git a/roles/nfs-client/tasks/mountFileSystem.yml b/roles/nfs-client/tasks/mountFileSystem.yml
index f37695de96babc5a2ab7d7ce185d120cae7fe3fd..555e12b5014dd5c37617903c589a60d090d73d70 100644
--- a/roles/nfs-client/tasks/mountFileSystem.yml
+++ b/roles/nfs-client/tasks/mountFileSystem.yml
@@ -3,17 +3,12 @@
   service: name=fail2ban state=stopped
   sudo: true
 
-- name: restart idmap 
-  service: name={{ item }} state=restarted
-  with_items:
-    - rpcbind
-    - rpcidmapd
-  sudo: true
 
 - name: "Mounting NFS mounts"
   mount: name={{ item.name }} src={{ item.ipv4 }}:{{ item.src }} fstype={{ item.fstype }} opts={{ item.opts }} state=mounted
   with_items: exportList 
   notify: "restart authentication"
+  notify: "restart rpcbind"
   notify: "restart idmap"
   sudo: true 
   ignore_errors: true
@@ -30,6 +25,7 @@
   with_items: exportList 
   notify: "restart authentication"
   notify: "restart idmap"
+  notify: "restart rpcbind"
   sudo: true 
   when: exportList is defined and firstMount | failed
 
diff --git a/roles/nfs-common/tasks/main.yml b/roles/nfs-common/tasks/main.yml
index 559decd124f9d12dcd73ccd74bfd5400ebe5f7ae..5f42cf171289e08d8787e24aa7017505f0050a4f 100644
--- a/roles/nfs-common/tasks/main.yml
+++ b/roles/nfs-common/tasks/main.yml
@@ -1,5 +1,9 @@
 ---
 - include: yumPackages.yml
+  when: ansible_os_family == "RedHat"
+
+- include: aptPackages.yml
+  when: ansible_os_family == "Debian"
 
 - name: setup idmap.conf
   template: src=idmapd.conf.j2 dest=/etc/idmapd.conf
diff --git a/roles/nfs-server/tasks/main.yml b/roles/nfs-server/tasks/main.yml
index 29b98a51f78f9679387544cdcec27a1711a2383d..9ba0c9fbddc184fa9717e77505148a81efc03e8c 100644
--- a/roles/nfs-server/tasks/main.yml
+++ b/roles/nfs-server/tasks/main.yml
@@ -1,3 +1,8 @@
 ---
+- name: install nfs kernel server
+  apt: name=nfs-kernel-server state=latest
+  sudo: true
+  when: ansible_os_family == "Debian"
+
 - include: mkFilesystem.yml 
 - include: startServer.yml
diff --git a/roles/openLdapClient/tasks/configLdapClient.yml b/roles/openLdapClient/tasks/configLdapClient.yml
index 2c3db2deb6da14a14fd99429459e78d2bd0a90cf..d9058ca2b727dd5f8bb15f9c71ff51840c34cefc 100644
--- a/roles/openLdapClient/tasks/configLdapClient.yml
+++ b/roles/openLdapClient/tasks/configLdapClient.yml
@@ -35,14 +35,6 @@
   template: src=password-auth.j2 dest=/etc/pam.d/password-auth
   sudo: true
 
-- name: "Copy authconfig"
-  template: src=authconfig.j2 dest=/etc/sysconfig/authconfig
-  sudo: true
-
-- name: "Copy ldap.conf file "
-  template: src=ldap.conf.j2 dest=/etc/openldap/ldap.conf
-  sudo: true
-
 - name: "Add LDAP server IP address to /etc/hosts"
   lineinfile: dest=/etc/hosts line="{{ ldapServerHostIpLine }}" state=present insertafter=EOF
   sudo: true
diff --git a/roles/slurm-build/tasks/main.yml b/roles/slurm-build/tasks/main.yml
index 98d5a14c6d247a96e311bc0c9ae1c3bf2c3c7e87..cbb3dca56d066b803ed0024782c2703e146e1c5e 100644
--- a/roles/slurm-build/tasks/main.yml
+++ b/roles/slurm-build/tasks/main.yml
@@ -13,6 +13,18 @@
     - bzip2-devel
     - mysql
     - mysql-devel
+  when: ansible_os_family == "RedHat"
+
+- name: install deps
+  apt: name={{ item }} state=installed update_cache=yes
+  sudo: true
+  with_items:
+    - gcc
+    - wget
+    - libssl-dev
+    - libpam0g-dev
+    - libbz2-dev
+  when: ansible_os_family == "Debian"
 
 - name: get munge
   shell: wget https://munge.googlecode.com/files/munge-{{ munge_version }}.tar.bz2
@@ -26,9 +38,25 @@
   args:
     chdir: /tmp
     creates: /root/rpmbuild/RPMS/x86_64/munge-{{ munge_version }}-1.el6.x86_64.rpm
+  when: ansible_os_family == "RedHat"
+
+- name: untar munge
+  shell: tar jxf /tmp/munge-{{ munge_version }}.tar.bz2
+  sudo: true
+  args:
+    chdir: /tmp
+    creates: /tmp/munge-{{ munge_version }}
+  when: ansible_os_family == "Debian"
+
+- name: build munge
+  shell: configure && make && make install
+  sudo: true
+  args:
+    chdir: /tmp/munge-{{ munge_version }}
+  when: ansible_os_family == "Debian"
 
 - name: get slurm
-  shell: wget http://www.schedmd.com/download/archive/slurm-{{ slurm_version }}.tar.bz2
+  shell: wget http://www.schedmd.com/download/latest/slurm-{{ slurm_version }}.tar.bz2
   args:
     chdir: /tmp
     creates: /tmp/slurm-{{ slurm_version }}.tar.bz2
@@ -36,6 +64,7 @@
 - name: check munge installation
   shell: rpm -qa munge
   register: munge_installed
+  when: ansible_os_family == "RedHat"
 
 - name: install munge deps
   shell: rpm -i /root/rpmbuild/RPMS/x86_64/munge-libs-{{ munge_version }}-1.el6.x86_64.rpm /root/rpmbuild/RPMS/x86_64/munge-{{ munge_version }}-1.el6.x86_64.rpm /root/rpmbuild/RPMS/x86_64/munge-devel-{{ munge_version }}-1.el6.x86_64.rpm
diff --git a/roles/slurm/handlers/main.yml b/roles/slurm/handlers/main.yml
index 8ae8432f958ac35c7c93e9b2ac54035d1ca42ba1..57f0cb12be532609f9884170cf7aeadf7be037f9 100644
--- a/roles/slurm/handlers/main.yml
+++ b/roles/slurm/handlers/main.yml
@@ -11,3 +11,8 @@
     service: name=slurmdbd state=restarted
     sudo: true
 
+  - name: scontrol reconfigure
+    shell: sleep 10 ; scontrol reconfigure
+    sudo: true
+    delegate_to: "{{ slurmctrl }}"
+    run_once: true
diff --git a/roles/slurm/tasks/main.yml b/roles/slurm/tasks/main.yml
index ec5a51b89ef852f40465389bd47aa1e1178a35cb..b34568d61336e310dd1b15ebbd4cc547e4430fad 100644
--- a/roles/slurm/tasks/main.yml
+++ b/roles/slurm/tasks/main.yml
@@ -1,4 +1,28 @@
 ---
+
+- name: create slurm group
+  group: name=slurm system=yes gid=497
+  sudo: true
+
+- name: create slurm user
+  user: name=slurm group=slurm system=yes createhome=no uid=497
+  sudo: true
+
+- name: make sure slurm conf dir exists
+  file: dest=/etc/slurm state=directory
+  sudo: true
+
+- name: create data directory
+  file: path="{{ slurmdatadir }}" state=directory owner=slurm group=slurm mode=755 
+  sudo: true
+
+- name: create log directory
+  shell: mkdir -p {{ slurmddebug.log | dirname }}; chown slurm:slurm {{ slurmddebug.log | dirname }} 
+  args:
+    creates: "{{ slurmddebug.log | dirname }}"
+  sudo: true
+  when: slurmddebug is defined and slurmddebug.log
+
 - name: copy rpms
   copy: src=/tmp/rpmbuild dest=/tmp
   sudo: true
@@ -7,6 +31,28 @@
   shell: "rpm --install /tmp/rpmbuild/RPMS/x86_64/munge*{{ munge_version }}*rpm"
   sudo: true
   ignore_errors: true
+  when: ansible_os_family == "RedHat"
+
+- name: install deps
+  apt: name={{ item }} state=installed update_cache=yes
+  sudo: true
+  with_items:
+    - gcc
+    - wget
+    - libssl-dev
+    - libpam0g-dev
+    - libbz2-dev
+    - make
+    - alien
+  when: ansible_os_family == "Debian"
+
+- include: installMungeFromSource.yml
+  when: ansible_os_family == "Debian"
+
+- name: install munge key
+  template: src=munge_key.j2 dest=/etc/munge/munge.key owner=munge mode=600
+  sudo: true
+  notify: restart munge
 
 - name: install perl
   yum: name={{ item }} state=latest
@@ -14,51 +60,40 @@
     - perl
     - perl-DBI
   sudo: true
+  when: ansible_os_family == "RedHat"
 
-- name: create slurm group
-  group: name=slurm system=yes
+- name: install perl
+  apt: name={{ item }} state=latest
+  with_items:
+    - perl
+    - libdbi-perl
   sudo: true
+  when: ansible_os_family == "Debian"
 
-- name: create slurm user
-  user: name=slurm group=slurm system=yes createhome=no
-  sudo: true
+
+- include: installSlurmFromSource.yml
+  when: ansible_os_family == "Debian"
 
 - name: install slurm rpms
   shell: "rpm --install /tmp/rpmbuild/RPMS/x86_64/slurm*{{ slurm_version }}*rpm"
   sudo: true
   ignore_errors: true
-
-- name: install munge key
-  template: src=munge_key.j2 dest=/etc/munge/munge.key
-  sudo: true
-  notify: restart munge
-
-- name: start munge
-  service: name=munge state=started
-  sudo: true
+  when: ansible_os_family == "RedHat"
 
 - name: install slurm.conf
   template: src=slurm.conf.j2 dest=/etc/slurm/slurm.conf
   sudo: true
-  notify: restart slurm
   when: slurm_use_vpn==False
 
 - name: install slurm.conf
   template: src=slurm-vpn.conf.j2 dest=/etc/slurm/slurm.conf
   sudo: true
-  notify: restart slurm
   when: slurm_use_vpn==True
 
-- name: create data directory
-  file: path="{{ slurmdatadir }}" state=directory owner=slurm group=slurm mode=755 
-  sudo: true
 
-- name: create log directory
-  shell: mkdir -p {{ slurmddebug.log | dirname }}; chown slurm:slurm {{ slurmddebug.log | dirname }} 
-  args:
-    creates: "{{ slurmddebug.log | dirname }}"
+- name: start munge
+  service: name=munge state=started
   sudo: true
-  when: slurmddebug is defined and slurmddebug.log
 
 - name: start slurm
   service: name=slurm state=started
diff --git a/roles/ssh-password-login/handlers/main.yml b/roles/ssh-password-login/handlers/main.yml
index 7141e8ee5afee44b78216875e7dc097d679d9661..df0d3deeca457c10a9805a439cb4a61087cac8d3 100644
--- a/roles/ssh-password-login/handlers/main.yml
+++ b/roles/ssh-password-login/handlers/main.yml
@@ -1,3 +1,9 @@
 - name: "restart sshd"
   service: name=sshd state=restarted
   sudo: true
+  when: ansible_os_family == "RedHat"
+
+- name: "restart ssh"
+  service: name=ssh state=restarted
+  sudo: true
+  when: ansible_os_family == "Debian"
diff --git a/roles/ssh-password-login/tasks/main.yml b/roles/ssh-password-login/tasks/main.yml
index 9ea2baa20af22f2345044cd4c3a20b5b495acc13..4564015a709ca37d13aa78683d0c08ee0e4f6100 100644
--- a/roles/ssh-password-login/tasks/main.yml
+++ b/roles/ssh-password-login/tasks/main.yml
@@ -6,7 +6,9 @@
     line: "ChallengeResponseAuthentication yes" 
     backrefs: yes
   sudo: true
-  notify: restart sshd
+  notify: 
+  - restart sshd
+  - restart ssh
 
 - name: "Enable Challenge Response"
   lineinfile:
@@ -16,5 +18,19 @@
     line: "PasswordAuthentication yes"
     backrefs: yes
   sudo: true
-  notify: restart sshd
+  notify: 
+  - restart sshd
+  - restart ssh
+
+- name: "Disable Challenge Response"
+  lineinfile:
+  args:
+    dest: /etc/ssh/sshd_config
+    regexp: "PasswordAuthentication yes"
+    line: "PasswordAuthentication no"
+    backrefs: yes
+  sudo: true
+  notify: 
+  - restart sshd
+  - restart ssh
 
diff --git a/roles/strudel_config/tasks/main.yml b/roles/strudel_config/tasks/main.yml
index b7bec4214ecaa420e962160d4c050170ba411894..51610a4b2e7dcfdba703a12f318529e796ee57a9 100644
--- a/roles/strudel_config/tasks/main.yml
+++ b/roles/strudel_config/tasks/main.yml
@@ -6,3 +6,8 @@
   template: src=generic_slurm_config.json.j2 dest=/tmp/Strudel_Desktops.json
   delegate_to: 127.0.0.1
   run_once: True
+
+- name: "Temlate TurboVNC Strudel config"
+  template: src=turbo_slurm_config.json.j2 dest=/tmp/Strudel_TurboVNC_Desktops.json
+  delegate_to: 127.0.0.1
+  run_once: True
diff --git a/roles/strudel_config/templates/generic_slurm_config.json.j2 b/roles/strudel_config/templates/generic_slurm_config.json.j2
index 3acb443e96311ceec9d09bed0739a2be95c32884..626495b706e69a4f05d13dba270d50a69f3f8dbe 100644
--- a/roles/strudel_config/templates/generic_slurm_config.json.j2
+++ b/roles/strudel_config/templates/generic_slurm_config.json.j2
@@ -268,7 +268,7 @@
                 "__class__": "cmdRegEx",
                 "__module__": "siteConfig",
                 "async": false,
-                "cmd": "\"mkdir ~/.vnc ; rm -f ~/.vnc/clearpass ; touch ~/.vnc/clearpass ; chmod 600 ~/.vnc/clearpass ; passwd=\"'$'\"( dd if=/dev/urandom bs=1 count=8 2>/dev/null | md5sum | cut -b 1-8 ) ; echo \"'$'\"passwd > ~/.vnc/clearpass ; module load turbovnc ; cat ~/.vnc/clearpass | vncpasswd -f > ~/.vnc/passwd ; chmod 600 ~/.vnc/passwd ; echo -e '#!/bin/bash\\n/usr/local/bin/vncsession --vnc turbovnc --geometry {resolution} ; sleep 36000000 ' |  sbatch -p batch -N {nodes} -n {ppn} --time={hours}:00:00 -J desktop_{username} -o .vnc/slurm-%j.out \"",
+                "cmd": "\"mkdir ~/.vnc ; rm -f ~/.vnc/clearpass ; touch ~/.vnc/clearpass ; chmod 600 ~/.vnc/clearpass ; passwd=\"'$'\"( dd if=/dev/urandom bs=1 count=8 2>/dev/null | md5sum | cut -b 1-8 ) ; echo \"'$'\"passwd > ~/.vnc/clearpass ; cat ~/.vnc/clearpass | vncpasswd -f > ~/.vnc/passwd ; chmod 600 ~/.vnc/passwd ; echo -e '#!/bin/bash\\nvncserver ; sleep 36000000 ' |  sbatch -p batch -N {nodes} -n {ppn} --time={hours}:00:00 -J desktop_{username} -o .vnc/slurm-%j.out \"",
                 "failFatal": true,
                 "formatFatal": false,
                 "host": "login",
@@ -345,7 +345,7 @@
                 "host": "exec",
                 "loop": false,
                 "regex": [
-                    "^.*?started on display \\S+(?P<vncDisplay>:[0-9]+)\\s*$"
+                    "^.*?New 'X' desktop is \\S+(?P<vncDisplay>:[0-9]+)\\s*$"
                 ],
                 "requireMatch": true
             },
@@ -449,4 +449,4 @@
             }
         }
     }
-]
\ No newline at end of file
+]
diff --git a/roles/strudel_config/templates/turbo_slurm_config.json.j2 b/roles/strudel_config/templates/turbo_slurm_config.json.j2
new file mode 100644
index 0000000000000000000000000000000000000000..3acb443e96311ceec9d09bed0739a2be95c32884
--- /dev/null
+++ b/roles/strudel_config/templates/turbo_slurm_config.json.j2
@@ -0,0 +1,452 @@
+[
+    [
+        "GenericDesktops"
+    ],
+    {
+        "GenericDesktops": {
+            "__class__": "siteConfig",
+            "__module__": "siteConfig",
+            "agent": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": true,
+                "cmd": "{sshBinary} -A -c {cipher} -t -t -oStrictHostKeyChecking=no -l {username} {execHost} \"echo agent_hello; bash \"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "local",
+                "loop": false,
+                "regex": [
+                    "agent_hello"
+                ],
+                "requireMatch": true
+            },
+            "authURL": null,
+            "authorizedKeysFile": null,
+            "dbusSessionBusAddress": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"/usr/bin/ssh {execHost} 'export DISPLAY={vncDisplay};timeout 15 /usr/local/bin/cat_dbus_session_file.sh'\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    "^DBUS_SESSION_BUS_ADDRESS=(?P<dbusSessionBusAddress>.*)$"
+                ],
+                "requireMatch": true
+            },
+            "defaults": {
+                "jobParams_hours": 48,
+                "jobParams_mem": 4,
+                "jobParams_ppn": 1
+            },
+            "directConnect": true,
+            "displayStrings": {
+                "__class__": "sshKeyDistDisplayStrings",
+                "__module__": "siteConfig",
+                "createNewKeyDialogNewPassphraseEmptyForbidden": "Sorry, empty passphrases are forbidden.",
+                "createNewKeyDialogNewPassphraseMismatch": "Passphrases don't match!",
+                "createNewKeyDialogNewPassphraseTooShort": "Passphrase is too short.",
+                "helpEmailAddress": "help@massive.org.au",
+                "networkError": "It looks like a network error has occured. You may be able to resume your work by logging in again.",
+                "newPassphrase": "It looks like this is the first time you're using the CVL on this\ncomputer. To use the CVL, the launcher will generate a local\npassphrase protected key on your computer which is used to\nauthenticate you and set up your remote CVL environment.\n\nPlease enter a new passphrase (twice to avoid typos) to protect your local key. \nAfter you've done this, your passphrase will be the primary method of\nauthentication for the launcher.\n\nWHY?\n\nThis new method of authentication allows you to create file system\nmounts to remote computer systems, and in the future it will support\nlaunching remote HPC jobs.",
+                "newPassphraseEmptyForbidden": "Sorry, empty passphrases are forbidden.\nIt looks like this is the first time you're using the CVL on this\ncomputer. To use the CVL, the launcher will generate a local\npassphrase protected key on your computer which is used to\nauthenticate you and set up your remote CVL environment.\n\nPlease enter a new passphrase (twice to avoid typos) to protect your local key. \nAfter you've done this, your passphrase will be the primary method of\nauthentication for the launcher.\n\nWHY?\n\nThis new method of authentication allows you to create file system\nmounts to remote computer systems, and in the future it will support\nlaunching remote HPC jobs.",
+                "newPassphraseMismatch": "Sorry, the two passphrases you entered don't match.\nIt looks like this is the first time you're using the CVL on this\ncomputer. To use the CVL, the launcher will generate a local\npassphrase protected key on your computer which is used to\nauthenticate you and set up your remote CVL environment.\n\nPlease enter a new passphrase (twice to avoid typos) to protect your local key. \nAfter you've done this, your passphrase will be the primary method of\nauthentication for the launcher.\n\nWHY?\n\nThis new method of authentication allows you to create file system\nmounts to remote computer systems, and in the future it will support\nlaunching remote HPC jobs.",
+                "newPassphraseTitle": "Please enter a new passphrase",
+                "newPassphraseTooShort": "Sorry, the passphrase must be at least six characters.\nIt looks like this is the first time you're using the CVL on this\ncomputer. To use the CVL, the launcher will generate a local\npassphrase protected key on your computer which is used to\nauthenticate you and set up your remote CVL environment.\n\nPlease enter a new passphrase (twice to avoid typos) to protect your local key. \nAfter you've done this, your passphrase will be the primary method of\nauthentication for the launcher.\n\nWHY?\n\nThis new method of authentication allows you to create file system\nmounts to remote computer systems, and in the future it will support\nlaunching remote HPC jobs.",
+                "passphrasePrompt": "Please enter the passphrase for your SSH key",
+                "passphrasePromptIncorrect": "Sorry, that passphrase was incorrect.\nPlease enter the passphrase for you SSH Key\nIf you have forgoten the passphrase for you key, you may need to delete it and create a new key.\nYou can find this option under the Identity menu.\n",
+                "passphrasePromptIncorrectl": "Sorry, that passphrase was incorrect. Please enter the passphrase for your ssh key",
+                "passwdPrompt": "Please enter the password for your CVL account.\nThis is the password you entered when you requested an account\nat the website https://web.cvl.massive.org.au/users",
+                "passwdPromptIncorrect": "Sorry, that password was incorrect.\nPlease enter the password for your CVL account.\nThis is the password you entered when you requested an account\nat the website https://web.cvl.massive.org.au/users",
+                "persistentMessage": "Would you like to leave your current session running so that you can reconnect later?",
+                "persistentMessagePersist": "Leave it running",
+                "persistentMessageStop": "Stop the desktop",
+                "qdelQueuedJob": "It looks like you've been waiting for a job to start.\nDo you want me to delete the job or leave it in the queue so you can reconnect later?\n",
+                "qdelQueuedJobNOOP": "Leave it in the queue (I'll reconnect later)",
+                "qdelQueuedJobQdel": "Delete the job",
+                "reconnectMessage": "An Existing Desktop was found. Would you like to reconnect or kill it and start a new desktop?",
+                "reconnectMessageNo": "New desktop",
+                "reconnectMessageYes": "Reconnect",
+                "temporaryKey": "\nWould you like to use the launchers old behaviour (entering a password every time you start a new desktop) or try the new behaviour (creating an ssh key pair and entering a passphrase the first time you use the launcher after reboot.)\n\nPasswords are recomended if this is a shared user account.\n\nSSH Keys are recommended if you are the only person who uses this account.\n\nThis option can be changed from the Identity menu.\n",
+                "temporaryKeyNo": "Use my SSH Key",
+                "temporaryKeyYes": "Use my password every time"
+            },
+            "displayWebDavInfoDialogOnRemoteDesktop": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"/usr/bin/ssh {execHost} 'echo -e \\\"You can access your local home directory in Nautilus File Browser, using the location:\\n\\ndav://{localUsername}@localhost:{remoteWebDavPortNumber}/{homeDirectoryWebDavShareName}\\n\\nYour one-time password is {vncPasswd}\\\" > ~/.vnc/\\$(hostname){vncDisplay}-webdav.txt'\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    null
+                ],
+                "requireMatch": false
+            },
+            "execHost": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"squeue -j {jobidNumber} -o \"%N\" | tail -n -1 | cut -f 1 -d ',' | xargs -iname getent hosts name | cut -f 1 -d ' ' \"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    "^(?P<execHost>.*)$"
+                ],
+                "requireMatch": true
+            },
+            "getProjects": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"groups | sed 's@ @\\n@g'\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    "^\\s*(?P<group>\\S+)\\s*$"
+                ],
+                "requireMatch": true
+            },
+            "imageid": null,
+            "instanceFlavour": null,
+            "listAll": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "squeue -u {username} -o \\\"%i %L\\\" | tail -n -1",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    "(?P<jobid>(?P<jobidNumber>[0-9]+)) (?P<remainingWalltime>.*)$"
+                ],
+                "requireMatch": false
+            },
+            "loginHost": "{{ loginNode }}",
+            "messageRegexs": [
+                {
+                    "__class__": "__regex__",
+                    "pattern": "^INFO:(?P<info>.*(?:\n|\r\n?))"
+                },
+                {
+                    "__class__": "__regex__",
+                    "pattern": "^WARN:(?P<warn>.*(?:\n|\r\n?))"
+                },
+                {
+                    "__class__": "__regex__",
+                    "pattern": "^ERROR:(?P<error>.*(?:\n|\r\n?))"
+                }
+            ],
+            "onConnectScript": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"/usr/bin/ssh {execHost} 'module load keyutility ; mountUtility.py'\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    null
+                ],
+                "requireMatch": false
+            },
+            "openWebDavShareInRemoteFileBrowser": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"/usr/bin/ssh {execHost} \\\"export DBUS_SESSION_BUS_ADDRESS={dbusSessionBusAddress};/usr/bin/gconftool-2 --type=Boolean --set /apps/nautilus/preferences/always_use_location_entry true {ampersand}{ampersand} DISPLAY={vncDisplay} xdg-open dav://{localUsername}@localhost:{remoteWebDavPortNumber}/{homeDirectoryWebDavShareName}\\\"\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    null
+                ],
+                "requireMatch": false
+            },
+            "otp": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "'cat ~/.vnc/clearpass'",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    "^(?P<vncPasswd>\\S+)$"
+                ],
+                "requireMatch": true
+            },
+            "provision": null,
+            "relabel": {},
+            "runSanityCheck": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": null,
+                "failFatal": false,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    null
+                ],
+                "requireMatch": false
+            },
+            "running": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"scontrol show job {jobidNumber}\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    "JobState=RUNNING"
+                ],
+                "requireMatch": true
+            },
+            "setDisplayResolution": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": null,
+                "failFatal": false,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    null
+                ],
+                "requireMatch": false
+            },
+            "showStart": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": null,
+                "failFatal": false,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    null
+                ],
+                "requireMatch": false
+            },
+            "siteRanges": {
+                "jobParams_hours": [
+                    1,
+                    336
+                ],
+                "jobParams_mem": [
+                    1,
+                    1024
+                ],
+                "jobParams_nodes": [
+                    1,
+                    10
+                ],
+                "jobParams_ppn": [
+                    1,
+                    12
+                ]
+            },
+            "startServer": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"mkdir ~/.vnc ; rm -f ~/.vnc/clearpass ; touch ~/.vnc/clearpass ; chmod 600 ~/.vnc/clearpass ; passwd=\"'$'\"( dd if=/dev/urandom bs=1 count=8 2>/dev/null | md5sum | cut -b 1-8 ) ; echo \"'$'\"passwd > ~/.vnc/clearpass ; module load turbovnc ; cat ~/.vnc/clearpass | vncpasswd -f > ~/.vnc/passwd ; chmod 600 ~/.vnc/passwd ; echo -e '#!/bin/bash\\n/usr/local/bin/vncsession --vnc turbovnc --geometry {resolution} ; sleep 36000000 ' |  sbatch -p batch -N {nodes} -n {ppn} --time={hours}:00:00 -J desktop_{username} -o .vnc/slurm-%j.out \"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    "^Submitted batch job (?P<jobid>(?P<jobidNumber>[0-9]+))$"
+                ],
+                "requireMatch": true
+            },
+            "stop": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"scancel {jobidNumber}\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    null
+                ],
+                "requireMatch": false
+            },
+            "stopForRestart": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"scancel {jobidNumber}\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    null
+                ],
+                "requireMatch": false
+            },
+            "tunnel": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": true,
+                "cmd": "{sshBinary} -A -c {cipher} -t -t -oStrictHostKeyChecking=no -L {localPortNumber}:localhost:{remotePortNumber} -l {username} {execHost} \"echo tunnel_hello; bash\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "local",
+                "loop": false,
+                "regex": [
+                    "tunnel_hello"
+                ],
+                "requireMatch": true
+            },
+            "username": null,
+            "visibility": {
+                "advancedCheckBoxPanel": true,
+                "cipherPanel": "Advanced",
+                "debugCheckBoxPanel": "Advanced",
+                "jobParams_hours": true,
+                "jobParams_nodes": true,
+                "jobParams_ppn": true,
+                "label_hours": true,
+                "label_nodes": true,
+                "label_ppn": true,
+                "resolutionPanel": "Advanced",
+                "resourcePanel": "Advanced",
+                "usernamePanel": true
+            },
+            "vncDisplay": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"cat .vnc/slurm-{jobidNumber}.out\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "exec",
+                "loop": false,
+                "regex": [
+                    "^.*?started on display \\S+(?P<vncDisplay>:[0-9]+)\\s*$"
+                ],
+                "requireMatch": true
+            },
+            "webDavCloseWindow": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"/usr/bin/ssh {execHost} 'export DBUS_SESSION_BUS_ADDRESS={dbusSessionBusAddress};export DISPLAY={vncDisplay}; wmctrl -F -i -c {webDavWindowID}'\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    null
+                ],
+                "requireMatch": false
+            },
+            "webDavIntermediatePort": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"/usr/local/bin/get_ephemeral_port.py\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "exec",
+                "loop": false,
+                "regex": [
+                    "^(?P<intermediateWebDavPortNumber>[0-9]+)$"
+                ],
+                "requireMatch": true
+            },
+            "webDavMount": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"/usr/bin/ssh {execHost} \\\"export DBUS_SESSION_BUS_ADDRESS={dbusSessionBusAddress};echo \\\\\\\"import pexpect;child = pexpect.spawn('gvfs-mount dav://{localUsername}@localhost:{remoteWebDavPortNumber}/{homeDirectoryWebDavShareName}');child.expect('Password: ');child.sendline('{vncPasswd}');child.expect(pexpect.EOF);child.close();print 'gvfs-mount returned ' + str(child.exitstatus)\\\\\\\" {pipe} python\\\"\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    "^gvfs-mount returned (?P<webDavMountingExitCode>.*)$"
+                ],
+                "requireMatch": true
+            },
+            "webDavRemotePort": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"/usr/local/bin/get_ephemeral_port.py\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "exec",
+                "loop": false,
+                "regex": [
+                    "^(?P<remoteWebDavPortNumber>[0-9]+)$"
+                ],
+                "requireMatch": true
+            },
+            "webDavTunnel": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": true,
+                "cmd": "{sshBinary} -A -c {cipher} -t -t -oStrictHostKeyChecking=no -oExitOnForwardFailure=yes -R {remoteWebDavPortNumber}:localhost:{localWebDavPortNumber} -l {username} {execHost} \"echo tunnel_hello; bash\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "local",
+                "loop": false,
+                "regex": [
+                    "tunnel_hello"
+                ],
+                "requireMatch": true
+            },
+            "webDavUnmount": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"/usr/bin/ssh {execHost} 'export DBUS_SESSION_BUS_ADDRESS={dbusSessionBusAddress};export DISPLAY={vncDisplay};timeout 1 gvfs-mount --unmount-scheme dav'\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    null
+                ],
+                "requireMatch": false
+            },
+            "webDavWindowID": {
+                "__class__": "cmdRegEx",
+                "__module__": "siteConfig",
+                "async": false,
+                "cmd": "\"/usr/bin/ssh {execHost} 'export DBUS_SESSION_BUS_ADDRESS={dbusSessionBusAddress}; DISPLAY={vncDisplay} xwininfo -root -tree'\"",
+                "failFatal": true,
+                "formatFatal": false,
+                "host": "login",
+                "loop": false,
+                "regex": [
+                    "^\\s+(?P<webDavWindowID>\\S+)\\s+\"{homeDirectoryWebDavShareName}.*Browser.*$"
+                ],
+                "requireMatch": true
+            }
+        }
+    }
+]
\ No newline at end of file
diff --git a/roles/vncserver/tasks/main.yml b/roles/vncserver/tasks/main.yml
index 1509b03ac37cf5dfc26d6148af16cf2094023bbd..db122510846e0dcd90f518a5e35f457949667ae1 100644
--- a/roles/vncserver/tasks/main.yml
+++ b/roles/vncserver/tasks/main.yml
@@ -2,11 +2,17 @@
 #- include_vars: "{{ hostvars[ansible_hostname]['ansible_distribution'] }}_{{ ansible_architecture }}.yml"
 - include_vars: "{{ ansible_distribution }}_{{ ansible_architecture }}.yml"
 
+# Use mate DE on systems that have moved to gnome3, since there is no gpu acceleration by default on NeCTAR openstack
+# Trusty (Ubuntu 14.04 LTS) needs repos added. Wheezy (Debian Stable) gets mate from backports, Utopic (Ubuntu 14.10) Jessie (Debian testing) and Sid (Debian unstable) get it by default
 - name: add repos apt
-  shell: "add-apt-repository -y 'deb {{ item }} {{ ansible_distribution_release }} main' "
+  shell: "add-apt-repository -y ppa:ubuntu-mate-dev/ppa"
   sudo: true
-  with_items: apt_repos
-  when: ansible_os_family == 'Debian'
+  when: ansible_distribution_release == 'trusty'
+
+- name: add repos apt
+  shell: "add-apt-repository -y ppa:ubuntu-mate-dev/trusty-mate"
+  sudo: true
+  when: ansible_distribution_release == 'trusty'
 
 - name: install system packages apt
   apt: name={{ item }} state=installed update_cache=true  force=yes
diff --git a/roles/vncserver/vars/Ubuntu_x86_64.yml b/roles/vncserver/vars/Ubuntu_x86_64.yml
index ef0d60dc6b5564ef1a0870ba7024ac4572d7771d..db5695651f89972900a03b8fe91fa689e9ac88c3 100644
--- a/roles/vncserver/vars/Ubuntu_x86_64.yml
+++ b/roles/vncserver/vars/Ubuntu_x86_64.yml
@@ -2,6 +2,3 @@
  system_packages:
    - mate-desktop-environment
    - tightvncserver
-
- apt_repos:
-   - "http://repo.mate-desktop.org/archive/1.8/ubuntu"