diff --git a/roles/fetch-stestr-output/defaults/main.yaml b/roles/fetch-stestr-output/defaults/main.yaml
new file mode 100644
index 000000000..a0afa22c5
--- /dev/null
+++ b/roles/fetch-stestr-output/defaults/main.yaml
@@ -0,0 +1,2 @@
+---
+zuul_work_dir: "src/{{ zuul.project.canonical_name }}"
diff --git a/roles/fetch-stestr-output/tasks/main.yaml b/roles/fetch-stestr-output/tasks/main.yaml
new file mode 100644
index 000000000..baa10b174
--- /dev/null
+++ b/roles/fetch-stestr-output/tasks/main.yaml
@@ -0,0 +1,23 @@
+- name: Register stestr directory
+  stat:
+    path: "{{ zuul_work_dir }}/.stestr"
+  register: stestr_stat
+
+- name: Process testr artifacts
+  include: process.yaml
+  when:
+    - stestr_stat.stat.exists
+
+- name: Collect test-results
+  synchronize:
+    dest: "{{ zuul.executor.log_root }}"
+    mode: pull
+    rsync_opts:
+      - "--ignore-missing-args"
+    src: "{{ zuul_work_dir }}/{{ item }}"
+    verify_host: true
+  with_items:
+    - "*testr_results.html.gz"
+    - "*testrepository.subunit.gz"
+  when:
+    - stestr_stat.stat.exists
diff --git a/roles/fetch-stestr-output/tasks/process.yaml b/roles/fetch-stestr-output/tasks/process.yaml
new file mode 100644
index 000000000..96eabe173
--- /dev/null
+++ b/roles/fetch-stestr-output/tasks/process.yaml
@@ -0,0 +1,31 @@
+- name: Generate testrepository.subunit file
+  shell: ".tox/{{ tox_envlist }}/bin/stestr last --subunit > ./testrepository.subunit"
+  args:
+    chdir: "{{ zuul_work_dir }}"
+
+- name: Generate testr_results.html file
+  command: "/usr/os-testr-env/bin/subunit2html ./testrepository.subunit testr_results.html"
+  args:
+    chdir: "{{ zuul_work_dir }}"
+
+- name: Register testrepository.subunit file
+  stat:
+    path: "{{ zuul_work_dir }}/testrepository.subunit"
+  register: p
+
+- name: Compress testrepository.subunit file
+  archive:
+    path: "{{ p.stat.path }}"
+  when:
+    - p.stat.exists
+
+- name: Register testr_results.html file
+  stat:
+    path: "{{ zuul_work_dir }}/testr_results.html"
+  register: html
+
+- name: Compress testr_results.html file
+  archive:
+    path: "{{ html.stat.path }}"
+  when:
+    - html.stat.exists
diff --git a/roles/fetch-testr-output/tasks/main.yaml b/roles/fetch-testr-output/tasks/main.yaml
index 5e8f0633d..0fe37b821 100644
--- a/roles/fetch-testr-output/tasks/main.yaml
+++ b/roles/fetch-testr-output/tasks/main.yaml
@@ -19,3 +19,5 @@
   with_items:
     - "*testr_results.html.gz"
     - "*testrepository.subunit.gz"
+  when:
+    - testrepository_stat.stat.exists