diff --git a/packages/loot-core/bin/profile-sql.js b/packages/loot-core/bin/profile-sql.js
index 484202587562653298a2bd4600c9bddf1b3073b4..a56f3f10a7a7bdbd10f43ee1f19fb362c8cea062 100755
--- a/packages/loot-core/bin/profile-sql.js
+++ b/packages/loot-core/bin/profile-sql.js
@@ -4,7 +4,7 @@ import os from 'os';
 import * as sqlite from '../src/platform/server/sqlite';
 import * as db from '../src/server/db';
 import { batchMessages, setSyncingMode } from '../src/server/sync';
-import { runQuery } from '../src/server/aql/schema/run-query';
+import { runQuery } from '../src/server/aql';
 import asyncStorage from '../src/platform/server/asyncStorage';
 import { makeChild } from '../src/shared/transactions';
 import q from '../src/shared/query';
diff --git a/packages/loot-core/bin/sql-regenerate-views b/packages/loot-core/bin/sql-regenerate-views
index dd71b5fefa4bff8bce99959e2e19e1cc725b576c..eaa49066dd8e0eb599bbcfddb5372ad777b1dbf6 100755
--- a/packages/loot-core/bin/sql-regenerate-views
+++ b/packages/loot-core/bin/sql-regenerate-views
@@ -1,5 +1,5 @@
 #!/usr/bin/env actual-cli-runner.js
-const { schema } = require('../src/server/aql/schema');
+const { schema } = require('../src/server/aql');
 const table = process.argv[3];
 
 if (table == null || table === 'transactions') {
diff --git a/packages/loot-core/src/mocks/arbitrary-schema.js b/packages/loot-core/src/mocks/arbitrary-schema.js
index 6b4d8d6e895e6597fbd1a432f87f5c02a2037478..0f508f2e5b8ab37e031de999974f946d54699a53 100644
--- a/packages/loot-core/src/mocks/arbitrary-schema.js
+++ b/packages/loot-core/src/mocks/arbitrary-schema.js
@@ -1,5 +1,5 @@
 import fc from 'fast-check';
-import { schema } from '../server/aql/schema';
+import { schema } from '../server/aql';
 import { addDays } from '../shared/months';
 
 function typeArbitrary(typeDesc, name) {
diff --git a/packages/loot-core/src/mocks/budget.js b/packages/loot-core/src/mocks/budget.js
index 5e03bf4e6079221335643e9d4baf8824307b94b9..3143be3c2d0a76888277d30cf8f749f4b2aa5be3 100644
--- a/packages/loot-core/src/mocks/budget.js
+++ b/packages/loot-core/src/mocks/budget.js
@@ -4,7 +4,7 @@ import * as budget from '../server/budget/base';
 import * as db from '../server/db';
 import * as prefs from '../server/prefs';
 import * as budgetActions from '../server/budget/actions';
-import { runQuery as aqlQuery } from '../server/aql/schema/run-query';
+import { runQuery as aqlQuery } from '../server/aql';
 import { batchMessages, setSyncingMode } from '../server/sync';
 import { runHandler, runMutator } from '../server/mutators';
 import { addTransactions } from '../server/accounts/sync';
diff --git a/packages/loot-core/src/server/accounts/export-to-csv.js b/packages/loot-core/src/server/accounts/export-to-csv.js
index 64b9f6e9d8db85760e1fa0f45ba9b9405cb98fed..f58e46883f176fa0049785c2eb79cc3d6886de01 100644
--- a/packages/loot-core/src/server/accounts/export-to-csv.js
+++ b/packages/loot-core/src/server/accounts/export-to-csv.js
@@ -1,5 +1,5 @@
 import csvStringify from 'csv-stringify/lib/sync';
-import { runQuery as aqlQuery } from '../aql/schema/run-query';
+import { runQuery as aqlQuery } from '../aql';
 import { integerToAmount } from '../../shared/util';
 
 export async function exportToCSV(
diff --git a/packages/loot-core/src/server/accounts/transaction-rules.js b/packages/loot-core/src/server/accounts/transaction-rules.js
index 794f428d8dcd83d70fd07f1c3f10f036ddfe734b..dab58d44c70697c3285d55817240fe183431a939 100644
--- a/packages/loot-core/src/server/accounts/transaction-rules.js
+++ b/packages/loot-core/src/server/accounts/transaction-rules.js
@@ -21,7 +21,7 @@ import { requiredFields, toDateRepr } from '../models';
 import { currentDay } from '../../shared/months';
 import { partitionByField, fastSetMerge } from '../../shared/util';
 import { setSyncingMode, batchMessages } from '../sync';
-import { schemaConfig } from '../aql/schema';
+import { schemaConfig } from '../aql';
 
 // TODO: Detect if it looks like the user is creating a rename rule
 // and prompt to create it in the pre phase instead
diff --git a/packages/loot-core/src/server/accounts/transaction-rules.test.js b/packages/loot-core/src/server/accounts/transaction-rules.test.js
index d35653cab53098acb7ce6f4559788f0103dd1371..e6dc3d4134a68a765e22fbcb8053dce40391b84f 100644
--- a/packages/loot-core/src/server/accounts/transaction-rules.test.js
+++ b/packages/loot-core/src/server/accounts/transaction-rules.test.js
@@ -14,7 +14,7 @@ import {
   migrateOldRules
 } from './transaction-rules';
 import { loadMappings } from '../db/mappings';
-import { runQuery } from '../aql/schema/run-query';
+import { runQuery } from '../aql';
 import q from '../../shared/query';
 
 // TODO: write tests to make sure payee renaming is "pre" and category
diff --git a/packages/loot-core/src/server/api.js b/packages/loot-core/src/server/api.js
index 460fa5802c62c7ebc22ddc7737caaf08a6d51e38..2ca0b754f63d7c05d38ab969b77ed10ccab884ff 100644
--- a/packages/loot-core/src/server/api.js
+++ b/packages/loot-core/src/server/api.js
@@ -20,7 +20,7 @@ import { setSyncingMode, batchMessages } from './sync';
 import { getClock } from './crdt';
 import { runMutator } from './mutators';
 import { integerToAmount } from '../shared/util';
-import { runQuery as aqlQuery } from './aql/schema/run-query';
+import { runQuery as aqlQuery } from './aql';
 import q from '../shared/query';
 
 const connection = require('../platform/server/connection');
diff --git a/packages/loot-core/src/server/aql/index.js b/packages/loot-core/src/server/aql/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..2337f2b06ec27a425cc9cb51e830623a89a4de65
--- /dev/null
+++ b/packages/loot-core/src/server/aql/index.js
@@ -0,0 +1,10 @@
+export {
+    convertForInsert,
+    convertForUpdate,
+    convertFromSelect,
+    convertInputType,
+} from './schema-helpers';
+export { compileQuery } from "./compiler";
+export { makeViews } from "./views";
+export { schema, schemaConfig } from "./schema";
+export { runQuery, runCompiledQuery } from "./schema/run-query";
diff --git a/packages/loot-core/src/server/db/index.js b/packages/loot-core/src/server/db/index.js
index 249ec845b041b12171b3070d09d95f30baa3ca00..8c9813e1ad121710fbb61e52f8c2c1c7581f9458 100644
--- a/packages/loot-core/src/server/db/index.js
+++ b/packages/loot-core/src/server/db/index.js
@@ -2,7 +2,7 @@ import LRU from 'lru-cache';
 import * as sqlite from '../../platform/server/sqlite';
 import fs from '../../platform/server/fs';
 import { sendMessages, batchMessages } from '../sync';
-import { schema, schemaConfig } from '../aql/schema';
+import { schema, schemaConfig } from '../aql';
 import {
   accountModel,
   categoryModel,
@@ -23,7 +23,7 @@ import {
   convertForInsert,
   convertForUpdate,
   convertFromSelect
-} from '../aql/schema-helpers';
+} from '../aql';
 import { shoveSortOrders, SORT_INCREMENT } from './sort';
 
 export { toDateRepr, fromDateRepr } from '../models';
diff --git a/packages/loot-core/src/server/main.js b/packages/loot-core/src/server/main.js
index ac80260f6fb17fb5443d8ea90ee65cf39854cbbd..6eca6a1cf4a6cb63bcc38b62ad47e1bb51e77791 100644
--- a/packages/loot-core/src/server/main.js
+++ b/packages/loot-core/src/server/main.js
@@ -64,9 +64,8 @@ import * as tracking from './tracking/events';
 import { get, post } from './post';
 import { APIError, TransactionError, PostError, RuleError } from './errors';
 import { createTestBudget } from '../mocks/budget';
-import { runQuery as aqlQuery } from './aql/schema/run-query';
-import { Query } from '../shared/query';
-import q from '../shared/query';
+import { runQuery as aqlQuery } from './aql';
+import q, { Query } from '../shared/query';
 import app from './main-app';
 
 // Apps
diff --git a/packages/loot-core/src/server/schedules/app.js b/packages/loot-core/src/server/schedules/app.js
index 062490e71a7c31f7f4a5a21f48fc237aabc9f04a..34f699467701a27cdfe2fbd9f628e9ca9df9c719 100644
--- a/packages/loot-core/src/server/schedules/app.js
+++ b/packages/loot-core/src/server/schedules/app.js
@@ -4,7 +4,7 @@ import { createApp } from '../app';
 import * as db from '../db';
 import * as prefs from '../prefs';
 import { toDateRepr } from '../models';
-import { runQuery as aqlQuery } from '../aql/schema/run-query';
+import { runQuery as aqlQuery } from '../aql';
 import { dayFromDate, currentDay, parseDate } from '../../shared/months';
 import q from '../../shared/query';
 import {
diff --git a/packages/loot-core/src/server/schedules/app.test.js b/packages/loot-core/src/server/schedules/app.test.js
index 916244cb568cafee97058e73e861baf7de0ed7eb..5ba23b204747219fdef6feeda886d61adad9ec2a 100644
--- a/packages/loot-core/src/server/schedules/app.test.js
+++ b/packages/loot-core/src/server/schedules/app.test.js
@@ -1,4 +1,4 @@
-import { runQuery as aqlQuery } from '../aql/schema/run-query';
+import { runQuery as aqlQuery } from '../aql';
 import q from '../../shared/query';
 import { loadRules, updateRule } from '../accounts/transaction-rules';
 import { loadMappings } from '../db/mappings';
diff --git a/packages/loot-core/src/server/schedules/find-schedules.js b/packages/loot-core/src/server/schedules/find-schedules.js
index 6432f0b207c000ea939be889228faaf38830ec01..b40edad6df25ba23a7f0e848f9a91485ef3d57a6 100644
--- a/packages/loot-core/src/server/schedules/find-schedules.js
+++ b/packages/loot-core/src/server/schedules/find-schedules.js
@@ -3,7 +3,7 @@ import * as db from '../db';
 import { Schedule as RSchedule } from '../util/rschedule';
 import { groupBy } from '../../shared/util';
 import { fromDateRepr } from '../models';
-import { runQuery as aqlQuery } from '../aql/schema/run-query';
+import { runQuery as aqlQuery } from '../aql';
 import q from '../../shared/query';
 import { getApproxNumberThreshold } from '../../shared/rules';
 import { recurConfigToRSchedule } from '../../shared/schedules';
diff --git a/packages/loot-core/src/server/spreadsheet/spreadsheet.js b/packages/loot-core/src/server/spreadsheet/spreadsheet.js
index 49de21d40ca31ccff5307b3350f9ebd129ae8c2b..c24ccd1ee07ea4fbd727e49c0adf2cc434016819 100644
--- a/packages/loot-core/src/server/spreadsheet/spreadsheet.js
+++ b/packages/loot-core/src/server/spreadsheet/spreadsheet.js
@@ -1,7 +1,5 @@
 import mitt from 'mitt';
-import { schema, schemaConfig } from '../aql/schema';
-import { compileQuery } from '../aql/compiler';
-import { runCompiledQuery } from '../aql/schema/run-query';
+import { compileQuery, runCompiledQuery, schema, schemaConfig } from '../aql';
 
 const Graph = require('./graph-data-structure');
 const { unresolveName, resolveName } = require('./util');
diff --git a/packages/loot-core/src/server/sync/migrate.test.js b/packages/loot-core/src/server/sync/migrate.test.js
index 5286c5954036c0d83634783ab7d42ece13de4f6d..9a335615ac612eccf8fe4f9df451f487fe95348a 100644
--- a/packages/loot-core/src/server/sync/migrate.test.js
+++ b/packages/loot-core/src/server/sync/migrate.test.js
@@ -3,9 +3,8 @@ import * as db from '../db';
 import { listen, unlisten } from './migrate';
 import { addSyncListener, sendMessages } from './index';
 import { execTracer } from '../../shared/test-helpers';
-import { schema, schemaConfig } from '../aql/schema';
+import { convertInputType, schema, schemaConfig } from '../aql';
 import arbs from '../../mocks/arbitrary-schema';
-import { convertInputType } from '../aql/schema-helpers';
 
 beforeEach(() => {
   listen();
diff --git a/packages/loot-core/src/server/update.js b/packages/loot-core/src/server/update.js
index f108a1a1cb4534dc4d43ef54ebf67ccbb4a156ab..f4e6459743dc6db48d53c0a81206ed8768cad638 100644
--- a/packages/loot-core/src/server/update.js
+++ b/packages/loot-core/src/server/update.js
@@ -1,8 +1,7 @@
 import md5 from 'md5';
 import * as migrations from './migrate/migrations';
 import * as db from './db';
-import { schema, schemaConfig } from './aql/schema';
-import { makeViews } from './aql/views';
+import { schema, schemaConfig, makeViews } from './aql';
 
 // Managing the init/update process