diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,24 +1,37 @@
 # Changelog for dhall-fly
 
+## 0.3.0
+
+* Add support for `set_pipeline` step.
+
+## 0.2.4
+
+* Tighten bounds for dhall-json.
+
+## 0.2.3
+
+* Upgrade dhall to 1.29 and dhall-json to 1.6.1.
+* Upgrade dhall-concourse to 0.6.0.
+
 ## 0.2.2
 
-* Upgrade dhall to 1.28 and dhall-json to 1.6
+* Upgrade dhall to 1.28 and dhall-json to 1.6.
 
 ## 0.2.1
 
-* Groups retain the order they are in list of grouped jobs
+* Groups retain the order they are in list of grouped jobs.
 
 ## 0.2.0
 
-* Tested with dhall-concourse 0.5.0
-* Add `--file` command line option to render pipelines from files
-* Add support for grouping jobs
-* Fix: Add inputs to `PutSteps`
-* Fix: Add tags, timeouts and attempts to `ToJSON` instance of `PutStep`
-* Fix: Add vars, tags, timeouts and attempts to `TaskStep`
+* Tested with dhall-concourse 0.5.0.
+* Add `--file` command line option to render pipelines from files.
+* Add support for grouping jobs.
+* Fix: Add inputs to `PutSteps`.
+* Fix: Add tags, timeouts and attempts to `ToJSON` instance of `PutStep`.
+* Fix: Add vars, tags, timeouts and attempts to `TaskStep`.
 
 ## 0.1.0
 
-* Support for dhall-concourse 0.2.2
+* Support for dhall-concourse 0.2.2.
 
 ## Unreleased changes
diff --git a/dhall-concourse/README.md b/dhall-concourse/README.md
--- a/dhall-concourse/README.md
+++ b/dhall-concourse/README.md
@@ -26,7 +26,7 @@
 
 ```dhall
 let Concourse = 
-      https://raw.githubusercontent.com/akshaymankar/dhall-concourse/0.5.0/package.dhall
+      https://raw.githubusercontent.com/akshaymankar/dhall-concourse/0.6.0/package.dhall
 
 let jobs = ./jobs.dhall
 
@@ -47,7 +47,7 @@
 
 ```dhall
 let Concourse = 
-      https://raw.githubusercontent.com/akshaymankar/dhall-concourse/0.5.0/package.dhall
+      https://raw.githubusercontent.com/akshaymankar/dhall-concourse/0.6.0/package.dhall
 
 let groupedJobs = ./grouped-jobs.dhall
 
diff --git a/dhall-concourse/defaults/SetPipelineStep.dhall b/dhall-concourse/defaults/SetPipelineStep.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/defaults/SetPipelineStep.dhall
@@ -0,0 +1,6 @@
+{ vars = None ../types/JSONObject.dhall
+, var_files = None (List Text)
+, tags = None (List Text)
+, timeout = None Text
+, attempts = None Natural
+}
diff --git a/dhall-concourse/defaults/package.dhall b/dhall-concourse/defaults/package.dhall
--- a/dhall-concourse/defaults/package.dhall
+++ b/dhall-concourse/defaults/package.dhall
@@ -5,7 +5,7 @@
       ./Resource.dhall sha256:6a42d337edb6bdd591871f41caa350eb67d8b5eab51b06a154b4973ae74b6dde
     ? ./Resource.dhall
 , Job =
-      ./Job.dhall sha256:0cb9ded91690e80d5411c742575c56b2b3a41c8c0c1ac0267992318e43df00e7
+      ./Job.dhall sha256:3d949368be2ea96468cbf142e3529719d44225d3e9daab7ed779f7cd51de7368
     ? ./Job.dhall
 , GetStep =
       ./GetStep.dhall sha256:cac33657ae7f42c625cbb33de707a5a1681d4b1f23e08c0a05c2cd0b440e7ce8
@@ -34,4 +34,7 @@
 , PutStep =
       ./PutStep.dhall sha256:4c1bbd2b0842d5f6f23dd1178a3f0e734f0b901cb4cfb4adb6e6c9d61cb1a39b
     ? ./PutStep.dhall
+, SetPipelineStep =
+      ./SetPipelineStep.dhall sha256:80b6b52b2ab1f2b7945bca6b02c9c9250846b6ca1441da32d2738987c3b50eef
+    ? ./SetPipelineStep.dhall
 }
diff --git a/dhall-concourse/extractors/package.dhall b/dhall-concourse/extractors/package.dhall
--- a/dhall-concourse/extractors/package.dhall
+++ b/dhall-concourse/extractors/package.dhall
@@ -1,5 +1,5 @@
 { resourcesFromJobs =
-      ./resourcesFromJobs.dhall sha256:ebae6ead8ad17037884f99e10136782cf705f534eba9d41f06ed0d6db6e34ad0
+      ./resourcesFromJobs.dhall sha256:eb61615a4847ebe2d5d9bf61d0288f088295fc845476050595e083db3b00fb2c
     ? ./resourcesFromJobs.dhall
 , resourceTypesFromResources =
       ./resourcesTypesFromResources.dhall sha256:b49098518c53809ff472643c55e94399dfa789f795e77089085dad673404f223
diff --git a/dhall-concourse/extractors/resourcesFromJobs.dhall b/dhall-concourse/extractors/resourcesFromJobs.dhall
--- a/dhall-concourse/extractors/resourcesFromJobs.dhall
+++ b/dhall-concourse/extractors/resourcesFromJobs.dhall
@@ -15,7 +15,7 @@
               catOptionals
                 (List Resource)
                 [ h.ensure, h.on_success, h.on_failure, h.on_abort ]
-        
+
         in  Prelude.List.concat Resource listOfListOfResources
 
 let resourcesFromGetStep
@@ -36,6 +36,12 @@
       → λ(h : StepHooks (List Resource))
       → resourcesFromStepHooks h
 
+let resourcesFromSetPipelineStep
+    : Types.SetPipelineStep → StepHooks (List Resource) → List Resource
+    =   λ(_ : Types.SetPipelineStep)
+      → λ(h : StepHooks (List Resource))
+      → resourcesFromStepHooks h
+
 let resourcesFromAggregateOrDo
     : List (List Resource) → StepHooks (List Resource) → List Resource
     =   λ(rs : List (List Resource))
@@ -75,6 +81,7 @@
           { get = resourcesFromGetStep
           , put = resourcesFromPutStep
           , task = resourcesFromTaskStep
+          , set_pipeline = resourcesFromSetPipelineStep
           , aggregate = resourcesFromAggregateOrDo
           , do = resourcesFromAggregateOrDo
           , try = resourcesFromTry
@@ -87,8 +94,12 @@
               catOptionals
                 Types.Step
                 [ j.on_abort, j.on_failure, j.on_success, j.ensure ]
-        
-        in  Prelude.List.concatMap Types.Step Resource resourcesFromStep (j.plan # hookSteps)
+
+        in  Prelude.List.concatMap
+              Types.Step
+              Resource
+              resourcesFromStep
+              (j.plan # hookSteps)
 
 in    Prelude.List.concatMap Types.Job Resource resourcesFromJob
     : List Types.Job → List Resource
diff --git a/dhall-concourse/helpers/addHooks.dhall b/dhall-concourse/helpers/addHooks.dhall
--- a/dhall-concourse/helpers/addHooks.dhall
+++ b/dhall-concourse/helpers/addHooks.dhall
@@ -22,6 +22,10 @@
                 λ(t : Types.TaskStep)
               → λ(_ : StepHooks Step)
               → ./taskWithHooks.dhall t hooks
+          , set_pipeline =
+                λ(s : Types.SetPipelineStep)
+              → λ(_ : StepHooks Step)
+              → ./setPipelineStepWithHooks.dhall s hooks
           , aggregate =
                 λ(steps : List Step)
               → λ(_ : StepHooks Step)
diff --git a/dhall-concourse/helpers/addTags.dhall b/dhall-concourse/helpers/addTags.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/addTags.dhall
@@ -0,0 +1,103 @@
+let Prelude = ../lib/prelude.dhall
+
+let Types = ../types/package.dhall
+
+let Step = Types.Step
+
+let StepConstructors = Types.StepConstructors
+
+let translateHooks = ./translateHooks.dhall
+
+let mergeTags
+    : Optional (List Text) → List Text → Optional (List Text)
+    =   λ(origTags : Optional (List Text))
+      → λ(newTags : List Text)
+      → Some
+          ( merge
+              { None = newTags
+              , Some =
+                    λ(tags : List Text)
+                  → Prelude.List.concat Text [ tags, newTags ]
+              }
+              origTags
+          )
+
+let addTagsToGet
+    : List Text → Types.GetStep → Types.StepHooks Step → Step
+    =   λ(tags : List Text)
+      → λ(g : Types.GetStep)
+      → λ(h : Types.StepHooks Step)
+      → λ(S : Type)
+      → λ(c : StepConstructors S)
+      → c.get
+          (   g
+            ⫽ { tags = mergeTags g.tags tags
+              , resource = ./addTagsToResource.dhall tags g.resource
+              }
+          )
+          (translateHooks S c h)
+
+let addTagsToPut
+    : List Text → Types.PutStep → Types.StepHooks Step → Step
+    =   λ(tags : List Text)
+      → λ(p : Types.PutStep)
+      → λ(h : Types.StepHooks Step)
+      → λ(S : Type)
+      → λ(c : StepConstructors S)
+      → c.put
+          (   p
+            ⫽ { tags = mergeTags p.tags tags
+              , resource = ./addTagsToResource.dhall tags p.resource
+              }
+          )
+          (translateHooks S c h)
+
+let addTagsToTask
+    : List Text → Types.TaskStep → Types.StepHooks Step → Step
+    =   λ(tags : List Text)
+      → λ(t : Types.TaskStep)
+      → λ(h : Types.StepHooks Step)
+      → λ(S : Type)
+      → λ(c : StepConstructors S)
+      → c.task (t ⫽ { tags = mergeTags t.tags tags }) (translateHooks S c h)
+
+let addTagsToSetPipeline
+    : List Text → Types.SetPipelineStep → Types.StepHooks Step → Step
+    =   λ(tags : List Text)
+      → λ(s : Types.SetPipelineStep)
+      → λ(h : Types.StepHooks Step)
+      → λ(S : Type)
+      → λ(c : StepConstructors S)
+      → c.set_pipeline
+          (s ⫽ { tags = mergeTags s.tags tags })
+          (translateHooks S c h)
+
+let addTagsToStep
+    : List Text → Step → Step
+    =   λ(tags : List Text)
+      → λ(s : Step)
+      → s
+          Step
+          { get = addTagsToGet tags
+          , put = addTagsToPut tags
+          , task = addTagsToTask tags
+          , set_pipeline = addTagsToSetPipeline tags
+          , aggregate = ./aggregateWithHooks.dhall
+          , do = ./doWithHooks.dhall
+          , try = ./tryWithHooks.dhall
+          , in_parallel = ./inParallelWithHooks.dhall
+          }
+
+let addTags
+    : List Text → List Types.Job → List Types.Job
+    =   λ(tags : List Text)
+      → Prelude.List.map
+          Types.Job
+          Types.Job
+          (   λ(j : Types.Job)
+            →   j
+              ⫽ { plan = Prelude.List.map Step Step (addTagsToStep tags) j.plan
+                }
+          )
+
+in  addTags
diff --git a/dhall-concourse/helpers/addTagsToResource.dhall b/dhall-concourse/helpers/addTagsToResource.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/addTagsToResource.dhall
@@ -0,0 +1,8 @@
+  λ(tags : List Text)
+→ λ(r : ../types/Resource.dhall)
+→   r
+  ⫽ { tags =
+        merge
+          { None = Some tags, Some = λ(ts : List Text) → Some (ts # tags) }
+          r.tags
+    }
diff --git a/dhall-concourse/helpers/aggregateWithHooks.dhall b/dhall-concourse/helpers/aggregateWithHooks.dhall
--- a/dhall-concourse/helpers/aggregateWithHooks.dhall
+++ b/dhall-concourse/helpers/aggregateWithHooks.dhall
@@ -1,20 +1,11 @@
 let Types = ../types/package.dhall
 
-let Prelude = ../lib/prelude.dhall
-
 in    (   λ(steps : List Types.Step)
         → λ(hooks : Types.StepHooks Types.Step)
         → λ(Step : Type)
         → λ(constructors : Types.StepConstructors Step)
-        → let stepTypeFix =
-                Prelude.List.map
-                  Types.Step
-                  Step
-                  (λ(s : Types.Step) → s Step constructors)
-                  steps
-
-          in  constructors.aggregate
-                stepTypeFix
-                (./translateHooks.dhall hooks Step constructors)
+        → constructors.aggregate
+            (./translateSteps.dhall Step constructors steps)
+            (./translateHooks.dhall Step constructors hooks)
       )
     : List Types.Step → Types.StepHooks Types.Step → Types.Step
diff --git a/dhall-concourse/helpers/doWithHooks.dhall b/dhall-concourse/helpers/doWithHooks.dhall
--- a/dhall-concourse/helpers/doWithHooks.dhall
+++ b/dhall-concourse/helpers/doWithHooks.dhall
@@ -1,22 +1,13 @@
 let Types = ../types/package.dhall
 
-let Prelude = ../lib/prelude.dhall
-
 let doStep
     : List Types.Step → Types.StepHooks Types.Step → Types.Step
     =   λ(steps : List Types.Step)
       → λ(hooks : Types.StepHooks Types.Step)
       → λ(Step : Type)
       → λ(constructors : Types.StepConstructors Step)
-      → let stepTypeFix =
-              Prelude.List.map
-                Types.Step
-                Step
-                (λ(s : Types.Step) → s Step constructors)
-                steps
-
-        in  constructors.do
-              stepTypeFix
-              (./translateHooks.dhall hooks Step constructors)
+      → constructors.do
+          (./translateSteps.dhall Step constructors steps)
+          (./translateHooks.dhall Step constructors hooks)
 
 in  doStep
diff --git a/dhall-concourse/helpers/getWithHooks.dhall b/dhall-concourse/helpers/getWithHooks.dhall
--- a/dhall-concourse/helpers/getWithHooks.dhall
+++ b/dhall-concourse/helpers/getWithHooks.dhall
@@ -1,15 +1,11 @@
 let Types = ../types/package.dhall
 
-let Defaults = ../defaults/package.dhall
-
-let Prelude = ../lib/prelude.dhall
-
 in    (   λ(getStep : Types.GetStep)
         → λ(hooks : Types.StepHooks Types.Step)
         → λ(Step : Type)
         → λ(constructors : Types.StepConstructors Step)
         → constructors.get
             getStep
-            (./translateHooks.dhall hooks Step constructors)
+            (./translateHooks.dhall Step constructors hooks)
       )
     : Types.GetStep → Types.StepHooks Types.Step → Types.Step
diff --git a/dhall-concourse/helpers/inParallelWithHooks.dhall b/dhall-concourse/helpers/inParallelWithHooks.dhall
--- a/dhall-concourse/helpers/inParallelWithHooks.dhall
+++ b/dhall-concourse/helpers/inParallelWithHooks.dhall
@@ -1,42 +1,13 @@
 let Types = ../types/package.dhall
 
-let Prelude = ../lib/prelude.dhall
-
-let typeFixSteps
-    : ∀(T : Type) → Types.StepConstructors T → List Types.Step → List T
-    =   λ(T : Type)
-      → λ(constructors : Types.StepConstructors T)
-      → Prelude.List.map Types.Step T (λ(s : Types.Step) → s T constructors)
-
-let typeFix
-    :   ∀(T : Type)
-      → Types.StepConstructors T
-      → Types.InParallelStep Types.Step
-      → Types.InParallelStep T
-    =   λ(T : Type)
-      → λ(constructors : Types.StepConstructors T)
-      → λ(parallel : Types.InParallelStep Types.Step)
-      → merge
-          { Steps =
-                λ(s : List Types.Step)
-              → (Types.InParallelStep T).Steps (typeFixSteps T constructors s)
-          , Config =
-                λ(cfg : Types.InParallelConfig Types.Step)
-              → (Types.InParallelStep T).Config
-                  (cfg ⫽ { steps = typeFixSteps T constructors cfg.steps })
-          }
-          parallel
-
 let inParallelWithHooks
     : Types.InParallelStep Types.Step → Types.StepHooks Types.Step → Types.Step
     =   λ(parallelSteps : Types.InParallelStep Types.Step)
       → λ(hooks : Types.StepHooks Types.Step)
       → λ(Step : Type)
       → λ(constructors : Types.StepConstructors Step)
-      → let stepTypeFix = typeFix Step constructors parallelSteps
-
-        in  constructors.in_parallel
-              stepTypeFix
-              (./translateHooks.dhall hooks Step constructors)
+      → constructors.in_parallel
+          (./translateInParallelStep.dhall Step constructors parallelSteps)
+          (./translateHooks.dhall Step constructors hooks)
 
 in  inParallelWithHooks
diff --git a/dhall-concourse/helpers/package.dhall b/dhall-concourse/helpers/package.dhall
--- a/dhall-concourse/helpers/package.dhall
+++ b/dhall-concourse/helpers/package.dhall
@@ -1,46 +1,55 @@
 { taskStep =
-      ./taskStep.dhall sha256:70d9bca82912ffc2d670952657d8f54f5090ab7a1b3d87f136104bee11537359
+      ./taskStep.dhall sha256:35f1f101a0e28a192330aadc36105db3f4e4de4a2376dcdc906ce66ede466027
     ? ./taskStep.dhall
 , putStep =
-      ./putStep.dhall sha256:36cf1f3065db932e5cd52bc564b9ce0a4236a6713277dacb11119d497ff77196
+      ./putStep.dhall sha256:0bdc86fff43404a8bd70f7f1b0a1a1c06ef06cc8cc6564b091eb94f62efd985b
     ? ./putStep.dhall
 , getStep =
-      ./getStep.dhall sha256:7fa4a6cc1b49f64d6420d1ba0de9cfac09f0f78fac782644043d99d59ad00ed1
+      ./getStep.dhall sha256:44a9ad8aeddca12f390148e76d649e29607d1160e1984440a008e923b6e7cb1e
     ? ./getStep.dhall
+, setPipelineStep =
+      ./setPipelineStep.dhall sha256:d88e17fb0603e3464672ee22225828e5be3728955b57f9ce363fa32b39712e99
+    ? ./setPipelineStep.dhall
+, setPipelineStepWithHooks =
+      ./setPipelineStepWithHooks.dhall sha256:042f8840304647a3041d03b116468248256a43867b81d1f5653814f725b69caa
+    ? ./setPipelineStepWithHooks.dhall
 , aggregateStep =
-      ./aggregateStep.dhall sha256:4c63bc1b4c97b7a7496644ac35a848bce4673ae929ac7bce016d269a1df1d61c
+      ./aggregateStep.dhall sha256:66bd981b354edb0491ad2563392b75f943778ad4cffa0de49d7dac0f351b6137
     ? ./aggregateStep.dhall
 , inParallelStep =
-      ./inParallelStep.dhall sha256:16810a83749f2373df22b263004c7f462bbe744089cdba5749e241555339e2ec
+      ./inParallelStep.dhall sha256:0d99e7f5466a08ea64980b150c99f63c65c09b22e4a859a4eff95ec0f86f459e
     ? ./inParallelStep.dhall
 , inParallelStepSimple =
-      ./inParallelStepSimple.dhall sha256:70d3023fb015584b5ed0d439e0a0aaa8cef6802733d85256cf571a8fbd5da8fd
+      ./inParallelStepSimple.dhall sha256:3dd28a9566544d59482cdd9a8d29fa2617c47eab30f2027d90a966582340f266
     ? ./inParallelStepSimple.dhall
 , doStep =
-      ./doStep.dhall sha256:8db65241db7e62a1eb2ba241c61491ca964f438dfc74708f696ec2475fb65b08
+      ./doStep.dhall sha256:6939459a1703b9173c0cad95ab4f2c7e6b1c08856c74e16d70d4ac21be90d225
     ? ./doStep.dhall
 , tryStep =
-      ./tryStep.dhall sha256:54675d2eef37e557d8208d86dd76162b9fd7d97e7c24b7f249ca20e9b39319eb
+      ./tryStep.dhall sha256:3ff6d62d5444b1b0d8e0625cdf6ab784b8771e682d32615981fc50187c8d07d8
     ? ./tryStep.dhall
 , getWithHooks =
-      ./getWithHooks.dhall sha256:955df86d3c2e47cc8ad716753daa601ab480e517ef95d5cc254e81bff26830f4
+      ./getWithHooks.dhall sha256:814a97dd8f2a1b235cb78e5da23cde349d43c4c31e7685d6a186c1aff580f6fa
     ? ./getWithHooks.dhall
 , putWithHooks =
-      ./putWithHooks.dhall sha256:f371b5557998a9c6c8cc62931e5ed0f71f47e2446c61a66e06911d1c5b2890b5
+      ./putWithHooks.dhall sha256:8d495a462244021cdab012cb09787a91a414b55a8b5c0ad064cacd5d0bdca1f1
     ? ./putWithHooks.dhall
 , taskWithHooks =
-      ./taskWithHooks.dhall sha256:315fee6fb1194a7e9d65046f6c9b411b50ba5cc4648ce4ae83a90907aaac7b61
+      ./taskWithHooks.dhall sha256:e7147cb3d5e60ac0354c72b787305517bec0f839b0fea98173bac08da4c2f541
     ? ./taskWithHooks.dhall
 , inParallelWithHooks =
-      ./inParallelWithHooks.dhall sha256:165993bc29b1e5f1aa9b9be629b5ce443626cc1a481ff1af3a301ed492da0180
+      ./inParallelWithHooks.dhall sha256:6c1dddcbdf64f8a8bfd002a56ebba422b5be5c2922099e5a297dd25b4bb54fb6
     ? ./inParallelWithHooks.dhall
 , aggregateWithHooks =
-      ./aggregateWithHooks.dhall sha256:d1aa9c681ad69025596b888acc95ce81d1c5599de38441190499a19420e842a2
+      ./aggregateWithHooks.dhall sha256:8b11ec6d240005c4707cc6920539731b4788a6dcf717d3f9679da3c8c93581ae
     ? ./aggregateWithHooks.dhall
 , doWithHooks =
-      ./doWithHooks.dhall sha256:540a12579021f3b597f34d7929f4e9686d66274ad542173e8334a2236b748e7c
+      ./doWithHooks.dhall sha256:aa0aabe9c774a7f875f2b7f86ba732719b13c0ea00a7637a82b1e76526aa3c6a
     ? ./doWithHooks.dhall
 , tryWithHooks =
-      ./tryWithHooks.dhall sha256:b1808275879f924e73fd9c12393f04a9563c8f1a74743f5ac125d9849b912b0d
+      ./tryWithHooks.dhall sha256:bbec9d446615e592d83a5f9340ebad2ac289bfcab56fa95338c7e45662a42f5d
     ? ./tryWithHooks.dhall
+, addTags =
+      ./addTags.dhall sha256:99644b3b9ba67a6febd9c5038cd3f0b19265ba95f6211569e941fc890db6ab95
+    ? ./addTags.dhall
 }
diff --git a/dhall-concourse/helpers/putWithHooks.dhall b/dhall-concourse/helpers/putWithHooks.dhall
--- a/dhall-concourse/helpers/putWithHooks.dhall
+++ b/dhall-concourse/helpers/putWithHooks.dhall
@@ -6,6 +6,6 @@
         → λ(constructors : Types.StepConstructors Step)
         → constructors.put
             putStep
-            (./translateHooks.dhall hooks Step constructors)
+            (./translateHooks.dhall Step constructors hooks)
       )
     : Types.PutStep → Types.StepHooks Types.Step → Types.Step
diff --git a/dhall-concourse/helpers/setPipelineStep.dhall b/dhall-concourse/helpers/setPipelineStep.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/setPipelineStep.dhall
@@ -0,0 +1,10 @@
+let Types = ../types/package.dhall
+
+let Defaults = ../defaults/package.dhall
+
+let setPipelineStep
+    : Types.SetPipelineStep → Types.Step
+    =   λ(s : Types.SetPipelineStep)
+      → ./setPipelineStepWithHooks.dhall s (Defaults.StepHooks Types.Step)
+
+in  setPipelineStep
diff --git a/dhall-concourse/helpers/setPipelineStepWithHooks.dhall b/dhall-concourse/helpers/setPipelineStepWithHooks.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/setPipelineStepWithHooks.dhall
@@ -0,0 +1,11 @@
+let Types = ../types/package.dhall
+
+in    (   λ(setPipelineStep : Types.SetPipelineStep)
+        → λ(hooks : Types.StepHooks Types.Step)
+        → λ(Step : Type)
+        → λ(constructors : Types.StepConstructors Step)
+        → constructors.set_pipeline
+            setPipelineStep
+            (./translateHooks.dhall Step constructors hooks )
+      )
+    : Types.SetPipelineStep → Types.StepHooks Types.Step → Types.Step
diff --git a/dhall-concourse/helpers/taskWithHooks.dhall b/dhall-concourse/helpers/taskWithHooks.dhall
--- a/dhall-concourse/helpers/taskWithHooks.dhall
+++ b/dhall-concourse/helpers/taskWithHooks.dhall
@@ -6,6 +6,6 @@
         → λ(constructors : Types.StepConstructors Step)
         → constructors.task
             taskStep
-            (./translateHooks.dhall hooks Step constructors)
+            (./translateHooks.dhall Step constructors hooks)
       )
     : Types.TaskStep → Types.StepHooks Types.Step → Types.Step
diff --git a/dhall-concourse/helpers/translateHooks.dhall b/dhall-concourse/helpers/translateHooks.dhall
--- a/dhall-concourse/helpers/translateHooks.dhall
+++ b/dhall-concourse/helpers/translateHooks.dhall
@@ -3,13 +3,13 @@
 let Prelude = ../lib/prelude.dhall
 
 let translateHooks
-    :   Types.StepHooks Types.Step
-      → ∀(S : Type)
+    :   ∀(S : Type)
       → Types.StepConstructors S
+      → Types.StepHooks Types.Step
       → Types.StepHooks S
-    =   λ(hooks : Types.StepHooks Types.Step)
-      → λ(S : Type)
+    =   λ(S : Type)
       → λ(constructors : Types.StepConstructors S)
+      → λ(hooks : Types.StepHooks Types.Step)
       → let translateOptionalStep =
               Prelude.Optional.map
                 Types.Step
diff --git a/dhall-concourse/helpers/translateInParallelStep.dhall b/dhall-concourse/helpers/translateInParallelStep.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/translateInParallelStep.dhall
@@ -0,0 +1,26 @@
+let Types = ../types/package.dhall
+
+let translateInParallelStep
+    :   ∀(T : Type)
+      → Types.StepConstructors T
+      → Types.InParallelStep Types.Step
+      → Types.InParallelStep T
+    =   λ(T : Type)
+      → λ(constructors : Types.StepConstructors T)
+      → λ(parallel : Types.InParallelStep Types.Step)
+      → merge
+          { Steps =
+                λ(s : List Types.Step)
+              → (Types.InParallelStep T).Steps
+                  (./translateSteps.dhall T constructors s)
+          , Config =
+                λ(cfg : Types.InParallelConfig Types.Step)
+              → (Types.InParallelStep T).Config
+                  (   cfg
+                    ⫽ { steps = ./translateSteps.dhall T constructors cfg.steps
+                      }
+                  )
+          }
+          parallel
+
+in  translateInParallelStep
diff --git a/dhall-concourse/helpers/translateSteps.dhall b/dhall-concourse/helpers/translateSteps.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/translateSteps.dhall
@@ -0,0 +1,13 @@
+let Step = ../types/Step.dhall
+
+let StepConstructors = ../types/StepConstructors.dhall
+
+let Prelude = ../lib/prelude.dhall
+
+let translateSteps
+    : ∀(S : Type) → StepConstructors S → List Step → List S
+    =   λ(S : Type)
+      → λ(c : StepConstructors S)
+      → Prelude.List.map Step S (λ(s : Step) → s S c)
+
+in  translateSteps
diff --git a/dhall-concourse/helpers/tryWithHooks.dhall b/dhall-concourse/helpers/tryWithHooks.dhall
--- a/dhall-concourse/helpers/tryWithHooks.dhall
+++ b/dhall-concourse/helpers/tryWithHooks.dhall
@@ -6,10 +6,8 @@
       → λ(hooks : Types.StepHooks Types.Step)
       → λ(Step : Type)
       → λ(constructors : Types.StepConstructors Step)
-      → let stepTypeFix = step Step constructors
-
-        in  constructors.try
-              stepTypeFix
-              (./translateHooks.dhall hooks Step constructors)
+      → constructors.try
+          (step Step constructors)
+          (./translateHooks.dhall Step constructors hooks)
 
 in  tryStep
diff --git a/dhall-concourse/package.dhall b/dhall-concourse/package.dhall
--- a/dhall-concourse/package.dhall
+++ b/dhall-concourse/package.dhall
@@ -1,19 +1,19 @@
 { Types =
-      ./types/package.dhall sha256:35d21e500af502817cf25857447ac8e847261b76055f2c23b43f76a6a953db0c
+      ./types/package.dhall sha256:c9a1dca64d70a28b126825f3c049c3c7ce5b62de6944d1eea819bce5cdafa545
     ? ./types/package.dhall
 , defaults =
-      ./defaults/package.dhall sha256:15e958705784a9fcb3c7637dac50ccf74be318db1ffc771af4d7ee9b5a3f2906
+      ./defaults/package.dhall sha256:39713773aa3d6eccedfef9e30e3cb8692dbe79b48ebbbd4356715e4a8f388754
     ? ./defaults/package.dhall
 , schemas =
-      ./schemas/package.dhall sha256:bf3838a202e3d5d7f5b764229b069423ec54d2c6a8ea1658a1036ad855750bbd
+      ./schemas/package.dhall sha256:565be3e3f8c6edbe9918664f59720ea3efe64dcb89f62cebb413992386b195bd
     ? ./schemas/package.dhall
 , helpers =
-      ./helpers/package.dhall sha256:334d50f7b6248b79c2d9c944d49dd60cb5ccd6e2812f42a83d4282eb6cf9a299
+      ./helpers/package.dhall sha256:35a321e7b48d31bab3413a29b48b1a730502854e3c63bda8985fae3adb3300f6
     ? ./helpers/package.dhall
 , render =
-      ./render/package.dhall sha256:102ffaeffabf83db684c6c1ee9c30023ad080aea4a776328f6fd7d3a8d4b1309
+      ./render/package.dhall sha256:a6e12d4c86b383901a5eb644f3775d26c107fdba02c4109f0d76089bb96b3af5
     ? ./render/package.dhall
 , extractors =
-      ./extractors/package.dhall sha256:3113ce1ed76db6bcf9659492a578df9fda84d50054918046cce7991d59f99de0
+      ./extractors/package.dhall sha256:2d2d6d2320996d4f925e6166b8ccda65698f44cafe46fbb76b7fee1655fa7085
     ? ./extractors/package.dhall
 }
diff --git a/dhall-concourse/render/package.dhall b/dhall-concourse/render/package.dhall
--- a/dhall-concourse/render/package.dhall
+++ b/dhall-concourse/render/package.dhall
@@ -1,11 +1,11 @@
 { job =
-      ./job.dhall sha256:5217065836a89ca47153203adabc99d349599161c8285d5d05f6c1c0f99a4859
+      ./job.dhall sha256:7eca0c1aed9e8dff844a0d621719200a6deb6322bfbeb239bc41048a7dd9c0e8
     ? ./job.dhall
 , jobs =
-      ./jobs.dhall sha256:3bdb0bb378882b0fb44cbd135056e006e43710af3a5f79b769efe0d581c8aba8
+      ./jobs.dhall sha256:b8c66082187c984b1548615eadd05600d881c473e9b765a806d8566928933f7e
     ? ./jobs.dhall
 , step =
-      ./step.dhall sha256:c757012cc0eb2a70123b59ea2c267a965d463e7b81af37834d5c85d3a1a5bfa7
+      ./step.dhall sha256:b034355ac3e8f54fb5be5ddf79855a892745bb4a144db8bb33e3b1f0011fde7f
     ? ./step.dhall
 , resource =
       ./resource.dhall sha256:005e009978277d17d9a71478b1b52d52fd39bc58d51916f835745fe57938956e
@@ -20,9 +20,9 @@
       ./resourceTypes.dhall sha256:ff3410ebad054a9ad069fe5e6cdcdb22dc39c7e05d52804248899c91122121da
     ? ./resourceTypes.dhall
 , pipeline =
-      ./pipeline.dhall sha256:0e1cfa9889565ae06800da328b1b52e2e98b330857081ed44724d193ab206664
+      ./pipeline.dhall sha256:733839e8878e71390663ee22fda86049e92e4717e458740cbacb983e2ec275cb
     ? ./pipeline.dhall
 , groupedJobs =
-      ./groupedJobs.dhall sha256:1786999645ddbe8a085374ec226b86f3befb0990578445279a96d3212b6c6ab7
+      ./groupedJobs.dhall sha256:e21e5543ac6f7ee3d06877cda2a88cf6ba56632f406a0ce84b0a5302ff0378f6
     ? ./groupedJobs.dhall
 }
diff --git a/dhall-concourse/render/setPipelineStep.dhall b/dhall-concourse/render/setPipelineStep.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/render/setPipelineStep.dhall
@@ -0,0 +1,20 @@
+let Types = ../types/package.dhall
+
+let RenderOptional = ./optionals/package.dhall
+
+let JSON = (../lib/prelude.dhall).JSON
+
+let render
+    : Types.SetPipelineStep → Types.JSONObject
+    =   λ(s : Types.SetPipelineStep)
+      → toMap
+          { set_pipeline = JSON.string s.set_pipeline
+          , file = JSON.string s.file
+          , vars = RenderOptional.jsonObject s.vars
+          , var_files = RenderOptional.lists.text s.var_files
+          , tags = RenderOptional.lists.text s.tags
+          , timeout = RenderOptional.text s.timeout
+          , attempts = RenderOptional.natural s.attempts
+          }
+
+in  render
diff --git a/dhall-concourse/render/step.dhall b/dhall-concourse/render/step.dhall
--- a/dhall-concourse/render/step.dhall
+++ b/dhall-concourse/render/step.dhall
@@ -25,6 +25,11 @@
       → λ(hooks : Types.StepHooks JSON.Type)
       → concatJSONs [ ./taskStep.dhall task, ./stepHooks.dhall hooks ]
 
+let renderSetPipeline =
+        λ(s : Types.SetPipelineStep)
+      → λ(hooks : Types.StepHooks JSON.Type)
+      → concatJSONs [ ./setPipelineStep.dhall s, ./stepHooks.dhall hooks ]
+
 let renderAggregate =
         λ(steps : List JSON.Type)
       → λ(hooks : Types.StepHooks JSON.Type)
@@ -54,6 +59,7 @@
           { get = renderGet
           , put = renderPut
           , task = renderTask
+          , set_pipeline = renderSetPipeline
           , aggregate = renderAggregate
           , do = renderDo
           , try = renderTry
diff --git a/dhall-concourse/schemas/SetPipelineStep.dhall b/dhall-concourse/schemas/SetPipelineStep.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/schemas/SetPipelineStep.dhall
@@ -0,0 +1,3 @@
+{ Type = ../types/SetPipelineStep.dhall
+, default = ../defaults/SetPipelineStep.dhall
+}
diff --git a/dhall-concourse/schemas/package.dhall b/dhall-concourse/schemas/package.dhall
--- a/dhall-concourse/schemas/package.dhall
+++ b/dhall-concourse/schemas/package.dhall
@@ -5,7 +5,7 @@
       ./Resource.dhall sha256:329c244c898ea59b34e2ee43b4d9f80a2ef4ceda1d18fcdb1ce9eeca117cfc04
     ? ./Resource.dhall
 , Job =
-      ./Job.dhall sha256:3ba2590e72451a38a1b682be7eb33db63853cbeaaf0c00ba728b23d676e7ae93
+      ./Job.dhall sha256:88ae8c7f60ae9614e933cb9b9d5cab4371fe280ccb5263fc777a2a8cfef9999b
     ? ./Job.dhall
 , GetStep =
       ./GetStep.dhall sha256:0dc6d75285f9908a6b37c21cf5e7b51c64fca19cb1995df9d4769b03791f53d0
@@ -34,4 +34,7 @@
 , PutStep =
       ./PutStep.dhall sha256:a492b698682efc43bdc74ca78358ef84affe33c78da494619e8997c058d0ae20
     ? ./PutStep.dhall
+, SetPipelineStep =
+      ./SetPipelineStep.dhall sha256:0be03696f64c97a4ab5dd342836cc7df535e94246c47dc3bcd6c7fcc6adc0d52
+    ? ./SetPipelineStep.dhall
 }
diff --git a/dhall-concourse/types/SetPipelineStep.dhall b/dhall-concourse/types/SetPipelineStep.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/types/SetPipelineStep.dhall
@@ -0,0 +1,8 @@
+{ set_pipeline : Text
+, file : Text
+, vars : Optional ./JSONObject.dhall
+, var_files : Optional (List Text)
+, tags : Optional (List Text)
+, timeout : Optional Text
+, attempts : Optional Natural
+}
diff --git a/dhall-concourse/types/StepConstructors.dhall b/dhall-concourse/types/StepConstructors.dhall
--- a/dhall-concourse/types/StepConstructors.dhall
+++ b/dhall-concourse/types/StepConstructors.dhall
@@ -4,6 +4,7 @@
     → { get : ./GetStep.dhall → StepHooks Step → Step
       , put : ./PutStep.dhall → StepHooks Step → Step
       , task : ./TaskStep.dhall → StepHooks Step → Step
+      , set_pipeline : ./SetPipelineStep.dhall -> StepHooks Step -> Step
       , aggregate : List Step → StepHooks Step → Step
       , in_parallel : ./InParallelStep.dhall Step → StepHooks Step → Step
       , do : List Step → StepHooks Step → Step
diff --git a/dhall-concourse/types/package.dhall b/dhall-concourse/types/package.dhall
--- a/dhall-concourse/types/package.dhall
+++ b/dhall-concourse/types/package.dhall
@@ -17,7 +17,7 @@
       ./InParallelStep.dhall sha256:92395de51f548251bc0caae8e3aadafba89e4ed6c743ea86c80b4651fa0cd678
     ? ./InParallelStep.dhall
 , Job =
-      ./Job.dhall sha256:43160b9d85391d6bedbfcdcf94dca62d1e6ca208193263683842e50b73c3533b
+      ./Job.dhall sha256:9e4477028b63bede14c381e715cd431415a82ec4202e224b404c29d49355a0dc
     ? ./Job.dhall
 , JobBuildLogRetention =
       ./JobBuildLogRetention.dhall sha256:130df5b466a3822ac49495046e68dc58b46b0366ac31f05520e44949010349b6
@@ -35,10 +35,10 @@
       ./ResourceType.dhall sha256:1a22b92783a4256b1c7d4e8ef1ae56641fce04c81bfd37ed4bba69904c5387ee
     ? ./ResourceType.dhall
 , Step =
-      ./Step.dhall sha256:bf53e03316c2c05527b27b63928d831cdd81dce2e6364fcf053f86b3b6441db4
+      ./Step.dhall sha256:5c81d26cbc5be85ac48b5be409e73ff38b0dcc62d621db226ea62978efb4a8e8
     ? ./Step.dhall
 , StepConstructors =
-      ./StepConstructors.dhall sha256:e5d7da6a39a2afb939a4f5f27ab2e4d7c7db6411c0887dd43ec8503af8f55c2b
+      ./StepConstructors.dhall sha256:78dafdf71dcd01e35a6dc1bef8084da2a2df01845ee7f601dd67e78bf68b890c
     ? ./StepConstructors.dhall
 , StepHooks =
       ./StepHooks.dhall sha256:4894aa205d000a93f04b62b2dbceff77cdf3fcda634bcc2fa6d3777e10c2734a
@@ -71,6 +71,9 @@
       ./TextTextPair.dhall sha256:641845344ce6be001271e0052808b6c8ca10ce5939efefea3560c68c37538454
     ? ./TextTextPair.dhall
 , GroupedJob =
-      ./GroupedJob.dhall sha256:87f4dc5e19cfedd2d5e9c095ac4e417ecaf30d108561abde96258c9b84442361
+      ./GroupedJob.dhall sha256:1a764ce965e5b2b612b771d1850f8657d3f915be9f94ddce6bf5a87a026e7118
     ? ./GroupedJob.dhall
+, SetPipelineStep =
+      ./SetPipelineStep.dhall sha256:2aa66aabecb1b2de52299cf48ba96e17acc19199270f30093fc0d5fcb80ae4d2
+    ? ./SetPipelineStep.dhall
 }
diff --git a/dhall-fly.cabal b/dhall-fly.cabal
--- a/dhall-fly.cabal
+++ b/dhall-fly.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: e04d051736062d08179c44e114d8bc118d4af358af4bc0d5aa26447afeaf61b0
+-- hash: 569dd59e63217c55a18a334d1436e5dc07fa0900c982b1cdc90e61fb84d1c594
 
 name:           dhall-fly
-version:        0.2.4
+version:        0.3.0
 synopsis:       Translate concourse config from Dhall to YAML
 description:    Please see the README on GitHub at <https://github.com/akshaymankar/dhall-fly#readme>
 category:       Concourse, YAML, JSON, Dhall
@@ -29,6 +29,7 @@
     dhall-concourse/defaults/package.dhall
     dhall-concourse/defaults/PutStep.dhall
     dhall-concourse/defaults/Resource.dhall
+    dhall-concourse/defaults/SetPipelineStep.dhall
     dhall-concourse/defaults/StepHooks.dhall
     dhall-concourse/defaults/TaskConfig.dhall
     dhall-concourse/defaults/TaskInput.dhall
@@ -39,6 +40,8 @@
     dhall-concourse/extractors/resourcesFromJobs.dhall
     dhall-concourse/extractors/resourcesTypesFromResources.dhall
     dhall-concourse/helpers/addHooks.dhall
+    dhall-concourse/helpers/addTags.dhall
+    dhall-concourse/helpers/addTagsToResource.dhall
     dhall-concourse/helpers/aggregateStep.dhall
     dhall-concourse/helpers/aggregateWithHooks.dhall
     dhall-concourse/helpers/doStep.dhall
@@ -51,9 +54,13 @@
     dhall-concourse/helpers/package.dhall
     dhall-concourse/helpers/putStep.dhall
     dhall-concourse/helpers/putWithHooks.dhall
+    dhall-concourse/helpers/setPipelineStep.dhall
+    dhall-concourse/helpers/setPipelineStepWithHooks.dhall
     dhall-concourse/helpers/taskStep.dhall
     dhall-concourse/helpers/taskWithHooks.dhall
     dhall-concourse/helpers/translateHooks.dhall
+    dhall-concourse/helpers/translateInParallelStep.dhall
+    dhall-concourse/helpers/translateSteps.dhall
     dhall-concourse/helpers/tryStep.dhall
     dhall-concourse/helpers/tryWithHooks.dhall
     dhall-concourse/lib/prelude.dhall
@@ -85,6 +92,7 @@
     dhall-concourse/render/resources.dhall
     dhall-concourse/render/resourceType.dhall
     dhall-concourse/render/resourceTypes.dhall
+    dhall-concourse/render/setPipelineStep.dhall
     dhall-concourse/render/step.dhall
     dhall-concourse/render/stepHooks.dhall
     dhall-concourse/render/taskCache.dhall
@@ -104,6 +112,7 @@
     dhall-concourse/schemas/package.dhall
     dhall-concourse/schemas/PutStep.dhall
     dhall-concourse/schemas/Resource.dhall
+    dhall-concourse/schemas/SetPipelineStep.dhall
     dhall-concourse/schemas/StepHooks.dhall
     dhall-concourse/schemas/TaskConfig.dhall
     dhall-concourse/schemas/TaskInput.dhall
@@ -125,6 +134,7 @@
     dhall-concourse/types/PutStep.dhall
     dhall-concourse/types/Resource.dhall
     dhall-concourse/types/ResourceType.dhall
+    dhall-concourse/types/SetPipelineStep.dhall
     dhall-concourse/types/Step.dhall
     dhall-concourse/types/StepConstructors.dhall
     dhall-concourse/types/StepHooks.dhall
@@ -143,6 +153,7 @@
     test/data/in-built-resource-type.dhall
     test/data/put.dhall
     test/data/resource.dhall
+    test/data/set-pipeline-step.dhall
     test/data/task-config.dhall
     test/data/task-step.dhall
 
diff --git a/src/Fly/Types.hs b/src/Fly/Types.hs
--- a/src/Fly/Types.hs
+++ b/src/Fly/Types.hs
@@ -210,6 +210,17 @@
           v         -> error ("Expected " ++ show v ++ "to be Object")
       v -> error ("Expected " ++ show v ++ "to be Object")
 
+data SetPipelineStep = SetPipelineStep { spSetPipeline :: Text
+                                       , spFile        :: Text
+                                       , spVars        :: Maybe (HashMap Text Value)
+                                       , spVarFiles   :: Maybe [Text]
+                                       , spTags        :: Maybe [Text]
+                                       , spTimeout     :: Maybe Text
+                                       , spAttempts    :: Maybe Natural
+                                       }
+                     deriving (Show, Generic, Eq)
+                     deriving FromDhall via FromDhallWithPrefix SetPipelineStep
+
 data InParallelStep = InParallelSteps {ipSteps  :: [Step]}
                     | InParallelStepConfig {ipConfig :: InParallelConfig}
                     deriving (Show, Generic, Eq)
@@ -237,6 +248,7 @@
           | Put { stepPut :: PutStep, stepHooks :: StepHooks }
           | Task { stepTask :: TaskStep, stepHooks :: StepHooks }
           | Aggregate { aggregatedSteps :: [Step], stepHooks :: StepHooks }
+          | SetPipeline { stepSetPipeline :: SetPipelineStep, stepHooks :: StepHooks }
           | InParallel { stepInParallel :: InParallelStep, stepHooks :: StepHooks }
           | Do { doSteps :: [Step], stepHooks :: StepHooks  }
           | Try { tryStep :: Step, stepHooks :: StepHooks  }
@@ -249,16 +261,17 @@
              (Lam _ _ --Constructors
               c)) = extractStepFromConstructors c
     extract x = extractStepFromConstructors x -- While recursing, only the constructor applications are available
-    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "get") s) hooks)       = buildStep Get s hooks
-    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "put") s) hooks)       = buildStep Put s hooks
-    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "task") s) hooks)      = buildStep Task s hooks
-    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "aggregate") s) hooks) = buildStep Aggregate s hooks
-    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "do") s) hooks)        = buildStep Do s hooks
-    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "try") s) hooks)       = buildStep Try s hooks
+    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "get") s) hooks)          = buildStep Get s hooks
+    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "put") s) hooks)          = buildStep Put s hooks
+    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "task") s) hooks)         = buildStep Task s hooks
+    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "set_pipeline") s) hooks) = buildStep SetPipeline s hooks
+    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "aggregate") s) hooks)    = buildStep Aggregate s hooks
+    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "do") s) hooks)           = buildStep Do s hooks
+    extractStepFromConstructors (App (App (Field (Var (V _ 0)) "try") s) hooks)          = buildStep Try s hooks
     extractStepFromConstructors (App (App (Field (Var (V _ 0)) "in_parallel")
-                                          (App (Field (Union _) "Steps") s)) hooks)   = buildStep (InParallel . InParallelSteps ) s hooks
+                                          (App (Field (Union _) "Steps") s)) hooks)      = buildStep (InParallel . InParallelSteps ) s hooks
     extractStepFromConstructors (App (App (Field (Var (V _ 0)) "in_parallel")
-                                          (App (Field (Union _) "Config") s)) hooks)  = buildStep (InParallel . InParallelStepConfig ) s hooks
+                                          (App (Field (Union _) "Config") s)) hooks)     = buildStep (InParallel . InParallelStepConfig ) s hooks
     extractStepFromConstructors t = typeError expected t
     buildStep f x y = f <$> Dhall.extract auto x <*> Dhall.extract auto y
 
@@ -273,6 +286,7 @@
   toJSON (Get g h)           = mergeHooks g h
   toJSON (Put p h)           = mergeHooks p h
   toJSON (Task t h)          = mergeHooks t h
+  toJSON (SetPipeline s h)   = mergeHooks s h
   toJSON (Aggregate steps h) = mergeHooks (object ["aggregate" .= steps]) h
   toJSON (Do steps h)        = mergeHooks (object ["do" .= steps]) h
   toJSON (Try step h)        = mergeHooks (object ["try" .= step]) h
@@ -323,6 +337,7 @@
 $(deriveToJSON (aesonPrefix snakeCase) ''TaskOutput)
 $(deriveToJSON (aesonPrefix snakeCase) ''TaskCache)
 $(deriveToJSON (aesonPrefix snakeCase) ''TaskConfig)
+$(deriveToJSON (aesonPrefix snakeCase) ''SetPipelineStep)
 $(deriveToJSON (aesonPrefix snakeCase) ''TaskContainerLimits)
 $(deriveToJSON (aesonPrefix snakeCase) ''InParallelConfig)
 $(deriveToJSON (aesonPrefix snakeCase) ''StepHooks)
diff --git a/src/Fly/Yaml.hs b/src/Fly/Yaml.hs
--- a/src/Fly/Yaml.hs
+++ b/src/Fly/Yaml.hs
@@ -57,6 +57,7 @@
     stepResources (Get GetStep{..} _)   = [getResource]
     stepResources (Put PutStep{..} _)   = [putResource]
     stepResources (Task _ _)            = []
+    stepResources (SetPipeline _ _)     = []
     stepResources (Aggregate steps _)   = getResourcesFromSteps steps
     stepResources (Do steps _)          = getResourcesFromSteps steps
     stepResources (Try step _)          = getResourcesFromStep step
diff --git a/test/Fly/TypesSpec.hs b/test/Fly/TypesSpec.hs
--- a/test/Fly/TypesSpec.hs
+++ b/test/Fly/TypesSpec.hs
@@ -119,6 +119,34 @@
                                             , "vars"          .= Null
                                             , "tags"          .= Null ]
 
+    describe "SetPipelineStep" $ do
+      let testSP = SetPipelineStep{..} where
+            spSetPipeline = "test-pipeline"
+            spFile = "test-file"
+            spVars = Nothing
+            spVarFiles = Nothing
+            spTags = Nothing
+            spTimeout = Nothing
+            spAttempts = Nothing
+
+      describe "Interpret" $ do
+        it "should interpret a set pipeline step" $ do
+          sp <- input auto "./test/data/set-pipeline-step.dhall"
+          sp `shouldBe` testSP
+
+        it "should interpret a set pipeline step as step" $ do
+          sp <- input auto "./dhall-concourse/helpers/setPipelineStep.dhall ./test/data/set-pipeline-step.dhall"
+          sp `shouldBe` SetPipeline testSP (StepHooks Nothing Nothing Nothing Nothing)
+      describe "ToJSON" $ do
+        it "should translate a set pipeline step" $ do
+          toJSON testSP `shouldBe` object [ "set_pipeline" .= "test-pipeline"
+                                          , "file"         .= "test-file"
+                                          , "vars"         .= Null
+                                          , "var_files"    .= Null
+                                          , "attempts"     .= Null
+                                          , "timeout"      .= Null
+                                          , "tags"         .= Null ]
+
 boshDeploymentResourceType :: ResourceType
 boshDeploymentResourceType = ResourceTypeCustom (CustomResourceType{..}) where
   crtName = "bosh-deployment"
diff --git a/test/data/set-pipeline-step.dhall b/test/data/set-pipeline-step.dhall
new file mode 100644
--- /dev/null
+++ b/test/data/set-pipeline-step.dhall
@@ -0,0 +1,6 @@
+let Concourse = ../../dhall-concourse/package.dhall
+
+in  Concourse.schemas.SetPipelineStep::{
+    , set_pipeline = "test-pipeline"
+    , file = "test-file"
+    }
