recursive cleanup