diff --git a/.gitmodules b/.gitmodules
index 2475862fff277757c55227ea61cf0d3729b70488..333d11b23b4448aa23a5c991f49c1c3c04b0b649 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -64,3 +64,7 @@
 [submodule "roles/node"]
 	path = roles/node
 	url = https://git.cardiff.ac.uk/dsa/cu-node.git
+[submodule "roles/zotero"]
+	path = roles/zotero
+	url = https://git.cardiff.ac.uk/dsa/zotero.git
+
diff --git a/local.yml b/local.yml
index e235c385cf85d35c35bdc0d9e4e5c8d70023b793..b34fc0060aa09d58771260ef72222c0508e0b1a2 100644
--- a/local.yml
+++ b/local.yml
@@ -18,6 +18,7 @@
     - { role: ufw, tags: ['ufw', 'firewall'] }
     - { role: repos, tags: ['repos', 'apt'] }
     - { role: cu-custom, tags: ['custom'] }
+    - { role: zotero, tags: ['repos', 'apt', 'zotero'] }
     - { role: apt-config, tags: ['apt', 'apt-config'] }
     - { role: apt, apt_pkgs: "{{ distro_pkgs }}", apt_update: yes, tags: ['apt', 'software', 'apt-distro'] }
     - { role: apt, apt_pkg_files: "{{ remote_pkgs }}", tags: ['apt', 'software', 'apt-remote'] }
diff --git a/roles/zotero b/roles/zotero
new file mode 160000
index 0000000000000000000000000000000000000000..aa26c26f2d0c9c7af59bfc4ef0e5d2e1f6877c73
--- /dev/null
+++ b/roles/zotero
@@ -0,0 +1 @@
+Subproject commit aa26c26f2d0c9c7af59bfc4ef0e5d2e1f6877c73
diff --git a/vars/packages.yml b/vars/packages.yml
index 1ee8c485ef2524a1b23185f0866c1978ff5d0a2e..f6d32a239c186beb82abab4af82aa84bcf5330bb 100644
--- a/vars/packages.yml
+++ b/vars/packages.yml
@@ -62,6 +62,7 @@ distro_pkgs:
   - network-manager-vpnc-gnome
   - libcurl4-openssl-dev
   - z3
+  - zotero
 
 school_pkgs:
   - atom