: As mobile and embedded computing devices become more pervasive, it is becoming obvious that the nature of interactions between users and computers must evolve. Applications need to become increasingly autonomous and invisible, by placing greater reliance on knowledge of context and reducing interactions with users. Moreover, applications must cope with highly dynamic environments in which resources, such as network connectivity and software services, frequently vary over time. This paper presents our vision of pervasive computing and enumerates the software engineering challenges involved in realizing this vision. It also evaluates the current state of research and presents an agenda for future investigations in pervasive computing.