diff --git a/common/forms.py b/common/forms.py
index 28bc6f68d14678caec82958603b5aa535929089b..66b2040c06d9b422347f588c7b8f72924693023b 100644
--- a/common/forms.py
+++ b/common/forms.py
@@ -4,11 +4,13 @@ __license__ = "AGPL v3"
 
 import calendar
 import datetime
+from docutils.core import publish_parts
 import re
 
 from django import forms
 from django.forms.widgets import Widget, Select
 from django.utils.dates import MONTHS
+from django.utils.encoding import force_text
 from django.utils.safestring import mark_safe
 
 __all__ = ('MonthYearWidget',)
@@ -119,3 +121,18 @@ class MonthYearWidget(Widget):
 class ModelChoiceFieldwithid(forms.ModelChoiceField):
     def label_from_instance(self, obj):
         return '%s (id = %i)' % (super().label_from_instance(obj), obj.id)
+
+
+
+class ReStructuredTextForm(forms.Form):
+    rst_text = forms.CharField()
+
+    def get_processed_rst(self):
+        text = self.cleaned_data['rst_text']
+        # This performs the same actions as the restructuredtext filter of app scipost
+        parts = publish_parts(source=text,
+                              writer_name='html5_polyglot',
+                              settings_overrides={'math_output': 'MathJax https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML,Safe'})
+        return {
+            'processed_rst': mark_safe(force_text(parts['html_body'])),
+            }
diff --git a/helpdesk/templates/helpdesk/ticket_form.html b/helpdesk/templates/helpdesk/ticket_form.html
index e8b354abb357c66c5d67183e720bd10168239894..f334f57cfda9b061a5894d8e384f1dc444c73f46 100644
--- a/helpdesk/templates/helpdesk/ticket_form.html
+++ b/helpdesk/templates/helpdesk/ticket_form.html
@@ -1,7 +1,7 @@
 {% extends 'helpdesk/base.html' %}
 
 {% load bootstrap %}
-
+{% load staticfiles %}
 
 {% block breadcrumb_items %}
   {{ block.super }}
@@ -22,28 +22,39 @@
 	<p>Re: <a href="{{ concerning_object.get_absolute_url }}" target="_blank">{{ concerning_object }}</a></p>
       {% endif %}
 
-      <form action="" method="post">
-	{% csrf_token %}
-	{{ form|bootstrap }}
-	<input type="submit" value="Submit" class="btn btn-primary">
-
-	{% if form.errors %}
-	  {% for field in form %}
-	    {% for error in field.errors %}
-	      <div class="alert alert-danger">
-		<strong>{{ field.name }} - {{ error|escape }}</strong>
-	      </div>
-	    {% endfor %}
-	  {% endfor %}
-	  {% for error in form.non_field_errors %}
-	    <div class="alert alert-danger">
-	      <strong>{{ error|escape }}</strong>
-	    </div>
-	  {% endfor %}
-	{% endif %}
-      </form>
-
+      <div class="row">
+	<div class="col-6">
+	  <form action="" method="post">
+	    {% csrf_token %}
+	    {{ form|bootstrap }}
+	    <input type="submit" value="Submit" class="btn btn-primary">
+
+	    {% if form.errors %}
+	      {% for field in form %}
+		{% for error in field.errors %}
+		  <div class="alert alert-danger">
+		    <strong>{{ field.name }} - {{ error|escape }}</strong>
+		  </div>
+		{% endfor %}
+	      {% endfor %}
+	      {% for error in form.non_field_errors %}
+		<div class="alert alert-danger">
+		  <strong>{{ error|escape }}</strong>
+		</div>
+	      {% endfor %}
+	    {% endif %}
+	  </form>
+	</div>
+	<div class="col-6">
+	  <h3>Preview</h3>
+	  <h4>Description</h4>
+	  <p id="preview-description"></p>
+	</div>
     </div>
   </div>
 
 {% endblock content %}
+
+{% block footer_script %}
+  <script src="{% static 'scipost/ticket-preview.js' %}"></script>
+{% endblock footer_script %}
diff --git a/scipost/static/scipost/mathjax-config.js b/scipost/static/scipost/mathjax-config.js
index 3668b5706e0f5ee9ee63eb344773e8ebde459f0b..9ac98686dd33569be0fc7af6312b6e0189a1e90f 100644
--- a/scipost/static/scipost/mathjax-config.js
+++ b/scipost/static/scipost/mathjax-config.js
@@ -1,6 +1,6 @@
 var MathJax = {
     tex2jax: {
 	inlineMath: [['$','$'],['\\(','\\)']],
-	procesEscapes: true
+	processEscapes: true
     }
 };
diff --git a/scipost/static/scipost/ticket-preview.js b/scipost/static/scipost/ticket-preview.js
new file mode 100644
index 0000000000000000000000000000000000000000..0e7e1c79bd6ff6942283122748708a4af89c42ab
--- /dev/null
+++ b/scipost/static/scipost/ticket-preview.js
@@ -0,0 +1,19 @@
+$('#id_description').on('keyup', function(){
+    $.ajax({
+    	type: "POST",
+    	url: "/process_rst/",
+    	data: {
+    	    csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
+	    rst_text: $('#id_description').val(),
+    	},
+	dataType: 'json',
+    	success: function(data) {
+    	    $('#preview-description').html(data.processed_rst);
+	    let preview = document.getElementById('preview-description');
+    	    MathJax.Hub.Queue(["Typeset",MathJax.Hub, preview]);
+    	},
+	error: function(data) {
+	    alert("An error has occurred while processing the ReStructuredText.");
+	}
+    });
+}).trigger('change');
diff --git a/scipost/templates/scipost/bare_base.html b/scipost/templates/scipost/bare_base.html
index 171e66bfac8b87355ff82f55cfbdb6d050941f12..4b6f5ff810202b1e1fa78f800208ed135adcc99b 100644
--- a/scipost/templates/scipost/bare_base.html
+++ b/scipost/templates/scipost/bare_base.html
@@ -42,7 +42,7 @@
 
     <div class="backdrop" id="backdrop"></div>
     <script type="text/javascript" src="{% static 'scipost/mathjax-config.js' %}"></script>
-    <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>
+    <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML,Safe"></script>
 
     {% render_bundle 'main' 'js' %}
 
diff --git a/scipost/templatetags/restructuredtext.py b/scipost/templatetags/restructuredtext.py
index a13399059e21a450dc9e25be57dcf159a253094a..65ba075956b6951a797baf4c8ad433852d7f282d 100644
--- a/scipost/templatetags/restructuredtext.py
+++ b/scipost/templatetags/restructuredtext.py
@@ -16,5 +16,6 @@ def restructuredtext(text):
         return ''
     from docutils.core import publish_parts
     parts = publish_parts(source=text,
-                          writer_name='html5_polyglot')
+                          writer_name='html5_polyglot',
+                          settings_overrides={'math_output': 'MathJax  https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML,Safe'})
     return mark_safe(force_text(parts['html_body']))
diff --git a/scipost/urls.py b/scipost/urls.py
index c761b9d957c2c6db5cf381867f078238431bf79c..96863bd8e52cc24283470519868b2cc62d3783d4 100644
--- a/scipost/urls.py
+++ b/scipost/urls.py
@@ -20,6 +20,16 @@ JOURNAL_REGEX = '(?P<doi_label>%s)' % REGEX_CHOICES
 app_name = 'scipost'
 
 urlpatterns = [
+    # Utilities:
+    # Search
+    url(r'^search', views.SearchView.as_view(), name='search'),
+    # preprocess reStructuredText
+    url(
+        r'^process_rst/$',
+        views.process_rst,
+        name='process_rst'
+    ),
+
     url(r'^$', views.index, name='index'),
     url(r'^files/secure/(?P<path>.*)$', views.protected_serve, name='secure_file'),
 
@@ -76,8 +86,6 @@ urlpatterns = [
         LatestPublicationsFeedAtom(),
         name='pub_feed_spec_atom'),
 
-    # Search
-    url(r'^search', views.SearchView.as_view(), name='search'),
 
     ################
     # Contributors:
diff --git a/scipost/views.py b/scipost/views.py
index 68f2bd77d70afa465d5781a7f0e30324a03fc8cc..bc1fcd2fc0eee88f8d0454a82b5a27364e0ea03f 100644
--- a/scipost/views.py
+++ b/scipost/views.py
@@ -29,6 +29,7 @@ from django.utils.decorators import method_decorator
 from django.utils.http import is_safe_url
 from django.views.debug import cleanse_setting
 from django.views.decorators.cache import never_cache
+from django.views.decorators.csrf import csrf_exempt
 from django.views.decorators.http import require_POST
 from django.views.generic.edit import DeleteView, CreateView
 from django.views.generic.list import ListView
@@ -54,6 +55,7 @@ from .utils import EMAIL_FOOTER, SCIPOST_SUMMARY_FOOTER, SCIPOST_SUMMARY_FOOTER_
 from colleges.permissions import fellowship_or_admin_required
 from commentaries.models import Commentary
 from comments.models import Comment
+from common.forms import ReStructuredTextForm
 from invitations.constants import STATUS_REGISTERED
 from invitations.models import RegistrationInvitation
 from journals.models import Journal, Publication, PublicationAuthorsTable
@@ -114,6 +116,13 @@ class SearchView(SearchView):
         return ctx
 
 
+def process_rst(request):
+    form = ReStructuredTextForm(request.POST or None)
+    if form.is_valid():
+        return JsonResponse(form.get_processed_rst())
+    return JsonResponse({})
+
+
 #############
 # Main view
 #############