diff --git a/.env b/.env
new file mode 100644
index 0000000000000000000000000000000000000000..00b6a4c655da3658ee0413456d2254f8e245a76e
--- /dev/null
+++ b/.env
@@ -0,0 +1,3 @@
+CELERY_MAIN_CORES=2
+CELERY_LOW_CORES=2
+FLOWER_BASIC_AUTH=flower:whatever
\ No newline at end of file
diff --git a/app/escriptorium/static/css/escriptorium.css b/app/escriptorium/static/css/escriptorium.css
index 4c759a95fba97e2011fd252cd538ba1b64f19cf9..77c3940d23d7d9c98eda1df721eb07689a060a3f 100644
--- a/app/escriptorium/static/css/escriptorium.css
+++ b/app/escriptorium/static/css/escriptorium.css
@@ -10,6 +10,19 @@ section {
     display: none;
 }
 
+
+.errorlist {
+    color: var(--danger);
+}
+.error {
+    color: var(--danger);
+}
+
+#delete-point,
+#delete-line {
+    position: absolute;
+}
+
 .invisible {
     visibility: hidden;
 }
@@ -32,6 +45,7 @@ section {
 /* } */
 
 /* alerts */
+
 #alerts-container {
     width: 400px;
     position: fixed;
@@ -44,11 +58,14 @@ section {
     display: none;
 }
 
-#alerts-container .separator, #alerts-container .additional {
+#alerts-container .separator,
+#alerts-container .additional {
     display: none;
 }
 
+
 /* document form */
+
 .multi-proc span {
     line-height: 2rem;
 }
@@ -60,6 +77,7 @@ form.inline-form {
 .import-counter-container {
     display: none;
 }
+
 .import-counter-container.ongoing {
     display: block;
 }
@@ -67,6 +85,7 @@ form.inline-form {
 #train-counter {
     display: none;
 }
+
 #train-counter.ongoing {
     display: block;
 }
@@ -173,6 +192,7 @@ form.inline-form {
     color: var(--secondary);
     text-align: center;
 }
+
 .process-part-form .help-text {
     padding: 0.5rem;
 }
@@ -185,6 +205,7 @@ form.inline-form {
     float: right;
     opacity: .5;
 }
+
 .help.open:hover {
     opacity: 1;
 }
@@ -200,10 +221,11 @@ form.inline-form {
     padding: 0;
     overflow: hidden;
     background-color: #EEEEEE;
-    border: 1px solid rgba(0,0,0,.125);
+    border: 1px solid rgba(0, 0, 0, .125);
     display: none;
     /*  */
 }
+
 #viewer-buttons {
     position: absolute;
     top: 0;
@@ -211,6 +233,7 @@ form.inline-form {
     z-index: 5;
     opacity: 0.3;
 }
+
 #viewer-buttons:hover {
     opacity: 1;
 }
@@ -227,6 +250,7 @@ form.inline-form {
     cursor: pointer;
     overflow: hidden;
 }
+
 .box .close {
     display: none;
 }
@@ -235,10 +259,12 @@ form.inline-form {
     opacity: 0.2;
     z-index: 2;
 }
+
 .line-box {
     z-index: 3;
     box-sizing: content-box;
 }
+
 .line-box:hover {
     box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px var(--secondary);
 }
@@ -263,28 +289,39 @@ form.inline-form {
     color: var(--dark);
 }
 
-.card .ongoing, .blink {
+.card .ongoing,
+.blink {
     animation-duration: 1s;
     animation-name: blink;
     animation-iteration-count: infinite;
     animation-direction: alternate;
 }
-@keyframes blink{
-	from {opacity: 1;}
-    to {opacity: 0.2;}
+
+@keyframes blink {
+    from {
+        opacity: 1;
+    }
+    to {
+        opacity: 0.2;
+    }
 }
+
 .card .proc.error {
     color: var(--danger);
 }
+
 .card .proc.pending {
     color: var(--secondary);
 }
+
 .card .proc.canceled {
     color: var(--warning);
 }
+
 .card .btn.proc {
     padding: 0;
 }
+
 .card .btn.proc:hover {
     color: var(--info);
 }
@@ -292,24 +329,33 @@ form.inline-form {
 .card .proc.done {
     color: var(--success);
 }
+
 .card .js-compressing {
     display: none;
 }
-.card .js-compressing.pending, .card .js-compressing.ongoing {
+
+.card .js-compressing.pending,
+.card .js-compressing.ongoing {
     display: inline;
 }
+
 .card .js-compressing.done {
     display: none;
 }
 
 .ui-resizable-s {
-    bottom: 0;  /* mess with outline */
+    bottom: 0;
+    /* mess with outline */
 }
+
 .ui-resizable-e {
-    right: 0;  /* mess with outline */
+    right: 0;
+    /* mess with outline */
 }
 
+
 /* transcription interface  */
+
 .nav-btn {
     font-size: 50px;
 }
@@ -325,16 +371,13 @@ form.inline-form {
     margin: 0 15px;
 }
 
+
 .tools {
     height: 45px;
     margin-bottom: 5px;
     /* overflow: hidden; */
 }
 
-#trans-panel .zoom-container {
-    /* height: 100%; */
-}
-
 i.panel-icon {
     vertical-align: top;
 }
@@ -347,6 +390,7 @@ i.panel-icon {
     height: 100%;
     transform-origin: 0 0;
 }
+
 .js-zoom-target {
     box-shadow: 1px 0 4px 1px rgba(0,0,0,0.1);
 }
@@ -355,11 +399,12 @@ i.panel-icon {
     height: 100px;
 }
 
-#part-trans, #part-img {
+#part-trans,
+#part-img {
     overflow: hidden;
     width: 100%;
     height: 100%;
-    transform-origin:top left;
+    transform-origin: top left;
 }
 
 .zoom-container {
@@ -422,6 +467,7 @@ i.panel-icon {
     display: block;
 }
 
+
 #trans-modal #trans-input, #trans-rule, .compared-line {
     overflow: visible;
     margin-top: 1rem;
@@ -485,6 +531,7 @@ i.panel-icon {
     padding: 0;
     cursor: pointer;
 }
+
 .trans-box:hover {
     box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px var(--secondary);
 }
@@ -496,6 +543,7 @@ i.panel-icon {
     max-height: 100%;
     width: 100%;
 }
+
 .trans-box span:empty {
     width: 100%;
     height: 100%;
diff --git a/app/escriptorium/templates/base.html b/app/escriptorium/templates/base.html
index e366a9750e2c9f3b84c22d3767950b6189985dc4..ecafcdf5f4c4f4b9fe5f131dadefbc77f8e8a67b 100644
--- a/app/escriptorium/templates/base.html
+++ b/app/escriptorium/templates/base.html
@@ -70,10 +70,10 @@
             <a class="nav-link {% block nav-doc-list-class %}{% endblock %}" href="{% url 'documents-list' %}">{% trans "My Documents" %}</a>
           </li>
           <li class="nav-item dropdown">
-            <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-              {% blocktrans with username=user.username %}Hello {{username}}{% endblocktrans %}
-            </a>
-            <div class="dropdown-menu" aria-labelledby="navbarDropdown">
+              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                  {% blocktrans with username=user.username %}Hello {{username}}{% endblocktrans %}
+              </a>
+              <div class="dropdown-menu  dropdown-menu-right" aria-labelledby="navbarDropdown">
               <a class="dropdown-item" href="{% url 'password_change' %}">{% trans "Change password" %}</a>
               <a class="dropdown-item" href="#">{% trans "Profile" %}</a>
               <div class="dropdown-divider"></div>
diff --git a/app/escriptorium/templates/registration/login.html b/app/escriptorium/templates/registration/login.html
index ba8bbd93773d765b101aefba50fd198a3bdd4a5e..e2c93eb8619223cf4064d5c6c9bffdebc2b797aa 100644
--- a/app/escriptorium/templates/registration/login.html
+++ b/app/escriptorium/templates/registration/login.html
@@ -1,4 +1,5 @@
 {% extends 'base.html' %}
+{% load i18n %}
 
 {% block menu %}
 {% endblock %}
@@ -9,20 +10,20 @@
     <div class="col-md-4 col-md-offset-4">
       <div class="login-panel panel panel-default">
         <div class="panel-heading">
-          <h3 class="panel-title">Please Sign In</h3>
+          <h3 class="panel-title">{% trans "Please Sign In" %}</h3>
         </div>
         <div class="panel-body">
 
           {% if form.errors %}
-          <p>Your username and password didn't match. Please try again.</p>
+          <p>{% trans "Your username and password didn't match. Please try again." %}</p>
           {% endif %}
 
           {% if next %}
           {% if user.is_authenticated %}
-          <p>Your account doesn't have access to this page. To proceed,
-            please login with an account that has access.</p>
+          <p>{% trans "Your account doesn't have access to this page. To proceed,
+            please login with an account that has access." %}</p>
           {% else %}
-          <p>Please login to see this page.</p>
+          <p>{% trans "Please login to see this page." %}</p>
           {% endif %}
           {% endif %}
           
@@ -41,7 +42,7 @@
           </form>
 
           {# Assumes you setup the password_reset view in your URLconf #}
-          <p><a href="{% url 'password_reset' %}">Lost password?</a></p>
+          <p><a href="{% url 'password_reset' %}">{% trans "Lost password?" %}</a></p>
         </div>
       </div>
     </div>
diff --git a/app/escriptorium/templates/registration/password_change_done.html b/app/escriptorium/templates/registration/password_change_done.html
new file mode 100644
index 0000000000000000000000000000000000000000..365e1d12327f9ea10d7817ff83033e77cdf90694
--- /dev/null
+++ b/app/escriptorium/templates/registration/password_change_done.html
@@ -0,0 +1,19 @@
+{% extends 'base.html' %}
+{% load i18n %}
+
+{% block menu %}
+{% endblock %}
+
+{% block body %}
+<div class="container">
+  <div class="row">
+    <div class="col-md-4 col-md-offset-4">
+      <div class="login-panel panel panel-default">
+        <div class="panel-body">
+            <p>{% trans "Your password has successfully been changed." %}
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+{% endblock %}
diff --git a/app/escriptorium/templates/registration/password_change_form.html b/app/escriptorium/templates/registration/password_change_form.html
new file mode 100644
index 0000000000000000000000000000000000000000..9a03c63c265889e3432da62e022644971caeb7c5
--- /dev/null
+++ b/app/escriptorium/templates/registration/password_change_form.html
@@ -0,0 +1,71 @@
+{% extends 'base.html' %}
+{% load i18n %}
+
+{% block menu %}
+{% endblock %}
+
+{% block body %}
+<div class="container">
+  <div class="row">
+    <div class="col-md-8 col-md-offset-8">
+      <div class="login-panel panel panel-default">
+        <div class="panel-heading">
+          <h3 class="panel-title">{% trans "Change your password" %}</h3>
+        </div>
+        <div class="panel-body">
+
+          <form method="post">
+          {% csrf_token %}
+
+          {% if form.errors %}
+              <p class="error">
+              {% blocktrans count count=form.errors.items|length %}
+                  Please correct the error below.
+              {% plural %}
+                  Please correct the errors below.
+              {% endblocktrans %}
+              </p>
+          {% endif %}
+
+          <p>{% trans "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly." %}</p>
+          <div>{{ form.new_password1.help_text|safe }}</div>
+
+          <fieldset>
+            <div class="form-group">
+                {{ form.old_password.errors }}
+                <label for="id_old_password">{% trans "Old password:" %}</label>
+                <input class="form-control" type="password" name="old_password" autofocus required id="id_old_password">
+            </div>
+
+            <div class="form-group">
+                {{ form.new_password1.errors }}
+                <label for="id_new_password1">{% trans "New password:" %}</label>
+                <input class="form-control" type="password" name="new_password1" required id="id_new_password1">
+            </div>
+
+            <div class="form-group">
+                {{ form.new_password2.errors }}
+                <label for="id_new_password2">{% trans "New password confirmation:" %}</label>
+                <input class="form-control" type="password" name="new_password2" required id="id_new_password2">
+            </div>
+          </fieldset>
+
+          <div class="submit-row">
+              <input class="btn btn-success btn-block" type="submit" value="{% trans 'Change my password' %}" class="default">
+          </div>
+
+          </div>
+          </form>
+
+          <p><a href="{% url 'password_reset' %}">{% trans "Lost your password?" %}</a></p>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+
+
+
+
+{% endblock %}
diff --git a/app/escriptorium/templates/registration/password_reset_complete.html b/app/escriptorium/templates/registration/password_reset_complete.html
new file mode 100644
index 0000000000000000000000000000000000000000..a4a6bfd7b3458d32312114927470a0313d98baaf
--- /dev/null
+++ b/app/escriptorium/templates/registration/password_reset_complete.html
@@ -0,0 +1,19 @@
+{% extends 'base.html' %}
+{% load i18n %}
+
+{% block menu %}
+{% endblock %}
+
+{% block body %}
+<div class="container">
+  <div class="row">
+    <div class="col-md-4 col-md-offset-4">
+      <div class="login-panel panel panel-default">
+        <div class="panel-body">
+            <p>{% trans "Your password has been set.  You may go ahead and " %}  <a href="{{ login_url }}">{% trans 'log in' %}</a>.</p>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+{% endblock %}
\ No newline at end of file
diff --git a/app/escriptorium/templates/registration/password_reset_confirm.html b/app/escriptorium/templates/registration/password_reset_confirm.html
new file mode 100644
index 0000000000000000000000000000000000000000..cafbce92e8fce9fa64f5b77c0489dc6ff830c61d
--- /dev/null
+++ b/app/escriptorium/templates/registration/password_reset_confirm.html
@@ -0,0 +1,52 @@
+{% extends 'base.html' %}
+{% load i18n %}
+
+{% block menu %}
+{% endblock %}
+
+{% block body %}
+<div class="container">
+  <div class="row">
+    <div class="col-md-4 col-md-offset-4">
+      <div class="login-panel panel panel-default">
+        <div class="panel-heading">
+          <h3 class="panel-title">{% trans "Reset your password" %}</h3>
+        </div>
+        <div class="panel-body">
+
+            {% if validlink %}
+
+            <p>{% trans "Please enter your new password twice so we can verify you typed it in correctly." %}</p>
+
+            <form method="post">
+            {% csrf_token %}
+            <fieldset>
+                <div class="form-group field-password1">
+                    {{ form.new_password1.errors }}
+                    <label for="id_new_password1">{% trans 'New password:' %}</label>
+                    <input class="form-control" type="password" name="new_password1" required="" id="id_new_password1">
+                </div>
+                <div class="form-group field-password2">
+                    {{ form.new_password2.errors }}
+                    <label for="id_new_password2">{% trans 'Confirm password:' %}</label>
+                    <input class="form-control" type="password" name="new_password2" required="" id="id_new_password2">
+                </div>
+                <input class="btn btn-success btn-block" type="submit" value="{% trans 'Change my password' %}">
+            </fieldset>
+            </form>
+
+            {% else %}
+                <p>{% trans "The password reset link was invalid, possibly because it has already been used.  Please request a new password reset." %}</p>
+            {% endif %}
+
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+{% endblock %}
+
+
+
+
+
diff --git a/app/escriptorium/templates/registration/password_reset_done.html b/app/escriptorium/templates/registration/password_reset_done.html
new file mode 100644
index 0000000000000000000000000000000000000000..97b8a45ace3bb09dfa1d49e0d82f928b06a9f263
--- /dev/null
+++ b/app/escriptorium/templates/registration/password_reset_done.html
@@ -0,0 +1,20 @@
+{% extends 'base.html' %}
+{% load i18n %}
+
+{% block menu %}
+{% endblock %}
+
+{% block body %}
+<div class="container">
+  <div class="row">
+    <div class="col-md-8 col-md-offset-4">
+      <div class="login-panel panel panel-default">
+        <div class="panel-body">
+            <p>{% trans 'We’ve emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly.' %}</p>
+            <p>{% trans 'If you don’t receive an email, please make sure you’ve entered the address you registered with, and check your spam folder.' %}</p>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+{% endblock %}
\ No newline at end of file
diff --git a/app/escriptorium/templates/registration/password_reset_form.html b/app/escriptorium/templates/registration/password_reset_form.html
new file mode 100644
index 0000000000000000000000000000000000000000..99e43f9bb9a0e7549a2c38ac9a5ef02e67efaeaa
--- /dev/null
+++ b/app/escriptorium/templates/registration/password_reset_form.html
@@ -0,0 +1,37 @@
+{% extends 'base.html' %}
+{% load i18n %}
+
+{% block menu %}
+{% endblock %}
+
+{% block body %}
+<div class="container">
+  <div class="row">
+    <div class="col-md-8 col-md-offset-4">
+      <div class="login-panel panel panel-default">
+        <div class="panel-heading">
+          <h3 class="panel-title">{% trans "Change your password" %}</h3>
+        </div>
+        <div class="panel-body">
+
+            <p>{% trans 'Forgotten your password? Enter your email address below, and we’ll email instructions for setting a new one.' %}</p>
+
+            <div class="col-md-6">
+                <form method="post">
+                {% csrf_token %}
+                <fieldset class="module aligned">
+                    <div class="form-group">
+                        {{ form.email.errors }}
+                        <label for="id_email">{% trans 'Email address:' %}</label>
+                        <input class="form-control" type="email" name="email" maxlength="254" required="" id="id_email">
+                    </div>
+                    <input class="btn btn-success btn-block" type="submit" value="{% trans 'Reset my password' %}">
+                </fieldset>
+                </form>
+            </div> 
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+{% endblock %}