Two-dimensional (2-D) codes are introduced as linear shift-invariant spaces of admissible signals on the discrete plane. Convolutional and, in particular, basic codes are characterized both in terms of their internal properties and by means of their input-output representations. The algebraic structure of the class of all encoders that correspond to a given convolutional code is investigated and the possibility of obtaining 2-D decoders, free from catastrophic errors, as well as efficient syndrome decoders is considered. Some aspects of the state space implementation of 2-D encoders and decoders via (finite memory) 2-D system are discussed.