Multiple-time programmable memory comprising one-time programmable memory and a plurality of virtual MTP memory blocks (101, 102, 103, 104), the OTP memory comprising a plurality of OTP memory blocks (111-114, 121-124, 131-134, 141-144), wherein: a plurality of the OTP memory blocks are reserved for each virtual MTP memory block; at any given time, each virtual MTP memory block (101, 102, 103, 104) is associated with one of the plurality of OTP memory blocks (111-114, 121-124, 131-134, 141-144) that are reserved for the virtual MTP memory block, wherein the current data of the virtual MTP memory block is stored in the associated OTP memory block; for each virtual MTP memory block (101, 102, 103, 104), a pointer that identifies the OTP memory block that is associated with the virtual MTP memory block is stored elsewhere in the OTP memory; and the MTP memory is configured to program a first virtual MTP memory block of the plurality of virtual MTP memory blocks (101, 102, 103, 104) with new data by: programming a previously unprogrammed OTP memory block of the OTP memory blocks that are reserved for the first virtual MTP memory block with the new data; and updating the pointer of the OTP memory block that is associated with the first virtual MTP memory block to identify the newly programmed OTP memory block; characterised in that pointers of the OTP memory blocks that are associated with virtual MTP memory blocks are stored with an error correcting code so that each pointer includes bits of error correcting code and bits of pointer data, and wherein the encoding scheme of the pointers is such that incrementing the pointer requires only bit changes in both the pointer data and the error correcting code from one of 0 to 1 or 1 to 0 depending on the type of OTP memory. a plurality of the OTP memory blocks are reserved for each virtual MTP memory block; at any given time, each virtual MTP memory block (101, 102, 103, 104) is associated with one of the plurality of OTP memory blocks (111-114, 121-124, 131-134, 141-144) that are reserved for the virtual MTP memory block, wherein the current data of the virtual MTP memory block is stored in the associated OTP memory block; for each virtual MTP memory block (101, 102, 103, 104), a pointer that identifies the OTP memory block that is associated with the virtual MTP memory block is stored elsewhere in the OTP memory; and the MTP memory is configured to program a first virtual MTP memory block of the plurality of virtual MTP memory blocks (101, 102, 103, 104) with new data by: programming a previously unprogrammed OTP memory block of the OTP memory blocks that are reserved for the first virtual MTP memory block with the new data; and updating the pointer of the OTP memory block that is associated with the first virtual MTP memory block to identify the newly programmed OTP memory block; characterised in that programming a previously unprogrammed OTP memory block of the OTP memory blocks that are reserved for the first virtual MTP memory block with the new data; and updating the pointer of the OTP memory block that is associated with the first virtual MTP memory block to identify the newly programmed OTP memory block; characterised in that pointers of the OTP memory blocks that are associated with virtual MTP memory blocks are stored with an error correcting code so that each pointer includes bits of error correcting code and bits of pointer data, and wherein the encoding scheme of the pointers is such that incrementing the pointer requires only bit changes in both the pointer data and the error correcting code from one of 0 to 1 or 1 to 0 depending on the type of OTP memory.