diff --git a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/Channel.java b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/Channel.java
similarity index 96%
rename from readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/Channel.java
rename to readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/Channel.java
index 3412ebfd92..0e6ec5dddf 100644
--- a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/Channel.java
+++ b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/Channel.java
@@ -1,4 +1,4 @@
-package org.readium.r2.shared.util.archive.channel.jvm;
+package org.readium.r2.shared.util.zip.jvm;
import java.io.Closeable;
import java.io.IOException;
diff --git a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/ClosedByInterruptException.java b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/ClosedByInterruptException.java
similarity index 91%
rename from readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/ClosedByInterruptException.java
rename to readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/ClosedByInterruptException.java
index 209a18df83..d15231ba52 100644
--- a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/ClosedByInterruptException.java
+++ b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/ClosedByInterruptException.java
@@ -1,4 +1,4 @@
-package org.readium.r2.shared.util.archive.channel.jvm;
+package org.readium.r2.shared.util.zip.jvm;
/**
* A {@code ClosedByInterruptException} is thrown when a thread is interrupted
diff --git a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/ClosedChannelException.java b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/ClosedChannelException.java
similarity index 87%
rename from readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/ClosedChannelException.java
rename to readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/ClosedChannelException.java
index 52033cd53d..7a57fca4a4 100644
--- a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/ClosedChannelException.java
+++ b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/ClosedChannelException.java
@@ -1,4 +1,4 @@
-package org.readium.r2.shared.util.archive.channel.jvm;
+package org.readium.r2.shared.util.zip.jvm;
import java.io.IOException;
/**
diff --git a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/NonReadableChannelException.java b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/NonReadableChannelException.java
similarity index 87%
rename from readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/NonReadableChannelException.java
rename to readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/NonReadableChannelException.java
index 2bf28970e0..52576227bf 100644
--- a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/NonReadableChannelException.java
+++ b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/NonReadableChannelException.java
@@ -1,4 +1,4 @@
-package org.readium.r2.shared.util.archive.channel.jvm;
+package org.readium.r2.shared.util.zip.jvm;
/**
* A {@code NonReadableChannelException} is thrown when attempting to read from
diff --git a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/NonWritableChannelException.java b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/NonWritableChannelException.java
similarity index 87%
rename from readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/NonWritableChannelException.java
rename to readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/NonWritableChannelException.java
index 88799aa269..bc3a43bc57 100644
--- a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/NonWritableChannelException.java
+++ b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/NonWritableChannelException.java
@@ -1,4 +1,4 @@
-package org.readium.r2.shared.util.archive.channel.jvm;
+package org.readium.r2.shared.util.zip.jvm;
/**
* A {@code NonWritableChannelException} is thrown when attempting to write to a
diff --git a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/ReadableByteChannel.java b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/ReadableByteChannel.java
similarity index 97%
rename from readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/ReadableByteChannel.java
rename to readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/ReadableByteChannel.java
index 845898be59..476652dd88 100644
--- a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/ReadableByteChannel.java
+++ b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/ReadableByteChannel.java
@@ -1,4 +1,4 @@
-package org.readium.r2.shared.util.archive.channel.jvm;
+package org.readium.r2.shared.util.zip.jvm;
import java.io.IOException;
import java.nio.ByteBuffer;
diff --git a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/SeekableByteChannel.java b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/SeekableByteChannel.java
similarity index 99%
rename from readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/SeekableByteChannel.java
rename to readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/SeekableByteChannel.java
index 19039764da..64a5ceac4b 100644
--- a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/SeekableByteChannel.java
+++ b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/SeekableByteChannel.java
@@ -1,4 +1,4 @@
-package org.readium.r2.shared.util.archive.channel.jvm;
+package org.readium.r2.shared.util.zip.jvm;
import java.io.IOException;
import java.nio.ByteBuffer;
diff --git a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/WritableByteChannel.java b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/WritableByteChannel.java
similarity index 97%
rename from readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/WritableByteChannel.java
rename to readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/WritableByteChannel.java
index 3db47ea6bb..53c07f5679 100644
--- a/readium/shared/src/main/java/org/readium/r2/shared/util/archive/channel/jvm/WritableByteChannel.java
+++ b/readium/shared/src/main/java/org/readium/r2/shared/util/zip/jvm/WritableByteChannel.java
@@ -1,4 +1,4 @@
-package org.readium.r2.shared.util.archive.channel.jvm;
+package org.readium.r2.shared.util.zip.jvm;
import java.io.IOException;
import java.nio.ByteBuffer;
diff --git a/readium/shared/src/test/java/org/readium/r2/shared/TestUtils.kt b/readium/shared/src/test/java/org/readium/r2/shared/TestUtils.kt
index 7e7fda0700..e172ba7a7f 100644
--- a/readium/shared/src/test/java/org/readium/r2/shared/TestUtils.kt
+++ b/readium/shared/src/test/java/org/readium/r2/shared/TestUtils.kt
@@ -17,7 +17,7 @@ import org.json.JSONObject
import org.junit.Assert.assertEquals
import org.readium.r2.shared.extensions.toListTest
import org.readium.r2.shared.extensions.toMapTest
-import org.readium.r2.shared.resource.Resource
+import org.readium.r2.shared.util.resource.Resource
/**
* Asserts that two [JSONObject] are equal.
diff --git a/readium/shared/src/test/java/org/readium/r2/shared/publication/PublicationTest.kt b/readium/shared/src/test/java/org/readium/r2/shared/publication/PublicationTest.kt
index 8676873a11..1718dfbc2e 100644
--- a/readium/shared/src/test/java/org/readium/r2/shared/publication/PublicationTest.kt
+++ b/readium/shared/src/test/java/org/readium/r2/shared/publication/PublicationTest.kt
@@ -19,12 +19,12 @@ import org.readium.r2.shared.publication.services.PositionsService
import org.readium.r2.shared.publication.services.WebPositionsService
import org.readium.r2.shared.publication.services.positions
import org.readium.r2.shared.publication.services.positionsByReadingOrder
-import org.readium.r2.shared.resource.EmptyContainer
-import org.readium.r2.shared.resource.Resource
-import org.readium.r2.shared.resource.StringResource
-import org.readium.r2.shared.resource.readAsString
import org.readium.r2.shared.util.Url
import org.readium.r2.shared.util.mediatype.MediaType
+import org.readium.r2.shared.util.resource.EmptyContainer
+import org.readium.r2.shared.util.resource.Resource
+import org.readium.r2.shared.util.resource.StringResource
+import org.readium.r2.shared.util.resource.readAsString
import org.robolectric.RobolectricTestRunner
@RunWith(RobolectricTestRunner::class)
diff --git a/readium/shared/src/test/java/org/readium/r2/shared/publication/protection/AdeptFallbackContentProtectionTest.kt b/readium/shared/src/test/java/org/readium/r2/shared/publication/protection/AdeptFallbackContentProtectionTest.kt
index 4aebc665e8..7e4e521879 100644
--- a/readium/shared/src/test/java/org/readium/r2/shared/publication/protection/AdeptFallbackContentProtectionTest.kt
+++ b/readium/shared/src/test/java/org/readium/r2/shared/publication/protection/AdeptFallbackContentProtectionTest.kt
@@ -11,8 +11,8 @@ import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
-import org.readium.r2.shared.asset.Asset
import org.readium.r2.shared.util.Url
+import org.readium.r2.shared.util.asset.Asset
import org.readium.r2.shared.util.mediatype.MediaType
import org.robolectric.RobolectricTestRunner
@@ -73,7 +73,7 @@ class AdeptFallbackContentProtectionTest {
private fun supports(mediaType: MediaType, resources: Map