Distribution has been a major trend in computing over the last decade. This change affects the way we compute in several ways: microprocessor architectures are multi-core, offering several parallel threads of computation, while large-scale systems distribute storage and computation across several processors, machines, or data centers. To be efficient, software now has to scale, that is, improve its performance when more computation is available. Our group’s research is focused on answering these questions. In particular, we are interested in designing efficient, practical algorithms for fundamental problems in distributed computing, in understanding the inherent limitations of distributed systems, and in new ways to overcome these limitations.