Repository: ec-jrc/pyPoseidon (language: python)

Issue:
Make visualization libraries optional

Documentation review
I transferred here the comments by @vvoukouvalas 

### https://pyposeidon-panos.readthedocs.io/en/latest/structure.html
on the functionality of dem: is it only the bathymetric data or also topobathy? you have done a lot of work also on separating the initial dry/wet area etc


### https://pyposeidon-panos.readthedocs.io/en/latest/meteo.html

small typo at the section URL of "As an ..."

### https://pyposeidon-panos.readthedocs.io/en/latest/dem.html

first line same as above, is it only for bathymetric data?

Coastlines section, small typo : "is usually lower than the one of the available..."

Coastlines section, "Since the coastlines are the boundary for the mesh generation.." : is it possible to use e.g. the 10m land contour (assuming that the user provides a proper one without overlaps etc) to make a model for inundation studies?

small typo, maybe something like "Generally, whatever format geopandas reads should work."

small typo, "... bathymetric data on the x,y nodes can be provided as"

### https://pyposeidon-panos.readthedocs.io/en/latest/boundary.html

Buffering section, what are the units of cbuffer?

### https://pyposeidon-panos.readthedocs.io/en/latest/mesh.html

it is called GSHHG dataset not GSHHS

"... is an xarray Dataset. Thus," the tip below interrupts the flow

### https://pyposeidon-panos.readthedocs.io/en/latest/model.html

"The procedure usually includes providing several info :", please reformulate.
" ... and reproduced it with"
" ... there might be a model which has been created by other means. This model can be ... ",

### https://pyposeidon-panos.readthedocs.io/en/latest/utils.html

line 5: " ... there is a number of available functions

"Having the new 2D topology, computing the corresponding subset of any variable in a Dataset becomes:" : what is it computed here?

### https://pyposeidon-panos.readthedocs.io/en/latest/development.html

"... and use it to create a new conda environment. E.g. The following" : please reformulate it.

" ... for testing pyposeidon are substantial in size", please give an indication of the size.

### https://pyposeidon-panos.readthedocs.io/en/latest/api.html

section pyposeidon.model: correct to hydrodynamic models

sections schism and d3d "It controls the creation, output & execution" : creation, execution & output

sections mjigsaw and mgmsh: is there any way to change the parameters of these libraries?
pydap upstream issue
Follow pydap/pydap#211 to check when pydap > 3.2.2 will solve the problem.
Update launch process for D3D
Use the tool module to launch the D3D job as well because now it fails with `openmpi`.


Discussion / hints:
@brey what remains to close this? Create a base pyposeidon conda package and a separate package that pulls all the dependencies?
Yes. I will push it with the next PR.




Fix patch:
diff --git a/.gitignore b/.gitignore
index 788bc810..019bdd5c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
 
 # mac files
 *.DS_Store
+docs/img/.DS_Store
 
 # cfgrib idx
 *.idx
diff --git a/Tutorial/BOUNDARY.ipynb b/Tutorial/BOUNDARY.ipynb
index 074aab0d..7479119e 100644
--- a/Tutorial/BOUNDARY.ipynb
+++ b/Tutorial/BOUNDARY.ipynb
@@ -2,15 +2,15 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "6149a7c6",
+   "id": "f0982aea",
    "metadata": {},
    "source": [
-    "# The Geometry module"
+    "# The Boundary module"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "7a86f3d5",
+   "id": "94e3d0bc",
    "metadata": {},
    "source": [
     "This module handles mesh boundary extraction from coastlines or user provided shapefiles. It underpins the [MESH](MESH.ipynb) module.\n",
@@ -24,19 +24,19 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "d519e5cf",
+   "id": "facd7989",
    "metadata": {},
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8ca5e13b",
+   "id": "36ebbaea",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -48,7 +48,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "39a15db5",
+   "id": "4ca41804",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -57,7 +57,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "7c087322",
+   "id": "1fde6b9b",
    "metadata": {},
    "source": [
     "### Graphics"
@@ -66,7 +66,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "32d314a1",
+   "id": "0af0bb8a",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -76,7 +76,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "93118936",
+   "id": "0ee5fde0",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -86,7 +86,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "9d50225d",
+   "id": "4edaaa7e",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -96,7 +96,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "98a2a535",
+   "id": "6c973e02",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -107,7 +107,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "50c72fc3",
+   "id": "b8315cc8",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -118,7 +118,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "a4c60f20",
+   "id": "5bdcfc52",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -129,7 +129,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "efd8bb6d",
+   "id": "0a78ff6c",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -139,7 +139,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "853ef3b0",
+   "id": "b41affaf",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -151,16 +151,16 @@
   },
   {
    "cell_type": "markdown",
-   "id": "d6d52fc1",
+   "id": "86be9259",
    "metadata": {},
    "source": [
-    "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env PATH. This is not needed when we are running from python."
+    "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env `PATH`. This is not needed when we are running from python."
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "6744e58d",
+   "id": "0e0d559e",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -172,7 +172,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "4005931f",
+   "id": "ea781840",
    "metadata": {},
    "source": [
     "## Coastlines"
@@ -181,7 +181,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "cc2bfa2e",
+   "id": "23dd6419",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -192,16 +192,16 @@
   },
   {
    "cell_type": "markdown",
-   "id": "d238263d",
+   "id": "3f95b851",
    "metadata": {},
    "source": [
-    "Without loss of generality we are using the GHSS intermediate resolution dataset"
+    "Without loss of generality we are using the `GHSS` intermediate resolution dataset"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "3d2426dd",
+   "id": "0ece63c4",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -212,7 +212,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "30e94710",
+   "id": "6f1c3b92",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -221,7 +221,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "c03e5997",
+   "id": "644e114f",
    "metadata": {},
    "source": [
     "## Case 1\n",
@@ -232,7 +232,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0d17d508",
+   "id": "4f7ebce5",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -247,7 +247,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "b6e6347a",
+   "id": "f5495489",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -257,7 +257,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "be971252",
+   "id": "6e52c851",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -267,7 +267,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "64232f90",
+   "id": "fb617ac3",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -277,7 +277,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "f6c97548",
+   "id": "07064f4c",
    "metadata": {},
    "source": [
     "## Case 2\n",
@@ -288,7 +288,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "062a65d2",
+   "id": "41e7140c",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -298,7 +298,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "de689b3e",
+   "id": "4e2e87dc",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -307,7 +307,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "81dc4a20",
+   "id": "f95981e2",
    "metadata": {},
    "source": [
     "*Note* that the global mesh is computed in a stereographic projection at lat=-90."
@@ -315,7 +315,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "7dde4479",
+   "id": "904bb7be",
    "metadata": {},
    "source": [
     "## Case 3\n",
@@ -326,7 +326,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "12dc62a5",
+   "id": "ee554947",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -336,7 +336,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "d63b15ab",
+   "id": "ce14fecf",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -346,7 +346,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "cfd64ed2",
+   "id": "da73d724",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -356,7 +356,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "a267e99d",
+   "id": "e51b16d9",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -365,7 +365,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "10e5138c",
+   "id": "7ae445a9",
    "metadata": {},
    "source": [
     "## Case 4 \n",
@@ -376,7 +376,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "a476ac5d",
+   "id": "f6ef5a33",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -386,7 +386,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "06d12d8c",
+   "id": "7f6f1b97",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -396,7 +396,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "6cbac4bb",
+   "id": "86158576",
    "metadata": {},
    "outputs": [],
    "source": [
diff --git a/Tutorial/DEM.ipynb b/Tutorial/DEM.ipynb
index 74bf0ba2..4a82ae56 100644
--- a/Tutorial/DEM.ipynb
+++ b/Tutorial/DEM.ipynb
@@ -26,7 +26,7 @@
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
@@ -186,7 +186,7 @@
     "\n",
     "Since the coastlines are the boundary for the grid generation it makes sense to have them matched to the bathymetric data. \n",
     "\n",
-    "pyposeidon tries to provide that (by default) when you provide a coastline dataset as argument. One can avoid that by setting `adjust_dem = False`."
+    "`pyposeidon` tries to provide that (by default) when you provide a coastline dataset as argument. One can avoid that by setting `adjust_dem = False`."
    ]
   },
   {
@@ -229,7 +229,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "- Retrieve again the bathymetry providing also the coastlines as argument. This time we use a local dem file."
+    "Retrieve again the bathymetry providing also the coastlines as argument. This time we use a local dem file."
    ]
   },
   {
@@ -292,15 +292,15 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## Interpolate on Grid"
+    "## Interpolate on Mesh"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "In order to create the model, bathymetry data need to be interpolated on grid.\n",
-    "Let's load a SCHISM grid,"
+    "In order to create the model, bathymetry data need to be interpolated on mesh.\n",
+    "With a SCHISM mesh, this works as"
    ]
   },
   {
@@ -345,7 +345,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "We can now use the grid's x,y to get the interpolated values."
+    "The mesh's x,y are used to get the interpolated values as"
    ]
   },
   {
@@ -377,7 +377,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "*Note* that since the bathymetry data is included within SCHISM's hgrid.gr3 file, the following demonstrates how to output the *.dep file for the Delft3D model.\n",
+    "*Note* that since the bathymetry data is included within SCHISM's hgrid.gr3 file, the following demonstrates how to output the *.dep file for the `Delft3D` model.\n",
     "\n",
     "We can create a simple 2D grid like,"
    ]
@@ -419,7 +419,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pdem.to_output(d.Dataset,solver='d3d', rpath='./test/')"
+    "pdem.to_output(d.Dataset,solver_name='d3d', rpath='./test/')"
    ]
   }
  ],
diff --git a/Tutorial/FORECAST.ipynb b/Tutorial/FORECAST.ipynb
index 9e8b471e..041a0b4d 100644
--- a/Tutorial/FORECAST.ipynb
+++ b/Tutorial/FORECAST.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "34d5e244",
+   "id": "7bb405fb",
    "metadata": {
     "tags": []
    },
@@ -12,10 +12,10 @@
   },
   {
    "cell_type": "markdown",
-   "id": "7921a6bc",
+   "id": "e820213a",
    "metadata": {},
    "source": [
-    "In an operational setting we do hotstart for the nect forecast from the latest simulation.\n",
+    "In an operational setting we do hotstart for the next forecast from the latest simulation.\n",
     "\n",
     "- Requires:\n",
     "\n",
@@ -25,19 +25,19 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "32a381c3",
+   "id": "025a1887",
    "metadata": {},
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "7ce8562f",
+   "id": "388ab58a",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -49,7 +49,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "084771bb",
+   "id": "7c73d0b3",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -58,7 +58,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "c1944a07",
+   "id": "4d89e6f2",
    "metadata": {},
    "source": [
     "### Graphics"
@@ -67,7 +67,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "a2b3f9ac",
+   "id": "b78deafa",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -77,7 +77,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ee19b4f3",
+   "id": "e5fb6dd1",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -88,7 +88,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "a56af936",
+   "id": "a92f6553",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -97,16 +97,16 @@
   },
   {
    "cell_type": "markdown",
-   "id": "d4f334b4",
+   "id": "1854a642",
    "metadata": {},
    "source": [
-    "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env PATH. This is not needed when we are running from python."
+    "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env `PATH`. This is not needed when we are running from python."
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "9b3762f1",
+   "id": "4f995626",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -119,7 +119,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c7251edd",
+   "id": "2b480a56",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -132,7 +132,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "e482c80f",
+   "id": "5defe1b7",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -150,7 +150,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "63167665",
+   "id": "7ec4f654",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -160,7 +160,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "c627069d",
+   "id": "eb06a1f9",
    "metadata": {},
    "source": [
     "## Setup"
@@ -168,7 +168,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "c8c79aad",
+   "id": "987b092b",
    "metadata": {},
    "source": [
     "The minimum information required is an initial model and corresponding run. We set this one up. For more info see the [MODEL](./MODEL.ipynb) Notebook.\n"
@@ -177,15 +177,13 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "3f60111a",
+   "id": "c3cf1ee8",
    "metadata": {},
    "outputs": [],
    "source": [
     "#define in a dictionary the properties of the model..\n",
-    "model={'solver':'schism',\n",
+    "model={'solver_name':'schism',\n",
     "     'geometry':{'lon_min' : -25,'lon_max' : -12.,'lat_min' : 56.,'lat_max' : 74.}, \n",
-    "#     'manning':.12, #uniform manning value\n",
-    "#     'windrot':0.00001, #uniform windrot value\n",
     "     'coastlines':ne_i, # coastlines\n",
     "     'mesh_generator' : 'jigsaw', # set grid generator \n",
     "     'start_date':'2018-10-1 0:0:0',\n",
@@ -193,7 +191,6 @@
     "     'meteo_source' : './data/uvp_2018100100.grib', #path to meteo files\n",
     "     'dem_source' : './data/dem.nc', #path to dem file\n",
     "     'rpath':'./test/forecast/20181001.00/', #location of calc folder\n",
-    "#     'update':['all'], #set which component should be updated  (meteo,dem,model)\n",
     "     'monitor':True, # get time series for observation points\n",
     "     'parameters':{'dt':400, 'rnday':3., 'nhot':1, 'ihot':0,'nspool':9, 'ihfskip':36, 'nhot_write':108 } # set param.in components\n",
     "    }"
@@ -201,7 +198,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "0c0f8d61",
+   "id": "ff5bab1a",
    "metadata": {},
    "source": [
     "* Note that the parameters arguments will override relevant settings"
@@ -209,7 +206,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "5bd7f7c2",
+   "id": "2c37603b",
    "metadata": {},
    "source": [
     "## Initialize"
@@ -218,7 +215,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "19cb04b2",
+   "id": "4f1153bd",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -229,7 +226,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "d6dc0d16",
+   "id": "085723e8",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -239,20 +236,18 @@
   },
   {
    "cell_type": "markdown",
-   "id": "940fd539",
+   "id": "c8dc8734",
    "metadata": {},
    "source": [
     "## Setup a (re)forecast\n",
     "\n",
-    "Let's assume we have a forecasting cycle where new meteo forcings become available every 12H.\n",
-    "\n",
-    "We setup a forecast process as"
+    "Let's assume we have a forecasting cycle where new meteo forcings become available every `12H`."
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "58f449a9",
+   "id": "b7b5fea3",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -262,7 +257,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ff230dcf",
+   "id": "a9b80a8f",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -276,7 +271,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "018091b8",
+   "id": "eecc10f6",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -289,7 +284,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "fab5e6fe",
+   "id": "61038969",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -300,16 +295,16 @@
   },
   {
    "cell_type": "markdown",
-   "id": "1d2b2e88",
+   "id": "30222232",
    "metadata": {},
    "source": [
-    "So now we can execute the forecast sequencially as"
+    "So the forecast is executed sequencially as"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "109d4344",
+   "id": "28b87a88",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -319,13 +314,13 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "b402e514",
+   "id": "ab979862",
    "metadata": {},
    "outputs": [],
    "source": [
     "for l in range(len(rpaths) - 1):\n",
     "\n",
-    "    fc = cast.set(solver='schism',\n",
+    "    fc = cast.set(solver_name='schism',\n",
     "            model=b,\n",
     "            ppath=rpaths[l],\n",
     "            cpath=rpaths[l + 1],\n",
diff --git a/Tutorial/GLOBAL.ipynb b/Tutorial/GLOBAL.ipynb
index 2abc3fd6..73e311b3 100644
--- a/Tutorial/GLOBAL.ipynb
+++ b/Tutorial/GLOBAL.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "b0c7e19e",
+   "id": "2b85ac2c",
    "metadata": {},
    "source": [
     "# Global Mesh"
@@ -10,7 +10,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "1090d884",
+   "id": "7b19cf33",
    "metadata": {},
    "source": [
     "This Notebook presents the workflow for developing global meshes. \n",
@@ -24,19 +24,19 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "dbaa18dc",
+   "id": "69eb2198",
    "metadata": {},
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "67974100",
+   "id": "c82ebb80",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -48,7 +48,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "b15dc2fa",
+   "id": "1c1ce291",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -57,7 +57,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "79af58ac",
+   "id": "d6c23769",
    "metadata": {},
    "source": [
     "### Graphics"
@@ -66,7 +66,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "fb11a952",
+   "id": "f56938e8",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -76,7 +76,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "623743a4",
+   "id": "2f5fbd24",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -86,7 +86,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0158e3e9",
+   "id": "6dc9ddcb",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -96,7 +96,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0424e5b0",
+   "id": "ef704059",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -106,7 +106,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "50c1be44",
+   "id": "cdd992ca",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -117,7 +117,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "d7c86474",
+   "id": "5e1411b9",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -128,7 +128,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "f2c06559",
+   "id": "29085125",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -139,7 +139,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "eb7c6980",
+   "id": "3909fbb7",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -149,7 +149,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "13f1d72a",
+   "id": "f349932a",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -161,16 +161,16 @@
   },
   {
    "cell_type": "markdown",
-   "id": "4dd1cd16",
+   "id": "4c1e8eda",
    "metadata": {},
    "source": [
-    "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env PATH. This is not needed when we are running from python."
+    "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env `PATH`. This is not needed when we are running from python."
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ccd285f3",
+   "id": "ee5e5607",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -182,7 +182,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "600aa36f",
+   "id": "2b8dd5fb",
    "metadata": {},
    "source": [
     "## Setup"
@@ -190,16 +190,16 @@
   },
   {
    "cell_type": "markdown",
-   "id": "f1e56cfd",
+   "id": "6a264231",
    "metadata": {},
    "source": [
-    "The minimum information required is the corresponding coastlines. They can be in a form that Geopandas can read or in a GeoDataFrame."
+    "The minimum information required is the corresponding coastlines. They can be in a form that `geopandas` can read or in a `GeoDataFrame`."
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "91ef8dc8",
+   "id": "ffc514fb",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -209,7 +209,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0610888e",
+   "id": "3bb5a6f8",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -219,7 +219,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "5054703e",
+   "id": "4fe121ad",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -228,10 +228,10 @@
   },
   {
    "cell_type": "markdown",
-   "id": "2cb3b3d4",
+   "id": "d4cc35da",
    "metadata": {},
    "source": [
-    "We define \"geometry\" as \"global\" and the engine for grid generation ('jigsaw' or 'gmsh').\n",
+    "We define \"areametry\" as \"global\" and the engine for grid generation ('jigsaw' or 'gmsh').\n",
     "\n",
     "*Note*: There is no default and the user needs to specify one."
    ]
@@ -239,11 +239,11 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "6f55740d",
+   "id": "747ec7cc",
    "metadata": {},
    "outputs": [],
    "source": [
-    "mesh = pmesh.set(type='tri2d', geometry='global', coastlines = w, mesh_generator = 'jigsaw', rpath='./test/global/' \n",
+    "mesh = pmesh.set(type='tri2d', geometry='global', coastlines = w, mesh_generator = 'gmsh', rpath='./test/global/' \n",
     "               ,use_bindings=True, #set this to False for gmsh binary\n",
     "              )"
    ]
@@ -251,7 +251,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "cfc0264d",
+   "id": "01ec7b29",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -260,7 +260,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "87c0b113",
+   "id": "7779b303",
    "metadata": {},
    "source": [
     "**TIP** : You can change the grid generator above with  grid_generator = 'gmsh'."
@@ -268,7 +268,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "f6565ae3",
+   "id": "e5b4b352",
    "metadata": {},
    "source": [
     "## Visualize"
@@ -276,7 +276,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "0f19f957",
+   "id": "36398f99",
    "metadata": {
     "tags": []
    },
@@ -287,7 +287,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "b20b8755",
+   "id": "85eae4f4",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -296,7 +296,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "bb9df9bd",
+   "id": "2aa67cbd",
    "metadata": {},
    "source": [
     "## Control mesh size"
@@ -304,7 +304,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "42cf4fe9",
+   "id": "b07bdd47",
    "metadata": {},
    "source": [
     "Better control on the mesh size can be obtained by providing a background control function usually in the form of a scaled DEM. One way to achieve this is to give as argument a dem file, like : "
@@ -313,23 +313,23 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "49c3c57f",
+   "id": "0662295b",
    "metadata": {},
    "outputs": [],
    "source": [
-    "mesh = pmesh.set(type='tri2d', geometry='global', coastlines = w, mesh_generator = 'jigsaw', \n",
+    "mesh = pmesh.set(type='tri2d', geometry='global', coastlines = w, mesh_generator = 'gmsh', \n",
     "                rpath = './test/global/',\n",
     "                dem_source='./data/dem.nc', \n",
-    "                resolution_min=0.01, resolution_max=.05,\n",
-    "               use_bindings=True, #set this to False for gmsh binary\n",
-    "#               DistMin=.0, DistMax=.1, SizeMin=.005, SizeMax=.02, MeshSizeMin=.001,MeshSizeMax=0.05, # GMSH additional settings\n",
+    "                resolution_min=0.001, resolution_max=.03,\n",
+    "                use_bindings=False, #set this to True for gmsh python bindings\n",
+    "               DistMin=.0, DistMax=.1, SizeMin=.005, SizeMax=.02, MeshSizeMin=.001,MeshSizeMax=0.05, # GMSH additional settings\n",
     "              )"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "80d65b07",
+   "id": "366f3517",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -339,17 +339,17 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "1a3d624b",
+   "id": "fa2f6fb9",
    "metadata": {},
    "outputs": [],
    "source": [
-    "mesh.bgmesh.pplot.mesh(lw=.5, markersize=.0)"
+    "mesh.bgmesh.pplot.mesh()"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "66e3fa51",
+   "id": "8befd793",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -359,24 +359,34 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ffc33c8c",
+   "id": "6f97d976",
    "metadata": {},
    "outputs": [],
    "source": [
     "mesh.Dataset.mplot.mesh(dim='3D')"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "7e4e5f20",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "mesh.Dataset"
+   ]
+  },
   {
    "cell_type": "markdown",
-   "id": "7db46dca",
+   "id": "bdfa26c6",
    "metadata": {},
    "source": [
-    "**TIP** : Change the grid generator above with  grid_generator = 'gmsh' to see how gmsh would do it."
+    "**TIP** : Change the grid generator above with  grid_generator = 'jigsaw' to see how `jigsaw` would do it."
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "d30896cc",
+   "id": "dcc21322",
    "metadata": {},
    "source": [
     "## Output"
@@ -385,7 +395,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "87f018d6",
+   "id": "0f72e75f",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -394,7 +404,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "139e5ae4",
+   "id": "5e45d993",
    "metadata": {},
    "source": [
     "## Read a given grid"
@@ -403,7 +413,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "38abe231",
+   "id": "50a9391e",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -412,7 +422,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "30b7edbc",
+   "id": "96755b8f",
    "metadata": {},
    "source": [
     "### Mesh Validation"
@@ -420,7 +430,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "528b3f86",
+   "id": "34fce865",
    "metadata": {},
    "source": [
     "If you model is SCHISM, the mesh can be validated against it as "
@@ -429,7 +439,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "074fda77",
+   "id": "7b81ed86",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -438,7 +448,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "d051dfa2",
+   "id": "b35461d2",
    "metadata": {},
    "source": [
     "### Grid Verification"
@@ -446,7 +456,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "c3488749",
+   "id": "271829df",
    "metadata": {},
    "source": [
     "The grid is created with a specific boundary defined, usually, as a coastline. In order to check whether that coastline is crossed by the generated grid we can use :"
@@ -455,7 +465,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "7998c43e",
+   "id": "fa958066",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -464,7 +474,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "47cdd79f",
+   "id": "e8d96348",
    "metadata": {},
    "source": [
     "*Note* : This is still under development and there is no distiction between 'intersection' and 'touch' for the grid. That is, the nodes could very well be **on** the boundary as they should. "
diff --git a/Tutorial/GSS.ipynb b/Tutorial/GSS.ipynb
index 8b35dbd9..28a407ca 100644
--- a/Tutorial/GSS.ipynb
+++ b/Tutorial/GSS.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "423e1a11",
+   "id": "2e1b4e41",
    "metadata": {},
    "source": [
     "# Earth Simulations"
@@ -10,7 +10,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "ddc84ea3",
+   "id": "5b4076fb",
    "metadata": {},
    "source": [
     "This Notebook presents a global storm surge run by pyposeidon. \n",
@@ -26,19 +26,19 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8a30e35c",
+   "id": "2570a9fb",
    "metadata": {},
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "36d4504f",
+   "id": "bf21b6a2",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -50,7 +50,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "480e8f1b",
+   "id": "3addc357",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -60,7 +60,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "4fd13826",
+   "id": "0fa22a86",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -70,7 +70,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "70d066be",
+   "id": "f4a00a40",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -82,7 +82,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "2f5001ca",
+   "id": "ba82111b",
    "metadata": {},
    "source": [
     "## Setting up and Executing a global model"
@@ -91,12 +91,12 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8be05b0a",
+   "id": "2f6e57e2",
    "metadata": {},
    "outputs": [],
    "source": [
     "#define in a dictionary the properties of the model..\n",
-    "model={'solver':'schism',\n",
+    "model={'solver_name':'schism',\n",
     "     'mesh_file':'./test/global/hgrid.gr3',\n",
     "     'start_date':'2011-01-1 0:0:0',\n",
     "     'time_frame':'12H',\n",
@@ -111,7 +111,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "7f21b04a",
+   "id": "b8bb0f60",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -121,7 +121,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "4f35c586",
+   "id": "22ad3e55",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -131,7 +131,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "3f2b2881",
+   "id": "7a3e044c",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -141,7 +141,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0fb35471",
+   "id": "52c1a1c2",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -151,7 +151,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "6bbb240f",
+   "id": "6ff10112",
    "metadata": {},
    "source": [
     "## Visualisations"
@@ -160,7 +160,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "4b25d0f9",
+   "id": "6f63ce2f",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -171,7 +171,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8720eee7",
+   "id": "c31124d1",
    "metadata": {},
    "outputs": [],
    "source": [
diff --git a/Tutorial/HINDCAST.ipynb b/Tutorial/HINDCAST.ipynb
index 6980bbb3..bad40cfb 100644
--- a/Tutorial/HINDCAST.ipynb
+++ b/Tutorial/HINDCAST.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "da38e1ba",
+   "id": "b0cc9915",
    "metadata": {
     "tags": []
    },
@@ -12,7 +12,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "d04122cf",
+   "id": "55aa5010",
    "metadata": {},
    "source": [
     "When doing a long hindcast simulation is preferable to split the process in several steps and use hotstarting for compliting the task.\n",
@@ -26,19 +26,19 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "87b5a306",
+   "id": "0afa2bff",
    "metadata": {},
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "a14bc45d",
+   "id": "bf0acd12",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -50,7 +50,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "3709a90f",
+   "id": "a386193d",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -59,7 +59,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "f85e78a2",
+   "id": "c92a0fb7",
    "metadata": {},
    "source": [
     "### Graphics"
@@ -68,7 +68,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "4c1155e8",
+   "id": "e598c4c1",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -78,7 +78,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "772a109e",
+   "id": "d6151cde",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -89,7 +89,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "d9844e47",
+   "id": "c5d0fa8a",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -98,16 +98,16 @@
   },
   {
    "cell_type": "markdown",
-   "id": "0de1b9ef",
+   "id": "7bb12d59",
    "metadata": {},
    "source": [
-    "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env PATH. This is not needed when we are running from python."
+    "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env `PATH`. This is not needed when we are running from python."
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "d068f1d0",
+   "id": "df0cdb10",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -120,7 +120,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "e0161e52",
+   "id": "79cf9f40",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -133,7 +133,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ee5858fd",
+   "id": "babf0b70",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -144,7 +144,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "e42810b8",
+   "id": "0d2cf9a6",
    "metadata": {},
    "source": [
     "Without loss of generality we are using the natural earth's intermediate resolution dataset as coastlines"
@@ -153,7 +153,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "33cef532",
+   "id": "ca7b2d33",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -168,7 +168,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "311fafe8",
+   "id": "41ffb94f",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -178,7 +178,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "a2c779ea",
+   "id": "e80f83d5",
    "metadata": {},
    "source": [
     "## Setup"
@@ -186,7 +186,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "9755b2c9",
+   "id": "006853b5",
    "metadata": {},
    "source": [
     "The minimum information required is an initial model and corresponding run. We set this one up. For more info see the [MODEL](./MODEL.ipynb) Notebook.\n"
@@ -195,15 +195,13 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "e30b15c8",
+   "id": "a0029c65",
    "metadata": {},
    "outputs": [],
    "source": [
     "#define in a dictionary the properties of the model..\n",
-    "model={'solver':'schism',\n",
+    "model={'solver_name':'schism',\n",
     "     'geometry':{'lon_min' : -25,'lon_max' : -12.,'lat_min' : 56.,'lat_max' : 74.}, \n",
-    "#     'manning':.12, #uniform manning value\n",
-    "#     'windrot':0.00001, #uniform windrot value\n",
     "     'coastlines':ne_i,\n",
     "     'mesh_generator' : 'jigsaw', # set grid generator \n",
     "     'start_date':'2011-01-1 0:0:0',\n",
@@ -211,15 +209,13 @@
     "     'meteo_source' : './data/era5.grib', #path to meteo files\n",
     "     'dem_source' : './data/dem.nc', #path to dem file\n",
     "     'rpath':'./test/hindcast/20110101.00/', #location of calc folder\n",
-    "#     'update':['all'], #set which component should be updated  (meteo,dem,model)\n",
-    "#     'monitor':True, # get time series for observation points\n",
     "     'parameters':{'dt':400, 'rnday':.5, 'nhot':1, 'ihot':0,'nspool':9, 'ihfskip':36, 'nhot_write':108 } # set param.in components\n",
     "    }"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "9efcfe27",
+   "id": "61c0f613",
    "metadata": {},
    "source": [
     "* Note that the parameters arguments will override relevant settings"
@@ -227,7 +223,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "901f5eb9",
+   "id": "0af8de5f",
    "metadata": {},
    "source": [
     "## Initialize"
@@ -236,7 +232,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "b6c7739f",
+   "id": "64e40e31",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -247,7 +243,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ef4d1bfa",
+   "id": "682e75f1",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -257,12 +253,12 @@
   },
   {
    "cell_type": "markdown",
-   "id": "a76be0f2",
+   "id": "adaa1c93",
    "metadata": {},
    "source": [
     "## Setup a hindcast\n",
     "\n",
-    "Let's assume we want to split the hindcast on a 12H splits. Doing a hindcast doesn't, in general, entail overlaping meteo forcing. However when more than one meteo file is needed one needs to be consistent into aligning the dates accordingly. There is an extra argument that provides that functionality (see documentation). \n",
+    "Let's assume we want to split the hindcast on a `12H` splits. Doing a hindcast doesn't, in general, entail overlaping meteo forcing. However when more than one meteo file is needed one needs to be consistent into aligning the dates accordingly. There is an extra argument that provides that functionality (see documentation). \n",
     "\n",
     "We setup the hindcast process as"
    ]
@@ -270,7 +266,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0cccd4bd",
+   "id": "35f8898a",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -282,7 +278,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "84e5000e",
+   "id": "791cf7db",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -296,7 +292,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "48522b1e",
+   "id": "4f74f74d",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -308,7 +304,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "37eb16e2",
+   "id": "a1e05079",
    "metadata": {},
    "source": [
     "So now we can execute the cast sequencially as"
@@ -317,13 +313,13 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "abc9af34",
+   "id": "cbfe869b",
    "metadata": {},
    "outputs": [],
    "source": [
     "for l in range(len(rpaths) - 1):\n",
     "\n",
-    "    fc = cast.set(solver='schism',\n",
+    "    fc = cast.set(solver_name='schism',\n",
     "            model=b,\n",
     "            ppath=rpaths[l],\n",
     "            cpath=rpaths[l + 1],\n",
@@ -335,7 +331,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "fb6c2f1b",
+   "id": "6e646caf",
    "metadata": {},
    "source": [
     "## Output"
@@ -343,7 +339,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "8ab9336c",
+   "id": "9af80e0e",
    "metadata": {},
    "source": [
     "The output data can be combined using the data utility as"
@@ -352,7 +348,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "1d8a4131",
+   "id": "3b1c04dd",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -362,7 +358,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "57d6f9df",
+   "id": "ee0e1226",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -372,7 +368,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "e78667ec",
+   "id": "d8944969",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -382,7 +378,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0869e1ca",
+   "id": "9354e870",
    "metadata": {},
    "outputs": [],
    "source": [
diff --git a/Tutorial/HOTSTART.ipynb b/Tutorial/HOTSTART.ipynb
index cab60566..52f36cb3 100644
--- a/Tutorial/HOTSTART.ipynb
+++ b/Tutorial/HOTSTART.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "97a99050",
+   "id": "eb60be1e",
    "metadata": {
     "tags": []
    },
@@ -12,10 +12,10 @@
   },
   {
    "cell_type": "markdown",
-   "id": "fe360950",
+   "id": "946b0f17",
    "metadata": {},
    "source": [
-    "Many times one needs to split a simulation in intermittend steps. This is true for long hindacts and forecasts. This Notebook outlines the hotstart process using the schism solver. \n",
+    "Many times one needs to split a simulation in intermittent steps. This is true for long hindacts and forecasts. This Notebook outlines the hotstart process using the `schism` solver. \n",
     "\n",
     "\n",
     "- Requires:\n",
@@ -26,19 +26,19 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "f7ddeb58",
+   "id": "e11ecbdb",
    "metadata": {},
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "bab00977",
+   "id": "0afd7b78",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -50,7 +50,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "14ed34d9",
+   "id": "da671b06",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -59,7 +59,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "f185d681",
+   "id": "321afe77",
    "metadata": {},
    "source": [
     "### Graphics"
@@ -68,7 +68,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0937998d",
+   "id": "5cef821e",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -78,7 +78,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "a2f074ab",
+   "id": "f697b162",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -89,7 +89,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0d3e7fb3",
+   "id": "ade72fa4",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -98,7 +98,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "991b2432",
+   "id": "fbb0f6dd",
    "metadata": {},
    "source": [
     "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env PATH. This is not needed when we are running from python."
@@ -107,7 +107,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "01aa2653",
+   "id": "7cbf5807",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -120,7 +120,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c0aa1bfa",
+   "id": "0bc27ce7",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -133,7 +133,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "553cb88d",
+   "id": "a7fad952",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -144,7 +144,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "2aeecb83",
+   "id": "a9f2402a",
    "metadata": {},
    "source": [
     "Without loss of generality we are using the natural earth's intermediate resolution dataset as coastlines"
@@ -153,7 +153,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "81732a61",
+   "id": "457c8793",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -168,7 +168,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "9b018ff6",
+   "id": "6765e189",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -178,7 +178,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "6798ecff",
+   "id": "b3999e6e",
    "metadata": {},
    "source": [
     "## Setup"
@@ -186,7 +186,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "7c663062",
+   "id": "84368a8b",
    "metadata": {},
    "source": [
     "The minimum information required is an initial model and corresponding run. We set this one up. For more info see the [MODEL](./MODEL.ipynb) Notebook.\n"
@@ -195,15 +195,13 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "21d001d6",
+   "id": "bc947db9",
    "metadata": {},
    "outputs": [],
    "source": [
     "#define in a dictionary the properties of the model..\n",
-    "model={'solver':'schism',\n",
+    "model={'solver_name':'schism',\n",
     "     'geometry':{'lon_min' : -25,'lon_max' : -12.,'lat_min' : 56.,'lat_max' : 74.}, \n",
-    "#     'manning':.12, #uniform manning value\n",
-    "#     'windrot':0.00001, #uniform windrot value\n",
     "     'coastlines':ne_i,\n",
     "     'mesh_generator' : 'jigsaw', # set grid generator \n",
     "     'meteo_engine':'cfgrib',\n",
@@ -212,15 +210,13 @@
     "     'meteo_source' : './data/uvp_2018100100.grib', #path to meteo files\n",
     "     'dem_source' : './data/dem.nc', #path to dem file\n",
     "     'rpath':'./test/hotstart/step1/', #location of calc folder\n",
-    "#     'update':['all'], #set which component should be updated  (meteo,dem,model)\n",
-    "#     'monitor':True, # get time series for observation points\n",
-    "     'parameters':{'dt':400, 'rnday':1., 'nhot':1, 'ihot':0,'nspool':9, 'ihfskip':36, 'nhot_write':108 } # set param.in components\n",
+    "     'parameters':{'dt':400, 'rnday':1., 'nhot':1, 'ihot':0,'nspool':9, 'ihfskip':36, 'nhot_write':108 } # set param.nml components\n",
     "    }"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "932fe99c",
+   "id": "b4a2e57c",
    "metadata": {},
    "source": [
     "* Note that the parameters arguments will override relevant settings"
@@ -228,7 +224,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "35b029e8",
+   "id": "294d70f7",
    "metadata": {},
    "source": [
     "## Initialize"
@@ -237,7 +233,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "556d945e",
+   "id": "70469aa6",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -248,7 +244,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "17f317be",
+   "id": "9c70decb",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -258,7 +254,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "bfa39ef1",
+   "id": "d43545b5",
    "metadata": {},
    "source": [
     "*Note* that hotstart files have been created (check ./test/hotstart/step1/outputs)"
@@ -266,7 +262,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "8fd45770",
+   "id": "d374d618",
    "metadata": {},
    "source": [
     "## Use the cast module to do a hotstart"
@@ -275,7 +271,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "fc8fae47",
+   "id": "1b5023a3",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -287,7 +283,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "50cf3115",
+   "id": "09f9ab61",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -298,7 +294,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8bd6a0b6",
+   "id": "f264246e",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -309,11 +305,11 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "12f9450a",
+   "id": "943604ab",
    "metadata": {},
    "outputs": [],
    "source": [
-    "rs = cast.set(solver='schism',\n",
+    "rs = cast.set(solver_name='schism',\n",
     "        model=b, #reference model\n",
     "        ppath=b.rpath, #original path\n",
     "        cpath=new_path, #new path\n",
@@ -326,7 +322,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "cb500b8d",
+   "id": "09b6206b",
    "metadata": {},
    "outputs": [],
    "source": [
diff --git a/Tutorial/MESH.ipynb b/Tutorial/MESH.ipynb
index 40a2fc84..0232300c 100644
--- a/Tutorial/MESH.ipynb
+++ b/Tutorial/MESH.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "f0626f1b",
+   "id": "c21a9c50",
    "metadata": {},
    "source": [
     "# The Mesh module"
@@ -10,7 +10,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "9361b069",
+   "id": "e1e60f11",
    "metadata": {},
    "source": [
     "The mesh module handles mesh creation/integration based on given boundaries. \n",
@@ -24,19 +24,19 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "7a9fde06",
+   "id": "251c6d64",
    "metadata": {},
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "164cf921",
+   "id": "5a8598ea",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -48,7 +48,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0cf0f4dc",
+   "id": "7c9ea006",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -57,7 +57,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "78e1e559",
+   "id": "8538cc55",
    "metadata": {},
    "source": [
     "### Graphics"
@@ -66,7 +66,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "3bcebea7",
+   "id": "4000cd49",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -76,7 +76,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "e57482f9",
+   "id": "c99b1d37",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -86,7 +86,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "4c738390",
+   "id": "e7911c13",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -96,7 +96,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "6a16ddf3",
+   "id": "a6e931e6",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -107,7 +107,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "99bf204c",
+   "id": "8e5a31f5",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -118,7 +118,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "776e29cf",
+   "id": "bcbccaf6",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -128,7 +128,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "08d2a990",
+   "id": "d089efda",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -140,7 +140,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "2d5210af",
+   "id": "573bfe31",
    "metadata": {},
    "source": [
     "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env PATH. This is not needed when we are running from python."
@@ -149,7 +149,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "3cbe1b93",
+   "id": "2f35107d",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -161,7 +161,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "ceefba29",
+   "id": "a50816de",
    "metadata": {},
    "source": [
     "## Setup"
@@ -169,7 +169,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "59ce32fc",
+   "id": "30ed0d79",
    "metadata": {},
    "source": [
     "The minimum information required is the geometry's extent. In the most simple case that is a lat/lon box that defines the area of interest. Without loss of generality we select below Iceland as a test case. Feel free to modify the coordinates. \n",
@@ -182,7 +182,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "4757eabd",
+   "id": "0aba11b3",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -197,7 +197,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "fe121984",
+   "id": "a5218577",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -215,7 +215,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "1f6db5d5",
+   "id": "50135eeb",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -225,7 +225,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "7c6c388c",
+   "id": "ad48113b",
    "metadata": {},
    "source": [
     "We need to provide the type of element that we want (for now 'r2d' or 'tri2d' ) and the engine for grid generation ('jigsaw' or 'gmsh')."
@@ -234,7 +234,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "97ad7d86",
+   "id": "8a7d22de",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -244,7 +244,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "02b32a34",
+   "id": "5df9dbb8",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -253,7 +253,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "f28cc735",
+   "id": "8b923edc",
    "metadata": {},
    "source": [
     "**TIP** : You can change the mesh generator above with  mesh_generator = 'gmsh'."
@@ -261,7 +261,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "922b13d1",
+   "id": "7de02a09",
    "metadata": {},
    "source": [
     "## Visualize"
@@ -269,7 +269,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "67f7da3c",
+   "id": "6f3c9a40",
    "metadata": {
     "tags": []
    },
@@ -280,16 +280,16 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "f63c5a0e",
+   "id": "46d29ba2",
    "metadata": {},
    "outputs": [],
    "source": [
-    "mesh.Dataset.pplot.mesh(lw=.5, markersize=.2)"
+    "mesh.Dataset.pplot.mesh()"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "3c756299",
+   "id": "8a00f984",
    "metadata": {},
    "source": [
     "One can overlay the coastlines on the graph with "
@@ -298,7 +298,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c60e2497",
+   "id": "892054ab",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -308,7 +308,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "d0737bd0",
+   "id": "c14b6157",
    "metadata": {
     "tags": []
    },
@@ -319,7 +319,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "4d84e92b",
+   "id": "fef4fcfd",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -328,7 +328,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "2e8798ba",
+   "id": "e6ce3380",
    "metadata": {},
    "source": [
     "## Control mesh size"
@@ -336,7 +336,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "2ed72ffb",
+   "id": "f110ec7f",
    "metadata": {},
    "source": [
     "Better control on the mesh size can be obtained by providing a background control function usually in the form of a scaled DEM. One way to achieve this is to give as argument a dem file, like : "
@@ -345,7 +345,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "70b5c7b0",
+   "id": "e0ecff20",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -356,16 +356,28 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ce825c55",
+   "id": "054d9310",
    "metadata": {},
    "outputs": [],
    "source": [
-    "mesh.Dataset.pplot.mesh(lw=.5, markersize=.2)"
+    "# The background scale function is..\n",
+    "plt.figure()\n",
+    "mesh.bgmesh.h.plot()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "63b541e3",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "mesh.Dataset.pplot.mesh()"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "a88259cf",
+   "id": "09e0956a",
    "metadata": {},
    "source": [
     "**TIP** : Change the grid generator above with  grid_generator = 'gmsh' to see how gmsh would do it."
@@ -373,7 +385,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "313e932c",
+   "id": "0d80603f",
    "metadata": {},
    "source": [
     "## Output"
@@ -382,7 +394,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "e919dc50",
+   "id": "c3c86717",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -391,7 +403,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "397b11f4",
+   "id": "d082fd69",
    "metadata": {},
    "source": [
     "## Read a given grid"
@@ -400,7 +412,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "44e2236d",
+   "id": "748f91d7",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -410,7 +422,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "f9149d5f",
+   "id": "e25a7958",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -419,7 +431,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "2fbb3fad",
+   "id": "921a0d3e",
    "metadata": {},
    "source": [
     "### Mesh Validation"
@@ -427,7 +439,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "1722fa64",
+   "id": "b9bfc81a",
    "metadata": {},
    "source": [
     "If you model is SCHISM, the mesh can be validated against it as "
@@ -436,7 +448,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "40552de7",
+   "id": "3d2282b3",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -445,24 +457,24 @@
   },
   {
    "cell_type": "markdown",
-   "id": "0b403b8b",
+   "id": "902c02a3",
    "metadata": {},
    "source": [
-    "### Grid Verification"
+    "### Mesh Verification"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "433ae868",
+   "id": "0c182bd3",
    "metadata": {},
    "source": [
-    "The grid is created with a specific boundary defined, usually, as a coastline. In order to check whether that coastline is crossed by the generated grid we can use :"
+    "The mesh is created with a specific boundary defined, usually, as a coastline. In order to check whether that coastline is crossed by the generated mesh we can use :"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "7b25e03b",
+   "id": "ae38d9e1",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -471,7 +483,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "7e99bee2",
+   "id": "4871d54d",
    "metadata": {},
    "source": [
     "*Note* : This is still under development and there is no distiction between 'intersection' and 'touch' for the grid. That is, the nodes could very well be **on** the boundary as they should. "
diff --git a/Tutorial/METEO.ipynb b/Tutorial/METEO.ipynb
index c1454e5d..89e88502 100644
--- a/Tutorial/METEO.ipynb
+++ b/Tutorial/METEO.ipynb
@@ -28,7 +28,7 @@
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
@@ -49,7 +49,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "import pyposeidon.meteo as pt"
+    "import pyposeidon.meteo as pmeteo"
    ]
   },
   {
@@ -147,7 +147,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "The minimum information required is the geometry's extent. In the most simple case that is a lat/lon box that defines the area of interest. Without loss of generality we select below Iceland as a test case. Feel free to modify the coordinates. "
+    "The minimum information required is the geometry's extent. In the most simple case that is a lat/lon box that defines the area of interest. Without loss of generality we select below Iceland as a test case. Feel free to modify the coordinates."
    ]
   },
   {
@@ -208,7 +208,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "meteo = pt.Meteo(url, **geometry)"
+    "meteo = pmeteo.Meteo(url, **geometry)"
    ]
   },
   {
@@ -235,7 +235,7 @@
     "\n",
     "This means that there is a sequence of files that overlap in terms of time reference as new forecasts become available. \n",
     "\n",
-    "pyposeidon provides a way to merge these data in a number of ways."
+    "`pyposeidon` provides a way to merge these data in a number of ways."
    ]
   },
   {
@@ -276,7 +276,7 @@
    "outputs": [],
    "source": [
     "#get uvp\n",
-    "meteo = pt.Meteo(**dic)"
+    "meteo = pmeteo.Meteo(**dic)"
    ]
   },
   {
@@ -315,7 +315,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "meteo_ = pt.Meteo(meteo_source=meteo.Dataset)"
+    "meteo_ = pmeteo.Meteo(meteo_source=meteo.Dataset)"
    ]
   },
   {
@@ -340,7 +340,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "meteo_= pt.Meteo()"
+    "meteo_= pmeteo.Meteo()"
    ]
   },
   {
@@ -380,7 +380,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Since the meteo Dataset is a xarray dataset all integrated viz extentions can be used to visualize the datasets."
+    "Since the meteo Dataset is an `xarray` dataset all integrated viz extentions can be used to visualize the datasets."
    ]
   },
   {
@@ -410,7 +410,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "pyposeidon provides the option to get also animation as"
+    "`pyposeidon` provides the option to get also animation as"
    ]
   },
   {
@@ -435,7 +435,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "meteo.Dataset.msl.hvplot.contourf(x='longitude',y='latitude',cmap='viridis')"
+    "meteo.Dataset.msl.drop(['rtime','valid_time']).hvplot.contourf(x='longitude',y='latitude', cmap='viridis')"
    ]
   },
   {
@@ -470,7 +470,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "meteo.Dataset.msl.hvplot(x='longitude',y='latitude',geo=True, cmap='viridis', width=800, height=400) * g50 * gf.borders()"
+    "meteo.Dataset.msl.drop(['rtime','valid_time']).hvplot(x='longitude',y='latitude',geo=True, cmap='viridis', width=800, height=400) * g50 * gf.borders()"
    ]
   },
   {
@@ -497,7 +497,7 @@
    "outputs": [],
    "source": [
     "#save to DELFT3D format\n",
-    "meteo.to_output(solver='d3d',rpath='./test/') # to u,v,p for d3d"
+    "meteo.to_output(solver_name='d3d',rpath='./test/') # to u,v,p for d3d"
    ]
   },
   {
@@ -507,7 +507,7 @@
    "outputs": [],
    "source": [
     "#save to SCHISM format\n",
-    "meteo.to_output(solver='schism',rpath='./test/')"
+    "meteo.to_output(solver_name='schism',rpath='./test/')"
    ]
   },
   {
@@ -524,7 +524,7 @@
    "outputs": [],
    "source": [
     "# split into more files\n",
-    "meteo.to_output(solver='schism',rpath='./test/', meteo_split_by='day')"
+    "meteo.to_output(solver_name='schism',rpath='./test/', meteo_split_by='day')"
    ]
   },
   {
@@ -534,7 +534,7 @@
    "outputs": [],
    "source": [
     "# Define index for meteo (for SCHISM)\n",
-    "meteo.to_output(solver='schism',rpath='./test/', m_index=2)"
+    "meteo.to_output(solver_name='schism',rpath='./test/', m_index=2)"
    ]
   }
  ],
diff --git a/Tutorial/MODEL.ipynb b/Tutorial/MODEL.ipynb
index c3db1b07..0cf58969 100644
--- a/Tutorial/MODEL.ipynb
+++ b/Tutorial/MODEL.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "f3c4fdef",
+   "id": "2e3e73eb",
    "metadata": {
     "tags": []
    },
@@ -12,7 +12,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "dcb5a1e4",
+   "id": "b55dcdc7",
    "metadata": {},
    "source": [
     "The top module handles the main setup of the instance. \n",
@@ -26,19 +26,19 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "431fcee0",
+   "id": "c7dc5c43",
    "metadata": {},
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "16a0b12d",
+   "id": "aca5a378",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -50,7 +50,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "928bfb07",
+   "id": "cac5ab42",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -59,7 +59,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "ddb46019",
+   "id": "66071b72",
    "metadata": {},
    "source": [
     "### Graphics"
@@ -68,7 +68,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "10ee698b",
+   "id": "356b1f61",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -78,7 +78,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "11c583f5",
+   "id": "dc0b09e2",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -89,7 +89,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "64324776",
+   "id": "f2817124",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -98,7 +98,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "5d35f7de",
+   "id": "6a6d2620",
    "metadata": {},
    "source": [
     "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env PATH. This is not needed when we are running from python."
@@ -107,7 +107,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "f2e8a177",
+   "id": "4c745b1b",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -120,7 +120,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "b1604edb",
+   "id": "9fb41bc5",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -132,7 +132,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "011bb5b0",
+   "id": "598b91bf",
    "metadata": {},
    "source": [
     "## Setup"
@@ -140,7 +140,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "b895c531",
+   "id": "93bcdedd",
    "metadata": {},
    "source": [
     "The minimum information required is the geometry's extent. In the most simple case that is a lat/lon box that defines the area of interest. Without loss of generality we select below Iceland as a test case. Feel free to modify the coordinates. \n",
@@ -153,7 +153,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "d69f97ac",
+   "id": "15b6d59b",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -171,7 +171,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "1bbed75f",
+   "id": "5a2151f9",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -182,12 +182,12 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "df586bbd",
+   "id": "a0d18560",
    "metadata": {},
    "outputs": [],
    "source": [
     "#define in a dictionary the properties of the model..\n",
-    "model={'solver':'schism',\n",
+    "model={'solver_name':'schism',\n",
     "     'geometry':{'lon_min' : -25,'lon_max' : -12.,'lat_min' : 56.,'lat_max' : 74.},\n",
     "     'coastlines':ne_i,  # coastlines\n",
     "#     'manning':.12, #uniform manning value\n",
@@ -202,13 +202,13 @@
     "     'rpath':'./test/schism/', #location of calc folder\n",
     "#     'update':['all'], #set which component should be updated  (meteo,dem,model)\n",
     "#     'monitor':True, # get time series for observation points\n",
-    "#     'parameters':{'dt':400, 'rnday':.5, 'hotout':1, 'ihot':0,'nspool':9, 'ihfskip':36, 'hotout_write':108 } # set param.in components\n",
+    "#     'parameters':{'dt':400, 'rnday':.5, 'hotout':1, 'ihot':0,'nspool':9, 'ihfskip':36, 'hotout_write':108 } # set param.nml components\n",
     "    }"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "397fd534",
+   "id": "dbe6859d",
    "metadata": {},
    "source": [
     "## Initialize"
@@ -217,7 +217,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "7745bf2b",
+   "id": "a5579622",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -227,7 +227,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "07220800",
+   "id": "b798571e",
    "metadata": {},
    "source": [
     "## Step by Step process"
@@ -236,7 +236,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "49fcca8f",
+   "id": "72e0ce36",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -246,7 +246,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ab11ca83",
+   "id": "acdc35fb",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -256,7 +256,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "219b3b58",
+   "id": "c40436e9",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -266,7 +266,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8680ed9b",
+   "id": "b088274b",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -276,7 +276,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "3d9fbdf7",
+   "id": "405739f1",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -285,7 +285,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "1680f508",
+   "id": "4bb8672d",
    "metadata": {},
    "source": [
     "## ... or simply in one step\n"
@@ -294,7 +294,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ff488422",
+   "id": "a8957dd6",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -305,7 +305,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "a64b4e5d",
+   "id": "4fd6fac9",
    "metadata": {},
    "source": [
     "The various datasets incorporated in the model can be accessed independently as attributes, namely :"
@@ -313,7 +313,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "44666243",
+   "id": "7c966830",
    "metadata": {},
    "source": [
     "- Meteo"
@@ -322,7 +322,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "88f5f944",
+   "id": "3adcd3b0",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -332,7 +332,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "5b01a6b4",
+   "id": "fda43cb1",
    "metadata": {},
    "source": [
     "- Mesh"
@@ -341,16 +341,16 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "68fae500",
+   "id": "e0cb7609",
    "metadata": {},
    "outputs": [],
    "source": [
-    "b.mesh.Dataset.hplot.mesh(lw=.5, markersize=.2) "
+    "b.mesh.Dataset.hplot.mesh() "
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "3a9aa8b2",
+   "id": "4245edff",
    "metadata": {},
    "source": [
     "- Dem"
@@ -359,7 +359,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "2aaca58d",
+   "id": "ce61dd43",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -368,7 +368,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "6e823ca7",
+   "id": "6301c07c",
    "metadata": {},
    "source": [
     "- Coastlines"
@@ -377,7 +377,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "2ea0f6ab",
+   "id": "e7f11425",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -386,7 +386,25 @@
   },
   {
    "cell_type": "markdown",
-   "id": "f01bbefc",
+   "id": "a5c6208f",
+   "metadata": {},
+   "source": [
+    "- Boundaries"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "7ffdcae7",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "b.mesh.boundary.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3e936652",
    "metadata": {},
    "source": [
     "## Output"
@@ -394,7 +412,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "108b6186",
+   "id": "0642af80",
    "metadata": {},
    "source": [
     "The output of the simulations could be in separate files (due to MPI) or specific folders. pyposeidon can incorporate the resulting Datasets with "
@@ -403,7 +421,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "84f94831",
+   "id": "edee32bb",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -413,7 +431,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "e523817c",
+   "id": "35a2c144",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -423,7 +441,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "f607761e",
+   "id": "10a1de6a",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -433,7 +451,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "2b171a6e",
+   "id": "c26c9ea0",
    "metadata": {
     "tags": []
    },
@@ -445,27 +463,37 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "265738bd",
+   "id": "b4256c07",
    "metadata": {},
    "outputs": [],
    "source": [
-    "out.pplot.mesh(lw=.3, markersize=1)"
+    "out.pplot.mesh()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "99543e8f",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "out"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c52bb33e",
+   "id": "773cc5a5",
    "metadata": {},
    "outputs": [],
    "source": [
-    "out.pplot.contourf(var='depth' ,vmin=out.depth.min(), vmax=out.depth.max())"
+    "out.pplot.contourf(var='depth')"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "eab515a5",
+   "id": "88bd5215",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -474,7 +502,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "e67f6ac1",
+   "id": "fc1eeecd",
    "metadata": {},
    "source": [
     "### with hvplot"
@@ -483,17 +511,17 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "b140a34a",
+   "id": "a0cf4968",
    "metadata": {},
    "outputs": [],
    "source": [
-    "out.hplot.contourf(var='depth' , vmin=out.depth.min(), vmax=out.depth.max())#,tiles=True)"
+    "out.hplot.contourf(var='depth')#,tiles=True)"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "afff4fd7",
+   "id": "3084498c",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -502,7 +530,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "bf42d02e",
+   "id": "dab51e7b",
    "metadata": {},
    "source": [
     "### Animate"
@@ -511,7 +539,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "52e773e4",
+   "id": "494c484d",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -522,7 +550,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "5e530c07",
+   "id": "37ad3906",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -532,7 +560,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c3bff9d6",
+   "id": "b06c0fd4",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -541,7 +569,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "e1fa8667",
+   "id": "9741c129",
    "metadata": {},
    "source": [
     "## Read Model"
@@ -549,26 +577,26 @@
   },
   {
    "cell_type": "markdown",
-   "id": "5d5df7d0",
+   "id": "dcb38bee",
    "metadata": {},
    "source": [
-    "If a model is created by pyposeidon then there is a .json file that describes the model. One can read into pyposeidon such a model with "
+    "If a model is created by `pyposeidon` then there is a `json` file that describes the model. Such a file can be read into `pyposeidon` with "
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "75be220b",
+   "id": "c5c0555f",
    "metadata": {},
    "outputs": [],
    "source": [
-    "a = pyposeidon.read('./test/schism/schism_model.json')"
+    "a = pyposeidon.model.read('./test/schism/schism_model.json')"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "4f548772",
+   "id": "80e32da8",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -577,26 +605,26 @@
   },
   {
    "cell_type": "markdown",
-   "id": "dfabf85e",
+   "id": "12ec7eeb",
    "metadata": {},
    "source": [
-    "However, there might be a model created by other means. pyposeidon does it's best to incorporate such model with"
+    "However, there might be a model created by other means. `pyposeidon` does its best to incorporate such model with"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "7eff4a30",
+   "id": "39a6005e",
    "metadata": {},
    "outputs": [],
    "source": [
-    "c = pm.set(solver='schism', rfolder = './test/schism/', load_mesh=True, load_meteo=True)"
+    "c = pm.set(solver_name='schism', rfolder = './test/schism/', load_mesh=True, load_meteo=True)"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "2f6e7226",
+   "id": "3f5254c4",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -606,7 +634,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "f02404c2",
+   "id": "c2b4eaac",
    "metadata": {},
    "outputs": [],
    "source": [
diff --git a/Tutorial/SKILL.ipynb b/Tutorial/SKILL.ipynb
index bc475002..643aa091 100644
--- a/Tutorial/SKILL.ipynb
+++ b/Tutorial/SKILL.ipynb
@@ -2,20 +2,20 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "c49a091e",
+   "id": "519fe964",
    "metadata": {
     "tags": []
    },
    "source": [
-    "# Station Validation of forecasts"
+    "# Forecast Skill"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "c4c251b1",
+   "id": "1bc0c07c",
    "metadata": {},
    "source": [
-    "Validation of operational systems usually include comparison with observational data in specific locations. This Notebook outlines the procedure using pyposeidon. \n",
+    "Validation of operational systems usually includes skill assessment. This Notebook outlines the procedure using `pyposeidon`. \n",
     "\n",
     "\n",
     "- Requires:\n",
@@ -28,19 +28,19 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "5c2f6a54",
+   "id": "ad4fa4d1",
    "metadata": {},
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8dea2aae",
+   "id": "b3cbe861",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -52,7 +52,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8c5c3218",
+   "id": "74a1ab05",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -62,7 +62,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "7ba8baf7",
+   "id": "e71e22e3",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -72,7 +72,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "819b1539",
+   "id": "cf2569a4",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -81,7 +81,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "42efc74e",
+   "id": "9d2bc0e3",
    "metadata": {},
    "source": [
     "### Graphics"
@@ -90,7 +90,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "78ed71b5",
+   "id": "66d5c8a6",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -100,7 +100,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "9ccb1120",
+   "id": "ba12b66b",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -111,7 +111,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "687d8c11",
+   "id": "34d3102c",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -120,16 +120,16 @@
   },
   {
    "cell_type": "markdown",
-   "id": "5b417ff1",
+   "id": "56f3744a",
    "metadata": {},
    "source": [
-    "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env PATH. This is not needed when we are running from python."
+    "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env `PATH`. This is not needed when we are running from python."
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "315c83c0",
+   "id": "a9dae22f",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -142,7 +142,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8c40310f",
+   "id": "40d16b5d",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -154,7 +154,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "63b29167",
+   "id": "c4cf1607",
    "metadata": {},
    "source": [
     "## Setup"
@@ -162,7 +162,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "73d8c2ae",
+   "id": "8aed3d11",
    "metadata": {},
    "source": [
     "We will use the output of the [FORECAST](./FORECAST.ipynb) Notebook. Make sure you have executed that before.\n"
@@ -170,7 +170,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "cea52ed1",
+   "id": "33e32108",
    "metadata": {},
    "source": [
     "The runs are all in different folders and we want to consolidate the station time series.\n",
@@ -180,7 +180,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "cd07b37c",
+   "id": "36b62aaa",
    "metadata": {},
    "source": [
     "We define the folders involved"
@@ -189,7 +189,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "df36f1d1",
+   "id": "7e9e0937",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -199,7 +199,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "73d335a1",
+   "id": "4bc84ac4",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -210,7 +210,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "52ad08b1",
+   "id": "a964f354",
    "metadata": {},
    "source": [
     "We combine all available data with"
@@ -219,7 +219,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "970bafdf",
+   "id": "611a3076",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -229,7 +229,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "f27783b7",
+   "id": "de988751",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -239,7 +239,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ca5b65ad",
+   "id": "42a48d06",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -249,7 +249,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "3b7b815e",
+   "id": "a1852016",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -259,7 +259,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "807c5295",
+   "id": "5babebe5",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -269,7 +269,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "80c9109f",
+   "id": "4a4cd5d6",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -280,7 +280,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "858c5045",
+   "id": "401319f3",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -292,7 +292,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "2e6b315b",
+   "id": "cab66dff",
    "metadata": {},
    "source": [
     "## Estimate forecasting skill"
@@ -301,7 +301,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "be2cec06",
+   "id": "a19a5a59",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -312,7 +312,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "df203afe",
+   "id": "04d7891a",
    "metadata": {},
    "source": [
     "Using the dataset (vdata), the indicator (RMSE) and the node (1) we can get the relative skill for 12,24,36,48,60,72 forecast lead time"
@@ -321,7 +321,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "09bcf4ed",
+   "id": "06a63255",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -331,7 +331,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "bf35637c",
+   "id": "d5da4c22",
    "metadata": {},
    "outputs": [],
    "source": [
diff --git a/Tutorial/UTILS.ipynb b/Tutorial/UTILS.ipynb
index 498d073c..8705ba8f 100644
--- a/Tutorial/UTILS.ipynb
+++ b/Tutorial/UTILS.ipynb
@@ -2,18 +2,18 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "8f1eafa9",
+   "id": "1817362a",
    "metadata": {},
    "source": [
-    "# Various available utilities "
+    "# Various utilities "
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "4b857214",
+   "id": "2deef54a",
    "metadata": {},
    "source": [
-    "This Notebook presents some usefull utilities included in pyposeidon. \n",
+    "This Notebook presents some usefull utilities included in `pyposeidon`. \n",
     "\n",
     "\n",
     "- Requires:\n",
@@ -26,19 +26,19 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0e14c6f8",
+   "id": "d81f8cd7",
    "metadata": {},
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "a2127bfc",
+   "id": "d15fe22e",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -50,7 +50,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "d1c242c0",
+   "id": "bbbb79c3",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -60,7 +60,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "39bd2aa0",
+   "id": "7a5b400a",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -71,7 +71,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0576ffc5",
+   "id": "c9eba621",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -81,7 +81,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "02515320",
+   "id": "3c64b6c1",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -91,7 +91,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "68d09c49",
+   "id": "1cbf5882",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -100,7 +100,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "04148b24",
+   "id": "9b4a7d43",
    "metadata": {},
    "source": [
     "## 2D Visualization of a global mesh"
@@ -108,7 +108,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "2f72550b",
+   "id": "50ced222",
    "metadata": {},
    "source": [
     "When working with a global mesh the 2D representation of the data is problematic."
@@ -117,7 +117,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ba27b916",
+   "id": "4d4dc5f0",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -127,7 +127,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "6a3486eb",
+   "id": "7fbd688c",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -136,7 +136,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "0cc1d60b",
+   "id": "5b0137b0",
    "metadata": {},
    "source": [
     "We can visualize in 3D correctly with"
@@ -145,7 +145,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c1673bb1",
+   "id": "03836182",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -154,7 +154,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "9fb2c142",
+   "id": "1fc42ce6",
    "metadata": {},
    "source": [
     "But in 2D we get artifacts due to the cross over elements..."
@@ -163,25 +163,25 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "704d7d71",
+   "id": "9e345ddc",
    "metadata": {},
    "outputs": [],
    "source": [
-    "r.pplot.mesh(lw=.3, markersize=.5)"
+    "r.pplot.mesh()"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "8d3199cb",
+   "id": "c972c179",
    "metadata": {},
    "source": [
-    "However, using the corresponding utility from pyposeidon we can create a seam on the international time line mitigating the problem."
+    "However, using the corresponding utility from `pyposeidon` we can create a seam on the international time line mitigating the problem."
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0c5c1839",
+   "id": "a7713a1c",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -191,7 +191,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "6e724e20",
+   "id": "fc5bde95",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -204,7 +204,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "5a39baeb",
+   "id": "f9d2a4b1",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -214,7 +214,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "617a43ca",
+   "id": "1b767821",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -224,7 +224,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "dff6ed1a",
+   "id": "d0ea75bd",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -237,7 +237,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "2be8873a",
+   "id": "ce1bed8f",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -248,16 +248,16 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "a1aa24f6",
+   "id": "d180e30d",
    "metadata": {},
    "outputs": [],
    "source": [
-    "r.pplot.mesh(x=xn,y=yn,tes=tri3n,lw=.3, markersize=.5)"
+    "r.pplot.mesh(x=xn,y=yn,tes=tri3n)"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "023786de",
+   "id": "cb0f1758",
    "metadata": {},
    "source": [
     "The creation of the seam can best visualized in 3D"
@@ -266,7 +266,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "5bd00131",
+   "id": "3e6d40a2",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -275,15 +275,15 @@
   },
   {
    "cell_type": "markdown",
-   "id": "0e3f9f8b",
+   "id": "108a9269",
    "metadata": {},
    "source": [
-    "## Get variables in the new 2D grid"
+    "## Get variables on the new 2D mesh"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "5ba2ef19",
+   "id": "69a53216",
    "metadata": {},
    "source": [
     "Having the new 2D topology we can compute the corresponding values for any variable in a dataset.\n",
@@ -294,7 +294,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "768f2583",
+   "id": "4a3298a9",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -303,7 +303,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "98fba68a",
+   "id": "661dfadc",
    "metadata": {},
    "source": [
     "Specifying the variable we can then extract the new dataset e.g. for \"depth\""
@@ -312,7 +312,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "d90104f1",
+   "id": "48c75eb3",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -322,7 +322,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "b774fe12",
+   "id": "28c00a46",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -331,7 +331,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "51c1491a",
+   "id": "b7745d23",
    "metadata": {},
    "source": [
     ".. or  in 2D .."
@@ -340,7 +340,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8753b923",
+   "id": "fa6f5338",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -349,7 +349,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "d8ccd88e",
+   "id": "9ea2f4d5",
    "metadata": {},
    "source": [
     "Likewise for the time variables..."
@@ -358,7 +358,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "a04f2f5d",
+   "id": "037df0e2",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -368,7 +368,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "727e2700",
+   "id": "1c13475b",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -379,7 +379,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "507434ff",
+   "id": "20793a5f",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -390,7 +390,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "96ce721c",
+   "id": "c8469a8c",
    "metadata": {},
    "outputs": [],
    "source": [
diff --git a/Tutorial/VALIDATION.ipynb b/Tutorial/VALIDATION.ipynb
index 736fc167..97e32860 100644
--- a/Tutorial/VALIDATION.ipynb
+++ b/Tutorial/VALIDATION.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "5d136394",
+   "id": "dcfc37c9",
    "metadata": {
     "tags": []
    },
@@ -12,7 +12,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "b8d1532a",
+   "id": "6ef1c5c8",
    "metadata": {},
    "source": [
     "Station points configuration and analysis. \n",
@@ -26,19 +26,19 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "9c72e8d1",
+   "id": "fcde78a6",
    "metadata": {},
    "outputs": [],
    "source": [
     "#to use the full width of the browser window\n",
-    "from IPython.core.display import display, HTML\n",
+    "from IPython.display import display, HTML\n",
     "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "d836fcd2",
+   "id": "716581b8",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -50,7 +50,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "bccddb49",
+   "id": "f1ed928f",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -59,7 +59,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "0fad84b5",
+   "id": "a3e0b98d",
    "metadata": {},
    "source": [
     "### Graphics"
@@ -68,7 +68,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "01f92b66",
+   "id": "2c9103d5",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -78,7 +78,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "f0419f0c",
+   "id": "387125f9",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -89,7 +89,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "f368c507",
+   "id": "d24850fa",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -99,7 +99,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "f6201af5",
+   "id": "f0118c4f",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -110,7 +110,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "9aa61a86",
+   "id": "cf212c5a",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -119,16 +119,16 @@
   },
   {
    "cell_type": "markdown",
-   "id": "6c7b8153",
+   "id": "516fe313",
    "metadata": {},
    "source": [
-    "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env PATH. This is not needed when we are running from python."
+    "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env `PATH`. This is not needed when we are running from python."
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "530cdf04",
+   "id": "77660228",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -141,7 +141,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c2476995",
+   "id": "e9f4ae9c",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -154,7 +154,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8aa631c2",
+   "id": "4c5af8da",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -172,7 +172,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "3922cf18",
+   "id": "88385bf6",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -182,7 +182,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "f2c73b71",
+   "id": "4f49f14e",
    "metadata": {},
    "source": [
     "## Setup"
@@ -190,15 +190,15 @@
   },
   {
    "cell_type": "markdown",
-   "id": "6b476c48",
+   "id": "49881d09",
    "metadata": {},
    "source": [
-    "Station info can be incorporated by using the obs tag with the minimum required info being the lon/lan location. One needs to set to True the monitor flag as well."
+    "Station info can be incorporated by using the obs tag with the minimum required info being the lon/lan location. One needs to set to `True` the `monitor` flag as well."
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "3c65cc17",
+   "id": "b02d5fa7",
    "metadata": {},
    "source": [
     "Such a file could look like"
@@ -207,7 +207,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "81eb0844",
+   "id": "d7d8c066",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -217,7 +217,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "5ff83552",
+   "id": "8f200199",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -228,7 +228,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "6b716c65",
+   "id": "e07cc9b1",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -238,7 +238,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "3351b9ec",
+   "id": "c3540017",
    "metadata": {},
    "source": [
     "### A better way"
@@ -246,24 +246,24 @@
   },
   {
    "cell_type": "markdown",
-   "id": "2e2b76b0",
+   "id": "11664d16",
    "metadata": {},
    "source": [
-    "However these station location should match datasets where observation data are available. One such dataset is the one provided by JRC at https://webcritech.jrc.ec.europa.eu/SeaLevelsDb/"
+    "However these station locations should match datasets where observation data are available. One such dataset is the one provided by the `JRC` at https://webcritech.jrc.ec.europa.eu/SeaLevelsDb/"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "e4542a3f",
+   "id": "7e545773",
    "metadata": {},
    "source": [
-    "This DataFrame is integrated in pyPoseidon. See critech.csv in pyposeidon/misc/."
+    "This DataFrame is integrated in `pyposeidon`. See `critech.csv` in `pyposeidon/misc/`."
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "fb907b2f",
+   "id": "a84aa831",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -273,7 +273,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "3a25ce2c",
+   "id": "9950586f",
    "metadata": {},
    "source": [
     "The above Dataset is currently the default. You can use this one if you don't specify an *obs* in the model setup (see above). Now running the same case with *obs* commented out, we get.."
@@ -281,7 +281,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "ad313b3b",
+   "id": "0a3df963",
    "metadata": {},
    "source": [
     "**Note** : It is foreseen that a new python package will handle observation data from multiple sources including data cleanup utilizing ML. pyPoseidon will then use that package as an upstream dependency."
@@ -290,34 +290,29 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "dfd32097",
+   "id": "192d4c9a",
    "metadata": {},
    "outputs": [],
    "source": [
     "#define in a dictionary the properties of the model..\n",
-    "model={'solver':'schism',\n",
+    "model={'solver_name':'schism',\n",
     "     'geometry':{'lon_min' : -25,'lon_max' : -12.,'lat_min' : 56.,'lat_max' : 74.}, \n",
-    "#     'manning':.12, #uniform manning value\n",
-    "#     'windrot':0.00001, #uniform windrot value\n",
-    "#     'tag':'schism', # optional tag \n",
     "     'coastlines':ne_i, # coastlines\n",
     "     'mesh_generator' : 'jigsaw', # set grid generator  \n",
     "     'start_date':'2017-10-1 0:0:0',\n",
     "     'time_frame':'12H',\n",
     "     'meteo_source' : './data/erai.grib', #path to meteo files\n",
     "     'dem_source' : './data/dem.nc', #path to dem file\n",
-    "#     'ncores': 4 , # optional number of cores\n",
     "     'rpath':'./test/validation/', #location of calc folder\n",
-    "#     'update':['all'], #set which component should be updated  (meteo,dem,model)\n",
     "     'monitor':True, # get time series for observation points\n",
     "#     'obs':'./test/stations.csv', #Define station locations. If not set, pyposeidon/misc/critech.csv is used.\n",
-    "#     'parameters':{'dt':400, 'rnday':.5, 'hotout':1, 'ihot':0,'nspool':9, 'ihfskip':36, 'hotout_write':108 } # set param.in components\n",
+    "#     'parameters':{'dt':400, 'rnday':.5, 'hotout':1, 'ihot':0,'nspool':9, 'ihfskip':36, 'hotout_write':108 } # set param.nml components\n",
     "    }"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "7667264a",
+   "id": "f09d9d5c",
    "metadata": {},
    "source": [
     "## Execute\n"
@@ -326,7 +321,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "dd11b37e",
+   "id": "61926b55",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -337,7 +332,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "b53638e7",
+   "id": "93db4590",
    "metadata": {},
    "source": [
     "## Output"
@@ -345,7 +340,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "d6a6442f",
+   "id": "bb165f90",
    "metadata": {},
    "source": [
     "The output of the simulations could be in separate files (due to MPI) or specific folders. pyposeidon can incorporate the resulting Datasets with "
@@ -354,7 +349,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "9321a0ea",
+   "id": "f3c3e8f4",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -364,7 +359,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "2472324c",
+   "id": "42c10e72",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -374,7 +369,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "748990e5",
+   "id": "7c692311",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -383,7 +378,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "2b85079b",
+   "id": "d22db8cd",
    "metadata": {},
    "source": [
     "## Station data"
@@ -392,7 +387,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "040e57f1",
+   "id": "aa955792",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -402,7 +397,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0720593c",
+   "id": "d101015f",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -412,7 +407,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "d799d0d1",
+   "id": "b67c8d6a",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -422,7 +417,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "5cc76f76",
+   "id": "47f49f80",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -435,7 +430,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ed020630",
+   "id": "0b658641",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -444,7 +439,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "736c3193",
+   "id": "8586acc3",
    "metadata": {},
    "source": [
     "### plot"
@@ -453,7 +448,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "014167e4",
+   "id": "08191029",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -463,7 +458,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "73ef985a",
+   "id": "dbe8ed03",
    "metadata": {},
    "source": [
     "### Observation data"
@@ -471,7 +466,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "510e6a60",
+   "id": "02e1f2e1",
    "metadata": {},
    "source": [
     "Because we've access to an API for the tide-gauge data we can retrieve them on-demand."
@@ -480,7 +475,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "efffd3de",
+   "id": "45495164",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -490,7 +485,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "26ebab08",
+   "id": "7623a967",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -502,7 +497,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "564101a5",
+   "id": "fc838970",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -514,7 +509,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "b4ecdb57",
+   "id": "b0a62de2",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -523,7 +518,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "8ef790a3",
+   "id": "9fbc4e73",
    "metadata": {},
    "source": [
     "### Plot together"
@@ -532,7 +527,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "bab2d9ef",
+   "id": "c156f4ab",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -547,7 +542,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "2958b66d",
+   "id": "184d962a",
    "metadata": {},
    "source": [
     "... or with hvplot"
@@ -556,7 +551,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "7da3b09a",
+   "id": "196d9795",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -566,7 +561,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c2b5c5a0",
+   "id": "7e283019",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -576,7 +571,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "5b37f226",
+   "id": "9ea03eb3",
    "metadata": {},
    "source": [
     "### Statistics"
@@ -585,7 +580,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8f5c2375",
+   "id": "f8df343b",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -596,7 +591,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "f5bad6da",
+   "id": "d3d08a92",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -606,7 +601,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "591c977d",
+   "id": "da51a265",
    "metadata": {},
    "source": [
     "We use the corresponding utility for getting verification stats"
@@ -615,7 +610,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "027d6963",
+   "id": "ed3caf3a",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -625,7 +620,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "78a0f981",
+   "id": "50444741",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -635,7 +630,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "dd56032c",
+   "id": "314d494f",
    "metadata": {},
    "source": [
     "## Additional features"
@@ -643,7 +638,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "dec10876",
+   "id": "3e2efc76",
    "metadata": {},
    "source": [
     "### sample nearest point from simulation "
@@ -652,7 +647,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "26fffd38",
+   "id": "a6e08a71",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -662,7 +657,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c3026117",
+   "id": "abcf17aa",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -672,7 +667,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "464bf3e7",
+   "id": "ed4c8409",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -682,10 +677,10 @@
   },
   {
    "cell_type": "markdown",
-   "id": "e87b447c",
+   "id": "958518ac",
    "metadata": {},
    "source": [
-    "**Note**: Since a pandas dataframe is available all sampling option within pandas can be used."
+    "**Note**: Since a `pandas` dataframe is available all sampling option within pandas can be used."
    ]
   }
  ],
diff --git a/conda.recipe/build_base.sh b/conda.recipe/build_base.sh
new file mode 100644
index 00000000..9c3c6851
--- /dev/null
+++ b/conda.recipe/build_base.sh
@@ -0,0 +1,1 @@
+${PYTHON} -m pip install . --no-deps -vv
diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml
index 3f600eaa..db85314d 100644
--- a/conda.recipe/meta.yaml
+++ b/conda.recipe/meta.yaml
@@ -1,5 +1,5 @@
 {% set name = "pyposeidon" %}
-{% set version = "0.5.2" %}
+{% set version = "0.6.0" %}
 {% set build = 0 %}
 
 package:
@@ -12,36 +12,71 @@ source:
 build:
   noarch: python
   number: {{ build }}
-  skip: True  # [win]
-  script: "{{ PYTHON }} -m pip install . --no-deps -vv"
 
-requirements:
-  build:
-  host:
-    - pip
-    - python #>=3.7
-    - setuptools
-    - poetry
-    - poetry-core
-  run:
-    - python #>=3.7
-    - mayavi
-    - pyresample
-    - pygeos >=0.7.1
-    - geoviews
-    - rasterio
-    - jigsaw=0.9.12
-    - hvplot
-    - descartes
-    - cfgrib <0.9.9
-    - moviepy
-    - colorlog
-    - f90nml
-    - zarr
+outputs:
+  - name: pyposeidon-base
+    script: build_base.sh
+    build:
+      noarch: python
+    requirements:
+      build:
+        - python                                 # [build_platform != target_platform]
+        - cross-python_{{ target_platform }}     # [build_platform != target_platform]
+      host:
+        - pip
+        - python
+      run:
+        - python
+        - pyresample
+        - pygeos >=0.10
+        - rasterio
+        - rioxarray
+        - jigsaw
+        - cfgrib
+        - colorlog
+        - f90nml
+        - zarr
+        - gmsh >=4.8.4
+        - python-gmsh
+        - tqdm
+        - xarray
+        - pandas
+        - geopandas >=0.10.1
+        - numpy
+        - psutil
+        - requests
+        - scipy
+        - netCDF4
+        - dask
+        - shapely =1.7.1
+        - pydap >=3.3.0
+
+      test:
+        imports:
+          - pyposeidon
+
+  - name: pyposeidon
+    requirements:
+      host:
+        - pip
+        - python
+      run:
+        - python
+        - {{ pin_subpackage('pyposeidon-base', exact=True) }}
+        - holoviews
+        - geoviews
+        - hvplot
+        - ipympl
+        - itkwidgets
+        - mayavi
+        - matplotlib >=3.3
+        - cartopy <=0.20
+        - ffmpeg
+
+      test:
+        imports:
+          - pyposeidon
 
-test:
-  imports:
-    - pyposeidon
 
 about:
   home: https://github.com/ec-jrc/pyposeidon
diff --git a/dependencies/python_deps.yml b/dependencies/python_deps.yml
index f8a8ec5e..1e340387 100644
--- a/dependencies/python_deps.yml
+++ b/dependencies/python_deps.yml
@@ -5,7 +5,6 @@ channels:
   - "gbrey"
 
 dependencies:
-  - "branca"
   - "cartopy<=0.20"
   - "cfgrib"
   - "colorlog"
@@ -27,5 +26,4 @@ dependencies:
   - "shapely=1.7.1"
   - "tqdm"
   - "xarray"
-  - pip:
-      - "git+https://github.com/pydap/pydap.git@3f6aa190c59e3bbc6c834377a61579b20275ff69#egg=Pydap"
+  - "pydap>=3.3.0"
diff --git a/docs/boundary.md b/docs/boundary.md
index 5007fe5d..8ec8b068 100644
--- a/docs/boundary.md
+++ b/docs/boundary.md
@@ -1,6 +1,6 @@
 <style>body {text-align: justify}</style>
 
-This module handles mesh boundary extraction from coastlines or user provided shapefiles. It underpins the [Mesh](mesh.md) module.
+This module handles mesh boundary extraction from coastlines or user provided shapefiles. It underpins the [mesh](mesh.md) module.
 
 
 
@@ -23,12 +23,13 @@ iGSHHS = gp.GeoDataFrame(geometry=[x for x in gi.geometries()])
 - geometry 
 
 ```py
-#define in a dictionary the properties of the model..
-window={'lon_min':-25., # lat/lon window
-     	'lon_max':-9.,
-     	'lat_min':56.,
-     	'lat_max':74.,
-    	}
+# define in a dictionary the properties of the model..
+extend = {
+    "lon_min": -25.0,  # lat/lon window
+    "lon_max": -9.0,
+    "lat_min": 56.0,
+    "lat_max": 74.0,
+}
 ```
 
 Using the module as
@@ -36,11 +37,11 @@ Using the module as
 ```py
 import pyposeidon.boundary as pb
 
-a = pb.Boundary(geometry=window, coastlines = iGSHHS)
+a = pb.Boundary(geometry=extend, coastlines = iGSHHS)
 ```
 
 
-the contours with corresponding attributes are
+the contours with their corresponding attributes are
 
 ```py
 a.contours
@@ -60,7 +61,7 @@ a.contours
 
 ```
 
-where they can be visualized as 
+and they can be visualized as 
 
 ![output of show](./img/boundary_show.png)
 
@@ -73,6 +74,9 @@ Setting
 ```py
 b = pb.Boundary(geometry=window, coastlines=iGSHHS, cbuffer = .01)
 ```
+!!! note
+
+	The units of `cbuffer` are those of the coastlines.  
 
 it can be seen that the boundaries are simplified accordingly 
 
diff --git a/docs/dem.md b/docs/dem.md
index 47619da5..6e14876e 100644
--- a/docs/dem.md
+++ b/docs/dem.md
@@ -1,23 +1,24 @@
 <style>body {text-align: justify}</style>
 
-The dem module handles the pre-processing of bathymetric data.
+The dem module handles the pre-processing of bathymetric/topographic data.
 
 
 ### Setup
 
 - extent
 
-The geometry's extent could be provided. In the most simple case that is a `lat/lon` box that defines the area of interest. Otherwise the full dataset will be used. This might be problematic in large files e.g. global datasets especially when the file is retrieved from a url (see below).
+The geometry's extent could be provided. In the most simple case that is a `lat/lon` box that defines the area of interest. Otherwise the full dataset will be used. This might be problematic for large files e.g. global datasets, especially when the file is retrieved from a url (see below).
 
 Without loss of generality we select below *Iceland* as a test case.
 
 ```python
-#define in a dictionary the properties of the model..
-extend={'lon_min':-25., # lat/lon window
-     	  'lon_max':-9.,
-     	  'lat_min':56.,
-     	  'lat_max':74.,
-    }
+# define in a dictionary the properties of the model..
+extend = {
+    "lon_min": -25.0,  # lat/lon window
+    "lon_max": -9.0,
+    "lat_min": 56.0,
+    "lat_max": 74.0,
+}
 ```
 
 - source
@@ -42,32 +43,35 @@ For relative small areas an `erddap` server could be used e.g.
 url = "https://coastwatch.pfeg.noaa.gov/erddap/griddap/srtm30plus"
 ```
 
-*Note*  that this option would work only for small extents. For large areas (continental/global) using a previously locally stored file is advised. 
+!!! note
+
+	This option would work only for small extents. For large areas (continental/global) using a previously locally stored file is advised. 
 
 - Coastlines
 
-The resolution of dem datasets is usually less that the available coastline datasets.
+The resolution of dem datasets is usually lower that the corresponding ones for coastlines.
 
-Since the coastlines are the boundary for the mesh generation it makes sense to have them matched to the bathymetric data.
+Since the coastlines are the boundary for the mesh generation, it makes sense to have them matched to the bathymetric data.
 
-`pyposeidon` tries to provide that (by default) when you provide a coastline dataset as argument. One can avoid that by setting `adjust_dem = False`.
+`pyposeidon` tries to facilitate that (by default) when you provide a coastline dataset as argument. This can be negated by setting `adjust_dem = False` in the arguments.
 
 There are a number of available datasets for coastlines. One option is to use the `cartopy` features as:
 
- ```python
- # use cartopy to get coastlines
- import cartopy.feature as cf
- import geopandas as gp
+```python
+# use cartopy to get coastlines
+import cartopy.feature as cf
+import geopandas as gp
 
- cr='i'
+cr = "i"
 
- coast = cf.NaturalEarthFeature(
-     category='physical',
-     name='land',
-     scale='{}m'.format({'l':110, 'i':50, 'h':10}[cr]))
-	 
- ne_i = gp.GeoDataFrame(geometry = [x for x in coast.geometries()])
- ```
+coast = cf.NaturalEarthFeature(
+    category="physical",
+    name="land",
+    scale="{}m".format({"l": 110, "i": 50, "h": 10}[cr]),
+)
+
+ne_i = gp.GeoDataFrame(geometry=[x for x in coast.geometries()])
+```
  
 for [natural earth](https://www.naturalearthdata.com) or 
 
@@ -77,9 +81,9 @@ for [natural earth](https://www.naturalearthdata.com) or
  iGSHHS = gp.GeoDataFrame(geometry=[x for x in gi.geometries()])
  ```
 
-for the [GSHHS](http://www.soest.hawaii.edu/pwessel/gshhg/) dataset. 
+for the [GSHHG](http://www.soest.hawaii.edu/pwessel/gshhg/) dataset. 
 
-The coastlines argument could also be a `shapefile`. Generally, whatever `geopandas` should work.
+The coastlines argument could also be a `shapefile`. Generally, whatever format `geopandas` reads should work.
 
 
 ### Retrieve dem Dataset
@@ -97,12 +101,15 @@ import pyposeidon.dem as pdem
 d = pdem.Dem(**dic)
 ```
 
-*Note* that `xarray` is using `dask` for a lazy read and all data will be loaded into memory when needed. 
+
+!!! note
+
+	`xarray` is using `dask` for a lazy read and all data will be loaded into memory when needed. 
 
 
-### Interpolate on Mesh
+### Resample on Mesh
 
-In order to create a model, bathymetric data need to be interpolated on the corresponding mesh. If such a mesh is given, bathymetric data on the `x,y` nodes can provided as 
+In order to create a model, bathymetric data need to be interpolated on the corresponding mesh. If such a mesh is given, bathymetric data on the `x,y` nodes can be provided as 
 
 ```python
 d = pdem.Dem(**dic, grid_x = x, grid_y = y)
@@ -112,7 +119,7 @@ d = pdem.Dem(**dic, grid_x = x, grid_y = y)
 ### Output to file
  
  
-Once the dataset is attained, it can be stored in the solver's appropriate format. This is relevant for solvers that read the bathymetry in a separate file (as is the case for `D3D`).
+Once the dataset is produced, it can be stored in the solver's appropriate format. This is relevant for solvers that read the bathymetry in a separate file (as is the case for `D3D`).
  
 ```python
 pdem.to_output(d.Dataset,solver_name='d3d', rpath='./test/')
diff --git a/docs/development.md b/docs/development.md
index 390fecc5..b8f187b7 100644
--- a/docs/development.md
+++ b/docs/development.md
@@ -3,7 +3,7 @@
 In order to develop `pyposeidon` you need:
 
 1. Binary dependencies like e.g. `python`, `gdal`, `proj`. Additionally you will need solvers like
-   `schism` and `delft3d` and mesh generators like `jigsaw` and `gmesh`.
+   `schism` and `d3d` and mesh generators like `jigsaw` and `gmsh`.
 2. A bunch of runtime python dependencies like `numpy`, `xarray` and `matplotlib`.
 3. Some python dependencies that are only useful during development, like `poetry` and `pytest`.
 
@@ -13,22 +13,15 @@ There are multiple ways to install all these. We are only going to suggest two o
 
 In the [locks](https://github.com/pmav99/pyPoseidon/tree/master/locks) directory there is a bunch of
 [conda lock](https://github.com/conda-incubator/conda-lock) files. Choose one of the `dev` ones that
-matches your Operating System and use it to create a new `conda` environment. E.g.
+matches your Operating System and use it to create a new `conda` environment.
 
-The following command will create a new conda environment named `pyposeidon_dev` and will install
-*all* the `pyposeidon` dependencies **except** [pydap](https://github.com/pydap/pydap/), which must
-be installed manually using `pip`.
-
-!!! note
-
-      The problem is that we need a recent `pydap` version and there has been no release for some
-      time now. As soon as a new release is made, this should be resolved.
+As an example, the following command will create a new conda environment named `pyposeidon_dev` and will install
+*all* the `pyposeidon` dependencies.
 
 ```
 env_name=pyposeidon_dev
 conda create -n "${env_name}" --file conda-ubuntu-64-p38-openmpi-dev.lock
 conda activate "${env_name}"
-pip install https://github.com/pydap/pydap/archive/3f6aa190c59e3bbc6c834377a61579b20275ff69.zip
 ```
 
 ## Binary deps via conda + PyPI
@@ -37,12 +30,6 @@ Alternatively, you can choose one of the `binary` lock files and use it to creat
 with just the binary dependencies. After you create the environment you should use
 [poetry](https://python-poetry.org/) to install the python dependencies.
 
-!!! tip
-
-      In this case, you don't need to do anything special for
-      [pydap](https://github.com/pydap/pydap/) since `poetry` handles installing packages straight
-      from github.
-
 ```
 env_name=pyposeidon_base
 conda create -n "${env_name}" --file conda-ubuntu-64-p38-openmpi-binary.lock
@@ -56,23 +43,44 @@ You are ready to go!
 ### Tests
 
 You can use `pytest` to run the tests. Since the datasets required for testing `pyposeidon` are
-substantial in size they will be downloaded once you invoke `pytest` for the first time.
+substantial in size, they will be downloaded once you invoke `pytest` for the first time.
 
-In order to execute the main test suite, it should be enough to execute:
+In order to execute the main test suite, it should be enough to use:
 
 ```
 pytest
 ```
 
-In order to test also the solver integration use the following:
+In order to test also the solver integration, use the following
 
 ```
 pytest --runschism
 ```
 
-If you are using a local installation of the solvers please specify the `PATH` to the executables in
-your system such as:
+ for testing `schism` or 
+
+```
+pytest --rundelft
+```
+
+for `delft3d` or both.
+
+Some test are slow and can be invoked with 
+
+```
+pytest --runslow
+```
+
+
+If you are using a local installation for the solvers, please specify the `PATH` to the executables in your system such as:
 
 ```
 export SCHISM = '/path_to_schism_executable'
 ```
+
+or
+
+```
+export D3D = '/path_to_delft3d_bin_folder'
+export LD3D = '/path_to_delft3d_lib_folder'
+```
diff --git a/docs/img/.DS_Store b/docs/img/.DS_Store
deleted file mode 100644
index dca39e42..00000000
Binary files a/docs/img/.DS_Store and /dev/null differ
diff --git a/docs/img/global.jpg b/docs/img/global.jpg
new file mode 100644
index 00000000..612bcca9
Binary files /dev/null and b/docs/img/global.jpg differ
diff --git a/docs/img/global.png b/docs/img/global.png
deleted file mode 100644
index 84fa82e5..00000000
Binary files a/docs/img/global.png and /dev/null differ
diff --git a/docs/img/global_2d.jpg b/docs/img/global_2d.jpg
new file mode 100644
index 00000000..a19e0aa6
Binary files /dev/null and b/docs/img/global_2d.jpg differ
diff --git a/docs/img/global_2d.png b/docs/img/global_2d.png
deleted file mode 100644
index 0115512a..00000000
Binary files a/docs/img/global_2d.png and /dev/null differ
diff --git a/docs/img/global_2d_seam.jpg b/docs/img/global_2d_seam.jpg
new file mode 100644
index 00000000..cdcbb929
Binary files /dev/null and b/docs/img/global_2d_seam.jpg differ
diff --git a/docs/img/global_2d_seam.png b/docs/img/global_2d_seam.png
deleted file mode 100644
index 8531c920..00000000
Binary files a/docs/img/global_2d_seam.png and /dev/null differ
diff --git a/docs/img/global_seam.jpg b/docs/img/global_seam.jpg
new file mode 100644
index 00000000..876c70f8
Binary files /dev/null and b/docs/img/global_seam.jpg differ
diff --git a/docs/img/global_seam.png b/docs/img/global_seam.png
deleted file mode 100644
index cb8fbdf3..00000000
Binary files a/docs/img/global_seam.png and /dev/null differ
diff --git a/docs/img/mesh_dem.jpg b/docs/img/mesh_dem.jpg
new file mode 100644
index 00000000..7d4131d7
Binary files /dev/null and b/docs/img/mesh_dem.jpg differ
diff --git a/docs/img/mesh_low.png b/docs/img/mesh_low.png
new file mode 100644
index 00000000..23587a0b
Binary files /dev/null and b/docs/img/mesh_low.png differ
diff --git a/docs/img/meteo.png b/docs/img/meteo.png
new file mode 100644
index 00000000..beb4e0ba
Binary files /dev/null and b/docs/img/meteo.png differ
diff --git a/docs/img/meteo_xr.png b/docs/img/meteo_xr.png
new file mode 100644
index 00000000..823254ec
Binary files /dev/null and b/docs/img/meteo_xr.png differ
diff --git a/docs/index.md b/docs/index.md
index 1c2d8ece..1cef4a7c 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -46,7 +46,7 @@ Currently two numerical solvers are supported.
 - *Delft3D* which uses a structured grid. For more info see
   [here](http://oss.deltares.nl/web/delft3d/source-code).
 
-- *SCHISM* which relies on an unstructured grid. For more info see [here](http://ccrm.vims.edu/schismweb/).
+- *SCHISM* which relies on an unstructured mesh. For more info see [here](http://ccrm.vims.edu/schismweb/).
 
 ## Origin
 
diff --git a/docs/installation.md b/docs/installation.md
index fbd52fca..ccdb08e9 100644
--- a/docs/installation.md
+++ b/docs/installation.md
@@ -1,10 +1,8 @@
 <style>body {text-align: justify}</style>
 
-There are a number of ways to install `pyposeidon` and its dependencies
+There are a number of ways to install `pyposeidon` and its dependencies.
 
-## `pyposeidon` installation
-
-### `conda`
+### With `conda`
 
 The easiest way to get started is to install the `pyposeidon` package from the `conda-forge`
 channel:
@@ -16,19 +14,15 @@ conda install -c conda-forge pyposeidon
 This will pull all necessary dependencies and is the recommended way to integrate `pyposeidon` to
 your environment.
 
-!!! note
-
-    Due to an upstream issue, `pydap` needs to be installed manually. See
-    `dependencies/python_deps10.yml` for info.
 
-If you don't intend to use the visualization module of `pyposeidon` then, you may install the
+If you don't intend to use the visualisation modules of `pyposeidon` then, you may install the
 `pyposeidon-base` package, instead, which is quite a bit lighter:
 
 ```
 conda install -c conda-forge pyposeidon-base
 ```
 
-### `PyPI`
+### With `PyPI`
 
 In order to install from `PyPI` please note that your system needs to have:
 
@@ -43,7 +37,7 @@ Once you have those, you just need to run:
 pip install pyposeidon
 ```
 
-If you intend to use the vizualization module, then you should install the necessary libraries with:
+If you intend to use the visualisation modules, then you should install the necessary libraries with:
 
 ```
 pip install pyposeidon --extras viz
@@ -52,7 +46,7 @@ pip install pyposeidon --extras viz
 !!! note
 
     Depending on which modules you intend to use you might need to install additional non-python
-    dependencies (e.g. `jigsaw`, `gmesh` for mesh generation, `schism` for numerical solving etc).
+    dependencies (e.g. `jigsaw`, `gmesh` for mesh generation, `schism`, `delft3d` for numerical solving etc).
 
 
 ## Solver integration
@@ -73,17 +67,32 @@ conda install -c gbrey pschism
 conda install -c gbrey delft3d4
 ```
 
-Alternatively, you can download them and compile them for your system:
+There are two flavours depending on the `mpi` option used. This can be explicitly selected with e.g.
+
+```
+conda install -c gbrey pschism=5.9=mpi_mpich_*
+```
+
+or
+
+```
+conda install -c gbrey pschism=5.9=mpi_openmpi_*
+```
+
+respectively.
+
+Alternatively, you can download and compile them for your system:
 
 - Delft3D can be downloaded from [deltares](http://oss.deltares.nl/web/delft3d/source-code).
 - SCHISM can be downloaded from [github](https://github.com/schism-dev/schism).
 
-## Mesh generation
+## Mesh generation binaries
 
-`pyposeidon`'s `mesh` module can be used to generate localized or global meshes. To use the module you
-must install one of the supported generators
+When installing `pyposeidon` via `PyPI` the mesh generation binaries are required and can be installed with  conda: 
 
 ```
 conda install -c conda-forge gmesh
 conda install -c conda-forge jigsaw
 ```
+
+Currently [Jigsaw](https://github.com/dengwirda/jigsaw) and [GMSH](http://gmsh.info) are supported.
\ No newline at end of file
diff --git a/docs/mesh.md b/docs/mesh.md
index 3f3af021..ac8be1c9 100644
--- a/docs/mesh.md
+++ b/docs/mesh.md
@@ -9,47 +9,73 @@ The minimum information required is the geometry's extent. In the most simple ca
 
 In addition, the coastlines need to be provided as mesh boundaries.
 
-We use the [GSHHS](http://www.soest.hawaii.edu/pwessel/gshhg/) dataset in the following example.
+We use the [GSHHG](http://www.soest.hawaii.edu/pwessel/gshhg/) dataset in the following example.
 
 
 ```python
 # use cartopy to get coastlines
- import cartopy.feature as cf
- import geopandas as gp
- gi = cf.GSHHSFeature(scale="intermediate", levels=[1])
- iGSHHS = gp.GeoDataFrame(geometry=[x for x in gi.geometries()])
-
-#define the geometry as dict
- extend={'lon_min':-25., # lat/lon window
-     	'lon_max':-9.,
-     	'lat_min':56.,
-     	'lat_max':74.,
-    	}
+import cartopy.feature as cf
+import geopandas as gp
+
+gi = cf.GSHHSFeature(scale="intermediate", levels=[1])
+iGSHHS = gp.GeoDataFrame(geometry=[x for x in gi.geometries()])
+
+# define the geometry as dict
+extend = {
+    "lon_min": -25.0,  # lat/lon window
+    "lon_max": -9.0,
+    "lat_min": 56.0,
+    "lat_max": 74.0,
+}
 ```
 
 Additional required info include the type of mesh element (for now `r2d` or `tri2d` ) and the engine for the mesh generation (`jigsaw` or `gmsh`).
 
 ```py
- import pyposeidon.mesh as pm
- b = pm.set(type='tri2d', geometry=geometry, 
-				coastlines = iGSHHS, mesh_generator = 'jigsaw'
-				)
+import pyposeidon.mesh as pm
+
+b = pm.set(
+		type="tri2d",
+		geometry=geometry,
+		coastlines=iGSHHS,
+		mesh_generator="jigsaw"
+)
 ```
 
 Note that the data structure used throughout `pyposeidon` is an `xarray` Dataset. Thus,
 
-**TIP** : You can change the mesh generator above with mesh_generator = `gmsh`.
-
 ![output of show](./img/mesh_xr.png)
 
+which can be visualised using the inherent accessors (see [utils](utils.md))) with 
+
+```py
+b.Dataset.pplot.mesh()
+```
+
+![output of show](./img/mesh_low.png)
+
+!!! note
+
+	You can change the mesh generator above with mesh_generator = `gmsh`.
+
 
 Better control on the mesh size can be obtained by providing a background control function usually in the form of a scaled DEM. One way to achieve this is to give as argument a dem file, like : 
 
 ```py
-b = pm.set(type='tri2d', geometry=geometry, coastlines = iGSHHS, mesh_generator = 'jigsaw', 
-               dem_source='dem.nc', resolution_min=0.01, resolution_max=.5)
+b = pm.set(
+    type="tri2d",
+    geometry=geometry,
+    coastlines=iGSHHS,
+    mesh_generator="jigsaw",
+    dem_source="dem.nc",
+    resolution_min=0.01,
+    resolution_max=0.5,
+)
 ```
 
+which gives,
+
+![output of show](./img/mesh_dem.jpg)
 
 The output to a file, of type `hgrid` in this case, is done as
 
@@ -57,7 +83,7 @@ The output to a file, of type `hgrid` in this case, is done as
 b.to_file('/path/to/hgrid.gr3')
 ```
 
-There is also a validation functionality that checks whether the mesh works with `SCHISM`.
+There is also a validator that checks whether the mesh works with `SCHISM`.
 
 ```py
 b.validate(rpath='/path/to/folder/used/')
diff --git a/docs/meteo.md b/docs/meteo.md
index 5b655c08..773e1f1c 100644
--- a/docs/meteo.md
+++ b/docs/meteo.md
@@ -1,23 +1,24 @@
 <style>body {text-align: justify}</style>
 
-The meteo module handles the pre-processing of the atmospheric variables that are used as forcing in the model.
+The meteo module handles the pre-processing of the atmospheric variables used as forcing in the model.
 
 
 ### Setup
 
 - extent
 
-In most cases the geometry's extent is a `lat/lon` box that defines the area of interest. Otherwise the full dataset will be used. This might be problematic in large files e.g. global data especially when the file is retrieved from a url (see below).
+In most cases, the geometry's extent is a `lat/lon` box that defines the area of interest. Otherwise the full dataset will be used. This might be problematic in large files e.g. global data especially when the file is retrieved from a url (see below).
 
 Without loss of generality we select below *Iceland* as a test case.
 
 ```python
-#define in a dictionary the properties of the model..
-extend={'lon_min':-25., # lat/lon window
-     	'lon_max':-9.,
-     	'lat_min':56.,
-     	'lat_max':74.,
-    }
+# define in a dictionary the properties of the model..
+extend = {
+    "lon_min": -25.0,  # lat/lon window
+    "lon_max": -9.0,
+    "lat_min": 56.0,
+    "lat_max": 74.0,
+}
 ```
 
 - source
@@ -40,26 +41,34 @@ A number of formats are supported, namely `geotiff, grib, netcdf, zarr`, etc.
 
 #### URL 
 
-This usually means a link to an `opendap/erddap` server (supported through `pydap`). An an example let's assume that the source is the `GFS` data from `NOAA`. The link can be defined as:
+This usually means a link to an `opendap/erddap` server (supported through `pydap`). As an example, assuming that the source is the `GFS` data from `NOAA`, the link can be defined as:
 
 ```python
 import pandas as pd
 import numpy as np
 
-start_date = pd.to_datetime("today") - pd.DateOffset(days=1) # step back one day for availability.
+start_date = pd.to_datetime("today") - pd.DateOffset(
+    days=1
+)  # step back one day for availability.
 
-r = [0, 6, 12, 18] # define a specific hourly release 
+r = [0, 6, 12, 18]  # define a specific release
 
-h = np.argmin([n for n in [start_date.hour - x for x in r] if n > 0]) # find the latest available
+h = np.argmin(
+    [n for n in [start_date.hour - x for x in r] if n > 0]
+)  # find the latest available
 
-url = "https://nomads.ncep.noaa.gov/dods/gfs_0p25_1hr/gfs{}/gfs_0p25_1hr_{:0>2d}z".format(
+url = (
+    "https://nomads.ncep.noaa.gov/dods/gfs_0p25_1hr/gfs{}/gfs_0p25_1hr_{:0>2d}z".format(
         start_date.strftime("%Y%m%d"), r[h]
     )
+)
 
 source = url
 ```
 
-*Note*  that this option would work only for small extents. For large areas (continental/global) using a previously locally stored file is advised. 
+!!! note
+
+	This option would work only for small extents. For large areas (continental/global) using a previously locally stored file is advised. 
 
 ### Retrieve meteo Dataset
 
@@ -76,11 +85,26 @@ import pyposeidon.meteo as pm
 m = pm.Meteo(**dic)
 ```
 
-*Note* that `xarray` is using `dask` for a lazy read and all data will be loaded into memory when needed. 
+![output of show](./img/meteo_xr.png)
+
+!!! note
+
+	`xarray` is using `dask` for a lazy read and all data will be loaded into memory when needed. 
+
+Visualisation is readily available through the plot accessor of `xarray`, e.g.
+
+```python
+m.Dataset.msl[0,:,:].plot() # A 2D graph for one timestep
+```
+
+
+![output of show](./img/meteo.png)
+
+
 
 ### Output to file
  
-Once the dataset is attained, it can be saved to files appropriate for the selected solver, e.g:
+Once the dataset is produced, it can be saved to files appropriate for the selected solver, e.g:
 
 ```python
 m.Dataset.to_netcdf('./test/test.nc') # generic netCDF output
diff --git a/docs/model.md b/docs/model.md
index 5ce66bdc..df6d3026 100644
--- a/docs/model.md
+++ b/docs/model.md
@@ -5,7 +5,7 @@ The top module that handles the main setup of the instance.
 
 ### Setup
 
-The procedure usually includes providing several info :
+A number of parameters is provided by the user :
 
 - *solver_name*:
 	Select the solver to be used e.g. *schism*.
@@ -22,84 +22,84 @@ The procedure usually includes providing several info :
 - *meteo_source*:
 	Source for atmospheric data for forcing the model.
 - *dem_source*:
-	Bathymetric data Dataset.
+	Topobathy Dataset.
 
-All necessary info can be incorporated in a dictionary e.g.
+All necessary info can be incorporated into a dictionary as
 
 ```python
- dic = {
-	'solver_name' : 'schism',
-	'geometry': {'lon_min' : -25,'lon_max' : -12.,'lat_min' : 56.,'lat_max' : 74.},
-	'coastlines' : '/path/to/coastal/shapefile.shp', 
-	'mesh_generator' : 'jigsaw',
-	'start_date' : '2017-10-1 0:0:0',
-	'time_frame' : '12H',
-	'meteo_source' : ['/path/to/meteo/file.grib'],
-	'dem_source' : './path/to/dem/file.nc', 
-	   }
+dic = {
+    "solver_name": "schism",
+    "geometry": {"lon_min": -25, "lon_max": -12.0, "lat_min": 56.0, "lat_max": 74.0},
+    "coastlines": "/path/to/coastal/shapefile.shp",
+    "mesh_generator": "jigsaw",
+    "start_date": "2017-10-1 0:0:0",
+    "time_frame": "12H",
+    "meteo_source": ["/path/to/meteo/file.grib"],
+    "dem_source": "./path/to/dem/file.nc",
+}
 ```
 
-Having all the attributes defined the model can be initiated as
+Having all the attributes defined, the model can be initiated as
 
 ```python
- import pyposeidon.model as pm
- b = pm.set(**dic)
+import pyposeidon.model as pm
+b = pm.set(**dic)
 ```
 
-Executing the model can be done incrementally  or in one step. The steps involved are:
+Executing the model can be done incrementally or in one step. The steps involved are:
 
 ```py
- b.create() # constructs all required parts e.g. mesh, dem, meteo, etc.
- b.output() # save to files
- b.save() # saves the json model reference file
- b.set_obs() # setup station points
- b.run() # execute
+b.create() # constructs all required parts e.g. mesh, dem, meteo, etc.
+b.output() # save to files
+b.save() # saves the json model reference file
+b.set_obs() # setup station points
+b.run() # execute
 ```
 
 or in one step as
 
 ```py
- b.execute()
+b.execute()
 ```
 
-The various datasets incorporated in the model can be accessed independently as attributes, namely :
+The various datasets incorporated into the model can be accessed independently as attributes, namely :
 
 ```py
- b.meteo.Dataset # forcing
- b.mesh.Dataset # mesh
- b.dem.Dataset # bathymetry
- b.coastlines # cooastlines used
+b.meteo.Dataset # forcing
+b.mesh.Dataset # mesh
+b.dem.Dataset # bathymetry
+b.coastlines # cooastlines used
 ```
 
 ### Output
 
-The output of the simulations could be in separate files (due to `mpi`). These files can be incorporated into a single Dataset with
+The output of the simulations could be in separate files (due to `mpi`). These files can be integrated into a single Dataset with
 
 ```py
- b.get_output_data() # integrate output
+b.get_output_data() # integrate output
 ```
 
- and the data are available as
+and the data are available as
  
 ```py
- b.data.Dataset # output Dataset
+b.data.Dataset # output Dataset
 ```
 
 
 ### Read
 
-If a model is created by `pyposeidon` then there is a `json` file that describes the model (see above). Such a model can be read into `pyposeidon` and reproduced it with
+If a model is created by `pyposeidon` there is a `json` file that describes the model. This file serves as a signature for the specific model. It can be used to easily reproduce the results by reading the file into `pyposeidon` and executing it as
 
 ```py
- a = pyposeidon.read('./path/to/schism_model.json')
- a.execute()
+a = pyposeidon.model.read('./path/to/schism_model.json')
+a.execute() #execute it again
 ```
  
-However, there might be a model created by other means. These models could be incorporated into `pyposeidon` with
+When a model is created by other means, it can still be incorporated into `pyposeidon` with
 
 ```py
- c = pm.set(solver_name='schism', rfolder = './path/to/folder/',
+c = pm.set(solver_name='schism', rfolder = './path/to/folder/',
  	 		load_mesh=True, load_meteo=True)
- c.mesh.Dataset
- c.meteo.Dataset
+c.mesh.Dataset
+c.meteo.Dataset
 ```
\ No newline at end of file
diff --git a/docs/structure.md b/docs/structure.md
index d6f9ec6a..83e748ea 100644
--- a/docs/structure.md
+++ b/docs/structure.md
@@ -7,15 +7,15 @@ The following table lists the available modules alongside a short description:
 
 | module     | functionality                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
 |------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `model`    | A top level function (see [model](api.md#pyposeidon.model)) that defines the model's characteristics, logging and most notably provides a `read_model()` option for reproducing an existing model by parsing a `json` file that defines the required settings.                                                                                                                                                                                                                                                                                                                                                                                                                    |
-| `boundary` | This module handles mesh boundary extraction from coastlines or user provided shapefiles. It underpins the *Mesh* module.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
-| `d3d`      | The wrapper of the `delft3d` solver is defined within a single file (see [d3d]())                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
+| `model`    | A top level function (see [model](api.md#pyposeidon.model)) that defines the model's characteristics, sets up logging and most notably, provides a `read()` option for reproducing an existing model by parsing a `json` file that stores all used settings.                                                                                                                                                                                                                                                                                                                                                                                                                    |
+| `boundary` | This module (see [boundary](api.md#pyposeidon.boundary)) handles mesh boundary extraction from coastlines or user provided shapefiles. It underpins the *Mesh* module.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
+| `d3d`      | The wrapper of the `delft3d` solver is defined within a single file (see [d3d](api.md#pyposeidon.d3d))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
 | `schism`   | The wrapper of the `schism` solver (see [schism](api.md#pyposeidon.schism)).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
-| `mesh`     | This is the module that handles the generation or incorporation of a given mesh (see [mesh](api.md#pyposeidon.mesh). It includes support for two mesh generators, [Jigsaw](https://github.com/dengwirda/jigsaw) and [GMSH](http://gmsh.info).                                                                                                                                                                                                                                                                                                                                                                                                                                     |
-| `mjigsaw`  | Although `jigsaw` now provides a python API this module precedes that and instead wraps around the C++ binary.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
-| `mgmsh`    | This handles the integration of both the binary and python bindings of the `gmsh` mesh generator.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
-| `dem`      | This is the module that handles the pre-processing of bathymetric data (see [Dem](api.md#pyposeidon.dem)). It utilizes `xarray` to read and `pyresample` to interpolate on mesh points. In addition, has the ability to match coastlines to bathymetry.                                                                                                                                                                                                                                                                                                                                                                                                                           |
-| `meteo`    | A number of atmospheric data could be required for a geoflow simulation. These data could be in a variety of formats (`netcdf, grib, geotiff`, etc.). The meteo module uses `xarray` to read them into a dataset. This includes combining multiple files into a single dataset in terms of the time reference variable.                                                                                                                                                                                                                                                                                                                                                           |
+| `mesh`     | This is the module that handles the generation or incorporation of a given mesh (see [mesh](api.md#pyposeidon.mesh)). It includes support for two mesh generators, [Jigsaw](https://github.com/dengwirda/jigsaw) and [GMSH](http://gmsh.info).                                                                                                                                                                                                                                                                                                                                                                                                                                     |
+| `mjigsaw`  | Although `jigsaw` now provides a python API this module precedes that and instead wraps around the C++ binary (see [mjigsaw](api.md#pyposeidon.mjigsaw)).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
+| `mgmsh`    | This handles the integration of both the binary and python bindings of the `gmsh` mesh generator (see [mgmsh](api.md#pyposeidon.mgmsh)).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
+| `dem`      | This is the module that handles the pre-processing of bathymetric/topographic data (see [dem](api.md#pyposeidon.dem)). It utilizes `xarray` to read and `pyresample` to interpolate on mesh points. In addition, it has the ability to match coastlines to bathymetry.                                                                                                                                                                                                                                                                                                                                                                                                                           |
+| `meteo`    | A number of atmospheric data could be required for a geoflow simulation. These data could be in a variety of formats (`netcdf, grib, geotiff`, etc.). The meteo module uses `xarray` to read them into a dataset. This includes combining multiple files into a single dataset in terms of the time reference variable (see [meteo](api.md#pyposeidon.meteo)).                                                                                                                                                                                                                                                                                                                                                           |
 | `tide`     | This module handles the tidal configuration. *Under development*.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
 
 ## `utils`
@@ -25,8 +25,8 @@ modules above and that could also provide additional functionality on a stand-al
 
 | accessor   | functionality                                                                                |
 |------------|----------------------------------------------------------------------------------------------|
-| `pplot`    | `xarray` accessor providing visualisations of Schism's unstructured mesh based on `matplolib`|
-| `hplot`    | `xarray` accessor providing visualisations of Schism's unstructured mesh based on `holoviews`|
-| `mplot`    | `xarray` accessor providing visualisations of Schism's unstructured mesh based on `mayavi`   |
-| `seam`     | Global mesh modifications so that it can be viewed in 2D without distortions                 |
-| `cast`     | Hindcast or re-forecasting procedure                                                         |
+| `pplot`    | `xarray` accessor providing visualisations of schism's unstructured mesh based on `matplolib`.|
+| `hplot`    | `xarray` accessor providing visualisations of schism's unstructured mesh based on `holoviews`.|
+| `mplot`    | `xarray` accessor providing visualisations of schism's unstructured mesh based on `mayavi`.   |
+| `seam`     | Global mesh modifications so that it can be viewed in 2D without distortions.                 |
+| `cast`     | Hindcast or re-forecasting procedure.                                                         |
diff --git a/docs/utils.md b/docs/utils.md
index 39783fef..cc26d71f 100644
--- a/docs/utils.md
+++ b/docs/utils.md
@@ -1,24 +1,31 @@
 <style>body {text-align: justify}</style>
 
-A number of utilities are included within `pyposeidon` providing useful functionality.
+A number of utilities is included within `pyposeidon` providing useful functionality.
 
 ### pplot
 
-Datasets that represent unstructured models, namely those with `schism` can be visualised using `matplotlib` using the following functionality. Assuming `g` is an output Dataset (see [model](model.md)) there are a number of functions available:
+Datasets that represent unstructured models, namely those with `schism` can be visualised using `matplotlib` as follows. 
+
+Assuming `g` is an output Dataset (see [model](model.md)) the available functions are:
 
 ```py
- g.pplot.mesh() #mesh depiction using `plt.triplot`.
- 
- g.pplot.contourf(var='depth') # variable map using `plt.tricontourf`.
- 
- g.pplot.contour(var='depth') # variable map using `plt.tricontour`.
- 
- g.pplot.quiver(it = 2, u=out.hvel.values[2,:,0,0],v=out.hvel.values[2,:,0,1],
- 				scale=.05, title='hvel', color='k') #vectors using `plt.quiver`.
-				
- g.pplot.frames(var='elev',title='SSH') # animate with `matplotlib.animation`.
+#mesh depiction using `plt.triplot`.
+g.pplot.mesh() 
+
+# variable map using `plt.tricontourf`. 
+g.pplot.contourf(var='depth') 
+
+# variable map using `plt.tricontour`. 
+g.pplot.contour(var='depth') 
+
+#vectors using `plt.quiver`. 
+g.pplot.quiver(it = 2, u=out.hvel.values[2,:,0,0],v=out.hvel.values[2,:,0,1],
+ 				scale=.05, title='hvel', color='k') 
+
+# animate with `matplotlib.animation`.				
+g.pplot.frames(var='elev',title='SSH') 
  
- g.pplot.qframes(u=g.hvel.values[:,:,0,0],v=g.hvel.values[:,:,0,1],
+g.pplot.qframes(u=g.hvel.values[:,:,0,0],v=g.hvel.values[:,:,0,1],
  				title='Vel',scale=.05, color='k')	
 ```
 
@@ -28,40 +35,40 @@ Datasets that represent unstructured models, namely those with `schism` can be v
 Similar functionality is available using [hvplot](https://hvplot.holoviz.org).
 
 ```py
- g.hplot.mesh() #mesh depiction using `gv.TriMesh`.
+g.hplot.mesh() #mesh depiction using `gv.TriMesh`.
  
- g.hplot.contourf(var='depth') # variable map using `gv.TriMesh`.
+g.hplot.contourf(var='depth') # variable map using `gv.TriMesh`.
  				
- g.pplot.frames(var='elev',title='SSH') # animate with `hv.DynamicMap`.
+g.pplot.frames(var='elev',title='SSH') # animate with `hv.DynamicMap`.
  
 ```
 
 ### mplot
 
-Yet another backend for visualising using `VTK` backend. Currently [mayavi](https://docs.enthought.com/mayavi/mayavi/) is used for producing the graphs. This provides also 3D plotting capabilities.
+Yet another backend for visualising using `VTK`. Currently [mayavi](https://docs.enthought.com/mayavi/mayavi/) is used for producing the graphs. This provides also 3D plotting capabilities.
 
 ```py
- g.mplot.mesh(dim='3D') #mesh depiction using `mlab.triangular_mesh`.
+g.mplot.mesh(dim='3D') #mesh depiction using `mlab.triangular_mesh`.
  
- g.mplot.contourf(var='depth') # variable map using `mlab.triangular_mesh`. 
+g.mplot.contourf(var='depth') # variable map using `mlab.triangular_mesh`. 
 ```
 
 
-### Seam.
+### seam.
 
 When working with a global mesh, the 2D representation of the data is problematic.
 
 So this mesh 
 
-![output of show](./img/global.png)
+![output of show](./img/global.jpg)
 
-in 2D will have artefacts due to the cross over elements...
+in 2D will have artefacts due to cross over elements...
 
 
-![output of show](./img/global_2d.png)
+![output of show](./img/global_2d.jpg)
 
 
-However, using the corresponding utility from `pyposeidon` a seam can be created on the international time line, mitigating the problem.
+However, using the corresponding utility from `pyposeidon`, a seam can be created on the international time line, mitigating the problem.
 
 ```python
 from pyposeidon.utils.seam import get_seam
@@ -74,15 +81,15 @@ where `x,y,tri3` are the original node coordinates and tessellation.
 
 These new arrays can be used to plot the mesh in 2D without problems,
 
-![output of show](./img/global_2d_seam.png)
+![output of show](./img/global_2d_seam.jpg)
 
 
 The creation of the seam can be seen better in 3D.
 
-![output of show](./img/global_seam.png)
+![output of show](./img/global_seam.jpg)
 
 
-Having the new 2D topology, computing the corresponding subset of any variable in a `Dataset` becomes:
+Evaluating any variable in the new adjusted topology becomes:
 
 ```py
 from pyposeidon.utils.seam import to_2d
@@ -93,9 +100,9 @@ bathymetry = to_2d(Dataset,var='depth', mesh=[xn,yn,tri3n])
 ![output of show](./img/depth_2d.png)
 
 
-### Cast
+### cast
 
-Many times one needs to split a simulation in several steps. This is true for long hindacts and forecasts. The cast utility can then be used as:
+Any long-time simulation can be performed in several steps. This is true for long hindcasts as well as forecasts. The `cast` utility can then be used as:
 
 ```py
 from pyposeidon.utils import cast
@@ -111,7 +118,7 @@ rs = cast.set(solver_name='schism',
         cpath=new_path, #new path
         meteo=mf, #new meteo
         sdate=b.date + pd.DateOffset(hours=12) #new start time
-            ) 
+) 
 
 rs.run(execute=True)
 
diff --git a/pyposeidon/boundary.py b/pyposeidon/boundary.py
index fe354165..1ac70637 100644
--- a/pyposeidon/boundary.py
+++ b/pyposeidon/boundary.py
@@ -1,8 +1,13 @@
 """
 Geometry module of pyposeidon. It manages model boundaries.
 """
+# Copyright 2018 European Union
+# This file is part of pyposeidon.
+# Licensed under the EUPL, Version 1.2 or – as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence").
+# Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the Licence for the specific language governing permissions and limitations under the Licence.
+
 from pyposeidon.utils.stereo import to_stereo
-import pyposeidon.utils.pplot
 import pyposeidon.dem as pdem
 import pandas as pd
 import numpy as np
@@ -11,7 +16,6 @@
 import shapely
 from tqdm import tqdm
 import sys
-import matplotlib.pyplot as plt
 
 logger = logging.getLogger(__name__)
 
@@ -48,15 +52,15 @@ def __init__(self, **kwargs):
             as `required`, nevertheless they are all `Optional` except geometry.
 
         Args:
-            geometry (Union[dict, str, GeoDataFrame]): A `GeoDataFrame` or the path to a shapefile or
+            geometry Union[dict, str, GeoDataFrame]: A `GeoDataFrame` or the path to a shapefile or
                 a dict defining the lat/lon window.
-            coastlines (Union[str, GeoDataFrame]): A `GeoDataFrame` or the path to a shapefile which
+            coastlines Union[str, GeoDataFrame]: A `GeoDataFrame` or the path to a shapefile which
                 describes the coastlines. Defaults to `None`.
-            cbuffer (float): The buffer in arcs for extending the coastlines. Defaults to `None`.
-            levels (list[floats]): The range of DEM values for extracting the boundaries.
+            cbuffer float: The buffer in arcs for extending the coastlines. Defaults to `None`.
+            levels list[floats]: The range of DEM values for extracting the boundaries.
                 When one valus is present it defines inner coastlines. When two values exist they define
                 the extent. Defaults to `None`.
-            dem_source (str): Path or url to bathymetric data.
+            dem_source str: Path or url to bathymetric data.
         """
 
         geometry = kwargs.get("geometry", None)
@@ -226,90 +230,6 @@ def buffer_(coasts, cbuffer):
     return wu
 
 
-def get_dem_contours(blevels, dem):
-
-    if len(blevels) == 1:
-        dvalues = [blevels[0] - 1, blevels[0]]
-    elif len(blevels) == 2:
-        dvalues = blevels
-    else:
-        logger.error("blevels not set properly")
-        sys.exit(1)
-
-    # check if in range
-    r_check = [dem.elevation.values.min() < x < dem.elevation.values.max() for x in dvalues]
-
-    if not any(r_check):
-        logger.warning(
-            "blevels not within DEM range {}:{}".format(dem.elevation.values.min(), dem.elevation.values.max())
-        )
-        return gp.GeoDataFrame(geometry=[])
-    try:
-        dem.adjusted.plot.contour(levels=dvalues)
-    except:
-        dem.elevation.plot.contour(levels=dvalues)
-
-    # get graph
-    cs = plt.gca()
-
-    # outer contour
-    outc = []
-    outl = cs.collections[0].get_paths()
-    for l in range(len(outl)):
-        v = outl[l].vertices
-        try:
-            outc.append(shapely.geometry.LineString(v))
-        except:
-            pass
-
-    # inner contour
-    inc = []
-    inl = cs.collections[1].get_paths()
-    for l in range(len(inl)):
-        v = inl[l].vertices
-        try:
-            inc.append(shapely.geometry.LineString(v))
-        except:
-            pass
-
-    # Get continuous area
-    lon_min = dem.longitude.min()
-    lon_max = dem.longitude.max()
-    lat_min = dem.latitude.min()
-    lat_max = dem.latitude.max()
-
-    # create a polygon of the lat/lon window
-    grp = shapely.geometry.Polygon([(lon_min, lat_min), (lon_min, lat_max), (lon_max, lat_max), (lon_max, lat_min)])
-
-    # outer contour
-    b1 = []
-    for geo_ in outc:
-        ee = shapely.ops.split(grp, geo_)
-        try:
-            b1.append(ee[1])
-        except:
-            pass
-    # inner contour
-    b2 = []
-    for geo_ in inc:
-        ee = shapely.ops.split(grp, geo_)
-        try:
-            b2.append(ee[1])
-        except:
-            pass
-
-    w1 = gp.GeoDataFrame(geometry=b1)
-    w1_ = w1.unary_union
-    w1 = gp.GeoDataFrame(geometry=[w1_])
-
-    w2 = gp.GeoDataFrame(geometry=b2)
-    w2_ = w2.unary_union
-    w2 = gp.GeoDataFrame(geometry=[w2_])
-
-    plt.close("all")
-    return w1.loc[~w1.is_empty]  # cleanup
-
-
 def tag(geometry, coasts, cbuffer, blevels):
 
     try:
diff --git a/pyposeidon/d3d.py b/pyposeidon/d3d.py
index 5e3cb890..ef475bf1 100644
--- a/pyposeidon/d3d.py
+++ b/pyposeidon/d3d.py
@@ -1,5 +1,5 @@
 """
-Main d3d module of pyposeidon. It controls the creation, output & execution of a complete simulation based on DELFT3D
+Main d3d module of pyposeidon. It controls the creation, output & execution of a complete simulation based on DELFT3D.
 
 """
 # Copyright 2018 European Union
@@ -36,6 +36,8 @@
 
 from .bnd import Box
 
+from . import tools
+
 logger = logging.getLogger(__name__)
 
 import multiprocessing
@@ -62,32 +64,32 @@ def __init__(self, **kwargs):
             as `required`, nevertheless they are all `Optional`.
 
         Args:
-            geometry (Union[dict, str, GeoDataFrame]): A `GeoDataFrame` or the path to a shapefile or
+            geometry Union[dict, str, GeoDataFrame]: A `GeoDataFrame` or the path to a shapefile or
                 a dict defining the lat/lon window.
-            start_date (str): The date from which the analysis should start. It should be a string parseable
+            start_date str: The date from which the analysis should start. It should be a string parseable
                 by `pd.to_datetime()`.
-            end_date (str): The date at which the analysis should end. It should be a string parseable by
+            end_date str: The date at which the analysis should end. It should be a string parseable by
                 `pd.to_datetime()`.
-            time_frame (str): The duration of the analysis. It should be a string parseable by
+            time_frame str: The duration of the analysis. It should be a string parseable by
                 `pd.to_datetime()`.
-            date (str): Reference date of the run.
-            meteo_source (str): Path or url to meteo data.
-            dem_source (str): Path or url to bathymetric data.
-            argfile (str): Path to `_hydro.xml` file.
-            update (str): Control the update of the model e.g `['dem']`-> updates only bathymetry.
+            date str: Reference date of the run.
+            meteo_source str: Path or url to meteo data.
+            dem_source str: Path or url to bathymetric data.
+            argfile str: Path to `_hydro.xml` file.
+            update str: Control the update of the model e.g `['dem']`-> updates only bathymetry.
                 Defaults to `["all"]`.
-            rpath (str): Path for output of the model. Defaults to `./d3d/`.
-            tide (str): Flag indicating whether to load "tide". Defaults to `False`.
-            atm (bool): The solver's atm. Defaults to `True`.
-            tag (str): The model's "tag". Defaults to `"d3d"`.
-            resolution (float): size of the regular grid. Defaults to `0.1`.
-            ofilename (str): Path to station file. Defaults to `None`.
-            epath (str): The path to the schism executable. If the `D3D` env variable has been
+            rpath str: Path for output of the model. Defaults to `./d3d/`.
+            tide str: Flag indicating whether to load "tide". Defaults to `False`.
+            atm bool: The solver's atm. Defaults to `True`.
+            tag str: The model's "tag". Defaults to `"d3d"`.
+            resolution float: size of the regular grid. Defaults to `0.1`.
+            ofilename str: Path to station file. Defaults to `None`.
+            epath str: The path to the schism executable. If the `D3D` env variable has been
                 set, then it overrides the value passed as the parameter.
-            config_file (str): Path to mdf file. Defaults to `None`.
-            config (dict): Parameter options passed to mdf file.
-            output (bool): Flag for saving to file. Defaults to `False`.
-            update (str): Control the update of the model e.g `['dem']`-> updates only bathymetry.
+            config_file str: Path to mdf file. Defaults to `None`.
+            config dict: Parameter options passed to mdf file.
+            output bool: Flag for saving to file. Defaults to `False`.
+            update list[str]: Control the update of the model e.g `['dem']`-> updates only bathymetry.
                 Defaults to `["all"]`.
         """
 
@@ -798,20 +800,24 @@ def run(self, **kwargs):
             # ------------------------------------------------------------------------------
             logger.warning("D3D executable path (epath) not given -> using default \n")
             # ------------------------------------------------------------------------------
-            bin_path = os.pathsep + cpath
-            lib_path = bin_path
 
-        ncores = get_value(self, kwargs, "ncores", NCORES)
+        ncores = get_value(self, kwargs, "ncores", 0)
 
         argfile = get_value(self, kwargs, "argfile", self.tag + "_hydro.xml")
 
+        tools.create_d3d_mpirun_script(
+            target_dir=calc_dir,
+            #            cmd=bin_path,
+            script_name="run_flow2d3d.sh",
+        )
+
         # ---------------------------------------------------------------------
         logger.info("executing model\n")
         # ---------------------------------------------------------------------
 
         # note that cwd is the folder where the executable is
         ex = subprocess.Popen(
-            args=["./run_flow2d3d.sh {} {} {}".format(argfile, ncores, bin_path, lib_path)],
+            args=["./run_flow2d3d.sh {} {} {}".format(argfile, bin_path, lib_path)],
             cwd=calc_dir,
             shell=True,
             stderr=subprocess.PIPE,
@@ -1086,7 +1092,7 @@ def read_folder(self, rfolder, **kwargs):
         sys.exit(1)
         # ---------------------------------------------------------------------
 
-    def get_data(self, **kwargs):
+    def get_output_data(self, **kwargs):
 
         dic = self.__dict__
 
diff --git a/pyposeidon/dem.py b/pyposeidon/dem.py
index 7fd7a4db..421e490e 100644
--- a/pyposeidon/dem.py
+++ b/pyposeidon/dem.py
@@ -43,7 +43,7 @@ def __init__(self, dem_source: str, **kwargs):
             as `required`, nevertheless they are all `Optional` except `dem_source`.
 
         Args:
-            dem_source: Path or url to bathymetric data.
+            dem_source str: Path or url to bathymetric data.
             lon_min float: Minimum longitude.
             lon_max float: Maximum longitude.
             lat_min float: Minimum latitude.
@@ -53,8 +53,8 @@ def __init__(self, dem_source: str, **kwargs):
             coastlines Union[str, GeoDataFrame]: A `GeoDataFrame` or the path to a shapefile which
                 describes the coastlines. Defaults to `None`.
             adjust_dem bool:  Option to match dem with coastlines, Defaults to `True`.
-            grid_x list: Array of longitude of mesh nodes.
-            grid_y list: Array of latitude of mesh nodes.
+            grid_x list[float]: Array of longitude of mesh nodes.
+            grid_y list[float]: Array of latitude of mesh nodes.
             wet_only bool: Flag to mask dry values when interpolating on mesh. Defaults to `False`.
         """
 
@@ -280,5 +280,16 @@ def dem_on_mesh(dataset, **kwargs):
 
 
 def to_output(dataset, solver_name, **kwargs):
+    """
+    !!! danger ""
+        Due to a limitation of the Library rendering the docstrings, all arguments are marked
+        as `required`, nevertheless they are all `Optional` except `dem_source`.
+
+    Args:
+        dataset Dataset: An `xarray` Dataset.
+        solver_name str: Name of solver used, e.g. `d3d` or `schism`.
+    """
+
     solver_class = tools.get_solver(solver_name=solver_name)
-    solver_class.to_dep(dataset, **kwargs)
+    if solver_name == "d3d":
+        solver_class.to_dep(dataset, **kwargs)
diff --git a/pyposeidon/mesh.py b/pyposeidon/mesh.py
index 27614358..0cd8361d 100644
--- a/pyposeidon/mesh.py
+++ b/pyposeidon/mesh.py
@@ -167,13 +167,13 @@ class tri2d:
         as `required`, nevertheless they are all `Optional` except geometry.
 
     Args:
-        mesh_file (str): Path to hgrid mesh file. Defaults to `None`.
-        mesh_generator (str): Use `jigsaw` or `gmsh`. Defaults to `None`.
-        geometry (Union[dict, str, GeoDataFrame]): A `GeoDataFrame` or the path to a shapefile or
+        mesh_file str: Path to `hgrid.gr3`, `jigsaw.msh` or `gmsh.msh` file. Defaults to `None`.
+        mesh_generator str: Use `jigsaw` or `gmsh`. Defaults to `None`.
+        geometry Union[dict, str, GeoDataFrame]: A `GeoDataFrame` or the path to a shapefile or
             a dict defining the lat/lon window.  Defaults to `None`.
-        coastlines (Union[str, GeoDataFrame]): A `GeoDataFrame` or the path to a shapefile which
+        coastlines Union[str, GeoDataFrame]: A `GeoDataFrame` or the path to a shapefile which
             describes the coastlines. Defaults to `None`.
-        boundary (GeoDataFrame) : Defined mesh boundaries.  Defaults to `None`.
+        boundary GeoDataFrame: Defined mesh boundaries.  Defaults to `None`.
     """
 
     def __init__(self, **kwargs):
@@ -189,7 +189,15 @@ def __init__(self, **kwargs):
 
         if mesh_file:
 
-            self.Dataset = self.read_file(mesh_file)
+            if mesh_file.endswith(".gr3"):
+                self.Dataset = self.read_file(mesh_file)
+            elif mesh_file.endswith(".msh"):
+                if mesh_generator == "jigsaw":
+                    self.Dataset = mjigsaw.read_msh(mesh_file)
+                elif mesh_generator == "gmsh":
+                    self.Dataset = mgmsh.read_msh(mesh_file)
+                else:
+                    raise ValueError("Please define 'mesh_genarator' argument")
 
         elif mesh_generator == "gmsh":
 
@@ -551,7 +559,7 @@ def validate(self, **kwargs):
             # ------------------------------------------------------------------------------
             bin_path = "schism"
 
-        tools.create_mpirun_script(
+        tools.create_schism_mpirun_script(
             target_dir=path,
             cmd=bin_path,
             script_name="launchSchism.sh",
diff --git a/pyposeidon/mgmsh.py b/pyposeidon/mgmsh.py
index f34bd3d5..ddcbb6b7 100644
--- a/pyposeidon/mgmsh.py
+++ b/pyposeidon/mgmsh.py
@@ -43,14 +43,14 @@
 logger = logging.getLogger(__name__)
 
 
-def read_gmsh(mesh, **kwargs):
+def read_msh(filename, **kwargs):
 
     model = gmsh.model
     factory = model.geo
 
     gmsh.initialize()
 
-    gmsh.open(mesh)
+    gmsh.open(filename)
 
     logger.info("Analyze grid")
 
@@ -203,12 +203,12 @@ def get(contours, **kwargs):
         as `required`, nevertheless they are all `Optional`.
 
     Args:
-        contours (GeoDataFrame): Provide boundaries and metadata.
-        rpath (str): Path for output. Defaults to `"."`.
-        use_bindings (bool): Flag for using python API as opposed to binary. Defaults to `True`.
-        dem_source (str): Path or url to bathymetric data.
-        bgmesh (str): Path to a mesh scale file. Defaults to `None`.
-        setup_only (bool): Flag for setup only (no execution). Defaults to `False`.
+        contours GeoDataFrame: Provide boundaries and metadata.
+        rpath str: Path for output. Defaults to `"."`.
+        use_bindings bool: Flag for using python API as opposed to binary. Defaults to `True`.
+        dem_source str: Path or url to bathymetric data.
+        bgmesh str: Path to a mesh scale file. Defaults to `None`.
+        setup_only bool: Flag for setup only (no execution). Defaults to `False`.
     """
 
     logger.info("Creating grid with GMSH\n")
@@ -271,7 +271,7 @@ def get(contours, **kwargs):
             gmsh_execute(**kwargs)
 
     if not setup_only:
-        gr = read_gmsh(rpath + "/gmsh/mymesh.msh", **kwargs)
+        gr = read_msh(rpath + "/gmsh/mymesh.msh", **kwargs)
 
     try:
         bg = dh
diff --git a/pyposeidon/misc/run_flow2d3d.sh b/pyposeidon/misc/run_flow2d3d.sh
index 1219609a..a5b36ba2 100755
--- a/pyposeidon/misc/run_flow2d3d.sh
+++ b/pyposeidon/misc/run_flow2d3d.sh
@@ -11,7 +11,7 @@ fi
 
 #if [ -z $D3D ];then
 #   echo 'no executable'
-#   exit 1 
+#   exit 1
 #fi
 
     #
@@ -19,14 +19,14 @@ fi
     #
 exedir=$D3D/bin
 libdir=$LD3D/lib
- 
+
     #
     # No adaptions needed below
     #
 
     # Set some (environment) parameters
-export LD_LIBRARY_PATH=$exedir:$libdir:$LD_LIBRARY_PATH 
-export PATH=$execdir:$PATH
+export LD_LIBRARY_PATH=$exedir:$libdir:$LD_LIBRARY_PATH
+export PATH=$exedir:$PATH
 
     # Run
 mpiexec -np $ncores d_hydro $argfile
diff --git a/pyposeidon/mjigsaw.py b/pyposeidon/mjigsaw.py
index bfc8da8e..3e347195 100644
--- a/pyposeidon/mjigsaw.py
+++ b/pyposeidon/mjigsaw.py
@@ -1,5 +1,5 @@
 """
-Jigsaw module
+jigsaw module
 
 """
 # Copyright 2018 European Union
@@ -136,7 +136,7 @@ def to_geo(df, path=".", tag="jigsaw"):
         edges.to_csv(f, index=False, header=0, sep=";")
 
 
-def read_msh(fmsh):
+def parse_msh(fmsh):
 
     grid = pd.read_csv(fmsh, header=0, names=["data"], index_col=None, low_memory=False)
     npoints = int(grid.loc[2].str.split("=")[0][1])
@@ -219,14 +219,11 @@ def make_bgmesh(contours, **kwargs):
     return dh
 
 
-def to_dataset(**kwargs):
+def read_msh(filename, **kwargs):
 
     logger.info("..reading mesh\n")
 
-    tag = kwargs.get("tag", "jigsaw")
-    rpath = kwargs.get("rpath", ".")
-
-    [nodes, edges, tria] = read_msh(rpath + "/jigsaw/" + tag + ".msh")
+    [nodes, edges, tria] = parse_msh(filename)
     nodes = nodes.apply(pd.to_numeric)
     tria = tria.apply(pd.to_numeric)
     edges = edges.apply(pd.to_numeric)
@@ -419,12 +416,15 @@ def get(contours, **kwargs):
         as `required`, nevertheless they are all `Optional`.
 
     Args:
-        contours (GeoDataFrame): Provide boundaries and metadata.
-        tag (str): Identifier. Defaults to `"jigsaw"`.
-        rpath (str): Path for output. Defaults to `"."`.
-        dem_source (str): Path or url to bathymetric data.
-        bgmesh (str): Path to a mesh scale file. Defaults to `None`.
-        setup_only (bool): Flag for setup only (no execution). Defaults to `False`.
+        contours GeoDataFrame: Provide boundaries and metadata.
+        tag str: Identifier. Defaults to `"jigsaw"`.
+        rpath str: Path for output. Defaults to `"."`.
+        dem_source str: Path or url to bathymetric data.
+        bgmesh str: Path to a mesh scale file. Defaults to `None`.
+        setup_only bool: Flag for setup only (no execution). Defaults to `False`.
+        hfun_scal str: Mesh scale option either "RELATIVE" or "ABSOLUTE". Defaults to "ABSOLUTE".
+        hfun_min float: Minimum mesh size. Defaults to `0.0`.
+        hfun_max float: Maximum mesh size. Defaults to `1000.`.
     """
 
     logger.info("Creating JIGSAW files\n")
@@ -484,14 +484,18 @@ def get(contours, **kwargs):
     # JIG FILE
     fjig = path + "/" + tag + ".jig"
 
+    hfun_scal = kwargs.get("hfun_scal", "ABSOLUTE")
+    hfun_min = kwargs.get("hfun_min", 0.0)
+    hfun_max = kwargs.get("hfun_max", 1000.0)
+
     with open(fjig, "w") as f:
         f.write("GEOM_FILE ={}\n".format(tag + "-geo.msh"))
         f.write("MESH_FILE ={}\n".format(tag + ".msh"))
         if bgmesh:
             f.write("HFUN_FILE ={}\n".format(tag + "-hfun.msh"))
-        f.write("HFUN_SCAL = ABSOLUTE\n")
-        f.write("HFUN_HMAX = Inf\n")
-        f.write("HFUN_HMIN = 0.0\n")
+        f.write("HFUN_SCAL = {}\n".format(hfun_scal))
+        f.write("HFUN_HMAX = {}\n".format(hfun_max))
+        f.write("HFUN_HMIN = {}\n".format(hfun_min))
         f.write("MESH_DIMS = 2\n")
         f.write("MESH_TOP1 = TRUE\n")
         #        f.write('MESH_TOP2 = TRUE\n')
@@ -536,7 +540,7 @@ def get(contours, **kwargs):
         logger.info("Jigsaw FINISHED\n")
         # ---------------------------------
 
-        gr = to_dataset(**kwargs)
+        gr = read_msh(calc_dir + tag + ".msh", **kwargs)
 
         logger.info("..done creating mesh\n")
 
diff --git a/pyposeidon/model.py b/pyposeidon/model.py
index 572915aa..e0047944 100644
--- a/pyposeidon/model.py
+++ b/pyposeidon/model.py
@@ -1,5 +1,5 @@
 """
-Main model module of pyposeidon. It controls the creation, output & execution of a complete simulation based on different hydrological models
+Main model module of pyposeidon. It controls the creation, execution & output of a complete simulation based on different hydrodynamic models
 
 Currently supported : DELFT3D , SCHISM
 
@@ -84,9 +84,9 @@ def set(solver_name, atm=True, tide=False, **kwargs):
 
     Args:
 
-        solver_name (str): Name of solver used, e.g. `d3d` or `schism`.
-        atm (bool) : Flag for using meteo forcing.  Defaults to `True`.
-        tide (bool) : Flag for using tidal configuration.  Defaults to `False`.
+        solver_name str: Name of solver used, e.g. `d3d` or `schism`.
+        atm bool: Flag for using meteo forcing.  Defaults to `True`.
+        tide bool: Flag for using tidal configuration.  Defaults to `False`.
 
     """
 
diff --git a/pyposeidon/schism.py b/pyposeidon/schism.py
index 2914f1c3..d0619acb 100644
--- a/pyposeidon/schism.py
+++ b/pyposeidon/schism.py
@@ -1,5 +1,5 @@
 """
-Schism model of pyposeidon. It controls the creation, output & execution of a complete simulation based on schism
+Schism model of pyposeidon. It controls the creation, execution & output  of a complete simulation based on SCHISM.
 
 """
 # Copyright 2018 European Union
@@ -22,7 +22,6 @@
 import glob
 from shutil import copyfile
 import xarray as xr
-import cartopy.feature as cf
 import geopandas as gp
 import f90nml
 import errno
@@ -61,47 +60,47 @@ def __init__(self, **kwargs):
             as `required`, nevertheless they are all `Optional`.
 
         Args:
-            rfolder (str): The path to a directory containing the results of a Model solved by Schism.
-            geometry (Union[dict, str, GeoDataFrame]): A `GeoDataFrame` or the path to a shapefile or
+            rfolder str: The path to a directory containing the results of a Model solved by Schism.
+            geometry Union[dict, str, GeoDataFrame]: A `GeoDataFrame` or the path to a shapefile or
                 a dict defining the lat/lon window.
-            load_mesh (bool): Flag indicating whether to load the mesh or not. Defaults to `False`.
-            load_meteo (bool): Flag indicating whether to load the meteo data or not. Defauls to
+            load_mesh bool: Flag indicating whether to load the mesh or not. Defaults to `False`.
+            load_meteo bool: Flag indicating whether to load the meteo data or not. Defauls to
                 `False`.
-            coastlines (Union[str, GeoDataFrame]): A `GeoDataFrame` or the path to a shapefile which
+            coastlines Union[str, GeoDataFrame]: A `GeoDataFrame` or the path to a shapefile which
                 describes the coastlines.
-            tag (str): The model's "tag". Defaults to `"schism"`.
-            tide (str): Flag indicating whether to load "tide". Defaults to `False`.
-            atm (bool): The solver's atm. Defaults to `True`.
-            monitor (bool): The solver's monitor. Defaults to `False`.
-            epath (str): The path to the schism executable. If the `SCHISM` env variable has been
+            tag str: The model's "tag". Defaults to `"schism"`.
+            tide str: Flag indicating whether to load "tide". Defaults to `False`.
+            atm bool: The solver's atm. Defaults to `True`.
+            monitor bool: The solver's monitor. Defaults to `False`.
+            epath str: The path to the schism executable. If the `SCHISM` env variable has been
                 set, then it overrides the value passed as the parameter.
-            start_date (str): The date from which the analysis should start. It should be a string parseable
+            start_date str: The date from which the analysis should start. It should be a string parseable
                 by `pd.to_datetime()`.
-            end_date (str): The date at which the analysis should end. It should be a string parseable by
+            end_date str: The date at which the analysis should end. It should be a string parseable by
                 `pd.to_datetime()`.
-            time_frame (str): The duration of the analysis. It should be a string parseable by
+            time_frame str: The duration of the analysis. It should be a string parseable by
                 `pd.to_datetime()`.
-            date (str): Reference date of the run.
-            rpath (str): Path for output of the model. Defaults to `./schism/`.
-            m_index (int): Define the index of the meteo Dataset. Defaults to `1`.
-            filename (str): Path to output the meteo Dataset. Defaults to `sflux/`.
-            dstamp (str): Reference date for station data. Defaults to date.
-            parameters (dict): Overwrite default Schism's parameter values.
-            meteo_source (str): Path or url to meteo data.
-            dem_source (str): Path or url to bathymetric data.
-            update (str): Control the update of the model e.g `['dem']`-> updates only bathymetry.
+            date str: Reference date of the run.
+            rpath str: Path for output of the model. Defaults to `./schism/`.
+            m_index int: Define the index of the meteo Dataset. Defaults to `1`.
+            filename str: Path to output the meteo Dataset. Defaults to `sflux/`.
+            dstamp str: Reference date for station data. Defaults to date.
+            parameters dict: Overwrite default Schism's parameter values.
+            meteo_source str: Path or url to meteo data.
+            dem_source str: Path or url to bathymetric data.
+            update list[str]: Control the update of the model e.g `['dem']`-> updates only bathymetry.
                 Defaults to `["all"]`.
-            meteo_split_by (str): Split the meteo Dataset to multiple files by e.g. `"day"`.
+            meteo_split_by str: Split the meteo Dataset to multiple files by e.g. `"day"`.
                 Defaults to `None`.
-            manning_file (str): Path to manning file.
-            manning (float): Set constant value in the manning.gr3 file. Defaults to `0.12`.
-            windrot_file (str): Path to windrot file.
-            windrot (float): Set constant value in the windrot_geo2proj.gr3 file. Defaults to `0.00001`.
-            station_flags (list): Define the flag for station output. Defaults to `[1,0,0,0,0,0,0,0,0]`.
-            coastal_monitoring (bool): Flag for setting all land/island boundary nodes as stations.
+            manning_file str: Path to manning file.
+            manning float: Set constant value in the manning.gr3 file. Defaults to `0.12`.
+            windrot_file str: Path to windrot file.
+            windrot float: Set constant value in the windrot_geo2proj.gr3 file. Defaults to `0.00001`.
+            station_flags list[int]: Define the flag for station output. Defaults to `[1,0,0,0,0,0,0,0,0]`.
+            coastal_monitoring bool: Flag for setting all land/island boundary nodes as stations.
                 Defaults to `False`.
-            obs (str): Path to csv file for station locations. Defaults to `misc/critech.csv`.
-            nspool_sta (int): Related to station nodes setup. Defaults to `1`.
+            obs str: Path to csv file for station locations. Defaults to `misc/critech.csv`.
+            nspool_sta int: Related to station nodes setup. Defaults to `1`.
         """
 
         rfolder = kwargs.get("rfolder", None)
@@ -630,7 +629,7 @@ def output(self, **kwargs):
             # ------------------------------------------------------------------------------
             bin_path = "schism"
 
-        tools.create_mpirun_script(
+        tools.create_schism_mpirun_script(
             target_dir=calc_dir,
             cmd=bin_path,
             script_name="launchSchism.sh",
diff --git a/pyposeidon/tide/tide.py b/pyposeidon/tide/tide.py
index 081a9450..b45a1657 100644
--- a/pyposeidon/tide/tide.py
+++ b/pyposeidon/tide/tide.py
@@ -1,6 +1,6 @@
 """Setting the tidal boundary conditions"""
 import numpy as np
-from netCDF4 import Dataset
+import xarray as xr
 from scipy import interpolate
 
 
@@ -23,7 +23,7 @@ def __init__(self, **kwargs):
 
         filename = kwargs.get("tpath", None)
 
-        dmed = Dataset(filename)
+        dmed = xr.open_dataset(filename)
 
         lat = dmed["lat"][:]
         lon = dmed["lon"][:]
diff --git a/pyposeidon/tools.py b/pyposeidon/tools.py
index 2c599540..2ecfa10b 100644
--- a/pyposeidon/tools.py
+++ b/pyposeidon/tools.py
@@ -1,3 +1,9 @@
+# Copyright 2018 European Union
+# This file is part of pyposeidon.
+# Licensed under the EUPL, Version 1.2 or – as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence").
+# Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the Licence for the specific language governing permissions and limitations under the Licence.
+
 import logging
 import os
 import shlex
@@ -29,6 +35,40 @@
 """.strip()
 
 
+LAUNCH_D3D_TEMPLATE = """
+#!/bin/bash
+
+export argfile=$1
+
+if [ $# -gt 1 ]; then
+       D3D="$2"
+       LD3D="$3"
+fi
+
+#if [ -z $D3D ];then
+#   echo 'no executable'
+#   exit 1 
+#fi
+
+    #
+    # Set the directory containing delftflow.exe here
+    #
+exedir=$D3D/bin
+libdir=$LD3D/lib
+
+    #
+    # No adaptions needed below
+    #
+
+    # Set some (environment) parameters
+export LD_LIBRARY_PATH=$exedir:$libdir:$LD_LIBRARY_PATH
+export PATH=$exedir:$PATH
+
+    # Run
+mpiexec {mpirun_flags} -np {ncores} d_hydro $argfile
+""".strip()
+
+
 def get_solver(solver_name: str):
     # Panos: We do the imports here, because there is some sort of cyclical imports issue
     # and no time to properly solve it
@@ -75,7 +115,7 @@ def is_openmpi() -> bool:
     return "Open MPI" in proc.stdout
 
 
-def create_mpirun_script(
+def create_schism_mpirun_script(
     target_dir: str,
     cmd: str,
     use_threads: bool = True,
@@ -109,6 +149,40 @@ def create_mpirun_script(
     return script_path
 
 
+def create_d3d_mpirun_script(
+    target_dir: str,
+    #    cmd: str,
+    use_threads: bool = True,
+    script_name: str = "run_flow2d3d.sh",
+    ncores: int = 0,
+) -> str:
+    """
+    Create a script for launching d3d.
+
+    - if `use_threads is True`, and the MPI implementation is `OpenMPI`, then the CPU threads are
+      being used and `--use-hwthreaded_cpus` is passed to `mpirun`.
+    - if `use_threads is False` or the MPI implementation is `mpich`, then only physical CPU cores
+      are being used.
+    """
+    if ncores < 1:
+        ncores = psutil.cpu_count(logical=use_threads)
+    if use_threads and is_openmpi():
+        mpirun_flags = "--use-hwthread-cpus"
+    else:
+        mpirun_flags = ""
+    content = LAUNCH_D3D_TEMPLATE.format(
+        mpirun_flags=mpirun_flags,
+        ncores=ncores,
+        #        cmd=cmd,
+    )
+    # Write to disk and make executable
+    script_path = target_dir + "/" + script_name
+    with open(script_path, "w") as fd:
+        fd.write(content)
+    make_executable(script_path)
+    return script_path
+
+
 def open_dataset(source: os.PathLike, **kwargs) -> xr.Dataset:
     """
     A wrapper around `xr.open_dataset` that supports multiple engines
diff --git a/pyposeidon/utils/cast.py b/pyposeidon/utils/cast.py
index 61e13429..e06e8c7b 100644
--- a/pyposeidon/utils/cast.py
+++ b/pyposeidon/utils/cast.py
@@ -96,9 +96,12 @@ def run(self, **kwargs):
             info[info.isnull().values] = None
             info = info.to_dict()[0]
 
-        args = set(kwargs.keys()).intersection(info.keys())  # modify dic with kwargs
-        for attr in list(args):
-            info[attr] = kwargs[attr]
+        try:
+            args = set(kwargs.keys()).intersection(info.keys())  # modify dic with kwargs
+            for attr in list(args):
+                info[attr] = kwargs[attr]
+        except:
+            pass
 
         # update the properties
         info["date"] = self.date
diff --git a/pyposeidon/utils/data.py b/pyposeidon/utils/data.py
index 2de9cfd3..1096e052 100644
--- a/pyposeidon/utils/data.py
+++ b/pyposeidon/utils/data.py
@@ -91,8 +91,8 @@ def __init__(self, **kwargs):
         self.dem = xr.Dataset(
             {"bathymetry": (["latitude", "longitude"], -b)},
             coords={
-                "longitude": ("longitude", grid.lons[0, :]),
-                "latitude": ("latitude", grid.lats[:, 0]),
+                "longitude": ("longitude", grid.lons[0, :].values),
+                "latitude": ("latitude", grid.lats[:, 0].values),
             },
         )
 
diff --git a/pyposeidon/utils/hfun.py b/pyposeidon/utils/hfun.py
index 0e80007e..f8b4441b 100644
--- a/pyposeidon/utils/hfun.py
+++ b/pyposeidon/utils/hfun.py
@@ -4,7 +4,6 @@
 import numpy as np
 import xarray as xr
 from .limgrad import limgrad2
-import matplotlib
 from pyposeidon.utils.stereo import to_lat_lon, to_stereo
 from pyposeidon.utils.topology import MakeTriangleFaces, MakeTriangleFaces_periodic
 from pyposeidon.utils.scale import scale_dem
@@ -12,32 +11,50 @@
 import math
 
 
-def get_hfun(dem, path=".", tag="jigsaw", resolution_min=0.01, resolution_max=0.5, dhdx=0.15, imax=100, **kwargs):
-
-    # scale bathymetry
-    try:
-        b = dem.adjusted.to_dataframe()
-    except:
-        b = dem.elevation.to_dataframe()
-
-    b = b.reset_index()
-    b.columns = ["longitude", "latitude", "z"]
-
-    nodes = scale_dem(b, resolution_min, resolution_max, **kwargs)
+def get_edges(nrows: int, ncols: int) -> np.array:
+    array = np.arange(nrows * ncols).reshape(nrows, ncols)
+    pairs = np.row_stack(
+        (
+            *[
+                np.column_stack(
+                    (
+                        array[row],
+                        np.roll(array[row], -1),
+                    )
+                )[:-1]
+                for row in range(nrows)
+            ],
+            *[np.column_stack((array[:, col], np.roll(array[:, col], -1)))[:-1] for col in range(ncols)],
+            *[
+                np.row_stack(
+                    (
+                        array[row],
+                        np.roll(array[row + 1], 1),
+                    )
+                )[:, 1:].T
+                for row in range(nrows - 1)
+            ],
+        )
+    )
+    return pairs
 
-    x = dem.longitude.values
-    y = dem.latitude.values
 
-    tria = MakeTriangleFaces(y.shape[0], x.shape[0])
+def get_hfun(dem, path=".", tag="jigsaw", resolution_min=0.01, resolution_max=0.5, dhdx=0.15, imax=100, **kwargs):
 
+    # scale bathymetry
+    if "adjusted" in dem.data_vars:
+        bathymetry = dem.adjusted.to_dataframe().reset_index()
+        shape = dem.adjusted.shape
+    else:
+        bathymetry = dem.elevation.to_dataframe().reset_index()
+        shape = dem.elevation.shape
+    bathymetry.columns = ["longitude", "latitude", "z"]
+
+    nodes = scale_dem(bathymetry, resolution_min, resolution_max, **kwargs)
     points = np.column_stack([nodes.longitude, nodes.latitude])
-    tria3 = pd.DataFrame(tria, columns=["a", "b", "c"])
 
-    # Use Matplotlib for triangulation
-    triang = matplotlib.tri.Triangulation(points[:, 0], points[:, 1], tria)
-    #    tri3 = triang.triangles
-    edges = triang.edges
-    # edge lengths
+    edges = get_edges(*shape)
+
     ptdiff = lambda p: (p[0][0] - p[1][0], p[0][1] - p[1][1])
     diffs = map(ptdiff, points[edges])
     elen = [math.hypot(d1, d2) for d1, d2 in diffs]
@@ -47,11 +64,11 @@ def get_hfun(dem, path=".", tag="jigsaw", resolution_min=0.01, resolution_max=0.
 
     [fun, flag] = limgrad2(edges, elen, hfun, dhdx, imax)
 
-    cfun = fun.flatten().reshape((y.shape[0], x.shape[0]))
+    cfun = fun.flatten().reshape(shape)
 
     dh = xr.Dataset(
         {"h": (["latitude", "longitude"], cfun)},
-        coords={"longitude": ("longitude", x), "latitude": ("latitude", y)},
+        coords={"longitude": ("longitude", dem.longitude.values), "latitude": ("latitude", dem.latitude.values)},
     )
 
     return dh
diff --git a/pyposeidon/utils/isodem.py b/pyposeidon/utils/isodem.py
new file mode 100644
index 00000000..bb3e7856
--- /dev/null
+++ b/pyposeidon/utils/isodem.py
@@ -0,0 +1,82 @@
+def get_dem_contours(blevels, dem):
+
+    if len(blevels) == 1:
+        dvalues = [blevels[0] - 1, blevels[0]]
+    elif len(blevels) == 2:
+        dvalues = blevels
+    else:
+        logger.error("blevels not set properly")
+        sys.exit(1)
+
+    # check if in range
+    r_check = [dem.elevation.values.min() < x < dem.elevation.values.max() for x in dvalues]
+
+    if not any(r_check):
+        logger.warning(
+            "blevels not within DEM range {}:{}".format(dem.elevation.values.min(), dem.elevation.values.max())
+        )
+        return gp.GeoDataFrame(geometry=[])
+    try:
+        dem.adjusted.plot.contour(levels=dvalues)
+    except:
+        dem.elevation.plot.contour(levels=dvalues)
+
+    # get graph
+    cs = plt.gca()
+
+    # outer contour
+    outc = []
+    outl = cs.collections[0].get_paths()
+    for l in range(len(outl)):
+        v = outl[l].vertices
+        try:
+            outc.append(shapely.geometry.LineString(v))
+        except:
+            pass
+
+    # inner contour
+    inc = []
+    inl = cs.collections[1].get_paths()
+    for l in range(len(inl)):
+        v = inl[l].vertices
+        try:
+            inc.append(shapely.geometry.LineString(v))
+        except:
+            pass
+
+    # Get continuous area
+    lon_min = dem.longitude.min()
+    lon_max = dem.longitude.max()
+    lat_min = dem.latitude.min()
+    lat_max = dem.latitude.max()
+
+    # create a polygon of the lat/lon window
+    grp = shapely.geometry.Polygon([(lon_min, lat_min), (lon_min, lat_max), (lon_max, lat_max), (lon_max, lat_min)])
+
+    # outer contour
+    b1 = []
+    for geo_ in outc:
+        ee = shapely.ops.split(grp, geo_)
+        try:
+            b1.append(ee[1])
+        except:
+            pass
+    # inner contour
+    b2 = []
+    for geo_ in inc:
+        ee = shapely.ops.split(grp, geo_)
+        try:
+            b2.append(ee[1])
+        except:
+            pass
+
+    w1 = gp.GeoDataFrame(geometry=b1)
+    w1_ = w1.unary_union
+    w1 = gp.GeoDataFrame(geometry=[w1_])
+
+    w2 = gp.GeoDataFrame(geometry=b2)
+    w2_ = w2.unary_union
+    w2 = gp.GeoDataFrame(geometry=[w2_])
+
+    plt.close("all")
+    return w1.loc[~w1.is_empty]  # cleanup
diff --git a/pyposeidon/utils/post.py b/pyposeidon/utils/post.py
index f0e1d2ed..5e240b2c 100644
--- a/pyposeidon/utils/post.py
+++ b/pyposeidon/utils/post.py
@@ -27,7 +27,7 @@ def to_thalassa(folders, freq=None, **kwargs):
 
     for folder in folders:
 
-        b = pyposeidon.read(folder + "/{}_model.json".format(tag))
+        b = pyposeidon.model.read(folder + "/{}_model.json".format(tag))
         b.get_output_data()
         st = b.data.time_series
         b.data.Dataset.to_netcdf(rpath + "/{}.nc".format(b.start_date.strftime("%Y%m%d%H")))  # save netcdf
diff --git a/pyposeidon/utils/pplot.py b/pyposeidon/utils/pplot.py
index 1ad9b390..3592307e 100644
--- a/pyposeidon/utils/pplot.py
+++ b/pyposeidon/utils/pplot.py
@@ -442,7 +442,7 @@ def quiver(self, it=None, u=None, v=None, title=None, scale=0.1, color="k", **kw
 
         return p  # , ax
 
-    def mesh(self, **kwargs):
+    def mesh(self, lw: float = 0.5, markersize: float = 1.0, **kwargs):
 
         x = kwargs.get("x", self._obj.SCHISM_hgrid_node_x[:].values)
         y = kwargs.get("y", self._obj.SCHISM_hgrid_node_y[:].values)
@@ -469,8 +469,7 @@ def mesh(self, **kwargs):
         # ax.background_patch.set_facecolor('k')
 
         ax.set_aspect("equal")
-
-        g = plt.triplot(x, y, tri3, "go-", **kwargs)  # , lw=.5, markersize=5)#, transform=ccrs.PlateCarree() )
+        g = plt.triplot(x, y, tri3, "go-", lw=lw, markersize=markersize, **kwargs)  # transform=ccrs.PlateCarree() )
 
         lw = kwargs.get("lw", plt.rcParams["lines.linewidth"])
         # https://stackoverflow.com/questions/52202014/how-can-i-plot-2d-fem-results-using-matplotlib
diff --git a/pyproject.toml b/pyproject.toml
index 2eed91be..9f10dba3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -47,7 +47,7 @@ netCDF4 = "^1.5"
 numpy = ">=1.20, <2.0"
 pandas = "^1.3"
 psutil = "^5.8"
-Pydap = { url = "https://github.com/pydap/pydap/archive/3f6aa190c59e3bbc6c834377a61579b20275ff69.zip" }
+pydap = ">=3.3.0"
 pygeos = ">=0.10, <1.0"
 pyresample = "^1.17"
 rasterio = "^1.2"


Test patch:
diff --git a/tests/pytest.ini b/tests/pytest.ini
new file mode 100644
index 00000000..4554307d
--- /dev/null
+++ b/tests/pytest.ini
@@ -0,0 +1,5 @@
+[pytest]
+markers =
+    delft: mark a test as a d3d test.
+    schism: mark a test as a schism test.
+    slow: mark a test as a slow test.
diff --git a/tests/test_boundary.py b/tests/test_boundary.py
index b4c64def..e5ad0864 100644
--- a/tests/test_boundary.py
+++ b/tests/test_boundary.py
@@ -1,29 +1,23 @@
 import pyposeidon.boundary as pb
 import pytest
 import geopandas as gp
-import cartopy.feature as cf
 
 from . import DATA_DIR
 
 noaa = DATA_DIR / "bl.zip"
 
-land = cf.NaturalEarthFeature(category="physical", name="land", scale="50m")
-nland = gp.GeoDataFrame(geometry=[x for x in land.geometries()])
+COAST_FILE = (DATA_DIR / "ocean.zip").as_posix()
 
-coast = cf.NaturalEarthFeature(category="physical", name="coastline", scale="50m")
-ncoast = gp.GeoDataFrame(geometry=[x for x in coast.geometries()])
+land = gp.read_file(COAST_FILE).drop("FID", axis=1)
+coast = gp.GeoDataFrame(geometry=land.boundary)
 
-# gh = cf.GSHHSFeature(scale="intermediate", levels=[1])
-# iGSHHS = gp.GeoDataFrame(geometry=[x for x in gh.geometries()])
-
-
-INPUTS = pytest.mark.parametrize("input", [nland, ncoast])  # , iGSHHS])
+INPUTS = pytest.mark.parametrize("input", [land, coast])
 CUSTOM = pytest.mark.parametrize("boundary", [noaa])
 WINDOWS = pytest.mark.parametrize(
     "window",
     [
         {"lon_min": -30, "lon_max": -10.0, "lat_min": 60.0, "lat_max": 70.0},
-        {"lon_min": 175.0, "lon_max": 184.0, "lat_min": 14.5, "lat_max": 16.5},
+        {"lon_min": 175.0, "lon_max": 184.0, "lat_min": -50, "lat_max": -30},
     ],
 )
 DEM_SOURCES = pytest.mark.parametrize(
@@ -61,21 +55,21 @@ def test_buffer(tmpdir, window, input):
     assert isinstance(df.contours, gp.GeoDataFrame)
 
 
-@INPUTS
-@WINDOWS
-@DEM_SOURCES
-def test_isodem(tmpdir, window, input, dem_source):
-    df = pb.Boundary(geometry=window, dem_source=dem_source, blevels=[-100], rpath=str(tmpdir) + "/")
-    assert isinstance(df.contours, gp.GeoDataFrame)
+# @INPUTS
+# @WINDOWS
+# @DEM_SOURCES
+# def test_isodem(tmpdir, window, input, dem_source):
+#    df = pb.Boundary(geometry=window, dem_source=dem_source, blevels=[-100], rpath=str(tmpdir) + "/")
+#    assert isinstance(df.contours, gp.GeoDataFrame)
 
 
-@pytest.mark.slow
-def test_isodem_with_url(tmpdir):
-    input = nland
-    window = {"lon_min": 176.5, "lon_max": 177.0, "lat_min": 16.0, "lat_max": 16.5}
-    dem_source = "https://coastwatch.pfeg.noaa.gov/erddap/griddap/srtm30plus"
-    df = pb.Boundary(geometry=window, dem_source=dem_source, blevels=[-100], rpath=str(tmpdir) + "/")
-    assert isinstance(df.contours, gp.GeoDataFrame)
+# @pytest.mark.slow
+# def test_isodem_with_url(tmpdir):
+#    input = nland
+#    window = {"lon_min": 176.5, "lon_max": 177.0, "lat_min": 16.0, "lat_max": 16.5}
+#    dem_source = "https://coastwatch.pfeg.noaa.gov/erddap/griddap/srtm30plus"
+#    df = pb.Boundary(geometry=window, dem_source=dem_source, blevels=[-100], rpath=str(tmpdir) + "/")
+#    assert isinstance(df.contours, gp.GeoDataFrame)
 
 
 @CUSTOM
diff --git a/tests/test_d3d.py b/tests/test_d3d.py
index f54f0a5b..469d964c 100644
--- a/tests/test_d3d.py
+++ b/tests/test_d3d.py
@@ -29,10 +29,10 @@ def test_d3d(tmpdir, dic):
     dic.update({"rpath": rpath})  # use tmpdir for running the model
     b = pyposeidon.model.set(**dic)
     b.execute()
-    out_b = data.get_output(**dic)
+    b.get_output_data()
 
-    a = pyposeidon.read(rpath + "d3d_model.json")  # read model
+    a = pyposeidon.model.read(rpath + "d3d_model.json")  # read model
     a.execute()
-    out_a = data.get_output(**dic)
+    a.get_output_data()
 
-    assert out_a == out_b
+    assert a.data.Dataset.equals(b.data.Dataset)
diff --git a/tests/test_d3d_cast.py b/tests/test_d3d_cast.py
index 755fe37b..eb271dca 100644
--- a/tests/test_d3d_cast.py
+++ b/tests/test_d3d_cast.py
@@ -116,6 +116,7 @@ def d3d(tmpdir):
     return test
 
 
+@pytest.mark.xfail
 @pytest.mark.delft
 def test_answer(tmpdir):
     assert d3d(tmpdir) == True
diff --git a/tests/test_dem_fix.py b/tests/test_dem_fix.py
index d1f20ae7..18cff7b7 100644
--- a/tests/test_dem_fix.py
+++ b/tests/test_dem_fix.py
@@ -3,10 +3,11 @@
 import pytest
 import numpy as np
 import geopandas as gp
-import cartopy.feature as cf
 
 from . import DATA_DIR
 
+COAST_FILE = (DATA_DIR / "ocean.zip").as_posix()
+
 DEM_SOURCES = pytest.mark.parametrize(
     "dem_source",
     [
@@ -19,26 +20,25 @@
     "window",
     [
         {"lon_min": -30, "lon_max": -10.0, "lat_min": 60.0, "lat_max": 70.0},
-        {"lon_min": 175.0, "lon_max": 185.0, "lat_min": -21.5, "lat_max": -14.5},
-        {"lon_min": -185.0, "lon_max": -175.0, "lat_min": -21.5, "lat_max": -14.5},
+        {"lon_min": 165.0, "lon_max": 185.0, "lat_min": -50, "lat_max": -30},
+        {"lon_min": -185.0, "lon_max": -165.0, "lat_min": -50, "lat_max": -30},
         {"lon_min": -3, "lon_max": 1.0, "lat_min": 42.0, "lat_max": 45.0},
     ],
 )
 
 
 @pytest.fixture(scope="session")
-def natural_earth():
-    coast = cf.NaturalEarthFeature(category="physical", name="land", scale="110m")
-    gdf = gp.GeoDataFrame(geometry=[x.buffer(0.001) for x in coast.geometries()])
-    return gdf
+def coasts():
+    coast = gp.read_file(COAST_FILE).drop("FID", axis=1)
+    return coast
 
 
 @DEM_SOURCES
 @WINDOWS
-def test_dem_adjust(natural_earth, dem_source, window):
+def test_dem_adjust(coasts, dem_source, window):
     # Just elevation
     df = pdem.Dem(**window, dem_source=dem_source)  # get dem
-    df.adjust(natural_earth)
+    df.adjust(coasts)
     assert np.isnan(df.Dataset.adjusted.values).sum() == 0
 
 
@@ -46,11 +46,11 @@ def test_dem_adjust(natural_earth, dem_source, window):
 @pytest.mark.schism
 @DEM_SOURCES
 @WINDOWS
-def test_schism_mesh(tmpdir, natural_earth, dem_source, window):
+def test_schism_mesh(tmpdir, coasts, dem_source, window):
     mesh = pmesh.set(
         type="tri2d",
         geometry=window,
-        coastlines=natural_earth,
+        coastlines=coasts,
         mesh_generator="jigsaw",
         rpath=str(tmpdir) + "/",
     )
@@ -58,7 +58,7 @@ def test_schism_mesh(tmpdir, natural_earth, dem_source, window):
     yg = mesh.Dataset.SCHISM_hgrid_node_y.values
     dem = pdem.Dem(**window, dem_source=dem_source, adjust_dem=False)  # get dem
     dem.Dataset = pdem.dem_on_mesh(dem.Dataset, grid_x=xg, grid_y=yg)  # get dem on mesh
-    dem.adjust(natural_earth)
+    dem.adjust(coasts)
     assert np.isnan(dem.Dataset.fval.values).sum() == 0
 
 
@@ -66,11 +66,11 @@ def test_schism_mesh(tmpdir, natural_earth, dem_source, window):
 @pytest.mark.delft
 @DEM_SOURCES
 @WINDOWS
-def test_d3d_mesh(tmpdir, natural_earth, dem_source, window):
+def test_d3d_mesh(tmpdir, coasts, dem_source, window):
     mesh = pmesh.set(type="r2d", geometry=window, resolution=0.1, rpath=str(tmpdir) + "/")
     gr = mesh.Dataset
     xp, yp = gr.lons.values, gr.lats.values
     dem = pdem.Dem(**window, dem_source=dem_source, adjust_dem=False)  # get dem
     dem.Dataset = pdem.dem_on_mesh(dem.Dataset, grid_x=xp, grid_y=yp)  # get dem on mesh
-    dem.adjust(natural_earth)
+    dem.adjust(coasts)
     assert np.isnan(dem.Dataset.fval.values).sum() == 0
diff --git a/tests/test_grid.py b/tests/test_grid.py
index 249e5d3a..dae4945e 100644
--- a/tests/test_grid.py
+++ b/tests/test_grid.py
@@ -2,56 +2,30 @@
 import numpy as np
 import pytest
 import os
-import geopandas as gp
-import cartopy.feature as cf
 
+from . import DATA_DIR
 
-cr = "i"
-coast = cf.NaturalEarthFeature(
-    category="physical",
-    name="land",
-    scale="{}m".format({"l": 110, "i": 50, "h": 10}[cr]),
-)
-
-
-natural_earth = gp.GeoDataFrame(geometry=[x for x in coast.geometries()])
-
-coast = cf.GSHHSFeature(scale="auto", levels=[1])
-
-GSHHS = gp.GeoDataFrame(geometry=[x for x in coast.geometries()])
-
+COAST_FILE = (DATA_DIR / "ocean.zip").as_posix()
 
-# define the lat/lon window and time frame of interest
-window0 = {"lon_min": -30, "lon_max": -10.0, "lat_min": 60.0, "lat_max": 70.0}
-
-window1 = {
-    "lon_min": 175.0,
-    "lon_max": 184.0,
-    "lat_min": -21.5,
-    "lat_max": -14.5,
-}  # lat/lon window
-
-window2 = {"lon_min": -20.0, "lon_max": -10.0, "lat_min": 63.0, "lat_max": 67.0}
-
-window3 = {
-    "lon_min": 175.0 - 360.0,
-    "lon_max": 184.0 - 360.0,
-    "lat_min": -21.5,
-    "lat_max": -14.5,
-}  # lat/lon window
-
-window4 = {"lon_min": -25.0, "lon_max": -10.0, "lat_min": 60.0, "lat_max": 68.0}
+WINDOWS = pytest.mark.parametrize(
+    "window",
+    [
+        {"lon_min": -30, "lon_max": -10.0, "lat_min": 60.0, "lat_max": 70.0},
+        {"lon_min": 165.0, "lon_max": 185.0, "lat_min": -50, "lat_max": -30},
+        {"lon_min": -185.0, "lon_max": -165.0, "lat_min": -50, "lat_max": -30},
+        {"lon_min": -25.0, "lon_max": -10.0, "lat_min": 60.0, "lat_max": 68.0},
+    ],
+)
 
 
-@pytest.mark.parametrize("window", [window0, window1, window2, window3, window4])
-@pytest.mark.parametrize("coast", [natural_earth, GSHHS])
+@WINDOWS
 @pytest.mark.parametrize("ggor", ["jigsaw", "gmsh"])
-def test_answer(tmpdir, window, coast, ggor):
+def test_answer(tmpdir, window, ggor):
 
     mesh = pmesh.set(
         type="tri2d",
         geometry=window,
-        coastlines=coast,
+        coastlines=COAST_FILE,
         rpath=str(tmpdir) + "/",
         mesh_generator=ggor,
     )
diff --git a/tests/test_grid_global.py b/tests/test_grid_global.py
index f147043c..46c37a07 100644
--- a/tests/test_grid_global.py
+++ b/tests/test_grid_global.py
@@ -3,7 +3,6 @@
 import pytest
 import os
 import geopandas as gp
-import cartopy.feature as cf
 
 from . import DATA_DIR
 
@@ -21,6 +20,11 @@ def test_io(pytestconfig, tmpdir, ggor, bgmesh, bindings):
         if not pytestconfig.getoption("--runslow"):
             pytest.skip("slow test")
 
+    if ggor == "jigsaw":
+        cb = 0.001
+    else:
+        cb = None
+
     mesh = pmesh.set(
         type="tri2d",
         geometry="global",
@@ -29,6 +33,7 @@ def test_io(pytestconfig, tmpdir, ggor, bgmesh, bindings):
         mesh_generator=ggor,
         dem_source=bgmesh,
         use_bindings=bindings,
+        cbuffer=cb,
     )
 
     # save to file
@@ -55,6 +60,7 @@ def test_io(pytestconfig, tmpdir, ggor, bgmesh, bindings):
     assert all([c == True for c in [check1, check2]])
 
 
+@pytest.mark.schism
 @pytest.mark.parametrize("ggor", ["jigsaw", "gmsh"])
 @pytest.mark.parametrize("bgmesh", [None, DEM_FILE])
 @pytest.mark.parametrize("bindings", [True, False])
@@ -63,6 +69,11 @@ def test_validate(pytestconfig, tmpdir, ggor, bgmesh, bindings):
         if not pytestconfig.getoption("--runslow"):
             pytest.skip("slow test")
 
+    if ggor == "jigsaw":
+        cb = 0.001
+    else:
+        cb = None
+
     mesh = pmesh.set(
         type="tri2d",
         geometry="global",
@@ -71,6 +82,7 @@ def test_validate(pytestconfig, tmpdir, ggor, bgmesh, bindings):
         mesh_generator=ggor,
         dem_source=bgmesh,
         use_bindings=bindings,
+        cbuffer=cb,
     )
 
     rpath = str(tmpdir) + "/"
diff --git a/tests/test_schism_grid.py b/tests/test_schism_grid.py
index 652d55c1..e47a73d1 100644
--- a/tests/test_schism_grid.py
+++ b/tests/test_schism_grid.py
@@ -7,7 +7,7 @@
 
 def func(tmpdir, name):
 
-    filename = DATA_DIR / name
+    filename = str(DATA_DIR / name)
     # read mesh file
     mesh = pmesh.set(type="tri2d", mesh_file=filename)
 
diff --git a/tests/test_schism_total.py b/tests/test_schism_total.py
index de419a8e..48c10520 100644
--- a/tests/test_schism_total.py
+++ b/tests/test_schism_total.py
@@ -3,23 +3,19 @@
 import os
 import multiprocessing
 import geopandas as gp
-import cartopy.feature as cf
 
 from . import DATA_DIR
 
 DEM_FILE = DATA_DIR / "dem.nc"
 
-coast = cf.GSHHSFeature(scale="auto", levels=[1])
-
-GSHHS = gp.GeoDataFrame(geometry=[x for x in coast.geometries()])
-
+COAST_FILE = (DATA_DIR / "ocean.zip").as_posix()
 
 WINDOWS = pytest.mark.parametrize(
     "window",
     [
         {"lon_min": -30, "lon_max": -10.0, "lat_min": 60.0, "lat_max": 70.0},
-        {"lon_min": 175.0, "lon_max": 185.0, "lat_min": -21.5, "lat_max": -14.5},
-        {"lon_min": -185.0, "lon_max": -175.0, "lat_min": -21.5, "lat_max": -14.5},
+        {"lon_min": 165.0, "lon_max": 185.0, "lat_min": -50, "lat_max": -30},
+        {"lon_min": -185.0, "lon_max": -165.0, "lat_min": -50, "lat_max": -30},
         {"lon_min": -25.0, "lon_max": -10.0, "lat_min": 60.0, "lat_max": 68.0},
     ],
 )
@@ -32,13 +28,13 @@ def test_schism(tmpdir, window):
     dic = {
         "solver_name": "schism",
         "geometry": window,
-        "coastlines": GSHHS,
+        "coastlines": COAST_FILE,
         "manning": 0.12,
         "windrot": 0.00001,
         "tag": "test",
         "start_date": "2017-10-1 0:0:0",
         "time_frame": "12H",
-        "mesh_generator": "jigsaw",
+        "mesh_generator": "gmsh",
         "meteo_source": [DATA_DIR / "erai.grib"],  # meteo file
         "dem_source": DEM_FILE,
         "update": ["all"],  # update only meteo, keep dem
diff --git a/tests/test_tools.py b/tests/test_tools.py
index 3fd1e96c..f5da658e 100644
--- a/tests/test_tools.py
+++ b/tests/test_tools.py
@@ -13,11 +13,11 @@
 
 @pytest.mark.skipif(not shutil.which("mpirun"), reason="requires MPI backend")
 @pytest.mark.parametrize("use_threads", [True, False])
-def test_create_mpirun_script(tmp_path, use_threads):
+def test_create_schism_mpirun_script(tmp_path, use_threads):
     target_dir = tmp_path.as_posix()
     cmd = "/bin/schism"
     script_name = "launchSchism.sh"
-    script_path = tools.create_mpirun_script(target_dir=target_dir, cmd=cmd, use_threads=use_threads)
+    script_path = tools.create_schism_mpirun_script(target_dir=target_dir, cmd=cmd, use_threads=use_threads)
     assert script_path == (tmp_path / script_name).as_posix(), "script was not created"
     assert os.access(script_path, os.X_OK), "script is not executable"
     assert not (tmp_path / "outputs").exists(), "outputs subdirectory has not been created"
@@ -28,11 +28,11 @@ def test_create_mpirun_script(tmp_path, use_threads):
 
 @pytest.mark.skipif(not shutil.which("mpirun"), reason="requires MPI backend")
 @pytest.mark.parametrize("ncores", [1, 2, 44])
-def test_create_mpirun_script_ncores(tmp_path, ncores):
+def test_create_schism_mpirun_script_ncores(tmp_path, ncores):
     target_dir = tmp_path.as_posix()
     cmd = "/bin/schism"
     script_name = "launchSchism.sh"
-    script_path = tools.create_mpirun_script(target_dir=target_dir, cmd=cmd, ncores=ncores)
+    script_path = tools.create_schism_mpirun_script(target_dir=target_dir, cmd=cmd, ncores=ncores)
     assert script_path == (tmp_path / script_name).as_posix(), "script was not created"
     assert os.access(script_path, os.X_OK), "script is not executable"
     assert not (tmp_path / "outputs").exists(), "outputs subdirectory has not been created"
@@ -48,7 +48,7 @@ def test_create_mpirun_script_ncores(tmp_path, ncores):
         pytest.param(DATA_DIR / "dem.tif", id="geotiff - pathlib"),
         pytest.param((DATA_DIR / "dem.nc").as_posix(), id="netcdf- str"),
         pytest.param((DATA_DIR / "dem.tif").as_posix(), id="geotiff - str"),
-        pytest.param("https://coastwatch.pfeg.noaa.gov/erddap/griddap/srtm30plus", id="URL"),
+        #        pytest.param("https://coastwatch.pfeg.noaa.gov/erddap/griddap/srtm30plus", id="URL"),
     ],
 )
 def test_open_dataset(source) -> None: