diff -ur survex-1.1.16//src/gfxcore.cc ../survex-1.1.16/src/gfxcore.cc
--- survex-1.1.16//src/gfxcore.cc	2011-05-15 05:17:02.000000000 +0100
+++ ../survex-1.1.16/src/gfxcore.cc	2011-09-13 00:12:23.402733914 +0100
@@ -272,6 +272,54 @@
 //  Recalculating methods
 //
 
+void GfxCore::DoMyBidding(void)
+{
+	static LabelInfo *(*evil)[300];
+	static double minz = 9999999, maxz=-9999999;
+
+	if (!evil) {
+		evil = (LabelInfo *(*)[300])calloc(300 * 300, sizeof(LabelInfo *));
+		if (!evil) {
+			fprintf(stderr, "ARRGH\n");
+			return;
+		}
+		list<LabelInfo*>::iterator pos = m_Parent->m_Labels.begin();
+		while (pos != m_Parent->m_Labels.end()) {
+			LabelInfo* label = *pos++;
+
+			const wchar_t *str = label->GetText().c_str();
+			int n, e, rv;
+			//rv = swscanf(str, L"srtm-7x9-m31-482-279-offset.n%de%d", &n, &e);
+			rv = swscanf(str, L"srtm.n%de%d", &n, &e);
+			if (rv < 2)
+				continue;
+			evil[n][e] = label;
+			if (label->GetZ() > -1000 && label->GetZ() < minz)
+				minz = label->GetZ();
+			if (label->GetZ() > maxz)
+				maxz = label->GetZ();
+		}
+	}
+
+	double zrange = maxz - minz;
+	for (int n = 0; n < 299; n++)
+		for (int e = 0; e < 299; e++)
+			if (evil[n][e] && evil[n][e + 1] && evil[n + 1][e] && evil[n + 1][e + 1]) {
+				if (evil[n][e]->GetZ() < -1000 || evil[n][e+1]->GetZ() < -1000 || evil[n+1][e]->GetZ() < -1000 || evil[n+1][e+1]->GetZ() < -1000)
+					continue;
+				glBegin(GL_QUADS);
+				glColor4f(.01f + (evil[n][e]->GetZ() - minz) * .99f / zrange, 0.f, 0.f, 0.67f);
+				glVertex3d(evil[n][e]->GetX(), evil[n][e]->GetY(), evil[n][e]->GetZ());
+				glColor4f(.01f + (evil[n][e+1]->GetZ() - minz) * .99f / zrange, 0.f, 0.f, 0.67f);
+				glVertex3d(evil[n][e+1]->GetX(), evil[n][e+1]->GetY(), evil[n][e+1]->GetZ());
+				glColor4f(.01f + (evil[n+1][e+1]->GetZ() - minz) * .99f / zrange, 0.f, 0.f, 0.67f);
+				glVertex3d(evil[n+1][e+1]->GetX(), evil[n+1][e+1]->GetY(), evil[n+1][e+1]->GetZ());
+				glColor4f(.01f + (evil[n+1][e]->GetZ() - minz) * .99f / zrange, 0.f, 0.f, 0.67f);
+				glVertex3d(evil[n+1][e]->GetX(), evil[n+1][e]->GetY(), evil[n+1][e]->GetZ());
+				glEnd();
+			}
+}
+
 void GfxCore::SetScale(Double scale)
 {
     // Fill the plot data arrays with screen coordinates, scaling the survey
@@ -386,6 +434,8 @@
 	    DrawList(LIST_CROSSES);
 	}
 
+	DoMyBidding();
+
 	SetIndicatorTransform();
 
 	// Draw station names.
diff -ur survex-1.1.16//src/gfxcore.h ../survex-1.1.16/src/gfxcore.h
--- survex-1.1.16//src/gfxcore.h	2010-08-20 11:20:44.000000000 +0100
+++ ../survex-1.1.16/src/gfxcore.h	2011-09-12 13:04:50.248426991 +0100
@@ -264,6 +264,8 @@
     void Initialise(bool same_file);
     void InitialiseTerrain();
 
+    void DoMyBidding();
+
     void UpdateBlobs();
     void ForceRefresh();
 
diff -ur survex-1.1.16//src/mainfrm.h ../survex-1.1.16/src/mainfrm.h
--- survex-1.1.16//src/mainfrm.h	2010-08-20 13:24:27.000000000 +0100
+++ ../survex-1.1.16/src/mainfrm.h	2011-09-12 13:06:48.470205655 +0100
@@ -210,7 +210,6 @@
     list<traverse> traverses;
     list<traverse> surface_traverses;
     list<vector<XSect> > tubes;
-    list<LabelInfo*> m_Labels;
     Vector3 m_Ext;
     Double m_DepthMin, m_DepthExt;
     int m_DateMin, m_DateExt;
@@ -270,6 +269,8 @@
 
     void InitialiseAfterLoad(const wxString & file);
 
+    list<LabelInfo*> m_Labels;
+
     void OnMRUFile(wxCommandEvent& event);
     void OpenFile(const wxString& file, wxString survey = wxString());
 
