diff --git a/tools/GenerateLanguages/GenerateLanguages.csproj b/tools/GenerateLanguages/GenerateLanguages.csproj
index 135a6c0d0..6a6e46772 100644
--- a/tools/GenerateLanguages/GenerateLanguages.csproj
+++ b/tools/GenerateLanguages/GenerateLanguages.csproj
@@ -3,6 +3,10 @@
netcoreapp2.2
Exe
+
+
+
+
..\..\Squidex.ruleset
diff --git a/tools/LoadTest/ClientQueryFixture.cs b/tools/LoadTest/ClientQueryFixture.cs
new file mode 100644
index 000000000..af696f65b
--- /dev/null
+++ b/tools/LoadTest/ClientQueryFixture.cs
@@ -0,0 +1,75 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Squidex.ClientLibrary;
+using Squidex.ClientLibrary.Management;
+
+namespace LoadTest
+{
+ public sealed class ClientQueryFixture : IDisposable
+ {
+ public SquidexClient Client { get; } = TestClient.Build();
+
+ public ClientQueryFixture()
+ {
+ Task.Run(async () =>
+ {
+ var apps = TestClient.ClientManager.CreateAppsClient();
+
+ try
+ {
+ await apps.PostAppAsync(new CreateAppDto
+ {
+ Name = TestClient.TestAppName
+ });
+
+ var schemas = TestClient.ClientManager.CreateSchemasClient();
+
+ await schemas.PostSchemaAsync(TestClient.TestAppName, new CreateSchemaDto
+ {
+ Name = TestClient.TestSchemaName,
+ Fields = new List
+ {
+ new UpsertSchemaFieldDto
+ {
+ Name = TestClient.TestSchemaName,
+ Properties = new NumberFieldPropertiesDto()
+ }
+ },
+ IsPublished = true
+ });
+ }
+ catch (SquidexManagementException ex)
+ {
+ if (ex.StatusCode != 400)
+ {
+ throw;
+ }
+ }
+
+ var contents = await Client.GetAllAsync();
+
+ foreach (var content in contents.Items)
+ {
+ await Client.DeleteAsync(content);
+ }
+
+ for (var i = 10; i > 0; i--)
+ {
+ await Client.CreateAsync(new TestEntityData { Value = i }, true);
+ }
+ }).Wait();
+ }
+
+ public void Dispose()
+ {
+ }
+ }
+}
diff --git a/tools/LoadTest/LoadTest.csproj b/tools/LoadTest/LoadTest.csproj
new file mode 100644
index 000000000..5a97587d8
--- /dev/null
+++ b/tools/LoadTest/LoadTest.csproj
@@ -0,0 +1,23 @@
+
+
+ Exe
+ netcoreapp2.2
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers
+
+
+
+ ..\..\Squidex.ruleset
+
+
+
+
+
diff --git a/tools/LoadTest/LoadTest.sln b/tools/LoadTest/LoadTest.sln
new file mode 100644
index 000000000..ce256f737
--- /dev/null
+++ b/tools/LoadTest/LoadTest.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29123.88
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LoadTest", "LoadTest.csproj", "{EC732B4F-576E-4853-880D-AA676966D017}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {EC732B4F-576E-4853-880D-AA676966D017}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EC732B4F-576E-4853-880D-AA676966D017}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EC732B4F-576E-4853-880D-AA676966D017}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EC732B4F-576E-4853-880D-AA676966D017}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {8ABC073D-D6C6-47F0-AFB6-D42F177D468A}
+ EndGlobalSection
+EndGlobal
diff --git a/tools/LoadTest/QueryBenchmarks.cs b/tools/LoadTest/QueryBenchmarks.cs
new file mode 100644
index 000000000..9140cc608
--- /dev/null
+++ b/tools/LoadTest/QueryBenchmarks.cs
@@ -0,0 +1,146 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Squidex.ClientLibrary;
+using Xunit;
+
+namespace LoadTest
+{
+ public class QueryBenchmarks : IClassFixture
+ {
+ public ClientQueryFixture Fixture { get; }
+
+ public QueryBenchmarks(ClientQueryFixture fixture)
+ {
+ Fixture = fixture;
+ }
+
+ public static IEnumerable