Software systems have become business-critical for many companies. These systems are usually large and complex. Some have evolved over decades and therefore are known as legacy systems. These legacy systems need to be maintained and evolved due to many factors, including error correction, requirements change, business rules change, structural reorganization , etc. A fundamental problem in maintaining and evolving legacy systems is to understand the subject system. Reverse engineering is the process of analyzing a subject system (a) to identify the system's components and their interrelationships and (b) to create representations of the system in another form or at a higher level of abstraction. In this chapter, we will discuss the problems, process, technologies, tools and future directions of reverse engineering.