diff --git a/core/models/caves.py b/core/models/caves.py
index d272744..e8cfeea 100644
--- a/core/models/caves.py
+++ b/core/models/caves.py
@@ -490,10 +490,9 @@ def GetCaveLookup():
 
     Used when parsing wallets contents.json file too in views/uploads.py
 
-    Does NOT detect duplicates! Needs fixing.
-    Needs to be a proper funciton that raises an exception if there is a duplicate.
+    Needs to be a proper function that raises an exception if there is a duplicate.
     OR we could set it to return None if there are duplicates, and require the caller to
-    fall back on doing the actual database query it wants rather thna using  this cache shortcut
+    fall back on doing the actual database query it wants rather than using  this cache shortcut
     """
     
     duplicates = {}
@@ -506,10 +505,7 @@ def GetCaveLookup():
         else:
             if cave == Gcavelookup[id]:
                 pass  # same id, same cave
-            else:  # same id but different cave
-                # message = f" -  Warning: ignoring alias id '{id:3}'.  Caves '{Gcavelookup[id]}' and '{cave}'. "
-                # print(message)
-                # DataIssue.objects.create(parser="aliases", message=message)
+            else:  # same id but different cave, e.g. 122 => 1623-122 and 1626-122
                 duplicates[id] = 1
    
     global Gcavelookup
@@ -689,7 +685,7 @@ def GetCaveLookup():
             Gcavelookup[i[0]] = Gcavelookup[i[1]]
         else:
             message = f" *  Coding or cave existence mistake, cave for id '{i[1]}' does not exist. Expecting to set alias '{i[0]}' to it"
-            # print(message)
+            print(message)
             DataIssue.objects.create(parser="aliases", message=message)
 
     addmore = {}
diff --git a/core/views/survex.py b/core/views/survex.py
index bd9df25..3ecd523 100644
--- a/core/views/survex.py
+++ b/core/views/survex.py
@@ -17,7 +17,7 @@ from django.views.decorators.csrf import ensure_csrf_cookie
 
 import troggle.settings as settings
 from troggle.core.models.logbooks import LogbookEntry
-from troggle.core.models.caves import Cave
+from troggle.core.models.caves import Cave, GetCaveLookup
 from troggle.core.models.survex import SurvexFile, SurvexBlock, SurvexDirectory
 from troggle.core.models.wallets import Wallet
 from troggle.core.utils import only_commit
@@ -670,43 +670,41 @@ def survexdir(request):
             # print(f, f.cave)
     return render(request, "survexdir.html", {"survexdirs": sds, "survexfiles": survexfiles})
 
-
-def survexcavesingle(request, survex_cave):
+def get_directories(cave):
+    sds = []
+    sfs = cave.survexfile_set.all()
+    for sf in sfs:
+        sds.append(sf.survexdirectory)
+    return list(set(sds))
+    
+    
+    
+def survexcavesingle(request, cave_shortname):
     """parsing all the survex files of a single cave and showing that it's consistent and can find all
-    the files and people.   Should explicitly fix the kataster number thing.
-    kataster numbers are not unique across areas. This used to be a db constraint but we need to manage
-    this ourselves as we don't want the parser aborting with an error message.
-
-    Should use getCave() from models_caves
+    the files and people.   
     """
-    sc = survex_cave
-    try:
-        cave = Cave.objects.get(kataster_number=sc)  # This may not be unique.
-        return render(request, "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.
-        # maybe - and _ mixed up, or CUCC-2017- instead of 2017-CUCC-, or CUCC2015DL01 . Let's not get carried away..
-
-        # or it might be an exact search for a specific survefile but just missing the '.svx.
-        if (SVXPATH / Path(survex_cave + ".svx")).is_file():
-            return svx(request, survex_cave)
-
-        for unoff in [sc, sc.replace("-", "_"), sc.replace("_", "-"), sc.replace("-", ""), sc.replace("_", "")]:
-            try:
-                cave = Cave.objects.get(unofficial_number=unoff)  # return on first one we find
-                return render(request, "svxcavesingle.html", {"settings": settings, "cave": cave})
-            except ObjectDoesNotExist:
-                continue  # next attempt in for loop
-        return render(request, "errors/svxcavesingle404.html", {"settings": settings, "cave": sc})
-
-    except MultipleObjectsReturned:
-        caves = Cave.objects.filter(kataster_number=survex_cave)
-        return render(request, "svxcaveseveral.html", {"settings": settings, "caves": caves})
-
-    except:
-        return render(request, "errors/svxcavesingle404.html", {"settings": settings, "cave": sc})
+    
+    Gcavelookup = GetCaveLookup()
+    if cave_shortname in Gcavelookup:
+        cave = Gcavelookup[cave_shortname]
+        # print(f"survexcavesingle {cave_shortname=} => {cave=}")
+        cave.sds = get_directories(cave)
+        return render(request, "svxcaves.html", {"settings": settings, "caves": [cave]})
+    else:
+        # not a cave or an ambiguous short name, e.g. "122"
+        
+        # if (SVXPATH / Path(cave_shortname + ".svx")).is_file():
+            # return svx(request, cave_shortname)  
 
+        caves = Cave.objects.filter(kataster_number=cave_shortname)
+        if len(caves) > 0:
+            # print(f"many {cave_shortname=} => {caves=}")
+            for cave in caves:
+                cave.sds = get_directories(cave)
+                # print(f"many {cave=} => {cave.sds=}")
+            return render(request, "svxcaves.html", {"settings": settings, "caves": caves})
+        else:
+            return render(request, "errors/svxcaves404.html", {"settings": settings, "cave": cave_shortname})
 
 def check_cave_registered(area, survex_cave):
     """Checks whether a cave has been properly registered when it is found in the Loser repo
@@ -714,8 +712,8 @@ def check_cave_registered(area, survex_cave):
     Currently Caves are only registered if they are listed in :expoweb: settings.CAVEDESCRIPTIONS
     so we need to add in any more here.
 
-    This function runs but does not seem to be used?!
-    A serious bodge anyway.
+    This function is used in survexcaveslist(request)
+    A serious bodge.
     """
     try:
         cave = Cave.objects.get(kataster_number=survex_cave)
diff --git a/templates/errors/svxcavesingle404.html b/templates/errors/svxcaves404.html
similarity index 100%
rename from templates/errors/svxcavesingle404.html
rename to templates/errors/svxcaves404.html
diff --git a/templates/svxcavesingle.html b/templates/svxcaves.html
similarity index 89%
rename from templates/svxcavesingle.html
rename to templates/svxcaves.html
index ea992b9..0eed31d 100644
--- a/templates/svxcavesingle.html
+++ b/templates/svxcaves.html
@@ -3,21 +3,18 @@
 {% block title %}List of survex files{% endblock %}
 {% block content %}
 
+{% for cave in caves %}
 {% autoescape off %}
 <h1>Surveys for <a href="/{{cave.url}}">{{cave.official_name}}</a> - id:{{cave}}</h1>
 {% endautoescape %}
-<!-- the only thing passed into this template is the object identifier for a cave.
-All the processing to extract the survex subdriectories and survex files is done in this template 
 
-CHANGE THAT and do the processing in python were it is easier to see what is going on and where
-we don't need the SUrvexDirectory objects at all-->
 
 <p>Cave description: <a href="/{{cave.url}}">{{cave.url}}</a>
 <p>Wallets: <a href="/cave/scans/{{cave|safe}}">{{cave|safe}}</a>
 </p>
 <p>
-{% for survexdirectory in cave.survexdirectory_set.all %} <!-- redo to use cave.survexfile_set.all() each of which has a .survexdirectory-->
- <a href="#T_{{survexdirectory.primarysurvexfile.path}}">{{survexdirectory.path}}</a> 
+{% for survexdirectory in cave.sds %} <!-- redo to use cave.survexfile_set.all() each of which has a .survexdirectory-->
+ <a href="#T_{{survexdirectory.primarysurvexfile.path}}">{{survexdirectory.path}}</a> &nbsp;
     {% empty %}
     <p>If you were expecting to see a list of survex files here and a summary table of who did what and when, perhaps
     because you followed a link from <a href="/survexfile/caves/">the master caves' survex list</a> page which showed that such survex files clearly existed, and yet there is nothing here but a blank; then this will be because <br>
@@ -42,7 +39,7 @@ to go to a form to correct the online data.
     Instructions for filling in this form are in this part 
     <a href="/handbook/survey/caveentry.html"> of the survey handbook</a>.
 </p>
-{% for survexdirectory in cave.survexdirectory_set.all %}
+{% for survexdirectory in cave.sds %}
     <h3 id="T_{{survexdirectory.primarysurvexfile.path}}">{{survexdirectory.path}}</h3>
     <table>
     <tr><th>Survex file</th><th>Block</th><th>Date</th><th>Explorers</th><th>length</th><th>Titles</th><th>Scans</th></tr>
@@ -98,8 +95,9 @@ to go to a form to correct the online data.
               {% endif %}
               </td>
             </tr>
-        {% endfor %}      
-    {% endfor %}
+        {% endfor %}  <!-- survexblock -->  
+    {% endfor %} <!-- survexfile -->  
     </table>
-{% endfor %}
+{% endfor %} <!-- survexdirectory --> 
+{% endfor %} <!-- caves -->
 {% endblock %}
diff --git a/templates/svxcaveseveral.html b/templates/svxcaveseveral.html
deleted file mode 100644
index de45337..0000000
--- a/templates/svxcaveseveral.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<!-- svxcaveseveral.html - this text visible because this template has been included -->
-{% extends "base.html" %}
-{% block title %}List of survex files{% endblock %}
-{% block content %}
-    <!-- the only thing passed into this template is a list of object identifiers for caves.
-    All the processing to extract the survex subdriectories and survex files is done in this template -->
-{% for cave in caves %}
-
-    {% autoescape off %}
-    <h1>Surveys for <a href="/{{cave.url}}">{{cave.official_name}}</a> - identifier:{{cave}}</h1>
-    {% endautoescape %}
-
-    <p>Cave description: <a href="/{{cave.url}}">{{cave.url}}</a>
-    </p>
-    <p>
-    {% for survexdirectory in cave.survexdirectory_set.all %}
-      This cave has a linked survexdirectory: <a href="#T_{{survexdirectory.primarysurvexfile.path}}">{{survexdirectory.path}}</a> in the database.  See the table below.
-    {% empty %}
-    <p>If you were expecting to see a list of survex files here and a summary table of who did what and when, perhaps
-    because you followed a link from <a href="/survexfile/caves/">the master caves' survex list</a> page which showed that such survex files clearly existed, and yet there is nothing here but a blank; then this will be because the survex (.svx) files have been stored on the server in the 
-    <a href="/handbook/computing/repos.html"><var>:loser:</var></a> repository 
-    but whoever was 
-    responsible has not yet created the appropriate entries in the XML file in the 
-    <a href="/handbook/computing/repos.html"><var>:expoweb:</var></a> repository.
-    It is the XML file which registers the cave description and ties together
-    the survex files with everything else.
-    <p>The process for registering a new cave is documented in 
-    <a href="/handbook/survey/caveentry.html">this part of the survey handbook</a>.
-    {% endfor %}
-    </p>
-    
-    <p>If you can see a filename here: [&nbsp;<a href="/survexfile/{{cave.survex_file}}">{{cave.survex_file}}</a> &nbsp;] 
-    which does <em>not</em>  match any in the list below <em>including the directories beginning with </em><strong>caves-162X/</strong></em> 
-    not just the filename</em>, then (if logged on) you can
-    <strong>click here <var><a href="/{{cave.slug}}_cave_edit/">/{{cave.slug}}_cave_edit</a></var></strong>
-    to go to a form to correct the online data. 
-    Instructions for filling in this form are in this part 
-    <a href="/handbook/survey/caveentry.html"> of the survey handbook</a>.
-    </p>
-    {% for survexdirectory in cave.survexdirectory_set.all %}
-        <h3 id="T_{{survexdirectory.primarysurvexfile.path}}">{{survexdirectory.path}}</h3>
-        <table>
-        <tr><th>Survex file</th><th>Block</th><th>Date</th><th>Explorers</th><th>length</th><th>Titles</th><th>Scans</th></tr>
-        {% for survexfile in survexdirectory.survexfile_set.all %}
-        <tr>
-          {% if survexfile.exists %}
-            <td rowspan="{{survexfile.survexblock_set.all|length|add:"1"}}">
-          {% else %}
-            <td class="survexnewfile" rowspan="{{survexfile.survexblock_set.all|length|add:"1"}}">
-          {% endif %}
-
-          {% if survexfile == survexdirectory.primarysurvexfile %}
-            <a href="{% url "svx" survexfile.path %}"><b>{% url "svx" survexfile.path %}</b></a>
-          {% else %}
-            <a href="{% url "svx" survexfile.path %}"><i><small>{% url "svx" survexfile.path %}</small></i></a><!-- would like to extract only the last bit. Some javascript useful ?-->
-          {% endif %}
-          </td>
-        </tr>
-            {% for survexblock in survexfile.survexblock_set.all %}
-                <tr>
-                  <!-- Block -->   
-                 <td  style="width:10 em"><a href="{% url "svx" survexfile.path %}">{{survexblock.name}}</a></td>
-                  
-                  <!-- Date -->
-                  <td  style="white-space:nowrap">
-                  {% if survexblock.expedition %}
-                    <a href="{{survexblock.expedition.get_absolute_url}}">{{survexblock.date|date:"D d M Y"}}</a>
-                  {% else %}
-                    <!--{{survexblock.date}}-->
-                  {% endif %} 
-                  </td>
-                  <!-- Explorers -->
-                  <td>
-                  {% for personrole in survexblock.survexpersonrole_set.all %}
-                    {% if personrole.personexpedition %}
-                      <a href="{{personrole.personexpedition.get_absolute_url}}">{{personrole.personname}}</a>
-                    {% else %}
-                      {{personrole.personname}}
-                    {% endif %}
-                  {% endfor %}
-                  </td>
-                  <!-- length -->
-                  <td style="padding-right: 3px; text-align:right">{{survexblock.legslength|stringformat:".1f"}}</td>
-                 
-                  <!-- Titles -->
-                  <td style="padding-left: 3px;">
-                  {{survexblock.title}}
-                  </td>
-                  <!-- Scans -->
-                  <td>
-                  {% if survexblock.scanswallet %}
-                    <b><a href="{{survexblock.scanswallet.get_absolute_url}}">{{survexblock.scanswallet.walletname}}</a></b>
-                  {% endif %}
-                  </td>
-                </tr>
-            {% endfor %}      
-        {% endfor %}
-        </table><p>
-    {% endfor %}
-{% endfor %}
-{% endblock %}
diff --git a/urls.py b/urls.py
index 513a1eb..499c612 100644
--- a/urls.py
+++ b/urls.py
@@ -184,8 +184,8 @@ trogglepatterns = [
 # The survexfile pages
     path('survexdir',                     survex.survexdir,  name="survexdir"),
     
-    path('survexfile',                    survex.survexcavesingle, {'survex_cave': ''},   name="survexcavessingle"),
-    path('survexfile/',                   survex.survexcavesingle, {'survex_cave': ''},   name="survexcavessingle"),
+    path('survexfile',                    survex.survexcavesingle, {'cave_shortname': ''},   name="survexcavessingle"),
+    path('survexfile/',                   survex.survexcavesingle, {'cave_shortname': ''},   name="survexcavessingle"),
     path('survexfile/caves',              survex.survexcaveslist,     name="survexcaveslist"),
     path('survexfile/caves/',             survex.survexcaveslist,     name="survexcaveslist"), # auto slash not working
 
@@ -193,7 +193,7 @@ trogglepatterns = [
     path('survexfile/<path:survex_file>.3d',  survex.threed,     name="threed"), 
     path('survexfile/<path:survex_file>.log', survex.svxlog,     name="svxlog"),  
     path('survexfile/<path:survex_file>.err', survex.err,        name="err"), 
-    path('survexfile/<path:survex_cave>',     survex.survexcavesingle,    name="survexcavessingle"),
+    path('survexfile/<path:cave_shortname>',  survex.survexcavesingle,    name="survexcavessingle"),
 
     path('survexfilewild',                statistics.svxfilewild, name="svxfilewild"),
     path('survexfilewild/',               statistics.svxfilewild, name="svxfilewild"),