diff --git a/src/unit/unit_cache.cpp b/src/unit/unit_cache.cpp
index 46725b49e..3d4f3ee68 100644
--- a/src/unit/unit_cache.cpp
+++ b/src/unit/unit_cache.cpp
@@ -268,11 +268,13 @@ local void QuadTreeInsert(QuadTree* tree,QuadTreeValue* value)
     //
     StatisticNewLeaf(tree);
     leaf=NewQuadTreeLeaf(value,(QuadTreeLeaf*)(*nodep));
-    if( leaf->Next ) {
-	DebugLevel3("More...\n");
-	DebugLevel3("Leaf: %p %p,",leaf,leaf->Value);
-	DebugLevel3("Leaf: %p %p\n",leaf->Next,leaf->Next->Value);
-    }
+    IfDebug(
+	if( leaf->Next ) {
+	    DebugLevel3("More...\n");
+	    DebugLevel3("Leaf: %p %p,",leaf,leaf->Value);
+	    DebugLevel3("Leaf: %p %p\n",leaf->Next,leaf->Next->Value);
+	}
+    );
     *nodep=(QuadTreeNode*)leaf;
 }
 
@@ -301,10 +303,9 @@ local void QuadTreeDelete(QuadTree* tree,QuadTreeValue* value)
     //
     for( level=tree->Levels-1; level>=0; level-- ) {
 	if( !(node=*nodep) ) {
-	    DebugLevel0(__FUNCTION__": Value not found\n");
-	    DebugLevel0(__FUNCTION__": %d,%d\n"
-		    ,QuadTreeValueXOf(value)
-		    ,QuadTreeValueYOf(value));
+	    DebugLevel0Fn("Value not found\n");
+	    DebugLevel0Fn("%d,%d\n"
+		    ,QuadTreeValueXOf(value),QuadTreeValueYOf(value));
 	    return;
 	}
 	stack[1+level]=nodep;
@@ -320,10 +321,9 @@ local void QuadTreeDelete(QuadTree* tree,QuadTreeValue* value)
     for( ;; ) {
 	leaf=*leafp;
 	if( !leaf ) {
-	    DebugLevel0(__FUNCTION__": Value not found\n");
-	    DebugLevel0(__FUNCTION__": %d,%d\n"
-		    ,QuadTreeValueXOf(value)
-		    ,QuadTreeValueYOf(value));
+	    DebugLevel0Fn("Value not found\n");
+	    DebugLevel0Fn("%d,%d\n"
+		    ,QuadTreeValueXOf(value),QuadTreeValueYOf(value));
 	    return;
 	}
 	if( leaf->Value==value ) {
@@ -344,14 +344,12 @@ local void QuadTreeDelete(QuadTree* tree,QuadTreeValue* value)
     if( !*leafp ) {
 	DebugLevel3("SECOND:\n");
 	while( ++level<tree->Levels ) {
-	    // DebugLevel0("CLEANUP: %p -> %p\n",stack[1+level],*stack[1+level]);
 	    nodep=stack[1+level];
 	    node=*nodep;
 	    if( node->Next[0] || node->Next[1]
 		    || node->Next[2] || node->Next[3] ) {
 		break;
 	    }
-	    // DebugLevel0("LAST-CHILD\n");
 	    *nodep=NULL;
 	    DebugLevel3("FREE: %p %p\n",nodep,node);
 	    QuadTreeNodeFree(node);
@@ -436,8 +434,7 @@ local int SelectQuadTreeLeaf(QuadTreeLeaf* leaf,QuadTreeValue** table,int index)
     if( leaf ) {
 	while( leaf ) {
 	    DebugLevel3("%d,%d "
-		,QuadTreeValueXOf(leaf->Value)
-		,QuadTreeValueYOf(leaf->Value));
+		,QuadTreeValueXOf(leaf->Value),QuadTreeValueYOf(leaf->Value));
 	    table[index++]=leaf->Value;
 	    leaf=leaf->Next;
 	}
@@ -613,7 +610,7 @@ local QuadTree* PositionCache;		/// My quad tree for lookup
 */
 global void UnitCacheInsert(Unit* unit)
 {
-    DebugLevel3(__FUNCTION__": Insert UNIT %8p %08ZX\n",unit,UnitNumber(unit));
+    DebugLevel3Fn("Insert UNIT %8p %08ZX\n",unit,UnitNumber(unit));
     QuadTreeInsert(PositionCache,unit);
 }
 
@@ -624,7 +621,7 @@ global void UnitCacheInsert(Unit* unit)
 */
 global void UnitCacheRemove(Unit* unit)
 {
-    DebugLevel3(__FUNCTION__": Remove UNIT %8p %08ZX\n",unit,UnitNumber(unit));
+    DebugLevel3Fn("Remove UNIT %8p %08ZX\n",unit,UnitNumber(unit));
     QuadTreeDelete(PositionCache,unit);
 }
 
@@ -680,6 +677,7 @@ global int UnitCacheSelect(int x1,int y1,int x2,int y2,Unit** table)
     //
     for( i=j=0; i<n; ++i ) {
 	unit=table[i];
+
 	if( unit->X+unit->Type->TileWidth<=x1 || unit->X>x2
 		|| unit->Y+unit->Type->TileHeight<=y1 || unit->Y>y2 ) {
 	    continue;
@@ -778,6 +776,11 @@ global void InitUnitCache(void)
 //	Store direct on map.
 //****************************************************************************/
 
+// FIXME: Currently are units only stored at its insertion point on the map
+// FIXME: For many functions it would be better if the units are strored in
+// FIXME: all field that they occupy. This means a 2x2 big building is stored
+// FIXME: in 4 fields.
+
 //*****************************************************************************
 //	Convert calls to internal
 //****************************************************************************/
@@ -811,6 +814,7 @@ global void UnitCacheRemove(Unit* unit)
     for( ;; ) {				// find the unit
 	if( *prev==unit ) {
 	    *prev=unit->Next;
+	    unit->Next=NULL;
 	    return;
 	}
 	prev=&(*prev)->Next;
@@ -870,14 +874,18 @@ global int UnitCacheSelect(int x1,int y1,int x2,int y2,Unit** table)
 	for( i=x; i<x2; ++i ) {
 	    
 	    for( unit=mf->Here.Units; unit; unit=unit->Next ) {
-		DebugLevel3Fn("%p\n",unit);
+		IfDebug(
+		    if( !unit->Type ) {
+			DebugLevel0Fn("%d,%d: %Zd, %d,%d\n"
+			    ,i,y,UnitNumber(unit),unit->X,unit->Y);
+			fflush(stdout);
+		    }
+		);
 		//
 		//	Remove units, outside range.
 		//
-		if( unit->X+unit->Type->TileWidth<=x1
-			|| unit->X>x2
-			|| unit->Y+unit->Type->TileHeight<=y1
-			|| unit->Y>y2 ) {
+		if( unit->X+unit->Type->TileWidth<=x1 || unit->X>x2
+			|| unit->Y+unit->Type->TileHeight<=y1 || unit->Y>y2 ) {
 		    continue;
 		}
 		table[n++]=unit;