diff --git a/core/admin.py b/core/admin.py
index fb3173a..e10b847 100644
--- a/core/admin.py
+++ b/core/admin.py
@@ -57,6 +57,7 @@ class PersonTripInline(admin.TabularInline):
 #class LogbookEntryAdmin(VersionAdmin):
 class LogbookEntryAdmin(TroggleModelAdmin):
     prepopulated_fields = {'slug':("title",)}
+    raw_id_fields = ('cave','author')    
     search_fields = ('title','expedition__year')
     date_heirarchy = ('date')
     inlines = (PersonTripInline, PhotoInline, QMsFoundInline)
diff --git a/core/templatetags/wiki_markup.py b/core/templatetags/wiki_markup.py
index 31c5671..ab4ccce 100644
--- a/core/templatetags/wiki_markup.py
+++ b/core/templatetags/wiki_markup.py
@@ -145,7 +145,8 @@ def wiki_to_html_short(value, autoescape=None):
     #make subcave links
     value = re.sub("\[\[\s*subcave:(.+)\|(.+)\]\]",r'<a href="%s/subcave/\1/">\2</a>' % url_root, value, re.DOTALL)
     #make cavedescription links
-    value = re.sub("\[\[\s*cavedescription:(.+)\|(.+)\]\]",r'<a href="%s/cavedescription/\2/">\2</a>' % url_root, value, re.DOTALL)
+    value = re.sub("\[\[\s*cavedescription:(.+)\|(.+)\]\]",r'<a href="%s/cavedescription/\1/">\2</a>' % url_root, value, re.DOTALL)
+
 
 
     #Make lists from lines starting with lists of [stars and hashes]
diff --git a/core/views_caves.py b/core/views_caves.py
index 3f01c2f..04f2120 100644
--- a/core/views_caves.py
+++ b/core/views_caves.py
@@ -37,7 +37,7 @@ def qm(request,cave_id,qm_id,year,grade=None):
         return render_with_context(request,'qm.html',locals())
 
     except QM.DoesNotExist:
-        url=urlparse.urljoin(settings.URL_ROOT, r'/admin/expo/qm/add/'+'?'+  r'number=' + qm_id)
+        url=urlparse.urljoin(settings.URL_ROOT, r'/admin/core/qm/add/'+'?'+  r'number=' + qm_id)
         if grade:
             url += r'&grade=' + grade
         return HttpResponseRedirect(url)
@@ -76,5 +76,4 @@ def survey(request,year,wallet_number):
 
 def cave_description(request, cavedescription_name):
     cave_description = get_object_or_404(CaveDescription, short_name = cavedescription_name)
-    print cave_description.long_name
     return render_with_context(request,'cave_description.html', locals())
\ No newline at end of file
diff --git a/core/views_other.py b/core/views_other.py
index c2c82ee..e3ecb10 100644
--- a/core/views_other.py
+++ b/core/views_other.py
@@ -161,7 +161,7 @@ def logbook_entry_suggestions(request):
     Generates a html box with suggestions about what to do with QMs
     in logbook entry text.
     """
-    unwiki_QM_pattern=r"(?P<whole>(?P<explorer_code>[ABC]?)(?P<cave>\d*)-?(?P<year>\d\d\d?\d?)-(?P<number>\d\d)(?P<grade>[ABCDXV]?)(?=\s))"
+    unwiki_QM_pattern=r"(?P<whole>(?P<explorer_code>[ABC]?)(?P<cave>\d*)-?(?P<year>\d\d\d?\d?)-(?P<number>\d\d)(?P<grade>[ABCDXV]?))"
     unwiki_QM_pattern=re.compile(unwiki_QM_pattern)
     #wikilink_QM_pattern=settings.QM_PATTERN
     
@@ -174,18 +174,24 @@ def logbook_entry_suggestions(request):
     
     print unwiki_QMs
     for qm in unwiki_QMs:
-        if len(qm['year'])==2:
-            if int(qm['year'])<50:
-                qm['year']='20'+qm['year']
-            else:
-                qm['year']='19'+qm['year']
+        #try:
+            if len(qm['year'])==2:
+                if int(qm['year'])<50:
+                    qm['year']='20'+qm['year']
+                else:
+                    qm['year']='19'+qm['year']
 
-        temp_QM=QM(found_by=lbo,number=qm['number'],grade=qm['grade'])
-        try:
-            temp_QM.grade=unwiki_QM['grade']
-        except:
-            pass
-        qm['wikilink']=temp_QM.wiki_link()
+            if lbo.date.year!=int(qm['year']):
+                try:
+                    lbo=LogbookEntry.objects.get(date__year=qm['year'],title__icontains="placeholder for QMs in")
+                except:
+                    print "failed to get placeholder for year "+str(qm['year'])
+            
+            temp_QM=QM(found_by=lbo,number=qm['number'],grade=qm['grade'])
+            temp_QM.grade=qm['grade']
+            qm['wikilink']=temp_QM.wiki_link()
+        #except:
+            #print 'failed'
 
     print unwiki_QMs
     
diff --git a/parsers/descriptions.py b/parsers/descriptions.py
index 108a892..2bca267 100644
--- a/parsers/descriptions.py
+++ b/parsers/descriptions.py
@@ -39,7 +39,7 @@ def parseDescriptions():
 
         cd.save()
 
-def parseDescriptionsInCaveObjects():
+def parseDescriptionsOnCaveObjects():
     for cave in models.Cave.objects.all():
         cave.underground_description=html_to_wiki(unicode(cave.underground_description))
         cave.save()
\ No newline at end of file
diff --git a/templates/base.html b/templates/base.html
index 23e90ae..7f5a278 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -13,7 +13,7 @@
 
 {% block head %}{% endblock %}
 </head>
-<body>
+<body  onLoad="contentHeight();">
 
 <div id="header"> 
   <h1>CUCC Expeditions to Austria: 1976 - 2009</h1>
diff --git a/templates/calendar.html b/templates/calendar.html
index 5ff2778..0bc7dfd 100644
--- a/templates/calendar.html
+++ b/templates/calendar.html
@@ -59,7 +59,7 @@
     		{% for personexpedition in expedition.personexpedition_set.all %}
             	<tr>
                       <td class="name">
-                          <a href="">{{ personexpedition.person }}</a>
+                          <a href="{{ personexpedition.person.get_absolute_url }}">{{ personexpedition.person }}</a>
                           
                       </td>
                       {% if personexpedition.ListDaysTF %}
diff --git a/templates/cave_description.html b/templates/cave_description.html
index 12b9e1b..572de78 100644
--- a/templates/cave_description.html
+++ b/templates/cave_description.html
@@ -1,6 +1,6 @@
 {% extends "cavebase.html" %}
 {% load wiki_markup %}
-{% block title %} {{cave_description.short_name}} {% endblock title %}
+{% block title %} {{cave_description}} {% endblock title %}
 {% block editLink %}<a href={{cave_description.get_admin_url}}>Edit description {{cave_description}}</a>{% endblock %}
 
 {% block contentheader %}
diff --git a/templates/survexblock.html b/templates/survexblock.html
index d4447af..eaf06e5 100644
--- a/templates/survexblock.html
+++ b/templates/survexblock.html
@@ -31,7 +31,7 @@
 <table>
 {% for personrole in survexblock.GetPersonroles %}
 <tr>
-  <td><a href="{{personrole.get_absolute_url}}">{{personrole.person}}</a></td>
+  <td><a href="{{personrole.person.get_absolute_url}}">{{personrole.person}}</a></td>
   <td>{{personrole.roles}}</td>
 </tr>
 {% endfor %}
diff --git a/urls.py b/urls.py
index a128bd3..fd148c8 100644
--- a/urls.py
+++ b/urls.py
@@ -32,7 +32,8 @@ urlpatterns = patterns('',
 
     url(r'^survexblock/(.+)$',  views_caves.survexblock,    name="survexblock"),
     url(r'^cave/(?P<cave_id>[^/]+)/?$', views_caves.cave, name="cave"),
-    url(r'^cavedescription/(?P<cavedescription_name>[^/]*)/$', views_caves.cave_description, name="cavedescription"),
+    url(r'^cavedescription/(?P<cavedescription_name>[^/]+)/?$', views_caves.cave_description, name="cavedescription"),
+    url(r'^cavedescription/?$', object_list, {'queryset':CaveDescription.objects.all(),'template_name':'object_list.html'}, name="cavedescriptions"),
     #url(r'^cavehref/(.+)$',     views_caves.cave,       name="cave"),url(r'cave'),
 
     url(r'^jgtfile/(.*)$',      view_surveys.jgtfile,       name="jgtfile"),
diff --git a/utils.py b/utils.py
index 69aa9c8..b6ecf40 100644
--- a/utils.py
+++ b/utils.py
@@ -102,7 +102,7 @@ def href_to_wikilinks(matchobj):
     if res:
         return r'[[cavedescription:'+res[0].short_name+'|'+res[0].long_name+']]'
     else:
-        return matchobj
+        return matchobj.group()
     #except:
         #print 'fail'
     
@@ -115,13 +115,15 @@ re_subs = [(re.compile(r"\<b[^>]*\>(.*?)\</b\>", re.DOTALL), r"'''\1'''"),
            (re.compile(r"\<h4[^>]*\>(.*?)\</h4\>", re.DOTALL), r"====\1===="),
            (re.compile(r"\<h5[^>]*\>(.*?)\</h5\>", re.DOTALL), r"=====\1====="),
            (re.compile(r"\<h6[^>]*\>(.*?)\</h6\>", re.DOTALL), r"======\1======"),
+           (re.compile(r'(<a href="?(?P<target>.*)"?>)?<img class="?(?P<class>\w*)"? src="?t/?(?P<source>[\w/\.]*)"?(?P<rest>></img>|\s/>(</a>)?)', re.DOTALL),r'[[display:\g<class> photo:\g<source>]]'), #
            (re.compile(r"\<a\s+id=['\"]([^'\"]*)['\"]\s*\>(.*?)\</a\>", re.DOTALL), r"[[subcave:\1|\2]]"), #assumes that all links with id attributes are subcaves. Not great.
            #interpage link needed
-           (re.compile(r"\<a\s+href=['\"]#([^'\"]*)['\"]\s*\>(.*?)\</a\>", re.DOTALL), r"[[cavedescription:\1|\2]]"), #assumes that all links with target ids are subcaves. Not great.
+           (re.compile(r"\<a\s+href=['\"]#([^'\"]*)['\"]\s*\>(.*?)\</a\>", re.DOTALL), r"[[cavedescription:\1|\2]]"), #assumes that all links with target ids are cave descriptions. Not great.
            (re.compile(r"\[\<a\s+href=['\"][^'\"]*['\"]\s+id=['\"][^'\"]*['\"]\s*\>([^\s]*).*?\</a\>\]", re.DOTALL), r"[[qm:\1]]"),
-
-# BUGGED!
-#           (re.compile(r'<a\shref="?(?P<target>.*)"?>(?P<text>.*)</a>'),href_to_wikilinks)
+           
+           #BUGGED!
+           (re.compile(r'<a\shref="?(?P<target>.*)"?>(?P<text>.*)</a>'),href_to_wikilinks),
+           
 
            ]