The evolution of smartphones has given rise to urban-area applications: applications that communicate in a city by means of the public (moving) infrastructure (e.g., buses and trams). In this setting, applications need to communicate with and discover each other using intermediaries that move around the city and transfer data between them. This requires programmers to scatter code that deals with routing messages to the correct place and deal with network failures all over their programs. Our approach allows the programmer to specify urban-area applications in a high-level manner without the burden of directly encoding communication using intermediaries. We present this as a translation from a high-level object-oriented programming paradigm to a low-level communication mechanism. This translation allows the programmer to restrict routing of messages to, for example, a certain number of hops, geographic areas, or even types of carrier devices. In addition, we show how high-level group messaging can be efficiently represented in the low-level communication. Finally, we document our experiences in setting up a small-scale real-world urban-area application.