This course aims to give the students an overview of bilevel programming which allow them to acquire an understanding of its special features. In the first part of the course, main differences with single level mathematical problems and other approaches used to manage multiple objectives or multiple decision makers are identified. This part finishes by formulating the problem and presenting the main difficulties found when dealing with it. The second part of the course provides a framework of the theoretical approaches proposed in the literature to solve it. These approaches allow us either to characterize the feasible set of the problem or to obtain optimality conditions for the problem. In the third part of the course, both exact algorithms and heuristic algorithms developed in the literature for solving different bilevel problems are revised. In general, each algorithmic approach is based on a theoretical property of the corresponding problem. We make use of this fact to present the algorithmic approaches. Finally, some applications of bilevel programming to supply chain management problems as well as the use of bilevel programming for solving single level programs will be discussed.