diff --git a/image_template.html b/image_template.html
index 38f4380c551f78bd108d4b1054d67adaef434537..98e693e9691ba3a6078d27cbe48feeedd28e7444 100644
--- a/image_template.html
+++ b/image_template.html
@@ -119,5 +119,28 @@ ${ALTERNATIVES}
 ${ALTO_ELEMENTS_HTML}
 </div>
 
+<h2>Presentation preview</h2>
+<p>Downscaled to 150DPI source equivalent, leveled, unsharpened and stored as JPEG.</p>
+<div id="presentation-display" class="openseadragon">
+</div>
+<script type="text/javascript">
+    presentationDragon = OpenSeadragon({
+    id:            "presentation-display",
+    maxZoomLevel: 2,
+
+    showNavigator:  false,
+    wrapHorizontal: false,
+    tileSources: {
+      type: 'legacy-image-pyramid',
+      levels:[
+        {
+          url: '${PRESENTATION}',
+          width:  ${PRESENTATION_WIDTH},
+          height: ${PRESENTATION_HEIGHT}
+        },
+      ]
+    }});
+</script>
+
 </body>
 </html>
diff --git a/quack.css b/quack.css
index 24ec5f83abfe421d2f8dd0ea3b571358004ab268..671d513bed9ae8b165c392439e2ec5116fdf2605 100644
--- a/quack.css
+++ b/quack.css
@@ -140,4 +140,12 @@ ul.alternatives li + li:before {
 .whiteoverlay {
     background-size: 100% 100%;
     pointer-events: none;
-}
\ No newline at end of file
+}
+
+#presentation-display {
+    position: relative;
+    margin-right: 340px;
+    height: 900px;
+    border: 1px solid black;
+    overflow: hidden;
+}
diff --git a/quack.sh b/quack.sh
index 00fb5e842c8f79eecc15d6c71bc6d2620c0a69a2..91f236320abae79bc1b9f798f3abf5d500a5f0da 100755
--- a/quack.sh
+++ b/quack.sh
@@ -77,7 +77,7 @@ if [ -e "quack.settings" ]; then
     echo "Sourcing settings from quack.settings"
     source "quack.settings"
 fi
-
+PRESENTATION_SCRIPT="$ROOT/presentation.sh"
 popd > /dev/null
 
 FOLDER_TEMPLATE="$ROOT/folder_template.html"
@@ -162,28 +162,33 @@ function makeImageParams() {
     THUMB_IMAGE="${DEST_FOLDER}/${BASE}.thumb.jpg"
     WHITE_IMAGE="${DEST_FOLDER}/${BASE}.white${IMAGE_DISP_EXT}"
     BLACK_IMAGE="${DEST_FOLDER}/${BASE}.black${IMAGE_DISP_EXT}"
+    PRESENTATION_IMAGE="${DEST_FOLDER}/${BASE}.presentation.jpg"
 }
 
 # Creates a presentation image and a histogram for the given image
-# srcFolder dstFolder image crop
+# srcFolder dstFolder image crop presentation_script
 function makeImages() {
     local SRC_FOLDER=$1
     local DEST_FOLDER=$2
     local IMAGE=$3
     local CROP_PERCENT=$5
+    local PRESENTATION_SCRIPT=$6
 
 #    echo "makeImages $SRC_FOLDER $DEST_FOLDER"
 
     local SANS_PATH=${IMAGE##*/}
     local BASE=${SANS_PATH%.*}
 
-    # Should mirror the ones in makeImageParams
+    # Must mirror the ones in makeImageParams
+    # Do not cheat by calling makeImageParams as makeImages might
+    # be called in parallel
     local SOURCE_IMAGE="${SRC_FOLDER}/${IMAGE}"
     local DEST_IMAGE="${DEST_FOLDER}/${BASE}${IMAGE_DISP_EXT}"
     local HIST_IMAGE="${DEST_FOLDER}/${BASE}.histogram${IMAGE_DISP_EXT}"
     local THUMB_IMAGE="${DEST_FOLDER}/${BASE}.thumb.jpg"
     local WHITE_IMAGE="${DEST_FOLDER}/${BASE}.white${IMAGE_DISP_EXT}"
     local BLACK_IMAGE="${DEST_FOLDER}/${BASE}.black${IMAGE_DISP_EXT}"
+    local PRESENTATION_IMAGE="${DEST_FOLDER}/${BASE}.presentation.jpg"
 
     if [ ! -f $SOURCE_IMAGE ]; then
         echo "The source image $S does not exists" >&2
@@ -212,6 +217,11 @@ function makeImages() {
         gm convert "$CONV" -black-threshold 1,1,1 -white-threshold 0,0,0 -fill \#0000FF -opaque black -transparent white -colors 2 "$BLACK_IMAGE"
     fi
 
+    if [ ! -f $PRESENTATION_IMAGE ]; then
+        echo " - ${PRESENTATION_IMAGE##*/}"
+        $PRESENTATION_SCRIPT "$CONV" "$PRESENTATION_IMAGE"
+    fi
+
     if [ ! -f $HIST_IMAGE ]; then
         # Remove "-separate -append" to generate a RGB histogram
         # http://www.imagemagick.org/Usage/files/#histogram
@@ -423,12 +433,15 @@ function makePreviewPage() {
         exit
     fi
 
-    IDENTIFY=`identify "$DEST_IMAGE" | grep -o " [0-9]\+x[0-9]\\+ "`
+    local IDENTIFY=`identify "$DEST_IMAGE" | grep -o " [0-9]\+x[0-9]\\+ "`
     IMAGE_WIDTH=`echo $IDENTIFY | grep -o "[0-9]\+x" | grep -o "[0-9]\+"`
     IMAGE_HEIGHT=`echo $IDENTIFY | grep -o "x[0-9]\+" | grep -o "[0-9]\+"`
-    TIDENTIFY=`identify "$THUMB_IMAGE" | grep -o " [0-9]\+x[0-9]\\+ "`
+    local TIDENTIFY=`identify "$THUMB_IMAGE" | grep -o " [0-9]\+x[0-9]\\+ "`
     THUMB_WIDTH=`echo $TIDENTIFY | grep -o "[0-9]\+x" | grep -o "[0-9]\+"`
     THUMB_HEIGHT=`echo $TIDENTIFY | grep -o "x[0-9]\+" | grep -o "[0-9]\+"`
+    local PIDENTIFY=`identify "$PRESENTATION_IMAGE" | grep -o " [0-9]\+x[0-9]\\+ "`
+    PRESENTATION_WIDTH=`echo $PIDENTIFY | grep -o "[0-9]\+x" | grep -o "[0-9]\+"`
+    PRESENTATION_HEIGHT=`echo $PIDENTIFY | grep -o "x[0-9]\+" | grep -o "[0-9]\+"`
    
     if [ "true" == "$SKIP_EXISTING_PREVIEWS" -a -e "$P" ]; then
         return
@@ -475,6 +488,10 @@ function makePreviewPage() {
     IHTML=`template "$IHTML" "THUMB" "$THUMB_LINK"`
     IHTML=`template "$IHTML" "THUMB_WIDTH" "$THUMB_WIDTH"`
     IHTML=`template "$IHTML" "THUMB_HEIGHT" "$THUMB_HEIGHT"`
+    PRESENTATION_LINK=${PRESENTATION_IMAGE##*/}
+    IHTML=`template "$IHTML" "PRESENTATION" "$PRESENTATION_LINK"`
+    IHTML=`template "$IHTML" "PRESENTATION_WIDTH" "$PRESENTATION_WIDTH"`
+    IHTML=`template "$IHTML" "PRESENTATION_HEIGHT" "$PRESENTATION_HEIGHT"`
     WHITE_LINK=${WHITE_IMAGE##*/}
     IHTML=`template "$IHTML" "WHITE" "$WHITE_LINK"`
     BLACK_LINK=${BLACK_IMAGE##*/}
@@ -539,7 +556,7 @@ function makeIndex() {
     # Generate graphics
     # http://stackoverflow.com/questions/11003418/calling-functions-with-xargs-within-a-bash-script
     export -f makeImages
-    echo "$IMAGES" | xargs -n 1 -I'{}' -P $THREADS bash -c 'makeImages "$@"' _ "$SRC_FOLDER" "$DEST_FOLDER" "{}" "$THUMB_IMAGE_SIZE" "$CROP_PERCENT" \;
+    echo "$IMAGES" | xargs -n 1 -I'{}' -P $THREADS bash -c 'makeImages "$@"' _ "$SRC_FOLDER" "$DEST_FOLDER" "{}" "$THUMB_IMAGE_SIZE" "$CROP_PERCENT" "$PRESENTATION_SCRIPT" \;
 
     # Generate pages
     local THUMBS_HTML=""