A method for encoding data comprising: a) choosing a sequence of pivot candidate positions for a sequence of g encoding vectors to encode a block of g data symbols in a round of g encoded packets by: i) providing a set of g pivot candidate positions; ii) choosing a pivot candidate position for the sequence from the set of pivot candidate positions; iii) removing the chosen pivot candidate position from the set of pivot candidate positions; and iv) repeating from step ii) until the set of pivot candidate positions is empty and the sequence of chosen pivot candidate positions for the round is non-linear; b) generating the sequence of g encoding vectors based on the chosen sequence of pivot candidate positions, each encoding vector comprising zero valued coefficients for positions within the encoding vector before the pivot candidate position for the encoding vector and a non-zero valued coefficient for at least the pivot candidate position; c) generating a set of encoded data symbols by encoding said block of data symbols with respective generated encoding vectors; d) generating encoded packets each including a respective encoded data symbol and information representing the encoding vector used for encoding the data symbol; e) transmitting the encoded packets; and f) for at least one subsequent round permuting the sequence of chosen pivot candidate positions so that the sequence of chosen pivot candidate positions changes from round to round and then repeating steps b) to e). a) choosing a sequence of pivot candidate positions for a sequence of g encoding vectors to encode a block of g data symbols in a round of g encoded packets by: i) providing a set of g pivot candidate positions; ii) choosing a pivot candidate position for the sequence from the set of pivot candidate positions; iii) removing the chosen pivot candidate position from the set of pivot candidate positions; and iv) repeating from step ii) until the set of pivot candidate positions is empty and the sequence of chosen pivot candidate positions for the round is non-linear; i) providing a set of g pivot candidate positions; ii) choosing a pivot candidate position for the sequence from the set of pivot candidate positions; iii) removing the chosen pivot candidate position from the set of pivot candidate positions; and iv) repeating from step ii) until the set of pivot candidate positions is empty and the sequence of chosen pivot candidate positions for the round is non-linear; b) generating the sequence of g encoding vectors based on the chosen sequence of pivot candidate positions, each encoding vector comprising zero valued coefficients for positions within the encoding vector before the pivot candidate position for the encoding vector and a non-zero valued coefficient for at least the pivot candidate position; c) generating a set of encoded data symbols by encoding said block of data symbols with respective generated encoding vectors; d) generating encoded packets each including a respective encoded data symbol and information representing the encoding vector used for encoding the data symbol; e) transmitting the encoded packets; and f) for at least one subsequent round permuting the sequence of chosen pivot candidate positions so that the sequence of chosen pivot candidate positions changes from round to round and then repeating steps b) to e).