diff --git a/dhall-concourse/README.md b/dhall-concourse/README.md
--- a/dhall-concourse/README.md
+++ b/dhall-concourse/README.md
@@ -1,9 +1,7 @@
 # Dhall Concourse
 Concourse types and helpers in dhall.
 
-**Note:** A lot of this README is inspired (some of it copied) from the [dhall-kubernetes README](https://github.com/dhall-lang/dhall-kubernetes/blob/master/README.md), so thanks to the authors!
-
-Dhall Concourse provides Dhall bindings for Concourse, so you can generate concourse pipelines from Dhall expressions. This will let you easily typecheck, template and modularize your Concourse pipelines.
+Dhall Concourse provides Dhall bindings for Concourse, so you can generate concourse pipelines from Dhall expressions. This lets the pipelines be easily typechecked, templated and modularized.
 
 ## Why do I need this?
 
@@ -12,19 +10,15 @@
 2. Same set of jobs are required to be run in different environments
 3. Same set of hooks but with slight changes in all jobs. E.g. slack notifications, releasing resources on failure, etc.
 
-Most common way to deal with these have been to use a templating language like erb, but it gets very messy very fast. We can do a lot better.
-
-Dhall solves all of this, being a programming language with builtin templating, all while being non-Turing complete, strongly typed and [strongly normalizing](https://en.wikipedia.org/wiki/Normalization_property_(abstract_rewriting)) (i.e.: reduces everything to a normal form, no matter how much abstraction you build), so saving you from the _"oh-noes-I-made-my-config-in-code-and-now-its-too-abstract"_ nightmare.
-
-For a Dhall Tutorial, see the [readme of the project](https://github.com/dhall-lang/dhall-lang), or the [full tutorial](http://hackage.haskell.org/package/dhall-1.17.0/docs/Dhall-Tutorial.html).
+Most common ways to deal with these have been to use a templating language like erb or tools like spruce. But this gets very messy very fast. We can do a lot better with a typed total language. I'll let [dhall speak for itself](https://dhall-lang.org/).
 
 ## Usage
 
 ### Using dhall-fly
 
-To use dhall-concourse you need to install [dhall-fly](https://github.com/akshaymankar/dhall-fly#installation).
+One way to translate pipelines written in dhall-concourse into yaml is using [dhall-fly](https://github.com/akshaymankar/dhall-fly#installation).
 
-### Using dhall-to-json and jq (Experimental)
+### Using dhall-to-json and jq
 
 #### Jobs without Groups
 
@@ -137,7 +131,47 @@
       jobs
 ```
 
+To notify `dhall-fly` that we'd be passing it a `List Concourse.Types.GroupedJob` instead of `List Concourse.Types.Job`, we have to call it with `--pipeline-type grouped-jobs` like this:
+```
+fly -t <TARGET> set-pipeline -p hello-dhall -c <(dhall-fly --pipeline-type grouped-jobs <example1.dhall)
+```
+
 ### Example 3 (Real World™)
 
+The Cloudfoundry Eirini team was facing issues with templating their pipeline YAMLs. They started converting their spruce/aviator based yaml templating into dhall. The work in progress can be seen in [their CI repo](https://github.com/cloudfoundry-incubator/eirini-ci/blob/47d2f229e33d9fcdb5641cec06fa68a0d82c0bff/pipelines/ci/pipeline.dhall).
 
-We in the Eirini team were facing issues with templating our pipeline YAMLs. Recently, we started converting our spruce/aviator based yaml templating into dhall. The work in progress can be seen in [our CI repo](https://github.com/cloudfoundry-incubator/eirini-ci/blob/47d2f229e33d9fcdb5641cec06fa68a0d82c0bff/pipelines/ci/pipeline.dhall).
+## Why are Steps so complicated?
+
+In concourse, a step can be one of `get`, `put`, `task`, `in_parallel`, `aggregate`, `do` or `try`. The `in_parallel`, `do` and `aggregate` are list of steps, `try` represents one step. This makes definition of the `Step` type recursive, as in to define a `Step` we'd already need definition of a Step. In total languages like dhall, this is a little tricky to do. There is an explanation in [dhall docs about how to do this](https://docs.dhall-lang.org/howtos/How-to-translate-recursive-code-to-Dhall.html). An example of this can be found in dhall prelude's definition of the [JSON Type](https://github.com/dhall-lang/dhall-lang/blob/master/Prelude/JSON/Type)
+
+**But there is more!**: Each step can also have 4 types of `hooks`: `on_failure`, `on_success`, `on_abort` and `ensure`. Each of these is optional and you guessed it, is of type Step.
+
+So, I decided the type definition for `Step` would look like this:
+
+```dhall
+let StepHooks =
+        λ(Step : Type)
+      → { on_failure : Optional Step
+        , on_success : Optional Step
+        , on_abort : Optional Step
+        , ensure : Optional Step
+        }
+
+let StepConstructors =
+        λ(Step : Type)
+      → { get : ./GetStep.dhall → StepHooks Step → Step
+        , put : ./PutStep.dhall → StepHooks Step → Step
+        , task : ./TaskStep.dhall → StepHooks Step → Step
+        , aggregate : List Step → StepHooks Step → Step
+        , in_parallel : ./InParallelStep.dhall → StepHooks Step → Step
+        , do : Step → StepHooks Step → Step
+        , try : Step → StepHooks Step → Step
+        }
+
+in  ∀(Step : Type) → StepConstructors Step → Step
+
+```
+
+The way I read it is, a Step is defined for any type for which one can provide constructors for get, put, task, aggregate, etc.
+
+This is the reason this repository includes helpers to construct steps with or without helpers.
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
@@ -1,26 +1,26 @@
 { CustomResourceType =
-      ./CustomResourceType.dhall sha256:f0d92c575214d4f127c8e6dcb78dea83bee1f29e9bcb4759b7709d002d31cf37
+      ./CustomResourceType.dhall sha256:04fad06eae17a8caf5d010ab3893349c4fdbae762aa2ca51f092a28d1c98e835
     ? ./CustomResourceType.dhall
 , Resource =
-      ./Resource.dhall sha256:ee4a7e9c3bb43c5d015c51b3c63144ac3622976d51adb107eb6f53eae5b7c611
+      ./Resource.dhall sha256:6a42d337edb6bdd591871f41caa350eb67d8b5eab51b06a154b4973ae74b6dde
     ? ./Resource.dhall
 , Job =
-      ./Job.dhall sha256:9bc3aa7c8aaa9aacffdf0f3cb2d88250fbc01a314dd3d49a6945585d6f6fb591
+      ./Job.dhall sha256:0cb9ded91690e80d5411c742575c56b2b3a41c8c0c1ac0267992318e43df00e7
     ? ./Job.dhall
 , GetStep =
-      ./GetStep.dhall sha256:7d630688d5fb2f6a2a6df76509c4c09c2ee3e49b517923085210fe0647dede9b
+      ./GetStep.dhall sha256:cac33657ae7f42c625cbb33de707a5a1681d4b1f23e08c0a05c2cd0b440e7ce8
     ? ./GetStep.dhall
 , ImageResource =
-      ./ImageResource.dhall sha256:b7e80677324979d06a1b41c2ba2f5fbcba88788aa828a9849356dac8ae1b119d
+      ./ImageResource.dhall sha256:3c799b42d5f1da0931bba6f20f009f1fa367a37d295afaba3a1cb844cd356a68
     ? ./ImageResource.dhall
 , StepHooks =
       ./StepHooks.dhall sha256:8458d8a9c42674f3f618152098e57a1345958192acd6c1acc5338c0709dbbc7d
     ? ./StepHooks.dhall
 , TaskStep =
-      ./TaskStep.dhall sha256:31bbdf420318f308ac9c6f39c24515a5b15bed5f562b7625c16a41830e9a38fc
+      ./TaskStep.dhall sha256:d7161c51e6f0f3f5ba818d539dd36381dcfd2956d053eeba57bc17d62552765f
     ? ./TaskStep.dhall
 , TaskConfig =
-      ./TaskConfig.dhall sha256:8dffe9abb5e94cfa317f6b95444111ae51667b3518c044f85f95307a38f5bc9f
+      ./TaskConfig.dhall sha256:7166f420da320ca715e3ab9c65bc1bebb62e8de4eada7368cabddcb8cba2d0a7
     ? ./TaskConfig.dhall
 , TaskInput =
       ./TaskInput.dhall sha256:5e3edf573190543a8f48d4385f47c5e8e01e384baa5c2c593ee16682daea50f2
@@ -32,6 +32,6 @@
       ./TaskRunConfig.dhall sha256:c177d3da26ff0f2efb3fe5b3f44e53e778d8ed42ed7a866d9cb820d234d0a7d0
     ? ./TaskRunConfig.dhall
 , PutStep =
-      ./PutStep.dhall sha256:0ce9032829ec8e204993f577f5c27b408f439677088ef24f4db11c556a64253f
+      ./PutStep.dhall sha256:4c1bbd2b0842d5f6f23dd1178a3f0e734f0b901cb4cfb4adb6e6c9d61cb1a39b
     ? ./PutStep.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,7 +1,7 @@
 { resourcesFromJobs =
-      ./resourcesFromJobs.dhall sha256:8a625908d0d5599b9b52b8800e183f2f1a8ee179ec541dfede9f59e6d2573b6b
+      ./resourcesFromJobs.dhall sha256:ebae6ead8ad17037884f99e10136782cf705f534eba9d41f06ed0d6db6e34ad0
     ? ./resourcesFromJobs.dhall
 , resourceTypesFromResources =
-      ./resourcesTypesFromResources.dhall sha256:4979de9c830538c5af89a8a230d21131a85112c8401471df46ab89055f423476
+      ./resourcesTypesFromResources.dhall sha256:b49098518c53809ff472643c55e94399dfa789f795e77089085dad673404f223
     ? ./resourcesTypesFromResources.dhall
 }
diff --git a/dhall-concourse/helpers/addHooks.dhall b/dhall-concourse/helpers/addHooks.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/addHooks.dhall
@@ -0,0 +1,43 @@
+let Types = ../types/package.dhall
+
+let Step = Types.Step
+
+let StepHooks = Types.StepHooks
+
+let addHooks
+    : Step → StepHooks Step → Step
+    =   λ(theStep : Step)
+      → λ(hooks : StepHooks Step)
+      → theStep
+          Step
+          { get =
+                λ(g : Types.GetStep)
+              → λ(_ : StepHooks Step)
+              → ./getWithHooks.dhall g hooks
+          , put =
+                λ(p : Types.PutStep)
+              → λ(_ : StepHooks Step)
+              → ./putWithHooks.dhall p hooks
+          , task =
+                λ(t : Types.TaskStep)
+              → λ(_ : StepHooks Step)
+              → ./taskWithHooks.dhall t hooks
+          , aggregate =
+                λ(steps : List Step)
+              → λ(_ : StepHooks Step)
+              → ./aggregateWithHooks.dhall steps hooks
+          , in_parallel =
+                λ(steps : Types.InParallelStep Step)
+              → λ(_ : StepHooks Step)
+              → ./inParallelWithHooks.dhall steps hooks
+          , do =
+                λ(steps : List Step)
+              → λ(_ : StepHooks Step)
+              → ./doWithHooks.dhall steps hooks
+          , try =
+                λ(step : Step)
+              → λ(_ : StepHooks Step)
+              → ./tryWithHooks.dhall step hooks
+          }
+
+in  addHooks
diff --git a/dhall-concourse/helpers/aggregateStep.dhall b/dhall-concourse/helpers/aggregateStep.dhall
--- a/dhall-concourse/helpers/aggregateStep.dhall
+++ b/dhall-concourse/helpers/aggregateStep.dhall
@@ -2,20 +2,9 @@
 
 let Defaults = ../defaults/package.dhall
 
-let Prelude = ../lib/prelude.dhall
-
 let aggregateStep
     : List Types.Step → Types.Step
-    =   λ(aggregatedSteps : List Types.Step)
-      → λ(Step : Type)
-      → λ(constructors : Types.StepConstructors Step)
-      → let stepTypeFix =
-              Prelude.List.map
-                Types.Step
-                Step
-                (λ(s : Types.Step) → s Step constructors)
-                aggregatedSteps
-        
-        in  constructors.aggregate stepTypeFix (Defaults.StepHooks Step)
+    =   λ(steps : List Types.Step)
+      → ./aggregateWithHooks.dhall steps (Defaults.StepHooks Types.Step)
 
 in  aggregateStep
diff --git a/dhall-concourse/helpers/aggregateWithHooks.dhall b/dhall-concourse/helpers/aggregateWithHooks.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/aggregateWithHooks.dhall
@@ -0,0 +1,20 @@
+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)
+      )
+    : List Types.Step → Types.StepHooks Types.Step → Types.Step
diff --git a/dhall-concourse/helpers/doStep.dhall b/dhall-concourse/helpers/doStep.dhall
--- a/dhall-concourse/helpers/doStep.dhall
+++ b/dhall-concourse/helpers/doStep.dhall
@@ -2,20 +2,9 @@
 
 let Defaults = ../defaults/package.dhall
 
-let Prelude = ../lib/prelude.dhall
-
 let doStep
     : List Types.Step → Types.Step
     =   λ(steps : List 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 (Defaults.StepHooks Step)
+      → ./doWithHooks.dhall steps (Defaults.StepHooks Types.Step)
 
 in  doStep
diff --git a/dhall-concourse/helpers/doWithHooks.dhall b/dhall-concourse/helpers/doWithHooks.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/doWithHooks.dhall
@@ -0,0 +1,22 @@
+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)
+
+in  doStep
diff --git a/dhall-concourse/helpers/getStep.dhall b/dhall-concourse/helpers/getStep.dhall
--- a/dhall-concourse/helpers/getStep.dhall
+++ b/dhall-concourse/helpers/getStep.dhall
@@ -3,8 +3,6 @@
 let Defaults = ../defaults/package.dhall
 
 in    (   λ(getStep : Types.GetStep)
-        → λ(Step : Type)
-        → λ(constructors : Types.StepConstructors Step)
-        → constructors.get getStep (Defaults.StepHooks Step)
+        → ./getWithHooks.dhall getStep (Defaults.StepHooks Types.Step)
       )
     : Types.GetStep → Types.Step
diff --git a/dhall-concourse/helpers/getWithHooks.dhall b/dhall-concourse/helpers/getWithHooks.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/getWithHooks.dhall
@@ -0,0 +1,15 @@
+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)
+      )
+    : Types.GetStep → Types.StepHooks Types.Step → Types.Step
diff --git a/dhall-concourse/helpers/inParallelStep.dhall b/dhall-concourse/helpers/inParallelStep.dhall
--- a/dhall-concourse/helpers/inParallelStep.dhall
+++ b/dhall-concourse/helpers/inParallelStep.dhall
@@ -2,40 +2,11 @@
 
 let Defaults = ../defaults/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 inParallelStep
     : Types.InParallelStep Types.Step → Types.Step
     =   λ(parallelSteps : Types.InParallelStep Types.Step)
-      → λ(Step : Type)
-      → λ(constructors : Types.StepConstructors Step)
-      → let stepTypeFix = typeFix Step constructors parallelSteps
-        
-        in  constructors.in_parallel stepTypeFix (Defaults.StepHooks Step)
+      → ./inParallelWithHooks.dhall
+          parallelSteps
+          (Defaults.StepHooks Types.Step)
 
 in  inParallelStep
diff --git a/dhall-concourse/helpers/inParallelWithHooks.dhall b/dhall-concourse/helpers/inParallelWithHooks.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/inParallelWithHooks.dhall
@@ -0,0 +1,42 @@
+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)
+
+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,25 +1,46 @@
 { taskStep =
-      ./taskStep.dhall sha256:f7c597fd8d12cb09915aa2f69197425b70cdd02228f60204fc1fb6ebd7752ba8
+      ./taskStep.dhall sha256:70d9bca82912ffc2d670952657d8f54f5090ab7a1b3d87f136104bee11537359
     ? ./taskStep.dhall
 , putStep =
-      ./putStep.dhall sha256:2acca50d8b5ddc509ecbe9f5e5cb3cb1c7b16afcafc3be19832dc83277c7ba29
+      ./putStep.dhall sha256:36cf1f3065db932e5cd52bc564b9ce0a4236a6713277dacb11119d497ff77196
     ? ./putStep.dhall
 , getStep =
-      ./getStep.dhall sha256:6450e6470d5d5c0874ace985cd7fc6e68c30c6b2ee96627e407709bac3d444c5
+      ./getStep.dhall sha256:7fa4a6cc1b49f64d6420d1ba0de9cfac09f0f78fac782644043d99d59ad00ed1
     ? ./getStep.dhall
 , aggregateStep =
-      ./aggregateStep.dhall sha256:627ed574a25f46d86ce17dcac7a9a1d3a7091d99615420933357c241a575274a
+      ./aggregateStep.dhall sha256:4c63bc1b4c97b7a7496644ac35a848bce4673ae929ac7bce016d269a1df1d61c
     ? ./aggregateStep.dhall
 , inParallelStep =
-      ./inParallelStep.dhall sha256:4b06b441eef8f7596882276125c956ac371f544d9d162de118bd8909fc483103
+      ./inParallelStep.dhall sha256:16810a83749f2373df22b263004c7f462bbe744089cdba5749e241555339e2ec
     ? ./inParallelStep.dhall
 , inParallelStepSimple =
-      ./inParallelStepSimple.dhall sha256:f2163a83a674d4dcffa87d15743a071624b17c6709fe467e67e432e527de97c2
+      ./inParallelStepSimple.dhall sha256:70d3023fb015584b5ed0d439e0a0aaa8cef6802733d85256cf571a8fbd5da8fd
     ? ./inParallelStepSimple.dhall
 , doStep =
-      ./doStep.dhall sha256:644a08ced3e2bfd7d7ceb929e5067d3a73add378f7b07a6740b5791a791933b9
+      ./doStep.dhall sha256:8db65241db7e62a1eb2ba241c61491ca964f438dfc74708f696ec2475fb65b08
     ? ./doStep.dhall
 , tryStep =
-      ./tryStep.dhall sha256:29da9af3ac4f2a0eb01e606f74f26955f2026b37dac45e6d94bb8b3c63d56973
+      ./tryStep.dhall sha256:54675d2eef37e557d8208d86dd76162b9fd7d97e7c24b7f249ca20e9b39319eb
     ? ./tryStep.dhall
+, getWithHooks =
+      ./getWithHooks.dhall sha256:955df86d3c2e47cc8ad716753daa601ab480e517ef95d5cc254e81bff26830f4
+    ? ./getWithHooks.dhall
+, putWithHooks =
+      ./putWithHooks.dhall sha256:f371b5557998a9c6c8cc62931e5ed0f71f47e2446c61a66e06911d1c5b2890b5
+    ? ./putWithHooks.dhall
+, taskWithHooks =
+      ./taskWithHooks.dhall sha256:315fee6fb1194a7e9d65046f6c9b411b50ba5cc4648ce4ae83a90907aaac7b61
+    ? ./taskWithHooks.dhall
+, inParallelWithHooks =
+      ./inParallelWithHooks.dhall sha256:165993bc29b1e5f1aa9b9be629b5ce443626cc1a481ff1af3a301ed492da0180
+    ? ./inParallelWithHooks.dhall
+, aggregateWithHooks =
+      ./aggregateWithHooks.dhall sha256:d1aa9c681ad69025596b888acc95ce81d1c5599de38441190499a19420e842a2
+    ? ./aggregateWithHooks.dhall
+, doWithHooks =
+      ./doWithHooks.dhall sha256:540a12579021f3b597f34d7929f4e9686d66274ad542173e8334a2236b748e7c
+    ? ./doWithHooks.dhall
+, tryWithHooks =
+      ./tryWithHooks.dhall sha256:b1808275879f924e73fd9c12393f04a9563c8f1a74743f5ac125d9849b912b0d
+    ? ./tryWithHooks.dhall
 }
diff --git a/dhall-concourse/helpers/putStep.dhall b/dhall-concourse/helpers/putStep.dhall
--- a/dhall-concourse/helpers/putStep.dhall
+++ b/dhall-concourse/helpers/putStep.dhall
@@ -5,8 +5,6 @@
 let putStep
     : Types.PutStep → Types.Step
     =   λ(putStep : Types.PutStep)
-      → λ(Step : Type)
-      → λ(constructors : Types.StepConstructors Step)
-      → constructors.put putStep (Defaults.StepHooks Step)
+      → ./putWithHooks.dhall putStep (Defaults.StepHooks Types.Step)
 
 in  putStep
diff --git a/dhall-concourse/helpers/putWithHooks.dhall b/dhall-concourse/helpers/putWithHooks.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/putWithHooks.dhall
@@ -0,0 +1,11 @@
+let Types = ../types/package.dhall
+
+in    (   λ(putStep : Types.PutStep)
+        → λ(hooks : Types.StepHooks Types.Step)
+        → λ(Step : Type)
+        → λ(constructors : Types.StepConstructors Step)
+        → constructors.put
+            putStep
+            (./translateHooks.dhall hooks Step constructors)
+      )
+    : Types.PutStep → Types.StepHooks Types.Step → Types.Step
diff --git a/dhall-concourse/helpers/taskStep.dhall b/dhall-concourse/helpers/taskStep.dhall
--- a/dhall-concourse/helpers/taskStep.dhall
+++ b/dhall-concourse/helpers/taskStep.dhall
@@ -5,8 +5,6 @@
 let taskStep
     : Types.TaskStep → Types.Step
     =   λ(taskStep : Types.TaskStep)
-      → λ(Step : Type)
-      → λ(constructors : Types.StepConstructors Step)
-      → constructors.task taskStep (Defaults.StepHooks Step)
+      → ./taskWithHooks.dhall taskStep (Defaults.StepHooks Types.Step)
 
 in  taskStep
diff --git a/dhall-concourse/helpers/taskWithHooks.dhall b/dhall-concourse/helpers/taskWithHooks.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/taskWithHooks.dhall
@@ -0,0 +1,11 @@
+let Types = ../types/package.dhall
+
+in    (   λ(taskStep : Types.TaskStep)
+        → λ(hooks : Types.StepHooks Types.Step)
+        → λ(Step : Type)
+        → λ(constructors : Types.StepConstructors Step)
+        → constructors.task
+            taskStep
+            (./translateHooks.dhall hooks Step constructors)
+      )
+    : Types.TaskStep → Types.StepHooks Types.Step → Types.Step
diff --git a/dhall-concourse/helpers/translateHooks.dhall b/dhall-concourse/helpers/translateHooks.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/translateHooks.dhall
@@ -0,0 +1,25 @@
+let Types = ../types/package.dhall
+
+let Prelude = ../lib/prelude.dhall
+
+let translateHooks
+    :   Types.StepHooks Types.Step
+      → ∀(S : Type)
+      → Types.StepConstructors S
+      → Types.StepHooks S
+    =   λ(hooks : Types.StepHooks Types.Step)
+      → λ(S : Type)
+      → λ(constructors : Types.StepConstructors S)
+      → let translateOptionalStep =
+              Prelude.Optional.map
+                Types.Step
+                S
+                (λ(s : Types.Step) → s S constructors)
+
+        in  { on_failure = translateOptionalStep hooks.on_failure
+            , on_success = translateOptionalStep hooks.on_success
+            , on_abort = translateOptionalStep hooks.on_abort
+            , ensure = translateOptionalStep hooks.ensure
+            }
+
+in  translateHooks
diff --git a/dhall-concourse/helpers/tryStep.dhall b/dhall-concourse/helpers/tryStep.dhall
--- a/dhall-concourse/helpers/tryStep.dhall
+++ b/dhall-concourse/helpers/tryStep.dhall
@@ -5,10 +5,6 @@
 let tryStep
     : Types.Step → Types.Step
     =   λ(step : Types.Step)
-      → λ(Step : Type)
-      → λ(constructors : Types.StepConstructors Step)
-      → let stepTypeFix = step Step constructors
-        
-        in  constructors.try stepTypeFix (Defaults.StepHooks Step)
+      → ./tryWithHooks.dhall step (Defaults.StepHooks Types.Step)
 
 in  tryStep
diff --git a/dhall-concourse/helpers/tryWithHooks.dhall b/dhall-concourse/helpers/tryWithHooks.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/helpers/tryWithHooks.dhall
@@ -0,0 +1,15 @@
+let Types = ../types/package.dhall
+
+let tryStep
+    : Types.Step → Types.StepHooks Types.Step → Types.Step
+    =   λ(step : Types.Step)
+      → λ(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)
+
+in  tryStep
diff --git a/dhall-concourse/lib/prelude.dhall b/dhall-concourse/lib/prelude.dhall
--- a/dhall-concourse/lib/prelude.dhall
+++ b/dhall-concourse/lib/prelude.dhall
@@ -1,2 +1,2 @@
-  https://prelude.dhall-lang.org/v11.1.0/package.dhall sha256:99462c205117931c0919f155a6046aec140c70fb8876d208c7c77027ab19c2fa
-? https://prelude.dhall-lang.org/v11.1.0/package.dhall
+  https://prelude.dhall-lang.org/v13.0.0/package.dhall sha256:4aa8581954f7734d09b7b21fddbf5d8df901a44b54b4ef26ea71db92de0b1a12
+? https://prelude.dhall-lang.org/v13.0.0/package.dhall
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:4576b3998000a9e15b5e569913a36dcdee8607470d94e6b37f6d12e725588e51
+      ./types/package.dhall sha256:35d21e500af502817cf25857447ac8e847261b76055f2c23b43f76a6a953db0c
     ? ./types/package.dhall
 , defaults =
-      ./defaults/package.dhall sha256:f4cc4d0a87f5a474de645f4ec8320aa055fa391d2a97696acba2814b8f594eb8
+      ./defaults/package.dhall sha256:15e958705784a9fcb3c7637dac50ccf74be318db1ffc771af4d7ee9b5a3f2906
     ? ./defaults/package.dhall
 , schemas =
-      ./schemas/package.dhall sha256:6a1466287aa08d3911f9b07357079dfb58740747d66510367ad17290be695e6f
+      ./schemas/package.dhall sha256:bf3838a202e3d5d7f5b764229b069423ec54d2c6a8ea1658a1036ad855750bbd
     ? ./schemas/package.dhall
 , helpers =
-      ./helpers/package.dhall sha256:94d9aab795fe7049da8c7904d6faa7c7be60ed10a59565c33d7cf9d026a6968d
+      ./helpers/package.dhall sha256:334d50f7b6248b79c2d9c944d49dd60cb5ccd6e2812f42a83d4282eb6cf9a299
     ? ./helpers/package.dhall
 , render =
-      ./render/package.dhall sha256:380eab61bcc75473589242aa13011d0912f0634745f84c185296594c557bacb7
+      ./render/package.dhall sha256:102ffaeffabf83db684c6c1ee9c30023ad080aea4a776328f6fd7d3a8d4b1309
     ? ./render/package.dhall
 , extractors =
-      ./extractors/package.dhall sha256:761aabbb030ca0fca473273e7c8b45c29dcd848388bdb767db7322a1243a5dd6
+      ./extractors/package.dhall sha256:3113ce1ed76db6bcf9659492a578df9fda84d50054918046cce7991d59f99de0
     ? ./extractors/package.dhall
 }
diff --git a/dhall-concourse/render/optionals/lists/package.dhall b/dhall-concourse/render/optionals/lists/package.dhall
--- a/dhall-concourse/render/optionals/lists/package.dhall
+++ b/dhall-concourse/render/optionals/lists/package.dhall
@@ -1,11 +1,11 @@
 let Prelude =
-        ../../../lib/prelude.dhall sha256:99462c205117931c0919f155a6046aec140c70fb8876d208c7c77027ab19c2fa
+        ../../../lib/prelude.dhall sha256:4aa8581954f7734d09b7b21fddbf5d8df901a44b54b4ef26ea71db92de0b1a12
       ? ../../../lib/prelude.dhall
 
 let JSON = Prelude.JSON
 
 let generic =
-        ./generic.dhall sha256:e6fe28f437ac7fc2b574381ac2935273e923643d22947ddba14d941d9879955c
+        ./generic.dhall sha256:3be094cbf1079f18bb0ee0fe8421fd19c6b3f3fdc9283c3c83345059694f92d8
       ? ./generic.dhall
 
 in  { generic = generic, text = generic Text JSON.string }
diff --git a/dhall-concourse/render/optionals/package.dhall b/dhall-concourse/render/optionals/package.dhall
--- a/dhall-concourse/render/optionals/package.dhall
+++ b/dhall-concourse/render/optionals/package.dhall
@@ -1,30 +1,29 @@
 let generic =
-        ./generic.dhall sha256:e87b80b1ddea0190e04f34886ec715b8248fdfd87d0f52b2d98c9db8c9bfa58e
+        ./generic.dhall sha256:f0bf057dec1bcaa47a86182b37add42c18e7ac38efd7f777e202df0997cc0903
       ? ./generic.dhall
 
 let Prelude =
-        ../../lib/prelude.dhall sha256:99462c205117931c0919f155a6046aec140c70fb8876d208c7c77027ab19c2fa
+        ../../lib/prelude.dhall sha256:4aa8581954f7734d09b7b21fddbf5d8df901a44b54b4ef26ea71db92de0b1a12
       ? ../../lib/prelude.dhall
 
 let JSON = Prelude.JSON
 
-in  { generic =
-        generic
+in  { generic = generic
     , bool = generic Bool JSON.bool
     , jsonObject =
-          ./json-object.dhall sha256:a716dcfe232f9281dba641ec8667f649cd66ecfb49adc0d606f2c141b6806a7b
+          ./json-object.dhall sha256:c9530c776a00fef501f37aea4c117aa27073bfcdfe5c044f9377f93b88c002fa
         ? ./json-object.dhall
     , text = generic Text JSON.string
     , natural =
-          ./natural.dhall sha256:d905b04cbe71416d5792ce04f107e7ceadebb5ff6bb3170bebd2766cc3783e5a
+          ./natural.dhall sha256:94a91a6a10a0b55015168627142877815bb829f04c035d3b8826f86a93fa6013
         ? ./natural.dhall
     , lists =
-          ./lists/package.dhall sha256:ea18f4a4c82d3876a94db607d4afdc86342cace7368401c8911c0e3cb2ffc4b7
+          ./lists/package.dhall sha256:2ace5884bab544aeb6e1030decd9e0eb29254641d3fee63a65cbb3255b0d0baa
         ? ./lists/package.dhall
     , textTextMap =
-          ./text-text-map.dhall sha256:ee10a9fce1cf002a2ee6c6ca395e274d7e877ee7365646d927c8bb9f6181249b
+          ./text-text-map.dhall sha256:db2fed5b6db90cfa183753955db4b0ca66896475c481efe2a453c3eeec337d61
         ? ./text-text-map.dhall
     , textOptionalJSONMap =
-          ./text-optional-json-map.dhall sha256:537bb2f57868dd144aa4c8b68de775557d235b87af4b03b40b8d9ce02f7d2a3b
+          ./text-optional-json-map.dhall sha256:05db15bd5a5aba05e555cbd7fae501804857d77d48e3368e0999e1ff90ba1a04
         ? ./text-optional-json-map.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,28 +1,28 @@
 { job =
-      ./job.dhall sha256:87b1bddbee9fbad497e8e5f8fa900bdbb05f8a1b7741f04745ce89f2310a2301
+      ./job.dhall sha256:5217065836a89ca47153203adabc99d349599161c8285d5d05f6c1c0f99a4859
     ? ./job.dhall
 , jobs =
-      ./jobs.dhall sha256:82c5d958835b112234e985aff019e51b96c301cf93cd0e6767a48fb6663ca3aa
+      ./jobs.dhall sha256:3bdb0bb378882b0fb44cbd135056e006e43710af3a5f79b769efe0d581c8aba8
     ? ./jobs.dhall
 , step =
-      ./step.dhall sha256:1f0320dab15822eed2bc394d912a26ef2ed950afcb5b6ece2dd16202fce91c1e
+      ./step.dhall sha256:c757012cc0eb2a70123b59ea2c267a965d463e7b81af37834d5c85d3a1a5bfa7
     ? ./step.dhall
 , resource =
-      ./resource.dhall sha256:24287125309ae12501bc6e6d12b6a11a4b68ae1a77fd3f8b3fde5392e349f5be
+      ./resource.dhall sha256:005e009978277d17d9a71478b1b52d52fd39bc58d51916f835745fe57938956e
     ? ./resource.dhall
 , resources =
-      ./resources.dhall sha256:4ed6a34a4cccc01540e57ba1b495f374df5341ad3f62450ee9fad0e732a2e1cc
+      ./resources.dhall sha256:b2a9cd0f9da9000d425a5c9af97ceb15a433c605a47d4e2b2a71fddefea2bda0
     ? ./resources.dhall
 , resourceType =
-      ./resourceType.dhall sha256:f3e6205fae63b9d9aa88459cac3b72a1bb5881c501f3117aca391f76016fe300
+      ./resourceType.dhall sha256:94440ff8e328819a734520336c10c96232cebc08ca5ea778e77ad8f051cee63e
     ? ./resourceType.dhall
 , resourceTypes =
-      ./resourceTypes.dhall sha256:ef42b1e7ee294c054380a51c432680a8a573ef85bc2d872a312282770055f3f4
+      ./resourceTypes.dhall sha256:ff3410ebad054a9ad069fe5e6cdcdb22dc39c7e05d52804248899c91122121da
     ? ./resourceTypes.dhall
 , pipeline =
-      ./pipeline.dhall sha256:d66fb1637db9cf4680213b2b6939a5d5cff64b2f4e5d4e24444d49d40f92853e
+      ./pipeline.dhall sha256:0e1cfa9889565ae06800da328b1b52e2e98b330857081ed44724d193ab206664
     ? ./pipeline.dhall
 , groupedJobs =
-      ./groupedJobs.dhall sha256:9d56b1f88ec737fa02cd8eddc5fa239fd89cb6c509130ea83295899c2ac49c26
+      ./groupedJobs.dhall sha256:1786999645ddbe8a085374ec226b86f3befb0990578445279a96d3212b6c6ab7
     ? ./groupedJobs.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
@@ -1,26 +1,26 @@
 { CustomResourceType =
-      ./CustomResourceType.dhall sha256:50318d0495c2d26d3d740ad9e4b49d8c10cade82b1c1d0d8d4ee3ede97bdcb58
+      ./CustomResourceType.dhall sha256:d819d46795446b25760d8086d8d08a56cf38e34c1ef376fec841074cf4c27ace
     ? ./CustomResourceType.dhall
 , Resource =
-      ./Resource.dhall sha256:debaad639d7d6a81f88ed0b5d6edea14858baf5b0cb6edf5bf26031807b7b580
+      ./Resource.dhall sha256:329c244c898ea59b34e2ee43b4d9f80a2ef4ceda1d18fcdb1ce9eeca117cfc04
     ? ./Resource.dhall
 , Job =
-      ./Job.dhall sha256:7f8ba5824cfab95e6afae4f3fc13173addeb019097e3973b75533b9524d888ea
+      ./Job.dhall sha256:3ba2590e72451a38a1b682be7eb33db63853cbeaaf0c00ba728b23d676e7ae93
     ? ./Job.dhall
 , GetStep =
-      ./GetStep.dhall sha256:4ca1616e51450d41120c1a0ba213f523202371c7ec838fb2d6917dc5d79aad6b
+      ./GetStep.dhall sha256:0dc6d75285f9908a6b37c21cf5e7b51c64fca19cb1995df9d4769b03791f53d0
     ? ./GetStep.dhall
 , ImageResource =
-      ./ImageResource.dhall sha256:810b19dad32928f1bb6d1a4909103d453b6794adfd670e032de57ceb505a5c04
+      ./ImageResource.dhall sha256:5e78153fdd3275d91f80781a02c614c8ecfe79e347fe9ec00ad2148b1bf8175d
     ? ./ImageResource.dhall
 , StepHooks =
       ./StepHooks.dhall sha256:a1bb15b4b98805ba74cef905565b64baa4ce8a42a99bb12f4811816158d35531
     ? ./StepHooks.dhall
 , TaskStep =
-      ./TaskStep.dhall sha256:a5a00b46ec4eb333ac1451e53b6d710d286d662e771aa83d777dccbb6837f1cd
+      ./TaskStep.dhall sha256:ce87a8a6a3cc53fe58c050280e5dc6df23434cd2e12f87505175eeadc6b47881
     ? ./TaskStep.dhall
 , TaskConfig =
-      ./TaskConfig.dhall sha256:2e8c1033841a4206dbd60b4a7cea9d46f325af98f2dfb39b4a909415beb23d8b
+      ./TaskConfig.dhall sha256:0c892a153f2a05c36e0c86ef1fb5f1fc92169029331e49a87b948b317f9874a4
     ? ./TaskConfig.dhall
 , TaskInput =
       ./TaskInput.dhall sha256:754c52fb8a8e6bb1b06fc764685643820f843ad4bb9ba79b06e6bbdbcec8b205
@@ -32,6 +32,6 @@
       ./TaskRunConfig.dhall sha256:1c2a1df1e39fa3c4c401cec7bf642649f2eb623d5999929000226cded037b045
     ? ./TaskRunConfig.dhall
 , PutStep =
-      ./PutStep.dhall sha256:ed389e969476d75c926265aeb2e2901c30820ba20adbeca925472af95207f925
+      ./PutStep.dhall sha256:a492b698682efc43bdc74ca78358ef84affe33c78da494619e8997c058d0ae20
     ? ./PutStep.dhall
 }
diff --git a/dhall-concourse/scripts/freeze-package-dhalls.sh b/dhall-concourse/scripts/freeze-package-dhalls.sh
new file mode 100644
--- /dev/null
+++ b/dhall-concourse/scripts/freeze-package-dhalls.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+ROOT_DIR=$(cd "$(dirname "$0")/.."; pwd -P)
+
+find "$ROOT_DIR/lib" -name '*.dhall' | xargs -n 1 dhall freeze --cache --all --inplace
+
+# The order is important because they depend on each other.
+# A tree would be ideal, but it is bash ¯\_(ツ)_/¯
+# TODO: Automatically figure this out
+package_files=(types/package.dhall
+               defaults/package.dhall
+               schemas/package.dhall
+               extractors/package.dhall
+               helpers/package.dhall
+               render/optionals/lists/package.dhall
+               render/optionals/package.dhall
+               render/package.dhall
+               package.dhall
+              )
+
+for f in "${package_files[@]}"; do
+    echo "Freezing $f"
+    dhall freeze --cache --all --inplace "$ROOT_DIR/$f"
+done
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
@@ -1,14 +1,14 @@
 { CustomResourceType =
-      ./CustomResourceType.dhall sha256:38b2589726851995ee62762de23344cd5eefad1541643835456564e1d03cc7d1
+      ./CustomResourceType.dhall sha256:2cc49eecb6622bbb4526f2218d7a56f612aa15e404fed9fc65c1516d01bca59f
     ? ./CustomResourceType.dhall
 , GetStep =
-      ./GetStep.dhall sha256:83950c8fa16da1151fed433aac40309d4e80b796767cefbea489c1f43b091e7b
+      ./GetStep.dhall sha256:9628a73de60835d741e78f4f506a84ddf15a5e76fdbe9cecde495cc6bbabea7e
     ? ./GetStep.dhall
 , GetVersion =
       ./GetVersion.dhall sha256:cd79d8dea7662306078754278d9351a80d49ef71d64f3c37a01b9e1da69c3194
     ? ./GetVersion.dhall
 , ImageResource =
-      ./ImageResource.dhall sha256:ed9b1a485ed6c8b7ac1cf81c42125b8a6d1e5a12bfabc51c11a64abb327f8f8c
+      ./ImageResource.dhall sha256:7f5ece3721156a8c5a9221dd22cf81d2cfe4c6c130ea48c507775ae17e8d374a
     ? ./ImageResource.dhall
 , InParallelConfig =
       ./InParallelConfig.dhall sha256:020d595b34b31147883a2b846ddc53ca8c898f11b4ea0b01f6c5c6e25ff718fb
@@ -17,34 +17,34 @@
       ./InParallelStep.dhall sha256:92395de51f548251bc0caae8e3aadafba89e4ed6c743ea86c80b4651fa0cd678
     ? ./InParallelStep.dhall
 , Job =
-      ./Job.dhall sha256:218e1f17265e0bad39f094d24ccc4976bec4621d6255b66a7190deba20f43d6e
+      ./Job.dhall sha256:43160b9d85391d6bedbfcdcf94dca62d1e6ca208193263683842e50b73c3533b
     ? ./Job.dhall
 , JobBuildLogRetention =
       ./JobBuildLogRetention.dhall sha256:130df5b466a3822ac49495046e68dc58b46b0366ac31f05520e44949010349b6
     ? ./JobBuildLogRetention.dhall
 , JSONObject =
-      ./JSONObject.dhall sha256:dbfb548d60ec6b2a0fe3e43d1bf94bf4e9675a02656b813a2a2e0f43816f81ba
+      ./JSONObject.dhall sha256:5711bbc5ff3a95e82b5526ff50f22aec8ffc510034c384570a6e3f761e9f7686
     ? ./JSONObject.dhall
 , PutStep =
-      ./PutStep.dhall sha256:df4a0d60791b0cc1e05281c9a8e55c68a3ec470f277078e09dac2067e718fb29
+      ./PutStep.dhall sha256:4e5c23d84b301cbbc4cbc148d4c57eef72575161e918d9f83ef30283a4d5b40d
     ? ./PutStep.dhall
 , Resource =
-      ./Resource.dhall sha256:6ce8e29712c4260b1ec7caa83eb9ef2be71ef5878d3d309ce99ab1004cde2e32
+      ./Resource.dhall sha256:b72393320aedd11dd53469ca242bf0c1f13082c0b643a1eeee0a750da9ce216e
     ? ./Resource.dhall
 , ResourceType =
-      ./ResourceType.dhall sha256:0daa7a033cfc34de4cc0fd44581f37506bb0bd0b478be10a21aeb05f98610392
+      ./ResourceType.dhall sha256:1a22b92783a4256b1c7d4e8ef1ae56641fce04c81bfd37ed4bba69904c5387ee
     ? ./ResourceType.dhall
 , Step =
-      ./Step.dhall sha256:3476bbdb663cf72c72ccec357376f39ba8fad8280a3da35af9913dd98e314b94
+      ./Step.dhall sha256:bf53e03316c2c05527b27b63928d831cdd81dce2e6364fcf053f86b3b6441db4
     ? ./Step.dhall
 , StepConstructors =
-      ./StepConstructors.dhall sha256:8e638e4e72d245d7ecddec74f5ecf4eebf20c2a6ea9125d8a9e0fb7f1dd15138
+      ./StepConstructors.dhall sha256:e5d7da6a39a2afb939a4f5f27ab2e4d7c7db6411c0887dd43ec8503af8f55c2b
     ? ./StepConstructors.dhall
 , StepHooks =
       ./StepHooks.dhall sha256:4894aa205d000a93f04b62b2dbceff77cdf3fcda634bcc2fa6d3777e10c2734a
     ? ./StepHooks.dhall
 , TaskConfig =
-      ./TaskConfig.dhall sha256:f2b2316b1f28912032630a9fed542ce0a00761edfbc33e3ea78a380ddc6b4eba
+      ./TaskConfig.dhall sha256:58eb1b8b5b387fe87850eab212447789270fb6dc01a545fa762f8e0ec464b32b
     ? ./TaskConfig.dhall
 , TaskInput =
       ./TaskInput.dhall sha256:1d2673731453da3d08fdf28e121be928603069720470ea8c9d75040e90bcf925
@@ -62,15 +62,15 @@
       ./TaskRunConfig.dhall sha256:ac211950cd1c3aa3580ce3e9efec30cb987b31ad7a63b34db47d332a22c43b48
     ? ./TaskRunConfig.dhall
 , TaskStep =
-      ./TaskStep.dhall sha256:24d9b5afb1f9ec6374432f1d54fdd1ab1532d967bc1f4a32f1cca5efa98aa0eb
+      ./TaskStep.dhall sha256:8524666c099d881c317f70789b2a530bbf41a6ea8699049c2be3fa731dd80fe0
     ? ./TaskStep.dhall
 , TaskSpec =
-      ./TaskSpec.dhall sha256:abf13fba189dda70af996bc2aa530c49cfd6004e8b591a3b52e67dc3ed483725
+      ./TaskSpec.dhall sha256:e4b3960bc687e6ddbdd73e9931199da54bdede7f2d56a11cde2ebb2a93ca67c9
     ? ./TaskSpec.dhall
 , TextTextPair =
       ./TextTextPair.dhall sha256:641845344ce6be001271e0052808b6c8ca10ce5939efefea3560c68c37538454
     ? ./TextTextPair.dhall
 , GroupedJob =
-      ./GroupedJob.dhall sha256:85073c70ee204dc1be2fc6eae2639315b17f8737a36dc649677d137e4c583678
+      ./GroupedJob.dhall sha256:87f4dc5e19cfedd2d5e9c095ac4e417ecaf30d108561abde96258c9b84442361
     ? ./GroupedJob.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: b2ed122d2d0c3bbf57e02626a3e27ac9a0cc2145beb95e39423516100b1d656a
+-- hash: 796db80d90b2e5d0ef8ef31fa5ee5fed49e406609c5b50b3e30b9adee7cda59c
 
 name:           dhall-fly
-version:        0.2.2
+version:        0.2.3
 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
@@ -38,15 +38,24 @@
     dhall-concourse/extractors/package.dhall
     dhall-concourse/extractors/resourcesFromJobs.dhall
     dhall-concourse/extractors/resourcesTypesFromResources.dhall
+    dhall-concourse/helpers/addHooks.dhall
     dhall-concourse/helpers/aggregateStep.dhall
+    dhall-concourse/helpers/aggregateWithHooks.dhall
     dhall-concourse/helpers/doStep.dhall
+    dhall-concourse/helpers/doWithHooks.dhall
     dhall-concourse/helpers/getStep.dhall
+    dhall-concourse/helpers/getWithHooks.dhall
     dhall-concourse/helpers/inParallelStep.dhall
     dhall-concourse/helpers/inParallelStepSimple.dhall
+    dhall-concourse/helpers/inParallelWithHooks.dhall
     dhall-concourse/helpers/package.dhall
     dhall-concourse/helpers/putStep.dhall
+    dhall-concourse/helpers/putWithHooks.dhall
     dhall-concourse/helpers/taskStep.dhall
+    dhall-concourse/helpers/taskWithHooks.dhall
+    dhall-concourse/helpers/translateHooks.dhall
     dhall-concourse/helpers/tryStep.dhall
+    dhall-concourse/helpers/tryWithHooks.dhall
     dhall-concourse/lib/prelude.dhall
     dhall-concourse/package.dhall
     dhall-concourse/README.md
@@ -101,6 +110,7 @@
     dhall-concourse/schemas/TaskOutput.dhall
     dhall-concourse/schemas/TaskRunConfig.dhall
     dhall-concourse/schemas/TaskStep.dhall
+    dhall-concourse/scripts/freeze-package-dhalls.sh
     dhall-concourse/types/CustomResourceType.dhall
     dhall-concourse/types/GetStep.dhall
     dhall-concourse/types/GetVersion.dhall
@@ -157,8 +167,8 @@
       aeson >=1.4.5.0
     , aeson-casing >=0.2.0.0
     , base >=4.7 && <5
-    , dhall >=1.28.0 && <1.29
-    , optparse-applicative
+    , dhall >=1.29.0 && <1.30
+    , optparse-applicative >=0.14.3
     , ordered-containers >=0.2.2
     , scientific >=0.3.6.2
     , text >=1.2.3.1
@@ -180,10 +190,10 @@
     , aeson-yaml >=1.0.3.0
     , base >=4.7 && <5
     , bytestring >=0.10.8.2
-    , dhall >=1.28.0 && <1.29
+    , dhall >=1.29.0 && <1.30
     , dhall-fly
     , dhall-json >=1.6.0 && <1.7
-    , optparse-applicative
+    , optparse-applicative >=0.14.3
     , ordered-containers >=0.2.2
     , scientific >=0.3.6.2
     , text >=1.2.3.1
@@ -208,10 +218,10 @@
       aeson >=1.4.5.0
     , aeson-casing >=0.2.0.0
     , base >=4.7 && <5
-    , dhall >=1.28.0 && <1.29
+    , dhall >=1.29.0 && <1.30
     , dhall-fly
     , hspec
-    , optparse-applicative
+    , optparse-applicative >=0.14.3
     , ordered-containers >=0.2.2
     , scientific >=0.3.6.2
     , text >=1.2.3.1
