In Chapter 4 we introduced diﬀerent quantum gates and quantum circuits and in Chapter 5 we described several quantum algorithms. So far the analysis of the algorithms and the circuits has been made with the assumption that the required unitary operations can be implemented exactly without any error. This is an abstraction. In an actual physical system that implements a quantum algorithm or a quantum circuit there are several sources of errors. The situation is similar in classical computation and to circumvent this problem error correcting codes are used in classical digital computing. Since qubits are more delicate and more susceptible to errors we need to introduce quantum error correcting codes. It is very important, as without such codes it will not be possible to build a scalable quantum computer. Such quantum error correcting codes are introduced in this chapter. However, we will not limit ourselves to the discussion of error correcting codes alone. We will also discuss more general aspects of errors and error correction, like decoherence, decoherence free subspace and fault-tolerance.