The era of distributed systems is upon us. The Internet revolution, combined with the recent explosion of smart devices, indicate a clear trend toward ubiquitous and pervasive computing that will continue to change the way people live and interact, the way corporations conduct and extend their enterprise business, pushing distributed systems toward inevitably becoming an increasingly important and integral part of everyday life. To realize distributed systems, middleware is needed to integrate diverse heterogeneous software components and to allow them to interoperate effectively, while at the same time providing support for several middleware-specific services/concerns that tend to crosscut the boundaries of software components, such as distribution, concurrency, transactions, or security. In times when software systems in general, and distributed systems in particular, are facing ever more complex environments characterized by openness and variety, with new requirements to satisfy and new (emerging) technologies to adapt to, developers are forced to rely on fundamental techniques of software engineering, such as separation of concerns, modularization, and abstraction, in order to cope with increasing complexity and constant change. Moreover, software development methods are most welcome by developers to assist them in the development of applications so that the complexity of the development process becomes manageable. Unfortunately, currently existing software engineering methods continue to have a strong focus on functional requirements, ignoring more or less non-functional concerns, such as middleware-specific concerns, which have nevertheless to be addressed sooner or later when designing and implementing distributed systems. Typically, such middleware-specific concerns are then postponed down to implementation and deployment time, which may be error prone since not necessarily all developers are aware of all the design decisions that have been made at different stages throughout the development life cycle of the application. Adopting a Model-Driven Engineering (MDE) approach, and adhering to the Object Management Group's Model-Driven Architecture (MDA) standardization initiative for MDE, we advocate in this thesis that such middleware-specific concerns should already be addressed at higher levels of abstraction before moving to their concrete implementation on a specific middleware platform. Moreover, despite their crosscutting nature, appropriate modularization units have to be devised to encapsulate such middleware-specific concerns at each level of abstraction so that they do not hinder the analysis and design of the business logic. Different stakeholders may then reason about the core functionality and the different non-functional concerns separately. Furthermore, a clear methodology is needed to describe the sequence of (concern-aware) models to be developed, and how exactly to derive a (concern- aware) model from another one at the abstraction level immediately above it. This thesis makes a number of contributions toward applying model-driven engineering and aspect-oriented techniques to improve the separation of middleware-specific crosscutting concerns at different levels of abstraction throughout the development life cycle of middleware-mediated distributed applications. A new software development method, called Enterprise Fondue, proposes a systematic approach to distributed systems development by addressing middleware-specific concerns in an MDA-compliant manner, at different levels of abstraction, through incremental refinement steps along middleware-specific concern-dimensions. Focusing only on the Unified Modeling Language (UML) support for MDE, hierarchies of MDA-Concern-Oriented UML Profiles are proposed for addressing middleware-specific concerns at different MDA-levels of abstraction. For automating the Enterprise Fondue refining process, INRIA's Model Transformation Language (MTL) is used to define model transformations that enable developers to incrementally refine their design models along middleware-specific concern-dimensions according to the corresponding MDA-Concern-Oriented UML profiles. In order to enable transformation developers to rely on aspect-oriented techniques to achieve better separation of (middleware-specific) crosscutting concerns even at the level of model transformations, we designed and implemented an aspect-oriented extension to MTL, called AspectMTL, which provides support for aspect-oriented model transformations. The MTL weaver that we have implemented modifies MTL transformations according to some weaving behavior that is specified in terms of weaving directives modularized in special stand-alone MTL transformation encapsulation units called MTL-aspects. Finally, we implemented Parallax, which provides developers with integrated MDA Eclipse tool support for developing middleware-mediated distributed systems following the Enterprise Fondue method. Furthermore, Parallax enables developers to view their enhanced designs through a prism of middleware platforms and see how middleware-specific concerns are actually implemented at the code level. Designed as a framework of plugins, with well-defined extension points, external contributors may enrich Parallax by implementing and providing the community with new plug-ins addressing more middleware-specific concerns at any level of abstraction in the refinement process.