Meta-modelling is one of the pillars of Model-Driven Engineering (MDE), where it is used for language engineering and domain modelling. Even though the current trend is the use of two-level meta-modelling frameworks, several researchers have pointed out limitations of this scheme for some scenarios and suggested a metamodelling approach with an arbitrary number of meta-levels in order to obtain more flexible and simpler system descriptions. Unfortunately, such multi-level meta-modelling systems are still in their infancy, lacking for example, integration with model manipulation languages, a characterization of different possibilities for instantiation and inheritance, and primitives for interconnecting multi-level languages in a flexible way. In this paper, we propose a number of extensions to multi-level (also called deep) meta-modelling, based on the needs raised by its use for practical MDE. In particular, we discuss on the issues related to code generation from deep languages, the benefits of allowing inheritance at every meta-level, and patterns and techniques for a fine-grain control of the meta-level of elements. Finally, we provide primitives to control the impedance mismatch when connecting models at different meta-levels.