Fog computing has emerged to support the requirements of IoT applications that could not be met by today's solutions. Different initiatives have been presented to drive the development of fog, and much work has been done to improve certain aspects. However, an in-depth analysis of the different solutions, detailing how they can be integrated and applied to meet specific requirements, is still required. In this work, we present a unified architectural model and a new taxonomy, by comparing a large number of solutions. Finally, we draw some conclusions and guidelines for the development of IoT applications based on fog.