Bug 492167 - Adds Virgo recipe "Serving Web Content with Spring MVC"
diff --git a/recipe-serving-web-content/.gitignore b/recipe-serving-web-content/.gitignore
new file mode 100644
index 0000000..5fb40ad
--- /dev/null
+++ b/recipe-serving-web-content/.gitignore
@@ -0,0 +1 @@
+**/META-INF/MANIFEST.MF
diff --git a/recipe-serving-web-content/build-slides.gradle b/recipe-serving-web-content/build-slides.gradle
new file mode 100644
index 0000000..c70f6ed
--- /dev/null
+++ b/recipe-serving-web-content/build-slides.gradle
@@ -0,0 +1,106 @@
+buildscript {
+	dependencies {
+		classpath 'org.ysb33r.gradle:vfs-gradle-plugin:1.0-beta8'
+		classpath 'commons-httpclient:commons-httpclient:3.1'
+	}
+}
+
+plugins {
+  id 'org.asciidoctor.convert' version '1.5.3'
+  id 'com.github.jruby-gradle.base' version '1.2.1'
+}
+
+apply plugin: 'com.github.jruby-gradle.base'
+apply plugin: 'org.ysb33r.vfs'
+apply plugin: 'java'
+apply plugin: 'org.asciidoctor.convert'
+
+version = '1.0.0-SNAPSHOT'
+
+ext {
+	revealjsVersion = '3.2.0'
+	asciidoctorBackendVersion = 'master'
+	downloadDir = new File(buildDir,'download')
+	templateDir = new File(downloadDir,'templates')
+	revealjsDir   = new File(downloadDir,'reveal.js')
+}
+
+repositories {
+    jcenter()
+}
+
+dependencies {
+    gems 'rubygems:slim:3.0.6'
+    gems 'rubygems:thread_safe:0.3.5'
+}
+
+task download << {
+	mkdir downloadDir
+	vfs {
+		cp "zip:https://github.com/asciidoctor/asciidoctor-reveal.js/archive/${asciidoctorBackendVersion}.zip!asciidoctor-reveal.js-${asciidoctorBackendVersion}",
+				templateDir, recursive:true, overwrite:true
+		cp "zip:https://github.com/hakimel/reveal.js/archive/${revealjsVersion}.zip!reveal.js-${revealjsVersion}",
+                revealjsDir, recursive:true, overwrite:true
+	}
+}
+
+download {
+	description "Download extra revealjs resources"
+	outputs.dir templateDir
+	outputs.dir revealjsDir
+}
+
+asciidoctorj {
+  version = '1.5.4'
+}
+
+task('mergeClassesAndResources', type: Copy, dependsOn: 'compileJava') {
+	ext.bundlorInputPath = new File(buildDir, 'asciidoc-sourcedir')
+	inputs.file sourceSets.main.output.classesDir
+	inputs.file sourceSets.main.resources
+	outputs.dir ext.bundlorInputPath
+	from sourceSets.main.output.classesDir
+	from sourceSets.main.resources
+	into ext.bundlorInputPath
+}
+
+asciidoctor {
+
+    dependsOn jrubyPrepare
+
+	sources {
+		include 'recipe-serving-web-content.adoc'
+	}
+
+	resources {
+		from (sourceDir) {
+			include 'images/**'
+		}
+		from (downloadDir) {
+			include 'reveal.js/**'
+		}
+	}
+
+	backends    'revealjs'
+
+	attributes	'build-gradle': file('build-slides.gradle'),
+				'sourcedir': new File(buildDir, 'asciidoc-sourcedir'),
+				'endpoint-url': 'http://example.org',
+				'source-highlighter': 'coderay',
+				'imagesdir': './images',
+				'toc': 'left',
+				'icons': 'font',
+				'setanchors': '',
+				'idprefix': '',
+				'idseparator': '-',
+				'docinfo1': '',
+				'revealjs_theme': 'solarized',
+				'revealjs_transition': 'linear',
+				'revealjs_history': 'true',
+				'revealjs_slideNumber': 'true'
+
+	options template_dirs : [new File(templateDir,'templates/slim').absolutePath ]
+
+	dependsOn download
+	dependsOn mergeClassesAndResources
+}
diff --git a/recipe-serving-web-content/build.gradle b/recipe-serving-web-content/build.gradle
new file mode 100644
index 0000000..cf1189b
--- /dev/null
+++ b/recipe-serving-web-content/build.gradle
@@ -0,0 +1,172 @@
+buildscript {
+	repositories {
+		mavenCentral()
+        jcenter()
+	    maven {
+	      url "https://plugins.gradle.org/m2/"
+	    }
+	}
+	dependencies {
+		classpath "gradle.plugin.org.eclipse.virgo.bundlor:bundlor-plugin:0.2"
+		classpath "gradle.plugin.com.eclipsesource.dockerizor:dockerizor:0.6.2"
+        classpath 'org.asciidoctor:asciidoctor-gradle-plugin:1.5.3'
+	}
+}
+
+apply plugin: 'org.asciidoctor.convert'
+
+ext.virgoProjects = [
+	project(':org.eclipse.virgo.samples.recipe.web'),
+]
+
+ext.dockerProjects = [
+	project(':recipe-serving-web-content-runtime'),
+	project(':recipe-serving-web-content-app'),
+]
+
+configure(virgoProjects + dockerProjects) {
+	repositories {
+		mavenLocal()
+		mavenCentral()
+		ivy {
+			url "http://build.eclipse.org/rt/virgo/ivy/bundles/release/"
+			layout "pattern", { artifact "[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" }
+		}
+	}
+}
+
+configure(virgoProjects) {
+	apply plugin: 'java'
+	apply plugin: 'eclipse'
+	apply plugin: 'eclipse-wtp'
+
+	version = '0.1.0.BUILD-SNAPSHOT'
+
+	compileJava {
+		options.encoding = 'utf-8'
+		options.fork = true
+		doFirst {
+			options.forkOptions.with {
+				executable = 'java'
+				jvmArgs = [
+					'-cp',
+					configurations.ecj.asPath,
+					'org.eclipse.jdt.internal.compiler.batch.Main',
+					'-source',
+					'1.8',
+	                '-target',
+	                '1.8',
+					'-warn:-unused'
+				]
+			}
+		}
+	}
+
+	compileTestJava {
+		options.encoding = 'utf-8'
+		options.fork = true
+		doFirst {
+			options.forkOptions.with {
+				executable = 'java'
+				jvmArgs = [
+					'-cp',
+					configurations.ecj.asPath,
+					'org.eclipse.jdt.internal.compiler.batch.Main',
+					'-source',
+					'1.8',
+					'-target',
+					'1.8',
+					'-warn:-unused'
+				]
+			}
+		}
+	}
+
+	eclipse {
+		jdt {
+			sourceCompatibility = 1.8
+			targetCompatibility = 1.8
+		}
+
+		project {
+		  	natures 'org.eclipse.virgo.ide.facet.core.bundlenature', 'org.eclipse.wst.common.project.facet.core.nature'
+		}
+
+		wtp {
+		    facet {
+				facets = []
+				facet name: 'jst.java', version: '1.8'
+				facet name: 'org.eclipse.virgo.server.bundle', version: '1.0'
+			}
+		}
+	}
+
+	configurations {  ecj { } }
+
+	dependencies {
+	    ecj group: "org.eclipse.jdt.core.compiler", name: "ecj", version: "4.4.2"
+	}
+}
+
+configure(virgoProjects) {
+	apply plugin: 'org.eclipse.virgo.bundlor'
+	
+	task('addProjectVersionToGradlePropertiesTask', type: Copy) {
+		ext.outputDir = new File(buildDir, 'bundlor-properties')
+		inputs.file project.rootProject.file('gradle.properties')
+		outputs.dir ext.outputDir
+		from project.rootProject.file('gradle.properties')
+		into ext.outputDir
+	}
+
+	task('mergeClassesAndResources', type: Copy, dependsOn: 'compileJava') {
+		ext.bundlorInputPath = new File(buildDir, 'bundlor-inputPath')
+		inputs.file sourceSets.main.output.classesDir
+		inputs.file sourceSets.main.resources
+		outputs.dir ext.bundlorInputPath
+		from sourceSets.main.output.classesDir
+		from sourceSets.main.resources
+		into ext.bundlorInputPath
+	}
+
+	project.tasks.'bundlor'.dependsOn('addProjectVersionToGradlePropertiesTask', 'mergeClassesAndResources')
+
+	bundlor {
+		ext.bundlorInputPath = new File(buildDir, 'bundlor-inputPath')
+		project.tasks['bundlor'].inputs.file ext.bundlorInputPath
+		manifestTemplatePath = "template.mf"
+		propertiesPath = new File("${project.buildDir}/bundlor-properties/gradle.properties")
+		inputPath = ext.bundlorInputPath
+		failOnWarnings = false
+	}
+}
+
+configure(dockerProjects) {
+	// add the build task 'clean'
+	apply plugin: 'base'
+
+	// add the build task 'dockerize'
+	apply plugin: 'com.eclipsesource.dockerizor'
+
+	dockerizor {
+		maintainer = 'Florian Waibel <fwaibel@eclipsesource.com>'
+
+		javaImage = 'java:openjdk-8u72-jre'
+
+		virgoVersion = 'latest'
+		hudsonJobName = 'gradle-build'
+
+		createLocalCopy = System.properties['local.build'] == 'true'
+		removeAdminConsole = System.properties['local.build'] != 'true'
+
+		virgoFlavour = 'VTS'
+		virgoVersion = 'latest'
+	}
+
+	dockerize.dependsOn configurations.repositoryExt
+	dockerize.dependsOn configurations.repositoryUsr
+}
+
+task wrapper(type: Wrapper) {
+    gradleVersion = '2.10'
+}
diff --git a/recipe-serving-web-content/create-slides.sh b/recipe-serving-web-content/create-slides.sh
new file mode 100755
index 0000000..de58700
--- /dev/null
+++ b/recipe-serving-web-content/create-slides.sh
@@ -0,0 +1 @@
+./gradlew -b build-slides.gradle asciidoc && open -a "Google Chrome" build/asciidoc/revealjs/recipe-serving-web-content.html
diff --git a/recipe-serving-web-content/gradle.properties b/recipe-serving-web-content/gradle.properties
new file mode 100644
index 0000000..8f2ffa0
--- /dev/null
+++ b/recipe-serving-web-content/gradle.properties
@@ -0,0 +1,6 @@
+springframeworkVersion = 4.2.4.RELEASE
+
+javassistVersion = 3.20.0-GA
+ognlVersion = 3.1.2
+unbescapeVersion = 1.1.2.RELEASE
+thymeleafVersion = 2.1.4.VIRGO
diff --git a/recipe-serving-web-content/gradle/wrapper/gradle-wrapper.jar b/recipe-serving-web-content/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..2c6137b
--- /dev/null
+++ b/recipe-serving-web-content/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/recipe-serving-web-content/gradle/wrapper/gradle-wrapper.properties b/recipe-serving-web-content/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..53a030c
--- /dev/null
+++ b/recipe-serving-web-content/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 13 11:28:18 CEST 2016
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-bin.zip
diff --git a/recipe-serving-web-content/gradlew b/recipe-serving-web-content/gradlew
new file mode 100755
index 0000000..9d82f78
--- /dev/null
+++ b/recipe-serving-web-content/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/recipe-serving-web-content/gradlew.bat b/recipe-serving-web-content/gradlew.bat
new file mode 100644
index 0000000..5f19212
--- /dev/null
+++ b/recipe-serving-web-content/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/build.gradle b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/build.gradle
new file mode 100644
index 0000000..badae20
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/build.gradle
@@ -0,0 +1,11 @@
+dependencies {
+    ecj group: "org.eclipse.jdt.core.compiler", name: "ecj", version: "4.4.2"
+
+	compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion
+	compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.context", version: springframeworkVersion
+	compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.beans", version: springframeworkVersion
+	compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.web", version: springframeworkVersion
+
+	compile group: "org.thymeleaf", name: "thymeleaf", version: thymeleafVersion
+	compile group: "org.thymeleaf", name: "thymeleaf-spring4", version: thymeleafVersion
+}
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/java/org/eclipse/virgo/recipies/web/GreetingController.java b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/java/org/eclipse/virgo/recipies/web/GreetingController.java
new file mode 100644
index 0000000..18a767a
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/java/org/eclipse/virgo/recipies/web/GreetingController.java
@@ -0,0 +1,17 @@
+package org.eclipse.virgo.recipies.web;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@Controller
+public class GreetingController {
+
+    @RequestMapping("/")
+    public String greeting(@RequestParam(value="name", required=false, defaultValue="Thymleaf") String name, Model model) {
+        model.addAttribute("name", name);
+        return "greeting";
+    }
+
+}
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/spring/appServlet/servlet-context.xml b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/spring/appServlet/servlet-context.xml
new file mode 100644
index 0000000..1f4894a
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/spring/appServlet/servlet-context.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
+	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
+		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
+
+	<!-- Enables the Spring MVC @Controller programming model -->
+	<mvc:annotation-driven />
+
+	<context:component-scan base-package="org.eclipse.virgo.recipies.web" />
+
+	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
+		<property name="basename" value="Messages" />
+	</bean>
+
+	<!-- **************************************************************** -->
+	<!-- THYMELEAF-SPECIFIC ARTIFACTS -->
+	<!-- TemplateResolver <- TemplateEngine <- ViewResolver -->
+	<!-- **************************************************************** -->
+
+	<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
+		<property name="prefix" value="/templates/" />
+		<property name="suffix" value=".html" />
+		<property name="templateMode" value="HTML5" />
+	</bean>
+
+	<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
+		<property name="templateResolver" ref="templateResolver" />
+	</bean>
+
+	<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
+		<property name="order" value="1" />
+		<property name="templateEngine" ref="templateEngine" />
+	</bean>
+
+</beans>
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/spring/root-context.xml b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/spring/root-context.xml
new file mode 100644
index 0000000..8c901ca
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/spring/root-context.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
+	
+	<!-- Root Context: defines shared resources visible to all other web components -->
+
+</beans>
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/web.xml b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/web.xml
new file mode 100644
index 0000000..15129c3
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/web.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+	version="2.5">
+
+	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
+	<context-param>
+		<param-name>contextConfigLocation</param-name>
+		<param-value>/WEB-INF/spring/root-context.xml</param-value>
+	</context-param>
+
+    <context-param>
+        <param-name>contextClass</param-name>
+        <param-value>org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext</param-value>
+    </context-param>
+
+	<!-- Creates the Spring Container shared by all Servlets and Filters -->
+	<listener>
+		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+	</listener>
+
+	<!-- Processes application requests -->
+	<servlet>
+		<servlet-name>appServlet</servlet-name>
+		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+		<init-param>
+			<param-name>contextConfigLocation</param-name>
+			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
+		</init-param>
+		<load-on-startup>1</load-on-startup>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>appServlet</servlet-name>
+		<url-pattern>/</url-pattern>
+	</servlet-mapping>
+</web-app>
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/templates/greeting.html b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/templates/greeting.html
new file mode 100644
index 0000000..f9465f5
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/templates/greeting.html
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org">
+<head> 
+    <title>Getting Started: Serving Web Content</title> 
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+</head>
+<body>
+    <p th:text="'Hello, ' + ${name} + '!'"></p>
+
+	<p>Please add ?name=&lt;name&gt; to override the default <b>thymeleaf</b></p>
+</body>
+</html>
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/template.mf b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/template.mf
new file mode 100644
index 0000000..a84ac07
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/template.mf
@@ -0,0 +1,31 @@
+Bundle-Version: 0.1
+Bundle-Name: Virgo Recipe Serving Web Content
+Bundle-SymbolicName: org.eclipse.virgo.samples.recipe.web
+Web-ContextPath: /thymeleaf
+Bundle-ClassPath: .
+Import-Package: org.eclipse.virgo.web.dm,
+ org.springframework.web.servlet.config,
+ javax.servlet,
+ javax.servlet.http,
+ org.thymeleaf,
+ org.thymeleaf.templateresolver,
+ org.thymeleaf.spring4,
+ org.thymeleaf.spring4.context,
+ org.thymeleaf.spring4.dialect,
+ org.thymeleaf.spring4.expression,
+ org.thymeleaf.spring4.messageresolver,
+ org.thymeleaf.spring4.naming,
+ org.thymeleaf.spring4.processor.attr,
+ org.thymeleaf.spring4.requestdata,
+ org.thymeleaf.spring4.resourceresolver,
+ org.thymeleaf.spring4.templateresolver,
+ org.thymeleaf.spring4.util,
+ org.thymeleaf.spring4.view
+Import-Bundle: org.springframework.aop,
+ org.springframework.beans,
+ org.springframework.core,
+ org.springframework.context,
+ org.springframework.context.support,
+ org.springframework.expression,
+ org.springframework.web,
+ org.springframework.webmvc
diff --git a/recipe-serving-web-content/recipe-serving-web-content-app/build.gradle b/recipe-serving-web-content/recipe-serving-web-content-app/build.gradle
new file mode 100644
index 0000000..bd035ba
--- /dev/null
+++ b/recipe-serving-web-content/recipe-serving-web-content-app/build.gradle
@@ -0,0 +1,31 @@
+// add the build task 'clean'
+apply plugin: 'base'
+
+// add the build task 'dockerize'
+apply plugin: "com.eclipsesource.dockerizor"
+
+dockerize.dependsOn ':org.eclipse.virgo.samples.recipe.web:build'
+
+dockerizor {
+	repository = 'virgo-recipe/web'
+    description = 'Virgo Recipe Serving Web Content created with Gradle Plugin: com.eclipsesource.dockerizor'
+
+	pickupFiles = ['recipe-serving-web-content.plan']
+
+	virgoHome = '/home/virgo/virgo-recipe-serving-web-content'
+}
+
+repositories {
+	mavenCentral()
+}
+
+dependencies {
+    repositoryExt group: "org.thymeleaf", name: "thymeleaf", version: thymeleafVersion
+    repositoryExt group: "org.thymeleaf", name: "thymeleaf-spring4", version: thymeleafVersion
+
+    repositoryExt group: "org.javassist", name: "javassist", version: javassistVersion
+    repositoryExt group: "org.eclipse.virgo.mirrored", name: "ognl", version: ognlVersion
+	repositoryExt group: "org.unbescape", name: "unbescape", version: unbescapeVersion
+
+	repositoryUsr project(':org.eclipse.virgo.samples.recipe.web')
+}
diff --git a/recipe-serving-web-content/recipe-serving-web-content-app/recipe-serving-web-content.plan b/recipe-serving-web-content/recipe-serving-web-content-app/recipe-serving-web-content.plan
new file mode 100644
index 0000000..01bd0d4
--- /dev/null
+++ b/recipe-serving-web-content/recipe-serving-web-content-app/recipe-serving-web-content.plan
@@ -0,0 +1,9 @@
+<plan name="recipe-serving-web-content" version="0.1" scoped="false" atomic="true"
+                xmlns="http://www.eclipse.org/virgo/schema/plan"
+				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+				xsi:schemaLocation="
+					http://www.eclipse.org/virgo/schema/plan 
+					http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+        <artifact type="bundle" name="org.eclipse.virgo.samples.recipe.web" version="[0.1, 1)" />
+</plan>
diff --git a/recipe-serving-web-content/recipe-serving-web-content-runtime/build.gradle b/recipe-serving-web-content/recipe-serving-web-content-runtime/build.gradle
new file mode 100644
index 0000000..7c05080
--- /dev/null
+++ b/recipe-serving-web-content/recipe-serving-web-content-runtime/build.gradle
@@ -0,0 +1,25 @@
+// add the build task 'clean'
+apply plugin: 'base'
+
+// add the build task 'dockerize'
+apply plugin: "com.eclipsesource.dockerizor"
+
+dockerizor {
+	repository = 'virgo-recipe/web-runtime'
+	description = 'Virgo Recipe Serving Web Content (runtime-only) created with Gradle Plugin: com.eclipsesource.dockerizor'
+
+	virgoHome = '/home/virgo/virgo-recipe-serving-web-content-runtime'
+}
+
+repositories {
+	mavenCentral()
+}
+
+dependencies {
+    repositoryExt group: "org.thymeleaf", name: "thymeleaf", version: thymeleafVersion
+    repositoryExt group: "org.thymeleaf", name: "thymeleaf-spring4", version: thymeleafVersion
+
+    repositoryExt group: "org.javassist", name: "javassist", version: javassistVersion
+    repositoryExt group: "org.eclipse.virgo.mirrored", name: "ognl", version: ognlVersion
+	repositoryExt group: "org.unbescape", name: "unbescape", version: unbescapeVersion
+}
diff --git a/recipe-serving-web-content/settings.gradle b/recipe-serving-web-content/settings.gradle
new file mode 100644
index 0000000..cd6ed9c
--- /dev/null
+++ b/recipe-serving-web-content/settings.gradle
@@ -0,0 +1 @@
+include 'org.eclipse.virgo.samples.recipe.web', 'recipe-serving-web-content-runtime', 'recipe-serving-web-content-app'
diff --git a/recipe-serving-web-content/src/docs/asciidoc/recipe-serving-web-content.adoc b/recipe-serving-web-content/src/docs/asciidoc/recipe-serving-web-content.adoc
new file mode 100644
index 0000000..96f6456
--- /dev/null
+++ b/recipe-serving-web-content/src/docs/asciidoc/recipe-serving-web-content.adoc
@@ -0,0 +1,102 @@
+:virgo-homepage: https://eclipse.org/virgo
+:guide-short-name: serving-web-content
+:recipe-name: Serving Web Content with Spring MVC
+:recipe-short-name: recipe-{guide-short-name}
+:experimental: true
+
+include::../../../../recipe-template/src/docs/asciidoc/00_title.adoc[]
+include::../../../../recipe-template/src/docs/asciidoc/01_acknowledgements.adoc[]
+
+== {recipe-name}
+
+The original guide uses https://projects.spring.io/spring-boot/[Spring Boot] to bootstrap the demo application. This guide shows what needs to be done to serve web content with Virgo.
+
+include::../../../../recipe-template/src/docs/asciidoc/03_shopping-list.adoc[]
+
+include::../../../../recipe-template/src/docs/asciidoc/04_ingredients.adoc[]
+* Spring configuration
+* Web application configuration
+* OSGi manifest
+
+== Preparations
+
+include::../../../../recipe-template/src/docs/asciidoc/051_get-the-code.adoc[]
+include::../../../../recipe-template/src/docs/asciidoc/052_create-recipe-runtime.adoc[]
+include::../../../../recipe-template/src/docs/asciidoc/053_create-eclipse-project-metadata.adoc[]
+include::../../../../recipe-template/src/docs/asciidoc/054_prepare-virgo-tooling.adoc[]
+include::../../../../recipe-template/src/docs/asciidoc/055_import-the-code.adoc[]
+include::../../../../recipe-template/src/docs/asciidoc/056_create-new-virgo-server.adoc[]
+
+== Directions
+
+Virgo has no support for Spring's `@EnableAutoConfiguration`, so you have to be more explicit than in the Spring Boot version of this guide - after all, Virgo is an OSGi runtime and every bundle needs to declare its needs in the `META-INF/MANIFEST.MF`.
+
+Basically, you have to specify necessary dependencies (via `Import-Package` or `Import-Bundle` headers) and the `Web-ContextPath` the REST service application wants to be published on.
+
+=== The Manifest template
+
+.template.mf
+[source,txt]
+----
+include::../../../org.eclipse.virgo.samples.recipe.web/template.mf[]
+----
+
+You can mix and match the Virgo specific header `Import-Bundle` and OSGi standard header `Import-Package`.
+
+=== Compatibility
+
+In the sample the fine-tuning of the `MANIFEST.MF` is done within the `template.mf`.
+
+[NOTE]
+--
+If you intend to run your bundles in different OSGi containers you have to limit yourself to the OSGi standard headers.
+--
+
+=== The web.xml configuration
+
+Next step is to configure the servlet container via
+
+.WEB-INF/web.xml
+[source,xml]
+----
+include::../../../org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/web.xml[]
+----
+
+=== closer look at web.xml
+
+[CAUTION]
+--
+The most important parameter is the `contextClass`
+--
+
+It's *not* the default from the Spring Framework, but Virgo's `ServerOsgiBundleXmlWebApplicationContext`.
+
+[source,xml]
+----
+<context-param>
+    <param-name>contextClass</param-name>
+    <param-value>org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext</param-value>
+</context-param>
+----
+
+== Let's taste
+
+Start the Virgo server inside the Springsource Tool Suite to appreciate what you build.
+With `curl` and the command line simply run the following command within the project's directory:
+
+[source,sh]
+----
+$ curl -i 'http://localhost:8080/thymeleaf/?name=Virgo'
+----
+
+You should see an output like:
+
+....
+<body>
+    <p>Hello, Virgo!</p>
+</body>
+....
+
+or point your favorite browser to http://localhost:8080/thymeleaf/
+
+include::../../../../recipe-template/src/docs/asciidoc/08_dockerize_recipe.adoc[]
diff --git a/recipe-serving-web-content/start-live-server.sh b/recipe-serving-web-content/start-live-server.sh
new file mode 100755
index 0000000..ac02c90
--- /dev/null
+++ b/recipe-serving-web-content/start-live-server.sh
@@ -0,0 +1,6 @@
+#/bin/bash
+
+# install live-server globally
+# npm install -g live-server
+
+${HOME}/npm-global/lib/node_modules/live-server/live-server.js --port=9000 build/asciidoc/revealjs/
diff --git a/recipe-template/src/docs/asciidoc/00_title.adoc b/recipe-template/src/docs/asciidoc/00_title.adoc
index 66cc120..885bcaf 100644
--- a/recipe-template/src/docs/asciidoc/00_title.adoc
+++ b/recipe-template/src/docs/asciidoc/00_title.adoc
@@ -1,3 +1,3 @@
-= Virgo recipe for "{recipe-name}"
+== Virgo recipe "{recipe-name}"
 
 image:{virgo-homepage}/images/virgo-logo.png["Virgo Homepage"]
diff --git a/recipe-template/src/docs/asciidoc/01_acknowledgements.adoc b/recipe-template/src/docs/asciidoc/01_acknowledgements.adoc
index c9a1b32..6687711 100644
--- a/recipe-template/src/docs/asciidoc/01_acknowledgements.adoc
+++ b/recipe-template/src/docs/asciidoc/01_acknowledgements.adoc
@@ -1,4 +1,4 @@
 
-== Acknowledgements
+=== Acknowledgements
 
 This guide is inspired by https://spring.io/guides/gs/{guide-short-name}/["{recipe-name}"] from the https://spring.io/[Spring] https://spring.io/guides/[Guides].
diff --git a/recipe-template/src/docs/asciidoc/03_shopping-list.adoc b/recipe-template/src/docs/asciidoc/03_shopping-list.adoc
index 110040f..49894c4 100644
--- a/recipe-template/src/docs/asciidoc/03_shopping-list.adoc
+++ b/recipe-template/src/docs/asciidoc/03_shopping-list.adoc
@@ -5,4 +5,7 @@
 * https://wiki.eclipse.org/Virgo/Source#Virgo_git_Repositories[Sample Git repository]
 * https://eclipse.org/downloads/[Eclipse IDE]
 
-NOTE: Only Virgo Server for Apache Tomcat and Virgo Jetty Server are supported by the Virgo Tooling.
+[NOTE]
+--
+Only Virgo Server for Apache Tomcat and Virgo Jetty Server are supported by the Virgo Tooling.
+--
diff --git a/recipe-template/src/docs/asciidoc/051_get-the-code.adoc b/recipe-template/src/docs/asciidoc/051_get-the-code.adoc
index 3a5c9ff..a5a6c17 100644
--- a/recipe-template/src/docs/asciidoc/051_get-the-code.adoc
+++ b/recipe-template/src/docs/asciidoc/051_get-the-code.adoc
@@ -3,11 +3,12 @@
 
 Clone the code from the Git repository: http://wiki.eclipse.org/Virgo/Source#Virgo_git_Repositories[Sample Git repository]:
 
-[source,sh]
+[source,sh,subs="attributes"]
 ----
 $ cd ~/MyAwesomeProjectDirectory/
 $ git clone git://git.eclipse.org/gitroot/virgo/org.eclipse.virgo.samples.git
 $ cd org.eclipse.virgo.samples
+$ cd {recipe-short-name}
 ----
 
-Change into the directory containing the source of this recipe: +{recipe-short-name}+ and your are good to go.
+Once inside the source directory of this recipe - your are good to go.
diff --git a/recipe-template/src/docs/asciidoc/052_create-recipe-runtime.adoc b/recipe-template/src/docs/asciidoc/052_create-recipe-runtime.adoc
index 271cb9c..cec2c36 100644
--- a/recipe-template/src/docs/asciidoc/052_create-recipe-runtime.adoc
+++ b/recipe-template/src/docs/asciidoc/052_create-recipe-runtime.adoc
@@ -1,9 +1,18 @@
 
 === Create the Custom Virgo Runtime
 
-Create your own Virgo runtime with http://gradle.org/[Gradle] and https://github.com/eclipsesource/dockerizor[Dockerizor]
-and https://www.docker.com/[Docker]: +$ ./gradlew :{recipe-short-name}-runtime:dockerize+
+Create your own Virgo runtime with http://gradle.org/[Gradle] and https://github.com/eclipsesource/dockerizor[Dockerizor]:
 
-NOTE: You'll need a Docker daemon running in order to create your custom Virgo runtime. For more information please refer to the https://github.com/eclipsesource/dockerizor/blob/master/README.md[Dockerizor documentation].
+[source,sh,subs="attributes"]
+----
+$ ./gradlew :{recipe-short-name}-runtime dockerize
+----
 
-Extract the `tar` archive of the custom Virgo runtime available from the runtime build directory: +{recipe-short-name}-runtime/build+ into some directory - let's say into `VIRGO_HOME`.
+The custom Virgo Runtime is packaged as `tar` archive and available from the runtime build directory.
+Extract the runtime into some directory - let's say into `VIRGO_HOME`.
+
+[CAUTION]
+--
+You'll need a https://www.docker.com/[Docker] daemon running in order to create your custom Virgo runtime.
+For more information please refer to the https://github.com/eclipsesource/dockerizor/blob/master/README.md[Dockerizor documentation].
+--
diff --git a/recipe-template/src/docs/asciidoc/054_prepare-virgo-tooling.adoc b/recipe-template/src/docs/asciidoc/054_prepare-virgo-tooling.adoc
index 8478737..b64e395 100644
--- a/recipe-template/src/docs/asciidoc/054_prepare-virgo-tooling.adoc
+++ b/recipe-template/src/docs/asciidoc/054_prepare-virgo-tooling.adoc
@@ -5,8 +5,8 @@
 
 Start your Eclipse IDE and add the http://wiki.eclipse.org/Virgo/Tooling[Virgo Tooling] to your Eclipse IDE.
 
-NOTE: For the impatient: This is the http://download.eclipse.org/virgo/release/tooling/[Virgo Tooling update site] URL: http://download.eclipse.org/virgo/release/tooling. 
+NOTE: http://download.eclipse.org/virgo/release/tooling/[Virgo Tooling update site]: http://download.eclipse.org/virgo/release/tooling/
 
 Optionally add the https://wiki.eclipse.org/Linux_Tools_Project/Docker_Tooling[Docker Tooling] to your Eclipse IDE.
 
-NOTE: For the impatient: This is the http://download.eclipse.org/linuxtools/updates-docker-nightly/[Docker Tooling update site] URL: http://download.eclipse.org/linuxtools/updates-docker-nightly/.
+NOTE: http://download.eclipse.org/linuxtools/updates-docker-nightly/[Docker Tooling update site]: http://download.eclipse.org/linuxtools/updates-docker-nightly/
diff --git a/recipe-template/src/docs/asciidoc/055_import-the-code.adoc b/recipe-template/src/docs/asciidoc/055_import-the-code.adoc
index a450b75..75397c2 100644
--- a/recipe-template/src/docs/asciidoc/055_import-the-code.adoc
+++ b/recipe-template/src/docs/asciidoc/055_import-the-code.adoc
@@ -1,6 +1,11 @@
 
 === Import the code into your Eclipse IDE
 
-Now you can run +Import... Gradle -> Gradle Project+ to get the source into your IDE. The project folder is  called +{recipe-short-name}+ and lies directly in the "Sample Applications" folder you created previously with the Git clone command. (`org.eclipse.virgo.samples`).
+Now you can menu:Import[Gradle > Gradle Project] into your IDE.
+The project folder is  called `{recipe-short-name}` and lies directly in the "Sample Applications" folder you created previously with the Git clone command. (`org.eclipse.virgo.samples`).
 
-NOTE: Before you can drag'n'drop the project onto your freshly created Virgo Server you might have to execute +Virgo -> Run Generation of META-INF/MANIFEST.MF File+ (via a right click on the project) within your Eclipse IDE.
+[NOTE]
+--
+Before you can drag'n'drop the project onto your freshly created Virgo Server you might have to execute
+menu:Virgo[Run Generation] of +META-INF/MANIFEST.MF+ (via a right click on the project) within your Eclipse IDE.
+--
diff --git a/recipe-template/src/docs/asciidoc/056_create-new-virgo-server.adoc b/recipe-template/src/docs/asciidoc/056_create-new-virgo-server.adoc
index c361c8a..85bc009 100644
--- a/recipe-template/src/docs/asciidoc/056_create-new-virgo-server.adoc
+++ b/recipe-template/src/docs/asciidoc/056_create-new-virgo-server.adoc
@@ -1,4 +1,5 @@
 
 === Create new Virgo Server Runtime
 
-"Define a new server" within the IDE +New -> Server -> EclipseRT -> Virgo Runtime+ and choose the directory of the previously installed Virgo server `VIRGO_HOME`.
+Define a new server::
+  Within the IDE menu:New[Server > EclipseRT > Virgo Runtime] and choose the directory of the previously installed Virgo server `VIRGO_HOME`.
diff --git a/recipe-template/src/docs/asciidoc/08_dockerize_recipe.adoc b/recipe-template/src/docs/asciidoc/08_dockerize_recipe.adoc
index 338fded..89f64ad 100644
--- a/recipe-template/src/docs/asciidoc/08_dockerize_recipe.adoc
+++ b/recipe-template/src/docs/asciidoc/08_dockerize_recipe.adoc
@@ -1,7 +1,8 @@
 
 == Dockerise the Application ==
 
-We use Gradle and Dockerizor to build the application: Instead of running the sample within the Eclipse IDE you can build a https://www.docker.com/[Docker] image:
+We use Gradle and Dockerizor to build the application.
+Instead of running the sample within the Eclipse IDE you can build a https://www.docker.com/[Docker] image:
 
 [source,sh]
 ----