Programmable embedded systems are ubiquitous nowadays, and their number will further increase with the emergence of Ambient Intelligence. One of the first challenges for embedded systems is mastering the increasing complexity of future Systems on Chip (SoC). The complexity will increase relentlessly because the applications will become more and more demanding with the algorithmic complexity growing exponentially over time. Performances can only be reached by using all forms of parallelism. This will bring the challenges of designing multi-core systems using all possible levels of parallelism to reach the required performance density, of extracting all the parallelism from the application(s) and of efficiently mapping this efficiency to the hardware. But for most embedded systems, a main challenge is in having sustained performances, not peak: guaranteed performances, and predictable timing behavior are important, together with Quality of Service, safety, reliability and dependability. The notion of time is key in embedded systems, and most of the current methods and tools, inherited from mainstream computer science, did not really cope with this extra requirement. The new technology nodes (65nm, soon 45nm) will also bring their own challenges: the global interconnect delay does not scale with logic, the leakage power will be more and more important, and the increasing variability of components will be major problems for the design of complex systems. Assembling systems with {\em unpredictable} elements will increase the global system unpredictability. Also, systems are not really designed with {\em separation of concern}in mind, and due to shared resources, a slight change can have a drastic impact. Major breakthroughs will be required in compiler technology and in mapping tools, both in term of correctness and in terms of performance to achieve an efficient use of resources (performance- and power-wise), but also for the debug, validation and test of the system. Systems can no longer be verified with simulations, and we will need new validation approaches. Otherwise, the unpredictability and unreliability due to the combination of use cases will make the systems practically unusable.