diff --git a/workflow/main.nf b/workflow/main.nf
index b186542a33ceab613434d0b6067d5b3b25d3fbdc..b532aa1173cbe83bbbbc9a80d69cbd9a0de78006 100755
--- a/workflow/main.nf
+++ b/workflow/main.nf
@@ -88,6 +88,7 @@ filename_checkScript = Channel.fromPath("$baseDir/scripts/filename_check.sh")
 generate_versionsScript = Channel.fromPath("$baseDir/scripts/generate_versions.py")
 generate_referencesScript = Channel.fromPath("$baseDir/scripts/generate_references.py")
 versions_pythonScript = Channel.fromPath("$baseDir/scripts/versions_python.sh")
+downstream_vizScript = Channel.fromPath("$baseDir/scripts/downstream_viz.r")
 
 // Define report files
 multiqcConf = "${baseDir}/configs/multiqc_config.yaml"
@@ -200,7 +201,8 @@ process count211 {
     chemistryParam211
 
   output:
-    file("**/outs/**") into outPaths211
+    set sample, file("**/outs/**") into outPaths211
+    set sample, file("**/outs/filtered_*/**"), file("**/outs/analysis/clustering/graphclust/**"), file("**/outs/analysis/clustering/kmeans_2_clusters/**"), file("**/outs/analysis/clustering/kmeans_3_clusters/**"), file("**/outs/analysis/clustering/kmeans_4_clusters/**"), file("**/outs/analysis/clustering/kmeans_5_clusters/**"), file("**/outs/analysis/clustering/kmeans_6_clusters/**"), file("**/outs/analysis/clustering/kmeans_7_clusters/**"), file("**/outs/analysis/clustering/kmeans_8_clusters/**"), file("**/outs/analysis/clustering/kmeans_9_clusters/**"), file("**/outs/analysis/clustering/kmeans_10_clusters/**"), file("**/outs/analysis/pca/**"), file("**/outs/analysis/tsne/**") into filteredOut211
     file("*_metrics_summary.tsv") into metricsSummary211
 
   when:
@@ -247,7 +249,8 @@ process count302 {
     chemistryParam302
 
   output:
-    file("**/outs/**") into outPaths302
+    set sample, file("**/outs/**") into outPaths302
+    set sample, file("**/outs/filtered_*/**"), file("**/outs/analysis/clustering/graphclust/**"), file("**/outs/analysis/clustering/kmeans_2_clusters/**"), file("**/outs/analysis/clustering/kmeans_3_clusters/**"), file("**/outs/analysis/clustering/kmeans_4_clusters/**"), file("**/outs/analysis/clustering/kmeans_5_clusters/**"), file("**/outs/analysis/clustering/kmeans_6_clusters/**"), file("**/outs/analysis/clustering/kmeans_7_clusters/**"), file("**/outs/analysis/clustering/kmeans_8_clusters/**"), file("**/outs/analysis/clustering/kmeans_9_clusters/**"), file("**/outs/analysis/clustering/kmeans_10_clusters/**"), file("**/outs/analysis/pca/**"), file("**/outs/analysis/tsne/**") into filteredOut302
     file("*_metrics_summary.tsv") into metricsSummary302
 
   when:
@@ -293,7 +296,8 @@ process count310 {
     chemistryParam310
 
   output:
-    file("**/outs/**") into outPaths310
+    set sample, file("**/outs/**") into outPaths310
+    set sample, file("**/outs/filtered_*/**"), file("**/outs/analysis/clustering/graphclust/**"), file("**/outs/analysis/clustering/kmeans_2_clusters/**"), file("**/outs/analysis/clustering/kmeans_3_clusters/**"), file("**/outs/analysis/clustering/kmeans_4_clusters/**"), file("**/outs/analysis/clustering/kmeans_5_clusters/**"), file("**/outs/analysis/clustering/kmeans_6_clusters/**"), file("**/outs/analysis/clustering/kmeans_7_clusters/**"), file("**/outs/analysis/clustering/kmeans_8_clusters/**"), file("**/outs/analysis/clustering/kmeans_9_clusters/**"), file("**/outs/analysis/clustering/kmeans_10_clusters/**"), file("**/outs/analysis/pca/**"), file("**/outs/analysis/tsne/**"), file("**/outs/analysis/umap/**") into filteredOut310
     file("*_metrics_summary.tsv") into metricsSummary310
 
   when:
@@ -339,7 +343,8 @@ process count400 {
     chemistryParam400
 
   output:
-    file("**/outs/**") into outPaths400
+    set file("**/outs/**") into outPaths400
+    set sample, file("**/outs/filtered_*/**"), file("**/outs/analysis/clustering/graphclust/**"), file("**/outs/analysis/clustering/kmeans_2_clusters/**"), file("**/outs/analysis/clustering/kmeans_3_clusters/**"), file("**/outs/analysis/clustering/kmeans_4_clusters/**"), file("**/outs/analysis/clustering/kmeans_5_clusters/**"), file("**/outs/analysis/clustering/kmeans_6_clusters/**"), file("**/outs/analysis/clustering/kmeans_7_clusters/**"), file("**/outs/analysis/clustering/kmeans_8_clusters/**"), file("**/outs/analysis/clustering/kmeans_9_clusters/**"), file("**/outs/analysis/clustering/kmeans_10_clusters/**"), file("**/outs/analysis/pca/**"), file("**/outs/analysis/tsne/**"), file("**/outs/analysis/umap/**") into filteredOut400
     file("*_metrics_summary.tsv") into metricsSummary400
 
   when:
@@ -423,3 +428,29 @@ process multiqc {
     multiqc -c ${multiqcConf} .
     """
 }
+
+// Collect all outputs reguardless of cellranger version
+filteredOut = filteredOut211.mix(filteredOut302, filteredOut310, filteredOut400)
+
+/*
+ * downstreamViz: create files for downstream use (eg. R Seurat object)
+ */
+process downstreamViz {
+  tag "${sample}"
+  publishDir "${outDir}/${task.process}", mode: 'copy'
+  module 'seurat/3.0.0'
+
+  input:
+    file downstream_vizScript
+    set sample, file("filtered/*"), file("clustering/graphclust/*"), file("clustering/kmeans_2_clusters/*"), file("clustering/kmeans_3_clusters/*"), file("clustering/kmeans_4_clusters/*"), file("clustering/kmeans_5_clusters/*"), file("clustering/kmeans_6_clusters/*"), file("clustering/kmeans_7_clusters/*"), file("clustering/kmeans_8_clusters/*"), file("clustering/kmeans_9_clusters/*"), file("clustering/kmeans_10_clusters/*"), file("pca/*"), file("tsne/*"), file("umap/*") from filteredOut
+
+  output:
+    file "*.rds" into seuratPaths
+
+  script:
+    """
+    hostname
+    ulimit -a
+    seurat-Rscript downstream_viz.r --sample ${sample} --cellrangerVersion ${version}
+    """
+}
diff --git a/workflow/scripts/downstream_viz.r b/workflow/scripts/downstream_viz.r
new file mode 100644
index 0000000000000000000000000000000000000000..81892bd16aa077eb5292a7f17f19d71792e4c568
--- /dev/null
+++ b/workflow/scripts/downstream_viz.r
@@ -0,0 +1,37 @@
+library(optparse)
+library(Seurat)
+
+option_list=list(
+  make_option("--sample",default="sample1",action="store",type='character',help="sample"),
+  make_option("--cellrangerVersion",default="4.0.0",action="store",type='character',help="cellranger Version")
+)
+opt=parse_args(OptionParser(option_list=option_list))
+rm(option_list)
+
+data <- Read10X(data.dir="filtered/")
+data <-  CreateSeuratObject(counts=data)
+
+dimReductions <- c("pca","tsne")
+if (opt$cellrangerVersion!="2.1.1" && opt$cellrangerVersion!="3.0.2"){
+  dimReductions <- c(dimReductions,"umap")
+}
+for (i in dimReductions){
+  if (i=="tsne"){
+    lab <- "tSNE"
+  } else {
+    lab <- toupper(i)
+  }
+  projection <- read.csv(paste0(i,"/projection.csv"),row.names=1)
+  rownames(projection) <- gsub("-.","",rownames(projection))
+  data[[i]] <- CreateDimReducObject(embeddings=as.matrix(projection),key=paste0(lab,"_"),assay="RNA")
+}
+
+clust <- c("graphclust",paste0("kmeans_",2:10,"_clusters"))
+for (i in clust){
+  clusters <- read.csv(paste0("clustering/",i,"/clusters.csv"),row.names=1)
+  rownames(clusters) <- gsub("-.","",rownames(clusters))
+  data[[i]] <- clusters
+  data@meta.data <- data@meta.data[,colnames(data@meta.data)!="orig.ident"]
+}
+
+saveRDS(data,paste0(opt$sample,".rds"))