diff --git a/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html b/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html
index 3abf9afe4e0d151701c12864f98019eb084d6dbe..97a8b1147707d18d13aec237e2903020f2f09072 100644
--- a/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html
+++ b/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html
@@ -49,6 +49,8 @@ function o_start(){
 }
 /* ]]> */
 </script>
+## <script src='http://localhost/cdnjax/MathJax.js?config=MML_HTMLorMML'></script>
+<script src='//cdn.mathjax.org/mathjax/2.1-latest/MathJax.js?config=MML_HTMLorMML'></script>
 <script type="text/javascript" src='$r.staticLink("js/jsMath/easy/load.js")'></script>
 ## jQuery libraries
 <!--[if lt IE 9]>
diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
index 49a2c08a89b54bcf7103ff38199c7f047c3b7074..e79ec405ebd25a66c6ecde85e160c34f2c9815f2 100644
--- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
+++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
@@ -314,7 +314,6 @@ public class QTI21ServiceImpl implements QTI21Service {
 		Document stateDocument = TestSessionStateXmlMarshaller.marshal(testSessionState);
 		File sessionFile = getTestSessionStateFile(candidateEvent);
 		storeStateDocument(stateDocument, sessionFile);
-		System.out.println("Store state: " + sessionFile);
 	}
 
     private File getTestSessionStateFile(CandidateEvent candidateEvent) {
diff --git a/src/main/java/org/olat/ims/qti21/restapi/MathWebService.java b/src/main/java/org/olat/ims/qti21/restapi/MathWebService.java
new file mode 100644
index 0000000000000000000000000000000000000000..667ec82039349f24989a03dcf005251a20405135
--- /dev/null
+++ b/src/main/java/org/olat/ims/qti21/restapi/MathWebService.java
@@ -0,0 +1,38 @@
+package org.olat.ims.qti21.restapi;
+
+import java.util.Date;
+import java.util.Map;
+
+import javax.ws.rs.FormParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import uk.ac.ed.ph.jqtiplus.xmlutils.xslt.SimpleXsltStylesheetCache;
+import uk.ac.ed.ph.jqtiplus.xmlutils.xslt.XsltStylesheetCache;
+import uk.ac.ed.ph.qtiworks.mathassess.XsltStylesheetCacheAdapter;
+import uk.ac.ed.ph.qtiworks.mathassess.glue.AsciiMathHelper;
+
+@Path("math")
+public class MathWebService {
+	
+	private static final CacheControl cc = new CacheControl();
+	static {
+		cc.setMaxAge(-1);
+	}
+	
+	@POST
+    @Path("verifyAsciiMath")
+    @Produces({MediaType.APPLICATION_JSON})
+    public Response verifyAsciiMath(@FormParam("input") String asciiMathInput) {
+  
+    	XsltStylesheetCache stylesheetCache = new SimpleXsltStylesheetCache();
+    	AsciiMathHelper asciiMathHelper = new AsciiMathHelper(new XsltStylesheetCacheAdapter(stylesheetCache));
+        Map<String, String> upConvertedAsciiMathInput = asciiMathHelper.upConvertAsciiMathInput(asciiMathInput);
+        return Response.ok(upConvertedAsciiMathInput).lastModified(new Date()).cacheControl(cc).build();
+    }
+
+}
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AbstractAssessmentComponent.java b/src/main/java/org/olat/ims/qti21/ui/components/AbstractAssessmentComponent.java
index d0ea7c293be01e2f8ecfb6745e59b5e716620aa2..0c61fbc53ef8aa4b6453303b9877757da94be0a5 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AbstractAssessmentComponent.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AbstractAssessmentComponent.java
@@ -80,6 +80,9 @@ public abstract class AbstractAssessmentComponent extends AbstractComponent {
 
 		JSAndCSSAdder jsa = vr.getJsAndCSSAdder();
 		jsa.addRequiredStaticJsFile("assessment/rendering/javascript/QtiWorksRendering.js");
+		jsa.addRequiredStaticJsFile("assessment/rendering/javascript/AsciiMathInputController.js");
+		jsa.addRequiredStaticJsFile("assessment/rendering/javascript/UpConversionAjaxController.js");
+		
 		jsa.addRequiredStaticJsFile("js/jquery/maphilight/jquery.maphilight.js");
 		jsa.addRequiredStaticJsFile("js/jquery/ui/jquery-ui-1.11.4.custom.dnd.min.js");
 	}
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java
index 7aa2c08635cff367eec9879a619ed454d18cea21..1b18d4cb7fe0a8ef896b2d7b64e58c51d6d1abca 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java
@@ -35,6 +35,7 @@ import org.olat.core.gui.render.StringOutput;
 import org.olat.core.gui.render.URLBuilder;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.logging.OLATRuntimeException;
+import org.olat.core.util.WebappHelper;
 import org.olat.ims.qti21.UserTestSession;
 import org.olat.ims.qti21.model.CandidateItemEventType;
 import org.olat.ims.qti21.model.jpa.CandidateEvent;
@@ -71,6 +72,17 @@ public class AssessmentItemComponentRenderer extends DefaultComponentRenderer {
 		ItemSessionController itemSessionController = cmp.getItemSessionController();
 		AssessmentItemFormItem item = cmp.getQtiItem();
 		
+		String restapi = WebappHelper.getServletContextPath() + "/restapi/math/verifyAsciiMath";
+		
+		sb.append("<script>/n")
+		  .append("jQuery(function() {\n")
+		  .append(" console.log('Load','").append(restapi).append("');")
+		  .append(" UpConversionAjaxController.setUpConversionServiceUrl('/").append(restapi).append("');\n")
+          .append(" UpConversionAjaxController.setDelay(300);\n")
+		  .append("});")
+		  .append("</script>/n");
+		
+		
 		//if(itemSessionController.getItemSessionState().isEnded()) {
 		//	sb.append("<h1>The End <small>say the renderer</small></h1>");
 		//} else {
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java
index 0ede59aa9c452ea41b48d8a11684685b01b3581d..032c5eef87281bfa016613b25d2aa9f7df466403 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java
@@ -34,7 +34,9 @@ import org.olat.core.gui.render.Renderer;
 import org.olat.core.gui.render.StringOutput;
 import org.olat.core.gui.render.URLBuilder;
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.helpers.Settings;
 import org.olat.core.logging.OLATRuntimeException;
+import org.olat.core.util.WebappHelper;
 import org.olat.ims.qti21.UserTestSession;
 import org.olat.ims.qti21.model.CandidateTestEventType;
 import org.olat.ims.qti21.model.jpa.CandidateEvent;
@@ -73,6 +75,16 @@ public class AssessmentTestComponentRenderer extends DefaultComponentRenderer {
 		TestSessionController testSessionController = cmp.getTestSessionController();
 		AssessmentTestFormItem item = cmp.getQtiItem();
 		
+		/*
+		String restapi = "/olat/restapi/math/verifyAsciiMath";
+		sb.append("<script>/n")
+		  //.append("jQuery(function() {\n")
+		  .append(" UpConversionAjaxController.setUpConversionServiceUrl('").append(restapi).append("');\n")
+          .append(" UpConversionAjaxController.setDelay(300);\n")
+		  //.append("});")
+		  .append("</script>/n");
+		*/
+		
 		if(testSessionController.getTestSessionState().isEnded()) {
 			sb.append("<h1>The End <small>say the renderer</small></h1>");
 		} else {
diff --git a/src/main/java/org/olat/ims/qti21/ui/rendering/AssessmentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/rendering/AssessmentRenderer.java
index 971dad59d3bbd237e6c1c593a6d0670e5ec373df..178d22d8ff0ea8824207eb1ef04301d01525e820 100644
--- a/src/main/java/org/olat/ims/qti21/ui/rendering/AssessmentRenderer.java
+++ b/src/main/java/org/olat/ims/qti21/ui/rendering/AssessmentRenderer.java
@@ -470,6 +470,7 @@ public class AssessmentRenderer {
         xsltParameters.put("qtiWorksVersion", "1.0-SNAPSH0T-OO");
         xsltParameters.put("webappContextPath", "");
         xsltParameters.put("fullWebappContextPath", Settings.createServerURI());
+        xsltParameters.put("olatWebappContextPath", Settings.getServerContextPathURI());
         StringOutput target = new StringOutput();
         StaticMediaDispatcher.renderStaticURI(target, "", true);
         xsltParameters.put("staticContextPath", target.toString());
diff --git a/src/main/java/org/olat/restapi/_spring/restApiContext.xml b/src/main/java/org/olat/restapi/_spring/restApiContext.xml
index fa592e8c355579702484c020d79a19621574825c..8682e7d9118e814fb3c8f611ac9b1124c7e5b0c1 100644
--- a/src/main/java/org/olat/restapi/_spring/restApiContext.xml
+++ b/src/main/java/org/olat/restapi/_spring/restApiContext.xml
@@ -46,6 +46,7 @@
 				<value>org.olat.course.nodes.bc.BCWebService</value>
 				<value>org.olat.course.assessment.restapi.EfficiencyStatementWebService</value>
 				<value>org.olat.course.certificate.restapi.CertificationWebService</value>
+				<value>org.olat.ims.qti21.restapi.MathWebService</value>
 				<value>org.olat.modules.wiki.restapi.WikisWebService</value>
 				<value>org.olat.modules.fo.restapi.ForumImportWebService</value>
 				<value>org.olat.modules.fo.restapi.ForumCourseNodeWebService</value>
diff --git a/src/main/resources/rendering-xslt/interactions/mathEntryInteraction.xsl b/src/main/resources/rendering-xslt/interactions/mathEntryInteraction.xsl
index 7a0cba93eaee68975b131e00fa9a73bccca2faa9..42d95c864c0181d95acfc452ffe30afe15282e98 100644
--- a/src/main/resources/rendering-xslt/interactions/mathEntryInteraction.xsl
+++ b/src/main/resources/rendering-xslt/interactions/mathEntryInteraction.xsl
@@ -38,6 +38,9 @@
         </div>
       </div>
       <script type="text/javascript">
+      	UpConversionAjaxController.setUpConversionServiceUrl('<xsl:value-of select="$olatWebappContextPath"/>/restapi/math/verifyAsciiMath');
+        UpConversionAjaxController.setDelay(300);
+            
         QtiWorksRendering.registerReadyCallback(function() {
           var inputControlId = 'qtiworks_id_mathEntryInput_<xsl:value-of select="@responseIdentifier"/>';
           var messageContainerId = 'qtiworks_id_mathEntryMessages_<xsl:value-of select="@responseIdentifier"/>';
diff --git a/src/main/resources/rendering-xslt/qti-common.xsl b/src/main/resources/rendering-xslt/qti-common.xsl
index 852cb11956d8adf2cbd10fc4226d54a332e133b5..499df081fb7e4e78136a802bcde02cb356a03cb2 100644
--- a/src/main/resources/rendering-xslt/qti-common.xsl
+++ b/src/main/resources/rendering-xslt/qti-common.xsl
@@ -22,6 +22,7 @@ rendering.
   <xsl:param name="webappContextPath" as="xs:string" required="yes"/>
   <xsl:param name="staticContextPath" as="xs:string" required="yes"/>
   <xsl:param name="fullWebappContextPath" as="xs:string" required="yes"/>
+  <xsl:param name="olatWebappContextPath" as="xs:string" required="yes"/>
 
   <!-- QTIWorks version number -->
   <xsl:param name="qtiWorksVersion" as="xs:string" required="yes"/>
diff --git a/src/main/resources/rendering-xslt/test-item.xsl b/src/main/resources/rendering-xslt/test-item.xsl
index 2b4d12a71e762fb0646d29227a69cc61165881c7..f49df12d29fdc58dd326bd4c2972bda3832b419d 100644
--- a/src/main/resources/rendering-xslt/test-item.xsl
+++ b/src/main/resources/rendering-xslt/test-item.xsl
@@ -96,7 +96,7 @@ NB: This is used both while being presented, and during review.
           <script src="{$webappContextPath}/rendering/javascript/UpConversionAjaxController.js?v={$qtiWorksVersion}"/>
           <script src="{$webappContextPath}/rendering/javascript/AsciiMathInputController.js?v={$qtiWorksVersion}"/>
           <script>
-            UpConversionAjaxController.setUpConversionServiceUrl('<xsl:value-of select="$webappContextPath"/>/candidate/verifyAsciiMath');
+            UpConversionAjaxController.setUpConversionServiceUrl('<xsl:value-of select="$webappContextPath"/>restapi/math/verifyAsciiMath');
             UpConversionAjaxController.setDelay(300);
           </script>
         </xsl:if>