diff --git a/Makefile b/Makefile
index 0df2757190f5ab0416cee6942e3a8f8c2c2e9602..2fec53cd53e122b4d37bc1f27b31f71d4a4530f5 100644
--- a/Makefile
+++ b/Makefile
@@ -12,6 +12,14 @@ doc:
 docclean:
 	"$(MAKE)" -BC doc/doxygen clean
 
+clean:
+	@echo "Cleaning all build products for the current board"
+	@find ./pkg/ ./examples/ ./tests/ -maxdepth 2 -mindepth 2 -type f -name Makefile -execdir "${MAKE}" clean ';'
+
+distclean: docclean
+	@echo "Cleaning all build products"
+	@find ./pkg/ ./examples/ ./tests/ -maxdepth 2 -mindepth 2 -type f -name Makefile -execdir "${MAKE}" distclean ';'
+
 welcome:
 	@echo "Welcome to RIOT - The friendly OS for IoT!"
 	@echo ""
diff --git a/Makefile.include b/Makefile.include
index 45f0e07c65b11237d037f38013b6f7061aaa399a..067a860ec8a31dd209c79a680cadfb00bd34369e 100644
--- a/Makefile.include
+++ b/Makefile.include
@@ -174,8 +174,12 @@ $(USEPKG:%=${BINDIR}%.a):
 	"$(MAKE)" -C $(RIOTBASE)/pkg/$(patsubst ${BINDIR}%.a,%,$@)
 
 clean:
-	@for i in $(USEPKG) ; do "$(MAKE)" -C $(RIOTBASE)/pkg/$$i clean || exit 1; done
-	rm -rf $(BINDIR) $(CLEANFILES)
+	-@for i in $(USEPKG) ; do "$(MAKE)" -C $(RIOTBASE)/pkg/$$i clean ; done
+	-@rm -rf $(BINDIR) $(CLEANFILES)
+
+distclean:
+	-@for i in $(USEPKG) ; do "$(MAKE)" -C $(RIOTBASE)/pkg/$$i distclean ; done
+	-@rm -rf $(BINDIRBASE) $(CLEANFILES)
 
 flash: all
 	$(FLASHER) $(FFLAGS)