diff --git a/lib/autobuild.js b/lib/autobuild.js
index e97669fc0..f851a4007 100644
--- a/lib/autobuild.js
+++ b/lib/autobuild.js
@@ -10,6 +10,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
 const core = __importStar(require("@actions/core"));
 const exec = __importStar(require("@actions/exec"));
 const path = __importStar(require("path"));
+const codeql_1 = require("./codeql");
 const sharedEnv = __importStar(require("./shared-environment"));
 const util = __importStar(require("./util"));
 async function run() {
@@ -33,10 +34,9 @@ async function run() {
             core.warning(`We will only automatically build ${language} code. If you wish to scan ${autobuildLanguages.slice(1).join(' and ')}, you must replace this block with custom build steps.`);
         }
         core.startGroup(`Attempting to automatically build ${language} code`);
-        // TODO: share config accross actions better via env variables
-        const codeqlCmd = util.getRequiredEnvParam(sharedEnv.CODEQL_ACTION_CMD);
+        const codeQL = codeql_1.getCodeQL();
         const cmdName = process.platform === 'win32' ? 'autobuild.cmd' : 'autobuild.sh';
-        const autobuildCmd = path.join(path.dirname(codeqlCmd), language, 'tools', cmdName);
+        const autobuildCmd = path.join(codeQL.getDir(), language, 'tools', cmdName);
         // Update JAVA_TOOL_OPTIONS to contain '-Dhttp.keepAlive=false'
         // This is because of an issue with Azure pipelines timing out connections after 4 minutes
         // and Maven not properly handling closed connections
diff --git a/lib/autobuild.js.map b/lib/autobuild.js.map
index 4b29ea857..a22fcdf44 100644
--- a/lib/autobuild.js.map
+++ b/lib/autobuild.js.map
@@ -1 +1 @@
-{"version":3,"file":"autobuild.js","sourceRoot":"","sources":["../src/autobuild.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oDAAsC;AACtC,oDAAsC;AACtC,2CAA6B;AAE7B,gEAAkD;AAClD,6CAA+B;AAE/B,KAAK,UAAU,GAAG;;IAChB,IAAI;QACF,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE;YACzF,OAAO;SACR;QAED,0CAA0C;QAC1C,mFAAmF;QACnF,oFAAoF;QACpF,4EAA4E;QAC5E,MAAM,kBAAkB,GAAG,OAAA,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,8BAA8B,CAAC,0CAAE,KAAK,CAAC,GAAG,MAAK,EAAE,CAAC;QACnG,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAEvC,IAAI,CAAC,QAAQ,EAAE;YACb,IAAI,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;YAC7E,OAAO;SACR;QAED,IAAI,CAAC,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;QAE7D,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,IAAI,CAAC,OAAO,CAAC,oCAAoC,QAAQ,8BAA8B,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC;SAC3L;QAED,IAAI,CAAC,UAAU,CAAC,qCAAqC,QAAQ,OAAO,CAAC,CAAC;QACtE,8DAA8D;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAExE,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC;QAChF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAGpF,+DAA+D;QAC/D,0FAA0F;QAC1F,qDAAqD;QACrD,8EAA8E;QAC9E,gHAAgH;QAChH,IAAI,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,wBAAwB,EAAE,+BAA+B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE1I,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;KAEjB;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,CAAC,SAAS,CAAC,kIAAkI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QACnK,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;KACR;IAED,MAAM,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACd,IAAI,CAAC,SAAS,CAAC,4BAA4B,GAAG,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"autobuild.js","sourceRoot":"","sources":["../src/autobuild.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oDAAsC;AACtC,oDAAsC;AACtC,2CAA6B;AAE7B,qCAAqC;AACrC,gEAAkD;AAClD,6CAA+B;AAE/B,KAAK,UAAU,GAAG;;IAChB,IAAI;QACF,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE;YACzF,OAAO;SACR;QAED,0CAA0C;QAC1C,mFAAmF;QACnF,oFAAoF;QACpF,4EAA4E;QAC5E,MAAM,kBAAkB,GAAG,OAAA,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,8BAA8B,CAAC,0CAAE,KAAK,CAAC,GAAG,MAAK,EAAE,CAAC;QACnG,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAEvC,IAAI,CAAC,QAAQ,EAAE;YACb,IAAI,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;YAC7E,OAAO;SACR;QAED,IAAI,CAAC,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;QAE7D,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,IAAI,CAAC,OAAO,CAAC,oCAAoC,QAAQ,8BAA8B,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC;SAC3L;QAED,IAAI,CAAC,UAAU,CAAC,qCAAqC,QAAQ,OAAO,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,kBAAS,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC;QAChF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAE5E,+DAA+D;QAC/D,0FAA0F;QAC1F,qDAAqD;QACrD,8EAA8E;QAC9E,gHAAgH;QAChH,IAAI,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,wBAAwB,EAAE,+BAA+B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE1I,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;KAEjB;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,CAAC,SAAS,CAAC,kIAAkI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QACnK,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;KACR;IAED,MAAM,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACd,IAAI,CAAC,SAAS,CAAC,4BAA4B,GAAG,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/lib/codeql.js b/lib/codeql.js
new file mode 100644
index 000000000..ed41cc853
--- /dev/null
+++ b/lib/codeql.js
@@ -0,0 +1,172 @@
+"use strict";
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+    result["default"] = mod;
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const core = __importStar(require("@actions/core"));
+const exec = __importStar(require("@actions/exec"));
+const toolcache = __importStar(require("@actions/tool-cache"));
+const fs = __importStar(require("fs"));
+const path = __importStar(require("path"));
+const semver = __importStar(require("semver"));
+const util = __importStar(require("./util"));
+/**
+ * Environment variable used to store the location of the CodeQL CLI executable.
+ * Value is set by setupCodeQL and read by getCodeQL.
+ */
+const CODEQL_ACTION_CMD = "CODEQL_ACTION_CMD";
+async function setupCodeQL() {
+    try {
+        const codeqlURL = core.getInput('tools', { required: true });
+        const codeqlURLVersion = getCodeQLURLVersion(codeqlURL);
+        let codeqlFolder = toolcache.find('CodeQL', codeqlURLVersion);
+        if (codeqlFolder) {
+            core.debug(`CodeQL found in cache ${codeqlFolder}`);
+        }
+        else {
+            const codeqlPath = await toolcache.downloadTool(codeqlURL);
+            const codeqlExtracted = await toolcache.extractTar(codeqlPath);
+            codeqlFolder = await toolcache.cacheDir(codeqlExtracted, 'CodeQL', codeqlURLVersion);
+        }
+        let codeqlCmd = path.join(codeqlFolder, 'codeql', 'codeql');
+        if (process.platform === 'win32') {
+            codeqlCmd += ".exe";
+        }
+        else if (process.platform !== 'linux' && process.platform !== 'darwin') {
+            throw new Error("Unsupported plaform: " + process.platform);
+        }
+        core.exportVariable(CODEQL_ACTION_CMD, codeqlCmd);
+        return getCodeQLForCmd(codeqlCmd);
+    }
+    catch (e) {
+        core.error(e);
+        throw new Error("Unable to download and extract CodeQL CLI");
+    }
+}
+exports.setupCodeQL = setupCodeQL;
+function getCodeQLURLVersion(url) {
+    const match = url.match(/\/codeql-bundle-(.*)\//);
+    if (match === null || match.length < 2) {
+        throw new Error(`Malformed tools url: ${url}. Version could not be inferred`);
+    }
+    let version = match[1];
+    if (!semver.valid(version)) {
+        core.debug(`Bundle version ${version} is not in SemVer format. Will treat it as pre-release 0.0.0-${version}.`);
+        version = '0.0.0-' + version;
+    }
+    const s = semver.clean(version);
+    if (!s) {
+        throw new Error(`Malformed tools url ${url}. Version should be in SemVer format but have ${version} instead`);
+    }
+    return s;
+}
+exports.getCodeQLURLVersion = getCodeQLURLVersion;
+function getCodeQL() {
+    const codeqlCmd = util.getRequiredEnvParam(CODEQL_ACTION_CMD);
+    return getCodeQLForCmd(codeqlCmd);
+}
+exports.getCodeQL = getCodeQL;
+function getCodeQLForCmd(cmd) {
+    return {
+        getDir: function () {
+            return path.dirname(cmd);
+        },
+        printVersion: async function () {
+            await exec.exec(cmd, [
+                'version',
+                '--format=json'
+            ]);
+        },
+        getTracerEnv: async function (database, compilerSpec) {
+            let envFile = path.resolve(database, 'working', 'env.tmp');
+            const compilerSpecArg = compilerSpec ? "--compiler-spec=" + compilerSpec : [];
+            await exec.exec(cmd, [
+                'database',
+                'trace-command',
+                database,
+                ...compilerSpecArg,
+                process.execPath,
+                path.resolve(__dirname, 'tracer-env.js'),
+                envFile
+            ]);
+            return JSON.parse(fs.readFileSync(envFile, 'utf-8'));
+        },
+        databaseInit: async function (database, language, sourceRoot) {
+            await exec.exec(cmd, [
+                'database',
+                'init',
+                database,
+                '--language=' + language,
+                '--source-root=' + sourceRoot,
+            ]);
+        },
+        extractScannedLanguage: async function (database, language) {
+            // Get extractor location
+            let extractorPath = '';
+            await exec.exec(cmd, [
+                'resolve',
+                'extractor',
+                '--format=json',
+                '--language=' + language
+            ], {
+                silent: true,
+                listeners: {
+                    stdout: (data) => { extractorPath += data.toString(); },
+                    stderr: (data) => { process.stderr.write(data); }
+                }
+            });
+            // Set trace command
+            const ext = process.platform === 'win32' ? '.cmd' : '.sh';
+            const traceCommand = path.resolve(JSON.parse(extractorPath), 'tools', 'autobuild' + ext);
+            // Run trace command
+            await exec.exec(cmd, [
+                'database',
+                'trace-command',
+                path.join(database, language),
+                '--',
+                traceCommand
+            ]);
+        },
+        finalizeDatabase: async function (database, language) {
+            await exec.exec(cmd, [
+                'database',
+                'finalize',
+                path.join(database, language)
+            ]);
+        },
+        resolveQueries: async function (queries) {
+            let output = '';
+            await exec.exec(cmd, [
+                'resolve',
+                'queries',
+                ...queries,
+                '--format=bylanguage'
+            ], {
+                listeners: {
+                    stdout: (data) => {
+                        output += data.toString();
+                    }
+                }
+            });
+            return JSON.parse(output);
+        },
+        databaseAnalyze: async function (database, sarifFile, querySuite) {
+            await exec.exec(cmd, [
+                'database',
+                'analyze',
+                util.getMemoryFlag(),
+                util.getThreadsFlag(),
+                database,
+                '--format=sarif-latest',
+                '--output=' + sarifFile,
+                '--no-sarif-add-snippets',
+                querySuite
+            ]);
+        }
+    };
+}
+//# sourceMappingURL=codeql.js.map
\ No newline at end of file
diff --git a/lib/codeql.js.map b/lib/codeql.js.map
new file mode 100644
index 000000000..c540e7a8d
--- /dev/null
+++ b/lib/codeql.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"codeql.js","sourceRoot":"","sources":["../src/codeql.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/lib/codeql.test.js b/lib/codeql.test.js
new file mode 100644
index 000000000..4dd5923ce
--- /dev/null
+++ b/lib/codeql.test.js
@@ -0,0 +1,60 @@
+"use strict";
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+    result["default"] = mod;
+    return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const toolcache = __importStar(require("@actions/tool-cache"));
+const ava_1 = __importDefault(require("ava"));
+const nock_1 = __importDefault(require("nock"));
+const path = __importStar(require("path"));
+const codeql = __importStar(require("./codeql"));
+const testing_utils_1 = require("./testing-utils");
+const util = __importStar(require("./util"));
+testing_utils_1.silenceDebugOutput(ava_1.default);
+ava_1.default('download codeql bundle cache', async (t) => {
+    await util.withTmpDir(async (tmpDir) => {
+        process.env['GITHUB_WORKSPACE'] = tmpDir;
+        process.env['RUNNER_TEMP'] = path.join(tmpDir, 'temp');
+        process.env['RUNNER_TOOL_CACHE'] = path.join(tmpDir, 'cache');
+        const versions = ['20200601', '20200610'];
+        for (let i = 0; i < versions.length; i++) {
+            const version = versions[i];
+            nock_1.default('https://example.com')
+                .get(`/download/codeql-bundle-${version}/codeql-bundle.tar.gz`)
+                .replyWithFile(200, path.join(__dirname, `/../src/testdata/codeql-bundle.tar.gz`));
+            process.env['INPUT_TOOLS'] = `https://example.com/download/codeql-bundle-${version}/codeql-bundle.tar.gz`;
+            await codeql.setupCodeQL();
+            t.assert(toolcache.find('CodeQL', `0.0.0-${version}`));
+        }
+        const cachedVersions = toolcache.findAllVersions('CodeQL');
+        t.is(cachedVersions.length, 2);
+    });
+});
+ava_1.default('parse codeql bundle url version', t => {
+    const tests = {
+        '20200601': '0.0.0-20200601',
+        '20200601.0': '0.0.0-20200601.0',
+        '20200601.0.0': '20200601.0.0',
+        '1.2.3': '1.2.3',
+        '1.2.3-alpha': '1.2.3-alpha',
+        '1.2.3-beta.1': '1.2.3-beta.1',
+    };
+    for (const [version, expectedVersion] of Object.entries(tests)) {
+        const url = `https://github.com/.../codeql-bundle-${version}/...`;
+        try {
+            const parsedVersion = codeql.getCodeQLURLVersion(url);
+            t.deepEqual(parsedVersion, expectedVersion);
+        }
+        catch (e) {
+            t.fail(e.message);
+        }
+    }
+});
+//# sourceMappingURL=codeql.test.js.map
\ No newline at end of file
diff --git a/lib/codeql.test.js.map b/lib/codeql.test.js.map
new file mode 100644
index 000000000..6555525b4
--- /dev/null
+++ b/lib/codeql.test.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"codeql.test.js","sourceRoot":"","sources":["../src/codeql.test.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+DAAiD;AACjD,8CAAuB;AACvB,gDAAwB;AACxB,2CAA6B;AAE7B,iDAAmC;AACnC,mDAAmD;AACnD,6CAA+B;AAE/B,kCAAkB,CAAC,aAAI,CAAC,CAAC;AAEzB,aAAI,CAAC,8BAA8B,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAE7C,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAC,MAAM,EAAC,EAAE;QAEnC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC;QAEzC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE9D,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAE5B,cAAI,CAAC,qBAAqB,CAAC;iBACxB,GAAG,CAAC,2BAA2B,OAAO,uBAAuB,CAAC;iBAC9D,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uCAAuC,CAAC,CAAC,CAAC;YAGrF,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,8CAA8C,OAAO,uBAAuB,CAAC;YAE1G,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAE3B,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC;SACxD;QAED,MAAM,cAAc,GAAG,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE3D,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,iCAAiC,EAAE,CAAC,CAAC,EAAE;IAE1C,MAAM,KAAK,GAAG;QACZ,UAAU,EAAE,gBAAgB;QAC5B,YAAY,EAAE,kBAAkB;QAChC,cAAc,EAAE,cAAc;QAC9B,OAAO,EAAE,OAAO;QAChB,aAAa,EAAE,aAAa;QAC5B,cAAc,EAAE,cAAc;KAC/B,CAAC;IAEF,KAAK,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAC9D,MAAM,GAAG,GAAG,wCAAwC,OAAO,MAAM,CAAC;QAElE,IAAI;YACF,MAAM,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YACtD,CAAC,CAAC,SAAS,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;SAC7C;QAAC,OAAO,CAAC,EAAE;YACV,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;SACnB;KACF;AACH,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/lib/finalize-db.js b/lib/finalize-db.js
index 51f979450..f7264d64b 100644
--- a/lib/finalize-db.js
+++ b/lib/finalize-db.js
@@ -8,10 +8,10 @@ var __importStar = (this && this.__importStar) || function (mod) {
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 const core = __importStar(require("@actions/core"));
-const exec = __importStar(require("@actions/exec"));
 const io = __importStar(require("@actions/io"));
 const fs = __importStar(require("fs"));
 const path = __importStar(require("path"));
+const codeql_1 = require("./codeql");
 const configUtils = __importStar(require("./config-utils"));
 const externalQueries = __importStar(require("./external-queries"));
 const sharedEnv = __importStar(require("./shared-environment"));
@@ -36,57 +36,30 @@ function queryIsDisabled(language, query) {
     return (DISABLED_BUILTIN_QUERIES[language] || [])
         .some(disabledQuery => query.endsWith(disabledQuery));
 }
-async function createdDBForScannedLanguages(codeqlCmd, databaseFolder) {
+async function createdDBForScannedLanguages(databaseFolder) {
     const scannedLanguages = process.env[sharedEnv.CODEQL_ACTION_SCANNED_LANGUAGES];
     if (scannedLanguages) {
+        const codeql = codeql_1.getCodeQL();
         for (const language of scannedLanguages.split(',')) {
             core.startGroup('Extracting ' + language);
-            // Get extractor location
-            let extractorPath = '';
-            await exec.exec(codeqlCmd, ['resolve', 'extractor', '--format=json', '--language=' + language], {
-                silent: true,
-                listeners: {
-                    stdout: (data) => { extractorPath += data.toString(); },
-                    stderr: (data) => { process.stderr.write(data); }
-                }
-            });
-            // Set trace command
-            const ext = process.platform === 'win32' ? '.cmd' : '.sh';
-            const traceCommand = path.resolve(JSON.parse(extractorPath), 'tools', 'autobuild' + ext);
-            // Run trace command
-            await exec.exec(codeqlCmd, ['database', 'trace-command', path.join(databaseFolder, language), '--', traceCommand]);
+            await codeql.extractScannedLanguage(databaseFolder, language);
             core.endGroup();
         }
     }
 }
-async function finalizeDatabaseCreation(codeqlCmd, databaseFolder) {
-    await createdDBForScannedLanguages(codeqlCmd, databaseFolder);
+async function finalizeDatabaseCreation(databaseFolder) {
+    await createdDBForScannedLanguages(databaseFolder);
     const languages = process.env[sharedEnv.CODEQL_ACTION_LANGUAGES] || '';
+    const codeql = codeql_1.getCodeQL();
     for (const language of languages.split(',')) {
         core.startGroup('Finalizing ' + language);
-        await exec.exec(codeqlCmd, ['database', 'finalize', path.join(databaseFolder, language)]);
+        await codeql.finalizeDatabase(databaseFolder, language);
         core.endGroup();
     }
 }
-async function runResolveQueries(codeqlCmd, queries) {
-    let output = '';
-    const options = {
-        listeners: {
-            stdout: (data) => {
-                output += data.toString();
-            }
-        }
-    };
-    await exec.exec(codeqlCmd, [
-        'resolve',
-        'queries',
-        ...queries,
-        '--format=bylanguage'
-    ], options);
-    return JSON.parse(output);
-}
-async function resolveQueryLanguages(codeqlCmd, config) {
+async function resolveQueryLanguages(config) {
     let res = new Map();
+    const codeql = codeql_1.getCodeQL();
     if (!config.disableDefaultQueries || config.additionalSuites.length !== 0) {
         const suites = [];
         for (const language of await util.getLanguages()) {
@@ -97,7 +70,7 @@ async function resolveQueryLanguages(codeqlCmd, config) {
                 suites.push(language + '-' + additionalSuite + '.qls');
             }
         }
-        const resolveQueriesOutputObject = await runResolveQueries(codeqlCmd, suites);
+        const resolveQueriesOutputObject = await codeql.resolveQueries(suites);
         for (const [language, queries] of Object.entries(resolveQueriesOutputObject.byLanguage)) {
             if (res[language] === undefined) {
                 res[language] = [];
@@ -106,7 +79,7 @@ async function resolveQueryLanguages(codeqlCmd, config) {
         }
     }
     if (config.additionalQueries.length !== 0) {
-        const resolveQueriesOutputObject = await runResolveQueries(codeqlCmd, config.additionalQueries);
+        const resolveQueriesOutputObject = await codeql.resolveQueries(config.additionalQueries);
         for (const [language, queries] of Object.entries(resolveQueriesOutputObject.byLanguage)) {
             if (res[language] === undefined) {
                 res[language] = [];
@@ -127,8 +100,9 @@ async function resolveQueryLanguages(codeqlCmd, config) {
     return res;
 }
 // Runs queries and creates sarif files in the given folder
-async function runQueries(codeqlCmd, databaseFolder, sarifFolder, config) {
-    const queriesPerLanguage = await resolveQueryLanguages(codeqlCmd, config);
+async function runQueries(databaseFolder, sarifFolder, config) {
+    const queriesPerLanguage = await resolveQueryLanguages(config);
+    const codeql = codeql_1.getCodeQL();
     for (let database of fs.readdirSync(databaseFolder)) {
         core.startGroup('Analyzing ' + database);
         const queries = queriesPerLanguage[database] || [];
@@ -142,17 +116,7 @@ async function runQueries(codeqlCmd, databaseFolder, sarifFolder, config) {
         fs.writeFileSync(querySuite, querySuiteContents);
         core.debug('Query suite file for ' + database + '...\n' + querySuiteContents);
         const sarifFile = path.join(sarifFolder, database + '.sarif');
-        await exec.exec(codeqlCmd, [
-            'database',
-            'analyze',
-            util.getMemoryFlag(),
-            util.getThreadsFlag(),
-            path.join(databaseFolder, database),
-            '--format=sarif-latest',
-            '--output=' + sarifFile,
-            '--no-sarif-add-snippets',
-            querySuite
-        ]);
+        await codeql.databaseAnalyze(path.join(databaseFolder, database), sarifFile, querySuite);
         core.debug('SARIF results for database ' + database + ' created at "' + sarifFile + '"');
         core.endGroup();
     }
@@ -165,15 +129,14 @@ async function run() {
         const config = await configUtils.loadConfig();
         core.exportVariable(sharedEnv.ODASA_TRACER_CONFIGURATION, '');
         delete process.env[sharedEnv.ODASA_TRACER_CONFIGURATION];
-        const codeqlCmd = util.getRequiredEnvParam(sharedEnv.CODEQL_ACTION_CMD);
         const databaseFolder = util.getRequiredEnvParam(sharedEnv.CODEQL_ACTION_DATABASE_DIR);
         const sarifFolder = core.getInput('output');
         await io.mkdirP(sarifFolder);
         core.info('Finalizing database creation');
-        await finalizeDatabaseCreation(codeqlCmd, databaseFolder);
+        await finalizeDatabaseCreation(databaseFolder);
         await externalQueries.checkoutExternalQueries(config);
         core.info('Analyzing database');
-        await runQueries(codeqlCmd, databaseFolder, sarifFolder, config);
+        await runQueries(databaseFolder, sarifFolder, config);
         if ('true' === core.getInput('upload')) {
             if (!await upload_lib.upload(sarifFolder)) {
                 await util.reportActionFailed('finish', 'upload');
diff --git a/lib/finalize-db.js.map b/lib/finalize-db.js.map
index efbd0f997..6a5410ae3 100644
--- a/lib/finalize-db.js.map
+++ b/lib/finalize-db.js.map
@@ -1 +1 @@
-{"version":3,"file":"finalize-db.js","sourceRoot":"","sources":["../src/finalize-db.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"finalize-db.js","sourceRoot":"","sources":["../src/finalize-db.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/lib/setup-tracer.js b/lib/setup-tracer.js
index e2feddb5f..40d09aad4 100644
--- a/lib/setup-tracer.js
+++ b/lib/setup-tracer.js
@@ -13,8 +13,8 @@ const io = __importStar(require("@actions/io"));
 const fs = __importStar(require("fs"));
 const path = __importStar(require("path"));
 const analysisPaths = __importStar(require("./analysis-paths"));
+const codeql_1 = require("./codeql");
 const configUtils = __importStar(require("./config-utils"));
-const setuptools = __importStar(require("./setup-tools"));
 const sharedEnv = __importStar(require("./shared-environment"));
 const util = __importStar(require("./util"));
 const CRITICAL_TRACER_VARS = new Set(['SEMMLE_PRELOAD_libtrace',
@@ -28,12 +28,7 @@ const CRITICAL_TRACER_VARS = new Set(['SEMMLE_PRELOAD_libtrace',
     'SEMMLE_JAVA_TOOL_OPTIONS'
 ]);
 async function tracerConfig(codeql, database, compilerSpec) {
-    const compilerSpecArg = compilerSpec ? ["--compiler-spec=" + compilerSpec] : [];
-    let envFile = path.resolve(database, 'working', 'env.tmp');
-    await exec.exec(codeql.cmd, ['database', 'trace-command', database,
-        ...compilerSpecArg,
-        process.execPath, path.resolve(__dirname, 'tracer-env.js'), envFile]);
-    const env = JSON.parse(fs.readFileSync(envFile, 'utf-8'));
+    const env = await codeql.getTracerEnv(database, compilerSpec);
     const config = env['ODASA_TRACER_CONFIGURATION'];
     const info = { spec: config, env: {} };
     // Extract critical tracer variables from the environment
@@ -151,8 +146,8 @@ async function run() {
     try {
         const sourceRoot = path.resolve();
         core.startGroup('Setup CodeQL tools');
-        const codeqlSetup = await setuptools.setupCodeQL();
-        await exec.exec(codeqlSetup.cmd, ['version', '--format=json']);
+        const codeql = await codeql_1.setupCodeQL();
+        await codeql.printVersion();
         core.endGroup();
         // Forward Go flags
         const goFlags = process.env['GOFLAGS'];
@@ -171,16 +166,10 @@ async function run() {
         for (let language of languages) {
             const languageDatabase = path.join(databaseFolder, language);
             // Init language database
-            await exec.exec(codeqlSetup.cmd, [
-                'database',
-                'init',
-                languageDatabase,
-                '--language=' + language,
-                '--source-root=' + sourceRoot,
-            ]);
+            await codeql.databaseInit(languageDatabase, language, sourceRoot);
             // TODO: add better detection of 'traced languages' instead of using a hard coded list
             if (['cpp', 'java', 'csharp'].includes(language)) {
-                const config = await tracerConfig(codeqlSetup, languageDatabase);
+                const config = await tracerConfig(codeql, languageDatabase);
                 tracedLanguages[language] = config;
             }
             else {
@@ -196,16 +185,16 @@ async function run() {
                 }
                 core.exportVariable('ODASA_TRACER_CONFIGURATION', mainTracerConfig.spec);
                 if (process.platform === 'darwin') {
-                    core.exportVariable('DYLD_INSERT_LIBRARIES', path.join(codeqlSetup.tools, 'osx64', 'libtrace.dylib'));
+                    core.exportVariable('DYLD_INSERT_LIBRARIES', path.join(codeql.getDir(), 'tools', 'osx64', 'libtrace.dylib'));
                 }
                 else if (process.platform === 'win32') {
                     await exec.exec('powershell', [
                         path.resolve(__dirname, '..', 'src', 'inject-tracer.ps1'),
-                        path.resolve(codeqlSetup.tools, 'win64', 'tracer.exe'),
+                        path.resolve(codeql.getDir(), 'tools', 'win64', 'tracer.exe'),
                     ], { env: { 'ODASA_TRACER_CONFIGURATION': mainTracerConfig.spec } });
                 }
                 else {
-                    core.exportVariable('LD_PRELOAD', path.join(codeqlSetup.tools, 'linux64', '${LIB}trace.so'));
+                    core.exportVariable('LD_PRELOAD', path.join(codeql.getDir(), 'tools', 'linux64', '${LIB}trace.so'));
                 }
             }
         }
@@ -213,7 +202,6 @@ async function run() {
         core.exportVariable(sharedEnv.CODEQL_ACTION_TRACED_LANGUAGES, tracedLanguageKeys.join(','));
         // TODO: make this a "private" environment variable of the action
         core.exportVariable(sharedEnv.CODEQL_ACTION_DATABASE_DIR, databaseFolder);
-        core.exportVariable(sharedEnv.CODEQL_ACTION_CMD, codeqlSetup.cmd);
     }
     catch (error) {
         core.setFailed(error.message);
diff --git a/lib/setup-tracer.js.map b/lib/setup-tracer.js.map
index 921161d2b..4fbf7828d 100644
--- a/lib/setup-tracer.js.map
+++ b/lib/setup-tracer.js.map
@@ -1 +1 @@
-{"version":3,"file":"setup-tracer.js","sourceRoot":"","sources":["../src/setup-tracer.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"setup-tracer.js","sourceRoot":"","sources":["../src/setup-tracer.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/lib/shared-environment.js b/lib/shared-environment.js
index 8feb5f0d1..0b9afaf41 100644
--- a/lib/shared-environment.js
+++ b/lib/shared-environment.js
@@ -1,6 +1,5 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.CODEQL_ACTION_CMD = 'CODEQL_ACTION_CMD';
 exports.CODEQL_ACTION_DATABASE_DIR = 'CODEQL_ACTION_DATABASE_DIR';
 exports.CODEQL_ACTION_LANGUAGES = 'CODEQL_ACTION_LANGUAGES';
 exports.CODEQL_ACTION_ANALYSIS_KEY = 'CODEQL_ACTION_ANALYSIS_KEY';
diff --git a/lib/shared-environment.js.map b/lib/shared-environment.js.map
index fff795193..8252896c5 100644
--- a/lib/shared-environment.js.map
+++ b/lib/shared-environment.js.map
@@ -1 +1 @@
-{"version":3,"file":"shared-environment.js","sourceRoot":"","sources":["../src/shared-environment.ts"],"names":[],"mappings":";;AAAa,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AACxC,QAAA,0BAA0B,GAAG,4BAA4B,CAAC;AAC1D,QAAA,uBAAuB,GAAG,yBAAyB,CAAC;AACpD,QAAA,0BAA0B,GAAG,4BAA4B,CAAC;AAC1D,QAAA,0BAA0B,GAAG,4BAA4B,CAAC;AAC1D,QAAA,+BAA+B,GAAG,iCAAiC,CAAC;AACpE,QAAA,8BAA8B,GAAG,gCAAgC,CAAC;AAC/E,wEAAwE;AACxE,2EAA2E;AAC3E,4EAA4E;AAC5E,2EAA2E;AAC3E,+BAA+B;AAClB,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AACnE,wDAAwD;AAC3C,QAAA,4BAA4B,GAAG,8BAA8B,CAAC"}
\ No newline at end of file
+{"version":3,"file":"shared-environment.js","sourceRoot":"","sources":["../src/shared-environment.ts"],"names":[],"mappings":";;AAAa,QAAA,0BAA0B,GAAG,4BAA4B,CAAC;AAC1D,QAAA,uBAAuB,GAAG,yBAAyB,CAAC;AACpD,QAAA,0BAA0B,GAAG,4BAA4B,CAAC;AAC1D,QAAA,0BAA0B,GAAG,4BAA4B,CAAC;AAC1D,QAAA,+BAA+B,GAAG,iCAAiC,CAAC;AACpE,QAAA,8BAA8B,GAAG,gCAAgC,CAAC;AAC/E,wEAAwE;AACxE,2EAA2E;AAC3E,4EAA4E;AAC5E,2EAA2E;AAC3E,+BAA+B;AAClB,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AACnE,wDAAwD;AAC3C,QAAA,4BAA4B,GAAG,8BAA8B,CAAC"}
\ No newline at end of file
diff --git a/src/autobuild.ts b/src/autobuild.ts
index 4dedb3343..6d3d35e50 100644
--- a/src/autobuild.ts
+++ b/src/autobuild.ts
@@ -2,6 +2,7 @@ import * as core from '@actions/core';
 import * as exec from '@actions/exec';
 import * as path from 'path';
 
+import { getCodeQL } from './codeql';
 import * as sharedEnv from './shared-environment';
 import * as util from './util';
 
@@ -30,12 +31,9 @@ async function run() {
     }
 
     core.startGroup(`Attempting to automatically build ${language} code`);
-    // TODO: share config accross actions better via env variables
-    const codeqlCmd = util.getRequiredEnvParam(sharedEnv.CODEQL_ACTION_CMD);
-
+    const codeQL = getCodeQL();
     const cmdName = process.platform === 'win32' ? 'autobuild.cmd' : 'autobuild.sh';
-    const autobuildCmd = path.join(path.dirname(codeqlCmd), language, 'tools', cmdName);
-
+    const autobuildCmd = path.join(codeQL.getDir(), language, 'tools', cmdName);
 
     // Update JAVA_TOOL_OPTIONS to contain '-Dhttp.keepAlive=false'
     // This is because of an issue with Azure pipelines timing out connections after 4 minutes
diff --git a/src/setup-tools.test.ts b/src/codeql.test.ts
similarity index 91%
rename from src/setup-tools.test.ts
rename to src/codeql.test.ts
index aa21246df..256759508 100644
--- a/src/setup-tools.test.ts
+++ b/src/codeql.test.ts
@@ -3,7 +3,7 @@ import test from 'ava';
 import nock from 'nock';
 import * as path from 'path';
 
-import * as setupTools from './setup-tools';
+import * as codeql from './codeql';
 import {silenceDebugOutput} from './testing-utils';
 import * as util from './util';
 
@@ -30,7 +30,7 @@ test('download codeql bundle cache', async t => {
 
       process.env['INPUT_TOOLS'] = `https://example.com/download/codeql-bundle-${version}/codeql-bundle.tar.gz`;
 
-      await setupTools.setupCodeQL();
+      await codeql.setupCodeQL();
 
       t.assert(toolcache.find('CodeQL', `0.0.0-${version}`));
     }
@@ -56,7 +56,7 @@ test('parse codeql bundle url version', t => {
     const url = `https://github.com/.../codeql-bundle-${version}/...`;
 
     try {
-      const parsedVersion = setupTools.getCodeQLURLVersion(url);
+      const parsedVersion = codeql.getCodeQLURLVersion(url);
       t.deepEqual(parsedVersion, expectedVersion);
     } catch (e) {
       t.fail(e.message);
diff --git a/src/codeql.ts b/src/codeql.ts
new file mode 100644
index 000000000..c03fe4fab
--- /dev/null
+++ b/src/codeql.ts
@@ -0,0 +1,231 @@
+import * as core from '@actions/core';
+import * as exec from '@actions/exec';
+import * as toolcache from '@actions/tool-cache';
+import * as fs from 'fs';
+import * as path from 'path';
+import * as semver from 'semver';
+
+import * as util from './util';
+
+export interface CodeQL {
+  /**
+   * Get the directory where the CodeQL executable is located.
+   */
+  getDir(): string;
+  /**
+   * Print version information about CodeQL.
+   */
+  printVersion(): Promise<void>;
+  /**
+   * Run 'codeql database trace-command' on 'tracer-env.js' and parse
+   * the result to get environment variables set by CodeQL.
+   */
+  getTracerEnv(database: string, compilerSpec: string | undefined): Promise<{ [key: string]: string }>;
+  /**
+   * Run 'codeql database init'.
+   */
+  databaseInit(database: string, language: string, sourceRoot: string): Promise<void>;
+  /**
+   * Extract code for a scanned language using 'codeql database trace-command'
+   * and running the language extracter.
+   */
+  extractScannedLanguage(database: string, language: string): Promise<void>;
+  /**
+   * Finalize a database using 'codeql database finalize'.
+   */
+  finalizeDatabase(database: string, language: string): Promise<void>;
+  /**
+   * Run 'codeql resolve queries'.
+   */
+  resolveQueries(queries): Promise<ResolveQueriesOutput>;
+  /**
+   * Run 'codeql database analyze'.
+   */
+  databaseAnalyze(database: string, sarifFile: string, querySuite: string): Promise<void>;
+}
+
+export interface ResolveQueriesOutput {
+  byLanguage: {
+    [language: string]: {
+      [queryPath: string]: {}
+    }
+  };
+  noDeclaredLanguage: {
+    [queryPath: string]: {}
+  };
+  multipleDeclaredLanguages: {
+    [queryPath: string]: {}
+  };
+}
+
+/**
+ * Environment variable used to store the location of the CodeQL CLI executable.
+ * Value is set by setupCodeQL and read by getCodeQL.
+ */
+const CODEQL_ACTION_CMD = "CODEQL_ACTION_CMD";
+
+export async function setupCodeQL(): Promise<CodeQL> {
+  try {
+    const codeqlURL = core.getInput('tools', { required: true });
+    const codeqlURLVersion = getCodeQLURLVersion(codeqlURL);
+
+    let codeqlFolder = toolcache.find('CodeQL', codeqlURLVersion);
+    if (codeqlFolder) {
+      core.debug(`CodeQL found in cache ${codeqlFolder}`);
+    } else {
+      const codeqlPath = await toolcache.downloadTool(codeqlURL);
+      const codeqlExtracted = await toolcache.extractTar(codeqlPath);
+      codeqlFolder = await toolcache.cacheDir(codeqlExtracted, 'CodeQL', codeqlURLVersion);
+    }
+
+    let codeqlCmd = path.join(codeqlFolder, 'codeql', 'codeql');
+    if (process.platform === 'win32') {
+      codeqlCmd += ".exe";
+    } else if (process.platform !== 'linux' && process.platform !== 'darwin') {
+      throw new Error("Unsupported plaform: " + process.platform);
+    }
+
+    core.exportVariable(CODEQL_ACTION_CMD, codeqlCmd);
+    return getCodeQLForCmd(codeqlCmd);
+
+  } catch (e) {
+    core.error(e);
+    throw new Error("Unable to download and extract CodeQL CLI");
+  }
+}
+
+export function getCodeQLURLVersion(url: string): string {
+
+  const match = url.match(/\/codeql-bundle-(.*)\//);
+  if (match === null || match.length < 2) {
+    throw new Error(`Malformed tools url: ${url}. Version could not be inferred`);
+  }
+
+  let version = match[1];
+
+  if (!semver.valid(version)) {
+    core.debug(`Bundle version ${version} is not in SemVer format. Will treat it as pre-release 0.0.0-${version}.`);
+    version = '0.0.0-' + version;
+  }
+
+  const s = semver.clean(version);
+  if (!s) {
+    throw new Error(`Malformed tools url ${url}. Version should be in SemVer format but have ${version} instead`);
+  }
+
+  return s;
+}
+
+export function getCodeQL(): CodeQL {
+  const codeqlCmd = util.getRequiredEnvParam(CODEQL_ACTION_CMD);
+  return getCodeQLForCmd(codeqlCmd);
+}
+
+function getCodeQLForCmd(cmd: string): CodeQL {
+  return {
+    getDir: function() {
+      return path.dirname(cmd);
+    },
+    printVersion: async function() {
+      await exec.exec(cmd, [
+        'version',
+        '--format=json'
+      ]);
+    },
+    getTracerEnv: async function(database: string, compilerSpec: string | undefined) {
+      let envFile = path.resolve(database, 'working', 'env.tmp');
+      const compilerSpecArg = compilerSpec ? "--compiler-spec=" + compilerSpec : [];
+      await exec.exec(cmd, [
+        'database',
+        'trace-command',
+        database,
+        ...compilerSpecArg,
+        process.execPath,
+        path.resolve(__dirname, 'tracer-env.js'),
+        envFile
+      ]);
+      return JSON.parse(fs.readFileSync(envFile, 'utf-8'));
+    },
+    databaseInit: async function(database: string, language: string, sourceRoot: string) {
+      await exec.exec(cmd, [
+        'database',
+        'init',
+        database,
+        '--language=' + language,
+        '--source-root=' + sourceRoot,
+      ]);
+    },
+    extractScannedLanguage: async function(database: string, language: string) {
+      // Get extractor location
+      let extractorPath = '';
+      await exec.exec(
+        cmd,
+        [
+          'resolve',
+          'extractor',
+          '--format=json',
+          '--language=' + language
+        ],
+        {
+          silent: true,
+          listeners: {
+            stdout: (data) => { extractorPath += data.toString(); },
+            stderr: (data) => { process.stderr.write(data); }
+          }
+        });
+
+      // Set trace command
+      const ext = process.platform === 'win32' ? '.cmd' : '.sh';
+      const traceCommand = path.resolve(JSON.parse(extractorPath), 'tools', 'autobuild' + ext);
+
+      // Run trace command
+      await exec.exec(cmd, [
+        'database',
+        'trace-command',
+        path.join(database, language),
+        '--',
+        traceCommand
+      ]);
+    },
+    finalizeDatabase: async function(database: string, language: string) {
+      await exec.exec(cmd, [
+        'database',
+        'finalize',
+        path.join(database, language)
+      ]);
+    },
+    resolveQueries: async function(queries: string[]) {
+      let output = '';
+      await exec.exec(
+        cmd,
+        [
+          'resolve',
+          'queries',
+          ...queries,
+          '--format=bylanguage'
+        ],
+        {
+          listeners: {
+            stdout: (data: Buffer) => {
+              output += data.toString();
+            }
+          }
+        });
+
+      return JSON.parse(output);
+    },
+    databaseAnalyze: async function(database: string, sarifFile: string, querySuite: string) {
+      await exec.exec(cmd, [
+        'database',
+        'analyze',
+        util.getMemoryFlag(),
+        util.getThreadsFlag(),
+        database,
+        '--format=sarif-latest',
+        '--output=' + sarifFile,
+        '--no-sarif-add-snippets',
+        querySuite
+      ]);
+    }
+  };
+}
diff --git a/src/finalize-db.ts b/src/finalize-db.ts
index f1ca1d5ea..52a4b3843 100644
--- a/src/finalize-db.ts
+++ b/src/finalize-db.ts
@@ -1,9 +1,9 @@
 import * as core from '@actions/core';
-import * as exec from '@actions/exec';
 import * as io from '@actions/io';
 import * as fs from 'fs';
 import * as path from 'path';
 
+import { getCodeQL } from './codeql';
 import * as configUtils from './config-utils';
 import * as externalQueries from "./external-queries";
 import * as sharedEnv from './shared-environment';
@@ -31,85 +31,33 @@ function queryIsDisabled(language, query): boolean {
     .some(disabledQuery => query.endsWith(disabledQuery));
 }
 
-async function createdDBForScannedLanguages(codeqlCmd: string, databaseFolder: string) {
+async function createdDBForScannedLanguages(databaseFolder: string) {
   const scannedLanguages = process.env[sharedEnv.CODEQL_ACTION_SCANNED_LANGUAGES];
   if (scannedLanguages) {
+    const codeql = getCodeQL();
     for (const language of scannedLanguages.split(',')) {
       core.startGroup('Extracting ' + language);
-
-      // Get extractor location
-      let extractorPath = '';
-      await exec.exec(codeqlCmd, ['resolve', 'extractor', '--format=json', '--language=' + language], {
-        silent: true,
-        listeners: {
-          stdout: (data) => { extractorPath += data.toString(); },
-          stderr: (data) => { process.stderr.write(data); }
-        }
-      });
-
-      // Set trace command
-      const ext = process.platform === 'win32' ? '.cmd' : '.sh';
-      const traceCommand = path.resolve(JSON.parse(extractorPath), 'tools', 'autobuild' + ext);
-
-      // Run trace command
-      await exec.exec(
-        codeqlCmd,
-        ['database', 'trace-command', path.join(databaseFolder, language), '--', traceCommand]);
-
+      await codeql.extractScannedLanguage(databaseFolder, language);
       core.endGroup();
     }
   }
 }
 
-async function finalizeDatabaseCreation(codeqlCmd: string, databaseFolder: string) {
-  await createdDBForScannedLanguages(codeqlCmd, databaseFolder);
+async function finalizeDatabaseCreation(databaseFolder: string) {
+  await createdDBForScannedLanguages(databaseFolder);
 
   const languages = process.env[sharedEnv.CODEQL_ACTION_LANGUAGES] || '';
+  const codeql = getCodeQL();
   for (const language of languages.split(',')) {
     core.startGroup('Finalizing ' + language);
-    await exec.exec(codeqlCmd, ['database', 'finalize', path.join(databaseFolder, language)]);
+    await codeql.finalizeDatabase(databaseFolder, language);
     core.endGroup();
   }
 }
 
-interface ResolveQueriesOutput {
-  byLanguage: {
-    [language: string]: {
-      [queryPath: string]: {}
-    }
-  };
-  noDeclaredLanguage: {
-    [queryPath: string]: {}
-  };
-  multipleDeclaredLanguages: {
-    [queryPath: string]: {}
-  };
-}
-
-async function runResolveQueries(codeqlCmd: string, queries: string[]): Promise<ResolveQueriesOutput> {
-  let output = '';
-  const options = {
-    listeners: {
-      stdout: (data: Buffer) => {
-        output += data.toString();
-      }
-    }
-  };
-
-  await exec.exec(
-    codeqlCmd, [
-      'resolve',
-      'queries',
-      ...queries,
-      '--format=bylanguage'
-    ],
-    options);
-
-  return JSON.parse(output);
-}
-
-async function resolveQueryLanguages(codeqlCmd: string, config: configUtils.Config): Promise<Map<string, string[]>> {
+async function resolveQueryLanguages(config: configUtils.Config): Promise<Map<string, string[]>> {
   let res = new Map();
+  const codeql = getCodeQL();
 
   if (!config.disableDefaultQueries || config.additionalSuites.length !== 0) {
     const suites: string[] = [];
@@ -122,7 +70,7 @@ async function resolveQueryLanguages(codeqlCmd: string, config: configUtils.Conf
       }
     }
 
-    const resolveQueriesOutputObject = await runResolveQueries(codeqlCmd, suites);
+    const resolveQueriesOutputObject = await codeql.resolveQueries(suites);
 
     for (const [language, queries] of Object.entries(resolveQueriesOutputObject.byLanguage)) {
       if (res[language] === undefined) {
@@ -133,7 +81,7 @@ async function resolveQueryLanguages(codeqlCmd: string, config: configUtils.Conf
   }
 
   if (config.additionalQueries.length !== 0) {
-    const resolveQueriesOutputObject = await runResolveQueries(codeqlCmd, config.additionalQueries);
+    const resolveQueriesOutputObject = await codeql.resolveQueries(config.additionalQueries);
 
     for (const [language, queries] of Object.entries(resolveQueriesOutputObject.byLanguage)) {
       if (res[language] === undefined) {
@@ -159,8 +107,9 @@ async function resolveQueryLanguages(codeqlCmd: string, config: configUtils.Conf
 }
 
 // Runs queries and creates sarif files in the given folder
-async function runQueries(codeqlCmd: string, databaseFolder: string, sarifFolder: string, config: configUtils.Config) {
-  const queriesPerLanguage = await resolveQueryLanguages(codeqlCmd, config);
+async function runQueries(databaseFolder: string, sarifFolder: string, config: configUtils.Config) {
+  const queriesPerLanguage = await resolveQueryLanguages(config);
+  const codeql = getCodeQL();
 
   for (let database of fs.readdirSync(databaseFolder)) {
     core.startGroup('Analyzing ' + database);
@@ -179,17 +128,7 @@ async function runQueries(codeqlCmd: string, databaseFolder: string, sarifFolder
 
     const sarifFile = path.join(sarifFolder, database + '.sarif');
 
-    await exec.exec(codeqlCmd, [
-      'database',
-      'analyze',
-      util.getMemoryFlag(),
-      util.getThreadsFlag(),
-      path.join(databaseFolder, database),
-      '--format=sarif-latest',
-      '--output=' + sarifFile,
-      '--no-sarif-add-snippets',
-      querySuite
-    ]);
+    await codeql.databaseAnalyze(path.join(databaseFolder, database), sarifFile, querySuite);
 
     core.debug('SARIF results for database ' + database + ' created at "' + sarifFile + '"');
     core.endGroup();
@@ -206,19 +145,18 @@ async function run() {
     core.exportVariable(sharedEnv.ODASA_TRACER_CONFIGURATION, '');
     delete process.env[sharedEnv.ODASA_TRACER_CONFIGURATION];
 
-    const codeqlCmd = util.getRequiredEnvParam(sharedEnv.CODEQL_ACTION_CMD);
     const databaseFolder = util.getRequiredEnvParam(sharedEnv.CODEQL_ACTION_DATABASE_DIR);
 
     const sarifFolder = core.getInput('output');
     await io.mkdirP(sarifFolder);
 
     core.info('Finalizing database creation');
-    await finalizeDatabaseCreation(codeqlCmd, databaseFolder);
+    await finalizeDatabaseCreation(databaseFolder);
 
     await externalQueries.checkoutExternalQueries(config);
 
     core.info('Analyzing database');
-    await runQueries(codeqlCmd, databaseFolder, sarifFolder, config);
+    await runQueries(databaseFolder, sarifFolder, config);
 
     if ('true' === core.getInput('upload')) {
       if (!await upload_lib.upload(sarifFolder)) {
diff --git a/src/setup-tools.ts b/src/setup-tools.ts
deleted file mode 100644
index bb99ec7fb..000000000
--- a/src/setup-tools.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import * as core from '@actions/core';
-import * as toolcache from '@actions/tool-cache';
-import * as path from 'path';
-import * as semver from 'semver';
-
-export class CodeQLSetup {
-  public dist: string;
-  public tools: string;
-  public cmd: string;
-  public platform: string;
-
-  constructor(codeqlDist: string) {
-    this.dist = codeqlDist;
-    this.tools = path.join(this.dist, 'tools');
-    this.cmd = path.join(codeqlDist, 'codeql');
-    // TODO check process.arch ?
-    if (process.platform === 'win32') {
-      this.platform = 'win64';
-      if (this.cmd.endsWith('codeql')) {
-        this.cmd += ".exe";
-      }
-    } else if (process.platform === 'linux') {
-      this.platform = 'linux64';
-    } else if (process.platform === 'darwin') {
-      this.platform = 'osx64';
-    } else {
-      throw new Error("Unsupported plaform: " + process.platform);
-    }
-  }
-}
-
-export async function setupCodeQL(): Promise<CodeQLSetup> {
-  try {
-    const codeqlURL = core.getInput('tools', { required: true });
-    const codeqlURLVersion = getCodeQLURLVersion(codeqlURL);
-
-    let codeqlFolder = toolcache.find('CodeQL', codeqlURLVersion);
-    if (codeqlFolder) {
-      core.debug(`CodeQL found in cache ${codeqlFolder}`);
-    } else {
-      const codeqlPath = await toolcache.downloadTool(codeqlURL);
-      const codeqlExtracted = await toolcache.extractTar(codeqlPath);
-      codeqlFolder = await toolcache.cacheDir(codeqlExtracted, 'CodeQL', codeqlURLVersion);
-    }
-    return new CodeQLSetup(path.join(codeqlFolder, 'codeql'));
-
-  } catch (e) {
-    core.error(e);
-    throw new Error("Unable to download and extract CodeQL CLI");
-  }
-}
-
-export function getCodeQLURLVersion(url: string): string {
-
-  const match = url.match(/\/codeql-bundle-(.*)\//);
-  if (match === null || match.length < 2) {
-    throw new Error(`Malformed tools url: ${url}. Version could not be inferred`);
-  }
-
-  let version = match[1];
-
-  if (!semver.valid(version)) {
-    core.debug(`Bundle version ${version} is not in SemVer format. Will treat it as pre-release 0.0.0-${version}.`);
-    version = '0.0.0-' + version;
-  }
-
-  const s = semver.clean(version);
-  if (!s) {
-    throw new Error(`Malformed tools url ${url}. Version should be in SemVer format but have ${version} instead`);
-  }
-
-  return s;
-}
diff --git a/src/setup-tracer.ts b/src/setup-tracer.ts
index 370e29691..b18a3c539 100644
--- a/src/setup-tracer.ts
+++ b/src/setup-tracer.ts
@@ -5,8 +5,8 @@ import * as fs from 'fs';
 import * as path from 'path';
 
 import * as analysisPaths from './analysis-paths';
+import { CodeQL, setupCodeQL } from './codeql';
 import * as configUtils from './config-utils';
-import * as setuptools from './setup-tools';
 import * as sharedEnv from './shared-environment';
 import * as util from './util';
 
@@ -24,19 +24,11 @@ const CRITICAL_TRACER_VARS = new Set(
   ]);
 
 async function tracerConfig(
-  codeql: setuptools.CodeQLSetup,
+  codeql: CodeQL,
   database: string,
   compilerSpec?: string): Promise<TracerConfig> {
 
-  const compilerSpecArg = compilerSpec ? ["--compiler-spec=" + compilerSpec] : [];
-
-  let envFile = path.resolve(database, 'working', 'env.tmp');
-  await exec.exec(codeql.cmd, ['database', 'trace-command', database,
-    ...compilerSpecArg,
-    process.execPath, path.resolve(__dirname, 'tracer-env.js'), envFile]
-  );
-
-  const env: { [key: string]: string } = JSON.parse(fs.readFileSync(envFile, 'utf-8'));
+  const env = await codeql.getTracerEnv(database, compilerSpec);
 
   const config = env['ODASA_TRACER_CONFIGURATION'];
   const info: TracerConfig = { spec: config, env: {} };
@@ -174,8 +166,8 @@ async function run() {
     const sourceRoot = path.resolve();
 
     core.startGroup('Setup CodeQL tools');
-    const codeqlSetup = await setuptools.setupCodeQL();
-    await exec.exec(codeqlSetup.cmd, ['version', '--format=json']);
+    const codeql = await setupCodeQL();
+    await codeql.printVersion();
     core.endGroup();
 
     // Forward Go flags
@@ -194,22 +186,15 @@ async function run() {
 
     let tracedLanguages: { [key: string]: TracerConfig } = {};
     let scannedLanguages: string[] = [];
-
     // TODO: replace this code once CodeQL supports multi-language tracing
     for (let language of languages) {
       const languageDatabase = path.join(databaseFolder, language);
 
       // Init language database
-      await exec.exec(codeqlSetup.cmd, [
-        'database',
-        'init',
-        languageDatabase,
-        '--language=' + language,
-        '--source-root=' + sourceRoot,
-      ]);
+      await codeql.databaseInit(languageDatabase, language, sourceRoot);
       // TODO: add better detection of 'traced languages' instead of using a hard coded list
       if (['cpp', 'java', 'csharp'].includes(language)) {
-        const config: TracerConfig = await tracerConfig(codeqlSetup, languageDatabase);
+        const config: TracerConfig = await tracerConfig(codeql, languageDatabase);
         tracedLanguages[language] = config;
       } else {
         scannedLanguages.push(language);
@@ -227,17 +212,17 @@ async function run() {
         if (process.platform === 'darwin') {
           core.exportVariable(
             'DYLD_INSERT_LIBRARIES',
-            path.join(codeqlSetup.tools, 'osx64', 'libtrace.dylib'));
+            path.join(codeql.getDir(), 'tools', 'osx64', 'libtrace.dylib'));
         } else if (process.platform === 'win32') {
           await exec.exec(
             'powershell',
             [
               path.resolve(__dirname, '..', 'src', 'inject-tracer.ps1'),
-              path.resolve(codeqlSetup.tools, 'win64', 'tracer.exe'),
+              path.resolve(codeql.getDir(), 'tools', 'win64', 'tracer.exe'),
             ],
             { env: { 'ODASA_TRACER_CONFIGURATION': mainTracerConfig.spec } });
         } else {
-          core.exportVariable('LD_PRELOAD', path.join(codeqlSetup.tools, 'linux64', '${LIB}trace.so'));
+          core.exportVariable('LD_PRELOAD', path.join(codeql.getDir(), 'tools', 'linux64', '${LIB}trace.so'));
         }
       }
     }
@@ -247,7 +232,6 @@ async function run() {
 
     // TODO: make this a "private" environment variable of the action
     core.exportVariable(sharedEnv.CODEQL_ACTION_DATABASE_DIR, databaseFolder);
-    core.exportVariable(sharedEnv.CODEQL_ACTION_CMD, codeqlSetup.cmd);
 
   } catch (error) {
     core.setFailed(error.message);
diff --git a/src/shared-environment.ts b/src/shared-environment.ts
index fbc94edb9..ba480a3c0 100644
--- a/src/shared-environment.ts
+++ b/src/shared-environment.ts
@@ -1,4 +1,3 @@
-export const CODEQL_ACTION_CMD = 'CODEQL_ACTION_CMD';
 export const CODEQL_ACTION_DATABASE_DIR = 'CODEQL_ACTION_DATABASE_DIR';
 export const CODEQL_ACTION_LANGUAGES = 'CODEQL_ACTION_LANGUAGES';
 export const CODEQL_ACTION_ANALYSIS_KEY = 'CODEQL_ACTION_ANALYSIS_KEY';