We consider a terminal operator who provides container handling services at multiple terminals within the same port. In this setting, the well-known berth allocation problem can no longer be considered for each terminal in isolation since vessel calls should be spread over the various terminals to avoid peaks and troughs in quay crane utilization, and an allocation of two connecting vessels to different terminals will generate inter-terminal container transport. In this paper, we address the problem of spreading a set of cyclically calling vessels over the various terminals and allocating a berthing and departure time to each of them. The objectives are (1) to balance the quay crane workload over the terminals and over time and (2) to minimize the amount of inter-terminal container transport. We develop a solution approach based on mixed-integer programming that allows to solve real-life instances of the problem within satisfactory time. Additionally, a practical case study is presented based on data from the terminal operator PSA Antwerp who operates multiple terminals in the port of Antwerp, Belgium. The computational results show the cost of the currently agreed schedules, and that relatively small modifications can significantly reduce the required crane capacities and inter-terminal transport.