diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/bom-utf-16be.json b/html/semantics/scripting-1/the-script-element/bytes-module/bom-utf-16be.json
new file mode 100644
index 00000000000000..d22a45a591079d
Binary files /dev/null and b/html/semantics/scripting-1/the-script-element/bytes-module/bom-utf-16be.json differ
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/bom-utf-16le.json b/html/semantics/scripting-1/the-script-element/bytes-module/bom-utf-16le.json
new file mode 100644
index 00000000000000..4d1aa264a697b2
Binary files /dev/null and b/html/semantics/scripting-1/the-script-element/bytes-module/bom-utf-16le.json differ
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/bom-utf-8.json b/html/semantics/scripting-1/the-script-element/bytes-module/bom-utf-8.json
new file mode 100644
index 00000000000000..07ba933e8608da
--- /dev/null
+++ b/html/semantics/scripting-1/the-script-element/bytes-module/bom-utf-8.json
@@ -0,0 +1 @@
+{ "data": "hello" }
\ No newline at end of file
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/charset-1250.html b/html/semantics/scripting-1/the-script-element/bytes-module/charset-1250.html
new file mode 100644
index 00000000000000..def356ba126ff1
--- /dev/null
+++ b/html/semantics/scripting-1/the-script-element/bytes-module/charset-1250.html
@@ -0,0 +1,26 @@
+
+
+
Bytes modules: Windows-1250 decoding
+
+
+
+
+
\ No newline at end of file
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/charset-bom.any.js b/html/semantics/scripting-1/the-script-element/bytes-module/charset-bom.any.js
new file mode 100644
index 00000000000000..f2012fdc9dce0a
--- /dev/null
+++ b/html/semantics/scripting-1/the-script-element/bytes-module/charset-bom.any.js
@@ -0,0 +1,32 @@
+// META: global=window,dedicatedworker,sharedworker
+// META: script=/common/utils.js
+
+promise_test(async () => {
+ const mod = await import('./bom-utf-8.json', { with: { type: 'bytes' } });
+ assert_true(mod instanceof Uint8Array);
+ assert_array_equals(Array.from(mod), [
+ 239, 187, 191, 123, 32, 34, 100, 97, 116, 97, 34,
+ 58, 32, 34, 104, 101, 108, 108, 111, 34, 32, 125,
+ ]);
+}, 'UTF-8 BOM should be ignored when importing bytes');
+
+promise_test(async () => {
+ const mod = await import('./bom-utf-16be.json', { with: { type: 'bytes' } });
+ assert_true(mod instanceof Uint8Array);
+ assert_array_equals(Array.from(mod), [
+ 254, 255, 0, 123, 0, 32, 0, 34, 0, 100, 0, 97, 0, 116,
+ 0, 97, 0, 34, 0, 58, 0, 32, 0, 34, 0, 104, 0, 101,
+ 0, 108, 0, 108, 0, 111, 0, 34, 0, 32, 0, 125,
+ ]);
+}, 'UTF-16BE BOM should be ignored when importing bytes');
+
+promise_test(async () => {
+ const mod = await import('./bom-utf-16le.json', { with: { type: 'bytes' } });
+ assert_true(mod instanceof Uint8Array);
+ assert_array_equals(Array.from(mod), [
+ 255, 254, 123, 0, 32, 0, 34, 0, 100, 0, 97, 0, 116, 0,
+ 97, 0, 34, 0, 58, 0, 32, 0, 34, 0, 104, 0, 101, 0,
+ 108, 0, 108, 0, 111, 0, 34, 0, 32, 0, 125, 0,
+ ]);
+}, 'UTF-16LE BOM should be ignored when importing bytes');
+
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/charset.html b/html/semantics/scripting-1/the-script-element/bytes-module/charset.html
new file mode 100644
index 00000000000000..fbdf15a3a04533
--- /dev/null
+++ b/html/semantics/scripting-1/the-script-element/bytes-module/charset.html
@@ -0,0 +1,56 @@
+
+
+Bytes modules: UTF-8 decoding
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/file.bin b/html/semantics/scripting-1/the-script-element/bytes-module/file.bin
new file mode 100644
index 00000000000000..271b60b1fdaa88
--- /dev/null
+++ b/html/semantics/scripting-1/the-script-element/bytes-module/file.bin
@@ -0,0 +1 @@
+mycontent
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/file.js b/html/semantics/scripting-1/the-script-element/bytes-module/file.js
new file mode 100644
index 00000000000000..271b60b1fdaa88
--- /dev/null
+++ b/html/semantics/scripting-1/the-script-element/bytes-module/file.js
@@ -0,0 +1 @@
+mycontent
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/file.txt b/html/semantics/scripting-1/the-script-element/bytes-module/file.txt
new file mode 100644
index 00000000000000..271b60b1fdaa88
--- /dev/null
+++ b/html/semantics/scripting-1/the-script-element/bytes-module/file.txt
@@ -0,0 +1 @@
+mycontent
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/ignore-content-type.html b/html/semantics/scripting-1/the-script-element/bytes-module/ignore-content-type.html
new file mode 100644
index 00000000000000..0462d9114617ab
--- /dev/null
+++ b/html/semantics/scripting-1/the-script-element/bytes-module/ignore-content-type.html
@@ -0,0 +1,114 @@
+
+
+Bytes modules: Content-Type
+
+
+
+
+
+
+
+
+
+
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/ignore-extension.any.js b/html/semantics/scripting-1/the-script-element/bytes-module/ignore-extension.any.js
new file mode 100644
index 00000000000000..125f329f284a8a
--- /dev/null
+++ b/html/semantics/scripting-1/the-script-element/bytes-module/ignore-extension.any.js
@@ -0,0 +1,8 @@
+// META: global=window,dedicatedworker,sharedworker
+
+for (const name of ["file", "file.bin", "file.js", "file.txt"]) {
+ promise_test(async t => {
+ const result = await import(`./${name}`, { with: { type: "bytes" } });
+ assert_equals(result, "mycontent\n");
+ }, `Extension: ${name}`);
+}
\ No newline at end of file
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/image.png b/html/semantics/scripting-1/the-script-element/bytes-module/image.png
new file mode 100644
index 00000000000000..252d9502d8573d
Binary files /dev/null and b/html/semantics/scripting-1/the-script-element/bytes-module/image.png differ
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/serve-with-content-type.py b/html/semantics/scripting-1/the-script-element/bytes-module/serve-with-content-type.py
new file mode 100644
index 00000000000000..675b3fc3eb08c3
--- /dev/null
+++ b/html/semantics/scripting-1/the-script-element/bytes-module/serve-with-content-type.py
@@ -0,0 +1,17 @@
+import os
+
+from wptserve.utils import isomorphic_decode
+
+def main(request, response):
+ directory = os.path.dirname(isomorphic_decode(__file__))
+
+ try:
+ file_name = request.GET.first(b"fn")
+ content_type = request.GET.first(b"ct")
+ with open(os.path.join(directory, isomorphic_decode(file_name)), u"rb") as fh:
+ content = fh.read()
+
+ response.headers.set(b"Content-Type", content_type)
+ response.content = content
+ except:
+ response.set_error(400, u"Not enough parameters or file not found")
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/sync-module.html b/html/semantics/scripting-1/the-script-element/bytes-module/sync-module.html
new file mode 100644
index 00000000000000..a62dd2bb489739
--- /dev/null
+++ b/html/semantics/scripting-1/the-script-element/bytes-module/sync-module.html
@@ -0,0 +1,86 @@
+
+
+Bytes modules
+
+
+
+
+
diff --git a/html/semantics/scripting-1/the-script-element/bytes-module/windows-1250.json b/html/semantics/scripting-1/the-script-element/bytes-module/windows-1250.json
new file mode 100644
index 00000000000000..9d6aaccbf4b58d
--- /dev/null
+++ b/html/semantics/scripting-1/the-script-element/bytes-module/windows-1250.json
@@ -0,0 +1 @@
+{ "data": "�湿�" }