diff --git a/bench/minify-html-bench/Cargo.toml b/bench/minify-html-bench/Cargo.toml
index 020a6e0..f23bdeb 100644
--- a/bench/minify-html-bench/Cargo.toml
+++ b/bench/minify-html-bench/Cargo.toml
@@ -6,7 +6,7 @@ authors = ["Wilson Lin "]
edition = "2018"
[dependencies]
-minify-html = { path = "../.." }
+minify-html = { path = "../../rust/main" }
structopt = "0.3.5"
serde = { version = "1.0.104", features = ["derive"] }
serde_json = "1.0.44"
diff --git a/cli/Cargo.toml b/cli/Cargo.toml
index e8dd30f..5c13de4 100644
--- a/cli/Cargo.toml
+++ b/cli/Cargo.toml
@@ -7,5 +7,5 @@ authors = ["Wilson Lin "]
edition = "2018"
[dependencies]
-minify-html = { path = "..", features = ["js-esbuild"] }
+minify-html = { path = "../rust/main", features = ["js-esbuild"] }
structopt = "0.3"
diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml
index 6d0a9f4..4bbdf0b 100644
--- a/fuzz/Cargo.toml
+++ b/fuzz/Cargo.toml
@@ -7,4 +7,4 @@ edition = "2018"
[dependencies]
afl = "0.10.0"
-minify-html = { path = ".." }
+minify-html = { path = "../rust/main" }
diff --git a/fuzz/process/Cargo.toml b/fuzz/process/Cargo.toml
index bbc5adc..f8d25af 100644
--- a/fuzz/process/Cargo.toml
+++ b/fuzz/process/Cargo.toml
@@ -5,4 +5,4 @@ authors = ["Wilson Lin "]
edition = "2018"
[dependencies]
-minify-html = { path = "../.." }
+minify-html = { path = "../../rust/main" }
diff --git a/gen/_common.ts b/gen/_common.ts
index bc2917f..7f303b8 100644
--- a/gen/_common.ts
+++ b/gen/_common.ts
@@ -1,7 +1,7 @@
import { mkdirSync, writeFileSync } from "fs";
import { join } from "path";
-export const RUST_OUT_DIR = join(__dirname, "..", "src", "gen");
+export const RUST_OUT_DIR = join(__dirname, "..", "rust", "common", "src", "gen");
try {
mkdirSync(RUST_OUT_DIR);
diff --git a/java/Cargo.toml b/java/Cargo.toml
index b6d66ed..fca8134 100644
--- a/java/Cargo.toml
+++ b/java/Cargo.toml
@@ -6,7 +6,7 @@ authors = ["Wilson Lin "]
edition = "2018"
[dependencies]
-minify-html = { path = "..", features = ["js-esbuild"] }
+minify-html = { path = "../rust/main", features = ["js-esbuild"] }
jni = "0.14.0"
[lib]
diff --git a/nodejs/native/Cargo.toml b/nodejs/native/Cargo.toml
index 6ac25a5..cfa7699 100644
--- a/nodejs/native/Cargo.toml
+++ b/nodejs/native/Cargo.toml
@@ -19,4 +19,4 @@ cbindgen = "0.14"
[dependencies]
libc = "0.2"
-minify-html = { path = "../..", optional = true }
+minify-html = { path = "../../rust/main", optional = true }
diff --git a/prebuild.sh b/prebuild.sh
index dc573f2..3c83e97 100644
--- a/prebuild.sh
+++ b/prebuild.sh
@@ -4,7 +4,7 @@ set -e
pushd "$(dirname "$0")"
-# Generate crate::gen::* code.
+# Generate common::gen::* code.
pushd gen
npm i
bash gen.sh
diff --git a/ruby/Cargo.toml b/ruby/Cargo.toml
index 7bfa3ec..08ef624 100644
--- a/ruby/Cargo.toml
+++ b/ruby/Cargo.toml
@@ -10,5 +10,5 @@ name = "minify_html_ruby_lib"
crate-type = ["cdylib"]
[dependencies]
-minify-html = { path = "..", features = ["js-esbuild"] }
+minify-html = { path = "../rust/main", features = ["js-esbuild"] }
rutie = "0.7.0"
diff --git a/.gitignore b/rust/common/.gitignore
similarity index 100%
rename from .gitignore
rename to rust/common/.gitignore
index e5b2623..d14a1cf 100644
--- a/.gitignore
+++ b/rust/common/.gitignore
@@ -1,3 +1,3 @@
/Cargo.lock
-/target
/src/gen/
+/target
diff --git a/src/pattern.rs b/rust/common/src/pattern.rs
similarity index 100%
rename from src/pattern.rs
rename to rust/common/src/pattern.rs
diff --git a/src/spec/entity/decode.rs b/rust/common/src/spec/entity/decode.rs
similarity index 100%
rename from src/spec/entity/decode.rs
rename to rust/common/src/spec/entity/decode.rs
diff --git a/src/spec/entity/encode.rs b/rust/common/src/spec/entity/encode.rs
similarity index 100%
rename from src/spec/entity/encode.rs
rename to rust/common/src/spec/entity/encode.rs
diff --git a/src/spec/entity/mod.rs b/rust/common/src/spec/entity/mod.rs
similarity index 100%
rename from src/spec/entity/mod.rs
rename to rust/common/src/spec/entity/mod.rs
diff --git a/src/spec/entity/tests/encode.rs b/rust/common/src/spec/entity/tests/encode.rs
similarity index 100%
rename from src/spec/entity/tests/encode.rs
rename to rust/common/src/spec/entity/tests/encode.rs
diff --git a/src/spec/entity/tests/mod.rs b/rust/common/src/spec/entity/tests/mod.rs
similarity index 100%
rename from src/spec/entity/tests/mod.rs
rename to rust/common/src/spec/entity/tests/mod.rs
diff --git a/src/spec/mod.rs b/rust/common/src/spec/mod.rs
similarity index 100%
rename from src/spec/mod.rs
rename to rust/common/src/spec/mod.rs
diff --git a/src/spec/script.rs b/rust/common/src/spec/script.rs
similarity index 100%
rename from src/spec/script.rs
rename to rust/common/src/spec/script.rs
diff --git a/src/spec/tag/mod.rs b/rust/common/src/spec/tag/mod.rs
similarity index 100%
rename from src/spec/tag/mod.rs
rename to rust/common/src/spec/tag/mod.rs
diff --git a/src/spec/tag/ns.rs b/rust/common/src/spec/tag/ns.rs
similarity index 100%
rename from src/spec/tag/ns.rs
rename to rust/common/src/spec/tag/ns.rs
diff --git a/src/spec/tag/omission.rs b/rust/common/src/spec/tag/omission.rs
similarity index 100%
rename from src/spec/tag/omission.rs
rename to rust/common/src/spec/tag/omission.rs
diff --git a/src/spec/tag/void.rs b/rust/common/src/spec/tag/void.rs
similarity index 100%
rename from src/spec/tag/void.rs
rename to rust/common/src/spec/tag/void.rs
diff --git a/src/spec/tag/whitespace.rs b/rust/common/src/spec/tag/whitespace.rs
similarity index 100%
rename from src/spec/tag/whitespace.rs
rename to rust/common/src/spec/tag/whitespace.rs
diff --git a/src/tests/mod.rs b/rust/common/src/tests/mod.rs
similarity index 100%
rename from src/tests/mod.rs
rename to rust/common/src/tests/mod.rs
diff --git a/src/whitespace.rs b/rust/common/src/whitespace.rs
similarity index 100%
rename from src/whitespace.rs
rename to rust/common/src/whitespace.rs
diff --git a/rust/main/.gitignore b/rust/main/.gitignore
new file mode 100644
index 0000000..1b72444
--- /dev/null
+++ b/rust/main/.gitignore
@@ -0,0 +1,2 @@
+/Cargo.lock
+/target
diff --git a/Cargo.toml b/rust/main/Cargo.toml
similarity index 100%
rename from Cargo.toml
rename to rust/main/Cargo.toml
diff --git a/src/ast/mod.rs b/rust/main/src/ast/mod.rs
similarity index 100%
rename from src/ast/mod.rs
rename to rust/main/src/ast/mod.rs
diff --git a/src/cfg/mod.rs b/rust/main/src/cfg/mod.rs
similarity index 100%
rename from src/cfg/mod.rs
rename to rust/main/src/cfg/mod.rs
diff --git a/src/lib.rs b/rust/main/src/lib.rs
similarity index 100%
rename from src/lib.rs
rename to rust/main/src/lib.rs
diff --git a/src/minify/attr.rs b/rust/main/src/minify/attr.rs
similarity index 100%
rename from src/minify/attr.rs
rename to rust/main/src/minify/attr.rs
diff --git a/src/minify/bang.rs b/rust/main/src/minify/bang.rs
similarity index 100%
rename from src/minify/bang.rs
rename to rust/main/src/minify/bang.rs
diff --git a/src/minify/comment.rs b/rust/main/src/minify/comment.rs
similarity index 100%
rename from src/minify/comment.rs
rename to rust/main/src/minify/comment.rs
diff --git a/src/minify/content.rs b/rust/main/src/minify/content.rs
similarity index 100%
rename from src/minify/content.rs
rename to rust/main/src/minify/content.rs
diff --git a/src/minify/css.rs b/rust/main/src/minify/css.rs
similarity index 100%
rename from src/minify/css.rs
rename to rust/main/src/minify/css.rs
diff --git a/src/minify/element.rs b/rust/main/src/minify/element.rs
similarity index 100%
rename from src/minify/element.rs
rename to rust/main/src/minify/element.rs
diff --git a/src/minify/esbuild.rs b/rust/main/src/minify/esbuild.rs
similarity index 100%
rename from src/minify/esbuild.rs
rename to rust/main/src/minify/esbuild.rs
diff --git a/src/minify/instruction.rs b/rust/main/src/minify/instruction.rs
similarity index 100%
rename from src/minify/instruction.rs
rename to rust/main/src/minify/instruction.rs
diff --git a/src/minify/js.rs b/rust/main/src/minify/js.rs
similarity index 100%
rename from src/minify/js.rs
rename to rust/main/src/minify/js.rs
diff --git a/src/minify/mod.rs b/rust/main/src/minify/mod.rs
similarity index 100%
rename from src/minify/mod.rs
rename to rust/main/src/minify/mod.rs
diff --git a/src/minify/tests/attr.rs b/rust/main/src/minify/tests/attr.rs
similarity index 100%
rename from src/minify/tests/attr.rs
rename to rust/main/src/minify/tests/attr.rs
diff --git a/src/minify/tests/mod.rs b/rust/main/src/minify/tests/mod.rs
similarity index 100%
rename from src/minify/tests/mod.rs
rename to rust/main/src/minify/tests/mod.rs
diff --git a/src/parse/bang.rs b/rust/main/src/parse/bang.rs
similarity index 100%
rename from src/parse/bang.rs
rename to rust/main/src/parse/bang.rs
diff --git a/src/parse/comment.rs b/rust/main/src/parse/comment.rs
similarity index 100%
rename from src/parse/comment.rs
rename to rust/main/src/parse/comment.rs
diff --git a/src/parse/content.rs b/rust/main/src/parse/content.rs
similarity index 100%
rename from src/parse/content.rs
rename to rust/main/src/parse/content.rs
diff --git a/src/parse/element.rs b/rust/main/src/parse/element.rs
similarity index 100%
rename from src/parse/element.rs
rename to rust/main/src/parse/element.rs
diff --git a/src/parse/instruction.rs b/rust/main/src/parse/instruction.rs
similarity index 100%
rename from src/parse/instruction.rs
rename to rust/main/src/parse/instruction.rs
diff --git a/src/parse/mod.rs b/rust/main/src/parse/mod.rs
similarity index 100%
rename from src/parse/mod.rs
rename to rust/main/src/parse/mod.rs
diff --git a/src/parse/script.rs b/rust/main/src/parse/script.rs
similarity index 100%
rename from src/parse/script.rs
rename to rust/main/src/parse/script.rs
diff --git a/src/parse/style.rs b/rust/main/src/parse/style.rs
similarity index 100%
rename from src/parse/style.rs
rename to rust/main/src/parse/style.rs
diff --git a/src/parse/tests/element.rs b/rust/main/src/parse/tests/element.rs
similarity index 100%
rename from src/parse/tests/element.rs
rename to rust/main/src/parse/tests/element.rs
diff --git a/src/parse/tests/mod.rs b/rust/main/src/parse/tests/mod.rs
similarity index 100%
rename from src/parse/tests/mod.rs
rename to rust/main/src/parse/tests/mod.rs
diff --git a/src/parse/textarea.rs b/rust/main/src/parse/textarea.rs
similarity index 100%
rename from src/parse/textarea.rs
rename to rust/main/src/parse/textarea.rs
diff --git a/src/parse/title.rs b/rust/main/src/parse/title.rs
similarity index 100%
rename from src/parse/title.rs
rename to rust/main/src/parse/title.rs
diff --git a/rust/onepass/.gitignore b/rust/onepass/.gitignore
new file mode 100644
index 0000000..1b72444
--- /dev/null
+++ b/rust/onepass/.gitignore
@@ -0,0 +1,2 @@
+/Cargo.lock
+/target
diff --git a/src/onepass/cfg/mod.rs b/rust/onepass/src/cfg/mod.rs
similarity index 100%
rename from src/onepass/cfg/mod.rs
rename to rust/onepass/src/cfg/mod.rs
diff --git a/src/onepass/err.rs b/rust/onepass/src/err.rs
similarity index 100%
rename from src/onepass/err.rs
rename to rust/onepass/src/err.rs
diff --git a/src/onepass/lib.rs b/rust/onepass/src/lib.rs
similarity index 100%
rename from src/onepass/lib.rs
rename to rust/onepass/src/lib.rs
diff --git a/src/onepass/proc/checkpoint.rs b/rust/onepass/src/proc/checkpoint.rs
similarity index 100%
rename from src/onepass/proc/checkpoint.rs
rename to rust/onepass/src/proc/checkpoint.rs
diff --git a/src/onepass/proc/entity.rs b/rust/onepass/src/proc/entity.rs
similarity index 100%
rename from src/onepass/proc/entity.rs
rename to rust/onepass/src/proc/entity.rs
diff --git a/src/onepass/proc/mod.rs b/rust/onepass/src/proc/mod.rs
similarity index 100%
rename from src/onepass/proc/mod.rs
rename to rust/onepass/src/proc/mod.rs
diff --git a/src/onepass/proc/range.rs b/rust/onepass/src/proc/range.rs
similarity index 100%
rename from src/onepass/proc/range.rs
rename to rust/onepass/src/proc/range.rs
diff --git a/src/onepass/unit/attr/mod.rs b/rust/onepass/src/unit/attr/mod.rs
similarity index 100%
rename from src/onepass/unit/attr/mod.rs
rename to rust/onepass/src/unit/attr/mod.rs
diff --git a/src/onepass/unit/attr/value.rs b/rust/onepass/src/unit/attr/value.rs
similarity index 100%
rename from src/onepass/unit/attr/value.rs
rename to rust/onepass/src/unit/attr/value.rs
diff --git a/src/onepass/unit/bang.rs b/rust/onepass/src/unit/bang.rs
similarity index 100%
rename from src/onepass/unit/bang.rs
rename to rust/onepass/src/unit/bang.rs
diff --git a/src/onepass/unit/comment.rs b/rust/onepass/src/unit/comment.rs
similarity index 100%
rename from src/onepass/unit/comment.rs
rename to rust/onepass/src/unit/comment.rs
diff --git a/src/onepass/unit/content.rs b/rust/onepass/src/unit/content.rs
similarity index 100%
rename from src/onepass/unit/content.rs
rename to rust/onepass/src/unit/content.rs
diff --git a/src/onepass/unit/instruction.rs b/rust/onepass/src/unit/instruction.rs
similarity index 100%
rename from src/onepass/unit/instruction.rs
rename to rust/onepass/src/unit/instruction.rs
diff --git a/src/onepass/unit/mod.rs b/rust/onepass/src/unit/mod.rs
similarity index 100%
rename from src/onepass/unit/mod.rs
rename to rust/onepass/src/unit/mod.rs
diff --git a/src/onepass/unit/script.rs b/rust/onepass/src/unit/script.rs
similarity index 100%
rename from src/onepass/unit/script.rs
rename to rust/onepass/src/unit/script.rs
diff --git a/src/onepass/unit/style.rs b/rust/onepass/src/unit/style.rs
similarity index 100%
rename from src/onepass/unit/style.rs
rename to rust/onepass/src/unit/style.rs
diff --git a/src/onepass/unit/tag.rs b/rust/onepass/src/unit/tag.rs
similarity index 100%
rename from src/onepass/unit/tag.rs
rename to rust/onepass/src/unit/tag.rs
diff --git a/version b/version
index aba9cdf..7551ef1 100755
--- a/version
+++ b/version
@@ -101,6 +101,6 @@ cmd('cargo', 'generate-lockfile');
cmd('git', 'add', '-A');
cmd('git', 'commit', '-m', NEW_VERSION);
cmd('git', 'tag', '-a', `v${NEW_VERSION}`, '-m', '');
-// We have generated but ignored in `src/gen`.
+// We have generated but ignored in `rust/common/gen`.
cmd('cargo', 'publish', '--allow-dirty');
cmd('git', 'push', '--follow-tags');