diff --git a/.cwl/README.md b/.cwl/README.md
index 41a62d0781782aa6192559d788c3dbcc500c32fe..0340cecc65fb7ceb4db7bbef0e16242b04eac63d 100644
--- a/.cwl/README.md
+++ b/.cwl/README.md
@@ -77,5 +77,5 @@ cwltool --parallel run.cwl run.yml > $(date +"%Y-%m-%d_%H-%M")-run.log 2>&1 &
 ### Print workflow to file
 
 ```bash
-cwltool --print-dot run.cwl | dot -Tsvg > run.svg
+cwltool --print-dot ../arc.cwl | dot -Tsvg > arc-cwl.svg
 ```
diff --git a/.cwl/arc-cwl.svg b/.cwl/arc-cwl.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8269aa869ea0ca21187fc6241694f3b86598ec00
--- /dev/null
+++ b/.cwl/arc-cwl.svg
@@ -0,0 +1,245 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 9.0.0 (0)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="2781pt" height="325pt"
+ viewBox="0.00 0.00 2781.00 325.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 321)">
+<title>G</title>
+<polygon fill="#eeeeee" stroke="none" points="-4,4 -4,-321 2777,-321 2777,4 -4,4"/>
+<g id="clust1" class="cluster">
+<title>cluster_inputs</title>
+<polygon fill="#eeeeee" stroke="black" stroke-dasharray="5,2" points="8,-231.5 8,-309 2765,-309 2765,-231.5 8,-231.5"/>
+<text text-anchor="middle" x="2710.5" y="-238.7" font-family="Times,serif" font-size="14.00">Workflow Inputs</text>
+</g>
+<g id="clust2" class="cluster">
+<title>cluster_outputs</title>
+<polygon fill="#eeeeee" stroke="black" stroke-dasharray="5,2" points="2217,-8 2217,-85.5 2335,-85.5 2335,-8 2217,-8"/>
+<text text-anchor="middle" x="2276" y="-15.2" font-family="Times,serif" font-size="14.00">Workflow Outputs</text>
+</g>
+<!-- isaSampleToRawDataSeq -->
+<g id="node1" class="node">
+<title>isaSampleToRawDataSeq</title>
+<polygon fill="#f3cea1" stroke="black" points="563.12,-187 563.12,-223 720.88,-223 720.88,-187 563.12,-187"/>
+<text text-anchor="middle" x="642" y="-199.95" font-family="Times,serif" font-size="14.00">isaSampleToRawDataSeq</text>
+</g>
+<!-- sleuth -->
+<g id="node2" class="node">
+<title>sleuth</title>
+<polygon fill="#f3cea1" stroke="black" points="2249,-114 2249,-150 2303,-150 2303,-114 2249,-114"/>
+<text text-anchor="middle" x="2275.62" y="-126.95" font-family="Times,serif" font-size="14.00">sleuth</text>
+</g>
+<!-- isaSampleToRawDataSeq&#45;&gt;sleuth -->
+<g id="edge1" class="edge">
+<title>isaSampleToRawDataSeq&#45;&gt;sleuth</title>
+<path fill="none" stroke="black" d="M721.36,-200.55C1013.99,-187.84 2026.5,-143.84 2237.35,-134.68"/>
+<polygon fill="black" stroke="black" points="2237.36,-138.18 2247.2,-134.25 2237.05,-131.19 2237.36,-138.18"/>
+</g>
+<!-- outdir -->
+<g id="node19" class="node">
+<title>outdir</title>
+<polygon fill="#94ddf4" stroke="black" points="2249,-41 2249,-77 2303,-77 2303,-41 2249,-41"/>
+<text text-anchor="middle" x="2275.62" y="-53.95" font-family="Times,serif" font-size="14.00">outdir</text>
+</g>
+<!-- sleuth&#45;&gt;outdir -->
+<g id="edge18" class="edge">
+<title>sleuth&#45;&gt;outdir</title>
+<path fill="none" stroke="black" d="M2276,-113.81C2276,-106.23 2276,-97.1 2276,-88.54"/>
+<polygon fill="black" stroke="black" points="2279.5,-88.54 2276,-78.54 2272.5,-88.54 2279.5,-88.54"/>
+</g>
+<!-- kallisto -->
+<g id="node3" class="node">
+<title>kallisto</title>
+<polygon fill="#f3cea1" stroke="black" points="1606.12,-187 1606.12,-223 1661.88,-223 1661.88,-187 1606.12,-187"/>
+<text text-anchor="middle" x="1634" y="-199.95" font-family="Times,serif" font-size="14.00">kallisto</text>
+</g>
+<!-- kallisto&#45;&gt;sleuth -->
+<g id="edge2" class="edge">
+<title>kallisto&#45;&gt;sleuth</title>
+<path fill="none" stroke="black" d="M1662,-200.9C1764.43,-189.58 2118.96,-150.37 2237.24,-137.29"/>
+<polygon fill="black" stroke="black" points="2237.52,-140.78 2247.07,-136.2 2236.75,-133.82 2237.52,-140.78"/>
+</g>
+<!-- isaSampleToRawDataSeq_arcPath -->
+<g id="node4" class="node">
+<title>isaSampleToRawDataSeq_arcPath</title>
+<polygon fill="#94ddf4" stroke="black" points="773.5,-264.5 773.5,-300.5 978.5,-300.5 978.5,-264.5 773.5,-264.5"/>
+<text text-anchor="middle" x="876" y="-277.45" font-family="Times,serif" font-size="14.00">isaSampleToRawDataSeq_arcPath</text>
+</g>
+<!-- isaSampleToRawDataSeq_arcPath&#45;&gt;isaSampleToRawDataSeq -->
+<g id="edge3" class="edge">
+<title>isaSampleToRawDataSeq_arcPath&#45;&gt;isaSampleToRawDataSeq</title>
+<path fill="none" stroke="black" d="M841.94,-264C820.12,-253.37 790.95,-240.22 764,-231.5 753.73,-228.18 742.83,-225.18 731.94,-222.51"/>
+<polygon fill="black" stroke="black" points="733.08,-219.18 722.55,-220.3 731.48,-226 733.08,-219.18"/>
+</g>
+<!-- isaSampleToRawDataSeq_assayName -->
+<g id="node5" class="node">
+<title>isaSampleToRawDataSeq_assayName</title>
+<polygon fill="#94ddf4" stroke="black" points="528.62,-264.5 528.62,-300.5 755.38,-300.5 755.38,-264.5 528.62,-264.5"/>
+<text text-anchor="middle" x="642" y="-277.45" font-family="Times,serif" font-size="14.00">isaSampleToRawDataSeq_assayName</text>
+</g>
+<!-- isaSampleToRawDataSeq_assayName&#45;&gt;isaSampleToRawDataSeq -->
+<g id="edge4" class="edge">
+<title>isaSampleToRawDataSeq_assayName&#45;&gt;isaSampleToRawDataSeq</title>
+<path fill="none" stroke="black" d="M642,-264.37C642,-255.55 642,-244.57 642,-234.51"/>
+<polygon fill="black" stroke="black" points="645.5,-234.84 642,-224.84 638.5,-234.84 645.5,-234.84"/>
+</g>
+<!-- isaSampleToRawDataSeq_outName -->
+<g id="node6" class="node">
+<title>isaSampleToRawDataSeq_outName</title>
+<polygon fill="#94ddf4" stroke="black" points="295.62,-264.5 295.62,-300.5 510.38,-300.5 510.38,-264.5 295.62,-264.5"/>
+<text text-anchor="middle" x="403" y="-277.45" font-family="Times,serif" font-size="14.00">isaSampleToRawDataSeq_outName</text>
+</g>
+<!-- isaSampleToRawDataSeq_outName&#45;&gt;isaSampleToRawDataSeq -->
+<g id="edge5" class="edge">
+<title>isaSampleToRawDataSeq_outName&#45;&gt;isaSampleToRawDataSeq</title>
+<path fill="none" stroke="black" d="M438.67,-264.07C461.49,-253.47 491.98,-240.32 520,-231.5 530.11,-228.32 540.82,-225.42 551.53,-222.81"/>
+<polygon fill="black" stroke="black" points="552.25,-226.24 561.18,-220.55 550.65,-219.42 552.25,-226.24"/>
+</g>
+<!-- isaSampleToRawDataSeq_startingNodeNum -->
+<g id="node7" class="node">
+<title>isaSampleToRawDataSeq_startingNodeNum</title>
+<polygon fill="#94ddf4" stroke="black" points="16,-264.5 16,-300.5 278,-300.5 278,-264.5 16,-264.5"/>
+<text text-anchor="middle" x="147" y="-277.45" font-family="Times,serif" font-size="14.00">isaSampleToRawDataSeq_startingNodeNum</text>
+</g>
+<!-- isaSampleToRawDataSeq_startingNodeNum&#45;&gt;isaSampleToRawDataSeq -->
+<g id="edge6" class="edge">
+<title>isaSampleToRawDataSeq_startingNodeNum&#45;&gt;isaSampleToRawDataSeq</title>
+<path fill="none" stroke="black" d="M186.6,-264.1C214.19,-252.79 252.15,-238.83 287,-231.5 375.68,-212.84 479.26,-207.19 551.56,-205.77"/>
+<polygon fill="black" stroke="black" points="551.44,-209.27 561.38,-205.6 551.32,-202.27 551.44,-209.27"/>
+</g>
+<!-- kallisto_BootstrapSamples -->
+<g id="node8" class="node">
+<title>kallisto_BootstrapSamples</title>
+<polygon fill="#94ddf4" stroke="black" points="1307.25,-264.5 1307.25,-300.5 1468.75,-300.5 1468.75,-264.5 1307.25,-264.5"/>
+<text text-anchor="middle" x="1388" y="-277.45" font-family="Times,serif" font-size="14.00">kallisto_BootstrapSamples</text>
+</g>
+<!-- kallisto_BootstrapSamples&#45;&gt;kallisto -->
+<g id="edge7" class="edge">
+<title>kallisto_BootstrapSamples&#45;&gt;kallisto</title>
+<path fill="none" stroke="black" d="M1413.65,-264.1C1431.07,-253.09 1455.04,-239.48 1478,-231.5 1516.32,-218.18 1562.41,-211.74 1594.51,-208.68"/>
+<polygon fill="black" stroke="black" points="1594.51,-212.19 1604.16,-207.83 1593.89,-205.22 1594.51,-212.19"/>
+</g>
+<!-- kallisto_FragmentLength -->
+<g id="node9" class="node">
+<title>kallisto_FragmentLength</title>
+<polygon fill="#94ddf4" stroke="black" points="1136.38,-264.5 1136.38,-300.5 1289.62,-300.5 1289.62,-264.5 1136.38,-264.5"/>
+<text text-anchor="middle" x="1213" y="-277.45" font-family="Times,serif" font-size="14.00">kallisto_FragmentLength</text>
+</g>
+<!-- kallisto_FragmentLength&#45;&gt;kallisto -->
+<g id="edge8" class="edge">
+<title>kallisto_FragmentLength&#45;&gt;kallisto</title>
+<path fill="none" stroke="black" d="M1235.81,-264.17C1252.18,-252.75 1275.29,-238.62 1298,-231.5 1352.25,-214.5 1517.79,-208.61 1594.37,-206.77"/>
+<polygon fill="black" stroke="black" points="1594.43,-210.27 1604.35,-206.54 1594.27,-203.27 1594.43,-210.27"/>
+</g>
+<!-- kallisto_IndexInput -->
+<g id="node10" class="node">
+<title>kallisto_IndexInput</title>
+<polygon fill="#94ddf4" stroke="black" points="996.12,-264.5 996.12,-300.5 1117.88,-300.5 1117.88,-264.5 996.12,-264.5"/>
+<text text-anchor="middle" x="1057" y="-277.45" font-family="Times,serif" font-size="14.00">kallisto_IndexInput</text>
+</g>
+<!-- kallisto_IndexInput&#45;&gt;kallisto -->
+<g id="edge9" class="edge">
+<title>kallisto_IndexInput&#45;&gt;kallisto</title>
+<path fill="none" stroke="black" d="M1074.93,-264.24C1088.17,-252.69 1107.26,-238.38 1127,-231.5 1170.61,-216.31 1482.71,-208.9 1594.39,-206.71"/>
+<polygon fill="black" stroke="black" points="1594.33,-210.21 1604.26,-206.52 1594.2,-203.21 1594.33,-210.21"/>
+</g>
+<!-- kallisto_StandardDeviation -->
+<g id="node11" class="node">
+<title>kallisto_StandardDeviation</title>
+<polygon fill="#94ddf4" stroke="black" points="1921.12,-264.5 1921.12,-300.5 2084.88,-300.5 2084.88,-264.5 1921.12,-264.5"/>
+<text text-anchor="middle" x="2003" y="-277.45" font-family="Times,serif" font-size="14.00">kallisto_StandardDeviation</text>
+</g>
+<!-- kallisto_StandardDeviation&#45;&gt;kallisto -->
+<g id="edge10" class="edge">
+<title>kallisto_StandardDeviation&#45;&gt;kallisto</title>
+<path fill="none" stroke="black" d="M1977.98,-264.06C1960.37,-252.74 1935.79,-238.78 1912,-231.5 1868.5,-218.19 1739.3,-210.69 1673.49,-207.63"/>
+<polygon fill="black" stroke="black" points="1674.01,-204.15 1663.86,-207.2 1673.69,-211.15 1674.01,-204.15"/>
+</g>
+<!-- kallisto_isSingle -->
+<g id="node12" class="node">
+<title>kallisto_isSingle</title>
+<polygon fill="#94ddf4" stroke="black" points="1797,-264.5 1797,-300.5 1903,-300.5 1903,-264.5 1797,-264.5"/>
+<text text-anchor="middle" x="1850" y="-277.45" font-family="Times,serif" font-size="14.00">kallisto_isSingle</text>
+</g>
+<!-- kallisto_isSingle&#45;&gt;kallisto -->
+<g id="edge11" class="edge">
+<title>kallisto_isSingle&#45;&gt;kallisto</title>
+<path fill="none" stroke="black" d="M1833.47,-264.16C1821.83,-253.02 1805.29,-239.25 1788,-231.5 1751.33,-215.06 1705.47,-209.11 1673.37,-207.01"/>
+<polygon fill="black" stroke="black" points="1673.9,-203.54 1663.72,-206.49 1673.51,-210.53 1673.9,-203.54"/>
+</g>
+<!-- kallisto_resultsFolder -->
+<g id="node13" class="node">
+<title>kallisto_resultsFolder</title>
+<polygon fill="#94ddf4" stroke="black" points="1645.5,-264.5 1645.5,-300.5 1778.5,-300.5 1778.5,-264.5 1645.5,-264.5"/>
+<text text-anchor="middle" x="1712" y="-277.45" font-family="Times,serif" font-size="14.00">kallisto_resultsFolder</text>
+</g>
+<!-- kallisto_resultsFolder&#45;&gt;kallisto -->
+<g id="edge12" class="edge">
+<title>kallisto_resultsFolder&#45;&gt;kallisto</title>
+<path fill="none" stroke="black" d="M1694.3,-264.37C1684.2,-254.59 1671.35,-242.15 1660.11,-231.27"/>
+<polygon fill="black" stroke="black" points="1662.61,-228.82 1652.99,-224.38 1657.74,-233.85 1662.61,-228.82"/>
+</g>
+<!-- kallisto_sampleRecord -->
+<g id="node14" class="node">
+<title>kallisto_sampleRecord</title>
+<polygon fill="#94ddf4" stroke="black" points="1486.75,-264.5 1486.75,-300.5 1627.25,-300.5 1627.25,-264.5 1486.75,-264.5"/>
+<text text-anchor="middle" x="1557" y="-277.45" font-family="Times,serif" font-size="14.00">kallisto_sampleRecord</text>
+</g>
+<!-- kallisto_sampleRecord&#45;&gt;kallisto -->
+<g id="edge13" class="edge">
+<title>kallisto_sampleRecord&#45;&gt;kallisto</title>
+<path fill="none" stroke="black" d="M1574.47,-264.37C1584.44,-254.59 1597.13,-242.15 1608.23,-231.27"/>
+<polygon fill="black" stroke="black" points="1610.56,-233.89 1615.25,-224.39 1605.66,-228.89 1610.56,-233.89"/>
+</g>
+<!-- sleuth_inMetadataDataCol -->
+<g id="node15" class="node">
+<title>sleuth_inMetadataDataCol</title>
+<polygon fill="#94ddf4" stroke="black" points="2103.25,-264.5 2103.25,-300.5 2264.75,-300.5 2264.75,-264.5 2103.25,-264.5"/>
+<text text-anchor="middle" x="2184" y="-277.45" font-family="Times,serif" font-size="14.00">sleuth_inMetadataDataCol</text>
+</g>
+<!-- sleuth_inMetadataDataCol&#45;&gt;sleuth -->
+<g id="edge14" class="edge">
+<title>sleuth_inMetadataDataCol&#45;&gt;sleuth</title>
+<path fill="none" stroke="black" d="M2194.73,-264.17C2210.66,-238.47 2240.68,-190 2259.44,-159.73"/>
+<polygon fill="black" stroke="black" points="2262.25,-161.85 2264.54,-151.5 2256.3,-158.16 2262.25,-161.85"/>
+</g>
+<!-- sleuth_inMetadataFactorList -->
+<g id="node16" class="node">
+<title>sleuth_inMetadataFactorList</title>
+<polygon fill="#94ddf4" stroke="black" points="2283,-264.5 2283,-300.5 2455,-300.5 2455,-264.5 2283,-264.5"/>
+<text text-anchor="middle" x="2369" y="-277.45" font-family="Times,serif" font-size="14.00">sleuth_inMetadataFactorList</text>
+</g>
+<!-- sleuth_inMetadataFactorList&#45;&gt;sleuth -->
+<g id="edge15" class="edge">
+<title>sleuth_inMetadataFactorList&#45;&gt;sleuth</title>
+<path fill="none" stroke="black" d="M2358.15,-264.17C2342.05,-238.47 2311.7,-190 2292.74,-159.73"/>
+<polygon fill="black" stroke="black" points="2295.86,-158.12 2287.58,-151.5 2289.93,-161.83 2295.86,-158.12"/>
+</g>
+<!-- sleuth_inMetadataSample -->
+<g id="node17" class="node">
+<title>sleuth_inMetadataSample</title>
+<polygon fill="#94ddf4" stroke="black" points="2473.12,-264.5 2473.12,-300.5 2630.88,-300.5 2630.88,-264.5 2473.12,-264.5"/>
+<text text-anchor="middle" x="2552" y="-277.45" font-family="Times,serif" font-size="14.00">sleuth_inMetadataSample</text>
+</g>
+<!-- sleuth_inMetadataSample&#45;&gt;sleuth -->
+<g id="edge16" class="edge">
+<title>sleuth_inMetadataSample&#45;&gt;sleuth</title>
+<path fill="none" stroke="black" d="M2522,-264.12C2505.06,-254.39 2483.43,-242.11 2464,-231.5 2412.12,-203.18 2351.44,-171.67 2313.35,-152.1"/>
+<polygon fill="black" stroke="black" points="2315.08,-149.05 2304.59,-147.59 2311.88,-155.28 2315.08,-149.05"/>
+</g>
+<!-- sleuth_outFolder -->
+<g id="node18" class="node">
+<title>sleuth_outFolder</title>
+<polygon fill="#94ddf4" stroke="black" points="2649.25,-264.5 2649.25,-300.5 2756.75,-300.5 2756.75,-264.5 2649.25,-264.5"/>
+<text text-anchor="middle" x="2703" y="-277.45" font-family="Times,serif" font-size="14.00">sleuth_outFolder</text>
+</g>
+<!-- sleuth_outFolder&#45;&gt;sleuth -->
+<g id="edge17" class="edge">
+<title>sleuth_outFolder&#45;&gt;sleuth</title>
+<path fill="none" stroke="black" d="M2685.09,-264C2673.18,-253.24 2656.7,-239.93 2640,-231.5 2529.23,-175.57 2382.96,-148.47 2314.47,-138.16"/>
+<polygon fill="black" stroke="black" points="2315.28,-134.74 2304.88,-136.76 2314.27,-141.67 2315.28,-134.74"/>
+</g>
+</g>
+</svg>
diff --git a/.cwl/cwl-plots/runs/kallisto.svg b/.cwl/cwl-plots/runs/kallisto.svg
index 45f69bc844193654382928997d43f78b3e2171f4..241535b57ea69b5af61d7e5f40ede4a8366fdb7f 100644
--- a/.cwl/cwl-plots/runs/kallisto.svg
+++ b/.cwl/cwl-plots/runs/kallisto.svg
@@ -109,15 +109,15 @@
 <path fill="none" stroke="black" d="M79.18,-185.43C89.76,-174.74 104.84,-161.76 121,-155 157.69,-139.66 267.22,-133.56 330.49,-131.27"/>
 <polygon fill="black" stroke="black" points="330.73,-134.77 340.61,-130.93 330.49,-127.77 330.73,-134.77"/>
 </g>
-<!-- finalOut -->
+<!-- kallistoOutDir -->
 <g id="node9" class="node">
-<title>finalOut</title>
+<title>kallistoOutDir</title>
 <polygon fill="#94ddf4" stroke="black" points="346.06,-38.5 346.06,-74.5 407.94,-74.5 407.94,-38.5 346.06,-38.5"/>
-<text text-anchor="middle" x="377" y="-52.3" font-family="Times,serif" font-size="14.00">finalOut</text>
+<text text-anchor="middle" x="377" y="-52.3" font-family="Times,serif" font-size="14.00">kallistoOutDir</text>
 </g>
-<!-- kallisto&#45;&gt;finalOut -->
+<!-- kallisto&#45;&gt;kallistoOutDir -->
 <g id="edge8" class="edge">
-<title>kallisto&#45;&gt;finalOut</title>
+<title>kallisto&#45;&gt;kallistoOutDir</title>
 <path fill="none" stroke="black" d="M377,-110.93C377,-103.17 377,-93.78 377,-85.06"/>
 <polygon fill="black" stroke="black" points="380.5,-84.9 377,-74.9 373.5,-84.9 380.5,-84.9"/>
 </g>
diff --git a/.cwl/cwl-plots/workflows/kallisto.svg b/.cwl/cwl-plots/workflows/kallisto.svg
index 9e81b888aae33970cf281e5cb9f209c6c363d61a..930b4cad82f95e6624a32284127342621d8e2618 100644
--- a/.cwl/cwl-plots/workflows/kallisto.svg
+++ b/.cwl/cwl-plots/workflows/kallisto.svg
@@ -37,15 +37,15 @@
 <path fill="none" stroke="black" d="M491.95,-193.08C456.78,-182.13 394.44,-162.71 348.49,-148.4"/>
 <polygon fill="black" stroke="black" points="349.25,-144.97 338.66,-145.34 347.16,-151.66 349.25,-144.97"/>
 </g>
-<!-- finalOut -->
+<!-- kallistoOutDir -->
 <g id="node11" class="node">
-<title>finalOut</title>
+<title>kallistoOutDir</title>
 <polygon fill="#94ddf4" stroke="black" points="260.06,-38.5 260.06,-74.5 321.94,-74.5 321.94,-38.5 260.06,-38.5"/>
-<text text-anchor="middle" x="291" y="-52.3" font-family="Times,serif" font-size="14.00">finalOut</text>
+<text text-anchor="middle" x="291" y="-52.3" font-family="Times,serif" font-size="14.00">kallistoOutDir</text>
 </g>
-<!-- collectResults&#45;&gt;finalOut -->
+<!-- collectResults&#45;&gt;kallistoOutDir -->
 <g id="edge12" class="edge">
-<title>collectResults&#45;&gt;finalOut</title>
+<title>collectResults&#45;&gt;kallistoOutDir</title>
 <path fill="none" stroke="black" d="M291,-111.31C291,-103.29 291,-93.55 291,-84.57"/>
 <polygon fill="black" stroke="black" points="294.5,-84.53 291,-74.53 287.5,-84.53 294.5,-84.53"/>
 </g>
diff --git a/README.md b/README.md
index a0b47600f691b2402d98bfee41e34da7a0c1b704..ffc8756d26c797bc40c8fc58d9465445cea5c79e 100644
--- a/README.md
+++ b/README.md
@@ -5,15 +5,29 @@ The [Talinum Genome Draft](./studies/TalinumGenomeDraft) originates from <https:
 
 ## Table of Contents
 
-1. [Description](#description)
-2. [Publication](#publication)
-3. Studies
-    - [TalinumGenomeDraft](#study--talinumgenomedraft)
-    - [TalinumSamples-STRI](#study--TalinumSamples-STRI)
-4. Assays
-    - [MassHunter_targets](#assay--masshunter_targets)
-    - [GCqTOF_targets](#assay--gcqtof_targets)
-    - [RNASeq](#assay--RNASeq)
+- [Table of Contents](#table-of-contents)
+  - [Description](#description)
+- [Relationships between Assays and Studies](#relationships-between-assays-and-studies)
+- [Workflow Overview](#workflow-overview)
+- [Additional details](#additional-details)
+- [Publication](#publication)
+- [Study : *TalinumGenomeDraft*](#study--talinumgenomedraft)
+  - [Additional details](#additional-details-1)
+  - [Annotation headers](#annotation-headers)
+- [Study : *TalinumSamples-STRI*](#study--talinumsamples-stri)
+  - [Additional details](#additional-details-2)
+  - [Annotation headers](#annotation-headers-1)
+- [Assay : *MassHunter\_targets*](#assay--masshunter_targets)
+  - [Additional details](#additional-details-3)
+  - [Annotation headers](#annotation-headers-2)
+- [Assay : *RNASeq*](#assay--rnaseq)
+  - [Additional details](#additional-details-4)
+  - [Annotation headers](#annotation-headers-3)
+- [Assay : *GCqTOF\_targets*](#assay--gcqtof_targets)
+  - [Additional details](#additional-details-5)
+  - [Annotation headers](#annotation-headers-4)
+
+
 
 ### Description
 
@@ -67,7 +81,12 @@ class ASSAY_MassHunter_targets,ASSAY_RNASeq,ASSAY_GCqTOF_targets assayStyle;
 class TalinumGenomeDraft,plant_material,mh-quant-results,mh-quant-report,rna_extraction,illumina,metabolite_extraction,gas_chromatography,mass_spec processStyle;
 ```
 
-### Additional details
+## Workflow Overview
+
+![arc.cwl](.cwl/arc-cwl.svg)
+
+
+## Additional details
 
 | Meta Data | Description |
 | --------- | ----------- |
diff --git a/arc-job.yml b/arc-job.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9b36300bc49b2cf45ad8b50d87cfd2cad1c8de22
--- /dev/null
+++ b/arc-job.yml
@@ -0,0 +1,76 @@
+################################################################################
+### runs/kallisto
+################################################################################
+
+## Genome file to build kallisto Index
+kallisto_IndexInput:
+  - class: File
+    path: ./studies/TalinumGenomeDraft/resources/Talinum.gm.CDS.nt.fa
+    format: edam:format_1929 # FASTA
+
+## Fastq files to be mapped
+# The `readsOfOneSample` looks more complicated than needed
+# It's an array of records (each with one or mupltiple files and a sample name) to generically allow multiple fastq files per sample
+
+kallisto_sampleRecord:
+  - readsOfOneSample:
+    - class: File
+      path: ./assays/RNASeq/dataset/DB_097_CAMMD_CAGATC_L001_R1_001.fastq.gz
+      format: edam:format_1930
+    sampleName: 'DB_097'
+  - readsOfOneSample:  
+    - class: File
+      path: ./assays/RNASeq/dataset/DB_163_reC3MD_GTGAAA_L001_R1_001.fastq.gz
+      format: edam:format_1930
+    sampleName: 'DB_163'
+  - readsOfOneSample:
+    - class: File
+      path: ./assays/RNASeq/dataset/DB_099_CAMMD_CTTGTA_L001_R1_001.fastq.gz
+      format: edam:format_1930
+    sampleName: 'DB_099'
+  - readsOfOneSample:
+    - class: File
+      path: ./assays/RNASeq/dataset/DB_103_CAMMD_AGTCAA_L001_R1_001.fastq.gz
+      format: edam:format_1930
+    sampleName: 'DB_103'
+  - readsOfOneSample:
+    - class: File
+      path: ./assays/RNASeq/dataset/DB_161_reC3MD_GTCCGC_L001_R1_001.fastq.gz
+      format: edam:format_1930
+    sampleName: 'DB_161'
+  - readsOfOneSample:
+    - class: File
+      path: ./assays/RNASeq/dataset/DB_165_re-C3MD_GTGAAA_L002_R1_001.fastq.gz
+      format: edam:format_1930
+    sampleName: 'DB_165'
+
+### Kallisto quant Parameters
+kallisto_isSingle: true
+kallisto_FragmentLength: 200
+kallisto_StandardDeviation: 20
+kallisto_BootstrapSamples: 30
+kallisto_resultsFolder: kallisto_results
+
+$namespaces:
+  edam: https://edamontology.org/
+
+################################################################################
+### runs/isaSampleToRawDataSeq
+################################################################################
+
+isaSampleToRawDataSeq_arcPath: 
+  class: Directory
+  path: ./
+isaSampleToRawDataSeq_assayName: "RNASeq"
+isaSampleToRawDataSeq_outName: rnaseq-samples
+isaSampleToRawDataSeq_startingNodeNum: 0
+
+################################################################################
+### runs/sleuth
+################################################################################
+
+sleuth_inMetadataSample: "Input [Source Name]"
+sleuth_inMetadataFactorList:
+  - "Factor [Photosynthesis mode]"
+sleuth_inMetadataDataCol: "Output [Data]"
+sleuth_outFolder: results
diff --git a/arc.cwl b/arc.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..e0a4ce99f8aec508b687d0eeeb0822d7e04c943a
--- /dev/null
+++ b/arc.cwl
@@ -0,0 +1,80 @@
+cwlVersion: v1.2
+class: Workflow
+
+requirements:
+  SubworkflowFeatureRequirement: {}
+  ScatterFeatureRequirement: {}
+  MultipleInputFeatureRequirement: {}
+
+inputs:
+  #### runs/kallisto
+  kallisto_IndexInput: File[]
+  kallisto_sampleRecord:
+    type:
+      type: array
+      items:
+        type: record
+        fields:
+          readsOfOneSample:
+            type: File[]
+          sampleName:
+            type: string?
+  kallisto_isSingle: boolean
+  kallisto_FragmentLength: double?  
+  kallisto_StandardDeviation: double?
+  kallisto_BootstrapSamples: int?
+  kallisto_resultsFolder: string
+
+  #### runs/isaSampleToRawDataSeq
+  isaSampleToRawDataSeq_arcPath: Directory 
+  isaSampleToRawDataSeq_assayName: string
+  isaSampleToRawDataSeq_startingNodeNum: int
+  isaSampleToRawDataSeq_outName: string
+
+  #### runs/sleuth
+#   sleuth_inKallistoResults: Directory
+#   sleuth_inMetadataFile: File
+  sleuth_inMetadataSample: string
+  sleuth_inMetadataFactorList: string[]
+  sleuth_inMetadataDataCol: string
+  sleuth_outFolder: string
+
+steps:
+    kallisto:
+        run: runs/kallisto/run.cwl
+        in:
+            IndexInput:         kallisto_IndexInput
+            sampleRecord:       kallisto_sampleRecord
+            isSingle:           kallisto_isSingle
+            FragmentLength:     kallisto_FragmentLength
+            StandardDeviation:  kallisto_StandardDeviation
+            BootstrapSamples:   kallisto_BootstrapSamples
+            resultsFolder:      kallisto_resultsFolder
+        out: [kallistoOutDir]
+
+
+    isaSampleToRawDataSeq:
+        run: runs/isaSampleToRawDataSeq/run.cwl
+        in:
+          arcPath:          isaSampleToRawDataSeq_arcPath
+          assayName:        isaSampleToRawDataSeq_assayName
+          startingNodeNum:  isaSampleToRawDataSeq_startingNodeNum
+          outName:          isaSampleToRawDataSeq_outName
+        out: [sampleseqCsv, sampleseqXlsx]
+
+    sleuth:
+        run: runs/sleuth/run.cwl
+        in:
+            inKallistoResults:      kallisto/kallistoOutDir
+            inMetadataFile:         isaSampleToRawDataSeq/sampleseqCsv
+            inMetadataSample:       sleuth_inMetadataSample
+            inMetadataFactorList:   sleuth_inMetadataFactorList
+            inMetadataDataCol:      sleuth_inMetadataDataCol
+            outFolder:              sleuth_outFolder
+        out: [outdir]
+
+outputs:
+
+  outdir:
+    type: Directory[]
+    outputSource: sleuth/outdir
\ No newline at end of file
diff --git a/runs/fastqc/run.cwl b/runs/fastqc/run.cwl
index 974e99274b8fab4201a548c27fdda57f059544b4..b049a5f92ccca308657a8791af4c5d52f3871da3 100644
--- a/runs/fastqc/run.cwl
+++ b/runs/fastqc/run.cwl
@@ -16,9 +16,9 @@ steps:
     in:
       fastq: fastq
       finaloutdir: finaloutdir
-    out: [outdir]
+    out: [fastqc_outdir]
 
 outputs:
-  outdir:
+  fastqc_outdir:
     type: Directory
-    outputSource: fastqc/outdir
\ No newline at end of file
+    outputSource: fastqc/fastqc_outdir
\ No newline at end of file
diff --git a/runs/isaSampleToRawDataSeq/rnaseq-samples.xlsx b/runs/isaSampleToRawDataSeq/rnaseq-samples.xlsx
index 1c05d363efc105474dc4887ac57f94beba0ac181..e73d722501815a8b129f9f7a95b3b0af60c45ab0 100644
Binary files a/runs/isaSampleToRawDataSeq/rnaseq-samples.xlsx and b/runs/isaSampleToRawDataSeq/rnaseq-samples.xlsx differ
diff --git a/runs/isaSampleToRawDataSeq/run.cwl b/runs/isaSampleToRawDataSeq/run.cwl
index 8f00f6abfd1d3f757b20fdf253fbbcd0b0003aa5..aca29e7543721a02e4a3a7eee0650b1167615a0f 100644
--- a/runs/isaSampleToRawDataSeq/run.cwl
+++ b/runs/isaSampleToRawDataSeq/run.cwl
@@ -15,10 +15,14 @@ steps:
       assayName: assayName
       startingNodeNum: startingNodeNum
       outName: outName
-    out: [output]
+    out:
+      - sampleseqCsv
+      - sampleseqXlsx
 
 outputs:
-  output: 
-    type: File[]
-    outputSource: isaSampleToRawDataSeq/output
-
+  sampleseqCsv:
+    type: File
+    outputSource: isaSampleToRawDataSeq/sampleseqCsv
+  sampleseqXlsx:
+    type: File
+    outputSource: isaSampleToRawDataSeq/sampleseqXlsx
\ No newline at end of file
diff --git a/runs/kallisto/run.cwl b/runs/kallisto/run.cwl
index 3ec2a22fd3d933361182dff470de94caf611a092..d702ed4426bff5a1890b4f9f0ce0de6acb1743c8 100644
--- a/runs/kallisto/run.cwl
+++ b/runs/kallisto/run.cwl
@@ -35,9 +35,9 @@ steps:
       StandardDeviation: StandardDeviation
       BootstrapSamples: BootstrapSamples
       resultsFolder: resultsFolder
-    out: [finalOut]
+    out: [kallistoOutDir]
 
 outputs:
-  finalOut:
-    type: Directory[]
-    outputSource: kallisto/finalOut
+  kallistoOutDir:
+    type: Directory
+    outputSource: kallisto/kallistoOutDir
diff --git a/runs/sleuth/run.cwl b/runs/sleuth/run.cwl
index b21434225a867157c64962fcf079f36b19d302b5..e00ce51a124f5266ae6f383ba5d21ba4383ffc57 100644
--- a/runs/sleuth/run.cwl
+++ b/runs/sleuth/run.cwl
@@ -12,7 +12,7 @@ inputs:
   outFolder: string
 
 steps: 
-  collectResults:
+  sleuth:
     run: ../../workflows/sleuth/workflow.cwl
     in:
       inKallistoResults: inKallistoResults
@@ -26,4 +26,4 @@ steps:
 outputs:
  outdir:
     type: Directory[]
-    outputSource: collectResults/outdir
+    outputSource: sleuth/outdir
diff --git a/workflows/fastqc/collectFilesInDir.cwl b/workflows/fastqc/collectFilesInDir.cwl
deleted file mode 100644
index 39f9ff8ae5a33d939136c081a9cd79533972eddc..0000000000000000000000000000000000000000
--- a/workflows/fastqc/collectFilesInDir.cwl
+++ /dev/null
@@ -1,20 +0,0 @@
-cwlVersion: v1.2
-class: ExpressionTool
-label: Collect files in a directory
-doc: |
-  Takes Files (e.g. from a workflow step) and yields them in a desired directory.
-requirements:
-  - class: InlineJavascriptRequirement
-inputs:
-  files: File[]
-  destination: string
-expression: |
-  ${
-    return {"outDir": {
-      "class": "Directory", 
-      "basename": inputs.destination,
-      "listing": inputs.files
-    } };
-  }
-outputs:
-  outDir: Directory
\ No newline at end of file
diff --git a/workflows/fastqc/fastqc.cwl b/workflows/fastqc/fastqc.cwl
index a2e408db732fa6913af001c6349dda4ac30a116e..f0b906a85f919f4547565b27a3254ad4404c8824 100644
--- a/workflows/fastqc/fastqc.cwl
+++ b/workflows/fastqc/fastqc.cwl
@@ -2,12 +2,14 @@
 cwlVersion: v1.2
 class: CommandLineTool
 
-label: Run fastqc on raw reads in FASTQ format (single or paired end) or aligned reads in BAM.
+label: FastQC - A high throughput sequence QC analysis tool
 
 doc: |
-  simplified from: https://github.com/common-workflow-library/bio-cwl-tools/blob/66f620da5b0a11e934a6da83272205a2516bcd91/fastqc/fastqc_1.cwl
-  
+  Original docs: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/
+
   Run fastqc on raw reads in FASTQ format (single or paired end) or aligned reads in BAM.
+  
+  This CWL was adapted from: https://github.com/common-workflow-library/bio-cwl-tools/blob/66f620da5b0a11e934a6da83272205a2516bcd91/fastqc/fastqc_1.cwl
 
 hints:
   ResourceRequirement:
@@ -18,11 +20,13 @@ hints:
   SoftwareRequirement:
     packages:
       fastqc:
-        specs: [ https://identifiers.org/biotools/fastqc ]
+        specs: 
+          - https://identifiers.org/biotools/fastqc
+          - - https://identifiers.org/rrid/RRID:SCR_014583
         version: [ "0.11.9" ]
 
-
 baseCommand: "fastqc"
+
 arguments: 
   - valueFrom: $(runtime.outdir)
     prefix: "-o"
@@ -46,3 +50,13 @@ outputs:
     outputBinding:
       glob: "*_fastqc.html"
     
+
+$namespaces:
+  edam: https://edamontology.org/
+  s: https://schema.org/
+$schemas:
+  - https://edamontology.org/EDAM_1.18.owl
+
+s:license: https://spdx.org/licenses/GPL-3.0-or-later
+
+
diff --git a/workflows/fastqc/gather-files.cwl b/workflows/fastqc/gather-files.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..67d23ec72e90012c4e07b2f2ebaf3b2d102308c8
--- /dev/null
+++ b/workflows/fastqc/gather-files.cwl
@@ -0,0 +1,24 @@
+cwlVersion: v1.2
+class: ExpressionTool
+label: Gather files
+doc: |
+  Helper tool to organize workflow outputs
+
+  Takes an array of files (e.g. from a workflow step) and yields them in a destination directory.
+
+  Adapted from: https://github.com/common-workflow-language/cwl-v1.1/blob/a22b7580c6b50e77c0a181ca59d3828dd5c69143/tests/dir7.cwl
+requirements:
+  - class: InlineJavascriptRequirement
+inputs:
+  inFiles: File[]
+  destination: string
+expression: |
+  ${
+    return {"outDir": {
+      "class": "Directory", 
+      "basename": inputs.destination,
+      "listing": inputs.inFiles
+    } };
+  }
+outputs:
+  outDir: Directory
\ No newline at end of file
diff --git a/workflows/fastqc/workflow.cwl b/workflows/fastqc/workflow.cwl
index d80a7eaafc7c6f530d3c43ca21716b005e7d1f4e..45923196e84b10785fbf079d4fe4c2d8397abfa4 100644
--- a/workflows/fastqc/workflow.cwl
+++ b/workflows/fastqc/workflow.cwl
@@ -18,15 +18,17 @@ steps:
       fastq: fastq
     out: [fastqc_zip, fastqc_html]
   collectFiles:
-    run: ./collectFilesInDir.cwl
+    run: ./gather-files.cwl
     in: 
-      destination: finaloutdir
-      files:
-        source: [fastqc/fastqc_html, fastqc/fastqc_zip]
+      inFiles:
+        source:
+          - fastqc/fastqc_html
+          - fastqc/fastqc_zip
         linkMerge: merge_flattened
+      destination: finaloutdir
     out: [outDir]
   
 outputs:
-  outdir:
+  fastqc_outdir:
     type: Directory
     outputSource: collectFiles/outDir
\ No newline at end of file
diff --git a/workflows/isaSampleToRawDataSeq/workflow.cwl b/workflows/isaSampleToRawDataSeq/workflow.cwl
index 9cace450b08381d8a8dc408daf6fab25489e8881..f9db3ee3cc8a9dcd6cb12b963d0728cdbb247c70 100644
--- a/workflows/isaSampleToRawDataSeq/workflow.cwl
+++ b/workflows/isaSampleToRawDataSeq/workflow.cwl
@@ -39,9 +39,13 @@ inputs:
       position: 4
 
 outputs:
-  output:
-    type: File[]
+  sampleseqCsv:
+    type: File
     outputBinding:
       glob:
         - "*.csv"
+  sampleseqXlsx:
+    type: File
+    outputBinding:
+      glob:
         - "*.xlsx"
diff --git a/workflows/kallisto/gather-dirs.cwl b/workflows/kallisto/gather-dirs.cwl
new file mode 100644
index 0000000000000000000000000000000000000000..858682309d3ce7fef50d7d71741832f9ecdde0ae
--- /dev/null
+++ b/workflows/kallisto/gather-dirs.cwl
@@ -0,0 +1,28 @@
+cwlVersion: v1.2
+class: ExpressionTool
+label: Gather directories
+doc: |
+  Helper tool to organize workflow outputs
+  
+  Takes an array of directories (e.g. from a workflow step) and yields them in a destination directory.
+
+  Adapted from: https://github.com/common-workflow-language/cwl-v1.1/blob/a22b7580c6b50e77c0a181ca59d3828dd5c69143/tests/dir7.cwl
+
+requirements:
+  - class: InlineJavascriptRequirement
+
+inputs:
+  inDirs: Directory[]
+  destinationDir: string
+
+expression: |
+  ${
+    return {"outDir": {
+      "class": "Directory", 
+      "basename": inputs.destinationDir,
+      "listing": inputs.inDirs
+    } };
+  }
+
+outputs:
+  outDir: Directory
\ No newline at end of file
diff --git a/workflows/kallisto/kallisto-index.cwl b/workflows/kallisto/kallisto-index.cwl
index d35f52022fabbb4028a84fe2866fbf3343122947..b43cba7adfe32a26892de9acff2d747d20c4e28f 100644
--- a/workflows/kallisto/kallisto-index.cwl
+++ b/workflows/kallisto/kallisto-index.cwl
@@ -2,17 +2,47 @@
 cwlVersion: v1.2
 class: CommandLineTool
 
+label: Kallisto index
+doc: |
+
+  Docs: https://pachterlab.github.io/kallisto/
+
+
+  Builds a kallisto index
+
+  Usage: kallisto index [arguments] FASTA-files
+
+  Required argument:
+  -i, --index=STRING          Filename for the kallisto index to be constructed 
+
+  Optional argument:
+  -k, --kmer-size=INT         k-mer (odd) length (default: 31, max value: 63)
+  -t, --threads=INT           Number of threads to use (default: 1)
+  -d, --d-list=STRING         Path to a FASTA-file containing sequences to mask from quantification
+      --make-unique           Replace repeated target names with unique names
+      --aa                    Generate index from a FASTA-file containing amino acid sequences
+      --distinguish           Generate index where sequences are distinguished by the sequence name
+  -T, --tmp=STRING            Temporary directory (default: tmp)
+  -m, --min-size=INT          Length of minimizers (default: automatically chosen)
+  -e, --ec-max-size=INT       Maximum number of targets in an equivalence class (default: no maximum)
+
+  This CWL was adapted from: https://github.com/common-workflow-library/bio-cwl-tools/commit/91c42fb809ce18eafe16155cca0abf362270c0fe
+
 hints:
   DockerRequirement:
     dockerPull: quay.io/biocontainers/kallisto:0.51.1--ha4fb952_1
   SoftwareRequirement:
     packages:
       kallisto:
-        version: [ "0.50.0" ]
-        specs: [ https://identifiers.org/biotools/kallisto ]
+        version: [ "0.51.1" ]
+        specs:
+          - https://identifiers.org/rrid/RRID:SCR_016582
+          - https://identifiers.org/biotools/kallisto 
 
 requirements:        
-  - class: InlineJavascriptRequirement
+  InlineJavascriptRequirement: {}
+
+baseCommand: [kallisto, index]
 
 inputs:
   InputFiles:
@@ -41,8 +71,6 @@ inputs:
     inputBinding:
       prefix: "--make-unique"
 
-baseCommand: [kallisto, index]
-
 outputs:
   index:
     type: File
@@ -51,5 +79,8 @@ outputs:
 
 $namespaces:
   edam: https://edamontology.org/
+  s: https://schema.org/
 $schemas:
   - https://edamontology.org/EDAM_1.18.owl
+
+s:license: https://spdx.org/licenses/BSD-2-Clause
diff --git a/workflows/kallisto/kallisto-quant.cwl b/workflows/kallisto/kallisto-quant.cwl
index 026f7e1bc37dba078b750b3f7ecb70019c4bc753..998c371f230cec6cabb4ea1f194b88510205fa0c 100755
--- a/workflows/kallisto/kallisto-quant.cwl
+++ b/workflows/kallisto/kallisto-quant.cwl
@@ -2,13 +2,51 @@
 cwlVersion: v1.2
 class: CommandLineTool
 
+label: Kallisto quant
+doc: |
+
+  Docs: https://pachterlab.github.io/kallisto/
+
+  Computes equivalence classes for reads and quantifies abundances
+
+  Usage: kallisto quant [arguments] FASTQ-files
+
+  Required arguments:
+  -i, --index=STRING            Filename for the kallisto index to be used for
+                                quantification
+  -o, --output-dir=STRING       Directory to write output to
+
+  Optional arguments:
+  -b, --bootstrap-samples=INT   Number of bootstrap samples (default: 0)
+      --seed=INT                Seed for the bootstrap sampling (default: 42)
+      --plaintext               Output plaintext instead of HDF5
+      --single                  Quantify single-end reads
+      --single-overhang         Include reads where unobserved rest of fragment is
+                                predicted to lie outside a transcript
+      --fr-stranded             Strand specific reads, first read forward
+      --rf-stranded             Strand specific reads, first read reverse
+  -l, --fragment-length=DOUBLE  Estimated average fragment length
+  -s, --sd=DOUBLE               Estimated standard deviation of fragment length
+                                (default: -l, -s values are estimated from paired
+                                end data, but are required when using --single)
+  -p, --priors                  Priors for the EM algorithm, either as raw counts or as
+                                probabilities. Pseudocounts are added to raw reads to
+                                prevent zero valued priors. Supplied in the same order
+                                as the transcripts in the transcriptome
+  -t, --threads=INT             Number of threads to use (default: 1)
+      --verbose                 Print out progress information every 1M proccessed reads
+
+
+  This CWL was adapted from: https://github.com/common-workflow-library/bio-cwl-tools/commit/91c42fb809ce18eafe16155cca0abf362270c0fe
+
+
 hints:
   DockerRequirement:
     dockerPull: quay.io/biocontainers/kallisto:0.51.1--ha4fb952_1
   SoftwareRequirement:
     packages:
       kallisto:
-        version: [ "0.50.0" ]
+        version: [ "0.51.1" ]
         specs: [ https://identifiers.org/biotools/kallisto ]
 
 inputs:
@@ -126,12 +164,16 @@ arguments: [ "--output-dir", $(inputs.QuantOutfolder) ]
 
 outputs:
 
-  outFolder:
+  kallistoQuantOutDir:
     type: Directory
     outputBinding:
       glob: $(runtime.outdir)/$(inputs.QuantOutfolder)
 
+
 $namespaces:
   edam: https://edamontology.org/
+  s: https://schema.org/
 $schemas:
   - https://edamontology.org/EDAM_1.18.owl
+
+s:license: https://spdx.org/licenses/BSD-2-Clause
diff --git a/workflows/kallisto/kallisto-test.cwl b/workflows/kallisto/kallisto-test.cwl
deleted file mode 100644
index 3a05871190f87a7d8436644c9db41b14fa73b758..0000000000000000000000000000000000000000
--- a/workflows/kallisto/kallisto-test.cwl
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env cwl-runner
-cwlVersion: v1.2
-class: CommandLineTool
-
-hints:
-  DockerRequirement:
-    dockerPull: quay.io/biocontainers/kallisto:0.50.1--h6de1650_2
-  SoftwareRequirement:
-    packages:
-      kallisto:
-        version: [ "0.50.0" ]
-        specs: [ https://identifiers.org/biotools/kallisto ]
-
-inputs: []
-
-baseCommand: [kallisto]
-
-outputs: []
\ No newline at end of file
diff --git a/workflows/kallisto/workflow.cwl b/workflows/kallisto/workflow.cwl
index 4ce56173769787379dddf9cd977d60b18e6ff9c1..3120f96bc99f073fa144ccbe49fbf4fd7e52772e 100644
--- a/workflows/kallisto/workflow.cwl
+++ b/workflows/kallisto/workflow.cwl
@@ -8,60 +8,59 @@ requirements:
   InlineJavascriptRequirement: {}
 
 inputs:
-    IndexInput: File[]
-    sampleRecord:
-        type:
-          type: array
-          items:
-            type: record
-            fields:
-              readsOfOneSample:
-                type: File[]
-              sampleName:
-                type: string?
-    isSingle: boolean
-    FragmentLength: double?
-    StandardDeviation: double?
-    BootstrapSamples: int?
-    resultsFolder: string
+  IndexInput: File[]
+  sampleRecord:
+    type:
+      type: array
+      items:
+        type: record
+        fields:
+          readsOfOneSample:
+            type: File[]
+          sampleName:
+            type: string?
+  isSingle: boolean
+  FragmentLength: double?
+  StandardDeviation: double?
+  BootstrapSamples: int?
+  resultsFolder: string
 
 steps:
-    index:
-        run: kallisto-index.cwl
-        in:
-            InputFiles: IndexInput
-            IndexName:
-                source: IndexInput
-                valueFrom: $(self[0].nameroot)
-        out: [index]
+  index:
+    run: kallisto-index.cwl
+    in:
+      InputFiles: IndexInput
+      IndexName:
+        source: IndexInput
+        valueFrom: $(self[0].nameroot)
+    out: [index]
 
-    quant:
-        run: kallisto-quant.cwl
-        scatter: [InputReads, QuantOutfolder]
-        scatterMethod: dotproduct
-        in:
-            InputReads:
-                source: sampleRecord
-                valueFrom: $(self.readsOfOneSample)
-            QuantOutfolder:
-                source: sampleRecord
-                valueFrom: $(self.sampleName)
-            Index: index/index
-            isSingle: isSingle
-            FragmentLength: FragmentLength
-            StandardDeviation: StandardDeviation
-            BootstrapSamples: BootstrapSamples
-        out: [outFolder]
-
-    collectResults:
-        run: ./yield-dirInDestination.cwl
-        scatter: inDir
-        in:
-            inDir: quant/outFolder
-            destinationDir: resultsFolder
-        out: [outDir]
+  quant:
+    run: kallisto-quant.cwl
+    scatter: [InputReads, QuantOutfolder]
+    scatterMethod: dotproduct
+    in:
+      InputReads:
+        source: sampleRecord
+        valueFrom: $(self.readsOfOneSample)
+      QuantOutfolder:
+        source: sampleRecord
+        valueFrom: $(self.sampleName)
+      Index: index/index
+      isSingle: isSingle
+      FragmentLength: FragmentLength
+      StandardDeviation: StandardDeviation
+      BootstrapSamples: BootstrapSamples
+    out: [kallistoQuantOutDir]
+  collectResults:
+    run: ./gather-dirs.cwl
+    in:
+      inDirs: quant/kallistoQuantOutDir
+      destinationDir: resultsFolder
+    out: [outDir]
 
 outputs:
-  finalOut:
-    type: Directory[]
+  kallistoOutDir:
+    type: Directory
     outputSource: collectResults/outDir
+    
diff --git a/workflows/kallisto/yield-dirInDestination.cwl b/workflows/kallisto/yield-dirInDestination.cwl
deleted file mode 100644
index bc90cb81f1a907735bd433d6117c55872c213f92..0000000000000000000000000000000000000000
--- a/workflows/kallisto/yield-dirInDestination.cwl
+++ /dev/null
@@ -1,19 +0,0 @@
-cwlVersion: v1.2
-class: ExpressionTool
-doc: |
-  Takes a directory (e.g. from a workflow step) and yields it in a desired directory.
-requirements:
-  - class: InlineJavascriptRequirement
-inputs:
-  inDir: Directory
-  destinationDir: string
-expression: |
-  ${
-    return {"outDir": {
-      "class": "Directory", 
-      "basename": inputs.destinationDir,
-      "listing": [inputs.inDir]
-    } };
-  }
-outputs:
-  outDir: Directory
\ No newline at end of file