diff --git a/gms/memberdb/models.py b/gms/memberdb/models.py
index 7551994bca3f9a686080b4c825cc8c3ea885dbf4..cea2432b8f76ed3a4a6a75b602bfea87450a36f1 100644
--- a/gms/memberdb/models.py
+++ b/gms/memberdb/models.py
@@ -1,6 +1,7 @@
 from django.db import models
 from django.db.models import F
 from django.core.validators import RegexValidator
+from django.core.management.utils import get_random_string
 
 from squarepay.dispense import get_item_price
 
@@ -131,7 +132,7 @@ class Member (IncAssocMember):
     phone_number    = models.CharField ('Phone number', max_length=20, blank=False, validators=[RegexValidator(regex='^\+?[0-9() -]+$')])
     is_student      = models.BooleanField ('Student', default=True, blank=True, help_text="Tick this box if you are a current student at a secondary or tertiary institution in WA")
     is_guild        = models.BooleanField ('UWA Guild member', default=True, blank=True)
-    id_number       = models.CharField ('Student email or Drivers License', max_length=255, blank=False, help_text="Student emails should end with '.edu.au' and drivers licences should be in the format '[WA]DL 1234567'")
+    id_number       = models.CharField ('Student email or Drivers License', max_length=255, blank=False, help_text="Student emails should end with '@student.*.edu.au' and drivers licences should be in the format '<AU state> 1234567'")
     member_updated  = models.DateTimeField ('Internal UCC info last updated', auto_now=True)
     login_token     = models.CharField ('Temporary access key', max_length=128, null=True, editable=False, default=make_token)
 
diff --git a/gms/memberdb/register.py b/gms/memberdb/register.py
index ed604eb70ad41d57c5012c04d862459e86db57f0..d48ed6f40a65bf1e66237dcc42eee4f0fdfa740f 100644
--- a/gms/memberdb/register.py
+++ b/gms/memberdb/register.py
@@ -60,8 +60,6 @@ class RegisterForm(MyModelForm):
         # now create a corresponding Membership (marked as pending / not accepted, mostly default values)
         ms = make_pending_membership(m)
 
-        # make a card payment thing as well
-
         if (commit):
             ms.save();
         return m, ms
@@ -97,8 +95,21 @@ class RegisterView(MyUpdateView):
     def form_valid(self, form):
         # save the member data and get the Member instance
         m, ms = form.save()
-        #messages.success(self.request, 'Your registration has been submitted.')
-        return
+        messages.success(self.request, 'Your registration has been submitted.')
+
+        # set the member session info
+        self.request.session['member_id'] = m.id
+        return thanks_view(self.request, m, ms)
+
+def thanks_view(request, member, ms):
+    """ display a thankyou page after registration is completed """
+    context = {
+        'member': member,
+        'ms': ms,
+        'login_url': reverse('memberdb:login_member', kwargs={'username': member.username, 'member_token': member.login_token}),
+    }
+    return render(request, 'thanks.html', context)
+
 
 class RenewView(LoginRequiredMixin, MyUpdateView):
     template_name = 'renew.html'
diff --git a/gms/memberdb/templates/base.html b/gms/memberdb/templates/base.html
index 51f23d380477b98741e409fc74c6e1e9c1ee0782..9b2a749c8be8fd24b81234122c7b0086f5082a19 100644
--- a/gms/memberdb/templates/base.html
+++ b/gms/memberdb/templates/base.html
@@ -23,18 +23,22 @@
         {% block navbar %}
         <nav>
             {% block branding %}
-            <a class="logo" title="UCC logo">
+            <a class="logo" title="UCCPortal homepage">
                 <span></span>
             </a>
             {% endblock %}
             
             {# fancy automatic navbar thing from https://stackoverflow.com/questions/39639264 #}
             {% with url_name=request.resolver_match.url_name %}
-            {% if not request.user.is_authenticated %}
-            <a class="navtab {% if url_name == 'home' %}active{% endif %}" href="{% url "memberdb:home" %}">Login</a>
+            {% if request.member %}
+            <a class="navtab {% if url_name == 'home' %}active{% endif %}" href="{% url "memberdb:home" %}">Member home</a>
+            {% else %}
             <a class="navtab {% if url_name == 'register' %}active{% endif %}" href="{% url "memberdb:register" %}">Register</a>
+            {% endif %}
+
+            {% if not request.user.is_authenticated %}
+            <a class="navtab {% if url_name == 'login' %}active{% endif %}" href="{% url "memberdb:login" %}">Login</a>
             {% else %}
-            <a class="navtab {% if url_name == 'home' %}active{% endif %}" href="{% url "memberdb:home" %}">Member home</a>
             <a class="navtab {% if url_name == 'renew' %}active{% endif %}" href="{% url "memberdb:renew" %}">Renew membership</a>
             {% if request.user.is_staff %}
             <a class="navtab {% block adminactive %}{% endblock %}" href="{% url "admin:index" %}">Admin site</a>
diff --git a/gms/memberdb/templates/home.html b/gms/memberdb/templates/home.html
index 86f4520616ccbc147ec5f3316ce35ad80b09aec5..0070e90834a23d6feb6cb7742f8a99d0861c5328 100644
--- a/gms/memberdb/templates/home.html
+++ b/gms/memberdb/templates/home.html
@@ -2,6 +2,7 @@
 {% block title %}UCC Member Home{% endblock %}
 {% block content_title %}
     <h1>Member home</h1>
+    <h3>Welcome, {{ request.member.first_name }} {{ request.member.last_name }} ({{ request.member.username }})</h3>
 {% endblock %}
 
 {% block tips %}
@@ -16,7 +17,7 @@ You can see and modify some of your membership and account details below.
 {% block extra_preform %}
 <div class="form-row readonly">
     <label for="id_username">Username:</label>
-    <span class="text" id="id_username">{{ request.user.username }}</span>
+    <span class="text" id="id_username">{{ object.username }}</span>
 </div>
 {% endblock %}
 
@@ -26,4 +27,4 @@ You can see and modify some of your membership and account details below.
 
 {% block action_url %}{% url 'memberdb:home' %}{% endblock %}
 
-{% block action_text %}Update details{% endblock %}
\ No newline at end of file
+{% block action_text %}Update details{% endblock %}
diff --git a/gms/memberdb/templates/login.html b/gms/memberdb/templates/login.html
index e07df3b9d0cb454b736bd4e9296660753eefe0e8..d07731e38723a15b215f38d0b15942ce66066c15 100644
--- a/gms/memberdb/templates/login.html
+++ b/gms/memberdb/templates/login.html
@@ -37,7 +37,11 @@
     Would you like to login to a different account?
 {% else %}
     <b>Please enter your UCC username and password below.</b> <br><br>
+    {% if not request.member %}
     If you do not have a UCC account yet, please apply for a membership by going to the <a href="{% url 'memberdb:register' %}">registration page</a>.
+    {% else %}
+    It appears you have already registered. If you have not yet received your UCC login details, please <a href="https://www.ucc.asn.au/aboutucc/contact.ucc">contact us</a>.
+    {% endif %}
 {% endif %}
 </p>
 </div>
@@ -59,4 +63,4 @@
 </form>
 </div>
 
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/gms/memberdb/templates/thanks.html b/gms/memberdb/templates/thanks.html
index 9f3a24f55a3ceb29dd0b6dc23f8452b88c377f53..83648b1efc3f24709a8cd0d73294ac154b0f6060 100644
--- a/gms/memberdb/templates/thanks.html
+++ b/gms/memberdb/templates/thanks.html
@@ -1,18 +1,22 @@
-{% extends "register.html" %}
+{% extends "base.html" %}
 
-{% block content-title %}
+{% block content_title %}
 <h1>Thanks!</h1>
 {% endblock %}
 
 {% block tips %}
-<b>Your membership registration has been submitted.</b><br><br>
-Once it has been approved, you will receive an email with instructions to activate your account.
+<b>Thanks for registering</b><br><br>
+Once your registration has been approved, you will receive an email with instructions to activate your account.
 {% endblock %}
 
-{% block form %}
-{% if payment_url %}
-<div class="form-row readonly">
-    <a class="button" title="Pay online with card, using Square payments" href="{{ payment_url }}">Pay online now</a>
-</div>
-{% endif %}
+{% block content %}
+<h3>
+    Go to the <a href="{% url 'memberdb:home' %}">Member Home</a> page to see and edit some of your details.
+</h3>
+<p>
+    <b>You will continue to have access to this website during this browser session.</b> Alternatively, you can use <a href="{{ login_url }}">this link</a> to access your member details from anywhere for the next 7 days.
+</p>
+<p>
+    Once you receive your UCC login details, you will be able to login normally to access the site.
+</p>
 {% endblock %}
diff --git a/gms/memberdb/views.py b/gms/memberdb/views.py
index c9bac0740d555624b9082fc94f993be2fb18a582..b0abaa51692339999d16ffbe646576cd3a0f8934 100644
--- a/gms/memberdb/views.py
+++ b/gms/memberdb/views.py
@@ -1,4 +1,5 @@
-from datetime import date
+from datetime import date, timedelta
+
 from django.http import HttpResponse, HttpResponseRedirect, Http404
 from django.shortcuts import render
 from django.urls import reverse
@@ -7,6 +8,7 @@ from django.contrib import messages
 from django.views.generic.base import View
 from django.views.generic.edit import UpdateView
 from django.contrib.auth.mixins import AccessMixin
+from django.utils import timezone
 
 from .models import Member, IncAssocMember, Membership
 from .forms import MemberHomeForm
@@ -29,7 +31,7 @@ class MemberMiddleware:
         if request.user.is_authenticated:
             # get the username only when a user is logged in
             # note that request.user will still exist even when the user isn't logged in
-            request.member = Member.objects.filter(username__exact=self.request.user.username).first()
+            request.member = Member.objects.filter(username__exact=request.user.username).first()
 
             if request.member is not None:
                 # clean the member's auth token because they now have a working login
@@ -89,7 +91,7 @@ class MemberHomeView(MemberAccessMixin, MyUpdateView):
     form_class = MemberHomeForm
 
     def get_object(self):
-        return Member.objects.filter(username__exact=self.request.user.username).first()
+        return self.request.member
 
     def get_context_data(self):
         d = super().get_context_data()
@@ -104,17 +106,20 @@ class MemberHomeView(MemberAccessMixin, MyUpdateView):
         messages.warning(self.request, 'Could not update user display name in AD. Please try again once this feature has been implemented.')
 
         # redisplay the page
-        return self.get(request, *args, **kwargs)
+        return self.get(self.request)
 
 class MemberTokenView(View):
     """ allow a user to login using a unique (secure) member token """
     def get(self, request, **kwargs):
-        if not ('member_token' in kwargs and 'username' in kwargs) or user.is_authenticated:
+        if not ('member_token' in kwargs and 'username' in kwargs) or request.user.is_authenticated:
             raise Http404()
 
-        # look up the member using exact match for token and username
-        member = Member.objects.get(token=kwargs['member_token'], username=kwargs['username'])
+        # look up the member using exact match for token and username, and registered < 7 days ago
+        week_ago = timezone.now() - timedelta(days=7)
+
+        member = Member.objects.get(login_token=kwargs['member_token'], username=kwargs['username'], created__gte=week_ago)
         if member is None:
             raise Http404()
+
         request.session['member_id'] = member.id
         return HttpResponseRedirect(reverse('memberdb:home'))