diff --git a/core/models/caves.py b/core/models/caves.py
index 7cec9a9..14902ff 100644
--- a/core/models/caves.py
+++ b/core/models/caves.py
@@ -712,14 +712,14 @@ def GetCaveLookup():
         ("loveshack", "1626-2018-ad-03"),
         ("crushed-garlic", "1626-2018-ad-03"),
        
-        # Renaming cave ids which end in a letter
-        ("2002-XX", "1623-2002-FB-01"),
-        ("2002-X09B", "1623-2002-XB09"),
-        ("2007-neu", "1623-2007-NEU-01"),
-        ("BuzzardHole", "1626-2023-BZ-01"),
-        ("2023-BuzzardHole", "1626-2023-BZ-01"),
-        ("1626-2023-BuzzardHole", "1626-2023-BZ-01"),
-        ("1626-2023-buzzardhole","1626-2023-BZ-01"),
+        # Renaming cave ids which end in a letter NB targets must be LOWER CASE
+        ("2002-XX", "1623-2002-fb-01"),
+        ("2002-X09B", "1623-2002-xb09"),
+        ("2007-neu", "1623-2007-neu-01"),
+        ("BuzzardHole", "1626-2023-Bbz-01"),
+        ("2023-BuzzardHole", "1626-2023-bz-01"),
+        ("1626-2023-BuzzardHole", "1626-2023-bz-01"),
+        ("1626-2023-buzzardhole","1626-2023-bz-01"),
        
     ]
 
@@ -737,9 +737,15 @@ def GetCaveLookup():
                     # Gcave_count[key] += 1
             Gcavelookup[key] = Gcavelookup[alias]
         else:
-            message = f" *  Coding or cave existence mistake, cave for id '{alias}' does not exist. Expecting to set alias '{key}' to it"
-            print(message)
-            DataIssue.objects.update_or_create(parser="aliases", message=message)
+            if alias.lower() in Gcavelookup:
+                Gcavelookup[key] = Gcavelookup[alias.lower()]
+                message = f" - Warning, capitalisation error in alias list. cave for id '{alias}' does not exist but {alias.lower()} does."
+                print(message)
+                DataIssue.objects.update_or_create(parser="aliases", message=message)
+            else:
+                message = f" *  Coding or cave existence mistake, cave for id '{alias}' does not exist. Expecting to set alias '{key}' to it"
+                print(message)
+                DataIssue.objects.update_or_create(parser="aliases", message=message)
 
     addmore = {}
     for id in Gcavelookup:
diff --git a/parsers/caves.py b/parsers/caves.py
index ff54c41..0bf3520 100644
--- a/parsers/caves.py
+++ b/parsers/caves.py
@@ -464,6 +464,9 @@ def read_entrance(filename, ent=None):
       Returns:
         The entrance object, or a new entrance object if `ent` is None.
       """
+    def getXMLmin0(field):
+        return getXML(entrancecontents, field, minItems=0, maxItems=1, context=context) 
+
     def getXMLmax1(field):
         return getXML(entrancecontents, field, maxItems=1, context=context)
         
@@ -508,7 +511,7 @@ def read_entrance(filename, ent=None):
         return None
 
     entrancecontents = entrancecontentslist[0]
-    slugs = getXML(entrancecontents, "slug", context=context)
+    slugs = getXMLmin0("slug")
     # we ignore all these, because we now just use the filename. But if they are there, we validate them.
     if len(slugs) > 0 :
         slug = slugs[0]
@@ -519,8 +522,8 @@ def read_entrance(filename, ent=None):
             DataIssue.objects.create(parser="entrances", message=message, url=cave_edit_url)
             print(message)
             
-        if slug != entslug_fn:
-            message = f" ! - Warning, mismatch between entrance slug and filename:  {slug=} {filename=}. Ignoring slug field, using filename."
+        if slug and slug != entslug_fn:
+            message = f" ! - Warning, mismatch between entrance slug (or unofficial name) and filename:  {slug=} {filename=}. Ignoring slug field, using filename."
             DataIssue.objects.create(parser="xEntrances", message=message, url=cave_edit_url)
             print(message)
     slug = entslug_fn # force 
@@ -604,8 +607,11 @@ def read_cave(filename, mvf=None, cave=None):
         elements = xml_root.findall(t)
 
     """
+    def getXMLmin0(field):
+        return getXML(cavecontents, field, minItems=0, maxItems=1, context=context) 
+
     def getXMLmax1(field):
-        return getXML(cavecontents, field, maxItems=1, context=context)
+        return getXML(cavecontents, field, minItems=0, maxItems=1, context=context)
         
     def do_entrances():
         """For both bulk import and individual re-reading of cave_data file,
@@ -813,11 +819,13 @@ def read_cave(filename, mvf=None, cave=None):
     #kataster_status = getXMLmax1("kataster_status")
     #underground_centre_line = getXMLmax1("underground_centre_line")
     notes = getXMLmax1("notes")
-    length = getXMLmax1("length")
-    depth = getXMLmax1("depth")
-    extent = getXMLmax1("extent")
     survex_file = getXMLmax1("survex_file")
     description_file = getXMLmax1("description_file")
+
+    length = getXMLmin0("length")
+    depth = getXMLmin0("depth")
+    extent = getXMLmin0("extent")
+    
     areacode = slug[:4]
  
     contextguess  = f"/{slug[0:4]}/{slug}_cave_edit/" 
@@ -870,9 +878,12 @@ def read_cave(filename, mvf=None, cave=None):
     #cave.kataster_status=kataster_status[0]
     #cave.underground_centre_line=underground_centre_line[0]
     cave.notes=notes[0]
-    cave.length=length[0]
-    cave.depth=depth[0]
-    cave.extent=extent[0]
+    if length:
+        cave.length=length[0]
+    if depth:
+        cave.depth=depth[0]
+    if extent:
+        cave.extent=extent[0]
     cave.survex_file=survex_file[0]
     cave.description_file=description_file[0]
     # cave.url=url[0] # set algorithically: