Restarting is a technique employed by many algorithms. For some problems, restarts improve the runtimes by orders of magnitude. This thesis considers several aspects of restarts. In addition to complexity-theoretical properties, we also study methods for constructing optimal restart strategies. On the practical side, we apply restarts to significantly improve the performance of a SAT solver.