Whirl with some optimizations