diff --git a/opentech/apply/urls.py b/opentech/apply/urls.py
index a7487aaf5f3d029ec18b832ce8b329a2f6c32052..efd6ba3730e4e45fbe7cae713f3b7ee6870e5183 100644
--- a/opentech/apply/urls.py
+++ b/opentech/apply/urls.py
@@ -5,5 +5,5 @@ from .users import urls as users_urls
 
 urlpatterns = [
     url(r'^apply/', include(funds_urls)),
-    url(r'^user/', include(users_urls))
+    url(r'^user/', include(users_urls, namespace='users')
 ]
diff --git a/opentech/apply/users/urls.py b/opentech/apply/users/urls.py
index 0185992fa6f5f2f327ac83fbd46abfdb7c4e5c8f..f2173775081407f279a8f0588d1a88ecebacf8da 100644
--- a/opentech/apply/users/urls.py
+++ b/opentech/apply/users/urls.py
@@ -2,15 +2,50 @@ from django.conf.urls import url
 
 from django.contrib.auth import views as auth_views
 
+from django.urls import reverse_lazy
+
+from wagtail.wagtailadmin.forms import PasswordResetForm
+
+from opentech.users.views import account
+
 urlpatterns = [
-    # TODO replace with dashboard view with a login_required decorator
-    url(r'^$', auth_views.login, {
-        'template_name': 'users/login.html'
-    }, name='user'),
-    url(r'^login$', auth_views.login, {
-        'template_name': 'users/login.html'
-    }, name='login'),
+    url(r'^$', account, name='account'),
+    url(
+        r'^login/$',
+        auth_views.LoginView.as_view(
+            template_name='users/login.html',
+            redirect_authenticated_user=True
+        ),
+        name='login'
+    ),
 
     # Log out
-    url(r'^logout/$', auth_views.logout, {'next_page': '/'}, name='logout'),
+    url(r'^logout/$', auth_views.LogoutView.as_view(next_page='/'), name='logout'),
+
+    # Password reset
+    url(r'^password_reset/$', auth_views.PasswordResetView.as_view(
+        template_name='users/password_reset/form.html',
+        email_template_name='users/password_reset/email.txt',
+        success_url=reverse_lazy('users:password_reset_done'),
+        form_class=PasswordResetForm
+    )),
+    url(
+        r'^password_reset/done/$',
+        auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset/done.html'),
+        name='password_reset_done'
+    ),
+    url(
+        r'^password_reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
+        auth_views.PasswordResetConfirmView.as_view(
+            template_name='users/password_reset/confirm.html',
+            post_reset_login=True,
+            success_url=reverse_lazy('users:account')
+        ),
+        name='password_reset_confirm'
+    ),
+    url(
+        r'^password_reset/complete/$',
+        auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset/complete.html'),
+        name='password_reset_complete'
+    ),
 ]
diff --git a/opentech/apply/users/views.py b/opentech/apply/users/views.py
index f4f3c02cd9caaa6853a8e00baf606135d4a5edd8..004fa0aa64e8e2ca9f5d80ae2dd6d72e7620f227 100644
--- a/opentech/apply/users/views.py
+++ b/opentech/apply/users/views.py
@@ -1 +1,8 @@
-# Views placeholder.
+from django.contrib.auth.decorators import login_required
+from django.template.response import TemplateResponse
+
+
+@login_required(login_url='/user/login')
+def account(request):
+    "Account page placeholder view"
+    return TemplateResponse(request, 'users/account.html', {})
diff --git a/opentech/settings/base.py b/opentech/settings/base.py
index 5aaf1a75957fd821d8260707e8c2c7982ee6919b..2693c88cb6f15773507c3866d5e099a9c793f205 100644
--- a/opentech/settings/base.py
+++ b/opentech/settings/base.py
@@ -181,6 +181,7 @@ MEDIA_URL = '/media/'
 
 AUTH_USER_MODEL = 'users.User'
 # TODO populate me with the dashboard URL when ready
+LOGIN_URL = 'users:login'
 LOGIN_REDIRECT_URL = '/'
 
 # Logging
diff --git a/opentech/users/templates/users/account.html b/opentech/users/templates/users/account.html
new file mode 100644
index 0000000000000000000000000000000000000000..76ce008a2256604f79007d0cdfadcf3a2044954f
--- /dev/null
+++ b/opentech/users/templates/users/account.html
@@ -0,0 +1,7 @@
+{% extends 'base.html' %}
+
+{% block title %}Account{% endblock %}
+
+{% block content %}
+<h2>Welcome {{ user }}</h2>
+{% endblock %}
diff --git a/opentech/users/templates/users/password_reset/complete.html b/opentech/users/templates/users/password_reset/complete.html
new file mode 100644
index 0000000000000000000000000000000000000000..00740fd926d8ee3539dabbe12f556a5bfd0b9a84
--- /dev/null
+++ b/opentech/users/templates/users/password_reset/complete.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block title %}{% trans "Reset password" %}{% endblock %} {% block content %}
+    <h1>{% trans "Password change successful" %}</h1>
+    <p>
+        <a href="{% url 'users:login' %}">{% trans "Log in" %}</a>
+    </p>
+{% endblock %}
diff --git a/opentech/users/templates/users/password_reset/confirm.html b/opentech/users/templates/users/password_reset/confirm.html
new file mode 100644
index 0000000000000000000000000000000000000000..6371c4593494ca9a49e6bae1d0523b4965e9527a
--- /dev/null
+++ b/opentech/users/templates/users/password_reset/confirm.html
@@ -0,0 +1,25 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block content %}
+    <form method="post" novalidate>
+        {% csrf_token %}
+        <h1>{% trans "Set your new password" %}</h1>
+
+        <ul class="fields">
+            <li>
+                <div class="field">
+                    {{ form.new_password1.label_tag }} {{ form.new_password1 }}
+                </div>
+            </li>
+            <li>
+                <div class="field">
+                    {{ form.new_password2.label_tag }} {{ form.new_password2 }}
+                </div>
+            </li>
+            <li class="submit">
+                <button type="submit">{% trans 'Reset password' %}</button>
+            </li>
+        </ul>
+    </form>
+{% endblock %}
diff --git a/opentech/users/templates/users/password_reset/done.html b/opentech/users/templates/users/password_reset/done.html
new file mode 100644
index 0000000000000000000000000000000000000000..8773bd7acb1b6669ca18489f65aa05c6160c9905
--- /dev/null
+++ b/opentech/users/templates/users/password_reset/done.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block title %}{% trans "Reset password" %}{% endblock %}
+
+{% block content %}
+    <h1>{% trans "Check your email" %}</h1>
+    <p>{% trans "A link to reset your password has been emailed to you." %}</p>
+{% endblock %}
diff --git a/opentech/users/templates/users/password_reset/email.txt b/opentech/users/templates/users/password_reset/email.txt
new file mode 100644
index 0000000000000000000000000000000000000000..30d6aa5aa9ad5f0525d97894a2e11b8e4dbd7c53
--- /dev/null
+++ b/opentech/users/templates/users/password_reset/email.txt
@@ -0,0 +1,7 @@
+{% load i18n wagtailadmin_tags %}{% base_url_setting as base_url %}
+{% trans "Please follow the link below to reset your password:" %}
+{% if base_url %}{{ base_url }}{% else %}{{ protocol }}://{{ domain }}{% endif %}{% url 'users:password_reset_confirm' uidb64=uid token=token %}
+
+{% if user.USERNAME_FIELD != "email" %}
+{% trans "Your username (in case you've forgotten):" %} {{ user.get_username }}
+{% endif %}
diff --git a/opentech/users/templates/users/password_reset/form.html b/opentech/users/templates/users/password_reset/form.html
new file mode 100644
index 0000000000000000000000000000000000000000..e75567ab59e313c9a4715da9b782351b03cacd3a
--- /dev/null
+++ b/opentech/users/templates/users/password_reset/form.html
@@ -0,0 +1,25 @@
+{% extends 'base.html' %}
+{% load i18n %}
+
+{% block title %}{% trans "Reset password" %}{% endblock %}
+
+
+{% block content %}
+    {% if form.non_field_errors %}
+        <div class="messages">
+            <ul>
+                {% for error in form.non_field_errors %}
+                <li class="error">{{ error }}</li>
+                {% endfor %}
+            </ul>
+        </div>
+    {% endif %}
+
+    <form method="post">
+        {% csrf_token %}
+        {{ form.email.label_tag }}
+        {{ form.email }}
+
+        <button type="submit">{% trans 'Reset password' %}</button>
+    </form>
+{% endblock %}