diff --git a/_deploy/debian/localsettingsserver-old.py b/_deploy/debian/localsettingsserver-old.py
new file mode 100644
index 0000000..7379a3c
--- /dev/null
+++ b/_deploy/debian/localsettingsserver-old.py
@@ -0,0 +1,120 @@
+import sys
+import os
+import urllib.parse
+"""Settings for a troggle installation which may vary among different
+installations: for development or deployment, in a docker image or
+python virtual environment (venv), on ubuntu, debian or in Windows
+System for Linux (WSL), on the main server or in the potato hut,
+using SQLite or mariaDB.
+
+It sets the directory locations for the major parts of the system so
+that e.g. expofiles can be on a different filesystem.
+
+This file is included at the end of the main troggle/settings.py file so that
+it overwrites defaults in that file.
+"""
+
+print(" * importing troggle/localsettings.py")
+
+# DO NOT check this file into the git repo - it contains real passwords. [not this copy]
+SECRET_KEY = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
+EXPOUSERPASS = "nope"
+EXPOADMINUSERPASS = "nope"
+EMAIL_HOST_PASSWORD = "nope" 
+
+
+DATABASES = {
+    'default': { 
+        'ENGINE': 'django.db.backends.mysql', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
+        'NAME' : 'troggle',                   # Or path to database file if using sqlite3.
+        'USER' : 'expo',                      # Not used with sqlite3.
+        'PASSWORD' : 'not a real password',       # Not used with sqlite3.
+        'HOST' : '',                          # Set to empty string for localhost. Not used with sqlite3.
+        'PORT' : '',                          # Set to empty string for default. Not used with sqlite3.
+    }
+}
+
+
+EXPOUSER = 'expo'
+EXPOUSERPASS = "nnn:gggggg"
+EXPOUSER_EMAIL = 'wookey@wookware.org'
+
+REPOS_ROOT_PATH = '/home/expo/'
+sys.path.append(REPOS_ROOT_PATH)
+sys.path.append(REPOS_ROOT_PATH + 'troggle')
+# Define the path to the django app (troggle in this case)
+PYTHON_PATH = REPOS_ROOT_PATH + 'troggle/'
+
+TEMPLATES = [
+    {
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
+        'DIRS': [
+            PYTHON_PATH + "templates"
+        ],
+        'OPTIONS': {
+            'debug': 'DEBUG',
+            'context_processors': [
+                'django.contrib.auth.context_processors.auth',
+                'core.context.troggle_context', 
+                'django.template.context_processors.debug',
+                'django.template.context_processors.i18n',
+                'django.template.context_processors.media',
+                'django.template.context_processors.static',
+                'django.template.context_processors.tz',
+                'django.contrib.messages.context_processors.messages',
+            ],
+            'loaders': [
+                'django.template.loaders.filesystem.Loader',
+                'django.template.loaders.app_directories.Loader',
+                # insert your TEMPLATE_LOADERS here
+           ]
+       },
+    },
+]
+
+PUBLIC_SITE = True
+
+# This should be False for normal running
+DEBUG = True
+
+SURVEX_DATA = REPOS_ROOT_PATH + 'loser/'
+DRAWINGS_DATA = REPOS_ROOT_PATH + 'drawings/'
+
+CAVERN = 'cavern'
+THREEDTOPOS = 'survexport'
+EXPOWEB = REPOS_ROOT_PATH + 'expoweb/'
+SURVEYS = REPOS_ROOT_PATH
+SURVEY_SCANS = REPOS_ROOT_PATH + 'expofiles/surveyscans/'
+FILES = REPOS_ROOT_PATH + 'expofiles'
+CAVEDESCRIPTIONS = os.path.join(EXPOWEB, "cave_data")
+ENTRANCEDESCRIPTIONS = os.path.join(EXPOWEB, "entrance_data")
+
+CACHEDIR = REPOS_ROOT_PATH + 'expowebcache/'
+THREEDCACHEDIR = CACHEDIR + '3d/'
+THUMBNAILCACHE = CACHEDIR + 'thumbs'
+
+PYTHON_PATH = REPOS_ROOT_PATH + 'troggle/'
+
+URL_ROOT = 'http://expo.survex.com/'
+DIR_ROOT = ''#this should end in / if a value is given
+EXPOWEB_URL = '/'
+SURVEYS_URL = '/survey_scans/'
+EXPOFILES   = urllib.parse.urljoin(REPOS_ROOT_PATH, 'expofiles/')
+PHOTOS_URL  = urllib.parse.urljoin(URL_ROOT, '/photos/')
+
+# MEDIA_URL is used by urls.py in a regex. See urls.py & core/views/surveys.py
+MEDIA_URL = '/site_media/'
+
+MEDIA_ROOT = REPOS_ROOT_PATH + '/troggle/media/'
+
+STATIC_URL = urllib.parse.urljoin(URL_ROOT , '/static/') # used by Django admin pages. Do not delete.
+JSLIB_URL  = urllib.parse.urljoin(URL_ROOT , '/javascript/') # always fails, try to revive it ?
+
+#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
+#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
+
+LOGFILE = '/var/log/troggle/troggle.log'
+IMPORTLOGFILE = '/var/log/troggle/import.log'
+
+# add in 290, 291, 358 when they don't make it crash horribly
+NOTABLECAVESHREFS = [ "264", "258", "204", "76", "107"]
diff --git a/_deploy/debian/localsettingsserver.py b/_deploy/debian/localsettingsserver.py
index 7379a3c..bf2fefb 100644
--- a/_deploy/debian/localsettingsserver.py
+++ b/_deploy/debian/localsettingsserver.py
@@ -1,6 +1,7 @@
 import sys
 import os
 import urllib.parse
+from pathlib import Path
 """Settings for a troggle installation which may vary among different
 installations: for development or deployment, in a docker image or
 python virtual environment (venv), on ubuntu, debian or in Windows
@@ -8,27 +9,29 @@ System for Linux (WSL), on the main server or in the potato hut,
 using SQLite or mariaDB.
 
 It sets the directory locations for the major parts of the system so
-that e.g. expofiles can be on a different filesystem.
+that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
+a system-wide location rather than just a local directory.
 
 This file is included at the end of the main troggle/settings.py file so that
 it overwrites defaults in that file.
+
+Read https://realpython.com/python-pathlib/
+Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
 """
 
 print(" * importing troggle/localsettings.py")
 
-# DO NOT check this file into the git repo - it contains real passwords. [not this copy]
-SECRET_KEY = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
-EXPOUSERPASS = "nope"
-EXPOADMINUSERPASS = "nope"
-EMAIL_HOST_PASSWORD = "nope" 
+# DO NOT check this file into the git repo - it contains real passwords.
 
+EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote sever
+#SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
 
 DATABASES = {
     'default': { 
         'ENGINE': 'django.db.backends.mysql', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
         'NAME' : 'troggle',                   # Or path to database file if using sqlite3.
         'USER' : 'expo',                      # Not used with sqlite3.
-        'PASSWORD' : 'not a real password',       # Not used with sqlite3.
+        'PASSWORD' : 'uFqP56B4XleeyIW',       # Not used with sqlite3.
         'HOST' : '',                          # Set to empty string for localhost. Not used with sqlite3.
         'PORT' : '',                          # Set to empty string for default. Not used with sqlite3.
     }
@@ -36,15 +39,21 @@ DATABASES = {
 
 
 EXPOUSER = 'expo'
-EXPOUSERPASS = "nnn:gggggg"
+EXPOADMINUSER = 'expoadmin'
 EXPOUSER_EMAIL = 'wookey@wookware.org'
+EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
+
+SECRET_KEY = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
+EXPOUSERPASS = "nope"
+EXPOADMINUSERPASS = "nope"
+EMAIL_HOST_PASSWORD = "nope" 
 
 REPOS_ROOT_PATH = '/home/expo/'
 sys.path.append(REPOS_ROOT_PATH)
 sys.path.append(REPOS_ROOT_PATH + 'troggle')
 # Define the path to the django app (troggle in this case)
 PYTHON_PATH = REPOS_ROOT_PATH + 'troggle/'
-
+PHOTOS_YEAR = "2022"
 TEMPLATES = [
     {
         'BACKEND': 'django.template.backends.django.DjangoTemplates',
@@ -53,20 +62,22 @@ TEMPLATES = [
         ],
         'OPTIONS': {
             'debug': 'DEBUG',
-            'context_processors': [
-                'django.contrib.auth.context_processors.auth',
-                'core.context.troggle_context', 
+            'context_processors': [ 
+                # django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
+                'django.contrib.auth.context_processors.auth', # knowledge of logged-on user & permissions
+                'core.context.troggle_context',    # in core/troggle.py
                 'django.template.context_processors.debug',
+                #'django.template.context_processors.request', # copy of current request, added in trying to make csrf work
                 'django.template.context_processors.i18n',
-                'django.template.context_processors.media',
-                'django.template.context_processors.static',
+                'django.template.context_processors.media',  # includes a variable MEDIA_URL
+                'django.template.context_processors.static', # includes a variable STATIC_URL
                 'django.template.context_processors.tz',
                 'django.contrib.messages.context_processors.messages',
             ],
             'loaders': [
                 'django.template.loaders.filesystem.Loader',
-                'django.template.loaders.app_directories.Loader',
-                # insert your TEMPLATE_LOADERS here
+                'django.template.loaders.app_directories.Loader', #For each app, inc admin,  in INSTALLED_APPS, loader looks for /templates 
+               # insert your own TEMPLATE_LOADERS here
            ]
        },
     },
@@ -76,36 +87,50 @@ PUBLIC_SITE = True
 
 # This should be False for normal running
 DEBUG = True
+CACHEDPAGES = True  # experimental page cache for a handful of page types
 
 SURVEX_DATA = REPOS_ROOT_PATH + 'loser/'
 DRAWINGS_DATA = REPOS_ROOT_PATH + 'drawings/'
 
-CAVERN = 'cavern'
-THREEDTOPOS = 'survexport'
+# executables:
+CAVERN = 'cavern' # for parsing .svx files and producing .3d files
+SURVEXPORT = 'survexport' # for parsing .3d files and producing .pos files
+
 EXPOWEB = REPOS_ROOT_PATH + 'expoweb/'
-SURVEYS = REPOS_ROOT_PATH
-SURVEY_SCANS = REPOS_ROOT_PATH + 'expofiles/surveyscans/'
+#SURVEYS = REPOS_ROOT_PATH
+SCANS_ROOT = REPOS_ROOT_PATH + 'expofiles/surveyscans/'
 FILES = REPOS_ROOT_PATH + 'expofiles'
+PHOTOS_ROOT = REPOS_ROOT_PATH + 'expofiles/photos/'
+
+TROGGLE_PATH = Path(__file__).parent
+TEMPLATE_PATH     = TROGGLE_PATH / 'templates'
+MEDIA_ROOT        = TROGGLE_PATH / 'media'
+JSLIB_ROOT        = TROGGLE_PATH / 'media' / 'jslib' # used for CaveViewer JS utility
+
+
 CAVEDESCRIPTIONS = os.path.join(EXPOWEB, "cave_data")
 ENTRANCEDESCRIPTIONS = os.path.join(EXPOWEB, "entrance_data")
 
-CACHEDIR = REPOS_ROOT_PATH + 'expowebcache/'
-THREEDCACHEDIR = CACHEDIR + '3d/'
-THUMBNAILCACHE = CACHEDIR + 'thumbs'
+# CACHEDIR = REPOS_ROOT_PATH + 'expowebcache/'
+# THREEDCACHEDIR = CACHEDIR + '3d/'
+# THUMBNAILCACHE = CACHEDIR + 'thumbs'
 
 PYTHON_PATH = REPOS_ROOT_PATH + 'troggle/'
+PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
+LIBDIR  =  Path(REPOS_ROOT_PATH) / 'lib' / PV 
 
-URL_ROOT = 'http://expo.survex.com/'
+#Note that all these *_URL constants are not actually used in urls.py, they should be..
+#URL_ROOT = 'http://expo.survex.com/'
+URL_ROOT = '/'
 DIR_ROOT = ''#this should end in / if a value is given
 EXPOWEB_URL = '/'
-SURVEYS_URL = '/survey_scans/'
+SCANS_URL = '/survey_scans/'
 EXPOFILES   = urllib.parse.urljoin(REPOS_ROOT_PATH, 'expofiles/')
 PHOTOS_URL  = urllib.parse.urljoin(URL_ROOT, '/photos/')
 
-# MEDIA_URL is used by urls.py in a regex. See urls.py & core/views/surveys.py
+# MEDIA_URL is used by urls.py in a regex. See urls.py & core/views_surveys.py
 MEDIA_URL = '/site_media/'
 
-MEDIA_ROOT = REPOS_ROOT_PATH + '/troggle/media/'
 
 STATIC_URL = urllib.parse.urljoin(URL_ROOT , '/static/') # used by Django admin pages. Do not delete.
 JSLIB_URL  = urllib.parse.urljoin(URL_ROOT , '/javascript/') # always fails, try to revive it ?
@@ -116,5 +141,23 @@ JSLIB_URL  = urllib.parse.urljoin(URL_ROOT , '/javascript/') # always fails, try
 LOGFILE = '/var/log/troggle/troggle.log'
 IMPORTLOGFILE = '/var/log/troggle/import.log'
 
-# add in 290, 291, 358 when they don't make it crash horribly
-NOTABLECAVESHREFS = [ "264", "258", "204", "76", "107"]
+# add in 358 when they don't make it crash horribly
+NOTABLECAVESHREFS = [ "290", "291", "359", "264", "258", "204", "76", "107"]
+
+# Sanitise these to be strings as all other code is expecting strings
+# and we have not made the change to pathlib Path type in the other localsettings-* variants yet.
+CAVEDESCRIPTIONS = os.fspath(CAVEDESCRIPTIONS)
+ENTRANCEDESCRIPTIONS = os.fspath(ENTRANCEDESCRIPTIONS)
+LOGFILE = os.fspath(LOGFILE)
+#SURVEYS = os.fspath(SURVEYS)
+EXPOWEB = os.fspath(EXPOWEB)
+DRAWINGS_DATA     = os.fspath(DRAWINGS_DATA)
+SURVEX_DATA     = os.fspath(SURVEX_DATA)
+REPOS_ROOT_PATH = os.fspath(REPOS_ROOT_PATH)
+TEMPLATE_PATH   = os.fspath(TROGGLE_PATH)
+MEDIA_ROOT      = os.fspath(MEDIA_ROOT)
+JSLIB_ROOT      = os.fspath(JSLIB_ROOT)
+SCANS_ROOT    = os.fspath(SCANS_ROOT)
+LIBDIR    = os.fspath(LIBDIR)
+
+print(" + finished importing troggle/localsettings.py")
\ No newline at end of file