diff --git a/src/ui/botpanel.cpp b/src/ui/botpanel.cpp
index ba5e8ba41..5528fb0d8 100644
--- a/src/ui/botpanel.cpp
+++ b/src/ui/botpanel.cpp
@@ -348,16 +348,24 @@ int AddButton(int pos, int level, const char *icon_ident,
     return 1;
 }
 
-/// FIXME: docu
+/**
+**	Cleanup buttons.
+*/
 global void DoneButtons(void)
 {
     int z;
 
     for (z = 0; z < UnitButtonCount; z++) {
 	DebugCheck(!UnitButtonTable[z]);
-	free(UnitButtonTable[z]->ValueStr);
-	free(UnitButtonTable[z]->Hint);
-	free(UnitButtonTable[z]->UnitMask);
+	if( UnitButtonTable[z]->ValueStr ) {
+	    free(UnitButtonTable[z]->ValueStr);
+	}
+	if( UnitButtonTable[z]->Hint ) {
+	    free(UnitButtonTable[z]->Hint);
+	}
+	if( UnitButtonTable[z]->UnitMask ) {
+	    free(UnitButtonTable[z]->UnitMask);
+	}
 	free(UnitButtonTable[z]);
     }
     UnitButtonCount = 0;
diff --git a/src/ui/script_ui.cpp b/src/ui/script_ui.cpp
index d41ddbc67..3213aaff1 100644
--- a/src/ui/script_ui.cpp
+++ b/src/ui/script_ui.cpp
@@ -1198,10 +1198,18 @@ local SCM CclDefineButton(SCM list)
     }
     AddButton(ba.Pos,ba.Level,ba.Icon.Name,ba.Action,ba.ValueStr,
 	    ba.Allowed,ba.AllowStr,ba.Key,ba.Hint,ba.UnitMask);
-    free(ba.ValueStr);
-    free(ba.AllowStr);
-    free(ba.Hint);
-    free(ba.UnitMask);
+    if( ba.ValueStr ) {
+	free(ba.ValueStr);
+    }
+    if( ba.AllowStr ) {
+	free(ba.AllowStr);
+    }
+    if( ba.Hint ) {
+        free(ba.Hint);
+    }
+    if( ba.UnitMask ) {
+        free(ba.UnitMask);
+    }
 
     return SCM_UNSPECIFIED;
 }
diff --git a/src/unit/upgrade.cpp b/src/unit/upgrade.cpp
index d991a1f43..884e93d49 100644
--- a/src/unit/upgrade.cpp
+++ b/src/unit/upgrade.cpp
@@ -1102,7 +1102,9 @@ local SCM CclDefineUpgrade(SCM list)
 	if( gh_eq_p(value,gh_symbol2scm("icon")) ) {
 	    //	Icon
 
-	    free(icon);
+	    if( icon ) {
+		free(icon);
+	    }
 	    icon=gh_scm2newstr(gh_car(list),NULL);
 	    list=gh_cdr(list);
 	} else if( gh_eq_p(value,gh_symbol2scm("costs")) ) {