diff --git a/commentaries/migrations/0001_initial.py b/commentaries/migrations/0001_initial.py
index f149c3a831534f6c44508e98519b28c53abb66ad..1ecadfa8911aaa8c5737dae41386bc4c1ddab230 100644
--- a/commentaries/migrations/0001_initial.py
+++ b/commentaries/migrations/0001_initial.py
@@ -15,7 +15,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='Commentary',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
+                ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
                 ('vetted', models.BooleanField(default=False)),
                 ('type', models.CharField(max_length=9)),
                 ('open_for_commenting', models.BooleanField(default=True)),
@@ -26,17 +26,18 @@ class Migration(migrations.Migration):
                 ('pub_date', models.DateField(verbose_name='date of original publication')),
                 ('pub_abstract', models.TextField()),
                 ('nr_clarity_ratings', models.IntegerField(default=0)),
-                ('clarity_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('clarity_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_validity_ratings', models.IntegerField(default=0)),
-                ('validity_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('validity_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_rigour_ratings', models.IntegerField(default=0)),
-                ('rigour_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('rigour_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_originality_ratings', models.IntegerField(default=0)),
-                ('originality_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('originality_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_significance_ratings', models.IntegerField(default=0)),
-                ('significance_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('significance_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('latest_activity', models.DateTimeField(default=django.utils.timezone.now)),
-                ('authors', models.ManyToManyField(related_name='authors_com', blank=True, null=True, to='contributors.Contributor')),
+                ('authors', models.ManyToManyField(related_name='authors_com', blank=True, to='contributors.Contributor')),
+                ('requested_by', models.ForeignKey(null=True, related_name='requested_by', blank=True, to='contributors.Contributor')),
                 ('vetted_by', models.ForeignKey(null=True, to='contributors.Contributor', blank=True)),
             ],
         ),
diff --git a/commentaries/models.py b/commentaries/models.py
index 59340acc558ee3c9f011cb76680147c818a29773..e842d623675aca97b9e481ed2a5467c59b435bcb 100644
--- a/commentaries/models.py
+++ b/commentaries/models.py
@@ -13,6 +13,7 @@ COMMENTARY_TYPES = (
 
 class Commentary(models.Model):
     """ A Commentary contains all the contents of a SciPost Commentary page for a given publication. """
+    requested_by = models.ForeignKey (Contributor, blank=True, null=True, related_name='requested_by')
     vetted = models.BooleanField(default=False)
     vetted_by = models.ForeignKey (Contributor, blank=True, null=True)
     type = models.CharField(max_length=9) # published paper or arxiv preprint
@@ -22,7 +23,7 @@ class Commentary(models.Model):
     pub_DOI_link = models.URLField(verbose_name='DOI link to the original publication')
     author_list = models.CharField(max_length=1000)
     # Authors which have been mapped to contributors:
-    authors = models.ManyToManyField (Contributor, blank=True, null=True, related_name='authors_com')
+    authors = models.ManyToManyField (Contributor, blank=True, related_name='authors_com')
     pub_date = models.DateField(verbose_name='date of original publication')
     pub_abstract = models.TextField()
 
diff --git a/commentaries/templates/commentaries/commentary_detail.html b/commentaries/templates/commentaries/commentary_detail.html
index 6180f01269c5fd20ad9ab080748edc8163968b39..b88660554b508bd0107f4c79ef55dc5474e96866 100644
--- a/commentaries/templates/commentaries/commentary_detail.html
+++ b/commentaries/templates/commentaries/commentary_detail.html
@@ -12,6 +12,9 @@
     $("#commentsbutton").click(function(){
     $("#commentslist").toggle();
     });
+    $("#ratingsbutton").click(function() {
+    $(".ratingsdata").toggle();
+    });
     });
   </script>
 
@@ -21,7 +24,15 @@
 
 
 <section>
-  <h1>SciPost Commentary Page &nbsp; (for non-SciPost publications)</h1>
+  <div class="row">
+    <div class="col-11">
+      <h1>SciPost Commentary Page &nbsp; (for non-SciPost publications)</h1>
+    </div>
+    <div class="col-1">
+      <br/>
+      <button id="ratingsbutton">Toggle ratings view</button>
+    </div>
+  </div>
 </section>
 
 <section>
@@ -54,7 +65,7 @@
   <h3>Abstract:</h3>
   <p>{{ commentary.pub_abstract }}</p>
   
-  {% if user.is_authenticated %}
+  {% if user.is_authenticated and user.contributor.rank > 0 %}
   <form action="{% url 'ratings:vote_on_commentary' commentary_id=commentary.id %}" method="post" class="ratingsdata">
     {% csrf_token %}
     <ul>
@@ -77,8 +88,14 @@
 
 {% if comments %}
 <section>
-  <h2>Comments on this publication</h2>
-  <button id="commentsbutton">Toggle view</button>
+  <div class="row">
+    <div class="col-10">
+      <h2>Comments on this publication</h2>
+    </div>
+    <div class="col-2">
+      <button id="commentsbutton">Toggle comments/ratings view</button>
+    </div>
+  </div>
   <hr>
 
   <div id="commentslist">
@@ -91,6 +108,18 @@
     </div>
 
     <div class="col-8">
+      <ul class="commentcategorydisplay">
+	<li>Categories:</li>
+	{% if comment.is_rem %}<li>remark</li>{% endif %}
+	{% if comment.is_que %}<li>question</li>{% endif %}
+	{% if comment.is_ans %}<li>answer to question</li>{% endif %}
+	{% if comment.is_obj %}<li>objection</li>{% endif %}
+	{% if comment.is_rep %}<li>reply to objection</li>{% endif %}
+	{% if comment.is_val %}<li>validation or rederivation</li>{% endif %}
+	{% if comment.is_lit %}<li>pointer to related literature</li>{% endif %}
+	{% if comment.is_sug %}<li>suggestion for further work</li>{% endif %}
+      </ul>
+      <br/><br/>
       <ul class="ratingsdata">
 	<li>Ratings: </li>
 	<li>relevance: {{ comment.relevance_rating }}% ({{ comment.nr_relevance_ratings }})</li>
@@ -105,11 +134,11 @@
   <div class="row">
 <!--    <div class="col-1"></div> -->
     <div class="col-10">
-      <p>{{ comment.comment_text }}</p>
+      <p>{{ comment.comment_text|linebreaks }}</p>
     </div>
   </div>
 
-  {% if user.is_authenticated %}
+  {% if user.is_authenticated and user.contributor.rank > 0 %}
   <div class="row">
 <!--    <div class="col-1"></div> -->
     <div class="col-10">
@@ -148,10 +177,10 @@
   <div class="row">
     <div class="col-1"></div>
     <div class="col-10">
-      <p>{{ reply.reply_text }}</p>
+      <p>{{ reply.reply_text|linebreaks }}</p>
     </div>
   </div>
-  {% if user.is_authenticated %}
+  {% if user.is_authenticated and user.contributor.rank > 0 %}
   <div class="row">
     <div class="col-1"></div>
     <div class="col-10">
@@ -170,6 +199,7 @@
   {% endif %}
   {% endfor %}
 
+  {% if user.is_authenticated and user.contributor.rank > 0 %}
   <hr style="border-style: dotted;" />
   <div class="row">
     <div class="col-6">
@@ -180,26 +210,46 @@
     </div>
   </div>
   <hr>
+  {% endif %}
   {% endfor %}
   </div id="commentslist">
 </section>
 {% endif %}
 
-{% if user.is_authenticated and commentary.open_for_commenting %}
+{% if user.is_authenticated and commentary.open_for_commenting and user.contributor.rank > 0 %}
 <section>
   <div class="row">
-    <div class="col-2">
+    <div class="col-3">
       <h1>Contribute a Comment</h1>
+      <p>Specify whick category your comment belongs to (you can choose more than one).</p>
+      <p>In your comment, you can use LaTeX \$...\$ for in-text equations or &#92; &#91; ... &#92; &#93; for separate equations.</p>
     </div>
-    <div class="col-10">
+    <div class="col-9">
       <form action="{% url 'commentaries:commentary' commentary.id %}" method="post">
 	{% csrf_token %}
-	{{ form }}
-	<input type="submit" value="Submit your Comment">
+	<div class="col-4">
+	  <ul class="commentcategorychoices">
+	    <li>{{ form.is_rem }} remark</li>
+	    <li>{{ form.is_que }} question</li>
+	    <li>{{ form.is_ans }} answer to question</li>
+	    <li>{{ form.is_obj }} objection</li>
+	    <li>{{ form.is_rep }} reply to objection</li>
+	    <li>{{ form.is_val }} validation or rederivation</li>
+	    <li>{{ form.is_lit }} pointer to related literature</li>
+	    <li>{{ form.is_sug }} suggestion for further work</li>
+	  </ul>
+	</div>
+	<div class="col-1"></div>
+	<div class="col-7">
+	  {{ form.comment_text }}
+	  <input type="submit" value="Submit your Comment">
+	</div>
       </form>
     </div>
   </div>
 </section>
 {% endif %}
 
+<p>{{ debugnote }}</p>
+
 {% include 'scipost/footer.html' %}
diff --git a/commentaries/views.py b/commentaries/views.py
index 1dbd64d3245328fa394f48f5d41612e8b47bb4b3..9aeb06009d0fae098576982fe65f5b792f700848 100644
--- a/commentaries/views.py
+++ b/commentaries/views.py
@@ -31,6 +31,7 @@ def request_commentary(request):
             if form.is_valid():
                 contributor = Contributor.objects.get(user=request.user)
                 commentary = Commentary (
+                    requested_by = contributor,
                     type = form.cleaned_data['type'],
                     pub_title = form.cleaned_data['pub_title'],
                     arxiv_link = form.cleaned_data['arxiv_link'],
@@ -133,11 +134,18 @@ def commentary_detail(request, commentary_id):
                 commentary = commentary,
                 in_reply_to = None,
                 author = author,
+                is_rem = form.cleaned_data['is_rem'],
+                is_que = form.cleaned_data['is_que'],
+                is_ans = form.cleaned_data['is_ans'],
+                is_obj = form.cleaned_data['is_obj'],
+                is_rep = form.cleaned_data['is_rep'],
+                is_val = form.cleaned_data['is_val'],
+                is_lit = form.cleaned_data['is_lit'],
+                is_sug = form.cleaned_data['is_sug'],
                 comment_text = form.cleaned_data['comment_text'],
                 date_submitted = timezone.now(),
                 )
             newcomment.save()
-#            author.nr_comments += 1
             author.nr_comments = Comment.objects.filter(author=author).count()
             author.save()
             request.session['commentary_id'] = commentary_id
@@ -152,5 +160,5 @@ def commentary_detail(request, commentary_id):
         author_replies = AuthorReply.objects.filter(commentary=commentary)
     except AuthorReply.DoesNotExist:
         author_replies = ()
-    context = {'commentary': commentary, 'comments': comments.filter(status__gte=1).order_by('date_submitted'), 'author_replies': author_replies, 'form': form, 'commentary_rating_form': commentary_rating_form, 'comment_rating_form': comment_rating_form, 'authorreply_rating_form': authorreply_rating_form}
+    context = {'commentary': commentary, 'comments': comments.filter(status__gte=1).order_by('date_submitted'), 'author_replies': author_replies, 'form': form, 'commentary_rating_form': commentary_rating_form, 'comment_rating_form': comment_rating_form, 'authorreply_rating_form': authorreply_rating_form }
     return render(request, 'commentaries/commentary_detail.html', context)
diff --git a/comments/forms.py b/comments/forms.py
index aaf8f0f706e8b72e1d3f5cc7e16c62bb46c415ba..12e89fbed369c6cf9b9b8c44c6b5f6a8b40e414e 100644
--- a/comments/forms.py
+++ b/comments/forms.py
@@ -34,6 +34,15 @@ AUTHOR_REPLY_REFUSAL_CHOICES = (
 
 
 class CommentForm(forms.Form):
+#    category = forms.MultipleChoiceField(choices=COMMENT_CATEGORIES, widget=forms.CheckboxSelectMultiple(), label='Please categorize your comment (multiple choices allowed):')
+    is_rem = forms.BooleanField(required=False, label='remark')
+    is_que = forms.BooleanField(required=False, label='question')
+    is_ans = forms.BooleanField(required=False, label='answer to question')
+    is_obj = forms.BooleanField(required=False, label='objection')
+    is_rep = forms.BooleanField(required=False, label='reply to objection')
+    is_val = forms.BooleanField(required=False, label='validation or rederivation')
+    is_lit = forms.BooleanField(required=False, label='pointer to related literature')
+    is_sug = forms.BooleanField(required=False, label='suggestions for further work')
     comment_text = forms.CharField(widget=forms.Textarea(attrs={'rows': 10, 'cols':80}), label='', required=True) # need TextField but doesn't exist
 
 class VetCommentForm(forms.Form):
diff --git a/comments/migrations/0001_initial.py b/comments/migrations/0001_initial.py
index 6e797d0fc577814679aae852264bc34615aa0d55..30f9afa2f87f146145f6aed573022202a218ee60 100644
--- a/comments/migrations/0001_initial.py
+++ b/comments/migrations/0001_initial.py
@@ -7,30 +7,30 @@ from django.db import migrations, models
 class Migration(migrations.Migration):
 
     dependencies = [
+        ('contributors', '0001_initial'),
+        ('submissions', '0001_initial'),
         ('reports', '0001_initial'),
         ('commentaries', '0001_initial'),
-        ('submissions', '0001_initial'),
-        ('contributors', '0001_initial'),
     ]
 
     operations = [
         migrations.CreateModel(
             name='AuthorReply',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
+                ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
                 ('status', models.SmallIntegerField(default=0)),
                 ('reply_text', models.TextField()),
                 ('date_submitted', models.DateTimeField(verbose_name='date submitted')),
                 ('nr_relevance_ratings', models.IntegerField(default=0)),
-                ('relevance_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('relevance_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_importance_ratings', models.IntegerField(default=0)),
-                ('importance_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('importance_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_clarity_ratings', models.IntegerField(default=0)),
-                ('clarity_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('clarity_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_validity_ratings', models.IntegerField(default=0)),
-                ('validity_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('validity_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_rigour_ratings', models.IntegerField(default=0)),
-                ('rigour_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('rigour_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('author', models.ForeignKey(to='contributors.Contributor')),
                 ('commentary', models.ForeignKey(null=True, to='commentaries.Commentary', blank=True)),
             ],
@@ -38,20 +38,20 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='Comment',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
+                ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
                 ('status', models.SmallIntegerField(default=0)),
                 ('comment_text', models.TextField()),
                 ('date_submitted', models.DateTimeField(verbose_name='date submitted')),
                 ('nr_relevance_ratings', models.IntegerField(default=0)),
-                ('relevance_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('relevance_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_importance_ratings', models.IntegerField(default=0)),
-                ('importance_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('importance_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_clarity_ratings', models.IntegerField(default=0)),
-                ('clarity_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('clarity_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_validity_ratings', models.IntegerField(default=0)),
-                ('validity_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('validity_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_rigour_ratings', models.IntegerField(default=0)),
-                ('rigour_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('rigour_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('author', models.ForeignKey(to='contributors.Contributor')),
                 ('commentary', models.ForeignKey(null=True, to='commentaries.Commentary', blank=True)),
                 ('in_reply_to', models.ForeignKey(null=True, to='comments.Comment', blank=True)),
diff --git a/comments/models.py b/comments/models.py
index 5822553ac37408973e268339a647077b90c8e26d..96fa7c120c5af8e94ab4556eb5609d7dbd96d9b4 100644
--- a/comments/models.py
+++ b/comments/models.py
@@ -15,6 +15,25 @@ from contributors.models import Contributor
 from reports.models import Report
 from submissions.models import Submission
 
+
+COMMENT_CATEGORIES = (
+    ('REM', 'remark'),
+    ('QUE', 'question'),
+    ('ANS', 'answer to question'),
+    ('OBJ', 'objection'),
+    ('REP', 'reply to objection'),
+    ('VAL', 'validation or rederivation'),
+    ('LIT', 'pointer to related literature'),
+    ('SUG', 'suggestion for further work'),
+    )
+
+class CommentCategory(models.Model):
+    category = models.CharField(max_length=3, default='REM')
+
+    def __str__ (self):
+        return self.category
+
+
 class Comment(models.Model):
     """ A Comment is an unsollicited note, submitted by a Contributor, on a particular publication or in reply to an earlier Comment. """
     # status:
@@ -28,6 +47,15 @@ class Comment(models.Model):
     submission = models.ForeignKey(Submission, blank=True, null=True)
     in_reply_to = models.ForeignKey('self', blank=True, null=True)
     author = models.ForeignKey(Contributor)
+#    categories = models.ManyToManyField(CommentCategory)
+    is_rem = models.BooleanField(default=False, verbose_name='remark')
+    is_que = models.BooleanField(default=False, verbose_name='question')
+    is_ans = models.BooleanField(default=False, verbose_name='answer to question')
+    is_obj = models.BooleanField(default=False, verbose_name='objection')
+    is_rep = models.BooleanField(default=False, verbose_name='reply to objection')
+    is_val = models.BooleanField(default=False, verbose_name='validation or rederivation')
+    is_lit = models.BooleanField(default=False, verbose_name='pointer to related literature')
+    is_sug = models.BooleanField(default=False, verbose_name='suggestion for further work')
     comment_text = models.TextField()
     date_submitted = models.DateTimeField('date submitted')
     # Aggregates of ratings applied to this comment:
diff --git a/comments/views.py b/comments/views.py
index 4051ab5c196eeefe96857897c35b889b5bd3c40a..33337e7190969ae5bbccd7cb036daf98dddd0432 100644
--- a/comments/views.py
+++ b/comments/views.py
@@ -3,7 +3,8 @@ from django.utils import timezone
 from django.shortcuts import get_object_or_404, render
 from django.contrib.auth import authenticate, login, logout
 from django.contrib.auth.models import User
-from django.core.mail import send_mail
+#from django.core.mail import send_mail
+from django.core.mail import EmailMessage
 from django.core.urlresolvers import reverse
 from django.http import HttpResponse, HttpResponseRedirect
 from django.views.decorators.csrf import csrf_protect
@@ -36,10 +37,28 @@ def vet_submitted_comment_ack(request, comment_id):
                 # accept the comment as is
                 comment.status = 1
                 comment.save()
+                email_text = 'The Comment you have submitted, concerning publication with title '
+                if comment.commentary is not None:
+                    email_text + comment.commentary.pub_title + ' by ' + comment.commentary.author_list
+                elif comment.submission is not None:
+                    email_text + comment.submission.title + ' by ' + comment.submission.author_list
+                email_text += ', has been accepted and published online.' + '\n\nThank you for your contribution, \nThe SciPost Team.'
+                emailmessage = EmailMessage('SciPost Comment published', email_text, 'noreply@scipost.org', ['jscaux@gmail.com'], reply_to=['J.S.Caux@uva.nl'])
+                emailmessage.send(fail_silently=False)
             elif form.cleaned_data['action_option'] == '2':
                 # the comment request is simply rejected
                 comment.status = form.cleaned_data['refusal_reason']
                 comment.save()
+                email_text = 'The Comment you have submitted, concerning publication with title '
+                if comment.commentary is not None:
+                    email_text + comment.commentary.pub_title + ' by ' + comment.commentary.author_list
+                elif comment.submission is not None:
+                    email_text + comment.submission.title + ' by ' + comment.submission.author_list
+                email_text += ', has been rejected for the following reason:' + form.cleaned_data['refusal_reason'] + '.\n\nThank you for your contribution, \nThe SciPost Team.'
+                if form.cleaned_data['email_response_field']:
+                    email_text += '\n\nFurther explanations: ' + form.cleaned_data['email_response_field']
+                emailmessage = EmailMessage('SciPost Comment rejected', email_text, 'noreply@scipost.org', ['jscaux@gmail.com'], reply_to=['J.S.Caux@uva.nl'])
+                emailmessage.send(fail_silently=False)
 
     context = {}
     return render(request, 'comments/vet_submitted_comment_ack.html', context)
@@ -133,11 +152,28 @@ def vet_author_reply_ack(request, reply_id):
                 # accept the reply as is
                 reply.status = 1
                 reply.save()
+                email_text = 'The Author Reply you have submitted, concerning publication with title '
+                if reply.commentary is not None:
+                    email_text + reply.commentary.pub_title + ' by ' + reply.commentary.author_list
+                elif reply.submission is not None:
+                    email_text + reply.submission.title + ' by ' + reply.submission.author_list
+                email_text += ', has been accepted and published online.' + '\n\nThank you for your contribution, \nThe SciPost Team.'
+                emailmessage = EmailMessage('SciPost Author Reply published', email_text, 'noreply@scipost.org', ['jscaux@gmail.com'], reply_to=['J.S.Caux@uva.nl'])
+                emailmessage.send(fail_silently=False)
             elif form.cleaned_data['action_option'] == '2':
                 # the reply is simply rejected
                 reply.status = form.cleaned_data['refusal_reason']
                 reply.save()
-                # email author
+                email_text = 'The Author Reply you have submitted, concerning publication with title '
+                if reply.commentary is not None:
+                    email_text + reply.commentary.pub_title + ' by ' + reply.commentary.author_list
+                elif reply.submission is not None:
+                    email_text + reply.submission.title + ' by ' + reply.submission.author_list
+                email_text += ', has been rejected for the following reason:' + form.cleaned_data['refusal_reason'] + '.\n\nThank you for your contribution, \nThe SciPost Team.'
+                if form.cleaned_data['email_response_field']:
+                    email_text += '\n\nFurther explanations: ' + form.cleaned_data['email_response_field']
+                emailmessage = EmailMessage('SciPost AuthorReply rejected', email_text, 'noreply@scipost.org', ['jscaux@gmail.com'], reply_to=['J.S.Caux@uva.nl'])
+                emailmessage.send(fail_silently=False)
 
     context = {}
     return render(request, 'comments/vet_author_reply_ack.html', context)
diff --git a/contributors/migrations/0001_initial.py b/contributors/migrations/0001_initial.py
index 6ab9e67f83bfeb6bef71571a5f896138136a18c0..23d29456931c915dbfb0ec2b8a8f65f5843a3518 100644
--- a/contributors/migrations/0001_initial.py
+++ b/contributors/migrations/0001_initial.py
@@ -15,35 +15,46 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='Contributor',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
+                ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
                 ('rank', models.SmallIntegerField(default=0, choices=[(0, 'newly registered'), (1, 'normal user'), (2, 'SciPost Commentary Editor'), (3, 'SciPost Journal Editor'), (4, 'SciPost Journal Editor-in-chief'), (5, 'SciPost Lead Editor'), (-1, 'not a professional scientist'), (-2, 'other account already exists'), (-3, 'barred from SciPost'), (-4, 'account disabled')])),
-                ('title', models.CharField(choices=[('PR', 'Prof.'), ('DR', 'Dr'), ('MR', 'Mr'), ('MRS', 'Mrs')], max_length=4)),
-                ('orcid_id', models.CharField(default='', verbose_name='ORCID id', max_length=20, blank=True, null=True)),
+                ('title', models.CharField(max_length=4, choices=[('PR', 'Prof.'), ('DR', 'Dr'), ('MR', 'Mr'), ('MRS', 'Mrs')])),
+                ('orcid_id', models.CharField(verbose_name='ORCID id', default='', null=True, blank=True, max_length=20)),
                 ('affiliation', models.CharField(verbose_name='affiliation', max_length=300)),
-                ('address', models.CharField(verbose_name='address', max_length=1000, blank=True)),
+                ('address', models.CharField(verbose_name='address', blank=True, max_length=1000)),
                 ('personalwebpage', models.URLField(verbose_name='personal web page', blank=True)),
                 ('nr_comments', models.PositiveSmallIntegerField(default=0)),
+                ('nr_comment_relevance_ratings', models.IntegerField(default=0)),
+                ('comment_relevance_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
+                ('nr_comment_importance_ratings', models.IntegerField(default=0)),
+                ('comment_importance_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
                 ('nr_comment_clarity_ratings', models.IntegerField(default=0)),
-                ('comment_clarity_rating', models.DecimalField(default=0, decimal_places=0, max_digits=3)),
+                ('comment_clarity_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
                 ('nr_comment_validity_ratings', models.IntegerField(default=0)),
-                ('comment_validity_rating', models.DecimalField(default=0, decimal_places=0, max_digits=3)),
+                ('comment_validity_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
                 ('nr_comment_rigour_ratings', models.IntegerField(default=0)),
-                ('comment_rigour_rating', models.DecimalField(default=0, decimal_places=0, max_digits=3)),
-                ('nr_comment_originality_ratings', models.IntegerField(default=0)),
-                ('comment_originality_rating', models.DecimalField(default=0, decimal_places=0, max_digits=3)),
-                ('nr_comment_significance_ratings', models.IntegerField(default=0)),
-                ('comment_significance_rating', models.DecimalField(default=0, decimal_places=0, max_digits=3)),
+                ('comment_rigour_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
+                ('nr_authorreplies', models.PositiveSmallIntegerField(default=0)),
+                ('nr_authorreply_relevance_ratings', models.IntegerField(default=0)),
+                ('authorreply_relevance_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
+                ('nr_authorreply_importance_ratings', models.IntegerField(default=0)),
+                ('authorreply_importance_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
+                ('nr_authorreply_clarity_ratings', models.IntegerField(default=0)),
+                ('authorreply_clarity_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
+                ('nr_authorreply_validity_ratings', models.IntegerField(default=0)),
+                ('authorreply_validity_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
+                ('nr_authorreply_rigour_ratings', models.IntegerField(default=0)),
+                ('authorreply_rigour_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
                 ('nr_reports', models.PositiveSmallIntegerField(default=0)),
+                ('nr_report_relevance_ratings', models.IntegerField(default=0)),
+                ('report_relevance_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
+                ('nr_report_importance_ratings', models.IntegerField(default=0)),
+                ('report_importance_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
                 ('nr_report_clarity_ratings', models.IntegerField(default=0)),
-                ('report_clarity_rating', models.DecimalField(default=0, decimal_places=0, max_digits=3)),
+                ('report_clarity_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
                 ('nr_report_validity_ratings', models.IntegerField(default=0)),
-                ('report_validity_rating', models.DecimalField(default=0, decimal_places=0, max_digits=3)),
+                ('report_validity_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
                 ('nr_report_rigour_ratings', models.IntegerField(default=0)),
-                ('report_rigour_rating', models.DecimalField(default=0, decimal_places=0, max_digits=3)),
-                ('nr_report_originality_ratings', models.IntegerField(default=0)),
-                ('report_originality_rating', models.DecimalField(default=0, decimal_places=0, max_digits=3)),
-                ('nr_report_significance_ratings', models.IntegerField(default=0)),
-                ('report_significance_rating', models.DecimalField(default=0, decimal_places=0, max_digits=3)),
+                ('report_rigour_rating', models.DecimalField(max_digits=3, default=0, decimal_places=0)),
                 ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)),
             ],
         ),
diff --git a/contributors/migrations/0002_auto_20151212_2020.py b/contributors/migrations/0002_auto_20151212_2020.py
deleted file mode 100644
index 7029f9c7b8d7e8b11e6727892da8afd734b8018c..0000000000000000000000000000000000000000
--- a/contributors/migrations/0002_auto_20151212_2020.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import unicode_literals
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('contributors', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.RemoveField(
-            model_name='contributor',
-            name='comment_originality_rating',
-        ),
-        migrations.RemoveField(
-            model_name='contributor',
-            name='comment_significance_rating',
-        ),
-        migrations.RemoveField(
-            model_name='contributor',
-            name='nr_comment_originality_ratings',
-        ),
-        migrations.RemoveField(
-            model_name='contributor',
-            name='nr_comment_significance_ratings',
-        ),
-        migrations.RemoveField(
-            model_name='contributor',
-            name='nr_report_originality_ratings',
-        ),
-        migrations.RemoveField(
-            model_name='contributor',
-            name='nr_report_significance_ratings',
-        ),
-        migrations.RemoveField(
-            model_name='contributor',
-            name='report_originality_rating',
-        ),
-        migrations.RemoveField(
-            model_name='contributor',
-            name='report_significance_rating',
-        ),
-        migrations.AddField(
-            model_name='contributor',
-            name='comment_importance_rating',
-            field=models.DecimalField(max_digits=3, default=0, decimal_places=0),
-        ),
-        migrations.AddField(
-            model_name='contributor',
-            name='comment_relevance_rating',
-            field=models.DecimalField(max_digits=3, default=0, decimal_places=0),
-        ),
-        migrations.AddField(
-            model_name='contributor',
-            name='nr_comment_importance_ratings',
-            field=models.IntegerField(default=0),
-        ),
-        migrations.AddField(
-            model_name='contributor',
-            name='nr_comment_relevance_ratings',
-            field=models.IntegerField(default=0),
-        ),
-        migrations.AddField(
-            model_name='contributor',
-            name='nr_report_importance_ratings',
-            field=models.IntegerField(default=0),
-        ),
-        migrations.AddField(
-            model_name='contributor',
-            name='nr_report_relevance_ratings',
-            field=models.IntegerField(default=0),
-        ),
-        migrations.AddField(
-            model_name='contributor',
-            name='report_importance_rating',
-            field=models.DecimalField(max_digits=3, default=0, decimal_places=0),
-        ),
-        migrations.AddField(
-            model_name='contributor',
-            name='report_relevance_rating',
-            field=models.DecimalField(max_digits=3, default=0, decimal_places=0),
-        ),
-    ]
diff --git a/contributors/templates/contributors/login.html b/contributors/templates/contributors/login.html
index 5dd0fbd4bd721702335aa429d06070bdd85927f6..e6a6e26260a63e4e4064686b625496f05e67ddc2 100644
--- a/contributors/templates/contributors/login.html
+++ b/contributors/templates/contributors/login.html
@@ -5,16 +5,25 @@
 {% include 'scipost/navbar.html' %}
 
 <section>
-  <h1>Log in to SciPost</h1>
-  <form action="{% url 'contributors:login' %}" method="post">
-    {% csrf_token %}
-    <table>
-      <ul>
-	{{ form.as_table }}
-      </ul>
-    </table>
-    <input type="submit" value="Login" />
-  </form>
+  <div class="row">
+    <div class="col-6">
+      <h1>Log in to SciPost</h1>
+      <form action="{% url 'contributors:login' %}" method="post">
+	{% csrf_token %}
+	<table>
+	  <ul>
+	    {{ form.as_table }}
+	  </ul>
+	</table>
+	<input type="submit" value="Login" />
+      </form>
+    </div>
+    <div class="col-6">
+      <h1>Not registered as a Contributor to SciPost?</h1>
+      <p>If you are a professional scientist (PhD student and above), you can register by filling the
+      <a href="{% url 'contributors:register' %}">registration form</a>.</p>
+    </div>
+  </div>
 </section>
 
 
diff --git a/contributors/templates/contributors/personal_page.html b/contributors/templates/contributors/personal_page.html
index d316714949cbbcd4c2fb8cfb06c7329603f4745a..ed8da684089f2cea7e46d9b46f7ff345bf1732f2 100644
--- a/contributors/templates/contributors/personal_page.html
+++ b/contributors/templates/contributors/personal_page.html
@@ -12,28 +12,34 @@
 <section>
   <h1>Pending SciPost Editorial Actions</h1>
   <br>
+  <div class="row">
   {% if contributor.rank >= 4 %}
-  <h3>Registration actions</h3>
-  <ul>
-    <li><a href="{% url 'contributors:vet_registration_requests' %}">Vet Registration requests</a> ({{ nr_reg_to_vet }})</li>
-  </ul>
+  <div class="col-4">
+    <h3>Registration actions</h3>
+    <ul>
+      <li><a href="{% url 'contributors:vet_registration_requests' %}">Vet Registration requests</a> ({{ nr_reg_to_vet }})</li>
+    </ul>
+  </div>
   {% endif %}
 
-  <h3>Vetting actions</h3>
-  <ul>
-    <li><a href="{% url 'commentaries:vet_commentary_requests' %}">Vet Commentary Page requests</a> ({{ nr_commentary_page_requests_to_vet }})</li>
-    <li><a href="{% url 'comments:vet_submitted_comments' %}">Vet submitted Comments</a> ({{ nr_comments_to_vet }})</li>
-    <li><a href="{% url 'comments:vet_author_replies' %}">Vet submitted Author Replies</a> ({{ nr_author_replies_to_vet }})</li>
-    <li><a href="{% url 'reports:vet_submitted_reports' %}">Vet submitted Reports</a> ({{ nr_reports_to_vet }})</li>
-  </ul>
-
+  <div class="col-4">
+    <h3>Vetting actions</h3>
+    <ul>
+      <li><a href="{% url 'commentaries:vet_commentary_requests' %}">Vet Commentary Page requests</a> ({{ nr_commentary_page_requests_to_vet }})</li>
+      <li><a href="{% url 'comments:vet_submitted_comments' %}">Vet submitted Comments</a> ({{ nr_comments_to_vet }})</li>
+      <li><a href="{% url 'comments:vet_author_replies' %}">Vet submitted Author Replies</a> ({{ nr_author_replies_to_vet }})</li>
+      <li><a href="{% url 'reports:vet_submitted_reports' %}">Vet submitted Reports</a> ({{ nr_reports_to_vet }})</li>
+    </ul>
+  </div>
   {% if contributor.rank >= 3 %}
-  <h3>Submissions processing</h3>
-  <ul>
-    {% if contributor.rank >= 4 %}
-    <li><a href="{% url 'submissions:process_new_submissions' %}">Process new SciPost Submissions</a> ({{ nr_submissions_to_process }})</li>
-    {% endif %}
-  </ul>
+  <div class="col-4">
+    <h3>Submissions processing</h3>
+    <ul>
+      {% if contributor.rank >= 4 %}
+      <li><a href="{% url 'submissions:process_new_submissions' %}">Process new SciPost Submissions</a> ({{ nr_submissions_to_process }})</li>
+      {% endif %}
+    </ul>
+  </div>
   {% endif %}
 
 </section>
diff --git a/contributors/views.py b/contributors/views.py
index a6fe4152f416ea68316f0e871fe262a7f299c28d..53b5f8023f07cb947f0b137cc3c99d0b943c86a5 100644
--- a/contributors/views.py
+++ b/contributors/views.py
@@ -76,7 +76,7 @@ def vet_registration_request_ack(request, contributor_id):
             if form.cleaned_data['promote_to_rank_1']:
                 contributor.rank = 1
                 contributor.save()
-                email_text = 'Dear' + contributor.title + ' ' + contributor.user.last_name + ', \n Your registration to the SciPost publication portal has been accepted. You can now login and contribute. \n\n The SciPost Team.'
+                email_text = 'Dear ' + contributor.title + ' ' + contributor.user.last_name + ', \n Your registration to the SciPost publication portal has been accepted. You can now login and contribute. \n\n The SciPost Team.'
                 #send_mail('SciPost registration accepted', email_text, 'noreply@scipost.org', [contributor.user.email, 'noreply@scipost.org'], fail_silently=False)
                 emailmessage = EmailMessage('SciPost registration accepted', email_text, 'noreply@scipost.org', [contributor.user.email, 'jscaux@gmail.com'], reply_to=['J.S.Caux@uva.nl'])
                 emailmessage.send(fail_silently=False)
diff --git a/journals/templates/journals/journals.html b/journals/templates/journals/journals.html
index 31fefb1f22fb7546b221340e902b26e925bf3d8a..07b9e3a611a268ac70ecec945dbb1500cc830a98 100644
--- a/journals/templates/journals/journals.html
+++ b/journals/templates/journals/journals.html
@@ -6,62 +6,76 @@
 
 <section>
   <h1>SciPost Journals</h1>
-  <p>SciPost publishes a family of online Journals covering all domains and specialties in the field of Physics.</p>
-  <p>Manuscripts submitted to SciPost undergo the extremely stringent <a href="{% url 'scipost:peer_witnessed_refereeing' %}">peer-witnessed refereeing</a> process (see details below), guaranteeing that papers published in SciPost Journals meet the highest possible academic standards.</p>
-  <p>All SciPost Journals are subscription-free and perpetually openly accessible.</p>
   <div class="row">
     <div class="col-6">
-      <h3>SciPost Physics Select</h3><p>(Editorially-selected Letters of superlative quality)</p>
-      <h3>SciPost Physics Letters</h3><p>(Letters of broad interest and outstanding quality)</p>
+      <p>SciPost publishes a family of online scientific Journals.</p>
+      <p>All SciPost Journals are subscription-free and perpetually openly accessible.</p>
     </div>
     <div class="col-6">
-      <h3>SciPost Physics X</h3><p>(articles of exceptional quality)</p>
-      <h3>SciPost Physics </h3><p>(Experimental, Theoretical and Computational Physics)</p>
-      <h3>SciPost Physics Lecture Notes</h3><p>(Research-level didactic material)</p>
+      <p>Manuscripts submitted to SciPost undergo the extremely stringent <a href="{% url 'scipost:peer_witnessed_refereeing' %}">peer-witnessed refereeing</a> process, guaranteeing that papers published in SciPost Journals meet the highest possible academic standards.</p>
     </div>
   </div>
 </section>
 
 <section>
-  <h1>SciPost Physics Select</h1>
-  <p>SciPost Physics Select publishes Letters of superlative quality in the field of Physics.</p>
-  <p>Authors cannot submit directly to this Journal; SPS papers are editorially selected from the most outstanding Submissions to SciPost Physics Letters.</p>
-</section>
+  <h1>SciPost Physics Journals</h1>
+  <hr>
 
-<section>
-  <h1>SciPost Physics Letters</h1>
-  <p>SciPost Physics Letters publishes outstanding-quality, broad-interest papers in all fields of Physics.</p>
-</section>
+  <div class="row">
+    <div class="col-5">
+      <h1>SciPost Physics Select</h1>
+      <p>SciPost Physics Select publishes Letters of superlative quality in the field of Physics.</p>
+      <p>Authors cannot submit directly to this Journal; SPS papers are editorially selected from the most outstanding Submissions to SciPost Physics Letters.</p>
+      <br/>      
+      <h1>SciPost Physics Letters</h1>
+      <p>SciPost Physics Letters publishes outstanding-quality, broad-interest papers in all fields of Physics.</p>
+      <br/><br/>
+      <h1>SciPost Physics Lecture Notes</h1>
+      <p>SciPost Physics Lecture Notes publishes high-quality, research-level didactic material in all domains and specializations of Physics.</p>
+    </div>
 
-<section>
-  <h1>SciPost Physics X</h1>
-  <p>SciPost Physics X publishes papers of superlative quality in the field of Physics.</p>
-  <p>Similarly to SPS, authors cannot submit directly to this Journal; SPX papers are editorially selected from the most outstanding Submissions to SciPost Physics.</p>
-</section>
+    <div class="col-1"></div>
 
-<section>
-  <h1>SciPost Physics</h1>
-  <p>SciPost Physics publishes high-quality papers in Physics. It covers the three major domains of modern Physics, namely E (Experimental), T (Theoretical) and C (Computational) Physics, which encompass the following specialties:</p>
-  <ul>
-    <li>A: Atomic, Molecular and Optical Physics</li>
-    <li>B: Biophysics</li>
-    <li>C: Condensed Matter Physics</li>
-    <li>F: Fluid Dynamics</li>
-    <li>G: Gravitation, Cosmology and Astroparticle Physics</li>
-    <li>H: High-Energy Physics</li>
-    <li>M: Mathematical Physics</li>
-    <li>N: Nuclear Physics</li>
-    <li>Q: Quantum Statistical Mechanics</li>
-    <li>S: Statistical and Soft Matter Physics</li>
-  </ul>
-</section>
+    <div class="col-5">
+      <h1>SciPost Physics X</h1>
+      <p>SciPost Physics X publishes papers of superlative quality in the field of Physics.</p>
+      <p>Similarly to SPS, authors cannot submit directly to this Journal; SPX papers are editorially selected from the most outstanding Submissions to SciPost Physics.</p>
+      <br/>
+      <h1>SciPost Physics</h1>
+      <p>SciPost Physics publishes high-quality papers in Physics. It covers the three major domains of modern Physics, namely E (Experimental), T (Theoretical) and C (Computational) Physics, which encompass the following specialties:</p>
+      <ul>
+	<li>A: Atomic, Molecular and Optical Physics</li>
+	<li>B: Biophysics</li>
+	<li>C: Condensed Matter Physics</li>
+	<li>F: Fluid Dynamics</li>
+	<li>G: Gravitation, Cosmology and Astroparticle Physics</li>
+	<li>H: High-Energy Physics</li>
+	<li>M: Mathematical Physics</li>
+	<li>N: Nuclear Physics</li>
+	<li>Q: Quantum Statistical Mechanics</li>
+	<li>S: Statistical and Soft Matter Physics</li>
+      </ul>
+    </div>
+  </div>
 
-<section>
-  <h1>SciPost Physics Lecture Notes</h1>
-  <p>SciPost Physics Lecture Notes publishes high-quality, research-level didactic material in all domains and specializations of Physics.</p>
-</section>
 
-<section>
+
+
+<!--
+  <div class="row">
+    <div class="col-6">
+      <h3>SciPost Physics Select</h3><p>(Editorially-selected Letters of superlative quality)</p>
+      <h3>SciPost Physics Letters</h3><p>(Letters of broad interest and outstanding quality)</p>
+    </div>
+    <div class="col-6">
+      <h3>SciPost Physics X</h3><p>(articles of exceptional quality)</p>
+      <h3>SciPost Physics </h3><p>(Experimental, Theoretical and Computational Physics)</p>
+      <h3>SciPost Physics Lecture Notes</h3><p>(Research-level didactic material)</p>
+    </div>
+  </div>
+-->
+  <br/>
+  <hr>
   <h1><a href="{% url 'submissions:sub_and_ref_procedure' %}">Submission and Refereeing procedure</a></h1>
 </section>
     
diff --git a/ratings/migrations/0001_initial.py b/ratings/migrations/0001_initial.py
index 066a7e8e8676c7a17fd0e8b66478e0568a73e785..52ae5b00f582c0656c645585dc863db6647a039e 100644
--- a/ratings/migrations/0001_initial.py
+++ b/ratings/migrations/0001_initial.py
@@ -7,25 +7,25 @@ from django.db import migrations, models
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('reports', '0001_initial'),
-        ('commentaries', '0001_initial'),
-        ('comments', '0001_initial'),
         ('contributors', '0001_initial'),
         ('submissions', '0001_initial'),
+        ('reports', '0001_initial'),
+        ('comments', '0001_initial'),
+        ('commentaries', '0001_initial'),
     ]
 
     operations = [
         migrations.CreateModel(
             name='AuthorReplyRating',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
-                ('relevance', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('importance', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('clarity', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('validity', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('rigour', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
+                ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
+                ('relevance', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('importance', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('clarity', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('validity', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('rigour', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('authorreply', models.ForeignKey(to='comments.AuthorReply')),
                 ('rater', models.ForeignKey(to='contributors.Contributor')),
-                ('reply', models.ForeignKey(to='comments.AuthorReply')),
             ],
             options={
                 'abstract': False,
@@ -34,12 +34,12 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='CommentaryRating',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
-                ('clarity', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('validity', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('rigour', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('originality', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('significance', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
+                ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
+                ('clarity', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('validity', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('rigour', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('originality', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('significance', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
                 ('commentary', models.ForeignKey(to='commentaries.Commentary')),
                 ('rater', models.ForeignKey(to='contributors.Contributor')),
             ],
@@ -50,12 +50,12 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='CommentRating',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
-                ('relevance', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('importance', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('clarity', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('validity', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('rigour', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
+                ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
+                ('relevance', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('importance', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('clarity', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('validity', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('rigour', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
                 ('comment', models.ForeignKey(to='comments.Comment')),
                 ('rater', models.ForeignKey(to='contributors.Contributor')),
             ],
@@ -66,12 +66,12 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='ReportRating',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
-                ('relevance', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('importance', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('clarity', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('validity', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('rigour', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
+                ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
+                ('relevance', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('importance', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('clarity', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('validity', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('rigour', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
                 ('rater', models.ForeignKey(to='contributors.Contributor')),
                 ('report', models.ForeignKey(to='reports.Report')),
             ],
@@ -82,12 +82,12 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='SubmissionRating',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
-                ('clarity', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('validity', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('rigour', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('originality', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
-                ('significance', models.PositiveSmallIntegerField(default=0, verbose_name=((101, 'abstain'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True)),
+                ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
+                ('clarity', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('validity', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('rigour', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('originality', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
+                ('significance', models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), default=0, null=True)),
                 ('rater', models.ForeignKey(to='contributors.Contributor')),
                 ('submission', models.ForeignKey(to='submissions.Submission')),
             ],
diff --git a/ratings/migrations/0002_auto_20151215_0748.py b/ratings/migrations/0002_auto_20151215_0748.py
deleted file mode 100644
index caaf83c29ddeaf633c528810cea946604ce05df5..0000000000000000000000000000000000000000
--- a/ratings/migrations/0002_auto_20151215_0748.py
+++ /dev/null
@@ -1,139 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import unicode_literals
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('ratings', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='authorreplyrating',
-            name='clarity',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='authorreplyrating',
-            name='importance',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='authorreplyrating',
-            name='relevance',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='authorreplyrating',
-            name='rigour',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='authorreplyrating',
-            name='validity',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='commentaryrating',
-            name='clarity',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='commentaryrating',
-            name='originality',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='commentaryrating',
-            name='rigour',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='commentaryrating',
-            name='significance',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='commentaryrating',
-            name='validity',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='commentrating',
-            name='clarity',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='commentrating',
-            name='importance',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='commentrating',
-            name='relevance',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='commentrating',
-            name='rigour',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='commentrating',
-            name='validity',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='reportrating',
-            name='clarity',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='reportrating',
-            name='importance',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='reportrating',
-            name='relevance',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='reportrating',
-            name='rigour',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='reportrating',
-            name='validity',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='submissionrating',
-            name='clarity',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='submissionrating',
-            name='originality',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='submissionrating',
-            name='rigour',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='submissionrating',
-            name='significance',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-        migrations.AlterField(
-            model_name='submissionrating',
-            name='validity',
-            field=models.PositiveSmallIntegerField(verbose_name=((101, '-'), (100, '100%'), (90, '90%'), (80, '80%'), (70, '70%'), (60, '60%'), (50, '50%'), (40, '40%'), (30, '30%'), (20, '20%'), (10, '10%'), (0, '0%')), null=True, default=0),
-        ),
-    ]
diff --git a/reports/migrations/0001_initial.py b/reports/migrations/0001_initial.py
index 54a3d2c4eab8cd4bca3b91ad6301df7b6cfc8416..1f4c45c7a3bfaec57ee2501fd281f46593ae6096 100644
--- a/reports/migrations/0001_initial.py
+++ b/reports/migrations/0001_initial.py
@@ -7,15 +7,15 @@ from django.db import migrations, models
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('submissions', '0001_initial'),
         ('contributors', '0001_initial'),
+        ('submissions', '0001_initial'),
     ]
 
     operations = [
         migrations.CreateModel(
             name='Report',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
+                ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
                 ('status', models.SmallIntegerField(default=0)),
                 ('qualification', models.PositiveSmallIntegerField(default=0)),
                 ('strengths', models.TextField()),
@@ -23,20 +23,20 @@ class Migration(migrations.Migration):
                 ('report', models.TextField()),
                 ('requested_changes', models.TextField()),
                 ('recommendation', models.SmallIntegerField(choices=[(1, 'Publish as Tier I (top 10% of papers in this journal)'), (2, 'Publish as Tier II (top 50% of papers in this journal)'), (3, 'Publish as Tier III (meets the criteria of this journal)'), (-1, 'Ask for minor revision'), (-2, 'Ask for major revision'), (-3, 'Reject')])),
-                ('date_invited', models.DateTimeField(verbose_name='date invited', blank=True, null=True)),
+                ('date_invited', models.DateTimeField(verbose_name='date invited', null=True, blank=True)),
                 ('date_submitted', models.DateTimeField(verbose_name='date submitted')),
                 ('nr_relevance_ratings', models.IntegerField(default=0)),
-                ('relevance_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('relevance_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_importance_ratings', models.IntegerField(default=0)),
-                ('importance_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('importance_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_clarity_ratings', models.IntegerField(default=0)),
-                ('clarity_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('clarity_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_validity_ratings', models.IntegerField(default=0)),
-                ('validity_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('validity_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_rigour_ratings', models.IntegerField(default=0)),
-                ('rigour_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('rigour_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('author', models.ForeignKey(to='contributors.Contributor')),
-                ('invited_by', models.ForeignKey(null=True, to='contributors.Contributor', blank=True, related_name='invited_by')),
+                ('invited_by', models.ForeignKey(null=True, related_name='invited_by', blank=True, to='contributors.Contributor')),
                 ('submission', models.ForeignKey(to='submissions.Submission')),
             ],
         ),
diff --git a/scipost/static/scipost/SciPost.css b/scipost/static/scipost/SciPost.css
index 4732dfb10ccaceb03e357c358ec18feaa0b3d44a..a9693075c00bbcc5770518a4a846f0ab4650f4b5 100644
--- a/scipost/static/scipost/SciPost.css
+++ b/scipost/static/scipost/SciPost.css
@@ -67,6 +67,23 @@ a:hover {
 }
 
 
+.commentcategorychoices {
+  list-style-type: none; // for categorizing comments
+}
+.commentcategorydisplay {
+  list-style-type: circle;
+  display: inline;
+}
+.commentcategorydisplay li {
+  float: left;
+  list-style-type: square;
+  padding: 2px 5px;
+  margin: 1px 0px;
+  background-color: #eeeeee;
+  border-right: 1px solid black;
+}
+
+
 header {
 //  background-color: #333333;
 //  background-color: #102040;
diff --git a/scipost/templates/scipost/index.html b/scipost/templates/scipost/index.html
index 879351ab7de2c06a009cba2013c9706a3e7065e8..b620f971aeb01c7b677f7412f85cbf082a150635 100644
--- a/scipost/templates/scipost/index.html
+++ b/scipost/templates/scipost/index.html
@@ -37,8 +37,9 @@
       <h3>Registered contributors:</h3> <a href="{% url 'contributors:login' %}">Login to your Personal Page</a>
     </div>
     <div class="col-4">
-      <h3>Register as a Contributor to SciPost:</h3>
-      <a href="{% url 'contributors:register' %}">Fill the registration form</a>
+      <h1>Register</h1>
+      <p>Professional scientists (PhD students and above) can become Contributors to SciPost by filling the 
+      <a href="{% url 'contributors:register' %}">registration form</a>.</p>
     </div>
     <div class="col-4">
       <h4>Registered contributors can:</h4>
@@ -46,6 +47,7 @@
 	<li>Submit manuscripts to SciPost Journals</li>
 	<li>Post reports and comments</li>
 	<li>Rate reports and comments</li>
+	<li>Manage notifications</li>
 	<li>... and much more</li>
       </ul>
     </div>
diff --git a/submissions/migrations/0001_initial.py b/submissions/migrations/0001_initial.py
index 6c80daf512cf0e53f826e284f7055d11e1b9235d..c86385d753f3755006938670d223d8bbdc872f31 100644
--- a/submissions/migrations/0001_initial.py
+++ b/submissions/migrations/0001_initial.py
@@ -15,11 +15,11 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='Submission',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
+                ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
                 ('vetted', models.BooleanField(default=False)),
-                ('submitted_to_journal', models.CharField(choices=[('SciPost Physics Select', 'SciPost Physics Select'), ('SciPost Physics Letters', 'SciPost Physics Letters'), ('SciPost Physics X', 'SciPost Physics X (cross-division)'), ('SciPost Physics', 'SciPost Physics (Experimental, Theoretical and Computational)'), ('SciPost Physics Lecture Notes', 'SciPost Physics Lecture Notes')], max_length=30)),
-                ('domain', models.CharField(default='E', choices=[('E', 'Experimental'), ('T', 'Theoretical'), ('C', 'Computational')], max_length=1)),
-                ('specialization', models.CharField(choices=[('A', 'Atomic, Molecular and Optical Physics'), ('B', 'Biophysics'), ('C', 'Condensed Matter Physics'), ('F', 'Fluid Dynamics'), ('G', 'Gravitation, Cosmology and Astroparticle Physics'), ('H', 'High-Energy Physics'), ('M', 'Mathematical Physics'), ('N', 'Nuclear Physics'), ('Q', 'Quantum Statistical Mechanics'), ('S', 'Statistical and Soft Matter Physics')], max_length=1)),
+                ('submitted_to_journal', models.CharField(max_length=30, choices=[('SciPost Physics Select', 'SciPost Physics Select'), ('SciPost Physics Letters', 'SciPost Physics Letters'), ('SciPost Physics X', 'SciPost Physics X (cross-division)'), ('SciPost Physics', 'SciPost Physics (Experimental, Theoretical and Computational)'), ('SciPost Physics Lecture Notes', 'SciPost Physics Lecture Notes')])),
+                ('domain', models.CharField(default='E', max_length=1, choices=[('E', 'Experimental'), ('T', 'Theoretical'), ('C', 'Computational')])),
+                ('specialization', models.CharField(max_length=1, choices=[('A', 'Atomic, Molecular and Optical Physics'), ('B', 'Biophysics'), ('C', 'Condensed Matter Physics'), ('F', 'Fluid Dynamics'), ('G', 'Gravitation, Cosmology and Astroparticle Physics'), ('H', 'High-Energy Physics'), ('M', 'Mathematical Physics'), ('N', 'Nuclear Physics'), ('Q', 'Quantum Statistical Mechanics'), ('S', 'Statistical and Soft Matter Physics')])),
                 ('status', models.SmallIntegerField(choices=[(0, 'unassigned'), (1, 'editor in charge assigned'), (2, 'under review'), (3, 'reviewed, peer checking period'), (4, 'reviewed, peer checked, editorial decision pending'), (5, 'editorial decision')])),
                 ('open_for_reporting', models.BooleanField(default=True)),
                 ('open_for_commenting', models.BooleanField(default=True)),
@@ -29,18 +29,18 @@ class Migration(migrations.Migration):
                 ('arxiv_link', models.URLField(verbose_name='arXiv link (including version nr)')),
                 ('submission_date', models.DateField(verbose_name='date of original publication')),
                 ('nr_clarity_ratings', models.IntegerField(default=0)),
-                ('clarity_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('clarity_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_validity_ratings', models.IntegerField(default=0)),
-                ('validity_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('validity_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_rigour_ratings', models.IntegerField(default=0)),
-                ('rigour_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('rigour_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_originality_ratings', models.IntegerField(default=0)),
-                ('originality_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('originality_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('nr_significance_ratings', models.IntegerField(default=0)),
-                ('significance_rating', models.DecimalField(default=0, decimal_places=0, null=True, max_digits=3)),
+                ('significance_rating', models.DecimalField(max_digits=3, default=0, null=True, decimal_places=0)),
                 ('latest_activity', models.DateTimeField(default=django.utils.timezone.now)),
-                ('authors', models.ManyToManyField(related_name='authors_sub', blank=True, null=True, to='contributors.Contributor')),
-                ('editor_in_charge', models.ForeignKey(null=True, to='contributors.Contributor', blank=True, related_name='editor_in_charge')),
+                ('authors', models.ManyToManyField(related_name='authors_sub', blank=True, to='contributors.Contributor')),
+                ('editor_in_charge', models.ForeignKey(null=True, related_name='editor_in_charge', blank=True, to='contributors.Contributor')),
                 ('submitted_by', models.ForeignKey(to='contributors.Contributor')),
             ],
         ),
diff --git a/submissions/models.py b/submissions/models.py
index 386c2cfee3621d15de5f7f73d7ac9ff9d95b46c6..e61084e4198c93467cd5da9d9e19ada4f95c2aad 100644
--- a/submissions/models.py
+++ b/submissions/models.py
@@ -31,7 +31,7 @@ class Submission(models.Model):
     title = models.CharField(max_length=300)
     author_list = models.CharField(max_length=1000)
     # Authors which have been mapped to contributors:
-    authors = models.ManyToManyField (Contributor, blank=True, null=True, related_name='authors_sub')
+    authors = models.ManyToManyField (Contributor, blank=True, related_name='authors_sub')
     abstract = models.TextField()
     arxiv_link = models.URLField(verbose_name='arXiv link (including version nr)')
     submission_date = models.DateField(verbose_name='date of original publication')
diff --git a/submissions/templates/submissions/submission_detail.html b/submissions/templates/submissions/submission_detail.html
index c51cdb1704606a986a5a90e1628bb0d2a9d0ffc1..60f25e21c7111207ff415db4f03fccdce185021d 100644
--- a/submissions/templates/submissions/submission_detail.html
+++ b/submissions/templates/submissions/submission_detail.html
@@ -49,15 +49,14 @@
   <h3>Abstract:</h3>
   <p>{{ submission.abstract }}</p>
   
-  {% if user.is_authenticated %}
+  {% if user.is_authenticated and user.contributor.rank > 0 %}
   <form action="{% url 'ratings:vote_on_submission' submission_id=submission.id %}" method="post" class="ratingsdata">
     {% csrf_token %}
     <ul>
       <li>Rate this publication:</li>
       {{ submission_rating_form.as_ul }}
       <li><input type="submit" value="Submit"></li>
-    </ul>
-    
+    </ul>    
   </form>
   {% endif %}
 </section>
@@ -110,7 +109,7 @@
       <p>{{ report.report }}</p>
     </div>
   </div>
-  {% if user.is_authenticated %}
+  {% if user.is_authenticated and user.contributor.rank > 0 %}
   <form action="{% url 'ratings:vote_on_report' report_id=report.id %}" method="post" class="ratingsdata">
     {% csrf_token %}
     <ul>
@@ -143,10 +142,10 @@
   <div class="row">
     <div class="col-1"></div>
     <div class="col-10"
-      <p>{{ reply.reply_text }}</p>
+      <p>{{ reply.reply_text|linebreaks }}</p>
     </div>
   </div>
-  {% if user.is_authenticated %}
+  {% if user.is_authenticated and user.contributor.rank > 0 %}
   <div class="row">
     <div class="col-1"></div>
     <div class="col-10">
@@ -165,6 +164,7 @@
   {% endif %}
   {% endfor %}
 
+  {% if user.is_authenticated and user.contributor.rank > 0 %}
   <hr style="border-style: dotted;" />
   <div class="row">
     <div class="col-6">
@@ -172,12 +172,13 @@
     </div>
   </div>
   <hr>
+  {% endif %}
 
   {% endfor %}
 </section>
 {% endif %}
 
-{% if user.is_authenticated and submission.open_for_reporting %}
+{% if user.is_authenticated and submission.open_for_reporting and user.contributor.rank > 0 %}
 <section>
   <div class="row">
     <div class="col-3">
@@ -216,11 +217,11 @@
   <div class="row">
     <div class="col-1"></div>
     <div class="col-10">
-      <p>{{ comment.comment_text }}</p>
+      <p>{{ comment.comment_text|linebreaks }}</p>
     </div>
     <div class="col-1"></div>
   </div>
-  {% if user.is_authenticated %}
+  {% if user.is_authenticated and user.contributor.rank > 0 %}
   <form action="{% url 'ratings:vote_on_comment' comment_id=comment.id %}" method="post" class="ratingsdata">
     {% csrf_token %}
     <ul>
@@ -252,10 +253,10 @@
   <div class="row">
     <div class="col-1"></div>
     <div class="col-10">
-      <p>{{ reply.reply_text }}</p>
+      <p>{{ reply.reply_text|linebreaks }}</p>
     </div>
   </div>
-  {% if user.is_authenticated %}
+  {% if user.is_authenticated and user.contributor.rank > 0 %}
   <div class="row">
     <div class="col-1"></div>
     <div class="col-10">
@@ -274,6 +275,7 @@
   {% endif %}
   {% endfor %}
 
+  {% if user.is_authenticated and user.contributor.rank > 0 %}
   <hr style="border-style: dotted;" />
   <div class="row">
     <div class="col-6">
@@ -284,11 +286,13 @@
     </div>
   </div>
   <hr>
+  {% endif %}
+
   {% endfor %}
 </section>
 {% endif %}
 
-{% if user.is_authenticated and submission.open_for_commenting %}
+{% if user.is_authenticated and submission.open_for_commenting and user.contributor.rank > 0 %}
 <section>
   <div class="row">
     <div class="col-3">