diff --git a/resources/sql/queries.auto.sql b/resources/sql/queries.auto.sql
index b199ca0..0dd7351 100644
--- a/resources/sql/queries.auto.sql
+++ b/resources/sql/queries.auto.sql
@@ -1,6 +1,6 @@
 -- File queries.sql
 -- autogenerated by adl.to-hugsql-queries at
--- 2018-06-05T12:33:53.043Z
+-- 2018-06-11T00:58:48.917Z
 -- See [Application Description Language](https://github.com/simon-brooke/adl).
 
 
@@ -36,8 +36,7 @@ INSERT INTO canvassers (username,
 	phone,
 	email,
 	authority_id,
-	authorised,
-	roles)
+	authorised)
 VALUES (:username,
 	:fullname,
 	:elector_id,
@@ -45,8 +44,7 @@ VALUES (:username,
 	:phone,
 	:email,
 	:authority_id,
-	:authorised,
-	:roles)
+	:authorised)
 returning id
 
 -- :name create-district! :! :n
@@ -440,7 +438,7 @@ ORDER BY addresses.address,
 
 -- :name list-addresses-by-district :? :*
 -- :doc lists all existing address records related to a given district
-SELECT *
+SELECT * 
 FROM addresses
 WHERE addresses.district_id = :id
 ORDER BY addresses.address,
@@ -465,7 +463,7 @@ ORDER BY canvassers.username,
 
 -- :name list-canvassers-by-address :? :*
 -- :doc lists all existing canvasser records related to a given address
-SELECT *
+SELECT * 
 FROM canvassers
 WHERE canvassers.address_id = :id
 ORDER BY canvassers.username,
@@ -475,7 +473,7 @@ ORDER BY canvassers.username,
 
 -- :name list-canvassers-by-authority :? :*
 -- :doc lists all existing canvasser records related to a given authority
-SELECT *
+SELECT * 
 FROM canvassers
 WHERE canvassers.authority_id = :id
 ORDER BY canvassers.username,
@@ -485,7 +483,7 @@ ORDER BY canvassers.username,
 
 -- :name list-canvassers-by-elector :? :*
 -- :doc lists all existing canvasser records related to a given elector
-SELECT *
+SELECT * 
 FROM canvassers
 WHERE canvassers.elector_id = :id
 ORDER BY canvassers.username,
@@ -494,10 +492,11 @@ ORDER BY canvassers.username,
 	canvassers.id
 
 -- :name list-canvassers-by-role :? :*
--- :doc lists all existing canvasser records related to a given role
-SELECT *
+-- :doc links all existing canvasser records related to a given role
+SELECT * 
 FROM canvassers
-WHERE canvassers.roles = :id
+WHERE canvassers.roles = link_canvassers_roles.canvasser_id
+	AND link_canvassers_roles.role_id = :id
 ORDER BY canvassers.username,
 	canvassers.fullname,
 	canvassers.email,
@@ -519,7 +518,7 @@ SELECT * FROM dwellings
 
 -- :name list-dwellings-by-address :? :*
 -- :doc lists all existing dwelling records related to a given address
-SELECT *
+SELECT * 
 FROM dwellings
 WHERE dwellings.address_id = :id
 
@@ -535,7 +534,7 @@ ORDER BY electors.name,
 
 -- :name list-electors-by-dwelling :? :*
 -- :doc lists all existing elector records related to a given dwelling
-SELECT *
+SELECT * 
 FROM electors
 WHERE electors.dwelling_id = :id
 ORDER BY electors.name,
@@ -545,7 +544,7 @@ ORDER BY electors.name,
 
 -- :name list-electors-by-gender :? :*
 -- :doc lists all existing elector records related to a given gender
-SELECT *
+SELECT * 
 FROM electors
 WHERE electors.gender = :id
 ORDER BY electors.name,
@@ -561,13 +560,13 @@ SELECT * FROM followupactions
 
 -- :name list-followupactions-by-canvasser :? :*
 -- :doc lists all existing followupaction records related to a given canvasser
-SELECT *
+SELECT * 
 FROM followupactions
 WHERE followupactions.actor = :id
 
 -- :name list-followupactions-by-followuprequest :? :*
 -- :doc lists all existing followupaction records related to a given followuprequest
-SELECT *
+SELECT * 
 FROM followupactions
 WHERE followupactions.request_id = :id
 
@@ -585,25 +584,25 @@ SELECT * FROM followuprequests
 
 -- :name list-followuprequests-by-elector :? :*
 -- :doc lists all existing followuprequest records related to a given elector
-SELECT *
+SELECT * 
 FROM followuprequests
 WHERE followuprequests.elector_id = :id
 
 -- :name list-followuprequests-by-followupmethod :? :*
 -- :doc lists all existing followuprequest records related to a given followupmethod
-SELECT *
+SELECT * 
 FROM followuprequests
 WHERE followuprequests.method_id = :id
 
 -- :name list-followuprequests-by-issue :? :*
 -- :doc lists all existing followuprequest records related to a given issue
-SELECT *
+SELECT * 
 FROM followuprequests
 WHERE followuprequests.issue_id = :id
 
 -- :name list-followuprequests-by-visit :? :*
 -- :doc lists all existing followuprequest records related to a given visit
-SELECT *
+SELECT * 
 FROM followuprequests
 WHERE followuprequests.visit_id = :id
 
@@ -621,19 +620,19 @@ SELECT * FROM intentions
 
 -- :name list-intentions-by-elector :? :*
 -- :doc lists all existing intention records related to a given elector
-SELECT *
+SELECT * 
 FROM intentions
 WHERE intentions.elector_id = :id
 
 -- :name list-intentions-by-option :? :*
 -- :doc lists all existing intention records related to a given option
-SELECT *
+SELECT * 
 FROM intentions
 WHERE intentions.option_id = :id
 
 -- :name list-intentions-by-visit :? :*
 -- :doc lists all existing intention records related to a given visit
-SELECT *
+SELECT * 
 FROM intentions
 WHERE intentions.visit_id = :id
 
@@ -645,19 +644,19 @@ SELECT * FROM issueexpertise
 
 -- :name list-issueexpertise-by-canvasser :? :*
 -- :doc lists all existing issueexpertise records related to a given canvasser
-SELECT *
+SELECT * 
 FROM issueexpertise
 WHERE issueexpertise.canvasser_id = :id
 
 -- :name list-issueexpertise-by-followupmethod :? :*
 -- :doc lists all existing issueexpertise records related to a given followupmethod
-SELECT *
+SELECT * 
 FROM issueexpertise
 WHERE issueexpertise.method_id = :id
 
 -- :name list-issueexpertise-by-issue :? :*
 -- :doc lists all existing issueexpertise records related to a given issue
-SELECT *
+SELECT * 
 FROM issueexpertise
 WHERE issueexpertise.issue_id = :id
 
@@ -681,13 +680,13 @@ SELECT * FROM rolememberships
 
 -- :name list-rolememberships-by-canvasser :? :*
 -- :doc lists all existing rolemembership records related to a given canvasser
-SELECT *
+SELECT * 
 FROM rolememberships
 WHERE rolememberships.canvasser_id = :id
 
 -- :name list-rolememberships-by-role :? :*
 -- :doc lists all existing rolemembership records related to a given role
-SELECT *
+SELECT * 
 FROM rolememberships
 WHERE rolememberships.role_id = :id
 
@@ -699,6 +698,15 @@ ORDER BY roles.name,
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
 
+-- :name list-roles-by-canvasser :? :*
+-- :doc links all existing role records related to a given canvasser
+SELECT * 
+FROM roles
+WHERE roles.members = link_roles_canvassers.role_id
+	AND link_roles_canvassers.canvasser_id = :id
+ORDER BY roles.name,
+	roles.id
+
 -- :name list-teammemberships :? :*
 -- :doc lists all existing teammembership records
 SELECT * FROM teammemberships
@@ -707,13 +715,13 @@ SELECT * FROM teammemberships
 
 -- :name list-teammemberships-by-canvasser :? :*
 -- :doc lists all existing teammembership records related to a given canvasser
-SELECT *
+SELECT * 
 FROM teammemberships
 WHERE teammemberships.canvasser_id = :id
 
 -- :name list-teammemberships-by-team :? :*
 -- :doc lists all existing teammembership records related to a given team
-SELECT *
+SELECT * 
 FROM teammemberships
 WHERE teammemberships.team_id = :id
 
@@ -725,13 +733,13 @@ SELECT * FROM teamorganiserships
 
 -- :name list-teamorganiserships-by-canvasser :? :*
 -- :doc lists all existing teamorganisership records related to a given canvasser
-SELECT *
+SELECT * 
 FROM teamorganiserships
 WHERE teamorganiserships.canvasser_id = :id
 
 -- :name list-teamorganiserships-by-team :? :*
 -- :doc lists all existing teamorganisership records related to a given team
-SELECT *
+SELECT * 
 FROM teamorganiserships
 WHERE teamorganiserships.team_id = :id
 
@@ -743,9 +751,18 @@ ORDER BY teams.name,
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
 
+-- :name list-teams-by-canvasser :? :*
+-- :doc links all existing team records related to a given canvasser
+SELECT * 
+FROM teams
+WHERE teams.members = link_teams_canvassers.team_id
+	AND link_teams_canvassers.canvasser_id = :id
+ORDER BY teams.name,
+	teams.id
+
 -- :name list-teams-by-district :? :*
 -- :doc lists all existing team records related to a given district
-SELECT *
+SELECT * 
 FROM teams
 WHERE teams.district_id = :id
 ORDER BY teams.name,
@@ -759,20 +776,20 @@ SELECT * FROM visits
 
 -- :name list-visits-by-address :? :*
 -- :doc lists all existing visit records related to a given address
-SELECT *
+SELECT * 
 FROM visits
 WHERE visits.address_id = :id
 
 -- :name list-visits-by-canvasser :? :*
 -- :doc lists all existing visit records related to a given canvasser
-SELECT *
+SELECT * 
 FROM visits
 WHERE visits.canvasser_id = :id
 
 -- :name search-strings-address :? :1
 -- :doc selects existing address records having any string field matching `:pattern` by substring match
 SELECT * FROM addresses
-WHERE
+WHERE 
 address LIKE '%:pattern%'
 	OR phone LIKE '%:pattern%'
 ORDER BY addresses.address,
@@ -784,7 +801,7 @@ ORDER BY addresses.address,
 -- :name search-strings-authority :? :1
 -- :doc selects existing authority records having any string field matching `:pattern` by substring match
 SELECT * FROM authorities
-WHERE
+WHERE 
 id LIKE '%:pattern%'
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@@ -792,7 +809,7 @@ id LIKE '%:pattern%'
 -- :name search-strings-canvasser :? :1
 -- :doc selects existing canvasser records having any string field matching `:pattern` by substring match
 SELECT * FROM canvassers
-WHERE
+WHERE 
 username LIKE '%:pattern%'
 	OR fullname LIKE '%:pattern%'
 	OR phone LIKE '%:pattern%'
@@ -807,7 +824,7 @@ ORDER BY canvassers.username,
 -- :name search-strings-district :? :1
 -- :doc selects existing district records having any string field matching `:pattern` by substring match
 SELECT * FROM districts
-WHERE
+WHERE 
 name LIKE '%:pattern%'
 ORDER BY districts.name,
 	districts.id
@@ -817,7 +834,7 @@ ORDER BY districts.name,
 -- :name search-strings-dwelling :? :1
 -- :doc selects existing dwelling records having any string field matching `:pattern` by substring match
 SELECT * FROM dwellings
-WHERE
+WHERE 
 sub-address LIKE '%:pattern%'
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@@ -825,7 +842,7 @@ sub-address LIKE '%:pattern%'
 -- :name search-strings-elector :? :1
 -- :doc selects existing elector records having any string field matching `:pattern` by substring match
 SELECT * FROM electors
-WHERE
+WHERE 
 name LIKE '%:pattern%'
 	OR phone LIKE '%:pattern%'
 	OR email LIKE '%:pattern%'
@@ -839,7 +856,7 @@ ORDER BY electors.name,
 -- :name search-strings-followupaction :? :1
 -- :doc selects existing followupaction records having any string field matching `:pattern` by substring match
 SELECT * FROM followupactions
-WHERE
+WHERE 
 notes LIKE '%:pattern%'
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@@ -847,7 +864,7 @@ notes LIKE '%:pattern%'
 -- :name search-strings-followupmethod :? :1
 -- :doc selects existing followupmethod records having any string field matching `:pattern` by substring match
 SELECT * FROM followupmethods
-WHERE
+WHERE 
 id LIKE '%:pattern%'
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@@ -855,14 +872,14 @@ id LIKE '%:pattern%'
 -- :name search-strings-followuprequest :? :1
 -- :doc selects existing followuprequest records having any string field matching `:pattern` by substring match
 SELECT * FROM followuprequests
-WHERE
+WHERE 
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
 
 -- :name search-strings-gender :? :1
 -- :doc selects existing gender records having any string field matching `:pattern` by substring match
 SELECT * FROM genders
-WHERE
+WHERE 
 id LIKE '%:pattern%'
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@@ -870,14 +887,14 @@ id LIKE '%:pattern%'
 -- :name search-strings-intention :? :1
 -- :doc selects existing intention records having any string field matching `:pattern` by substring match
 SELECT * FROM intentions
-WHERE
+WHERE 
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
 
 -- :name search-strings-issue :? :1
 -- :doc selects existing issue records having any string field matching `:pattern` by substring match
 SELECT * FROM issues
-WHERE
+WHERE 
 url LIKE '%:pattern%'
 	OR id LIKE '%:pattern%'
 --~ (if (:offset params) "OFFSET :offset ")
@@ -886,14 +903,14 @@ url LIKE '%:pattern%'
 -- :name search-strings-issueexpertise :? :1
 -- :doc selects existing issueexpertise records having any string field matching `:pattern` by substring match
 SELECT * FROM issueexpertise
-WHERE
+WHERE 
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
 
 -- :name search-strings-option :? :1
 -- :doc selects existing option records having any string field matching `:pattern` by substring match
 SELECT * FROM options
-WHERE
+WHERE 
 id LIKE '%:pattern%'
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@@ -901,7 +918,7 @@ id LIKE '%:pattern%'
 -- :name search-strings-role :? :1
 -- :doc selects existing role records having any string field matching `:pattern` by substring match
 SELECT * FROM roles
-WHERE
+WHERE 
 name LIKE '%:pattern%'
 ORDER BY roles.name,
 	roles.id
@@ -911,14 +928,14 @@ ORDER BY roles.name,
 -- :name search-strings-rolemembership :? :1
 -- :doc selects existing rolemembership records having any string field matching `:pattern` by substring match
 SELECT * FROM rolememberships
-WHERE
+WHERE 
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
 
 -- :name search-strings-team :? :1
 -- :doc selects existing team records having any string field matching `:pattern` by substring match
 SELECT * FROM teams
-WHERE
+WHERE 
 name LIKE '%:pattern%'
 ORDER BY teams.name,
 	teams.id
@@ -928,21 +945,21 @@ ORDER BY teams.name,
 -- :name search-strings-teammembership :? :1
 -- :doc selects existing teammembership records having any string field matching `:pattern` by substring match
 SELECT * FROM teammemberships
-WHERE
+WHERE 
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
 
 -- :name search-strings-teamorganisership :? :1
 -- :doc selects existing teamorganisership records having any string field matching `:pattern` by substring match
 SELECT * FROM teamorganiserships
-WHERE
+WHERE 
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
 
 -- :name search-strings-visit :? :1
 -- :doc selects existing visit records having any string field matching `:pattern` by substring match
 SELECT * FROM visits
-WHERE
+WHERE 
 --~ (if (:offset params) "OFFSET :offset ")
 --~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
 
@@ -967,8 +984,7 @@ SET username = :username,
 	phone = :phone,
 	email = :email,
 	authority_id = :authority_id,
-	authorised = :authorised,
-	roles = :roles
+	authorised = :authorised
 WHERE canvassers.id = :id
 
 -- :name update-district! :! :n
@@ -1079,4 +1095,4 @@ UPDATE visits
 SET address_id = :address_id,
 	canvasser_id = :canvasser_id,
 	date = :date
-WHERE visits.id = :id
+WHERE visits.id = :id
\ No newline at end of file
diff --git a/resources/templates/base-authenticated.html b/resources/templates/base-authenticated.html
index 7da389b..22af08a 100644
--- a/resources/templates/base-authenticated.html
+++ b/resources/templates/base-authenticated.html
@@ -1,8 +1,8 @@
 <!DOCTYPE html>
 <html>
   <head>
-    <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
     <link rel="stylesheet" type="text/css" href="css/yyy-common.css" />
     <link rel="stylesheet" type="text/css" href="css/yyy-site.css" />
     <link rel="stylesheet" type="text/css" href="css/spinner.css" />
@@ -11,6 +11,7 @@
   </head>
   <body>
     {% block whole-page %}
+    {% block top %}
     <header>
       <div id="nav">
         <img id="nav-icon" src="img/threelines.png" alt="Menu"/>
@@ -31,7 +32,7 @@
         {{title}}
       </h1>
     </header>
-
+    {% endblock %}
     <div id="main-container" class="container">
       <div id="big-links">
         {% block big-links %}
@@ -45,6 +46,7 @@
         <a href="javascript:history.back()" id="back-link">Back</a>
       </div>
     </div>
+    {% block foot %}
     <footer>
       <div id="credits">
         <div>
@@ -62,6 +64,7 @@
       </div>
     </footer>
     {% endblock %}
+    {% endblock %}
     <script type="text/javascript">
         var context = "{{servlet-context}}";
         var csrfToken = "{{csrf-token}}";
diff --git a/src/clj/youyesyet/routes/auto_json_routes.clj b/src/clj/youyesyet/routes/auto_json_routes.clj
index c9732cd..64efb8f 100644
--- a/src/clj/youyesyet/routes/auto_json_routes.clj
+++ b/src/clj/youyesyet/routes/auto_json_routes.clj
@@ -56,7 +56,7 @@
  list-addresses-by-district
  list-authorities
  list-canvassers
- list-canvassers-by-addresse
+ list-canvassers-by-address
  list-canvassers-by-authoritie
  list-canvassers-by-elector
  list-districts
@@ -110,7 +110,7 @@
 
 (defroutes
  auto-rest-routes
- (POST "/json/auto/create-addresse" request (create-address request))
+ (POST "/json/auto/create-address" request (create-address request))
  (POST
   "/json/auto/create-authority"
   request
@@ -162,7 +162,7 @@
   request
   (create-teamorganisership request))
  (POST "/json/auto/create-visit" request (create-visit request))
- (POST "/json/auto/delete-addresse" request (delete-address request))
+ (POST "/json/auto/delete-address" request (delete-address request))
  (POST
   "/json/auto/delete-authority"
   request
@@ -188,7 +188,7 @@
  (POST "/json/auto/delete-issue" request (delete-issue request))
  (POST "/json/auto/delete-option" request (delete-option request))
  (POST "/json/auto/delete-visit" request (delete-visit request))
- (POST "/json/auto/get-addresse" request (get-addresse request))
+ (POST "/json/auto/get-address" request (get-address request))
  (POST "/json/auto/get-authority" request (get-authority request))
  (POST "/json/auto/get-canvasser" request (get-canvasser request))
  (POST "/json/auto/get-district" request (get-district request))
@@ -216,9 +216,9 @@
  (GET "/json/auto/list-authorities" request (list-authorities request))
  (GET "/json/auto/list-canvassers" request (list-canvassers request))
  (GET
-  "/json/auto/list-canvassers-by-addresse"
+  "/json/auto/list-canvassers-by-address"
   request
-  (list-canvassers-by-addresse request))
+  (list-canvassers-by-address request))
  (GET
   "/json/auto/list-canvassers-by-authoritie"
   request
@@ -230,9 +230,9 @@
  (GET "/json/auto/list-districts" request (list-districts request))
  (GET "/json/auto/list-electors" request (list-electors request))
  (GET
-  "/json/auto/list-electors-by-addresse"
+  "/json/auto/list-electors-by-address"
   request
-  (list-electors-by-addresse request))
+  (list-electors-by-address request))
  (GET
   "/json/auto/list-followupactions"
   request
@@ -355,14 +355,14 @@
   (list-teams-by-district request))
  (GET "/json/auto/list-visits" request (list-visits request))
  (GET
-  "/json/auto/list-visits-by-addresse"
+  "/json/auto/list-visits-by-address"
   request
-  (list-visits-by-addresse request))
+  (list-visits-by-address request))
  (GET
   "/json/auto/list-visits-by-canvasser"
   request
   (list-visits-by-canvasser request))
- (POST "/json/auto/update-addresse" request (update-addresse request))
+ (POST "/json/auto/update-address" request (update-address request))
  (POST
   "/json/auto/update-canvasser"
   request
@@ -603,10 +603,10 @@
 
 
 (defn
- get-addresse
+ get-address
  "Auto-generated method to select one record from the addresses table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the following keys: (:address :district_id :id :latitude :longitude :phone :postcode)."
  [{:keys [params]}]
- (do (db/get-addresse params)))
+ (do (db/get-address params)))
 
 
 (defn
@@ -707,9 +707,9 @@
 
 
 (defn
- list-canvassers-by-addresse
+ list-canvassers-by-address
  [{:keys [params]}]
- (do (db/list-canvassers-by-addresse params)))
+ (do (db/list-canvassers-by-address params)))
 
 
 (defn
@@ -739,9 +739,9 @@
 
 
 (defn
- list-electors-by-addresse
+ list-electors-by-address
  [{:keys [params]}]
- (do (db/list-electors-by-addresse params)))
+ (do (db/list-electors-by-address params)))
 
 
 (defn
@@ -958,9 +958,9 @@
 
 
 (defn
- list-visits-by-addresse
+ list-visits-by-address
  [{:keys [params]}]
- (do (db/list-visits-by-addresse params)))
+ (do (db/list-visits-by-address params)))
 
 
 (defn
diff --git a/src/clj/youyesyet/routes/home.clj b/src/clj/youyesyet/routes/home.clj
index 9fbc094..eeb3722 100644
--- a/src/clj/youyesyet/routes/home.clj
+++ b/src/clj/youyesyet/routes/home.clj
@@ -57,7 +57,7 @@
     [session (:session request)
      username (:user session)
      user (if username (db-core/get-canvasser-by-username db-core/*db* {:username username}))
-     roles (if user (db-core/get-roles-by-canvasser db-core/*db* {:canvasser (:id user)}))]
+     roles (if user (db-core/list-roles-by-canvasser db-core/*db* {:id (:id user)}))]
     (cond
       roles (layout/render "roles.html"
                            {:title (str "Welcome " (:fullname user) ", what do you want to do?")
diff --git a/youyesyet.adl.xml b/youyesyet.adl.xml
index 98b0593..de657b5 100644
--- a/youyesyet.adl.xml
+++ b/youyesyet.adl.xml
@@ -3,6 +3,7 @@
 "http://www.journeyman.cc/adl/stable/adl/schemas/adl-1.4.1.dtd" -->
 <application name="youyesyet" version="0.1.1"
              xmlns="http://bowyer.journeyman.cc/adl/1.4.1/"
+             xmlns:html="http://www.w3.org/1999/xhtml"
              xmlns:adl="http://bowyer.journeyman.cc/adl/1.4.1/">
   <documentation>
     A web-app intended to be used by canvassers campaigning for a 'Yes' vote in the second independence referendum.
@@ -12,9 +13,34 @@
     There must also be an administrative interface through which privileged users can set the system up and authorise canvassers, and a 'followup' interface through which issue-expert specialist canvassers can address particular electors' queries.
   </documentation>
   <content>
-    <head> </head>
+    <head>
+        <html:meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <html:meta name="viewport" content="width=device-width, initial-scale=1"/>
+        <html:link rel="stylesheet" type="text/css" href="css/yyy-common.css" />
+        <html:link rel="stylesheet" type="text/css" href="css/yyy-site.css" />
+        <html:link rel="stylesheet" type="text/css" href="css/spinner.css" />
+        <html:link href="https://fonts.googleapis.com/css?family=Archivo+Black|Archivo+Narrow" rel="stylesheet"/>
+        <html:title>{{site-title}}: {{title}}</html:title>
+      </head>
     <top> </top>
-    <foot> </foot>
+    <foot>
+      <html:footer>
+        <html:div id="credits">
+          <html:div>
+            <html:img src="img/credits/ric-logo.png" width="24" height="24"/>
+            A project of the
+            <html:a href="https://radical.scot/">Radical Independence Campaign</html:a> ||
+            Version {{version}}
+          </html:div>
+          <html:div>
+            <html:img height="16" width="16" alt="Clojure" src="img/credits/luminus-logo.png"/>Built with <html:a href="http://www.luminusweb.net/">LuminusWeb</html:a> ||
+            <html:img height="16" width="16" alt="Clojure" src="img/credits/clojure-icon.gif"/> Powered by <html:a href="http://clojure.org">Clojure</html:a> ||
+            <html:img height="16" width="16" alt="GitHub" src="img/credits/github-logo-transparent.png"/>Find me/fork me on <html:a href="https://github.com/simon-brooke/smeagol">Github</html:a> ||
+            <html:img height="16" width="16" alt="Free Software Foundation" src="img/credits/gnu.small.png"/>Licensed under the <html:a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU General Public License version 2.0</html:a>
+          </html:div>
+        </html:div>
+      </html:footer>
+    </foot>
   </content>
   <typedef name="postcode" type="string"
     pattern="^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$" size="16">
@@ -143,7 +169,7 @@
         <prompt prompt="id" locale="en-GB"/>
       </property>
     </key>
-    <property required="true" type="integer" name="address_id" column="address_id"
+    <property required="true" type="entity" name="address_id" column="address_id"
       entity="addresses" farkey="id">
       <prompt prompt="address_id" locale="en-GB"/>
     </property>
@@ -218,7 +244,7 @@
     <property type="entity" name="elector_id" column="elector_id" entity="electors" farkey="id">
       <prompt prompt="elector_id" locale="en-GB"/>
     </property>
-    <property required="true" type="integer" name="address_id" column="address_id"
+    <property required="true" type="entity" name="address_id" column="address_id"
       entity="addresses" farkey="id">
       <prompt prompt="address_id" locale="en-GB"/>
     </property>
@@ -369,7 +395,7 @@
       entity="followuprequests" farkey="id">
       <prompt prompt="request_id" locale="en-GB"/>
     </property>
-    <property required="true" type="integer" name="actor" column="actor" entity="canvassers"
+    <property required="true" type="entity" name="actor" column="actor" entity="canvassers"
       farkey="id">
       <prompt prompt="actor" locale="en-GB"/>
     </property>
@@ -392,7 +418,7 @@
   </entity>
   <entity name="issueexpertise" magnitude="5">
     <documentation>Link table</documentation>
-      <property required="true" type="integer" name="canvasser_id" column="canvasser_id"
+      <property required="true" type="entity" name="canvasser_id" column="canvasser_id"
         entity="canvassers" farkey="id">
         <prompt prompt="canvasser_id" locale="en-GB"/>
       </property>
diff --git a/youyesyet.canonical.adl.xml b/youyesyet.canonical.adl.xml
index 18a2de3..8fb571f 100644
--- a/youyesyet.canonical.adl.xml
+++ b/youyesyet.canonical.adl.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- DOCTYPE application PUBLIC "-//JOURNEYMAN//DTD ADL 1.4.1//EN"
 "http://www.journeyman.cc/adl/stable/adl/schemas/adl-1.4.1.dtd" -->
-<application xmlns="http://bowyer.journeyman.cc/adl/1.4.1/" xmlns:adl="http://bowyer.journeyman.cc/adl/1.4.1/" name="youyesyet" version="0.1.1">
+<application xmlns="http://bowyer.journeyman.cc/adl/1.4.1/" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:adl="http://bowyer.journeyman.cc/adl/1.4.1/" name="youyesyet" version="0.1.1">
   <!--
     ***************************************************************************
     *
@@ -22,9 +22,34 @@
     There must also be an administrative interface through which privileged users can set the system up and authorise canvassers, and a 'followup' interface through which issue-expert specialist canvassers can address particular electors' queries.
   </documentation>
   <content>
-    <head> </head>
+    <head>
+        <html:meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <html:meta name="viewport" content="width=device-width, initial-scale=1"/>
+        <html:link rel="stylesheet" type="text/css" href="css/yyy-common.css"/>
+        <html:link rel="stylesheet" type="text/css" href="css/yyy-site.css"/>
+        <html:link rel="stylesheet" type="text/css" href="css/spinner.css"/>
+        <html:link href="https://fonts.googleapis.com/css?family=Archivo+Black|Archivo+Narrow" rel="stylesheet"/>
+        <html:title>{{site-title}}: {{title}}</html:title>
+      </head>
     <top> </top>
-    <foot> </foot>
+    <foot>
+      <html:footer>
+        <html:div id="credits">
+          <html:div>
+            <html:img src="img/credits/ric-logo.png" width="24" height="24"/>
+            A project of the
+            <html:a href="https://radical.scot/">Radical Independence Campaign</html:a> ||
+            Version {{version}}
+          </html:div>
+          <html:div>
+            <html:img height="16" width="16" alt="Clojure" src="img/credits/luminus-logo.png"/>Built with <html:a href="http://www.luminusweb.net/">LuminusWeb</html:a> ||
+            <html:img height="16" width="16" alt="Clojure" src="img/credits/clojure-icon.gif"/> Powered by <html:a href="http://clojure.org">Clojure</html:a> ||
+            <html:img height="16" width="16" alt="GitHub" src="img/credits/github-logo-transparent.png"/>Find me/fork me on <html:a href="https://github.com/simon-brooke/smeagol">Github</html:a> ||
+            <html:img height="16" width="16" alt="Free Software Foundation" src="img/credits/gnu.small.png"/>Licensed under the <html:a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU General Public License version 2.0</html:a>
+          </html:div>
+        </html:div>
+      </html:footer>
+    </foot>
   </content>
   <typedef name="postcode" type="string" pattern="^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$" size="16">
     <documentation>See
@@ -177,7 +202,7 @@
         <prompt prompt="id" locale="en-GB"/>
       </property>
     </key>
-    <property required="true" type="integer" name="address_id" column="address_id" entity="addresses" farkey="id">
+    <property required="true" type="entity" name="address_id" column="address_id" entity="addresses" farkey="id">
       <prompt prompt="address_id" locale="en-GB"/>
     </property>
     <property required="true" type="entity" name="canvasser_id" column="canvasser_id" entity="canvassers" farkey="id">
@@ -294,7 +319,7 @@
     <property type="entity" name="elector_id" column="elector_id" entity="electors" farkey="id">
       <prompt prompt="elector_id" locale="en-GB"/>
     </property>
-    <property required="true" type="integer" name="address_id" column="address_id" entity="addresses" farkey="id">
+    <property required="true" type="entity" name="address_id" column="address_id" entity="addresses" farkey="id">
       <prompt prompt="address_id" locale="en-GB"/>
     </property>
     <property type="string" name="phone" column="phone" size="16">
@@ -484,7 +509,7 @@
     <property required="true" type="entity" name="request_id" column="request_id" entity="followuprequests" farkey="id">
       <prompt prompt="request_id" locale="en-GB"/>
     </property>
-    <property required="true" type="integer" name="actor" column="actor" entity="canvassers" farkey="id">
+    <property required="true" type="entity" name="actor" column="actor" entity="canvassers" farkey="id">
       <prompt prompt="actor" locale="en-GB"/>
     </property>
     <property required="true" default="" type="timestamp" name="date" column="date">
@@ -517,7 +542,7 @@
 					</documentation>
       </property>
     </key>
-    <property required="true" type="integer" name="canvasser_id" column="canvasser_id" entity="canvassers" farkey="id">
+    <property required="true" type="entity" name="canvasser_id" column="canvasser_id" entity="canvassers" farkey="id">
         <prompt prompt="canvasser_id" locale="en-GB"/>
       </property>
     <property required="true" type="entity" name="issue_id" column="issue_id" entity="issues" farkey="id">