diff --git a/components/net/sf/briar/transport/XorErasureEncoder.java b/components/net/sf/briar/transport/XorErasureEncoder.java
index 706f3147f2f1ea48869cb621924c4a1a715578b8..b0a529b6473c538d6069c6f1e8e0b348e0f48029 100644
--- a/components/net/sf/briar/transport/XorErasureEncoder.java
+++ b/components/net/sf/briar/transport/XorErasureEncoder.java
@@ -21,8 +21,8 @@ class XorErasureEncoder implements ErasureEncoder {
 		byte[] src = f.getBuffer(), parity = set[n - 1].getBuffer();
 		int offset = 0;
 		for(int i = 0; i < n - 1; i++) {
-			System.arraycopy(src, 0, set[i].getBuffer(), offset, length);
-			for(int j = 0; j < length; j++) parity[j] ^= src[j];
+			System.arraycopy(src, offset, set[i].getBuffer(), 0, length);
+			for(int j = 0; j < length; j++) parity[j] ^= src[offset + j];
 			offset += length;
 		}
 		return set;
diff --git a/test/build.xml b/test/build.xml
index 3998eadb1f6db632eed0e39e80c54f451b3184ab..6c64adbf5e35b55deeb81966a12873e214af1c9c 100644
--- a/test/build.xml
+++ b/test/build.xml
@@ -61,6 +61,7 @@
 			<test name='net.sf.briar.transport.IncomingSegmentedEncryptionLayerTest'/>
 			<test name='net.sf.briar.transport.OutgoingEncryptionLayerImplTest'/>
 			<test name='net.sf.briar.transport.OutgoingSegmentedEncryptionLayerTest'/>
+			<test name='net.sf.briar.transport.XorErasureEncoderTest'/>
 			<test name='net.sf.briar.util.ByteUtilsTest'/>
 			<test name='net.sf.briar.util.FileUtilsTest'/>
 			<test name='net.sf.briar.util.StringUtilsTest'/>
diff --git a/test/net/sf/briar/transport/XorErasureEncoderTest.java b/test/net/sf/briar/transport/XorErasureEncoderTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e1ca00b3aecf356a9d4d1cee576ab13b232a8d04
--- /dev/null
+++ b/test/net/sf/briar/transport/XorErasureEncoderTest.java
@@ -0,0 +1,41 @@
+package net.sf.briar.transport;
+
+import static org.junit.Assert.assertArrayEquals;
+import net.sf.briar.BriarTestCase;
+import net.sf.briar.api.transport.Segment;
+
+import org.junit.Test;
+
+public class XorErasureEncoderTest extends BriarTestCase {
+
+	@Test
+	public void testEncoding() {
+		// Create a 100-byte frame
+		Frame f = new Frame();
+		f.setLength(100);
+		byte[] b = f.getBuffer();
+		for(int i = 0; i < 100; i++) b[i] = (byte) i;
+		// Encode the frame
+		XorErasureEncoder e = new XorErasureEncoder(4);
+		Segment[] set = e.encodeFrame(f);
+		// There should be four pieces of 34 bytes each
+		assertEquals(4, set.length);
+		for(int i = 0; i < 4; i++) assertEquals(34, set[i].getLength());
+		// The first three pieces should contain the data, plus two zero bytes
+		byte[] b1 = set[0].getBuffer();
+		for(int i = 0; i < 34; i++) assertEquals(i, b1[i]);
+		byte[] b2 = set[1].getBuffer();
+		for(int i = 0; i < 34; i++) assertEquals(i + 34, b2[i]);
+		byte[] b3 = set[2].getBuffer();
+		for(int i = 0; i < 32; i++) assertEquals(i + 68, b3[i]);
+		assertEquals(0, b3[32]);
+		assertEquals(0, b3[33]);
+		// The fourth piece should be the XOR of the other three
+		byte[] b4 = set[3].getBuffer();
+		byte[] expected = new byte[34];
+		for(int i = 0; i < 34; i++) {
+			expected[i] = (byte) (b1[i] ^ b2[i] ^ b3[i]);
+		}
+		assertArrayEquals(expected, b4);
+	}
+}