diff --git a/CI/coverage-dead-code-deletion.js b/CI/coverage-dead-code-deletion.js
new file mode 100644
index 0000000000000000000000000000000000000000..c26ce7eaad1a8b7790892551f944a941314f1cb1
--- /dev/null
+++ b/CI/coverage-dead-code-deletion.js
@@ -0,0 +1,23 @@
+const fs = require('fs');
+
+const covData = JSON.parse(fs.readFileSync('generated/cov-dead-code-deletion/coverage-final.json', 'utf8'));
+const files = Object.keys(covData);
+for(const filePath of files){
+	const fullContent = fs.readFileSync(filePath, 'utf8').split('\n');
+	const keptContent = [];
+	const statementMap = covData[filePath].statementMap;
+	const statementRan = covData[filePath].s;
+	for(let key of Object.keys(statementMap)){
+		if(statementRan[key]>0) for(let line = statementMap[key].start.line; line<=statementMap[key].end.line;line++){
+			keptContent[line-1] = fullContent[line-1];
+		}
+	}
+	const fnMap = covData[filePath].fnMap;
+	const fnRan = covData[filePath].f;
+	for(let key of Object.keys(fnMap)){
+		if(fnRan[key]>0) for(let line = fnMap[key].decl.start.line; line<=fnMap[key].decl.end.line;line++){
+			keptContent[line-1] = fullContent[line-1];
+		}
+	}
+	fs.writeFileSync(filePath, keptContent.join('\n'));
+}
diff --git a/CI/gen-prod-test.js b/CI/gen-prod-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..ba7f36b3c87a01c285813ced84fa1e212f522460
--- /dev/null
+++ b/CI/gen-prod-test.js
@@ -0,0 +1,14 @@
+const fs = require('fs');
+
+fs.readdirSync('src/').forEach(fileName => {
+	const orgContent = fs.readFileSync(`src/${fileName}`, 'utf8');
+	fs.writeFileSync(`generated/cov-env/${fileName}`, orgContent);
+	if (!fileName.includes('.test.')) return;
+	fs.writeFileSync(`generated/npm/${fileName}`, orgContent);
+	const allJsTest = orgContent.replace(
+		/import \* as app from '\.\/(crypto)\.mjs';/,
+		(full, libName) => `import {${libName} as app} from './all.mjs';`);
+	fs.writeFileSync(`generated/cov-env/all.${fileName}`, allJsTest);
+	fs.writeFileSync(`generated/npm/all.${fileName}`, allJsTest);
+});
+fs.writeFileSync(`generated/cov-env/package.json`, fs.readFileSync(`package.json`, 'utf8'));
diff --git a/npm/package.json b/npm/package.json
index aab622f6e167f11c55cde2efe00a03b96698cf1d..48e7c42a2ee4955f89d7a9db77debc2c45f9a0ec 100644
--- a/npm/package.json
+++ b/npm/package.json
@@ -20,18 +20,10 @@
     "url": "https://framagit.org/g1/g1lib.js/-/issues"
   },
   "license": "AGPL-3.0",
-  "ava": {},
-  "c8": {
+	"c8": {
 		"all": true,
-		"branches": 0.080,
-		"lines": 0.080,
-		"functions": 0.080,
-		"statements": 0.080,
-    "report-dir": "../coverage",
-    "temp-dir": "../nyc_output.temp",
-    "reporter": [
-      "text-summary",
-      "html"
-    ]
-  }
+		"report-dir": "../cov-dead-code-deletion",
+		"temp-dir": "../nyc_output.temp",
+		"reporter": ["json"]
+	}
 }
diff --git a/package.json b/package.json
index 3016ef69c6312c51ce5962fb56906ebb7c37a73e..c6bf3850757f2396b96c6ff5020fc8985f3c2a61 100644
--- a/package.json
+++ b/package.json
@@ -6,18 +6,21 @@
     "clean": "rm -rf generated*",
     "build": "run-s build:**",
 		"build:mk:npm": "mkdirp generated/npm",
+		"build:mk:cov-env": "mkdirp generated/cov-env",
 		"build:mk:minfied": "mkdirp generated/minified",
     "build:mk:vendors": "mkdirp generated/vendors",
     "build:vendors": "node CI/build.js",
     "build:npm:all": "rollup src/all.mjs --format esm --file generated/npm/all.mjs",
     "build:npm:crypto": "rollup src/crypto.mjs --format esm --file generated/npm/crypto.mjs",
     "build:npm:dictionaryBuilder": "rollup src/dictionary-builder.mjs --format esm --file generated/npm/dictionary-builder.mjs",
-    "packaging": "https://github.com/1000i100/latinize-to-ascii/blob/master/package.json",
-    "build:npm:min:all": "terser generated/npm/all.mjs -o generated/minified/all.mjs",
+		"build:npm:cp": "cp npm/* generated/npm/",
+		"build:npm:cp:readme": "cp README* generated/npm/",
+		"build:npm:test2npm": "node CI/gen-prod-test.js",
+		"xbuild:npm:coverageForDeadCodeDeletion": "cd generated/npm/ && c8 ava",
+
+		"build:npm:min:all": "terser generated/npm/all.mjs -o generated/minified/all.mjs",
     "build:npm:min:crypto": "terser generated/npm/crypto.mjs -o generated/minified/crypto.mjs",
     "build:npm:min:dictionaryBuilder": "terser generated/npm/dictionary-builder.mjs -o generated/minified/dictionary-builder.mjs",
-    "build:npm:cp": "cp npm/* generated/npm/",
-    "build:npm:cp:readme": "cp README* generated/npm/",
     "test": "run-s test:dev",
     "test:dev": "run-p test:dev:**",
     "test:dev:qualityCheck": "xo",
@@ -29,8 +32,7 @@
     "test:production:duplication": "jscpd ./",
     "test:production:complexity": "./node_modules/.bin/es6-plato -r -d generated/maintainability ./src/*",
     "test:production:complexity:badgesAndThreshold": "node CI/plato-badges.js",
-    "test:production:test2npm": "cp src/*.test.mjs generated/npm/",
-    "test:production:coverage": "cd generated/npm/ && c8 ava",
+    "test:production:srcCoverage": "cd generated/cov-env/ && c8 ava",
 		"test:production:testMinified": "cd generated/npm/ && cp -rf ../minified/* ./ && ava",
     "test:production:clean": "rm -rf generated/npm/*.test.mjs generated/npm/node_modules"
   },
@@ -56,7 +58,20 @@
     "ecma-nacl": "^2.5.0",
     "codehawk-cli": "^6.0.3"
   },
-  "ava": {},
+	"ava": {},
+	"c8": {
+		"all": true,
+		"branches": 0.080,
+		"lines": 0.080,
+		"functions": 0.080,
+		"statements": 0.080,
+		"report-dir": "../coverage",
+		"temp-dir": "../nyc_output.temp",
+		"reporter": [
+			"text-summary",
+			"html"
+		]
+	},
   "xo": {
     "rules": {
       "curly": 0,