diff --git a/functions/cache.sh b/functions/cache.sh
index c2978318e..2b75266d6 100755
--- a/functions/cache.sh
+++ b/functions/cache.sh
@@ -36,7 +36,9 @@ Save_cache ()
 	if [ "${LB_CACHE}" = "true" ] && [ "${LB_CACHE_PACKAGES}" = "true" ]
 	then
 		# Cleaning current cache
-		Chroot chroot "apt-get autoclean"
+		# In case of interrupted or incomplete builds, this may return an error,
+		# but we still do want to save the cache.
+		Chroot chroot "apt-get autoclean" || true
 
 		if ls chroot/var/cache/apt/archives/*.deb > /dev/null 2>&1
 		then
diff --git a/functions/exit.sh b/functions/exit.sh
index b6f2e2bfe..ad17c1e50 100755
--- a/functions/exit.sh
+++ b/functions/exit.sh
@@ -35,6 +35,19 @@ Exit ()
 		done
 	fi
 
+	Echo_message "Saving chaches..."
+
+	# We can't really know at which part we're failing,
+	# but let's assume that if there's any binary stage file arround
+	# we are in binary stage.
+
+	if ls .stage/binary* > /dev/null 2>&1
+	then
+		Save_cache cache/packages_binary
+	else
+		Save_cache cache/packages_chroot
+	fi
+
 	return ${VALUE}
 }