The aim of quantum control is to drive a quantum system to a desired state or more generally evolution through pulse-shaping. The unit begins with introducing control theory as a subject from engineering and a tool for solving inverse problems. We will discuss linear control and bilinear control, both are important in the quantum case. We then look at the Schrodinger equation as a bilinear control problem and aim to characterise what kind of states and operations can be reached in a given system. This leads us to an algebraic description of control, provided in the framework of Lie algebras. We will look at examples of how this works in practice in quantum computing. In such examples, one often encounters noise, and we will see how quantum control can help lowering noise, which leads us the control of open systems. A particular case of open system control is important in continuous variable quantum optics and known as the input-output formalism, which will bring us back to linear control. In the final part we introduce optimal control. The task here is to find the best way of controlling quantum systems - shortest time, lowest energy, lowest noise. We look at examples from Nuclear Magnetic Resonance, from Ultrafast Laser Control, and from Quantum Computing. You will use the python library "QuTiP" to get experience with the beauty and the challenges of optimal control.