diff --git a/docs/agenda.rst b/docs/agenda.rst
index 032d5e872842bd1546311d1223980a2fe2932039..ce4d5a5372a57d384ca85c4d4aaac699a28a75bd 100644
--- a/docs/agenda.rst
+++ b/docs/agenda.rst
@@ -2,39 +2,49 @@ Basic procedures
 ================
 
  * Compose Fireworks and workflows
- * Validate workflows
- * View workflows
  * Add fireworks to LaunchPad: ``lpad add``
+ * Validate workflows ``lpad add -c``, ``lpad check_wflow``
+ * View workflows ``lpad check_wflow -g``
  * Execution: ``rlaunch``
- * Monitoring: ``lpad get_*``, ``lpad webgui``
+ * Query fireworks and workflows: ``lpad get_fws``, ``lpad get_wflows``
+ * Monitoring: ``lpad report``, ``lpad track_fws``
 
 Exercise 1: Managing control flow 
 =================================
 
  * Dependencies and concurrency
- * Use standard Firetasks: ``ScriptTask``
+ * Use built-in Firetasks: ``ScriptTask``
  * Example: F1 pitstop
 
 Exercise 2: Managing data flow
 ==============================
 
  * Data flow dependencies 
- * Use custom Firetasks: ``PythonFunctionTask``
+ * Use built-in Firetasks: ``PyTask``
  * Example: Recruiting
 
 Exercise 3: Manage data in files and command line input
 =======================================================
 
- * Use custom Firetasks: ``CommandLineTask``
+ * Use built-in Firetasks: ``CommandLineTask``
  * Example: Image reconstruction
 
 Exercise 4: Extending a workflow
 ================================
 
+ * Use built-in command ``lpad append_wflow``
  * Extension of example from Exercise 3
  * Example: Image swirl
 
-Exercise 5: Writing a Firetask
+Exercise 5: Productive use
+ * Best practices: separate configs, launches, templates, inputs
+ * Using FireWorks with a batch system on HPC clusters
+ * Recovery from failure
+ * Duplicates
+ * Heterogeneous and distributed computing: _category, _fworker, etc.
+ * ...
+ 
+Exercise 6: Writing a Firetask
 ==============================
  * Extension of example from Exercise 2
 
diff --git a/docs/basics.rst b/docs/basics.rst
index 5de87b238ebf5bebe8175989ea0ec3aa9f1dce1f..c5bce57b5bd292e0e2cc7c6e92e66514068f852b 100644
--- a/docs/basics.rst
+++ b/docs/basics.rst
@@ -45,26 +45,26 @@ another in the order of their specification and share the same job working
 directory and the files in it.
 
 Here is a short example for a workflow demonstrating the usage of the 
-``PythonFunctionTask``::
+``PyTask``::
 
     fws:
     - fw_id: 1
       name: Grind coffee
       spec:
         _tasks:
-        - _fw_name: PythonFunctionTask
-          function: auxiliary.print_func
+        - _fw_name: PyTask
+          func: auxiliary.print_func
           inputs: [coffee beans]
-          outputs: coffee powder
+          outputs: [coffee powder]
         coffee beans: best selection
     - fw_id: 2
       name: Brew coffee
       spec:
         _tasks:
-        - _fw_name: PythonFunctionTask
-          function: auxiliary.print_func
+        - _fw_name: PyTask
+          func: auxiliary.print_func
           inputs: [coffee powder, water]
-          outputs: pure coffee
+          outputs: [pure coffee]
         water: workflowing water
     links:
       '1': [2]
@@ -84,7 +84,7 @@ Add Fireworks to LaunchPad
 The LaunchPad is a database where the workflows are stored during their full 
 life cycle. It is hosted on a resource named FireServer.
 
-**NOTE:** For simplicity, in this tutorial the FireServer is the same host on 
+**NOTE:** In tutorial settings the FireServer is sometimes on the same host on 
 which you are logged on.
 
 When used productively the LaunchPad contains many workflows in different states. 
@@ -127,7 +127,7 @@ Visualize workflows
 
 Already added workflows can be converted into DOT format and viewed graphically::
 
-    lpad check_wflow -i <firework ID> [--view_control_flow] [--view_data_flow] [-f <DOT_FILE>]
+    lpad check_wflow -i <firework ID> [-g <controlflow | dataflow | combined>] [-f <filename>]
 
 After the dot file is produced it can be converted to PDF and the workflow graph 
 can be viewed::
@@ -146,8 +146,8 @@ running on different resources where individual Fireworks can be executed by the
 rocket launcher ``rlaunch`` which has three modes of operation: *singleshot*, 
 *rapidfire* and *multi*. 
 
-**NOTE:** For simplicity, in this tutorial the FireWorker is the same host as 
-the FireServer.
+**NOTE:** In tutorial settings the FireWorker is sometimes on the same host as 
+the FireServer and/or on the host where you are logged in.
 
 To only execute one Firework from the LaunchPad which is in *READY* state the 
 following command is used::
diff --git a/docs/exercise2.rst b/docs/exercise2.rst
index d937d1d2d2b82da4a3ebdd692a7fe7675906792d..97c2c61558e4738c1585a2a4efa676c98470fff3 100644
--- a/docs/exercise2.rst
+++ b/docs/exercise2.rst
@@ -2,10 +2,10 @@ Exercise 2: Managing data flow
 ==============================
 
 The purpose of this exercise is to learn how to pass data between Fireworks and 
-describe data dependencies using the custom Firetask ``PythonFunctionTask``::
+describe data dependencies using the custom Firetask ``PyTask``::
 
-    - _fw_name: PythonFunctionTask
-      function: any_module.any_function
+    - _fw_name: PyTask
+      func: any_module.any_function
       inputs:
       - first argument
       - second argument
diff --git a/docs/exercise4.rst b/docs/exercise4.rst
index d3072b5c2ffd966430d091a7b2162aa8dccc14cc..a90afad05d7769fb264da13bcf95a7601c053303 100644
--- a/docs/exercise4.rst
+++ b/docs/exercise4.rst
@@ -27,8 +27,8 @@ latter workflow. For this, first copy the workflow **image_swirl.json** from
       name: Pass filename
       spec:
         _tasks:
-        - _fw_name: PythonFunctionTask
-          function: auxiliary.print_func
+        - _fw_name: PyTask
+          func: auxiliary.print_func
           inputs: [montaged image]
           outputs: [montaged image]
   and::
diff --git a/exercises/demos/2_data_flow/foreach_task.json b/exercises/demos/2_data_flow/foreach_task.json
index f23ce76b1c990ee96ef93f05292516c8bd1580ec..10e250a2d11a0989f1471823581fa38361d43ac2 100644
--- a/exercises/demos/2_data_flow/foreach_task.json
+++ b/exercises/demos/2_data_flow/foreach_task.json
@@ -8,10 +8,10 @@
           {
             "_fw_name": "ForeachTask",
             "task": {
-                "_fw_name": "PythonFunctionTask",
-                "function": "auxiliary.print_func",
+                "_fw_name": "PyTask",
+                "func": "auxiliary.print_func",
                 "inputs": ["coffee beans"],
-                "outputs": "coffee powder"
+                "outputs": ["coffee powder"]
             },
             "split": "coffee beans"
           }
@@ -27,10 +27,10 @@
           {
             "_fw_name": "ForeachTask",
             "task": {
-                "_fw_name": "PythonFunctionTask",
-                "function": "auxiliary.print_func",
+                "_fw_name": "PyTask",
+                "func": "auxiliary.print_func",
                 "inputs": ["coffee powder", "water"],
-                "outputs": "pure coffee"
+                "outputs": ["pure coffee"]
             },
             "split": "coffee powder"
           }
@@ -44,8 +44,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["pure coffee"]
           }
         ]
diff --git a/exercises/demos/2_data_flow/foreach_task.yaml b/exercises/demos/2_data_flow/foreach_task.yaml
index acdfa18bc74f0c4e7ca85c94b77f46a570c924d2..35cd1729733ba795ae9bfa1f3e102134a14e21d8 100644
--- a/exercises/demos/2_data_flow/foreach_task.yaml
+++ b/exercises/demos/2_data_flow/foreach_task.yaml
@@ -6,10 +6,10 @@ fws:
     - _fw_name: ForeachTask
       split: coffee beans
       task:
-        _fw_name: PythonFunctionTask
-        function: auxiliary.print_func
+        _fw_name: PyTask
+        func: auxiliary.print_func
         inputs: [coffee beans]
-        outputs: coffee powder
+        outputs: [coffee powder]
     coffee beans: [arabica, robusta, liberica]
 - fw_id: 2
   name: Brew coffee
@@ -18,17 +18,17 @@ fws:
     - _fw_name: ForeachTask
       split: coffee powder
       task:
-        _fw_name: PythonFunctionTask
-        function: auxiliary.print_func
+        _fw_name: PyTask
+        func: auxiliary.print_func
         inputs: [coffee powder, water]
-        outputs: pure coffee
+        outputs: [pure coffee]
     water: workflowing water
 - fw_id: 3
   name: Serve coffee
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [pure coffee]
 links:
   '1': [2]
diff --git a/exercises/demos/2_data_flow/python_function_task.json b/exercises/demos/2_data_flow/python_function_task.json
index fcb92ed5564893624fa68f65882754a964d9e423..e3abe0c4ddb88efb63e754b0b9769aab066ac235 100644
--- a/exercises/demos/2_data_flow/python_function_task.json
+++ b/exercises/demos/2_data_flow/python_function_task.json
@@ -6,10 +6,10 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["fresh coffee beans"],
-            "outputs": "roasted coffee beans"
+            "outputs": ["roasted coffee beans"]
           }
         ],
         "fresh coffee beans": "top coffee selection"
@@ -21,10 +21,10 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["roasted coffee beans"],
-            "outputs": "coffee powder"
+            "outputs": ["coffee powder"]
           }
         ]
       }
@@ -35,10 +35,10 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["coffee powder", "water"],
-            "outputs": "pure coffee"
+            "outputs": ["pure coffee"]
           }
         ],
         "water": "workflowing water"
@@ -50,10 +50,10 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["pure coffee", "milk"],
-            "outputs": "cappuccino"
+            "outputs": ["cappuccino"]
           }
         ],
         "milk": "milky way milk"
diff --git a/exercises/demos/2_data_flow/python_function_task.yaml b/exercises/demos/2_data_flow/python_function_task.yaml
index 5798cfbeb0057b59b1c6e122d9d9a1f7f15635c3..be2e609c941d4b4fe48d54c7525670a5d7421603 100644
--- a/exercises/demos/2_data_flow/python_function_task.yaml
+++ b/exercises/demos/2_data_flow/python_function_task.yaml
@@ -3,36 +3,36 @@ fws:
   name: Roast coffee
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [fresh coffee beans]
-      outputs: roasted coffee beans
+      outputs: [roasted coffee beans]
     fresh coffee beans: top coffee selection
 - fw_id: 1
   name: Grind coffee
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [roasted coffee beans]
-      outputs: coffee powder
+      outputs: [coffee powder]
 - fw_id: 2
   name: Brew coffee
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [coffee powder, water]
-      outputs: pure coffee
+      outputs: [pure coffee]
     water: workflowing water
 - fw_id: 3
   name: Add extras
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [pure coffee, milk]
-      outputs: cappuccino
+      outputs: [cappuccino]
     milk: milky way milk
 links:
   '0': [1]
diff --git a/exercises/demos/3_files_and_commands/foreach_task_cmd.json b/exercises/demos/3_files_and_commands/foreach_task_cmd.json
index 3a702a72e3ada542af999c92b5f5116c9857d5cd..17bb6635450659380bb830bd3e884018a6c8316b 100644
--- a/exercises/demos/3_files_and_commands/foreach_task_cmd.json
+++ b/exercises/demos/3_files_and_commands/foreach_task_cmd.json
@@ -50,8 +50,8 @@
       "spec": {
          "_tasks": [
             {
-                "_fw_name": "PythonFunctionTask", 
-                "function": "auxiliary.print_func", 
+                "_fw_name": "PyTask", 
+                "func": "auxiliary.print_func", 
                 "inputs": [
                     "file set"
                 ]
@@ -77,8 +77,8 @@
                 }
             },
             {
-                "_fw_name": "PythonFunctionTask", 
-                "function": "auxiliary.print_func", 
+                "_fw_name": "PyTask", 
+                "func": "auxiliary.print_func", 
                 "inputs": [
                     "stdout dump"
                 ]
diff --git a/exercises/demos/3_files_and_commands/foreach_task_cmd.yaml b/exercises/demos/3_files_and_commands/foreach_task_cmd.yaml
index 9992448f8de7c86a37e09f168b4392365a972151..efd7419027ff749d3e8305543b4a23238759e8ff 100644
--- a/exercises/demos/3_files_and_commands/foreach_task_cmd.yaml
+++ b/exercises/demos/3_files_and_commands/foreach_task_cmd.yaml
@@ -22,8 +22,8 @@ fws:
   name: Concatenate the files into a string
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [file set]
     - _fw_name: CommandLineTask
       command_spec:
@@ -34,8 +34,8 @@ fws:
           target: {type: data, value: stdout dump}
       inputs: [file set]
       outputs: [stdout dump]
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [stdout dump]
 links:
   '1': [2]
diff --git a/exercises/inputs/2_data_flow/template.json b/exercises/inputs/2_data_flow/template.json
index 1cf1a5113d93ea2e661dc258ddd92b22ebcf567a..1abb5805a4ccadf586d3164824f832d9b8701613 100644
--- a/exercises/inputs/2_data_flow/template.json
+++ b/exercises/inputs/2_data_flow/template.json
@@ -6,8 +6,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["job description"],
             "outputs": [""]
           }
@@ -21,8 +21,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "",
+            "_fw_name": "PyTask",
+            "func": "",
             "inputs": [
                 "",
                 ""
@@ -40,8 +40,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "",
+            "_fw_name": "PyTask",
+            "func": "",
             "inputs": [
                 "",
                 "",
@@ -61,8 +61,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "",
+            "_fw_name": "PyTask",
+            "func": "",
             "inputs": [
                 "",
                 "",
diff --git a/exercises/inputs/2_data_flow/template.yaml b/exercises/inputs/2_data_flow/template.yaml
index d0b247cb3d224d00297c5610fd815e1c9e7a8049..7db2bf206e6ad28120086e797e76e6ccc801d7c5 100644
--- a/exercises/inputs/2_data_flow/template.yaml
+++ b/exercises/inputs/2_data_flow/template.yaml
@@ -3,40 +3,40 @@ fws:
   name: Post the job
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [job description]
-      outputs: ['']
+      outputs: [' ']
     job description: {}
 - fw_id: 2
   name: Candidates apply
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: ''
-      inputs: ['', '']
-      outputs: ['']
+    - _fw_name: PyTask
+      func: ' '
+      inputs: [' ', ' ']
+      outputs: [' ']
     application template: {}
     maximum applications: 50
 - fw_id: 3
   name: Screen candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: ''
-      inputs: ['', '', '', '']
-      outputs: ['']
+    - _fw_name: PyTask
+      func: ' '
+      inputs: [' ', ' ', ' ', ' ']
+      outputs: [' ']
     minimum score: 2
     number to invite: 4
 - fw_id: 4
   name: Interview candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: ''
-      inputs: ['', '', '']
-      outputs: ['']
+    - _fw_name: PyTask
+      func: ' '
+      inputs: [' ', ' ', ' ']
+      outputs: [' ']
     number to fill: 2
 links: {}
 metadata: {}
-name: ''
+name: ' '
diff --git a/exercises/problems/2_data_flow/recruiting-0.json b/exercises/problems/2_data_flow/recruiting-0.json
index e2cefec368cfcc3f643684cc90543e8096672db9..ef8d65d47de8d6bc6bfa990bbe9b0474fa316c9b 100644
--- a/exercises/problems/2_data_flow/recruiting-0.json
+++ b/exercises/problems/2_data_flow/recruiting-0.json
@@ -6,8 +6,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "",
+            "_fw_name": "PyTask",
+            "func": "",
             "inputs": [],
             "outputs": []
           }
@@ -20,8 +20,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "",
+            "_fw_name": "PyTask",
+            "func": "",
             "inputs": [],
             "outputs": []
           }
diff --git a/exercises/problems/2_data_flow/recruiting-0.yaml b/exercises/problems/2_data_flow/recruiting-0.yaml
index 6b69a6d1417ac46cae3cd0fd5d71ce8c1313d25e..43038e8f5a4eeccba17d808ff2968f34bce854fb 100644
--- a/exercises/problems/2_data_flow/recruiting-0.yaml
+++ b/exercises/problems/2_data_flow/recruiting-0.yaml
@@ -3,16 +3,16 @@ fws:
   name: ''
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: ''
+    - _fw_name: PyTask
+      func: ''
       inputs: []
       outputs: []
 - fw_id: 2
   name: ''
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: ''
+    - _fw_name: PyTask
+      func: ''
       inputs: []
       outputs: []
 links:
diff --git a/exercises/problems/2_data_flow/recruiting-1.json b/exercises/problems/2_data_flow/recruiting-1.json
index 14c7e7dd082a56963e5b4edab31df5935bfd38b3..a5141892d7e07533d3c6aafafc28538aa08c3484 100644
--- a/exercises/problems/2_data_flow/recruiting-1.json
+++ b/exercises/problems/2_data_flow/recruiting-1.json
@@ -6,8 +6,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["job description"],
             "outputs": ["job description"]
           }
@@ -35,8 +35,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.candidates_apply",
+            "_fw_name": "PyTask",
+            "func": "recruiting.candidates_apply",
             "inputs": ["application template", "maximum applications"],
             "outputs": ["applicant profiles"]
           }
@@ -71,8 +71,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.screen_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.screen_candidates",
             "inputs": [
                 "job description",
                 "applicant profiles",
@@ -92,8 +92,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.interview_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.interview_candidates",
             "inputs": [
                 "job description",
                 "applicant profiles",
diff --git a/exercises/problems/2_data_flow/recruiting-1.yaml b/exercises/problems/2_data_flow/recruiting-1.yaml
index deadbff4025f1c510cd920fcd5bbfedf3c9a8b27..c41093d37cdc8908f9de05470d6fe935abc63b3f 100644
--- a/exercises/problems/2_data_flow/recruiting-1.yaml
+++ b/exercises/problems/2_data_flow/recruiting-1.yaml
@@ -3,8 +3,8 @@ fws:
   name: Post the job
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [job description]
       outputs: [job description]
     job description:
@@ -17,8 +17,8 @@ fws:
   name: Candidates apply
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.candidates_apply
+    - _fw_name: PyTask
+      func: recruiting.candidates_apply
       inputs: [application template, maximum applications]
       outputs: [applicant profiles]
     application template:
@@ -36,8 +36,8 @@ fws:
   name: Screen candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.screen_candidates
+    - _fw_name: PyTask
+      func: recruiting.screen_candidates
       inputs: [job description, applicant profiles, minimum score, number to invite]
       outputs: [invited applicants]
     minimum score: 2
@@ -46,8 +46,8 @@ fws:
   name: Interview candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.interview_candidates
+    - _fw_name: PyTask
+      func: recruiting.interview_candidates
       inputs: [job description, applicant profiles, number to fill]
       outputs: [selected applicants]
     number to fill: 2
diff --git a/exercises/problems/2_data_flow/recruiting-2.json b/exercises/problems/2_data_flow/recruiting-2.json
index c5d213e477487fcd49c1c48e2009c1c2e912d629..c88c6200a780542a003620a9c20c004cb245216d 100644
--- a/exercises/problems/2_data_flow/recruiting-2.json
+++ b/exercises/problems/2_data_flow/recruiting-2.json
@@ -6,8 +6,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["job description"],
             "outputs": ["job description"]
           }
@@ -35,8 +35,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.candidates_apply",
+            "_fw_name": "PyTask",
+            "func": "recruiting.candidates_apply",
             "inputs": ["application template", "maximum applications"],
             "outputs": ["applicant profiles"]
           }
@@ -71,8 +71,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.screen_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.screen_candidates",
             "inputs": [
                 "job description",
                 "applicant profiles",
@@ -92,8 +92,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.interview_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.interview_candidates",
             "inputs": [
                 "job description",
                 "invited applicants",
diff --git a/exercises/problems/2_data_flow/recruiting-2.yaml b/exercises/problems/2_data_flow/recruiting-2.yaml
index c3e55cb6f311f20a304464cdff08e71a034f98b4..7e7c6af88c6bf34ec111fde39e7ce9b99d3c9f02 100644
--- a/exercises/problems/2_data_flow/recruiting-2.yaml
+++ b/exercises/problems/2_data_flow/recruiting-2.yaml
@@ -3,8 +3,8 @@ fws:
   name: Post the job
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [job description]
       outputs: [job description]
     job description:
@@ -17,8 +17,8 @@ fws:
   name: Candidates apply
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.candidates_apply
+    - _fw_name: PyTask
+      func: recruiting.candidates_apply
       inputs: [application template, maximum applications]
       outputs: [applicant profiles]
     application template:
@@ -36,8 +36,8 @@ fws:
   name: Screen candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.screen_candidates
+    - _fw_name: PyTask
+      func: recruiting.screen_candidates
       inputs: [job description, applicant profiles, minimum score, number to invite]
       outputs: [invited applicants]
     minimum score: 2
@@ -46,8 +46,8 @@ fws:
   name: Interview candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.interview_candidates
+    - _fw_name: PyTask
+      func: recruiting.interview_candidates
       inputs: [job description, invited applicants, number to fill]
       outputs: [selected applicants]
     number to fill: 2
diff --git a/exercises/problems/5_author_firetask/dataloader+repeater.json b/exercises/problems/5_author_firetask/dataloader+repeater.json
index 338294781fae54db50f1126c80e8df8498c8fd0e..400eb2e76d12d785939666c59db2eee2a2cf86cc 100644
--- a/exercises/problems/5_author_firetask/dataloader+repeater.json
+++ b/exercises/problems/5_author_firetask/dataloader+repeater.json
@@ -24,8 +24,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.candidates_apply",
+            "_fw_name": "PyTask",
+            "func": "recruiting.candidates_apply",
             "inputs": ["application template", "maximum applications"],
             "outputs": ["applicant profiles"]
           },
@@ -45,8 +45,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.screen_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.screen_candidates",
             "inputs": [
                 "job description",
                 "applicant profiles",
@@ -71,8 +71,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.interview_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.interview_candidates",
             "inputs": [
                 "job description",
                 "invited applicants",
diff --git a/exercises/problems/5_author_firetask/dataloader.json b/exercises/problems/5_author_firetask/dataloader.json
index 3585d283b683f67d5246399ea4d06daad2403a59..cd4e3d373ef9ccab6f0ba06f81ea00c7f6ea92c2 100644
--- a/exercises/problems/5_author_firetask/dataloader.json
+++ b/exercises/problems/5_author_firetask/dataloader.json
@@ -24,8 +24,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.candidates_apply",
+            "_fw_name": "PyTask",
+            "func": "recruiting.candidates_apply",
             "inputs": ["application template", "maximum applications"],
             "outputs": ["applicant profiles"]
           }
@@ -39,8 +39,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.screen_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.screen_candidates",
             "inputs": [
                 "job description",
                 "applicant profiles",
@@ -60,8 +60,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.interview_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.interview_candidates",
             "inputs": [
                 "job description",
                 "invited applicants",
diff --git a/exercises/solutions/2_data_flow/recruiting.json b/exercises/solutions/2_data_flow/recruiting.json
index a49ba053449f10aa50f94419a7764aa2d970b336..ffd67fdfc2e9d2999946fa4899c853056b02baf7 100644
--- a/exercises/solutions/2_data_flow/recruiting.json
+++ b/exercises/solutions/2_data_flow/recruiting.json
@@ -6,8 +6,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["job description"],
             "outputs": ["job description"]
           }
@@ -35,8 +35,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.candidates_apply",
+            "_fw_name": "PyTask",
+            "func": "recruiting.candidates_apply",
             "inputs": ["application template", "maximum applications"],
             "outputs": ["applicant profiles"]
           }
@@ -71,8 +71,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.screen_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.screen_candidates",
             "inputs": [
                 "job description",
                 "applicant profiles",
@@ -92,8 +92,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.interview_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.interview_candidates",
             "inputs": [
                 "job description",
                 "invited applicants",
diff --git a/exercises/solutions/2_data_flow/recruiting.yaml b/exercises/solutions/2_data_flow/recruiting.yaml
index 3510e1786e51348773c4e49f667603b2147d402e..e1127afd571c7312c3593402ab3ae70e7b4a9ee2 100644
--- a/exercises/solutions/2_data_flow/recruiting.yaml
+++ b/exercises/solutions/2_data_flow/recruiting.yaml
@@ -3,8 +3,8 @@ fws:
   name: Post the job
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [job description]
       outputs: [job description]
     job description:
@@ -17,8 +17,8 @@ fws:
   name: Candidates apply
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.candidates_apply
+    - _fw_name: PyTask
+      func: recruiting.candidates_apply
       inputs: [application template, maximum applications]
       outputs: [applicant profiles]
     application template:
@@ -36,8 +36,8 @@ fws:
   name: Screen candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.screen_candidates
+    - _fw_name: PyTask
+      func: recruiting.screen_candidates
       inputs: [job description, applicant profiles, minimum score, number to invite]
       outputs: [invited applicants]
     minimum score: 2
@@ -46,8 +46,8 @@ fws:
   name: Interview candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.interview_candidates
+    - _fw_name: PyTask
+      func: recruiting.interview_candidates
       inputs: [job description, invited applicants, number to fill]
       outputs: [selected applicants]
     number to fill: 2
diff --git a/exercises/solutions/4_wflow_append/image_swirl_montaged.json b/exercises/solutions/4_wflow_append/image_swirl_montaged.json
index 014d8df4b946af014d5ddfb9a88040e450e6b1c0..a764f907cb471344c7fe4fddfc36f48bb3d194b9 100644
--- a/exercises/solutions/4_wflow_append/image_swirl_montaged.json
+++ b/exercises/solutions/4_wflow_append/image_swirl_montaged.json
@@ -7,8 +7,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["montaged image"],
             "outputs": ["montaged image"]
           }
diff --git a/exercises/solutions/4_wflow_append/image_swirl_montaged.yaml b/exercises/solutions/4_wflow_append/image_swirl_montaged.yaml
index 6a151c8663e7881399bf6f529ba9b6aa32171657..f32f8221d2a55eeb5f052f3263a3dde96eea1747 100644
--- a/exercises/solutions/4_wflow_append/image_swirl_montaged.yaml
+++ b/exercises/solutions/4_wflow_append/image_swirl_montaged.yaml
@@ -3,8 +3,8 @@ fws:
   name: Pass filename
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [montaged image]
       outputs: [montaged image]
 - fw_id: -1