diff --git a/.gitignore b/.gitignore
index 77a0f0c..9955bdb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,7 @@
-workshop/content/site
-.vs/
-# /notes.txt
-workshop/exercises/postgis-data
-notes.ignore
+workshop/content/site
+.vs/
+# /notes.txt
+workshop/exercises/postgis-data
+notes.ignore
+/workshop/exercises/mapfiles/tmp/*
+!/workshop/exercises/mapfiles/tmp/.gitkeep
diff --git a/docker/ReadMe.md b/docker/ReadMe.md
index 79df47f..a9c9516 100644
--- a/docker/ReadMe.md
+++ b/docker/ReadMe.md
@@ -47,9 +47,9 @@ docker pull geographika/mapserver-workshop:latest
# docker stop mapserver-workshop
# docker rm mapserver-workshop
docker run -it --name mapserver-workshop geographika/mapserver-workshop:latest bash
-docker start mapserver-workshop
-docker exec -it mapserver-workshop bash
# mapserv -v
+# docker start mapserver-workshop
+# docker exec -it mapserver-workshop bash
```
## Build the Demo Image
diff --git a/workshop/content/docs/advanced/direction.md b/workshop/content/docs/advanced/direction.md
new file mode 100644
index 0000000..d181990
--- /dev/null
+++ b/workshop/content/docs/advanced/direction.md
@@ -0,0 +1,8 @@
+
+
+```bash
+docker exec -it mapserver /bin/bash
+map2img -m direction.map -o direction.png
+
+map2img -m direction.map -e -1133569.01 6841714.56 -1133466.97 6841780.95 -l "raster flow" -o direction.png
+```
diff --git a/workshop/content/docs/advanced/gdalg.md b/workshop/content/docs/advanced/gdalg.md
index 78b1dca..6285087 100644
--- a/workshop/content/docs/advanced/gdalg.md
+++ b/workshop/content/docs/advanced/gdalg.md
@@ -5,7 +5,7 @@
MapServer can dynamically run a [GDAL Vector Pipeline](https://gdal.org/en/latest/programs/gdal_vector_pipeline.html), and render its output -
all through a simple Mapfile.
-In this workshop we'll use the Tartu roads dataset used in the [Line Styling](../mapfile/lines.md) exercise, dynamically
+In this workshop we'll use the Tartu roads dataset used in the [Line Styling](/mapfile/lines/) exercise, dynamically
buffer it using GDAL, and display the result in OpenLayers using a MapServer WMS.
This is a simple example of a pipeline, but additional steps can be chained together to create more complex workflows.
diff --git a/workshop/content/docs/advanced/other-projections.md b/workshop/content/docs/advanced/other-projections.md
index 1640661..9f7b252 100644
--- a/workshop/content/docs/advanced/other-projections.md
+++ b/workshop/content/docs/advanced/other-projections.md
@@ -189,7 +189,7 @@ const wmsLayer = new ImageLayer({
!!! note
- OpenLayers does not natively support WCS. In this example we use the same approach as in the [Web Coverage Services (WCS)](../outputs/wcs.md) tutorial for testing the WCS protocol.
+ OpenLayers does not natively support WCS. In this example we use the same approach as in the [Web Coverage Services (WCS)](/outputs/wcs/) tutorial for testing the WCS protocol.
Images are requested as PNGs using the [ImageWMS](https://openlayers.org/en/latest/apidoc/module-ol_source_ImageWMS-ImageWMS.html) class and a custom
[imageLoadFunction](https://openlayers.org/en/latest/apidoc/module-ol_Image.html#~LoadFunction),
as displaying GeoTIFFs directly in OpenLayers is not supported without additional libraries.
diff --git a/workshop/content/docs/advanced/raster-pipeline.md b/workshop/content/docs/advanced/raster-pipeline.md
new file mode 100644
index 0000000..c11dd4f
--- /dev/null
+++ b/workshop/content/docs/advanced/raster-pipeline.md
@@ -0,0 +1,16 @@
+# GDAL Raster Pipeline
+
+!!! warning
+
+ This page is currently in a draft form.
+
+
+```
+gdal raster info data/raster/clipped.tif
+
+gdal raster info data/raster/clipped.gdalg.json
+
+
+gdal raster pipeline ! read /etc/mapserver/data/raster/clipped.tif ! color-map --color-map /etc/mapserver/data/raster/color-map-percentage.txt ! blend --operator=hsv-value --overlay [ read /etc/mapserver/data/raster/clipped.tif ! hillshade -z 30 ] ! write /etc/mapserver/data/raster/tmp.tif --overwrite
+
+```
\ No newline at end of file
diff --git a/workshop/content/docs/advanced/symbols.md b/workshop/content/docs/advanced/symbols.md
index 5fa825b..883d2ed 100644
--- a/workshop/content/docs/advanced/symbols.md
+++ b/workshop/content/docs/advanced/symbols.md
@@ -10,7 +10,7 @@ In this exercise we'll look at how [SYMBOL](https://mapserver.org/mapfile/symbol
## Vector Symbols
-We've looked at `ELLIPSE`, and `TRUETYPE` symbols in the [Points Styling](../mapfile/points.md) exercise. In this example
+We've looked at `ELLIPSE`, and `TRUETYPE` symbols in the [Points Styling](/mapfile/points/) exercise. In this example
we'll be looking at [Vector Symbols](https://mapserver.org/mapfile/symbology/construction.html#symbols-of-type-vector-and-ellipse) - which
use vector drawings to define the shape of a symbol.
diff --git a/workshop/content/docs/assets/images/clipped.gdalg.svg b/workshop/content/docs/assets/images/clipped.gdalg.svg
new file mode 100644
index 0000000..4c0694b
--- /dev/null
+++ b/workshop/content/docs/assets/images/clipped.gdalg.svg
@@ -0,0 +1,98 @@
+
+
+
+
+
diff --git a/workshop/content/docs/assets/images/filters.png b/workshop/content/docs/assets/images/filters.png
new file mode 100644
index 0000000..66b0266
Binary files /dev/null and b/workshop/content/docs/assets/images/filters.png differ
diff --git a/workshop/content/docs/assets/images/roads.gdalg.svg b/workshop/content/docs/assets/images/roads.gdalg.svg
new file mode 100644
index 0000000..21659db
--- /dev/null
+++ b/workshop/content/docs/assets/images/roads.gdalg.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
diff --git a/workshop/content/docs/mapfile/config.md b/workshop/content/docs/mapfile/config.md
new file mode 100644
index 0000000..aaa5ea4
--- /dev/null
+++ b/workshop/content/docs/mapfile/config.md
@@ -0,0 +1,16 @@
+# MapServer Configuration File
+
+## Overview
+
+
+Set this in the config file
+ MS_ONLINERESOURCE "/"
+
+
+ Include the one used by the workshop
+
+Any changes in the CONFIG file you need to restart the web server:
+
+```bash
+docker restart mapserver
+```
\ No newline at end of file
diff --git a/workshop/content/docs/outputs/ogcapi-features-query.md b/workshop/content/docs/outputs/ogcapi-features-query.md
new file mode 100644
index 0000000..58a7133
--- /dev/null
+++ b/workshop/content/docs/outputs/ogcapi-features-query.md
@@ -0,0 +1,171 @@
+# OGCAPI Features Part 3 Filtering
+
+Filtering allows requests to an OGC API - Features service to return only the features needed.
+This can be based on feature properties, location, or a combination of both.
+In this tutorial, you'll learn how filtering is supported in MapServer and how to use it in a sample web application.
+
+