A large number of interesting graph-theoretic problems are NP-hard. Nevertheless, many of these problems can be solved efficiently when restricted to classes of graphs obtained by bounding the magnitude of some structural parameter. In this series of lectures, we will be revisiting several of these structural parameters, as well as techniques to develop efficient (dynamic programming) algorithms for corresponding restrictions of NP-hard problems. In particular, we will be addressing several notions of decomposition, width measures, algorithmic meta-theorems and their connections to fields such as logic and automata theory.