Generic algorithm