diff --git a/core/views_survex.py b/core/views_survex.py
index 76b4851..31b9583 100644
--- a/core/views_survex.py
+++ b/core/views_survex.py
@@ -2,15 +2,17 @@ import re
 import os
 import datetime
 import difflib
+from pathlib import Path
 
 from django import forms
 from django.http import HttpResponseRedirect, HttpResponse
 from django.shortcuts import render_to_response, render
 #from django.core.context_processors import csrf
 from django.template.context_processors import csrf
-from django.core.exceptions import ObjectDoesNotExist
 from django.http import HttpResponse, Http404
 
+from django.core.exceptions import ObjectDoesNotExist
+
 import troggle.settings as settings
 import parsers.survex
 from troggle.core.models import Expedition, Person, PersonExpedition 
@@ -18,6 +20,7 @@ from troggle.core.models_survex import SurvexBlock, SurvexPersonRole, SurvexFile
 from troggle.core.models_caves import Cave, PersonTrip, LogbookEntry
 from troggle.parsers.people import GetPersonExpeditionNameLookup
 
+survexdatasetpath = Path(settings.SURVEX_DATA)
 
 survextemplatefile = """; *** THIS IS A TEMPLATE FILE NOT WHAT YOU MIGHT BE EXPECTING ***
 
@@ -99,8 +102,9 @@ class SvxForm(forms.Form):
     code = forms.CharField(widget=forms.Textarea(attrs={"cols":150, "rows":36}))
     
     def GetDiscCode(self):
-        fname = settings.SURVEX_DATA + self.data['filename'] + ".svx"
+        fname = survexdatasetpath / (self.data['filename'] + ".svx")
         if not os.path.isfile(fname):
+            print(">>> >>> WARNING - svx file not found, showiung TEMPLATE SVX",fname, flush=True)
             return survextemplatefile
         fin = open(fname, "rt",encoding='utf8',newline='')
         svxtext = fin.read() 
@@ -114,7 +118,7 @@ class SvxForm(forms.Form):
         return difflist
 
     def SaveCode(self, rcode):
-        fname = settings.SURVEX_DATA + self.data['filename'] + ".svx"
+        fname = survexdatasetpath / (self.data['filename'] + ".svx")
         if not os.path.isfile(fname):
             if re.search(r"\[|\]", rcode):   
                 return "Error: remove all []s from the text. They are only template guidance."
@@ -129,7 +133,7 @@ class SvxForm(forms.Form):
             fout = open(fname, "wt", encoding='utf8',newline='\n')
         except FileNotFoundError:
             pth = os.path.dirname(self.data['filename'])
-            newpath = os.path.join(settings.SURVEX_DATA, pth)
+            newpath = survexdatasetpath / pth
             if not os.path.exists(newpath):
                 os.makedirs(newpath) 
             fout = open(fname, "wt", encoding='utf8',newline='\n')
@@ -141,11 +145,13 @@ class SvxForm(forms.Form):
 
     def Process(self):
         print("....\n\n\n....Processing\n\n\n")
+        froox = os.fspath(survexdatasetpath / (self.data['filename'] + ".svx"))
+        froog = os.fspath(survexdatasetpath / (self.data['filename'] + ".log"))
         cwd = os.getcwd()
-        os.chdir(os.path.split(settings.SURVEX_DATA + self.data['filename'])[0])
-        os.system(settings.CAVERN + " --log " + settings.SURVEX_DATA + self.data['filename'] + ".svx")
+        os.chdir(os.path.split(froox)[0])
+        os.system(settings.CAVERN + " --log " + froox )
         os.chdir(cwd)
-        fin = open(settings.SURVEX_DATA + self.data['filename'] + ".log", "rt",encoding='utf8')
+        fin = open(froog, "rt",encoding='utf8')
         log = fin.read()
         fin.close()
         log = re.sub("(?s).*?(Survey contains)", "\\1", log)
@@ -206,7 +212,7 @@ def svx(request, survex_file):
     svxincludes = re.findall(r'\*include\s+(\S+)(?i)', form.data['code'] or "")
     
     vmap = {'settings': settings,
-            'has_3d': os.path.isfile(settings.SURVEX_DATA + survex_file + ".3d"),
+            'has_3d': os.path.isfile(survexdatasetpath / survex_file / ".3d"),
             'title': survex_file,
             'svxincludes': svxincludes,
             'difflist': difflist,
@@ -218,37 +224,37 @@ def svx(request, survex_file):
     return render_to_response('svxfile.html', vmap)
 
 def svxraw(request, survex_file):
-    svx = open(os.path.join(settings.SURVEX_DATA, survex_file+".svx"), "rt",encoding='utf8')
+    svx = open(os.path.join(survexdatasetpath /  survex_file / ".svx"), "rt",encoding='utf8')
     return HttpResponse(svx, content_type="text")
 
 
 # The cavern running function
 def process(survex_file):
     cwd = os.getcwd()
-    os.chdir(os.path.split(settings.SURVEX_DATA + survex_file)[0])
-    os.system(settings.CAVERN + " --log " + settings.SURVEX_DATA + survex_file + ".svx")
+    os.chdir(os.path.split(os.fspath(survexdatasetpath /  survex_file))[0])
+    os.system(settings.CAVERN + " --log " + survexdatasetpath /  survex_file / ".svx")
     os.chdir(cwd)
 
 
 def threed(request, survex_file):
     process(survex_file)
     try:
-        threed = open(settings.SURVEX_DATA + survex_file + ".3d", "rt",encoding='utf8')
+        threed = open(survexdatasetpath /  survex_file / ".3d", "rt",encoding='utf8')
         return HttpResponse(threed, content_type="model/3d")
     except:
-        log = open(settings.SURVEX_DATA + survex_file + ".log", "rt",encoding='utf8')
+        log = open(survexdatasetpath /  survex_file / ".log", "rt",encoding='utf8')
         return HttpResponse(log, content_type="text")
 
 
 def log(request, survex_file):
     process(survex_file)
-    log = open(settings.SURVEX_DATA + survex_file + ".log", "rt",encoding='utf8')
+    log = open(survexdatasetpath /  survex_file / ".log", "rt",encoding='utf8')
     return HttpResponse(log, content_type="text")
 
 
 def err(request, survex_file):
     process(survex_file)
-    err = open(settings.SURVEX_DATA + survex_file + ".err", "rt",encoding='utf8')
+    err = open(survexdatasetpath /  survex_file / ".err", "rt",encoding='utf8')
     return HttpResponse(err, content_type="text")
 
 
@@ -292,12 +298,36 @@ def identifycavedircontents(gcavedir):
         subsvx.insert(0, primesvx)
     return subdirs, subsvx
 
+def check_cave_registered(survex_cave):
+    '''Checks whether a cave has been properly registered when it is found in the Loser repo
+    This should be called by Databasereset not here in a view
+    Currently Caves are only registered if they are listed in :expoweb: settings.CAVEDESCRIPTIONS
+    so we need to add in any mroe here.
+    '''
+    try:
+        cave = Cave.objects.get(kataster_number=survex_cave)
+        return survex_cave
+    except ObjectDoesNotExist:
+        pass
+    try:
+        cave = Cave.objects.get(unofficial_number=survex_cave)
+        if cave.kataster_number:
+            return cave.kataster_number
+        else:
+            return None
+    except ObjectDoesNotExist:
+        pass
+
 
 # direct local non-database browsing through the svx file repositories
 # perhaps should use the database and have a reload button for it
 # why is caves-1623 HARD CODED here ?! That must be wrong..
 def survexcaveslist(request):
-    cavesdir = os.path.join(settings.SURVEX_DATA, "caves-1623")
+    '''This reads the entire list of caves in the Loser repo directory and produces a complete report.
+    It can find caves which have not yet been properly registered in the system by Databasereset.py because
+    someone may have uploaded the survex files without doing the rest of the integration process.
+    '''
+    cavesdir = survexdatasetpath / "caves-1623"
     #cavesdircontents = { }
     
     onefilecaves = [ ]
@@ -307,21 +337,25 @@ def survexcaveslist(request):
     # first sort the file list
     fnumlist = sorted([ (-int(re.match(r"\d*", f).group(0) or "0"), f)  for f in os.listdir(cavesdir) ])
     
-    print(fnumlist)
+    #print(fnumlist)
     
     # go through the list and identify the contents of each cave directory
     for num, cavedir in fnumlist:
         
         # these have sub dirs /cucc/ /arge/ /old/ but that is no reason to hide them in this webpage
-        # so these are now treated the same as 142 and 113 which also had a /cucc/ sub dir
+        # so these are now treated the same as 142 and 113 which also have a /cucc/ sub dir
         #if cavedir in ["144", "40"]: 
         #    continue
-            
+
+        # This all assumes that the first .svx file has the same name as the cave name, 
+        # which usually but not always true. e.g. caves-1623/78/allkaese.svx not caves-1623/78/78.svx
+        # which is why we now also pass through the cavedir
         gcavedir = os.path.join(cavesdir, cavedir)
         if os.path.isdir(gcavedir) and cavedir[0] != ".":
             subdirs, subsvx = identifycavedircontents(gcavedir)
-            survdirobj = [ ]
             
+            katast = check_cave_registered(cavedir) # should do this only once per database load or it will be slow
+            survdirobj = [ ]
             for lsubsvx in subsvx:
                 survdirobj.append(("caves-1623/"+cavedir+"/"+lsubsvx, lsubsvx))
             
@@ -340,7 +374,7 @@ def survexcaveslist(request):
             
             # multifile caves
             elif len(survdirobj) > 1:
-                multifilecaves.append((survdirobj[0], survdirobj[1:]))
+                multifilecaves.append((survdirobj[0], cavedir, survdirobj[1:]))
             # single file caves
             elif len(survdirobj) == 1:
                 onefilecaves.append(survdirobj[0])
@@ -349,16 +383,18 @@ def survexcaveslist(request):
 
 
 # parsing all the survex files of a single cave and showing that it's consistent and can find all the files and people
-# doesn't use recursion.  just writes it twice
 
 # currently not showing Explorers or Titles. link test from SurvexFile page is "dates and explorers"
 # Should explicity fix the kataster number thing.
 def survexcavesingle(request, survex_cave):
+    print(">>>", survex_cave)
     breload = False
     if breload:
         parsers.survex.ReloadSurvexCave(survex_cave) # does not exit now, needs re-writing to work.
     try:
         cave = Cave.objects.get(kataster_number=survex_cave)
+        for survexdirectory in cave.survexdirectory_set.all:
+            print(">>> >>>", survexdirectory, flush=True)
         return render_to_response('svxcavesingle.html', {'settings': settings, "cave":cave })
     except ObjectDoesNotExist:
         # can get here if the survex file is in a directory labelled with unofficial number not kataster number.
diff --git a/flatpages/views.py b/flatpages/views.py
index 518b157..aa1793d 100644
--- a/flatpages/views.py
+++ b/flatpages/views.py
@@ -1,5 +1,6 @@
 import os
 import re
+from pathlib import Path
 
 from django.shortcuts import render, redirect
 from django.http import HttpResponse, HttpResponseRedirect, Http404
@@ -52,15 +53,16 @@ def flatpage(request, path):
         print(("flat path noinfo", path))
         return HttpResponseRedirect(reverse("auth_login") + '?next=%s' % request.path)
 
+    expowebpath = Path(settings.EXPOWEB)
     if path.endswith("/") or path == "":
         #print(" - FLATPAGES the file: {} ENDSWITH ...".format(path))
 
         try:
-            o = open(os.path.normpath(settings.EXPOWEB + path + "index.html"), "rb")
+            o = open(os.path.normpath(expowebpath / path / "index.html"), "rb")
             path = path + "index.html"
         except IOError:
             try:
-                o = open(os.path.normpath(settings.EXPOWEB + path + "index.htm"), "rb")
+                o = open(os.path.normpath(expowebpath / path / "index.htm"), "rb")
                 path = path + "index.htm"
             except IOError:
                 return render(request, 'pagenotfound.html', {'path': path})
@@ -77,8 +79,8 @@ def flatpage(request, path):
                 path = path.replace("static", settings.MEDIA_ROOT)
                 filetobeopened = os.path.normpath(path)
             else:
-                #print(" - NO    _ROOT: {}  ...".format(settings.EXPOWEB))
-                filetobeopened = os.path.normpath(settings.EXPOWEB + path)
+                #print(" - NO    _ROOT: {}  ...".format(expowebpath))
+                filetobeopened = os.path.normpath(expowebpath / path)
             
             #print(" - FLATPAGES full path : {}  ...".format(filetobeopened))
             o = open(filetobeopened, "rb")
diff --git a/parsers/survex.py b/parsers/survex.py
index 2ca2f1d..6fdf046 100644
--- a/parsers/survex.py
+++ b/parsers/survex.py
@@ -4,7 +4,7 @@ import re
 import time
 import copy
 
-from unipath import Path
+from pathlib import Path
 from datetime import datetime, timedelta
 from subprocess import call, run
 
@@ -1257,7 +1257,7 @@ def LoadPositions():
         print(" -  Regenerating {} {}.3d  in  {}".format(settings.SURVEXPORT, topdata, settings.SURVEX_DATA))
         call([settings.SURVEXPORT, '--pos', '{}.3d'.format(topdata)], cwd = settings.SURVEX_DATA)
 
-    topdata = settings.SURVEX_DATA.child(settings.SURVEX_TOPNAME)
+    topdata = os.fspath(Path(settings.SURVEX_DATA) / settings.SURVEX_TOPNAME)
     print((' - Generating a list of Pos from %s.svx and then loading...' % (topdata)))
 
     found = 0
diff --git a/settings.py b/settings.py
index df5268e..024be70 100644
--- a/settings.py
+++ b/settings.py
@@ -27,7 +27,7 @@ print("*  importing troggle/settings.py")
 # read https://docs.djangoproject.com/en/3.0/topics/settings/
 
 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
-BASE_DIR = os.path.dirname(os.path.dirname(__file__))
+#BASE_DIR = os.path.dirname(os.path.dirname(__file__))
 
 # Django settings for troggle project.
 
diff --git a/templates/svxfilecavelist.html b/templates/svxfilecavelist.html
index 3eb0701..59f177f 100644
--- a/templates/svxfilecavelist.html
+++ b/templates/svxfilecavelist.html
@@ -41,10 +41,10 @@
 <h2 id="cmult">Caves of multiple files</h2>
 <table>
 <tr><th>Dates and explorers</th><th>Survex files</th></tr>
-{% for primarycavefile, subcavefiles in multifilecaves %}
+{% for primarycavefile, cavedir, subcavefiles in multifilecaves %}
 <tr>
   <td>
-     <a href="{% url "survexcavessingle" primarycavefile.1 %}">{{primarycavefile.1}}</a>
+     <a href="{% url "survexcavessingle" cavedir %}">{{cavedir}}</a> <!-- formerly primarycavefile.1 -->
   </td>
   <td>
     <a href="{% url "svx" primarycavefile.0 %}">{{primarycavefile.1}}</a> -