diff --git a/doc/specification/authorisation.md b/doc/specification/authorisation.md
new file mode 100644
index 0000000..66b006e
--- /dev/null
+++ b/doc/specification/authorisation.md
@@ -0,0 +1,17 @@
+# Security and authorisation
+
+Essentially we have six levels of authorisation, at essentially increasing levels of sensitivity.
+
+1. *Canvassers:* Any authenticated user essentially has this level of authorisation. Hence users of the app can all share the same database connections without problem. Therefore there will be one first-class database user for all canvassers, and they will not have individual real database logins.
+
+2. *Issue experts:* Issue experts respond to followup requests. Therefore they must be able to see the queue of requests and the details of the elector making the request. They don't need to see voter intentions and I don't believe the information they do need to see is particularly sensitive. So they too can share a single database-layer login and connection pool; whether this is the same login as used by the canvassers is an implementation detail but I don't believe that it's critical.
+
+3. *Issue editors:* Don't need to see much sensitive data (although they do need to see, in aggregate, what issues are being raised by electors in the field), but they do have the power to dictate the initial responses canvassers make to issues raised, so the information they can *write* is pretty sensitive. We need to be very sure that unauthorised users don't have the power to write this data. So I suggest that issue editors probably should have individual first class database logins.
+
+4. *Team leaders:* Need to be able to monitor the performance of their teams, to invite new users to the system and to block abusive users from the system. Again, these are significant functions which should be well protected from abuse. But we will have at least hundreds, probably thousands of team leaders across Scotland. I would prefer that they each had first class logins, but this may be impractical. But in any case, even if they use a shared login, it should not be the same shared login as used by canvassers.
+
+5. *Analyists* Need broad authorisation to read, but not write or edit, all sensitive data held by the system. They must have individual first class database logins.
+
+6. *Admins* Can necessarily read and write everything. They should definitely each have individual first class database logins.
+
+This means we have a hybrid authentication scheme; for lower levels, application layer security and shared connection pools are adequate. For higher levels, individual connections and database layer authorisation are required. It implies that the routes at the different layers should be separated into separate namespaces with separate authentication functions.
diff --git a/resources/sql/queries.auto.sql b/resources/sql/queries.auto.sql
index 41337f4..637b92f 100644
--- a/resources/sql/queries.auto.sql
+++ b/resources/sql/queries.auto.sql
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 --	File queries.sql 
 --	
---	autogenerated by adl.to-hugsql-queries at 2018-06-15T09:22:07.884Z 
+--	autogenerated by adl.to-hugsql-queries at 2018-06-17T11:05:53.294Z 
 --	
 --	See [Application Description 
 --	Language](https://github.com/simon-brooke/adl). 
diff --git a/resources/templates/auto/application-index.html b/resources/templates/auto/application-index.html
index 6a420f7..eecae38 100644
--- a/resources/templates/auto/application-index.html
+++ b/resources/templates/auto/application-index.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File application-index.html generated 2018-06-15T08:47:04.322Z by adl.to-selmer-templates.
+<!-- File application-index.html generated 2018-06-18T10:08:09.799Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
diff --git a/resources/templates/auto/form-addresses-Address.html b/resources/templates/auto/form-addresses-Address.html
index 95f7a5f..b834a12 100644
--- a/resources/templates/auto/form-addresses-Address.html
+++ b/resources/templates/auto/form-addresses-Address.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-addresses-Address.html generated 2018-06-15T08:47:04.309Z by adl.to-selmer-templates.
+<!-- File form-addresses-Address.html generated 2018-06-18T10:08:09.773Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -29,63 +29,63 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable addresses  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable addresses %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='address'>
 address
 </label>
-{% ifwritable addresses address %}
+{% ifmemberof admin %}
 <input id='address' name='address' type='text' value='{{record.address}}'/>
 {% else %}
-{% ifreadable addresses address%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='address' name='address' class='pseudo-widget disabled'>
 {{record.address}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='postcode'>
 postcode
 </label>
-{% ifwritable addresses postcode %}
+{% ifmemberof admin %}
 <input id='postcode' name='postcode' type='text' value='{{record.postcode}}'/>
 {% else %}
-{% ifreadable addresses postcode%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='postcode' name='postcode' class='pseudo-widget disabled'>
 {{record.postcode}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='phone'>
 phone
 </label>
-{% ifwritable addresses phone %}
+{% ifmemberof admin %}
 <input id='phone' name='phone' type='text' value='{{record.phone}}'/>
 {% else %}
-{% ifreadable addresses phone%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='phone' name='phone' class='pseudo-widget disabled'>
 {{record.phone}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='district_id'>
 district_id
 </label>
-{% ifwritable addresses district_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='districts' found='true'>
 <input name='district_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='district_id' name='district_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -93,102 +93,102 @@ district_id
 </select>
 </div>
 {% else %}
-{% ifreadable addresses district_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='district_id' name='district_id' class='pseudo-widget disabled'>
 {{record.district_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='latitude'>
 latitude
 </label>
-{% ifwritable addresses latitude %}
+{% ifmemberof admin %}
 <input id='latitude' name='latitude' type='number' value='{{record.latitude}}'/>
 {% else %}
-{% ifreadable addresses latitude%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='latitude' name='latitude' class='pseudo-widget disabled'>
 {{record.latitude}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='longitude'>
 longitude
 </label>
-{% ifwritable addresses longitude %}
+{% ifmemberof admin %}
 <input id='longitude' name='longitude' type='number' value='{{record.longitude}}'/>
 {% else %}
-{% ifreadable addresses longitude%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='longitude' name='longitude' class='pseudo-widget disabled'>
 {{record.longitude}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable addresses  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable addresses %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='address'>
 address
 </label>
-{% ifwritable addresses address %}
+{% ifmemberof admin %}
 <input id='address' name='address' type='text' value='{{record.address}}'/>
 {% else %}
-{% ifreadable addresses address%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='address' name='address' class='pseudo-widget disabled'>
 {{record.address}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='postcode'>
 postcode
 </label>
-{% ifwritable addresses postcode %}
+{% ifmemberof admin %}
 <input id='postcode' name='postcode' type='text' value='{{record.postcode}}'/>
 {% else %}
-{% ifreadable addresses postcode%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='postcode' name='postcode' class='pseudo-widget disabled'>
 {{record.postcode}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='phone'>
 phone
 </label>
-{% ifwritable addresses phone %}
+{% ifmemberof admin %}
 <input id='phone' name='phone' type='text' value='{{record.phone}}'/>
 {% else %}
-{% ifreadable addresses phone%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='phone' name='phone' class='pseudo-widget disabled'>
 {{record.phone}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='district_id'>
 district_id
 </label>
-{% ifwritable addresses district_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='districts' found='true'>
 <input name='district_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='district_id' name='district_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -196,40 +196,40 @@ district_id
 </select>
 </div>
 {% else %}
-{% ifreadable addresses district_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='district_id' name='district_id' class='pseudo-widget disabled'>
 {{record.district_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='latitude'>
 latitude
 </label>
-{% ifwritable addresses latitude %}
+{% ifmemberof admin %}
 <input id='latitude' name='latitude' type='number' value='{{record.latitude}}'/>
 {% else %}
-{% ifreadable addresses latitude%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='latitude' name='latitude' class='pseudo-widget disabled'>
 {{record.latitude}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='longitude'>
 longitude
 </label>
-{% ifwritable addresses longitude %}
+{% ifmemberof admin %}
 <input id='longitude' name='longitude' type='number' value='{{record.longitude}}'/>
 {% else %}
-{% ifreadable addresses longitude%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='longitude' name='longitude' class='pseudo-widget disabled'>
 {{record.longitude}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-authorities-Authority.html b/resources/templates/auto/form-authorities-Authority.html
index 6b15dfa..1f29004 100644
--- a/resources/templates/auto/form-authorities-Authority.html
+++ b/resources/templates/auto/form-authorities-Authority.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-authorities-Authority.html generated 2018-06-15T08:47:04.329Z by adl.to-selmer-templates.
+<!-- File form-authorities-Authority.html generated 2018-06-18T10:08:09.818Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -28,43 +28,43 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable authorities id %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable authorities id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable authorities  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable authorities %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable authorities  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable authorities %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-canvassers-Canvasser.html b/resources/templates/auto/form-canvassers-Canvasser.html
index e622a82..32fe009 100644
--- a/resources/templates/auto/form-canvassers-Canvasser.html
+++ b/resources/templates/auto/form-canvassers-Canvasser.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-canvassers-Canvasser.html generated 2018-06-15T08:47:04.331Z by adl.to-selmer-templates.
+<!-- File form-canvassers-Canvasser.html generated 2018-06-18T10:08:09.823Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -29,49 +29,49 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable canvassers  %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable canvassers %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='username'>
 username
 </label>
-{% ifwritable canvassers username %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <input id='username' name='username' type='text' value='{{record.username}}'/>
 {% else %}
-{% ifreadable canvassers username%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='username' name='username' class='pseudo-widget disabled'>
 {{record.username}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='fullname'>
 fullname
 </label>
-{% ifwritable canvassers fullname %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <input id='fullname' name='fullname' type='text' value='{{record.fullname}}'/>
 {% else %}
-{% ifreadable canvassers fullname%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='fullname' name='fullname' class='pseudo-widget disabled'>
 {{record.fullname}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='elector_id'>
 elector_id
 </label>
-{% ifwritable canvassers elector_id %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <div class='select-box' farside='electors' found='true'>
 <input name='elector_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='elector_id' name='elector_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -79,18 +79,18 @@ elector_id
 </select>
 </div>
 {% else %}
-{% ifreadable canvassers elector_id%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='elector_id' name='elector_id' class='pseudo-widget disabled'>
 {{record.elector_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='address_id'>
 address_id
 </label>
-{% ifwritable canvassers address_id %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <div class='select-box' farside='addresses' found='true'>
 <input name='address_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='address_id' name='address_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -98,46 +98,46 @@ address_id
 </select>
 </div>
 {% else %}
-{% ifreadable canvassers address_id%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='address_id' name='address_id' class='pseudo-widget disabled'>
 {{record.address_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='phone'>
 phone
 </label>
-{% ifwritable canvassers phone %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <input id='phone' name='phone' type='text' value='{{record.phone}}'/>
 {% else %}
-{% ifreadable canvassers phone%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='phone' name='phone' class='pseudo-widget disabled'>
 {{record.phone}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='email'>
 email
 </label>
-{% ifwritable canvassers email %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <input id='email' name='email' type='text' value='{{record.email}}'/>
 {% else %}
-{% ifreadable canvassers email%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='email' name='email' class='pseudo-widget disabled'>
 {{record.email}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='authority_id'>
 authority_id
 </label>
-{% ifwritable canvassers authority_id %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <div class='select-box' farside='authorities' found='true'>
 <input name='authority_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='authority_id' name='authority_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -145,74 +145,74 @@ authority_id
 </select>
 </div>
 {% else %}
-{% ifreadable canvassers authority_id%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='authority_id' name='authority_id' class='pseudo-widget disabled'>
 {{record.authority_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='authorised'>
 authorised
 </label>
-{% ifwritable canvassers authorised %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <input id='authorised' name='authorised' type='checkbox' value='{{record.authorised}}'/>
 {% else %}
-{% ifreadable canvassers authorised%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='authorised' name='authorised' class='pseudo-widget disabled'>
 {{record.authorised}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable canvassers  %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable canvassers %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='username'>
 username
 </label>
-{% ifwritable canvassers username %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <input id='username' name='username' type='text' value='{{record.username}}'/>
 {% else %}
-{% ifreadable canvassers username%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='username' name='username' class='pseudo-widget disabled'>
 {{record.username}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='fullname'>
 fullname
 </label>
-{% ifwritable canvassers fullname %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <input id='fullname' name='fullname' type='text' value='{{record.fullname}}'/>
 {% else %}
-{% ifreadable canvassers fullname%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='fullname' name='fullname' class='pseudo-widget disabled'>
 {{record.fullname}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='elector_id'>
 elector_id
 </label>
-{% ifwritable canvassers elector_id %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <div class='select-box' farside='electors' found='true'>
 <input name='elector_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='elector_id' name='elector_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -220,18 +220,18 @@ elector_id
 </select>
 </div>
 {% else %}
-{% ifreadable canvassers elector_id%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='elector_id' name='elector_id' class='pseudo-widget disabled'>
 {{record.elector_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='address_id'>
 address_id
 </label>
-{% ifwritable canvassers address_id %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <div class='select-box' farside='addresses' found='true'>
 <input name='address_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='address_id' name='address_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -239,46 +239,46 @@ address_id
 </select>
 </div>
 {% else %}
-{% ifreadable canvassers address_id%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='address_id' name='address_id' class='pseudo-widget disabled'>
 {{record.address_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='phone'>
 phone
 </label>
-{% ifwritable canvassers phone %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <input id='phone' name='phone' type='text' value='{{record.phone}}'/>
 {% else %}
-{% ifreadable canvassers phone%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='phone' name='phone' class='pseudo-widget disabled'>
 {{record.phone}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='email'>
 email
 </label>
-{% ifwritable canvassers email %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <input id='email' name='email' type='text' value='{{record.email}}'/>
 {% else %}
-{% ifreadable canvassers email%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='email' name='email' class='pseudo-widget disabled'>
 {{record.email}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='authority_id'>
 authority_id
 </label>
-{% ifwritable canvassers authority_id %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <div class='select-box' farside='authorities' found='true'>
 <input name='authority_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='authority_id' name='authority_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -286,44 +286,44 @@ authority_id
 </select>
 </div>
 {% else %}
-{% ifreadable canvassers authority_id%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='authority_id' name='authority_id' class='pseudo-widget disabled'>
 {{record.authority_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='authorised'>
 authorised
 </label>
-{% ifwritable canvassers authorised %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <input id='authorised' name='authorised' type='checkbox' value='{{record.authorised}}'/>
 {% else %}
-{% ifreadable canvassers authorised%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='authorised' name='authorised' class='pseudo-widget disabled'>
 {{record.authorised}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='roles'>
 roles
 </label>
-{% ifwritable canvassers roles %}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
 <div class='select-box' farside='roles' found='true'>
 <select id='roles' name='roles' multiple='multiple'>
 {% for record in roles %}<option value='{{record.role_id}}'>{{record.name}}</option>{% endfor %}
 </select>
 </div>
 {% else %}
-{% ifreadable canvassers roles%}
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='roles' name='roles' class='pseudo-widget disabled'>
 {{record.roles}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-districts-District.html b/resources/templates/auto/form-districts-District.html
index 4e7f830..1ba76eb 100644
--- a/resources/templates/auto/form-districts-District.html
+++ b/resources/templates/auto/form-districts-District.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-districts-District.html generated 2018-06-15T08:47:04.299Z by adl.to-selmer-templates.
+<!-- File form-districts-District.html generated 2018-06-18T10:08:09.756Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -29,57 +29,57 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable districts  %}
+{% ifmemberof admin admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable districts %}
+{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='name'>
 name
 </label>
-{% ifwritable districts name %}
+{% ifmemberof admin admin %}
 <input id='name' name='name' type='text' value='{{record.name}}'/>
 {% else %}
-{% ifreadable districts name%}
+{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='name' name='name' class='pseudo-widget disabled'>
 {{record.name}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable districts  %}
+{% ifmemberof admin admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable districts %}
+{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='name'>
 name
 </label>
-{% ifwritable districts name %}
+{% ifmemberof admin admin %}
 <input id='name' name='name' type='text' value='{{record.name}}'/>
 {% else %}
-{% ifreadable districts name%}
+{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='name' name='name' class='pseudo-widget disabled'>
 {{record.name}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-dwellings-Dwelling.html b/resources/templates/auto/form-dwellings-Dwelling.html
index e5757b4..1c716e9 100644
--- a/resources/templates/auto/form-dwellings-Dwelling.html
+++ b/resources/templates/auto/form-dwellings-Dwelling.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-dwellings-Dwelling.html generated 2018-06-15T08:47:04.340Z by adl.to-selmer-templates.
+<!-- File form-dwellings-Dwelling.html generated 2018-06-18T10:08:09.847Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -29,21 +29,21 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable dwellings  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable dwellings %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='address_id'>
 address_id
 </label>
-{% ifwritable dwellings address_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='addresses' found='true'>
 <input name='address_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='address_id' name='address_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -51,46 +51,46 @@ address_id
 </select>
 </div>
 {% else %}
-{% ifreadable dwellings address_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='address_id' name='address_id' class='pseudo-widget disabled'>
 {{record.address_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='sub-address'>
 sub-address
 </label>
-{% ifwritable dwellings sub-address %}
+{% ifmemberof admin %}
 <input id='sub-address' name='sub-address' type='text' value='{{record.sub-address}}'/>
 {% else %}
-{% ifreadable dwellings sub-address%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='sub-address' name='sub-address' class='pseudo-widget disabled'>
 {{record.sub-address}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable dwellings  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable dwellings %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='address_id'>
 address_id
 </label>
-{% ifwritable dwellings address_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='addresses' found='true'>
 <input name='address_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='address_id' name='address_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -98,26 +98,26 @@ address_id
 </select>
 </div>
 {% else %}
-{% ifreadable dwellings address_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='address_id' name='address_id' class='pseudo-widget disabled'>
 {{record.address_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='sub-address'>
 sub-address
 </label>
-{% ifwritable dwellings sub-address %}
+{% ifmemberof admin %}
 <input id='sub-address' name='sub-address' type='text' value='{{record.sub-address}}'/>
 {% else %}
-{% ifreadable dwellings sub-address%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='sub-address' name='sub-address' class='pseudo-widget disabled'>
 {{record.sub-address}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-electors-Elector.html b/resources/templates/auto/form-electors-Elector.html
index 227a8a3..4b1a2a4 100644
--- a/resources/templates/auto/form-electors-Elector.html
+++ b/resources/templates/auto/form-electors-Elector.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-electors-Elector.html generated 2018-06-15T08:47:04.327Z by adl.to-selmer-templates.
+<!-- File form-electors-Elector.html generated 2018-06-18T10:08:09.808Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -29,35 +29,35 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable electors  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable electors %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='name'>
 name
 </label>
-{% ifwritable electors name %}
+{% ifmemberof admin %}
 <input id='name' name='name' type='text' value='{{record.name}}'/>
 {% else %}
-{% ifreadable electors name%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='name' name='name' class='pseudo-widget disabled'>
 {{record.name}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='dwelling_id'>
 dwelling_id
 </label>
-{% ifwritable electors dwelling_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='dwellings' found='true'>
 <input name='dwelling_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='dwelling_id' name='dwelling_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -65,92 +65,92 @@ dwelling_id
 </select>
 </div>
 {% else %}
-{% ifreadable electors dwelling_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='dwelling_id' name='dwelling_id' class='pseudo-widget disabled'>
 {{record.dwelling_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='phone'>
 phone
 </label>
-{% ifwritable electors phone %}
+{% ifmemberof admin %}
 <input id='phone' name='phone' type='text' value='{{record.phone}}'/>
 {% else %}
-{% ifreadable electors phone%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='phone' name='phone' class='pseudo-widget disabled'>
 {{record.phone}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='email'>
 email
 </label>
-{% ifwritable electors email %}
+{% ifmemberof admin %}
 <input id='email' name='email' type='text' value='{{record.email}}'/>
 {% else %}
-{% ifreadable electors email%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='email' name='email' class='pseudo-widget disabled'>
 {{record.email}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='gender'>
 gender
 </label>
-{% ifwritable electors gender %}
+{% ifmemberof admin %}
 <div class='select-box' farside='genders' found='true'>
 <select id='gender' name='gender'>
 {% for record in genders %}<option value='{{record.id}}'>{{record.id}}</option>{% endfor %}
 </select>
 </div>
 {% else %}
-{% ifreadable electors gender%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='gender' name='gender' class='pseudo-widget disabled'>
 {{record.gender}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable electors  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable electors %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='name'>
 name
 </label>
-{% ifwritable electors name %}
+{% ifmemberof admin %}
 <input id='name' name='name' type='text' value='{{record.name}}'/>
 {% else %}
-{% ifreadable electors name%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='name' name='name' class='pseudo-widget disabled'>
 {{record.name}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='dwelling_id'>
 dwelling_id
 </label>
-{% ifwritable electors dwelling_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='dwellings' found='true'>
 <input name='dwelling_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='dwelling_id' name='dwelling_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -158,58 +158,58 @@ dwelling_id
 </select>
 </div>
 {% else %}
-{% ifreadable electors dwelling_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='dwelling_id' name='dwelling_id' class='pseudo-widget disabled'>
 {{record.dwelling_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='phone'>
 phone
 </label>
-{% ifwritable electors phone %}
+{% ifmemberof admin %}
 <input id='phone' name='phone' type='text' value='{{record.phone}}'/>
 {% else %}
-{% ifreadable electors phone%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='phone' name='phone' class='pseudo-widget disabled'>
 {{record.phone}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='email'>
 email
 </label>
-{% ifwritable electors email %}
+{% ifmemberof admin %}
 <input id='email' name='email' type='text' value='{{record.email}}'/>
 {% else %}
-{% ifreadable electors email%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='email' name='email' class='pseudo-widget disabled'>
 {{record.email}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='gender'>
 gender
 </label>
-{% ifwritable electors gender %}
+{% ifmemberof admin %}
 <div class='select-box' farside='genders' found='true'>
 <select id='gender' name='gender'>
 {% for record in genders %}<option value='{{record.id}}'>{{record.id}}</option>{% endfor %}
 </select>
 </div>
 {% else %}
-{% ifreadable electors gender%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='gender' name='gender' class='pseudo-widget disabled'>
 {{record.gender}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-followupactions-Followupaction.html b/resources/templates/auto/form-followupactions-Followupaction.html
index 2e78a33..4ab1afc 100644
--- a/resources/templates/auto/form-followupactions-Followupaction.html
+++ b/resources/templates/auto/form-followupactions-Followupaction.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-followupactions-Followupaction.html generated 2018-06-15T08:47:04.342Z by adl.to-selmer-templates.
+<!-- File form-followupactions-Followupaction.html generated 2018-06-18T10:08:09.853Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -29,21 +29,21 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable followupactions  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable followupactions %}
+{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='request_id'>
 request_id
 </label>
-{% ifwritable followupactions request_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='followuprequests' found='true'>
 <input name='request_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='request_id' name='request_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -51,18 +51,18 @@ request_id
 </select>
 </div>
 {% else %}
-{% ifreadable followupactions request_id%}
+{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
 <span id='request_id' name='request_id' class='pseudo-widget disabled'>
 {{record.request_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='actor'>
 actor
 </label>
-{% ifwritable followupactions actor %}
+{% ifmemberof admin %}
 <div class='select-box' farside='canvassers' found='true'>
 <input name='actor-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='actor' name='actor' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -70,74 +70,74 @@ actor
 </select>
 </div>
 {% else %}
-{% ifreadable followupactions actor%}
+{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
 <span id='actor' name='actor' class='pseudo-widget disabled'>
 {{record.actor}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='date'>
 date
 </label>
-{% ifwritable followupactions date %}
+{% ifmemberof admin %}
 <input id='date' name='date' type='text' value='{{record.date}}'/>
 {% else %}
-{% ifreadable followupactions date%}
+{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
 <span id='date' name='date' class='pseudo-widget disabled'>
 {{record.date}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='notes'>
 notes
 </label>
-{% ifwritable followupactions notes %}
+{% ifmemberof admin %}
 <input id='notes' name='notes' type='text' value='{{record.notes}}'/>
 {% else %}
-{% ifreadable followupactions notes%}
+{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
 <span id='notes' name='notes' class='pseudo-widget disabled'>
 {{record.notes}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='closed'>
 closed
 </label>
-{% ifwritable followupactions closed %}
+{% ifmemberof admin %}
 <input id='closed' name='closed' type='checkbox' value='{{record.closed}}'/>
 {% else %}
-{% ifreadable followupactions closed%}
+{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
 <span id='closed' name='closed' class='pseudo-widget disabled'>
 {{record.closed}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable followupactions  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable followupactions %}
+{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='request_id'>
 request_id
 </label>
-{% ifwritable followupactions request_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='followuprequests' found='true'>
 <input name='request_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='request_id' name='request_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -145,18 +145,18 @@ request_id
 </select>
 </div>
 {% else %}
-{% ifreadable followupactions request_id%}
+{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
 <span id='request_id' name='request_id' class='pseudo-widget disabled'>
 {{record.request_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='actor'>
 actor
 </label>
-{% ifwritable followupactions actor %}
+{% ifmemberof admin %}
 <div class='select-box' farside='canvassers' found='true'>
 <input name='actor-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='actor' name='actor' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -164,54 +164,54 @@ actor
 </select>
 </div>
 {% else %}
-{% ifreadable followupactions actor%}
+{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
 <span id='actor' name='actor' class='pseudo-widget disabled'>
 {{record.actor}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='date'>
 date
 </label>
-{% ifwritable followupactions date %}
+{% ifmemberof admin %}
 <input id='date' name='date' type='text' value='{{record.date}}'/>
 {% else %}
-{% ifreadable followupactions date%}
+{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
 <span id='date' name='date' class='pseudo-widget disabled'>
 {{record.date}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='notes'>
 notes
 </label>
-{% ifwritable followupactions notes %}
+{% ifmemberof admin %}
 <input id='notes' name='notes' type='text' value='{{record.notes}}'/>
 {% else %}
-{% ifreadable followupactions notes%}
+{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
 <span id='notes' name='notes' class='pseudo-widget disabled'>
 {{record.notes}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='closed'>
 closed
 </label>
-{% ifwritable followupactions closed %}
+{% ifmemberof admin %}
 <input id='closed' name='closed' type='checkbox' value='{{record.closed}}'/>
 {% else %}
-{% ifreadable followupactions closed%}
+{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
 <span id='closed' name='closed' class='pseudo-widget disabled'>
 {{record.closed}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-followupmethods-Followupmethod.html b/resources/templates/auto/form-followupmethods-Followupmethod.html
index e1602b6..dd0726b 100644
--- a/resources/templates/auto/form-followupmethods-Followupmethod.html
+++ b/resources/templates/auto/form-followupmethods-Followupmethod.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-followupmethods-Followupmethod.html generated 2018-06-15T08:47:04.344Z by adl.to-selmer-templates.
+<!-- File form-followupmethods-Followupmethod.html generated 2018-06-18T10:08:09.859Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -28,43 +28,43 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable followupmethods id %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable followupmethods id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable followupmethods  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable followupmethods %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable followupmethods  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable followupmethods %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-followuprequests-Followuprequest.html b/resources/templates/auto/form-followuprequests-Followuprequest.html
index 93365b0..d925dac 100644
--- a/resources/templates/auto/form-followuprequests-Followuprequest.html
+++ b/resources/templates/auto/form-followuprequests-Followuprequest.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-followuprequests-Followuprequest.html generated 2018-06-15T08:47:04.302Z by adl.to-selmer-templates.
+<!-- File form-followuprequests-Followuprequest.html generated 2018-06-18T10:08:09.760Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -29,21 +29,21 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable followuprequests  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable followuprequests %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='elector_id'>
 elector_id
 </label>
-{% ifwritable followuprequests elector_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='electors' found='true'>
 <input name='elector_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='elector_id' name='elector_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -51,18 +51,18 @@ elector_id
 </select>
 </div>
 {% else %}
-{% ifreadable followuprequests elector_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='elector_id' name='elector_id' class='pseudo-widget disabled'>
 {{record.elector_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='visit_id'>
 visit_id
 </label>
-{% ifwritable followuprequests visit_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='visits' found='true'>
 <input name='visit_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='visit_id' name='visit_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -70,68 +70,68 @@ visit_id
 </select>
 </div>
 {% else %}
-{% ifreadable followuprequests visit_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='visit_id' name='visit_id' class='pseudo-widget disabled'>
 {{record.visit_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='issue_id'>
 issue_id
 </label>
-{% ifwritable followuprequests issue_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='issues' found='true'>
 <select id='issue_id' name='issue_id'>
 {% for record in issues %}<option value='{{record.id}}'>{{record.id}}</option>{% endfor %}
 </select>
 </div>
 {% else %}
-{% ifreadable followuprequests issue_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='issue_id' name='issue_id' class='pseudo-widget disabled'>
 {{record.issue_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='method_id'>
 method_id
 </label>
-{% ifwritable followuprequests method_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='followupmethods' found='true'>
 <select id='method_id' name='method_id'>
 {% for record in followupmethods %}<option value='{{record.id}}'>{{record.id}}</option>{% endfor %}
 </select>
 </div>
 {% else %}
-{% ifreadable followuprequests method_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='method_id' name='method_id' class='pseudo-widget disabled'>
 {{record.method_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable followuprequests  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable followuprequests %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='elector_id'>
 elector_id
 </label>
-{% ifwritable followuprequests elector_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='electors' found='true'>
 <input name='elector_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='elector_id' name='elector_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -139,18 +139,18 @@ elector_id
 </select>
 </div>
 {% else %}
-{% ifreadable followuprequests elector_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='elector_id' name='elector_id' class='pseudo-widget disabled'>
 {{record.elector_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='visit_id'>
 visit_id
 </label>
-{% ifwritable followuprequests visit_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='visits' found='true'>
 <input name='visit_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='visit_id' name='visit_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -158,48 +158,48 @@ visit_id
 </select>
 </div>
 {% else %}
-{% ifreadable followuprequests visit_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='visit_id' name='visit_id' class='pseudo-widget disabled'>
 {{record.visit_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='issue_id'>
 issue_id
 </label>
-{% ifwritable followuprequests issue_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='issues' found='true'>
 <select id='issue_id' name='issue_id'>
 {% for record in issues %}<option value='{{record.id}}'>{{record.id}}</option>{% endfor %}
 </select>
 </div>
 {% else %}
-{% ifreadable followuprequests issue_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='issue_id' name='issue_id' class='pseudo-widget disabled'>
 {{record.issue_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='method_id'>
 method_id
 </label>
-{% ifwritable followuprequests method_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='followupmethods' found='true'>
 <select id='method_id' name='method_id'>
 {% for record in followupmethods %}<option value='{{record.id}}'>{{record.id}}</option>{% endfor %}
 </select>
 </div>
 {% else %}
-{% ifreadable followuprequests method_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='method_id' name='method_id' class='pseudo-widget disabled'>
 {{record.method_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-genders-Gender.html b/resources/templates/auto/form-genders-Gender.html
index af41f8e..516b224 100644
--- a/resources/templates/auto/form-genders-Gender.html
+++ b/resources/templates/auto/form-genders-Gender.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-genders-Gender.html generated 2018-06-15T08:47:04.293Z by adl.to-selmer-templates.
+<!-- File form-genders-Gender.html generated 2018-06-18T10:08:09.742Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -28,43 +28,43 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable genders id %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable genders id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable genders  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable genders %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable genders  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable genders %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-intentions-Intention.html b/resources/templates/auto/form-intentions-Intention.html
index f67958c..3991bf2 100644
--- a/resources/templates/auto/form-intentions-Intention.html
+++ b/resources/templates/auto/form-intentions-Intention.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-intentions-Intention.html generated 2018-06-15T08:47:04.336Z by adl.to-selmer-templates.
+<!-- File form-intentions-Intention.html generated 2018-06-18T10:08:09.837Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -29,7 +29,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='visit_id'>
 visit_id
 </label>
-{% ifwritable intentions visit_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='visits' found='true'>
 <input name='visit_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='visit_id' name='visit_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -37,18 +37,18 @@ visit_id
 </select>
 </div>
 {% else %}
-{% ifreadable intentions visit_id%}
+{% ifmemberof canvassers analysts admin %}
 <span id='visit_id' name='visit_id' class='pseudo-widget disabled'>
 {{record.visit_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='elector_id'>
 elector_id
 </label>
-{% ifwritable intentions elector_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='electors' found='true'>
 <input name='elector_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='elector_id' name='elector_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -56,36 +56,36 @@ elector_id
 </select>
 </div>
 {% else %}
-{% ifreadable intentions elector_id%}
+{% ifmemberof canvassers analysts admin %}
 <span id='elector_id' name='elector_id' class='pseudo-widget disabled'>
 {{record.elector_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='option_id'>
 option_id
 </label>
-{% ifwritable intentions option_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='options' found='true'>
 <select id='option_id' name='option_id'>
 {% for record in options %}<option value='{{record.id}}'>{{record.id}}</option>{% endfor %}
 </select>
 </div>
 {% else %}
-{% ifreadable intentions option_id%}
+{% ifmemberof canvassers analysts admin %}
 <span id='option_id' name='option_id' class='pseudo-widget disabled'>
 {{record.option_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='visit_id'>
 visit_id
 </label>
-{% ifwritable intentions visit_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='visits' found='true'>
 <input name='visit_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='visit_id' name='visit_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -93,18 +93,18 @@ visit_id
 </select>
 </div>
 {% else %}
-{% ifreadable intentions visit_id%}
+{% ifmemberof canvassers analysts admin %}
 <span id='visit_id' name='visit_id' class='pseudo-widget disabled'>
 {{record.visit_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='elector_id'>
 elector_id
 </label>
-{% ifwritable intentions elector_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='electors' found='true'>
 <input name='elector_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='elector_id' name='elector_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -112,30 +112,30 @@ elector_id
 </select>
 </div>
 {% else %}
-{% ifreadable intentions elector_id%}
+{% ifmemberof canvassers analysts admin %}
 <span id='elector_id' name='elector_id' class='pseudo-widget disabled'>
 {{record.elector_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='option_id'>
 option_id
 </label>
-{% ifwritable intentions option_id %}
+{% ifmemberof admin %}
 <div class='select-box' farside='options' found='true'>
 <select id='option_id' name='option_id'>
 {% for record in options %}<option value='{{record.id}}'>{{record.id}}</option>{% endfor %}
 </select>
 </div>
 {% else %}
-{% ifreadable intentions option_id%}
+{% ifmemberof canvassers analysts admin %}
 <span id='option_id' name='option_id' class='pseudo-widget disabled'>
 {{record.option_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-issues-Issue.html b/resources/templates/auto/form-issues-Issue.html
index bd76684..e5268cc 100644
--- a/resources/templates/auto/form-issues-Issue.html
+++ b/resources/templates/auto/form-issues-Issue.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-issues-Issue.html generated 2018-06-15T08:47:04.314Z by adl.to-selmer-templates.
+<!-- File form-issues-Issue.html generated 2018-06-18T10:08:09.783Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -28,99 +28,99 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable issues id %}
+{% ifmemberof issueeditors admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable issues id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable issues  %}
+{% ifmemberof issueeditors admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable issues %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='url'>
 url
 </label>
-{% ifwritable issues url %}
+{% ifmemberof issueeditors admin %}
 <input id='url' name='url' type='text' value='{{record.url}}'/>
 {% else %}
-{% ifreadable issues url%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='url' name='url' class='pseudo-widget disabled'>
 {{record.url}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='current'>
 current
 </label>
-{% ifwritable issues current %}
+{% ifmemberof issueeditors admin %}
 <input id='current' name='current' type='checkbox' value='{{record.current}}'/>
 {% else %}
-{% ifreadable issues current%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='current' name='current' class='pseudo-widget disabled'>
 {{record.current}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable issues  %}
+{% ifmemberof issueeditors admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable issues %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='url'>
 url
 </label>
-{% ifwritable issues url %}
+{% ifmemberof issueeditors admin %}
 <input id='url' name='url' type='text' value='{{record.url}}'/>
 {% else %}
-{% ifreadable issues url%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='url' name='url' class='pseudo-widget disabled'>
 {{record.url}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='current'>
 current
 </label>
-{% ifwritable issues current %}
+{% ifmemberof issueeditors admin %}
 <input id='current' name='current' type='checkbox' value='{{record.current}}'/>
 {% else %}
-{% ifreadable issues current%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='current' name='current' class='pseudo-widget disabled'>
 {{record.current}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-options-Option.html b/resources/templates/auto/form-options-Option.html
index 6267dcb..b5c791c 100644
--- a/resources/templates/auto/form-options-Option.html
+++ b/resources/templates/auto/form-options-Option.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-options-Option.html generated 2018-06-15T08:47:04.336Z by adl.to-selmer-templates.
+<!-- File form-options-Option.html generated 2018-06-18T10:08:09.835Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -28,43 +28,43 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable options id %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable options id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable options  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable options %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable options  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable options %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-roles-Role.html b/resources/templates/auto/form-roles-Role.html
index c8d9200..dad1065 100644
--- a/resources/templates/auto/form-roles-Role.html
+++ b/resources/templates/auto/form-roles-Role.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-roles-Role.html generated 2018-06-15T08:47:04.316Z by adl.to-selmer-templates.
+<!-- File form-roles-Role.html generated 2018-06-18T10:08:09.788Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -29,63 +29,63 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable roles  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable roles %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='name'>
 name
 </label>
-{% ifwritable roles name %}
+{% ifmemberof admin %}
 <input id='name' name='name' type='text' value='{{record.name}}'/>
 {% else %}
-{% ifreadable roles name%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='name' name='name' class='pseudo-widget disabled'>
 {{record.name}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable roles  %}
+{% ifmemberof admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable roles %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='name'>
 name
 </label>
-{% ifwritable roles name %}
+{% ifmemberof admin %}
 <input id='name' name='name' type='text' value='{{record.name}}'/>
 {% else %}
-{% ifreadable roles name%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='name' name='name' class='pseudo-widget disabled'>
 {{record.name}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='members'>
 members
 </label>
-{% ifwritable roles members %}
+{% ifmemberof admin %}
 <div class='select-box' farside='canvassers' found='true'>
 <input name='members-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='members' name='members' multiple='multiple' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -93,12 +93,12 @@ members
 </select>
 </div>
 {% else %}
-{% ifreadable roles members%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='members' name='members' class='pseudo-widget disabled'>
 {{record.members}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-teams-Team.html b/resources/templates/auto/form-teams-Team.html
index 5271507..ff0da63 100644
--- a/resources/templates/auto/form-teams-Team.html
+++ b/resources/templates/auto/form-teams-Team.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-teams-Team.html generated 2018-06-15T08:47:04.323Z by adl.to-selmer-templates.
+<!-- File form-teams-Team.html generated 2018-06-18T10:08:09.801Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -29,35 +29,35 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable teams  %}
+{% ifmemberof teamorganisers admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable teams %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='name'>
 name
 </label>
-{% ifwritable teams name %}
+{% ifmemberof teamorganisers admin %}
 <input id='name' name='name' type='text' value='{{record.name}}'/>
 {% else %}
-{% ifreadable teams name%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='name' name='name' class='pseudo-widget disabled'>
 {{record.name}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='district_id'>
 district_id
 </label>
-{% ifwritable teams district_id %}
+{% ifmemberof teamorganisers admin %}
 <div class='select-box' farside='districts' found='true'>
 <input name='district_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='district_id' name='district_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -65,74 +65,74 @@ district_id
 </select>
 </div>
 {% else %}
-{% ifreadable teams district_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='district_id' name='district_id' class='pseudo-widget disabled'>
 {{record.district_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='latitude'>
 latitude
 </label>
-{% ifwritable teams latitude %}
+{% ifmemberof teamorganisers admin %}
 <input id='latitude' name='latitude' type='number' value='{{record.latitude}}'/>
 {% else %}
-{% ifreadable teams latitude%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='latitude' name='latitude' class='pseudo-widget disabled'>
 {{record.latitude}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='longitude'>
 longitude
 </label>
-{% ifwritable teams longitude %}
+{% ifmemberof teamorganisers admin %}
 <input id='longitude' name='longitude' type='number' value='{{record.longitude}}'/>
 {% else %}
-{% ifreadable teams longitude%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='longitude' name='longitude' class='pseudo-widget disabled'>
 {{record.longitude}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable teams  %}
+{% ifmemberof teamorganisers admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable teams %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='name'>
 name
 </label>
-{% ifwritable teams name %}
+{% ifmemberof teamorganisers admin %}
 <input id='name' name='name' type='text' value='{{record.name}}'/>
 {% else %}
-{% ifreadable teams name%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='name' name='name' class='pseudo-widget disabled'>
 {{record.name}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='district_id'>
 district_id
 </label>
-{% ifwritable teams district_id %}
+{% ifmemberof teamorganisers admin %}
 <div class='select-box' farside='districts' found='true'>
 <input name='district_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='district_id' name='district_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -140,32 +140,32 @@ district_id
 </select>
 </div>
 {% else %}
-{% ifreadable teams district_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='district_id' name='district_id' class='pseudo-widget disabled'>
 {{record.district_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='latitude'>
 latitude
 </label>
-{% ifwritable teams latitude %}
+{% ifmemberof teamorganisers admin %}
 <input id='latitude' name='latitude' type='number' value='{{record.latitude}}'/>
 {% else %}
-{% ifreadable teams latitude%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='latitude' name='latitude' class='pseudo-widget disabled'>
 {{record.latitude}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='members'>
 members
 </label>
-{% ifwritable teams members %}
+{% ifmemberof teamorganisers admin %}
 <div class='select-box' farside='canvassers' found='true'>
 <input name='members-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='members' name='members' multiple='multiple' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -173,18 +173,18 @@ members
 </select>
 </div>
 {% else %}
-{% ifreadable teams members%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='members' name='members' class='pseudo-widget disabled'>
 {{record.members}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='organisers'>
 organisers
 </label>
-{% ifwritable teams organisers %}
+{% ifmemberof teamorganisers admin %}
 <div class='select-box' farside='canvassers' found='true'>
 <input name='organisers-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='organisers' name='organisers' multiple='multiple' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -192,26 +192,26 @@ organisers
 </select>
 </div>
 {% else %}
-{% ifreadable teams organisers%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='organisers' name='organisers' class='pseudo-widget disabled'>
 {{record.organisers}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='longitude'>
 longitude
 </label>
-{% ifwritable teams longitude %}
+{% ifmemberof teamorganisers admin %}
 <input id='longitude' name='longitude' type='number' value='{{record.longitude}}'/>
 {% else %}
-{% ifreadable teams longitude%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='longitude' name='longitude' class='pseudo-widget disabled'>
 {{record.longitude}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/form-visits-Visit.html b/resources/templates/auto/form-visits-Visit.html
index 52484fa..0ac8647 100644
--- a/resources/templates/auto/form-visits-Visit.html
+++ b/resources/templates/auto/form-visits-Visit.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File form-visits-Visit.html generated 2018-06-15T08:47:04.319Z by adl.to-selmer-templates.
+<!-- File form-visits-Visit.html generated 2018-06-18T10:08:09.795Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -29,21 +29,21 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
 <label for='id'>
 id
 </label>
-{% ifwritable visits  %}
+{% ifmemberof admin admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable visits %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='address_id'>
 address_id
 </label>
-{% ifwritable visits address_id %}
+{% ifmemberof admin admin %}
 <div class='select-box' farside='addresses' found='true'>
 <input name='address_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='address_id' name='address_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -51,18 +51,18 @@ address_id
 </select>
 </div>
 {% else %}
-{% ifreadable visits address_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='address_id' name='address_id' class='pseudo-widget disabled'>
 {{record.address_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='canvasser_id'>
 canvasser_id
 </label>
-{% ifwritable visits canvasser_id %}
+{% ifmemberof admin admin %}
 <div class='select-box' farside='canvassers' found='true'>
 <input name='canvasser_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='canvasser_id' name='canvasser_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -70,46 +70,46 @@ canvasser_id
 </select>
 </div>
 {% else %}
-{% ifreadable visits canvasser_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='canvasser_id' name='canvasser_id' class='pseudo-widget disabled'>
 {{record.canvasser_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='date'>
 date
 </label>
-{% ifwritable visits date %}
+{% ifmemberof admin admin %}
 <input id='date' name='date' type='text' value='{{record.date}}'/>
 {% else %}
-{% ifreadable visits date%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='date' name='date' class='pseudo-widget disabled'>
 {{record.date}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='id'>
 id
 </label>
-{% ifwritable visits  %}
+{% ifmemberof admin admin %}
 <input id='id' name='id' type='text' value='{{record.id}}'/>
 {% else %}
-{% ifreadable visits %}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='id' name='id' class='pseudo-widget disabled'>
 {{record.id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='address_id'>
 address_id
 </label>
-{% ifwritable visits address_id %}
+{% ifmemberof admin admin %}
 <div class='select-box' farside='addresses' found='true'>
 <input name='address_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='address_id' name='address_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -117,18 +117,18 @@ address_id
 </select>
 </div>
 {% else %}
-{% ifreadable visits address_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='address_id' name='address_id' class='pseudo-widget disabled'>
 {{record.address_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='canvasser_id'>
 canvasser_id
 </label>
-{% ifwritable visits canvasser_id %}
+{% ifmemberof admin admin %}
 <div class='select-box' farside='canvassers' found='true'>
 <input name='canvasser_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
 <select id='canvasser_id' name='canvasser_id' comment='JavaScript stuff to fix up aynchronous loading'>
@@ -136,26 +136,26 @@ canvasser_id
 </select>
 </div>
 {% else %}
-{% ifreadable visits canvasser_id%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='canvasser_id' name='canvasser_id' class='pseudo-widget disabled'>
 {{record.canvasser_id}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget'>
 <label for='date'>
 date
 </label>
-{% ifwritable visits date %}
+{% ifmemberof admin admin %}
 <input id='date' name='date' type='text' value='{{record.date}}'/>
 {% else %}
-{% ifreadable visits date%}
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
 <span id='date' name='date' class='pseudo-widget disabled'>
 {{record.date}}
 </span>
-{% endifreadable %}
-{% endifwritable %}
+{% endifmemberof %}
+{% endifmemberof %}
 </p>
 <p class='widget action-safe'>
 <label for='save-button' class='action-safe'>
diff --git a/resources/templates/auto/list-addresses-Addresses.html b/resources/templates/auto/list-addresses-Addresses.html
index d0530f6..b7cf928 100644
--- a/resources/templates/auto/list-addresses-Addresses.html
+++ b/resources/templates/auto/list-addresses-Addresses.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-addresses-Addresses.html generated 2018-06-15T08:47:04.330Z by adl.to-selmer-templates.
+<!-- File list-addresses-Addresses.html generated 2018-06-18T10:08:09.820Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -66,7 +66,7 @@ longitude
 <input id='phone' type='text' name='phone' value='{{ params.phone }}'/>
 </th>
 <th>
-<input id='district_id' type='text' name='district_id' value='{{ params.district_id }}'/>
+<input id='district_id_expanded' type='text' name='district_id_expanded' value='{{ params.district_id_expanded }}'/>
 </th>
 <th>
 <input id='latitude' type='number' name='latitude' value='{{ params.latitude }}'/>
@@ -95,7 +95,9 @@ longitude
 {{ record.phone }}
 </td>
 <td>
-{{ record.district_id }}
+<a href='form-districts-District?id={{ record.district_id }}'>
+{{ record.district_id_expanded }}
+</a>
 </td>
 <td>
 {{ record.latitude }}
@@ -104,7 +106,7 @@ longitude
 {{ record.longitude }}
 </td>
 <td>
-<a href='form-addresses-Address?id={{ record.id}}'>
+<a href='form-addresses-Address?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-authorities-Authorities.html b/resources/templates/auto/list-authorities-Authorities.html
index 6cdb8b6..05c6158 100644
--- a/resources/templates/auto/list-authorities-Authorities.html
+++ b/resources/templates/auto/list-authorities-Authorities.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-authorities-Authorities.html generated 2018-06-15T08:47:04.301Z by adl.to-selmer-templates.
+<!-- File list-authorities-Authorities.html generated 2018-06-18T10:08:09.758Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -50,7 +50,7 @@ id
 {{ record.id }}
 </td>
 <td>
-<a href='form-authorities-Authority?id={{ record.id}}'>
+<a href='form-authorities-Authority?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-canvassers-Canvassers.html b/resources/templates/auto/list-canvassers-Canvassers.html
index e016a0f..1c18f20 100644
--- a/resources/templates/auto/list-canvassers-Canvassers.html
+++ b/resources/templates/auto/list-canvassers-Canvassers.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-canvassers-Canvassers.html generated 2018-06-15T08:47:04.339Z by adl.to-selmer-templates.
+<!-- File list-canvassers-Canvassers.html generated 2018-06-18T10:08:09.844Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -69,10 +69,10 @@ authorised
 <input id='fullname' type='text' name='fullname' value='{{ params.fullname }}'/>
 </th>
 <th>
-<input id='elector_id' type='text' name='elector_id' value='{{ params.elector_id }}'/>
+<input id='elector_id_expanded' type='text' name='elector_id_expanded' value='{{ params.elector_id_expanded }}'/>
 </th>
 <th>
-<input id='address_id' type='text' name='address_id' value='{{ params.address_id }}'/>
+<input id='address_id_expanded' type='text' name='address_id_expanded' value='{{ params.address_id_expanded }}'/>
 </th>
 <th>
 <input id='phone' type='text' name='phone' value='{{ params.phone }}'/>
@@ -81,7 +81,7 @@ authorised
 <input id='email' type='text' name='email' value='{{ params.email }}'/>
 </th>
 <th>
-<input id='authority_id' type='text' name='authority_id' value='{{ params.authority_id }}'/>
+<input id='authority_id_expanded' type='text' name='authority_id_expanded' value='{{ params.authority_id_expanded }}'/>
 </th>
 <th>
 <input id='authorised' type='text' name='authorised' value='{{ params.authorised }}'/>
@@ -104,10 +104,14 @@ authorised
 {{ record.fullname }}
 </td>
 <td>
-{{ record.elector_id }}
+<a href='form-electors-Elector?id={{ record.elector_id }}'>
+{{ record.elector_id_expanded }}
+</a>
 </td>
 <td>
-{{ record.address_id }}
+<a href='form-addresses-Address?id={{ record.address_id }}'>
+{{ record.address_id_expanded }}
+</a>
 </td>
 <td>
 {{ record.phone }}
@@ -116,13 +120,15 @@ authorised
 {{ record.email }}
 </td>
 <td>
-{{ record.authority_id }}
+<a href='form-authorities-Authority?id={{ record.authority_id }}'>
+{{ record.authority_id_expanded }}
+</a>
 </td>
 <td>
 {{ record.authorised }}
 </td>
 <td>
-<a href='form-canvassers-Canvasser?id={{ record.id}}'>
+<a href='form-canvassers-Canvasser?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-districts-Districts.html b/resources/templates/auto/list-districts-Districts.html
index 46ab6e3..834ad46 100644
--- a/resources/templates/auto/list-districts-Districts.html
+++ b/resources/templates/auto/list-districts-Districts.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-districts-Districts.html generated 2018-06-15T08:47:04.334Z by adl.to-selmer-templates.
+<!-- File list-districts-Districts.html generated 2018-06-18T10:08:09.831Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -59,7 +59,7 @@ name
 {{ record.name }}
 </td>
 <td>
-<a href='form-districts-District?id={{ record.id}}'>
+<a href='form-districts-District?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-dwellings-Dwellings.html b/resources/templates/auto/list-dwellings-Dwellings.html
index 5774c07..40943b9 100644
--- a/resources/templates/auto/list-dwellings-Dwellings.html
+++ b/resources/templates/auto/list-dwellings-Dwellings.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-dwellings-Dwellings.html generated 2018-06-15T08:47:04.329Z by adl.to-selmer-templates.
+<!-- File list-dwellings-Dwellings.html generated 2018-06-18T10:08:09.815Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -45,7 +45,7 @@ sub-address
 <input id='id' type='text' name='id' value='{{ params.id }}'/>
 </th>
 <th>
-<input id='address_id' type='text' name='address_id' value='{{ params.address_id }}'/>
+<input id='address_id_expanded' type='text' name='address_id_expanded' value='{{ params.address_id_expanded }}'/>
 </th>
 <th>
 <input id='sub-address' type='text' name='sub-address' value='{{ params.sub-address }}'/>
@@ -62,13 +62,15 @@ sub-address
 {{ record.id }}
 </td>
 <td>
-{{ record.address_id }}
+<a href='form-addresses-Address?id={{ record.address_id }}'>
+{{ record.address_id_expanded }}
+</a>
 </td>
 <td>
 {{ record.sub-address }}
 </td>
 <td>
-<a href='form-dwellings-Dwelling?id={{ record.id}}'>
+<a href='form-dwellings-Dwelling?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-electors-Electors.html b/resources/templates/auto/list-electors-Electors.html
index b2c1885..e83a31a 100644
--- a/resources/templates/auto/list-electors-Electors.html
+++ b/resources/templates/auto/list-electors-Electors.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-electors-Electors.html generated 2018-06-15T08:47:04.313Z by adl.to-selmer-templates.
+<!-- File list-electors-Electors.html generated 2018-06-18T10:08:09.780Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -57,7 +57,7 @@ gender
 <input id='name' type='text' name='name' value='{{ params.name }}'/>
 </th>
 <th>
-<input id='dwelling_id' type='text' name='dwelling_id' value='{{ params.dwelling_id }}'/>
+<input id='dwelling_id_expanded' type='text' name='dwelling_id_expanded' value='{{ params.dwelling_id_expanded }}'/>
 </th>
 <th>
 <input id='phone' type='text' name='phone' value='{{ params.phone }}'/>
@@ -66,7 +66,7 @@ gender
 <input id='email' type='text' name='email' value='{{ params.email }}'/>
 </th>
 <th>
-<input id='gender' type='text' name='gender' value='{{ params.gender }}'/>
+<input id='gender_expanded' type='text' name='gender_expanded' value='{{ params.gender_expanded }}'/>
 </th>
 <th>
 <input type='submit' id='search' value='Search'/>
@@ -83,7 +83,9 @@ gender
 {{ record.name }}
 </td>
 <td>
-{{ record.dwelling_id }}
+<a href='form-dwellings-Dwelling?id={{ record.dwelling_id }}'>
+{{ record.dwelling_id_expanded }}
+</a>
 </td>
 <td>
 {{ record.phone }}
@@ -92,10 +94,12 @@ gender
 {{ record.email }}
 </td>
 <td>
-{{ record.gender }}
+<a href='form-genders-Gender?id={{ record.gender }}'>
+{{ record.gender_expanded }}
+</a>
 </td>
 <td>
-<a href='form-electors-Elector?id={{ record.id}}'>
+<a href='form-electors-Elector?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-followupactions-Followupactions.html b/resources/templates/auto/list-followupactions-Followupactions.html
index fdc153e..af574bb 100644
--- a/resources/templates/auto/list-followupactions-Followupactions.html
+++ b/resources/templates/auto/list-followupactions-Followupactions.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-followupactions-Followupactions.html generated 2018-06-15T08:47:04.338Z by adl.to-selmer-templates.
+<!-- File list-followupactions-Followupactions.html generated 2018-06-18T10:08:09.842Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -54,10 +54,10 @@ closed
 <input id='id' type='text' name='id' value='{{ params.id }}'/>
 </th>
 <th>
-<input id='request_id' type='text' name='request_id' value='{{ params.request_id }}'/>
+<input id='request_id_expanded' type='text' name='request_id_expanded' value='{{ params.request_id_expanded }}'/>
 </th>
 <th>
-<input id='actor' type='text' name='actor' value='{{ params.actor }}'/>
+<input id='actor_expanded' type='text' name='actor_expanded' value='{{ params.actor_expanded }}'/>
 </th>
 <th>
 <input id='date' type='date' name='date' value='{{ params.date }}'/>
@@ -80,10 +80,14 @@ closed
 {{ record.id }}
 </td>
 <td>
-{{ record.request_id }}
+<a href='form-followuprequests-Followuprequest?id={{ record.request_id }}'>
+{{ record.request_id_expanded }}
+</a>
 </td>
 <td>
-{{ record.actor }}
+<a href='form-canvassers-Canvasser?id={{ record.actor }}'>
+{{ record.actor_expanded }}
+</a>
 </td>
 <td>
 {{ record.date }}
@@ -95,7 +99,7 @@ closed
 {{ record.closed }}
 </td>
 <td>
-<a href='form-followupactions-Followupaction?id={{ record.id}}'>
+<a href='form-followupactions-Followupaction?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-followupmethods-Followupmethods.html b/resources/templates/auto/list-followupmethods-Followupmethods.html
index 73711fa..7667db0 100644
--- a/resources/templates/auto/list-followupmethods-Followupmethods.html
+++ b/resources/templates/auto/list-followupmethods-Followupmethods.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-followupmethods-Followupmethods.html generated 2018-06-15T08:47:04.318Z by adl.to-selmer-templates.
+<!-- File list-followupmethods-Followupmethods.html generated 2018-06-18T10:08:09.793Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -50,7 +50,7 @@ id
 {{ record.id }}
 </td>
 <td>
-<a href='form-followupmethods-Followupmethod?id={{ record.id}}'>
+<a href='form-followupmethods-Followupmethod?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-followuprequests-Followuprequests.html b/resources/templates/auto/list-followuprequests-Followuprequests.html
index 74af183..79c4229 100644
--- a/resources/templates/auto/list-followuprequests-Followuprequests.html
+++ b/resources/templates/auto/list-followuprequests-Followuprequests.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-followuprequests-Followuprequests.html generated 2018-06-15T08:47:04.296Z by adl.to-selmer-templates.
+<!-- File list-followuprequests-Followuprequests.html generated 2018-06-18T10:08:09.751Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -51,16 +51,16 @@ method_id
 <input id='id' type='text' name='id' value='{{ params.id }}'/>
 </th>
 <th>
-<input id='elector_id' type='text' name='elector_id' value='{{ params.elector_id }}'/>
+<input id='elector_id_expanded' type='text' name='elector_id_expanded' value='{{ params.elector_id_expanded }}'/>
 </th>
 <th>
-<input id='visit_id' type='text' name='visit_id' value='{{ params.visit_id }}'/>
+<input id='visit_id_expanded' type='text' name='visit_id_expanded' value='{{ params.visit_id_expanded }}'/>
 </th>
 <th>
-<input id='issue_id' type='text' name='issue_id' value='{{ params.issue_id }}'/>
+<input id='issue_id_expanded' type='text' name='issue_id_expanded' value='{{ params.issue_id_expanded }}'/>
 </th>
 <th>
-<input id='method_id' type='text' name='method_id' value='{{ params.method_id }}'/>
+<input id='method_id_expanded' type='text' name='method_id_expanded' value='{{ params.method_id_expanded }}'/>
 </th>
 <th>
 <input type='submit' id='search' value='Search'/>
@@ -74,19 +74,27 @@ method_id
 {{ record.id }}
 </td>
 <td>
-{{ record.elector_id }}
+<a href='form-electors-Elector?id={{ record.elector_id }}'>
+{{ record.elector_id_expanded }}
+</a>
 </td>
 <td>
-{{ record.visit_id }}
+<a href='form-visits-Visit?id={{ record.visit_id }}'>
+{{ record.visit_id_expanded }}
+</a>
 </td>
 <td>
-{{ record.issue_id }}
+<a href='form-issues-Issue?id={{ record.issue_id }}'>
+{{ record.issue_id_expanded }}
+</a>
 </td>
 <td>
-{{ record.method_id }}
+<a href='form-followupmethods-Followupmethod?id={{ record.method_id }}'>
+{{ record.method_id_expanded }}
+</a>
 </td>
 <td>
-<a href='form-followuprequests-Followuprequest?id={{ record.id}}'>
+<a href='form-followuprequests-Followuprequest?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-genders-Genders.html b/resources/templates/auto/list-genders-Genders.html
index 0aa4a3d..8e5ca41 100644
--- a/resources/templates/auto/list-genders-Genders.html
+++ b/resources/templates/auto/list-genders-Genders.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-genders-Genders.html generated 2018-06-15T08:47:04.288Z by adl.to-selmer-templates.
+<!-- File list-genders-Genders.html generated 2018-06-18T10:08:09.734Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -50,7 +50,7 @@ id
 {{ record.id }}
 </td>
 <td>
-<a href='form-genders-Gender?id={{ record.id}}'>
+<a href='form-genders-Gender?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-intentions-Intentions.html b/resources/templates/auto/list-intentions-Intentions.html
index 47b3d73..37ef15e 100644
--- a/resources/templates/auto/list-intentions-Intentions.html
+++ b/resources/templates/auto/list-intentions-Intentions.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-intentions-Intentions.html generated 2018-06-15T08:47:04.341Z by adl.to-selmer-templates.
+<!-- File list-intentions-Intentions.html generated 2018-06-18T10:08:09.851Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -42,13 +42,13 @@ option_id
 </tr>
 <tr>
 <th>
-<input id='visit_id' type='text' name='visit_id' value='{{ params.visit_id }}'/>
+<input id='visit_id_expanded' type='text' name='visit_id_expanded' value='{{ params.visit_id_expanded }}'/>
 </th>
 <th>
-<input id='elector_id' type='text' name='elector_id' value='{{ params.elector_id }}'/>
+<input id='elector_id_expanded' type='text' name='elector_id_expanded' value='{{ params.elector_id_expanded }}'/>
 </th>
 <th>
-<input id='option_id' type='text' name='option_id' value='{{ params.option_id }}'/>
+<input id='option_id_expanded' type='text' name='option_id_expanded' value='{{ params.option_id_expanded }}'/>
 </th>
 <th>
 <input type='submit' id='search' value='Search'/>
@@ -59,16 +59,22 @@ option_id
 {% for record in records %}
 <tr>
 <td>
-{{ record.visit_id }}
+<a href='form-visits-Visit?id={{ record.visit_id }}'>
+{{ record.visit_id_expanded }}
+</a>
 </td>
 <td>
-{{ record.elector_id }}
+<a href='form-electors-Elector?id={{ record.elector_id }}'>
+{{ record.elector_id_expanded }}
+</a>
 </td>
 <td>
-{{ record.option_id }}
+<a href='form-options-Option?id={{ record.option_id }}'>
+{{ record.option_id_expanded }}
+</a>
 </td>
 <td>
-<a href='form-intentions-Intention?Id={{ record.Id}}'>
+<a href='form-intentions-Intention?Id={{ record.Id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-issues-Issues.html b/resources/templates/auto/list-issues-Issues.html
index 3365a93..658c994 100644
--- a/resources/templates/auto/list-issues-Issues.html
+++ b/resources/templates/auto/list-issues-Issues.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-issues-Issues.html generated 2018-06-15T08:47:04.335Z by adl.to-selmer-templates.
+<!-- File list-issues-Issues.html generated 2018-06-18T10:08:09.833Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -68,7 +68,7 @@ current
 {{ record.current }}
 </td>
 <td>
-<a href='form-issues-Issue?id={{ record.id}}'>
+<a href='form-issues-Issue?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-options-Options.html b/resources/templates/auto/list-options-Options.html
index aec7f02..614a531 100644
--- a/resources/templates/auto/list-options-Options.html
+++ b/resources/templates/auto/list-options-Options.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-options-Options.html generated 2018-06-15T08:47:04.298Z by adl.to-selmer-templates.
+<!-- File list-options-Options.html generated 2018-06-18T10:08:09.753Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -50,7 +50,7 @@ id
 {{ record.id }}
 </td>
 <td>
-<a href='form-options-Option?id={{ record.id}}'>
+<a href='form-options-Option?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-roles-Roles.html b/resources/templates/auto/list-roles-Roles.html
index 4728ce5..8578115 100644
--- a/resources/templates/auto/list-roles-Roles.html
+++ b/resources/templates/auto/list-roles-Roles.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-roles-Roles.html generated 2018-06-15T08:47:04.318Z by adl.to-selmer-templates.
+<!-- File list-roles-Roles.html generated 2018-06-18T10:08:09.791Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -59,7 +59,7 @@ name
 {{ record.name }}
 </td>
 <td>
-<a href='form-roles-Role?id={{ record.id}}'>
+<a href='form-roles-Role?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-teams-Teams.html b/resources/templates/auto/list-teams-Teams.html
index 23a5b33..c7a2a3b 100644
--- a/resources/templates/auto/list-teams-Teams.html
+++ b/resources/templates/auto/list-teams-Teams.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-teams-Teams.html generated 2018-06-15T08:47:04.292Z by adl.to-selmer-templates.
+<!-- File list-teams-Teams.html generated 2018-06-18T10:08:09.740Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -54,7 +54,7 @@ longitude
 <input id='name' type='text' name='name' value='{{ params.name }}'/>
 </th>
 <th>
-<input id='district_id' type='text' name='district_id' value='{{ params.district_id }}'/>
+<input id='district_id_expanded' type='text' name='district_id_expanded' value='{{ params.district_id_expanded }}'/>
 </th>
 <th>
 <input id='latitude' type='number' name='latitude' value='{{ params.latitude }}'/>
@@ -77,7 +77,9 @@ longitude
 {{ record.name }}
 </td>
 <td>
-{{ record.district_id }}
+<a href='form-districts-District?id={{ record.district_id }}'>
+{{ record.district_id_expanded }}
+</a>
 </td>
 <td>
 {{ record.latitude }}
@@ -86,7 +88,7 @@ longitude
 {{ record.longitude }}
 </td>
 <td>
-<a href='form-teams-Team?id={{ record.id}}'>
+<a href='form-teams-Team?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/resources/templates/auto/list-visits-Visits.html b/resources/templates/auto/list-visits-Visits.html
index af8b307..6b26d8a 100644
--- a/resources/templates/auto/list-visits-Visits.html
+++ b/resources/templates/auto/list-visits-Visits.html
@@ -1,5 +1,5 @@
 {% extends "base.html" %}
-<!-- File list-visits-Visits.html generated 2018-06-15T08:47:04.290Z by adl.to-selmer-templates.
+<!-- File list-visits-Visits.html generated 2018-06-18T10:08:09.738Z by adl.to-selmer-templates.
 See [Application Description Language](https://github.com/simon-brooke/adl).-->
 {% block head %}
 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@@ -48,10 +48,10 @@ date
 <input id='id' type='text' name='id' value='{{ params.id }}'/>
 </th>
 <th>
-<input id='address_id' type='text' name='address_id' value='{{ params.address_id }}'/>
+<input id='address_id_expanded' type='text' name='address_id_expanded' value='{{ params.address_id_expanded }}'/>
 </th>
 <th>
-<input id='canvasser_id' type='text' name='canvasser_id' value='{{ params.canvasser_id }}'/>
+<input id='canvasser_id_expanded' type='text' name='canvasser_id_expanded' value='{{ params.canvasser_id_expanded }}'/>
 </th>
 <th>
 <input id='date' type='date' name='date' value='{{ params.date }}'/>
@@ -68,16 +68,20 @@ date
 {{ record.id }}
 </td>
 <td>
-{{ record.address_id }}
+<a href='form-addresses-Address?id={{ record.address_id }}'>
+{{ record.address_id_expanded }}
+</a>
 </td>
 <td>
-{{ record.canvasser_id }}
+<a href='form-canvassers-Canvasser?id={{ record.canvasser_id }}'>
+{{ record.canvasser_id_expanded }}
+</a>
 </td>
 <td>
 {{ record.date }}
 </td>
 <td>
-<a href='form-visits-Visit?id={{ record.id}}'>
+<a href='form-visits-Visit?id={{ record.id }}'>
 View
 </a>
 </td>
diff --git a/src/clj/youyesyet/layout.clj b/src/clj/youyesyet/layout.clj
index d131cb7..b38365d 100644
--- a/src/clj/youyesyet/layout.clj
+++ b/src/clj/youyesyet/layout.clj
@@ -1,44 +1,67 @@
-(ns^{:doc "Render web pages using Selmer tamplating markup."
-      :author "Simon Brooke"}
-   youyesyet.layout
-  (:require [selmer.parser :as parser]
-            [selmer.filters :as filters]
-            [markdown.core :refer [md-to-html-string]]
-            [ring.util.http-response :refer [content-type ok]]
-            [ring.util.anti-forgery :refer [anti-forgery-field]]
-            [ring.middleware.anti-forgery :refer [*anti-forgery-token*]]))
+  (ns^{:doc "Render web pages using Selmer templating markup."
+        :author "Simon Brooke"}
+     youyesyet.layout
+    (:require [selmer.parser :as parser]
+              [selmer.filters :as filters]
+              [markdown.core :refer [md-to-html-string]]
+              [noir.session :as session]
+              [ring.util.http-response :refer [content-type ok]]
+              [ring.util.anti-forgery :refer [anti-forgery-field]]
+              [ring.middleware.anti-forgery :refer [*anti-forgery-token*]]))
 
 
-(declare ^:dynamic *app-context*)
-(parser/set-resource-path!  (clojure.java.io/resource "templates"))
-(parser/add-tag! :csrf-field (fn [_ _] (anti-forgery-field)))
-(filters/add-filter! :markdown (fn [content] [:safe (md-to-html-string content)]))
+
+  (declare ^:dynamic *app-context*)
+  (parser/set-resource-path!  (clojure.java.io/resource "templates"))
+  (parser/add-tag! :csrf-field (fn [_ _] (anti-forgery-field)))
+  (filters/add-filter! :markdown (fn [content] [:safe (md-to-html-string content)]))
 
 
-(defn render
-  "renders the HTML template located relative to resources/templates"
-  [template & [params]]
-  (content-type
-    (ok
-      (parser/render-file
-        template
-        (assoc params
-          :page template
-          :csrf-token *anti-forgery-token*
-          :servlet-context *app-context*
-          :version (System/getProperty "youyesyet.version"))))
-    "text/html; charset=utf-8"))
+  (parser/add-tag! :ifmemberof
+                   (fn [args context content]
+                     (let [permitted (if args (some (:user-groups context) args) false)]
+                       (if permitted
+                       (get-in content [:ifreadable :content]))))
+                   :else
+                   (fn [args context content]
+                     (let [permitted (if args (some (:user-groups context) args) false)]
+                       (if (not permitted)
+                       (get-in content [:else :content]))))
+                   :ifmemberof)
 
 
-(defn error-page
-  "error-details should be a map containing the following keys:
-   :status - error status
-   :title - error title (optional)
-   :message - detailed error message (optional)
+  (defn raw-get-user-roles [_]
+    #{"admin" "canvassers"})
 
-   returns a response map with the error page as the body
-   and the status specified by the status key"
-  [error-details]
-  {:status  (:status error-details)
-   :headers {"Content-Type" "text/html; charset=utf-8"}
-   :body    (parser/render-file "error.html" error-details)})
+  (def get-user-roles (memoize raw-get-user-roles))
+
+
+  (defn render
+    "renders the HTML template located relative to resources/templates"
+    [template & [params]]
+    (let [user (try session/get :user)]
+      (content-type
+       (ok
+        (parser/render-file
+         template
+         (assoc params
+           :page template
+           :csrf-token *anti-forgery-token*
+           :user user
+           :user-roles [get-user-roles user]
+           :version (System/getProperty "youyesyet.version"))))
+       "text/html; charset=utf-8")))
+
+
+  (defn error-page
+    "error-details should be a map containing the following keys:
+     :status - error status
+     :title - error title (optional)
+     :message - detailed error message (optional)
+
+     returns a response map with the error page as the body
+     and the status specified by the status key"
+    [error-details]
+    {:status  (:status error-details)
+     :headers {"Content-Type" "text/html; charset=utf-8"}
+     :body    (parser/render-file "error.html" error-details)})
diff --git a/src/clj/youyesyet/routes/auto.clj b/src/clj/youyesyet/routes/auto.clj
index a26a13c..ade6436 100644
--- a/src/clj/youyesyet/routes/auto.clj
+++ b/src/clj/youyesyet/routes/auto.clj
@@ -1,6 +1,6 @@
 (ns
  youyesyet.routes.auto
- "User interface routes for Youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180615T084444.957Z"
+ "User interface routes for Youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180617T110557.025Z"
  (:require
   [clojure.java.io :as io]
   [compojure.core :refer [defroutes GET POST]]
@@ -33,7 +33,7 @@
  list-electors-Electors
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-electors-Electors.html")
    {:title "Electors",
@@ -48,16 +48,22 @@
  form-electors-Elector
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-electors-Elector.html")
-   {:title "Elector", :params p, :record (db/get-elector p)})))
+   {:title "Elector",
+    :params p,
+    :record
+    (if
+     (empty? (remove nil? (vals p)))
+     []
+     (db/get-elector db/*db* p))})))
 
 (defn
  list-genders-Genders
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-genders-Genders.html")
    {:title "Genders",
@@ -72,16 +78,22 @@
  form-genders-Gender
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-genders-Gender.html")
-   {:title "Gender", :params p, :record (db/get-gender p)})))
+   {:title "Gender",
+    :params p,
+    :record
+    (if
+     (empty? (remove nil? (vals p)))
+     []
+     (db/get-gender db/*db* p))})))
 
 (defn
  list-dwellings-Dwellings
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-dwellings-Dwellings.html")
    {:title "Dwellings",
@@ -96,16 +108,22 @@
  form-dwellings-Dwelling
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-dwellings-Dwelling.html")
-   {:title "Dwelling", :params p, :record (db/get-dwelling p)})))
+   {:title "Dwelling",
+    :params p,
+    :record
+    (if
+     (empty? (remove nil? (vals p)))
+     []
+     (db/get-dwelling db/*db* p))})))
 
 (defn
  list-addresses-Addresses
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-addresses-Addresses.html")
    {:title "Addresses",
@@ -120,16 +138,22 @@
  form-addresses-Address
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-addresses-Address.html")
-   {:title "Address", :params p, :record (db/get-address p)})))
+   {:title "Address",
+    :params p,
+    :record
+    (if
+     (empty? (remove nil? (vals p)))
+     []
+     (db/get-address db/*db* p))})))
 
 (defn
  list-visits-Visits
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-visits-Visits.html")
    {:title "Visits",
@@ -144,16 +168,19 @@
  form-visits-Visit
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-visits-Visit.html")
-   {:title "Visit", :params p, :record (db/get-visit p)})))
+   {:title "Visit",
+    :params p,
+    :record
+    (if (empty? (remove nil? (vals p))) [] (db/get-visit db/*db* p))})))
 
 (defn
  list-authorities-Authorities
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-authorities-Authorities.html")
    {:title "Authorities",
@@ -168,16 +195,22 @@
  form-authorities-Authority
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-authorities-Authority.html")
-   {:title "Authority", :params p, :record (db/get-authority p)})))
+   {:title "Authority",
+    :params p,
+    :record
+    (if
+     (empty? (remove nil? (vals p)))
+     []
+     (db/get-authority db/*db* p))})))
 
 (defn
  list-issues-Issues
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-issues-Issues.html")
    {:title "Issues",
@@ -192,16 +225,19 @@
  form-issues-Issue
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-issues-Issue.html")
-   {:title "Issue", :params p, :record (db/get-issue p)})))
+   {:title "Issue",
+    :params p,
+    :record
+    (if (empty? (remove nil? (vals p))) [] (db/get-issue db/*db* p))})))
 
 (defn
  list-intentions-Intentions
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-intentions-Intentions.html")
    {:title "Intentions",
@@ -216,16 +252,22 @@
  form-intentions-Intention
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-intentions-Intention.html")
-   {:title "Intention", :params p, :record (db/get-intention p)})))
+   {:title "Intention",
+    :params p,
+    :record
+    (if
+     (empty? (remove nil? (vals p)))
+     []
+     (db/get-intention db/*db* p))})))
 
 (defn
  list-canvassers-Canvassers
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-canvassers-Canvassers.html")
    {:title "Canvassers",
@@ -240,16 +282,22 @@
  form-canvassers-Canvasser
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-canvassers-Canvasser.html")
-   {:title "Canvasser", :params p, :record (db/get-canvasser p)})))
+   {:title "Canvasser",
+    :params p,
+    :record
+    (if
+     (empty? (remove nil? (vals p)))
+     []
+     (db/get-canvasser db/*db* p))})))
 
 (defn
  list-followuprequests-Followuprequests
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-followuprequests-Followuprequests.html")
    {:title "Followuprequests",
@@ -264,18 +312,22 @@
  form-followuprequests-Followuprequest
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-followuprequests-Followuprequest.html")
    {:title "Followuprequest",
     :params p,
-    :record (db/get-followuprequest p)})))
+    :record
+    (if
+     (empty? (remove nil? (vals p)))
+     []
+     (db/get-followuprequest db/*db* p))})))
 
 (defn
  list-roles-Roles
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-roles-Roles.html")
    {:title "Roles",
@@ -290,16 +342,19 @@
  form-roles-Role
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-roles-Role.html")
-   {:title "Role", :params p, :record (db/get-role p)})))
+   {:title "Role",
+    :params p,
+    :record
+    (if (empty? (remove nil? (vals p))) [] (db/get-role db/*db* p))})))
 
 (defn
  list-teams-Teams
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-teams-Teams.html")
    {:title "Teams",
@@ -314,16 +369,19 @@
  form-teams-Team
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-teams-Team.html")
-   {:title "Team", :params p, :record (db/get-team p)})))
+   {:title "Team",
+    :params p,
+    :record
+    (if (empty? (remove nil? (vals p))) [] (db/get-team db/*db* p))})))
 
 (defn
  list-districts-Districts
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-districts-Districts.html")
    {:title "Districts",
@@ -338,16 +396,22 @@
  form-districts-District
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-districts-District.html")
-   {:title "District", :params p, :record (db/get-district p)})))
+   {:title "District",
+    :params p,
+    :record
+    (if
+     (empty? (remove nil? (vals p)))
+     []
+     (db/get-district db/*db* p))})))
 
 (defn
  list-followupactions-Followupactions
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-followupactions-Followupactions.html")
    {:title "Followupactions",
@@ -362,18 +426,22 @@
  form-followupactions-Followupaction
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-followupactions-Followupaction.html")
    {:title "Followupaction",
     :params p,
-    :record (db/get-followupaction p)})))
+    :record
+    (if
+     (empty? (remove nil? (vals p)))
+     []
+     (db/get-followupaction db/*db* p))})))
 
 (defn
  list-options-Options
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-options-Options.html")
    {:title "Options",
@@ -388,16 +456,22 @@
  form-options-Option
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-options-Option.html")
-   {:title "Option", :params p, :record (db/get-option p)})))
+   {:title "Option",
+    :params p,
+    :record
+    (if
+     (empty? (remove nil? (vals p)))
+     []
+     (db/get-option db/*db* p))})))
 
 (defn
  list-followupmethods-Followupmethods
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "list-followupmethods-Followupmethods.html")
    {:title "Followupmethods",
@@ -412,12 +486,16 @@
  form-followupmethods-Followupmethod
  [r]
  (let
-  [p (:form-params r)]
+  [p (:params r)]
   (l/render
    (resolve-template "form-followupmethods-Followupmethod.html")
    {:title "Followupmethod",
     :params p,
-    :record (db/get-followupmethod p)})))
+    :record
+    (if
+     (empty? (remove nil? (vals p)))
+     []
+     (db/get-followupmethod db/*db* p))})))
 
 (defn
  raw-resolve-handler
diff --git a/src/clj/youyesyet/routes/auto_json.clj b/src/clj/youyesyet/routes/auto_json.clj
index 91f8d08..b95d993 100644
--- a/src/clj/youyesyet/routes/auto_json.clj
+++ b/src/clj/youyesyet/routes/auto_json.clj
@@ -1,6 +1,6 @@
 (ns
  youyesyet.routes.auto-json
- "JSON routes for youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180615T084443.981Z"
+ "JSON routes for youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180617T110553.546Z"
  (:require
   [clojure.java.io :as io]
   [compojure.core :refer [defroutes GET POST]]
diff --git a/src/clj/youyesyet/tags.clj b/src/clj/youyesyet/tags.clj
new file mode 100644
index 0000000..e53e5e1
--- /dev/null
+++ b/src/clj/youyesyet/tags.clj
@@ -0,0 +1,20 @@
+(ns^{:doc "Custom Selmer tags."
+      :author "Simon Brooke"}
+   youyesyet.tags
+  (:require [selmer.parser :as parser]
+            [selmer.filters :as filters]
+            [selmer.util :refer :all]))
+
+
+(defn if-writable-handler [params tag-content render rdr]
+  "If the current element is writable by the current user, emit the content of
+  the if clause; else emit the content of the else clause."
+  (let [{if-tags :ifwritable else-tags :else} (tag-content rdr :ifwritable :else :endifwritable)]
+    params))
+
+
+(defn if-readable-handler [params tag-content render rdr]
+  "If the current element is readable by the current user, emit the content of
+  the if clause; else emit the content of the else clause."
+  (let [{if-tags :ifreadable else-tags :else} (tag-content rdr :ifwritable :else :endifwritable)]
+    params))
diff --git a/youyesyet.adl.xml b/youyesyet.adl.xml
index f8e6d6b..2f98b5d 100644
--- a/youyesyet.adl.xml
+++ b/youyesyet.adl.xml
@@ -300,7 +300,7 @@
       column="visit_id">
       <prompt prompt="visit_id" locale="en-GB"/>
     </property>
-    <property required="true" type="entity" entity="electors" farkey="id" name="elector_id"
+    <property type="entity" entity="electors" farkey="id" name="elector_id"
       column="elector_id">
       <prompt prompt="elector_id" locale="en-GB"/>
     </property>
@@ -308,6 +308,12 @@
       column="option_id">
       <prompt prompt="option_id" locale="en-GB"/>
     </property>
+    <property name="locality" type="integer" required="true">
+      <documentation>
+        The locality at which the intention was recorded; used where an elector does not consent to
+        have polling intention stored against them. This is a locality as described in
+      </documentation>
+    </property>
     <list name="Intentions" properties="all"/>
     <form name="Intention" properties="all"/>
     <permission group="canvassers" permission="noedit">