diff --git a/tutorials/part2/02_relaxation/relaxation_workflow.ipynb b/tutorials/part2/02_relaxation/relaxation_workflow.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..1176d77a77073c33130fb32ce61b5954cd1b6254
--- /dev/null
+++ b/tutorials/part2/02_relaxation/relaxation_workflow.ipynb
@@ -0,0 +1,328 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "4212729e",
+   "metadata": {},
+   "source": [
+    "# Abiflows : relaxation workflow\n",
+    "\n",
+    "In this exercise, you will use abiflows to perform the relaxation of bulk silicon.\n",
+    "\n",
+    "First, import all the necessary modules and objects:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "64a3318e",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from fireworks import FWorker\n",
+    "import os\n",
+    "import pseudo_dojo\n",
+    "from abiflows.fireworks.workflows.abinit_workflows import RelaxFWWorkflow\n",
+    "from abiflows.database.mongoengine.utils import DatabaseData\n",
+    "from pymatgen.ext.matproj import MPRester\n",
+    "from pymatgen.core.structure import Structure\n",
+    "from pymatgen.symmetry.analyzer import SpacegroupAnalyzer\n",
+    "import abipy.data as abidata\n",
+    "from jupyter_jsmol.pymatgen import quick_view\n",
+    "from abiflows.database.mongoengine.abinit_results import RelaxResult"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1b473a01",
+   "metadata": {},
+   "source": [
+    "### Pseudo-potentials\n",
+    "We will use the pseudo potentials from the Pseudo-Dojo. These pseudopotentials have been extensively tested and assessed with respect to various properties and have standard cut-offs defined. If you want to use some other kind of pseudos you will need to provide explicitly the cutoff for the calculation."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "e91b727e",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "pseudo_table = pseudo_dojo.OfficialDojoTable.from_djson_file(\n",
+    "    os.path.join(pseudo_dojo.dojotable_absdir(\"ONCVPSP-PBE-PDv0.4\"), 'standard.djson'))\n",
+    "pseudo_path = pseudo_dojo.dojotable_absdir(\"ONCVPSP-PBE-PDv0.4\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5705a888",
+   "metadata": {},
+   "source": [
+    "### Define the database for the results\n",
+    "It can be the same database used for fireworks with other collections or a different one"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "34ca1675",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "db = DatabaseData(host='mongo', port=27017, collection='relax',\n",
+    "                  database='fireworks', username=None, password=None)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c7183ce3",
+   "metadata": {},
+   "source": [
+    "### Structure\n",
+    "Get the structure (from abipy's standard set of structures). You can also get it from the Materials Project if you set up your MP api key. mp-149 is the id for silicon in the Materials Project."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "36eca101",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "mp_id = 'mp-149'\n",
+    "#structure = MPRester().get_structure_by_material_id(mp_id)\n",
+    "structure = abidata.structure_from_cif(\"si.cif\")\n",
+    "spga = SpacegroupAnalyzer(structure)\n",
+    "structure = spga.get_primitive_standard_structure()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e2191732",
+   "metadata": {},
+   "source": [
+    "You can easily view the structure using:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "702bad75",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "quick_view(structure)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9ea4ee68",
+   "metadata": {},
+   "source": [
+    "### Parameters of the calculation\n",
+    "Check that the pseudo-potentials are indeed available for the structure:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "92488756",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "try:\n",
+    "    pseudos = pseudo_table.get_pseudos_for_structure(structure)\n",
+    "    print(\"pseudos found\")\n",
+    "except BaseException as e:\n",
+    "    print(\"no pseudo\")\n",
+    "    exit(1)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8334a064",
+   "metadata": {},
+   "source": [
+    "Define the k-point density:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "4f6761ee",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "kppa = 500"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "da5ab529",
+   "metadata": {},
+   "source": [
+    "Add some initialization info to be stored in the results database"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "35b61f29",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "initialization_info = dict(kppa=kppa, mp_id=mp_id)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "32d67a01",
+   "metadata": {},
+   "source": [
+    "Tolerance for the relaxation and additional parameters for abinit:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f2de7117",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "tolmxf = 1e-5\n",
+    "extra_abivars = dict(tolmxf=tolmxf, ionmov=2, chksymbreak=1, ntime=30, nstep=100)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f154b0e9",
+   "metadata": {},
+   "source": [
+    "### Workflow\n",
+    "Create the relaxation workflow. This will create a fireworks workflow object (still not added to fireworks database) check the function for the different options available. The OneSymmetric option will set a single shift that respects the symmetry of the crystal. The target_dilatmx means that the dilatmx parameter will be automatically progressively reduced and relaxation restarted until the desired value has been used."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "31506eba",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gen = RelaxFWWorkflow.from_factory(structure, pseudo_table, kppa=kppa, spin_mode=\"unpolarized\", extra_abivars=extra_abivars,\n",
+    "                                   autoparal=False, initialization_info=initialization_info, target_dilatmx=1.01,\n",
+    "                                   smearing=None, shift_mode='OneSymmetric', ecut=5)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "eda7b2b5",
+   "metadata": {},
+   "source": [
+    "Add the insertion in the results database as well as the clean up of the files that are not needed after execution:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "710a7097",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gen.add_mongoengine_db_insertion(db)\n",
+    "gen.add_final_cleanup([\"WFK\", \"1WF\", \"DEN\", \"WFQ\", \"DDB\"])"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "812b079d",
+   "metadata": {},
+   "source": [
+    "Add the workflow to the database. It will use the fireworks LaunchPad that has been set by default. If a different one should be used it can be passed as an argument."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "6b5ab2f6",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "fw_id_maps = gen.add_to_db()\n",
+    "print(\"{} submitted\".format(mp_id))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "7a20313c",
+   "metadata": {},
+   "source": [
+    "Now your workflow is ready to be executed. Look at the Fireworks webgui to see your workflow diagrammatically. Use the terminal to launch fireworks using the rapidfire mode. You can use the --nlaunches=1 option to see what is happening one step at a time."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1f59514b",
+   "metadata": {},
+   "source": [
+    "### Relaxed structure\n",
+    "You can get the relaxed structure directly from the database"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "618c4316",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "db.connect_mongoengine()\n",
+    "with db.switch_collection(RelaxResult) as RelaxResult:\n",
+    "    relaxed_results = RelaxResult.objects(mp_id=\"mp-149\")\n",
+    "    relaxed = relaxed_results[0]\n",
+    "# load the relaxed Structure\n",
+    "relaxed_structure = Structure.from_dict(relaxed.abinit_output.structure)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "98a37be1",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "print(f\"Volume of the initial structure: {structure.volume}\")\n",
+    "print(f\"Volume of the relaxed structure: {relaxed_structure.volume}\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "4b27611f",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/tutorials/part2/03_phonons/phonon_workflow.ipynb b/tutorials/part2/03_phonons/phonon_workflow.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..7cdbab1c0434cfeccf97fd0a5fec5210106c2088
--- /dev/null
+++ b/tutorials/part2/03_phonons/phonon_workflow.ipynb
@@ -0,0 +1,348 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "d991bd8e",
+   "metadata": {},
+   "source": [
+    "# Abiflows : phonon workflow\n",
+    "\n",
+    "In this exercise, you will use abiflows to perform a phonon calculation for bulk silicon. You will use the relaxed structure obtained in the previous exercise.\n",
+    "\n",
+    "First, import all the necessary modules and objects:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "9f484568",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from abipy.abilab import Structure\n",
+    "from abiflows.fireworks.workflows.abinit_workflows import DfptFWWorkflow\n",
+    "from abiflows.database.mongoengine.utils import DatabaseData\n",
+    "from abiflows.database.mongoengine.abinit_results import RelaxResult, DfptResult"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9aa33efb",
+   "metadata": {},
+   "source": [
+    "Define where to take the relaxed structure from:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8ef86d8a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "source_db = DatabaseData(host='mongo', port=27017, collection='relax',\n",
+    "                  database='fireworks', username=None, password=None)\n",
+    "source_db.connect_mongoengine()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "42082197",
+   "metadata": {},
+   "source": [
+    "Define the database for the phonon results:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b6ea6a04",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "db = DatabaseData(host='mongo', port=27017, collection='phonon',\n",
+    "                  database='fireworks', username=None, password=None)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a66dc661",
+   "metadata": {},
+   "source": [
+    "### Get the relaxed structure\n",
+    "The context manager is required to use the collection name selected in source_db.\n",
+    "By default mongoengine uses the name of the class (in this case RelaxResult) as name of the collection to query."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c0b65632",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "with source_db.switch_collection(RelaxResult) as RelaxResult:\n",
+    "    mp_id = 'mp-149'\n",
+    "    # download from the database the relaxed structure\n",
+    "    # This relies on mongoengine (http://mongoengine.org/) to interact with the database.\n",
+    "    # See the module abiflows.database.mongoengine.abinit_results for the objects used to store the results\n",
+    "    relaxed_results = RelaxResult.objects(mp_id=mp_id)\n",
+    "\n",
+    "    # Assume that there is one and only one result matching the query. In real cases you might want to check this.\n",
+    "    # At this point is an instance of a RelaxResult object\n",
+    "    relaxed = relaxed_results[0]\n",
+    "    structure = Structure.from_dict(relaxed.abinit_output.structure)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6989af46",
+   "metadata": {},
+   "source": [
+    "### Parameters of the calculation\n",
+    "Define the k-point sampling (same as the that of the relaxation):"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "16b6f993",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "kppa = relaxed.abinit_input.kppa\n",
+    "ngkpt = relaxed.abinit_input.ngkpt"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "aac3f736",
+   "metadata": {},
+   "source": [
+    "Get the input used for the relaxation to use the same approximations for the phonon calculation."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "92e420e5",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "relax_input = relaxed.abinit_input.last_input.to_mgobj()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "91c1db20",
+   "metadata": {},
+   "source": [
+    "Define the q-point grid (same as the k-point grid), additional abinit parameters and initialization info:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8eccb32a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "qppa = kppa\n",
+    "extra_abivars = dict(chkprim=1, nstep=100, chksymbreak=1, paral_kgb=1)\n",
+    "initialization_info = dict(kppa=kppa, mp_id=mp_id,\n",
+    "                           relax_db=source_db.as_dict_no_credentials(), relax_id=relaxed.id,\n",
+    "                           relax_tol_val=1e-6, qppa=qppa)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9cea180b",
+   "metadata": {},
+   "source": [
+    "### Workflow\n",
+    "Create the phonon workflow. In this case the base is the input file of the relaxation workflow. Use the DfptFWWorkflow that allow to calculate the different kind of Dfpt perturbations with abinit in a single workflow. In this case only the phonons."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "3975b571",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gen = DfptFWWorkflow.from_gs_input(structure=structure, gs_input=relax_input,\n",
+    "                                   extra_abivars=extra_abivars, autoparal=False,\n",
+    "                                   initialization_info=initialization_info, do_ddk=True, do_dde=True,\n",
+    "                                   ph_ngqpt=[1,1,1],\n",
+    "                                   do_strain=False)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4ccd8749",
+   "metadata": {},
+   "source": [
+    "Add the insertion in the results database as well as the clean up of the files that are not needed after execution:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f5a4973b",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gen.add_mongoengine_db_insertion(db)\n",
+    "gen.add_final_cleanup([\"WFK\", \"1WF\", \"WFQ\", \"1POT\", \"1DEN\"])"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "7d0b5376",
+   "metadata": {},
+   "source": [
+    "Add the workflow to the database. It will use the fireworks LaunchPad that has been set by default. If a different one should be used it can be passed as an argument."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "1233793d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gen.add_to_db()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d49a88dd",
+   "metadata": {},
+   "source": [
+    "Now your workflow is ready to be executed. Look at the Fireworks webgui to see your workflow diagrammatically. Use the terminal to launch fireworks using the rapidfire mode. You can use the --nlaunches=1 option to see what is happening one step at a time."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e810dd52",
+   "metadata": {},
+   "source": [
+    "### Results\n",
+    "You can now get the results of the phonon calculation."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b7ecba8d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "db.collection = \"phonon\"\n",
+    "with db.switch_collection(DfptResult) as DfptResult:\n",
+    "    ph_results = DfptResult.objects()\n",
+    "    ph_res = ph_results[0]"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "7e832de8",
+   "metadata": {},
+   "source": [
+    "Get the ddb (derivatives database) computed and extract the phonon frequencies at Gamma:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8a4ee642",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "ddb = ph_res.abinit_output.ddb.abiopen()\n",
+    "phb = ddb.anaget_phmodes_at_qpoint([0,0,0])\n",
+    "print(\"Phonon frequencies at Gamma: \", phb.phfreqs)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "293d0d73",
+   "metadata": {},
+   "source": [
+    "Get the phonon band structure and density of states:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f23a3970",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "phbst, phdos = ddb.anaget_phbst_and_phdos_files(line_density=10)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "126d1920",
+   "metadata": {},
+   "source": [
+    "Plot the phonon band structure and density of states"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "fb62792f",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from abipy.dfpt.phonons import PhononBandsPlotter\n",
+    "pbp = PhononBandsPlotter()\n",
+    "pbp.add_phbands(label='Silicon Band structure', bands=phbst.phbands, phdos=phdos.phdos)\n",
+    "pbp.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4dcd7198",
+   "metadata": {},
+   "source": [
+    "### Visualizing phonon modes\n",
+    "Create a specific json file to be used in the following website to visualize the phonon modes:\n",
+    "http://henriquemiranda.github.io/phononwebsite/phonon.html. Download the file on your local machine and upload it on the following website to display the atomic displacents associated to the phonon modes."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "88f229c4",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "phbst.phbands.create_phononwebsite_json(\"/home/jovyan/Si_phononwebsite.json\")"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}