Abstract: Software Engineering is much more than development of new software; it also involves understanding, maintenance, re-engineering and quality assurance of software. In these and other processes, Reverse Engineering plays an important role, especially in legacy systems. In Software Understanding, Reverse Engineering is vital since it abstracts detailed information and presents structured knowledge of software to the user. In the same way, it allows performing maintenance activities in a more controlled way because it provides information to measure the impact of changes. Reverse Engineering also gives useful information about how a system is designed and allows assessing software from many perspectives, for example, to identify software clones or to measure some attributes such as coupling or cohesion. This chapter presents an overview of some techniques in the field, an analysis of their applicability in an industrial procedural software system, and some future trends that will direct research in this discipline.