diff --git a/app/Access/Controllers/ConfirmEmailController.php b/app/Access/Controllers/ConfirmEmailController.php
index 3fda0586e..94647e06e 100644
--- a/app/Access/Controllers/ConfirmEmailController.php
+++ b/app/Access/Controllers/ConfirmEmailController.php
@@ -7,7 +7,7 @@ use BookStack\Access\LoginService;
 use BookStack\Exceptions\ConfirmationEmailException;
 use BookStack\Exceptions\UserTokenExpiredException;
 use BookStack\Exceptions\UserTokenNotFoundException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Users\UserRepo;
 use Exception;
 use Illuminate\Http\Request;
diff --git a/app/Access/Controllers/ForgotPasswordController.php b/app/Access/Controllers/ForgotPasswordController.php
index 6edeb6da5..bc59e9d2f 100644
--- a/app/Access/Controllers/ForgotPasswordController.php
+++ b/app/Access/Controllers/ForgotPasswordController.php
@@ -3,7 +3,7 @@
 namespace BookStack\Access\Controllers;
 
 use BookStack\Activity\ActivityType;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Password;
 
diff --git a/app/Access/Controllers/LoginController.php b/app/Access/Controllers/LoginController.php
index 159561a27..3b4f9b347 100644
--- a/app/Access/Controllers/LoginController.php
+++ b/app/Access/Controllers/LoginController.php
@@ -7,7 +7,7 @@ use BookStack\Access\SocialAuthService;
 use BookStack\Exceptions\LoginAttemptEmailNeededException;
 use BookStack\Exceptions\LoginAttemptException;
 use BookStack\Facades\Activity;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
diff --git a/app/Access/Controllers/MfaBackupCodesController.php b/app/Access/Controllers/MfaBackupCodesController.php
index 0553fef20..5c334674e 100644
--- a/app/Access/Controllers/MfaBackupCodesController.php
+++ b/app/Access/Controllers/MfaBackupCodesController.php
@@ -8,7 +8,7 @@ use BookStack\Access\Mfa\MfaSession;
 use BookStack\Access\Mfa\MfaValue;
 use BookStack\Activity\ActivityType;
 use BookStack\Exceptions\NotFoundException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Exception;
 use Illuminate\Http\Request;
 use Illuminate\Validation\ValidationException;
diff --git a/app/Access/Controllers/MfaController.php b/app/Access/Controllers/MfaController.php
index 2c6e95f0b..c9100ef91 100644
--- a/app/Access/Controllers/MfaController.php
+++ b/app/Access/Controllers/MfaController.php
@@ -4,7 +4,7 @@ namespace BookStack\Access\Controllers;
 
 use BookStack\Access\Mfa\MfaValue;
 use BookStack\Activity\ActivityType;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Http\Request;
 
 class MfaController extends Controller
diff --git a/app/Access/Controllers/MfaTotpController.php b/app/Access/Controllers/MfaTotpController.php
index 47be548f9..f60644b84 100644
--- a/app/Access/Controllers/MfaTotpController.php
+++ b/app/Access/Controllers/MfaTotpController.php
@@ -9,7 +9,7 @@ use BookStack\Access\Mfa\TotpService;
 use BookStack\Access\Mfa\TotpValidationRule;
 use BookStack\Activity\ActivityType;
 use BookStack\Exceptions\NotFoundException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Http\Request;
 use Illuminate\Validation\ValidationException;
 
diff --git a/app/Access/Controllers/OidcController.php b/app/Access/Controllers/OidcController.php
index 969f287d6..e8c944934 100644
--- a/app/Access/Controllers/OidcController.php
+++ b/app/Access/Controllers/OidcController.php
@@ -4,7 +4,7 @@ namespace BookStack\Access\Controllers;
 
 use BookStack\Access\Oidc\OidcException;
 use BookStack\Access\Oidc\OidcService;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Http\Request;
 
 class OidcController extends Controller
diff --git a/app/Access/Controllers/RegisterController.php b/app/Access/Controllers/RegisterController.php
index e54c3e19c..3c653a073 100644
--- a/app/Access/Controllers/RegisterController.php
+++ b/app/Access/Controllers/RegisterController.php
@@ -7,7 +7,7 @@ use BookStack\Access\RegistrationService;
 use BookStack\Access\SocialAuthService;
 use BookStack\Exceptions\StoppedAuthenticationException;
 use BookStack\Exceptions\UserRegistrationException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Contracts\Validation\Validator as ValidatorContract;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Validator;
diff --git a/app/Access/Controllers/ResetPasswordController.php b/app/Access/Controllers/ResetPasswordController.php
index f8a63a8b6..eae4e5e25 100644
--- a/app/Access/Controllers/ResetPasswordController.php
+++ b/app/Access/Controllers/ResetPasswordController.php
@@ -4,7 +4,7 @@ namespace BookStack\Access\Controllers;
 
 use BookStack\Access\LoginService;
 use BookStack\Activity\ActivityType;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Users\Models\User;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
diff --git a/app/Access/Controllers/Saml2Controller.php b/app/Access/Controllers/Saml2Controller.php
index 192ca4fad..2f1698446 100644
--- a/app/Access/Controllers/Saml2Controller.php
+++ b/app/Access/Controllers/Saml2Controller.php
@@ -3,7 +3,7 @@
 namespace BookStack\Access\Controllers;
 
 use BookStack\Access\Saml2Service;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Http\Request;
 use Illuminate\Support\Str;
 
diff --git a/app/Access/Controllers/SocialController.php b/app/Access/Controllers/SocialController.php
index ad8537ce2..3df895dd8 100644
--- a/app/Access/Controllers/SocialController.php
+++ b/app/Access/Controllers/SocialController.php
@@ -9,7 +9,7 @@ use BookStack\Exceptions\SocialDriverNotConfigured;
 use BookStack\Exceptions\SocialSignInAccountNotUsed;
 use BookStack\Exceptions\SocialSignInException;
 use BookStack\Exceptions\UserRegistrationException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Http\Request;
 use Illuminate\Support\Str;
 use Laravel\Socialite\Contracts\User as SocialUser;
diff --git a/app/Access/Controllers/UserInviteController.php b/app/Access/Controllers/UserInviteController.php
index 03e045ce1..9ee05b84f 100644
--- a/app/Access/Controllers/UserInviteController.php
+++ b/app/Access/Controllers/UserInviteController.php
@@ -5,7 +5,7 @@ namespace BookStack\Access\Controllers;
 use BookStack\Access\UserInviteService;
 use BookStack\Exceptions\UserTokenExpiredException;
 use BookStack\Exceptions\UserTokenNotFoundException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Users\UserRepo;
 use Exception;
 use Illuminate\Http\RedirectResponse;
diff --git a/app/Activity/Controllers/AuditLogController.php b/app/Activity/Controllers/AuditLogController.php
index a90f45f3a..c3910a26b 100644
--- a/app/Activity/Controllers/AuditLogController.php
+++ b/app/Activity/Controllers/AuditLogController.php
@@ -4,7 +4,7 @@ namespace BookStack\Activity\Controllers;
 
 use BookStack\Activity\ActivityType;
 use BookStack\Activity\Models\Activity;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Util\SimpleListOptions;
 use Illuminate\Http\Request;
 
diff --git a/app/Activity/Controllers/CommentController.php b/app/Activity/Controllers/CommentController.php
index 905af9c91..b198d2d56 100644
--- a/app/Activity/Controllers/CommentController.php
+++ b/app/Activity/Controllers/CommentController.php
@@ -4,7 +4,7 @@ namespace BookStack\Activity\Controllers;
 
 use BookStack\Activity\CommentRepo;
 use BookStack\Entities\Models\Page;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Http\Request;
 use Illuminate\Validation\ValidationException;
 
diff --git a/app/Activity/Controllers/FavouriteController.php b/app/Activity/Controllers/FavouriteController.php
index 0428dced4..1b88ffd64 100644
--- a/app/Activity/Controllers/FavouriteController.php
+++ b/app/Activity/Controllers/FavouriteController.php
@@ -6,7 +6,7 @@ use BookStack\Activity\Models\Favouritable;
 use BookStack\App\Model;
 use BookStack\Entities\Models\Entity;
 use BookStack\Entities\Queries\TopFavourites;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Http\Request;
 
 class FavouriteController extends Controller
diff --git a/app/Activity/Controllers/TagController.php b/app/Activity/Controllers/TagController.php
index 5731dab2a..0af8835ca 100644
--- a/app/Activity/Controllers/TagController.php
+++ b/app/Activity/Controllers/TagController.php
@@ -3,7 +3,7 @@
 namespace BookStack\Activity\Controllers;
 
 use BookStack\Activity\TagRepo;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Util\SimpleListOptions;
 use Illuminate\Http\Request;
 
diff --git a/app/Activity/Controllers/WebhookController.php b/app/Activity/Controllers/WebhookController.php
index 90e70bafc..dcca1dc41 100644
--- a/app/Activity/Controllers/WebhookController.php
+++ b/app/Activity/Controllers/WebhookController.php
@@ -5,7 +5,7 @@ namespace BookStack\Activity\Controllers;
 use BookStack\Activity\ActivityType;
 use BookStack\Activity\Models\Webhook;
 use BookStack\Activity\Queries\WebhooksAllPaginatedAndSorted;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Util\SimpleListOptions;
 use Illuminate\Http\Request;
 
diff --git a/app/Api/ApiDocsController.php b/app/Api/ApiDocsController.php
index d6acf05f2..020c8902f 100644
--- a/app/Api/ApiDocsController.php
+++ b/app/Api/ApiDocsController.php
@@ -2,7 +2,7 @@
 
 namespace BookStack\Api;
 
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 
 class ApiDocsController extends ApiController
 {
diff --git a/app/Api/ApiDocsGenerator.php b/app/Api/ApiDocsGenerator.php
index 473c00ae2..f13842328 100644
--- a/app/Api/ApiDocsGenerator.php
+++ b/app/Api/ApiDocsGenerator.php
@@ -2,7 +2,7 @@
 
 namespace BookStack\Api;
 
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use Exception;
 use Illuminate\Contracts\Container\BindingResolutionException;
 use Illuminate\Support\Collection;
diff --git a/app/Api/UserApiTokenController.php b/app/Api/UserApiTokenController.php
index 4a15f8947..d8fc1171c 100644
--- a/app/Api/UserApiTokenController.php
+++ b/app/Api/UserApiTokenController.php
@@ -3,7 +3,7 @@
 namespace BookStack\Api;
 
 use BookStack\Activity\ActivityType;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Users\Models\User;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Hash;
diff --git a/app/Http/Controllers/HomeController.php b/app/App/HomeController.php
similarity index 98%
rename from app/Http/Controllers/HomeController.php
rename to app/App/HomeController.php
index efab40818..667af80d3 100644
--- a/app/Http/Controllers/HomeController.php
+++ b/app/App/HomeController.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace BookStack\Http\Controllers;
+namespace BookStack\App;
 
 use BookStack\Activity\ActivityQueries;
 use BookStack\Entities\Models\Book;
@@ -10,6 +10,7 @@ use BookStack\Entities\Queries\TopFavourites;
 use BookStack\Entities\Repos\BookRepo;
 use BookStack\Entities\Repos\BookshelfRepo;
 use BookStack\Entities\Tools\PageContent;
+use BookStack\Http\Controller;
 use BookStack\Uploads\FaviconHandler;
 use BookStack\Util\SimpleListOptions;
 use Illuminate\Http\Request;
diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php
index 11c8018c8..f49be1d63 100644
--- a/app/Console/Kernel.php
+++ b/app/Console/Kernel.php
@@ -7,15 +7,6 @@ use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
 
 class Kernel extends ConsoleKernel
 {
-    /**
-     * The Artisan commands provided by your application.
-     *
-     * @var array
-     */
-    protected $commands = [
-        //
-    ];
-
     /**
      * Define the application's command schedule.
      *
diff --git a/app/Entities/Controllers/BookApiController.php b/app/Entities/Controllers/BookApiController.php
index 5abac12fb..cb67184a0 100644
--- a/app/Entities/Controllers/BookApiController.php
+++ b/app/Entities/Controllers/BookApiController.php
@@ -8,7 +8,7 @@ use BookStack\Entities\Models\Chapter;
 use BookStack\Entities\Models\Entity;
 use BookStack\Entities\Repos\BookRepo;
 use BookStack\Entities\Tools\BookContents;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use Illuminate\Http\Request;
 use Illuminate\Validation\ValidationException;
 
diff --git a/app/Entities/Controllers/BookController.php b/app/Entities/Controllers/BookController.php
index 45989a803..dcd1af5a1 100644
--- a/app/Entities/Controllers/BookController.php
+++ b/app/Entities/Controllers/BookController.php
@@ -14,7 +14,7 @@ use BookStack\Entities\Tools\ShelfContext;
 use BookStack\Exceptions\ImageUploadException;
 use BookStack\Exceptions\NotFoundException;
 use BookStack\Facades\Activity;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\References\ReferenceFetcher;
 use BookStack\Util\SimpleListOptions;
 use Illuminate\Http\Request;
diff --git a/app/Entities/Controllers/BookExportApiController.php b/app/Entities/Controllers/BookExportApiController.php
index e3073321f..5b6826c19 100644
--- a/app/Entities/Controllers/BookExportApiController.php
+++ b/app/Entities/Controllers/BookExportApiController.php
@@ -4,7 +4,7 @@ namespace BookStack\Entities\Controllers;
 
 use BookStack\Entities\Models\Book;
 use BookStack\Entities\Tools\ExportFormatter;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use Throwable;
 
 class BookExportApiController extends ApiController
diff --git a/app/Entities/Controllers/BookExportController.php b/app/Entities/Controllers/BookExportController.php
index 97762bd32..1a6b20db9 100644
--- a/app/Entities/Controllers/BookExportController.php
+++ b/app/Entities/Controllers/BookExportController.php
@@ -4,7 +4,7 @@ namespace BookStack\Entities\Controllers;
 
 use BookStack\Entities\Repos\BookRepo;
 use BookStack\Entities\Tools\ExportFormatter;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Throwable;
 
 class BookExportController extends Controller
diff --git a/app/Entities/Controllers/BookSortController.php b/app/Entities/Controllers/BookSortController.php
index 26ab09f2e..f2310e205 100644
--- a/app/Entities/Controllers/BookSortController.php
+++ b/app/Entities/Controllers/BookSortController.php
@@ -7,7 +7,7 @@ use BookStack\Entities\Repos\BookRepo;
 use BookStack\Entities\Tools\BookContents;
 use BookStack\Entities\Tools\BookSortMap;
 use BookStack\Facades\Activity;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Http\Request;
 
 class BookSortController extends Controller
diff --git a/app/Entities/Controllers/BookshelfApiController.php b/app/Entities/Controllers/BookshelfApiController.php
index e0c8fa345..9bdb8256d 100644
--- a/app/Entities/Controllers/BookshelfApiController.php
+++ b/app/Entities/Controllers/BookshelfApiController.php
@@ -4,7 +4,7 @@ namespace BookStack\Entities\Controllers;
 
 use BookStack\Entities\Models\Bookshelf;
 use BookStack\Entities\Repos\BookshelfRepo;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use Exception;
 use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Http\Request;
diff --git a/app/Entities/Controllers/BookshelfController.php b/app/Entities/Controllers/BookshelfController.php
index 271b13a55..d1b752dc2 100644
--- a/app/Entities/Controllers/BookshelfController.php
+++ b/app/Entities/Controllers/BookshelfController.php
@@ -9,7 +9,7 @@ use BookStack\Entities\Repos\BookshelfRepo;
 use BookStack\Entities\Tools\ShelfContext;
 use BookStack\Exceptions\ImageUploadException;
 use BookStack\Exceptions\NotFoundException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\References\ReferenceFetcher;
 use BookStack\Util\SimpleListOptions;
 use Exception;
diff --git a/app/Entities/Controllers/ChapterApiController.php b/app/Entities/Controllers/ChapterApiController.php
index 3f860ba64..ce20e6b96 100644
--- a/app/Entities/Controllers/ChapterApiController.php
+++ b/app/Entities/Controllers/ChapterApiController.php
@@ -5,7 +5,7 @@ namespace BookStack\Entities\Controllers;
 use BookStack\Entities\Models\Book;
 use BookStack\Entities\Models\Chapter;
 use BookStack\Entities\Repos\ChapterRepo;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use Illuminate\Database\Eloquent\Relations\HasMany;
 use Illuminate\Http\Request;
 
diff --git a/app/Entities/Controllers/ChapterController.php b/app/Entities/Controllers/ChapterController.php
index 899569a6f..cf7611685 100644
--- a/app/Entities/Controllers/ChapterController.php
+++ b/app/Entities/Controllers/ChapterController.php
@@ -12,7 +12,7 @@ use BookStack\Entities\Tools\NextPreviousContentLocator;
 use BookStack\Exceptions\MoveOperationException;
 use BookStack\Exceptions\NotFoundException;
 use BookStack\Exceptions\PermissionsException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\References\ReferenceFetcher;
 use Illuminate\Http\Request;
 use Illuminate\Validation\ValidationException;
diff --git a/app/Entities/Controllers/ChapterExportApiController.php b/app/Entities/Controllers/ChapterExportApiController.php
index e334b1350..d1523e665 100644
--- a/app/Entities/Controllers/ChapterExportApiController.php
+++ b/app/Entities/Controllers/ChapterExportApiController.php
@@ -4,7 +4,7 @@ namespace BookStack\Entities\Controllers;
 
 use BookStack\Entities\Models\Chapter;
 use BookStack\Entities\Tools\ExportFormatter;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use Throwable;
 
 class ChapterExportApiController extends ApiController
diff --git a/app/Entities/Controllers/ChapterExportController.php b/app/Entities/Controllers/ChapterExportController.php
index b69a0b10e..b67ec9b37 100644
--- a/app/Entities/Controllers/ChapterExportController.php
+++ b/app/Entities/Controllers/ChapterExportController.php
@@ -5,7 +5,7 @@ namespace BookStack\Entities\Controllers;
 use BookStack\Entities\Repos\ChapterRepo;
 use BookStack\Entities\Tools\ExportFormatter;
 use BookStack\Exceptions\NotFoundException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Throwable;
 
 class ChapterExportController extends Controller
diff --git a/app/Entities/Controllers/PageApiController.php b/app/Entities/Controllers/PageApiController.php
index 45c858da2..28dd36f97 100644
--- a/app/Entities/Controllers/PageApiController.php
+++ b/app/Entities/Controllers/PageApiController.php
@@ -7,7 +7,7 @@ use BookStack\Entities\Models\Chapter;
 use BookStack\Entities\Models\Page;
 use BookStack\Entities\Repos\PageRepo;
 use BookStack\Exceptions\PermissionsException;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use Exception;
 use Illuminate\Http\Request;
 
diff --git a/app/Entities/Controllers/PageController.php b/app/Entities/Controllers/PageController.php
index 0da4bb900..a6ef68dd7 100644
--- a/app/Entities/Controllers/PageController.php
+++ b/app/Entities/Controllers/PageController.php
@@ -13,7 +13,7 @@ use BookStack\Entities\Tools\PageEditActivity;
 use BookStack\Entities\Tools\PageEditorData;
 use BookStack\Exceptions\NotFoundException;
 use BookStack\Exceptions\PermissionsException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\References\ReferenceFetcher;
 use Exception;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
diff --git a/app/Entities/Controllers/PageExportApiController.php b/app/Entities/Controllers/PageExportApiController.php
index dbf6ad4cf..d936a0de2 100644
--- a/app/Entities/Controllers/PageExportApiController.php
+++ b/app/Entities/Controllers/PageExportApiController.php
@@ -4,7 +4,7 @@ namespace BookStack\Entities\Controllers;
 
 use BookStack\Entities\Models\Page;
 use BookStack\Entities\Tools\ExportFormatter;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use Throwable;
 
 class PageExportApiController extends ApiController
diff --git a/app/Entities/Controllers/PageExportController.php b/app/Entities/Controllers/PageExportController.php
index b54042667..31862c8ac 100644
--- a/app/Entities/Controllers/PageExportController.php
+++ b/app/Entities/Controllers/PageExportController.php
@@ -6,7 +6,7 @@ use BookStack\Entities\Repos\PageRepo;
 use BookStack\Entities\Tools\ExportFormatter;
 use BookStack\Entities\Tools\PageContent;
 use BookStack\Exceptions\NotFoundException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Throwable;
 
 class PageExportController extends Controller
diff --git a/app/Entities/Controllers/PageRevisionController.php b/app/Entities/Controllers/PageRevisionController.php
index fab6ae665..a723513a8 100644
--- a/app/Entities/Controllers/PageRevisionController.php
+++ b/app/Entities/Controllers/PageRevisionController.php
@@ -8,7 +8,7 @@ use BookStack\Entities\Repos\PageRepo;
 use BookStack\Entities\Tools\PageContent;
 use BookStack\Exceptions\NotFoundException;
 use BookStack\Facades\Activity;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Util\SimpleListOptions;
 use Illuminate\Http\Request;
 use Ssddanbrown\HtmlDiff\Diff;
diff --git a/app/Entities/Controllers/PageTemplateController.php b/app/Entities/Controllers/PageTemplateController.php
index 979c9e5ab..e4e7b5680 100644
--- a/app/Entities/Controllers/PageTemplateController.php
+++ b/app/Entities/Controllers/PageTemplateController.php
@@ -4,7 +4,7 @@ namespace BookStack\Entities\Controllers;
 
 use BookStack\Entities\Repos\PageRepo;
 use BookStack\Exceptions\NotFoundException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Http\Request;
 
 class PageTemplateController extends Controller
diff --git a/app/Entities/Controllers/RecycleBinApiController.php b/app/Entities/Controllers/RecycleBinApiController.php
index deabf3c43..bf22d7dcd 100644
--- a/app/Entities/Controllers/RecycleBinApiController.php
+++ b/app/Entities/Controllers/RecycleBinApiController.php
@@ -7,7 +7,7 @@ use BookStack\Entities\Models\BookChild;
 use BookStack\Entities\Models\Chapter;
 use BookStack\Entities\Models\Deletion;
 use BookStack\Entities\Repos\DeletionRepo;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use Closure;
 use Illuminate\Database\Eloquent\Builder;
 
diff --git a/app/Entities/Controllers/RecycleBinController.php b/app/Entities/Controllers/RecycleBinController.php
index 334e803df..30b184bbe 100644
--- a/app/Entities/Controllers/RecycleBinController.php
+++ b/app/Entities/Controllers/RecycleBinController.php
@@ -7,7 +7,7 @@ use BookStack\Entities\Models\Deletion;
 use BookStack\Entities\Models\Entity;
 use BookStack\Entities\Repos\DeletionRepo;
 use BookStack\Entities\Tools\TrashCan;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 
 class RecycleBinController extends Controller
 {
diff --git a/app/Http/Controllers/ApiController.php b/app/Http/ApiController.php
similarity index 96%
rename from app/Http/Controllers/ApiController.php
rename to app/Http/ApiController.php
index e88f748e4..c0dbe2fca 100644
--- a/app/Http/Controllers/ApiController.php
+++ b/app/Http/ApiController.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace BookStack\Http\Controllers;
+namespace BookStack\Http;
 
 use BookStack\Api\ListingResponseBuilder;
 use Illuminate\Database\Eloquent\Builder;
diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controller.php
similarity index 97%
rename from app/Http/Controllers/Controller.php
rename to app/Http/Controller.php
index b3cc81efc..78b899d25 100644
--- a/app/Http/Controllers/Controller.php
+++ b/app/Http/Controller.php
@@ -1,12 +1,11 @@
 <?php
 
-namespace BookStack\Http\Controllers;
+namespace BookStack\Http;
 
 use BookStack\Activity\Models\Loggable;
 use BookStack\App\Model;
 use BookStack\Exceptions\NotifyException;
 use BookStack\Facades\Activity;
-use BookStack\Http\Responses\DownloadResponseFactory;
 use Illuminate\Foundation\Bus\DispatchesJobs;
 use Illuminate\Foundation\Validation\ValidatesRequests;
 use Illuminate\Http\JsonResponse;
diff --git a/app/Http/Responses/DownloadResponseFactory.php b/app/Http/DownloadResponseFactory.php
similarity index 98%
rename from app/Http/Responses/DownloadResponseFactory.php
rename to app/Http/DownloadResponseFactory.php
index ec742fc47..20032f525 100644
--- a/app/Http/Responses/DownloadResponseFactory.php
+++ b/app/Http/DownloadResponseFactory.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace BookStack\Http\Responses;
+namespace BookStack\Http;
 
 use BookStack\Util\WebSafeMimeSniffer;
 use Illuminate\Http\Request;
diff --git a/app/Permissions/ContentPermissionApiController.php b/app/Permissions/ContentPermissionApiController.php
index f883a292b..cd561fdee 100644
--- a/app/Permissions/ContentPermissionApiController.php
+++ b/app/Permissions/ContentPermissionApiController.php
@@ -5,7 +5,7 @@ namespace BookStack\Permissions;
 use BookStack\Entities\EntityProvider;
 use BookStack\Entities\Models\Entity;
 use BookStack\Entities\Tools\PermissionsUpdater;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use Illuminate\Http\Request;
 
 class ContentPermissionApiController extends ApiController
diff --git a/app/Permissions/PermissionsController.php b/app/Permissions/PermissionsController.php
index a066ec87c..f2014ea73 100644
--- a/app/Permissions/PermissionsController.php
+++ b/app/Permissions/PermissionsController.php
@@ -7,7 +7,7 @@ use BookStack\Entities\Models\Bookshelf;
 use BookStack\Entities\Models\Chapter;
 use BookStack\Entities\Models\Page;
 use BookStack\Entities\Tools\PermissionsUpdater;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Permissions\Models\EntityPermission;
 use BookStack\Users\Models\Role;
 use Illuminate\Http\Request;
diff --git a/app/References/ReferenceController.php b/app/References/ReferenceController.php
index 69da7bd5f..d6978dd5b 100644
--- a/app/References/ReferenceController.php
+++ b/app/References/ReferenceController.php
@@ -6,7 +6,7 @@ use BookStack\Entities\Models\Book;
 use BookStack\Entities\Models\Bookshelf;
 use BookStack\Entities\Models\Chapter;
 use BookStack\Entities\Models\Page;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 
 class ReferenceController extends Controller
 {
diff --git a/app/Search/SearchApiController.php b/app/Search/SearchApiController.php
index 14b946abc..d1619e118 100644
--- a/app/Search/SearchApiController.php
+++ b/app/Search/SearchApiController.php
@@ -4,7 +4,7 @@ namespace BookStack\Search;
 
 use BookStack\Api\ApiEntityListFormatter;
 use BookStack\Entities\Models\Entity;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use Illuminate\Http\Request;
 
 class SearchApiController extends ApiController
diff --git a/app/Search/SearchController.php b/app/Search/SearchController.php
index aabc17a41..4b134f11e 100644
--- a/app/Search/SearchController.php
+++ b/app/Search/SearchController.php
@@ -4,7 +4,7 @@ namespace BookStack\Search;
 
 use BookStack\Entities\Queries\Popular;
 use BookStack\Entities\Tools\SiblingFetcher;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Http\Request;
 
 class SearchController extends Controller
diff --git a/app/Settings/MaintenanceController.php b/app/Settings/MaintenanceController.php
index 7bf4c973c..9c48a4323 100644
--- a/app/Settings/MaintenanceController.php
+++ b/app/Settings/MaintenanceController.php
@@ -4,7 +4,7 @@ namespace BookStack\Settings;
 
 use BookStack\Activity\ActivityType;
 use BookStack\Entities\Tools\TrashCan;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Notifications\TestEmail;
 use BookStack\References\ReferenceStore;
 use BookStack\Uploads\ImageService;
diff --git a/app/Settings/SettingController.php b/app/Settings/SettingController.php
index b58d23339..ffdd7545e 100644
--- a/app/Settings/SettingController.php
+++ b/app/Settings/SettingController.php
@@ -3,7 +3,7 @@
 namespace BookStack\Settings;
 
 use BookStack\Activity\ActivityType;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Users\Models\User;
 use Illuminate\Http\Request;
 
diff --git a/app/Settings/StatusController.php b/app/Settings/StatusController.php
index 9559e344c..5193bc50d 100644
--- a/app/Settings/StatusController.php
+++ b/app/Settings/StatusController.php
@@ -2,7 +2,7 @@
 
 namespace BookStack\Settings;
 
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Session;
diff --git a/app/Uploads/Controllers/AttachmentApiController.php b/app/Uploads/Controllers/AttachmentApiController.php
index da8956789..2e6d16205 100644
--- a/app/Uploads/Controllers/AttachmentApiController.php
+++ b/app/Uploads/Controllers/AttachmentApiController.php
@@ -4,7 +4,7 @@ namespace BookStack\Uploads\Controllers;
 
 use BookStack\Entities\Models\Page;
 use BookStack\Exceptions\FileUploadException;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use BookStack\Uploads\Attachment;
 use BookStack\Uploads\AttachmentService;
 use Exception;
diff --git a/app/Uploads/Controllers/AttachmentController.php b/app/Uploads/Controllers/AttachmentController.php
index 7056f4877..92f23465d 100644
--- a/app/Uploads/Controllers/AttachmentController.php
+++ b/app/Uploads/Controllers/AttachmentController.php
@@ -5,7 +5,7 @@ namespace BookStack\Uploads\Controllers;
 use BookStack\Entities\Repos\PageRepo;
 use BookStack\Exceptions\FileUploadException;
 use BookStack\Exceptions\NotFoundException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Uploads\Attachment;
 use BookStack\Uploads\AttachmentService;
 use Exception;
diff --git a/app/Uploads/Controllers/DrawioImageController.php b/app/Uploads/Controllers/DrawioImageController.php
index 198cae2fe..35deada88 100644
--- a/app/Uploads/Controllers/DrawioImageController.php
+++ b/app/Uploads/Controllers/DrawioImageController.php
@@ -3,7 +3,7 @@
 namespace BookStack\Uploads\Controllers;
 
 use BookStack\Exceptions\ImageUploadException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Uploads\ImageRepo;
 use Exception;
 use Illuminate\Http\Request;
diff --git a/app/Uploads/Controllers/GalleryImageController.php b/app/Uploads/Controllers/GalleryImageController.php
index 879f64f07..fb74d6203 100644
--- a/app/Uploads/Controllers/GalleryImageController.php
+++ b/app/Uploads/Controllers/GalleryImageController.php
@@ -3,7 +3,7 @@
 namespace BookStack\Uploads\Controllers;
 
 use BookStack\Exceptions\ImageUploadException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Uploads\ImageRepo;
 use Illuminate\Http\Request;
 use Illuminate\Validation\ValidationException;
diff --git a/app/Uploads/Controllers/ImageController.php b/app/Uploads/Controllers/ImageController.php
index 6c2be269a..fea0713a2 100644
--- a/app/Uploads/Controllers/ImageController.php
+++ b/app/Uploads/Controllers/ImageController.php
@@ -4,7 +4,7 @@ namespace BookStack\Uploads\Controllers;
 
 use BookStack\Exceptions\ImageUploadException;
 use BookStack\Exceptions\NotFoundException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Uploads\Image;
 use BookStack\Uploads\ImageRepo;
 use BookStack\Uploads\ImageService;
diff --git a/app/Uploads/Controllers/ImageGalleryApiController.php b/app/Uploads/Controllers/ImageGalleryApiController.php
index 1684ea21e..1614b6445 100644
--- a/app/Uploads/Controllers/ImageGalleryApiController.php
+++ b/app/Uploads/Controllers/ImageGalleryApiController.php
@@ -3,7 +3,7 @@
 namespace BookStack\Uploads\Controllers;
 
 use BookStack\Entities\Models\Page;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use BookStack\Uploads\Image;
 use BookStack\Uploads\ImageRepo;
 use Illuminate\Http\Request;
diff --git a/app/Users/Controllers/RoleApiController.php b/app/Users/Controllers/RoleApiController.php
index a01ff92d0..5f4f2999b 100644
--- a/app/Users/Controllers/RoleApiController.php
+++ b/app/Users/Controllers/RoleApiController.php
@@ -2,7 +2,7 @@
 
 namespace BookStack\Users\Controllers;
 
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use BookStack\Permissions\PermissionsRepo;
 use BookStack\Users\Models\Role;
 use Illuminate\Http\Request;
diff --git a/app/Users/Controllers/RoleController.php b/app/Users/Controllers/RoleController.php
index c383df39b..f6472e4de 100644
--- a/app/Users/Controllers/RoleController.php
+++ b/app/Users/Controllers/RoleController.php
@@ -3,7 +3,7 @@
 namespace BookStack\Users\Controllers;
 
 use BookStack\Exceptions\PermissionsException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Permissions\PermissionsRepo;
 use BookStack\Users\Models\Role;
 use BookStack\Users\Queries\RolesAllPaginatedAndSorted;
diff --git a/app/Users/Controllers/UserApiController.php b/app/Users/Controllers/UserApiController.php
index 750e87f0e..759aafbd8 100644
--- a/app/Users/Controllers/UserApiController.php
+++ b/app/Users/Controllers/UserApiController.php
@@ -3,7 +3,7 @@
 namespace BookStack\Users\Controllers;
 
 use BookStack\Exceptions\UserUpdateException;
-use BookStack\Http\Controllers\ApiController;
+use BookStack\Http\ApiController;
 use BookStack\Users\Models\User;
 use BookStack\Users\UserRepo;
 use Closure;
diff --git a/app/Users/Controllers/UserController.php b/app/Users/Controllers/UserController.php
index 5aad03766..b185f0856 100644
--- a/app/Users/Controllers/UserController.php
+++ b/app/Users/Controllers/UserController.php
@@ -5,7 +5,7 @@ namespace BookStack\Users\Controllers;
 use BookStack\Access\SocialAuthService;
 use BookStack\Exceptions\ImageUploadException;
 use BookStack\Exceptions\UserUpdateException;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Uploads\ImageRepo;
 use BookStack\Users\Models\Role;
 use BookStack\Users\Queries\UsersAllPaginatedAndSorted;
diff --git a/app/Users/Controllers/UserPreferencesController.php b/app/Users/Controllers/UserPreferencesController.php
index 57414aefd..b20a8aa37 100644
--- a/app/Users/Controllers/UserPreferencesController.php
+++ b/app/Users/Controllers/UserPreferencesController.php
@@ -2,7 +2,7 @@
 
 namespace BookStack\Users\Controllers;
 
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Settings\UserShortcutMap;
 use BookStack\Users\UserRepo;
 use Illuminate\Http\Request;
diff --git a/app/Users/Controllers/UserProfileController.php b/app/Users/Controllers/UserProfileController.php
index c1a82dda9..bdf268260 100644
--- a/app/Users/Controllers/UserProfileController.php
+++ b/app/Users/Controllers/UserProfileController.php
@@ -3,7 +3,7 @@
 namespace BookStack\Users\Controllers;
 
 use BookStack\Activity\ActivityQueries;
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Users\Queries\UserContentCounts;
 use BookStack\Users\Queries\UserRecentlyCreatedContent;
 use BookStack\Users\UserRepo;
diff --git a/app/Users/Controllers/UserSearchController.php b/app/Users/Controllers/UserSearchController.php
index 6523b2723..1c7786f58 100644
--- a/app/Users/Controllers/UserSearchController.php
+++ b/app/Users/Controllers/UserSearchController.php
@@ -2,7 +2,7 @@
 
 namespace BookStack\Users\Controllers;
 
-use BookStack\Http\Controllers\Controller;
+use BookStack\Http\Controller;
 use BookStack\Users\Models\User;
 use Illuminate\Http\Request;
 
diff --git a/routes/api.php b/routes/api.php
index 9d2741498..04c94a966 100644
--- a/routes/api.php
+++ b/routes/api.php
@@ -3,18 +3,11 @@
 /**
  * Routes for the BookStack API.
  * Routes have a uri prefix of /api/.
- * Controllers are all within app/Http/Controllers/Api.
+ * Controllers all end with "ApiController"
  */
 
 use BookStack\Api\ApiDocsController;
-use BookStack\Entities\Controllers\BookApiController;
-use BookStack\Entities\Controllers\BookExportApiController;
-use BookStack\Entities\Controllers\BookshelfApiController;
-use BookStack\Entities\Controllers\ChapterApiController;
-use BookStack\Entities\Controllers\ChapterExportApiController;
-use BookStack\Entities\Controllers\PageApiController;
-use BookStack\Entities\Controllers\PageExportApiController;
-use BookStack\Entities\Controllers\RecycleBinApiController;
+use BookStack\Entities\Controllers as EntityControllers;
 use BookStack\Permissions\ContentPermissionApiController;
 use BookStack\Search\SearchApiController;
 use BookStack\Uploads\Controllers\AttachmentApiController;
@@ -31,38 +24,38 @@ Route::get('attachments/{id}', [AttachmentApiController::class, 'read']);
 Route::put('attachments/{id}', [AttachmentApiController::class, 'update']);
 Route::delete('attachments/{id}', [AttachmentApiController::class, 'delete']);
 
-Route::get('books', [BookApiController::class, 'list']);
-Route::post('books', [BookApiController::class, 'create']);
-Route::get('books/{id}', [BookApiController::class, 'read']);
-Route::put('books/{id}', [BookApiController::class, 'update']);
-Route::delete('books/{id}', [BookApiController::class, 'delete']);
+Route::get('books', [EntityControllers\BookApiController::class, 'list']);
+Route::post('books', [EntityControllers\BookApiController::class, 'create']);
+Route::get('books/{id}', [EntityControllers\BookApiController::class, 'read']);
+Route::put('books/{id}', [EntityControllers\BookApiController::class, 'update']);
+Route::delete('books/{id}', [EntityControllers\BookApiController::class, 'delete']);
 
-Route::get('books/{id}/export/html', [BookExportApiController::class, 'exportHtml']);
-Route::get('books/{id}/export/pdf', [BookExportApiController::class, 'exportPdf']);
-Route::get('books/{id}/export/plaintext', [BookExportApiController::class, 'exportPlainText']);
-Route::get('books/{id}/export/markdown', [BookExportApiController::class, 'exportMarkdown']);
+Route::get('books/{id}/export/html', [EntityControllers\BookExportApiController::class, 'exportHtml']);
+Route::get('books/{id}/export/pdf', [EntityControllers\BookExportApiController::class, 'exportPdf']);
+Route::get('books/{id}/export/plaintext', [EntityControllers\BookExportApiController::class, 'exportPlainText']);
+Route::get('books/{id}/export/markdown', [EntityControllers\BookExportApiController::class, 'exportMarkdown']);
 
-Route::get('chapters', [ChapterApiController::class, 'list']);
-Route::post('chapters', [ChapterApiController::class, 'create']);
-Route::get('chapters/{id}', [ChapterApiController::class, 'read']);
-Route::put('chapters/{id}', [ChapterApiController::class, 'update']);
-Route::delete('chapters/{id}', [ChapterApiController::class, 'delete']);
+Route::get('chapters', [EntityControllers\ChapterApiController::class, 'list']);
+Route::post('chapters', [EntityControllers\ChapterApiController::class, 'create']);
+Route::get('chapters/{id}', [EntityControllers\ChapterApiController::class, 'read']);
+Route::put('chapters/{id}', [EntityControllers\ChapterApiController::class, 'update']);
+Route::delete('chapters/{id}', [EntityControllers\ChapterApiController::class, 'delete']);
 
-Route::get('chapters/{id}/export/html', [ChapterExportApiController::class, 'exportHtml']);
-Route::get('chapters/{id}/export/pdf', [ChapterExportApiController::class, 'exportPdf']);
-Route::get('chapters/{id}/export/plaintext', [ChapterExportApiController::class, 'exportPlainText']);
-Route::get('chapters/{id}/export/markdown', [ChapterExportApiController::class, 'exportMarkdown']);
+Route::get('chapters/{id}/export/html', [EntityControllers\ChapterExportApiController::class, 'exportHtml']);
+Route::get('chapters/{id}/export/pdf', [EntityControllers\ChapterExportApiController::class, 'exportPdf']);
+Route::get('chapters/{id}/export/plaintext', [EntityControllers\ChapterExportApiController::class, 'exportPlainText']);
+Route::get('chapters/{id}/export/markdown', [EntityControllers\ChapterExportApiController::class, 'exportMarkdown']);
 
-Route::get('pages', [PageApiController::class, 'list']);
-Route::post('pages', [PageApiController::class, 'create']);
-Route::get('pages/{id}', [PageApiController::class, 'read']);
-Route::put('pages/{id}', [PageApiController::class, 'update']);
-Route::delete('pages/{id}', [PageApiController::class, 'delete']);
+Route::get('pages', [EntityControllers\PageApiController::class, 'list']);
+Route::post('pages', [EntityControllers\PageApiController::class, 'create']);
+Route::get('pages/{id}', [EntityControllers\PageApiController::class, 'read']);
+Route::put('pages/{id}', [EntityControllers\PageApiController::class, 'update']);
+Route::delete('pages/{id}', [EntityControllers\PageApiController::class, 'delete']);
 
-Route::get('pages/{id}/export/html', [PageExportApiController::class, 'exportHtml']);
-Route::get('pages/{id}/export/pdf', [PageExportApiController::class, 'exportPdf']);
-Route::get('pages/{id}/export/plaintext', [PageExportApiController::class, 'exportPlainText']);
-Route::get('pages/{id}/export/markdown', [PageExportApiController::class, 'exportMarkdown']);
+Route::get('pages/{id}/export/html', [EntityControllers\PageExportApiController::class, 'exportHtml']);
+Route::get('pages/{id}/export/pdf', [EntityControllers\PageExportApiController::class, 'exportPdf']);
+Route::get('pages/{id}/export/plaintext', [EntityControllers\PageExportApiController::class, 'exportPlainText']);
+Route::get('pages/{id}/export/markdown', [EntityControllers\PageExportApiController::class, 'exportMarkdown']);
 
 Route::get('image-gallery', [ImageGalleryApiController::class, 'list']);
 Route::post('image-gallery', [ImageGalleryApiController::class, 'create']);
@@ -72,11 +65,11 @@ Route::delete('image-gallery/{id}', [ImageGalleryApiController::class, 'delete']
 
 Route::get('search', [SearchApiController::class, 'all']);
 
-Route::get('shelves', [BookshelfApiController::class, 'list']);
-Route::post('shelves', [BookshelfApiController::class, 'create']);
-Route::get('shelves/{id}', [BookshelfApiController::class, 'read']);
-Route::put('shelves/{id}', [BookshelfApiController::class, 'update']);
-Route::delete('shelves/{id}', [BookshelfApiController::class, 'delete']);
+Route::get('shelves', [EntityControllers\BookshelfApiController::class, 'list']);
+Route::post('shelves', [EntityControllers\BookshelfApiController::class, 'create']);
+Route::get('shelves/{id}', [EntityControllers\BookshelfApiController::class, 'read']);
+Route::put('shelves/{id}', [EntityControllers\BookshelfApiController::class, 'update']);
+Route::delete('shelves/{id}', [EntityControllers\BookshelfApiController::class, 'delete']);
 
 Route::get('users', [UserApiController::class, 'list']);
 Route::post('users', [UserApiController::class, 'create']);
@@ -90,9 +83,9 @@ Route::get('roles/{id}', [RoleApiController::class, 'read']);
 Route::put('roles/{id}', [RoleApiController::class, 'update']);
 Route::delete('roles/{id}', [RoleApiController::class, 'delete']);
 
-Route::get('recycle-bin', [RecycleBinApiController::class, 'list']);
-Route::put('recycle-bin/{deletionId}', [RecycleBinApiController::class, 'restore']);
-Route::delete('recycle-bin/{deletionId}', [RecycleBinApiController::class, 'destroy']);
+Route::get('recycle-bin', [EntityControllers\RecycleBinApiController::class, 'list']);
+Route::put('recycle-bin/{deletionId}', [EntityControllers\RecycleBinApiController::class, 'restore']);
+Route::delete('recycle-bin/{deletionId}', [EntityControllers\RecycleBinApiController::class, 'destroy']);
 
 Route::get('content-permissions/{contentType}/{contentId}', [ContentPermissionApiController::class, 'read']);
 Route::put('content-permissions/{contentType}/{contentId}', [ContentPermissionApiController::class, 'update']);
diff --git a/routes/console.php b/routes/console.php
deleted file mode 100644
index e05f4c9a1..000000000
--- a/routes/console.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-use Illuminate\Foundation\Inspiring;
-use Illuminate\Support\Facades\Artisan;
-
-/*
-|--------------------------------------------------------------------------
-| Console Routes
-|--------------------------------------------------------------------------
-|
-| This file is where you may define all of your Closure based console
-| commands. Each Closure is bound to a command instance allowing a
-| simple approach to interacting with each command's IO methods.
-|
-*/
-
-Artisan::command('inspire', function () {
-    $this->comment(Inspiring::quote());
-})->purpose('Display an inspiring quote');
diff --git a/routes/web.php b/routes/web.php
index 5a4dbedd6..92e0a003a 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -1,43 +1,23 @@
 <?php
 
-use BookStack\Activity\Controllers\AuditLogController;
-use BookStack\Activity\Controllers\CommentController;
-use BookStack\Activity\Controllers\FavouriteController;
-use BookStack\Activity\Controllers\TagController;
-use BookStack\Activity\Controllers\WebhookController;
+use BookStack\Access\Controllers as AccessControllers;
+use BookStack\Activity\Controllers as ActivityControllers;
+use BookStack\Api\ApiDocsController;
 use BookStack\Api\UserApiTokenController;
-use BookStack\Entities\Controllers\BookController;
-use BookStack\Entities\Controllers\BookExportController;
-use BookStack\Entities\Controllers\BookshelfController;
-use BookStack\Entities\Controllers\BookSortController;
-use BookStack\Entities\Controllers\ChapterController;
-use BookStack\Entities\Controllers\ChapterExportController;
-use BookStack\Entities\Controllers\PageController;
-use BookStack\Entities\Controllers\PageExportController;
-use BookStack\Entities\Controllers\PageRevisionController;
-use BookStack\Entities\Controllers\PageTemplateController;
-use BookStack\Entities\Controllers\RecycleBinController;
-use BookStack\Http\Controllers\Auth;
-use BookStack\Http\Controllers\HomeController;
-use BookStack\Http\Controllers\Images;
+use BookStack\App\HomeController;
+use BookStack\Entities\Controllers as EntityControllers;
 use BookStack\Http\Middleware\VerifyCsrfToken;
 use BookStack\Permissions\PermissionsController;
 use BookStack\References\ReferenceController;
 use BookStack\Search\SearchController;
-use BookStack\Settings\MaintenanceController;
-use BookStack\Settings\SettingController;
-use BookStack\Settings\StatusController;
-use BookStack\Uploads\Controllers\AttachmentController;
-use BookStack\Users\Controllers\RoleController;
-use BookStack\Users\Controllers\UserController;
-use BookStack\Users\Controllers\UserPreferencesController;
-use BookStack\Users\Controllers\UserProfileController;
-use BookStack\Users\Controllers\UserSearchController;
+use BookStack\Settings as SettingControllers;
+use BookStack\Uploads\Controllers as UploadControllers;
+use BookStack\Users\Controllers as UserControllers;
 use Illuminate\Session\Middleware\StartSession;
 use Illuminate\Support\Facades\Route;
 use Illuminate\View\Middleware\ShareErrorsFromSession;
 
-Route::get('/status', [StatusController::class, 'show']);
+Route::get('/status', [SettingControllers\StatusController::class, 'show']);
 Route::get('/robots.txt', [HomeController::class, 'robots']);
 Route::get('/favicon.ico', [HomeController::class, 'favicon']);
 
@@ -45,152 +25,152 @@ Route::get('/favicon.ico', [HomeController::class, 'favicon']);
 Route::middleware('auth')->group(function () {
 
     // Secure images routing
-    Route::get('/uploads/images/{path}', [\BookStack\Uploads\Controllers\ImageController::class, 'showImage'])
+    Route::get('/uploads/images/{path}', [UploadControllers\ImageController::class, 'showImage'])
         ->where('path', '.*$');
 
     // API docs routes
     Route::redirect('/api', '/api/docs');
-    Route::get('/api/docs', [\BookStack\Api\ApiDocsController::class, 'display']);
+    Route::get('/api/docs', [ApiDocsController::class, 'display']);
 
-    Route::get('/pages/recently-updated', [PageController::class, 'showRecentlyUpdated']);
+    Route::get('/pages/recently-updated', [EntityControllers\PageController::class, 'showRecentlyUpdated']);
 
     // Shelves
-    Route::get('/create-shelf', [BookshelfController::class, 'create']);
-    Route::get('/shelves/', [BookshelfController::class, 'index']);
-    Route::post('/shelves/', [BookshelfController::class, 'store']);
-    Route::get('/shelves/{slug}/edit', [BookshelfController::class, 'edit']);
-    Route::get('/shelves/{slug}/delete', [BookshelfController::class, 'showDelete']);
-    Route::get('/shelves/{slug}', [BookshelfController::class, 'show']);
-    Route::put('/shelves/{slug}', [BookshelfController::class, 'update']);
-    Route::delete('/shelves/{slug}', [BookshelfController::class, 'destroy']);
+    Route::get('/create-shelf', [EntityControllers\BookshelfController::class, 'create']);
+    Route::get('/shelves/', [EntityControllers\BookshelfController::class, 'index']);
+    Route::post('/shelves/', [EntityControllers\BookshelfController::class, 'store']);
+    Route::get('/shelves/{slug}/edit', [EntityControllers\BookshelfController::class, 'edit']);
+    Route::get('/shelves/{slug}/delete', [EntityControllers\BookshelfController::class, 'showDelete']);
+    Route::get('/shelves/{slug}', [EntityControllers\BookshelfController::class, 'show']);
+    Route::put('/shelves/{slug}', [EntityControllers\BookshelfController::class, 'update']);
+    Route::delete('/shelves/{slug}', [EntityControllers\BookshelfController::class, 'destroy']);
     Route::get('/shelves/{slug}/permissions', [PermissionsController::class, 'showForShelf']);
     Route::put('/shelves/{slug}/permissions', [PermissionsController::class, 'updateForShelf']);
     Route::post('/shelves/{slug}/copy-permissions', [PermissionsController::class, 'copyShelfPermissionsToBooks']);
     Route::get('/shelves/{slug}/references', [ReferenceController::class, 'shelf']);
 
     // Book Creation
-    Route::get('/shelves/{shelfSlug}/create-book', [BookController::class, 'create']);
-    Route::post('/shelves/{shelfSlug}/create-book', [BookController::class, 'store']);
-    Route::get('/create-book', [BookController::class, 'create']);
+    Route::get('/shelves/{shelfSlug}/create-book', [EntityControllers\BookController::class, 'create']);
+    Route::post('/shelves/{shelfSlug}/create-book', [EntityControllers\BookController::class, 'store']);
+    Route::get('/create-book', [EntityControllers\BookController::class, 'create']);
 
     // Books
-    Route::get('/books/', [BookController::class, 'index']);
-    Route::post('/books/', [BookController::class, 'store']);
-    Route::get('/books/{slug}/edit', [BookController::class, 'edit']);
-    Route::put('/books/{slug}', [BookController::class, 'update']);
-    Route::delete('/books/{id}', [BookController::class, 'destroy']);
-    Route::get('/books/{slug}/sort-item', [BookSortController::class, 'showItem']);
-    Route::get('/books/{slug}', [BookController::class, 'show']);
+    Route::get('/books/', [EntityControllers\BookController::class, 'index']);
+    Route::post('/books/', [EntityControllers\BookController::class, 'store']);
+    Route::get('/books/{slug}/edit', [EntityControllers\BookController::class, 'edit']);
+    Route::put('/books/{slug}', [EntityControllers\BookController::class, 'update']);
+    Route::delete('/books/{id}', [EntityControllers\BookController::class, 'destroy']);
+    Route::get('/books/{slug}/sort-item', [EntityControllers\BookSortController::class, 'showItem']);
+    Route::get('/books/{slug}', [EntityControllers\BookController::class, 'show']);
     Route::get('/books/{bookSlug}/permissions', [PermissionsController::class, 'showForBook']);
     Route::put('/books/{bookSlug}/permissions', [PermissionsController::class, 'updateForBook']);
-    Route::get('/books/{slug}/delete', [BookController::class, 'showDelete']);
-    Route::get('/books/{bookSlug}/copy', [BookController::class, 'showCopy']);
-    Route::post('/books/{bookSlug}/copy', [BookController::class, 'copy']);
-    Route::post('/books/{bookSlug}/convert-to-shelf', [BookController::class, 'convertToShelf']);
-    Route::get('/books/{bookSlug}/sort', [BookSortController::class, 'show']);
-    Route::put('/books/{bookSlug}/sort', [BookSortController::class, 'update']);
+    Route::get('/books/{slug}/delete', [EntityControllers\BookController::class, 'showDelete']);
+    Route::get('/books/{bookSlug}/copy', [EntityControllers\BookController::class, 'showCopy']);
+    Route::post('/books/{bookSlug}/copy', [EntityControllers\BookController::class, 'copy']);
+    Route::post('/books/{bookSlug}/convert-to-shelf', [EntityControllers\BookController::class, 'convertToShelf']);
+    Route::get('/books/{bookSlug}/sort', [EntityControllers\BookSortController::class, 'show']);
+    Route::put('/books/{bookSlug}/sort', [EntityControllers\BookSortController::class, 'update']);
     Route::get('/books/{slug}/references', [ReferenceController::class, 'book']);
-    Route::get('/books/{bookSlug}/export/html', [BookExportController::class, 'html']);
-    Route::get('/books/{bookSlug}/export/pdf', [BookExportController::class, 'pdf']);
-    Route::get('/books/{bookSlug}/export/markdown', [BookExportController::class, 'markdown']);
-    Route::get('/books/{bookSlug}/export/zip', [BookExportController::class, 'zip']);
-    Route::get('/books/{bookSlug}/export/plaintext', [BookExportController::class, 'plainText']);
+    Route::get('/books/{bookSlug}/export/html', [EntityControllers\BookExportController::class, 'html']);
+    Route::get('/books/{bookSlug}/export/pdf', [EntityControllers\BookExportController::class, 'pdf']);
+    Route::get('/books/{bookSlug}/export/markdown', [EntityControllers\BookExportController::class, 'markdown']);
+    Route::get('/books/{bookSlug}/export/zip', [EntityControllers\BookExportController::class, 'zip']);
+    Route::get('/books/{bookSlug}/export/plaintext', [EntityControllers\BookExportController::class, 'plainText']);
 
     // Pages
-    Route::get('/books/{bookSlug}/create-page', [PageController::class, 'create']);
-    Route::post('/books/{bookSlug}/create-guest-page', [PageController::class, 'createAsGuest']);
-    Route::get('/books/{bookSlug}/draft/{pageId}', [PageController::class, 'editDraft']);
-    Route::post('/books/{bookSlug}/draft/{pageId}', [PageController::class, 'store']);
-    Route::get('/books/{bookSlug}/page/{pageSlug}', [PageController::class, 'show']);
-    Route::get('/books/{bookSlug}/page/{pageSlug}/export/pdf', [PageExportController::class, 'pdf']);
-    Route::get('/books/{bookSlug}/page/{pageSlug}/export/html', [PageExportController::class, 'html']);
-    Route::get('/books/{bookSlug}/page/{pageSlug}/export/markdown', [PageExportController::class, 'markdown']);
-    Route::get('/books/{bookSlug}/page/{pageSlug}/export/plaintext', [PageExportController::class, 'plainText']);
-    Route::get('/books/{bookSlug}/page/{pageSlug}/edit', [PageController::class, 'edit']);
-    Route::get('/books/{bookSlug}/page/{pageSlug}/move', [PageController::class, 'showMove']);
-    Route::put('/books/{bookSlug}/page/{pageSlug}/move', [PageController::class, 'move']);
-    Route::get('/books/{bookSlug}/page/{pageSlug}/copy', [PageController::class, 'showCopy']);
-    Route::post('/books/{bookSlug}/page/{pageSlug}/copy', [PageController::class, 'copy']);
-    Route::get('/books/{bookSlug}/page/{pageSlug}/delete', [PageController::class, 'showDelete']);
-    Route::get('/books/{bookSlug}/draft/{pageId}/delete', [PageController::class, 'showDeleteDraft']);
+    Route::get('/books/{bookSlug}/create-page', [EntityControllers\PageController::class, 'create']);
+    Route::post('/books/{bookSlug}/create-guest-page', [EntityControllers\PageController::class, 'createAsGuest']);
+    Route::get('/books/{bookSlug}/draft/{pageId}', [EntityControllers\PageController::class, 'editDraft']);
+    Route::post('/books/{bookSlug}/draft/{pageId}', [EntityControllers\PageController::class, 'store']);
+    Route::get('/books/{bookSlug}/page/{pageSlug}', [EntityControllers\PageController::class, 'show']);
+    Route::get('/books/{bookSlug}/page/{pageSlug}/export/pdf', [EntityControllers\PageExportController::class, 'pdf']);
+    Route::get('/books/{bookSlug}/page/{pageSlug}/export/html', [EntityControllers\PageExportController::class, 'html']);
+    Route::get('/books/{bookSlug}/page/{pageSlug}/export/markdown', [EntityControllers\PageExportController::class, 'markdown']);
+    Route::get('/books/{bookSlug}/page/{pageSlug}/export/plaintext', [EntityControllers\PageExportController::class, 'plainText']);
+    Route::get('/books/{bookSlug}/page/{pageSlug}/edit', [EntityControllers\PageController::class, 'edit']);
+    Route::get('/books/{bookSlug}/page/{pageSlug}/move', [EntityControllers\PageController::class, 'showMove']);
+    Route::put('/books/{bookSlug}/page/{pageSlug}/move', [EntityControllers\PageController::class, 'move']);
+    Route::get('/books/{bookSlug}/page/{pageSlug}/copy', [EntityControllers\PageController::class, 'showCopy']);
+    Route::post('/books/{bookSlug}/page/{pageSlug}/copy', [EntityControllers\PageController::class, 'copy']);
+    Route::get('/books/{bookSlug}/page/{pageSlug}/delete', [EntityControllers\PageController::class, 'showDelete']);
+    Route::get('/books/{bookSlug}/draft/{pageId}/delete', [EntityControllers\PageController::class, 'showDeleteDraft']);
     Route::get('/books/{bookSlug}/page/{pageSlug}/permissions', [PermissionsController::class, 'showForPage']);
     Route::put('/books/{bookSlug}/page/{pageSlug}/permissions', [PermissionsController::class, 'updateForPage']);
     Route::get('/books/{bookSlug}/page/{pageSlug}/references', [ReferenceController::class, 'page']);
-    Route::put('/books/{bookSlug}/page/{pageSlug}', [PageController::class, 'update']);
-    Route::delete('/books/{bookSlug}/page/{pageSlug}', [PageController::class, 'destroy']);
-    Route::delete('/books/{bookSlug}/draft/{pageId}', [PageController::class, 'destroyDraft']);
+    Route::put('/books/{bookSlug}/page/{pageSlug}', [EntityControllers\PageController::class, 'update']);
+    Route::delete('/books/{bookSlug}/page/{pageSlug}', [EntityControllers\PageController::class, 'destroy']);
+    Route::delete('/books/{bookSlug}/draft/{pageId}', [EntityControllers\PageController::class, 'destroyDraft']);
 
     // Revisions
-    Route::get('/books/{bookSlug}/page/{pageSlug}/revisions', [PageRevisionController::class, 'index']);
-    Route::get('/books/{bookSlug}/page/{pageSlug}/revisions/{revId}', [PageRevisionController::class, 'show']);
-    Route::get('/books/{bookSlug}/page/{pageSlug}/revisions/{revId}/changes', [PageRevisionController::class, 'changes']);
-    Route::put('/books/{bookSlug}/page/{pageSlug}/revisions/{revId}/restore', [PageRevisionController::class, 'restore']);
-    Route::delete('/books/{bookSlug}/page/{pageSlug}/revisions/{revId}/delete', [PageRevisionController::class, 'destroy']);
+    Route::get('/books/{bookSlug}/page/{pageSlug}/revisions', [EntityControllers\PageRevisionController::class, 'index']);
+    Route::get('/books/{bookSlug}/page/{pageSlug}/revisions/{revId}', [EntityControllers\PageRevisionController::class, 'show']);
+    Route::get('/books/{bookSlug}/page/{pageSlug}/revisions/{revId}/changes', [EntityControllers\PageRevisionController::class, 'changes']);
+    Route::put('/books/{bookSlug}/page/{pageSlug}/revisions/{revId}/restore', [EntityControllers\PageRevisionController::class, 'restore']);
+    Route::delete('/books/{bookSlug}/page/{pageSlug}/revisions/{revId}/delete', [EntityControllers\PageRevisionController::class, 'destroy']);
 
     // Chapters
-    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/create-page', [PageController::class, 'create']);
-    Route::post('/books/{bookSlug}/chapter/{chapterSlug}/create-guest-page', [PageController::class, 'createAsGuest']);
-    Route::get('/books/{bookSlug}/create-chapter', [ChapterController::class, 'create']);
-    Route::post('/books/{bookSlug}/create-chapter', [ChapterController::class, 'store']);
-    Route::get('/books/{bookSlug}/chapter/{chapterSlug}', [ChapterController::class, 'show']);
-    Route::put('/books/{bookSlug}/chapter/{chapterSlug}', [ChapterController::class, 'update']);
-    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/move', [ChapterController::class, 'showMove']);
-    Route::put('/books/{bookSlug}/chapter/{chapterSlug}/move', [ChapterController::class, 'move']);
-    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/copy', [ChapterController::class, 'showCopy']);
-    Route::post('/books/{bookSlug}/chapter/{chapterSlug}/copy', [ChapterController::class, 'copy']);
-    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/edit', [ChapterController::class, 'edit']);
-    Route::post('/books/{bookSlug}/chapter/{chapterSlug}/convert-to-book', [ChapterController::class, 'convertToBook']);
+    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/create-page', [EntityControllers\PageController::class, 'create']);
+    Route::post('/books/{bookSlug}/chapter/{chapterSlug}/create-guest-page', [EntityControllers\PageController::class, 'createAsGuest']);
+    Route::get('/books/{bookSlug}/create-chapter', [EntityControllers\ChapterController::class, 'create']);
+    Route::post('/books/{bookSlug}/create-chapter', [EntityControllers\ChapterController::class, 'store']);
+    Route::get('/books/{bookSlug}/chapter/{chapterSlug}', [EntityControllers\ChapterController::class, 'show']);
+    Route::put('/books/{bookSlug}/chapter/{chapterSlug}', [EntityControllers\ChapterController::class, 'update']);
+    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/move', [EntityControllers\ChapterController::class, 'showMove']);
+    Route::put('/books/{bookSlug}/chapter/{chapterSlug}/move', [EntityControllers\ChapterController::class, 'move']);
+    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/copy', [EntityControllers\ChapterController::class, 'showCopy']);
+    Route::post('/books/{bookSlug}/chapter/{chapterSlug}/copy', [EntityControllers\ChapterController::class, 'copy']);
+    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/edit', [EntityControllers\ChapterController::class, 'edit']);
+    Route::post('/books/{bookSlug}/chapter/{chapterSlug}/convert-to-book', [EntityControllers\ChapterController::class, 'convertToBook']);
     Route::get('/books/{bookSlug}/chapter/{chapterSlug}/permissions', [PermissionsController::class, 'showForChapter']);
-    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/pdf', [ChapterExportController::class, 'pdf']);
-    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/html', [ChapterExportController::class, 'html']);
-    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/markdown', [ChapterExportController::class, 'markdown']);
-    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/plaintext', [ChapterExportController::class, 'plainText']);
+    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/pdf', [EntityControllers\ChapterExportController::class, 'pdf']);
+    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/html', [EntityControllers\ChapterExportController::class, 'html']);
+    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/markdown', [EntityControllers\ChapterExportController::class, 'markdown']);
+    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/plaintext', [EntityControllers\ChapterExportController::class, 'plainText']);
     Route::put('/books/{bookSlug}/chapter/{chapterSlug}/permissions', [PermissionsController::class, 'updateForChapter']);
     Route::get('/books/{bookSlug}/chapter/{chapterSlug}/references', [ReferenceController::class, 'chapter']);
-    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/delete', [ChapterController::class, 'showDelete']);
-    Route::delete('/books/{bookSlug}/chapter/{chapterSlug}', [ChapterController::class, 'destroy']);
+    Route::get('/books/{bookSlug}/chapter/{chapterSlug}/delete', [EntityControllers\ChapterController::class, 'showDelete']);
+    Route::delete('/books/{bookSlug}/chapter/{chapterSlug}', [EntityControllers\ChapterController::class, 'destroy']);
 
     // User Profile routes
-    Route::get('/user/{slug}', [UserProfileController::class, 'show']);
+    Route::get('/user/{slug}', [UserControllers\UserProfileController::class, 'show']);
 
     // Image routes
-    Route::get('/images/gallery', [\BookStack\Uploads\Controllers\GalleryImageController::class, 'list']);
-    Route::post('/images/gallery', [\BookStack\Uploads\Controllers\GalleryImageController::class, 'create']);
-    Route::get('/images/drawio', [\BookStack\Uploads\Controllers\DrawioImageController::class, 'list']);
-    Route::get('/images/drawio/base64/{id}', [\BookStack\Uploads\Controllers\DrawioImageController::class, 'getAsBase64']);
-    Route::post('/images/drawio', [\BookStack\Uploads\Controllers\DrawioImageController::class, 'create']);
-    Route::get('/images/edit/{id}', [\BookStack\Uploads\Controllers\ImageController::class, 'edit']);
-    Route::put('/images/{id}', [\BookStack\Uploads\Controllers\ImageController::class, 'update']);
-    Route::delete('/images/{id}', [\BookStack\Uploads\Controllers\ImageController::class, 'destroy']);
+    Route::get('/images/gallery', [UploadControllers\GalleryImageController::class, 'list']);
+    Route::post('/images/gallery', [UploadControllers\GalleryImageController::class, 'create']);
+    Route::get('/images/drawio', [UploadControllers\DrawioImageController::class, 'list']);
+    Route::get('/images/drawio/base64/{id}', [UploadControllers\DrawioImageController::class, 'getAsBase64']);
+    Route::post('/images/drawio', [UploadControllers\DrawioImageController::class, 'create']);
+    Route::get('/images/edit/{id}', [UploadControllers\ImageController::class, 'edit']);
+    Route::put('/images/{id}', [UploadControllers\ImageController::class, 'update']);
+    Route::delete('/images/{id}', [UploadControllers\ImageController::class, 'destroy']);
 
     // Attachments routes
-    Route::get('/attachments/{id}', [AttachmentController::class, 'get']);
-    Route::post('/attachments/upload', [AttachmentController::class, 'upload']);
-    Route::post('/attachments/upload/{id}', [AttachmentController::class, 'uploadUpdate']);
-    Route::post('/attachments/link', [AttachmentController::class, 'attachLink']);
-    Route::put('/attachments/{id}', [AttachmentController::class, 'update']);
-    Route::get('/attachments/edit/{id}', [AttachmentController::class, 'getUpdateForm']);
-    Route::get('/attachments/get/page/{pageId}', [AttachmentController::class, 'listForPage']);
-    Route::put('/attachments/sort/page/{pageId}', [AttachmentController::class, 'sortForPage']);
-    Route::delete('/attachments/{id}', [AttachmentController::class, 'delete']);
+    Route::get('/attachments/{id}', [UploadControllers\AttachmentController::class, 'get']);
+    Route::post('/attachments/upload', [UploadControllers\AttachmentController::class, 'upload']);
+    Route::post('/attachments/upload/{id}', [UploadControllers\AttachmentController::class, 'uploadUpdate']);
+    Route::post('/attachments/link', [UploadControllers\AttachmentController::class, 'attachLink']);
+    Route::put('/attachments/{id}', [UploadControllers\AttachmentController::class, 'update']);
+    Route::get('/attachments/edit/{id}', [UploadControllers\AttachmentController::class, 'getUpdateForm']);
+    Route::get('/attachments/get/page/{pageId}', [UploadControllers\AttachmentController::class, 'listForPage']);
+    Route::put('/attachments/sort/page/{pageId}', [UploadControllers\AttachmentController::class, 'sortForPage']);
+    Route::delete('/attachments/{id}', [UploadControllers\AttachmentController::class, 'delete']);
 
     // AJAX routes
-    Route::put('/ajax/page/{id}/save-draft', [PageController::class, 'saveDraft']);
-    Route::get('/ajax/page/{id}', [PageController::class, 'getPageAjax']);
-    Route::delete('/ajax/page/{id}', [PageController::class, 'ajaxDestroy']);
+    Route::put('/ajax/page/{id}/save-draft', [EntityControllers\PageController::class, 'saveDraft']);
+    Route::get('/ajax/page/{id}', [EntityControllers\PageController::class, 'getPageAjax']);
+    Route::delete('/ajax/page/{id}', [EntityControllers\PageController::class, 'ajaxDestroy']);
 
     // Tag routes
-    Route::get('/tags', [TagController::class, 'index']);
-    Route::get('/ajax/tags/suggest/names', [TagController::class, 'getNameSuggestions']);
-    Route::get('/ajax/tags/suggest/values', [TagController::class, 'getValueSuggestions']);
+    Route::get('/tags', [ActivityControllers\TagController::class, 'index']);
+    Route::get('/ajax/tags/suggest/names', [ActivityControllers\TagController::class, 'getNameSuggestions']);
+    Route::get('/ajax/tags/suggest/values', [ActivityControllers\TagController::class, 'getValueSuggestions']);
 
     // Comments
-    Route::post('/comment/{pageId}', [CommentController::class, 'savePageComment']);
-    Route::put('/comment/{id}', [CommentController::class, 'update']);
-    Route::delete('/comment/{id}', [CommentController::class, 'destroy']);
+    Route::post('/comment/{pageId}', [ActivityControllers\CommentController::class, 'savePageComment']);
+    Route::put('/comment/{id}', [ActivityControllers\CommentController::class, 'update']);
+    Route::delete('/comment/{id}', [ActivityControllers\CommentController::class, 'destroy']);
 
     // Links
-    Route::get('/link/{id}', [PageController::class, 'redirectFromLink']);
+    Route::get('/link/{id}', [EntityControllers\PageController::class, 'redirectFromLink']);
 
     // Search
     Route::get('/search', [SearchController::class, 'search']);
@@ -201,16 +181,16 @@ Route::middleware('auth')->group(function () {
     Route::get('/search/suggest', [SearchController::class, 'searchSuggestions']);
 
     // User Search
-    Route::get('/search/users/select', [UserSearchController::class, 'forSelect']);
+    Route::get('/search/users/select', [UserControllers\UserSearchController::class, 'forSelect']);
 
     // Template System
-    Route::get('/templates', [PageTemplateController::class, 'list']);
-    Route::get('/templates/{templateId}', [PageTemplateController::class, 'get']);
+    Route::get('/templates', [EntityControllers\PageTemplateController::class, 'list']);
+    Route::get('/templates/{templateId}', [EntityControllers\PageTemplateController::class, 'get']);
 
     // Favourites
-    Route::get('/favourites', [FavouriteController::class, 'index']);
-    Route::post('/favourites/add', [FavouriteController::class, 'add']);
-    Route::post('/favourites/remove', [FavouriteController::class, 'remove']);
+    Route::get('/favourites', [ActivityControllers\FavouriteController::class, 'index']);
+    Route::post('/favourites/add', [ActivityControllers\FavouriteController::class, 'add']);
+    Route::post('/favourites/remove', [ActivityControllers\FavouriteController::class, 'remove']);
 
     // Other Pages
     Route::get('/', [HomeController::class, 'index']);
@@ -220,41 +200,41 @@ Route::middleware('auth')->group(function () {
     Route::get('/permissions/form-row/{entityType}/{roleId}', [PermissionsController::class, 'formRowForRole']);
 
     // Maintenance
-    Route::get('/settings/maintenance', [MaintenanceController::class, 'index']);
-    Route::delete('/settings/maintenance/cleanup-images', [MaintenanceController::class, 'cleanupImages']);
-    Route::post('/settings/maintenance/send-test-email', [MaintenanceController::class, 'sendTestEmail']);
-    Route::post('/settings/maintenance/regenerate-references', [MaintenanceController::class, 'regenerateReferences']);
+    Route::get('/settings/maintenance', [SettingControllers\MaintenanceController::class, 'index']);
+    Route::delete('/settings/maintenance/cleanup-images', [SettingControllers\MaintenanceController::class, 'cleanupImages']);
+    Route::post('/settings/maintenance/send-test-email', [SettingControllers\MaintenanceController::class, 'sendTestEmail']);
+    Route::post('/settings/maintenance/regenerate-references', [SettingControllers\MaintenanceController::class, 'regenerateReferences']);
 
     // Recycle Bin
-    Route::get('/settings/recycle-bin', [RecycleBinController::class, 'index']);
-    Route::post('/settings/recycle-bin/empty', [RecycleBinController::class, 'empty']);
-    Route::get('/settings/recycle-bin/{id}/destroy', [RecycleBinController::class, 'showDestroy']);
-    Route::delete('/settings/recycle-bin/{id}', [RecycleBinController::class, 'destroy']);
-    Route::get('/settings/recycle-bin/{id}/restore', [RecycleBinController::class, 'showRestore']);
-    Route::post('/settings/recycle-bin/{id}/restore', [RecycleBinController::class, 'restore']);
+    Route::get('/settings/recycle-bin', [EntityControllers\RecycleBinController::class, 'index']);
+    Route::post('/settings/recycle-bin/empty', [EntityControllers\RecycleBinController::class, 'empty']);
+    Route::get('/settings/recycle-bin/{id}/destroy', [EntityControllers\RecycleBinController::class, 'showDestroy']);
+    Route::delete('/settings/recycle-bin/{id}', [EntityControllers\RecycleBinController::class, 'destroy']);
+    Route::get('/settings/recycle-bin/{id}/restore', [EntityControllers\RecycleBinController::class, 'showRestore']);
+    Route::post('/settings/recycle-bin/{id}/restore', [EntityControllers\RecycleBinController::class, 'restore']);
 
     // Audit Log
-    Route::get('/settings/audit', [AuditLogController::class, 'index']);
+    Route::get('/settings/audit', [ActivityControllers\AuditLogController::class, 'index']);
 
     // Users
-    Route::get('/settings/users', [UserController::class, 'index']);
-    Route::get('/settings/users/create', [UserController::class, 'create']);
-    Route::get('/settings/users/{id}/delete', [UserController::class, 'delete']);
-    Route::post('/settings/users/create', [UserController::class, 'store']);
-    Route::get('/settings/users/{id}', [UserController::class, 'edit']);
-    Route::put('/settings/users/{id}', [UserController::class, 'update']);
-    Route::delete('/settings/users/{id}', [UserController::class, 'destroy']);
+    Route::get('/settings/users', [UserControllers\UserController::class, 'index']);
+    Route::get('/settings/users/create', [UserControllers\UserController::class, 'create']);
+    Route::get('/settings/users/{id}/delete', [UserControllers\UserController::class, 'delete']);
+    Route::post('/settings/users/create', [UserControllers\UserController::class, 'store']);
+    Route::get('/settings/users/{id}', [UserControllers\UserController::class, 'edit']);
+    Route::put('/settings/users/{id}', [UserControllers\UserController::class, 'update']);
+    Route::delete('/settings/users/{id}', [UserControllers\UserController::class, 'destroy']);
 
     // User Preferences
     Route::redirect('/preferences', '/');
-    Route::get('/preferences/shortcuts', [UserPreferencesController::class, 'showShortcuts']);
-    Route::put('/preferences/shortcuts', [UserPreferencesController::class, 'updateShortcuts']);
-    Route::patch('/preferences/change-view/{type}', [UserPreferencesController::class, 'changeView']);
-    Route::patch('/preferences/change-sort/{type}', [UserPreferencesController::class, 'changeSort']);
-    Route::patch('/preferences/change-expansion/{type}', [UserPreferencesController::class, 'changeExpansion']);
-    Route::patch('/preferences/toggle-dark-mode', [UserPreferencesController::class, 'toggleDarkMode']);
-    Route::patch('/preferences/update-code-language-favourite', [UserPreferencesController::class, 'updateCodeLanguageFavourite']);
-    Route::patch('/preferences/update-boolean', [UserPreferencesController::class, 'updateBooleanPreference']);
+    Route::get('/preferences/shortcuts', [UserControllers\UserPreferencesController::class, 'showShortcuts']);
+    Route::put('/preferences/shortcuts', [UserControllers\UserPreferencesController::class, 'updateShortcuts']);
+    Route::patch('/preferences/change-view/{type}', [UserControllers\UserPreferencesController::class, 'changeView']);
+    Route::patch('/preferences/change-sort/{type}', [UserControllers\UserPreferencesController::class, 'changeSort']);
+    Route::patch('/preferences/change-expansion/{type}', [UserControllers\UserPreferencesController::class, 'changeExpansion']);
+    Route::patch('/preferences/toggle-dark-mode', [UserControllers\UserPreferencesController::class, 'toggleDarkMode']);
+    Route::patch('/preferences/update-code-language-favourite', [UserControllers\UserPreferencesController::class, 'updateCodeLanguageFavourite']);
+    Route::patch('/preferences/update-boolean', [UserControllers\UserPreferencesController::class, 'updateBooleanPreference']);
 
     // User API Tokens
     Route::get('/settings/users/{userId}/create-api-token', [UserApiTokenController::class, 'create']);
@@ -265,89 +245,89 @@ Route::middleware('auth')->group(function () {
     Route::delete('/settings/users/{userId}/api-tokens/{tokenId}', [UserApiTokenController::class, 'destroy']);
 
     // Roles
-    Route::get('/settings/roles', [RoleController::class, 'index']);
-    Route::get('/settings/roles/new', [RoleController::class, 'create']);
-    Route::post('/settings/roles/new', [RoleController::class, 'store']);
-    Route::get('/settings/roles/delete/{id}', [RoleController::class, 'showDelete']);
-    Route::delete('/settings/roles/delete/{id}', [RoleController::class, 'delete']);
-    Route::get('/settings/roles/{id}', [RoleController::class, 'edit']);
-    Route::put('/settings/roles/{id}', [RoleController::class, 'update']);
+    Route::get('/settings/roles', [UserControllers\RoleController::class, 'index']);
+    Route::get('/settings/roles/new', [UserControllers\RoleController::class, 'create']);
+    Route::post('/settings/roles/new', [UserControllers\RoleController::class, 'store']);
+    Route::get('/settings/roles/delete/{id}', [UserControllers\RoleController::class, 'showDelete']);
+    Route::delete('/settings/roles/delete/{id}', [UserControllers\RoleController::class, 'delete']);
+    Route::get('/settings/roles/{id}', [UserControllers\RoleController::class, 'edit']);
+    Route::put('/settings/roles/{id}', [UserControllers\RoleController::class, 'update']);
 
     // Webhooks
-    Route::get('/settings/webhooks', [WebhookController::class, 'index']);
-    Route::get('/settings/webhooks/create', [WebhookController::class, 'create']);
-    Route::post('/settings/webhooks/create', [WebhookController::class, 'store']);
-    Route::get('/settings/webhooks/{id}', [WebhookController::class, 'edit']);
-    Route::put('/settings/webhooks/{id}', [WebhookController::class, 'update']);
-    Route::get('/settings/webhooks/{id}/delete', [WebhookController::class, 'delete']);
-    Route::delete('/settings/webhooks/{id}', [WebhookController::class, 'destroy']);
+    Route::get('/settings/webhooks', [ActivityControllers\WebhookController::class, 'index']);
+    Route::get('/settings/webhooks/create', [ActivityControllers\WebhookController::class, 'create']);
+    Route::post('/settings/webhooks/create', [ActivityControllers\WebhookController::class, 'store']);
+    Route::get('/settings/webhooks/{id}', [ActivityControllers\WebhookController::class, 'edit']);
+    Route::put('/settings/webhooks/{id}', [ActivityControllers\WebhookController::class, 'update']);
+    Route::get('/settings/webhooks/{id}/delete', [ActivityControllers\WebhookController::class, 'delete']);
+    Route::delete('/settings/webhooks/{id}', [ActivityControllers\WebhookController::class, 'destroy']);
 
     // Settings
-    Route::get('/settings', [SettingController::class, 'index'])->name('settings');
-    Route::get('/settings/{category}', [SettingController::class, 'category'])->name('settings.category');
-    Route::post('/settings/{category}', [SettingController::class, 'update']);
+    Route::get('/settings', [SettingControllers\SettingController::class, 'index'])->name('settings');
+    Route::get('/settings/{category}', [SettingControllers\SettingController::class, 'category'])->name('settings.category');
+    Route::post('/settings/{category}', [SettingControllers\SettingController::class, 'update']);
 });
 
 // MFA routes
 Route::middleware('mfa-setup')->group(function () {
-    Route::get('/mfa/setup', [\BookStack\Access\Controllers\MfaController::class, 'setup']);
-    Route::get('/mfa/totp/generate', [\BookStack\Access\Controllers\MfaTotpController::class, 'generate']);
-    Route::post('/mfa/totp/confirm', [\BookStack\Access\Controllers\MfaTotpController::class, 'confirm']);
-    Route::get('/mfa/backup_codes/generate', [\BookStack\Access\Controllers\MfaBackupCodesController::class, 'generate']);
-    Route::post('/mfa/backup_codes/confirm', [\BookStack\Access\Controllers\MfaBackupCodesController::class, 'confirm']);
+    Route::get('/mfa/setup', [AccessControllers\MfaController::class, 'setup']);
+    Route::get('/mfa/totp/generate', [AccessControllers\MfaTotpController::class, 'generate']);
+    Route::post('/mfa/totp/confirm', [AccessControllers\MfaTotpController::class, 'confirm']);
+    Route::get('/mfa/backup_codes/generate', [AccessControllers\MfaBackupCodesController::class, 'generate']);
+    Route::post('/mfa/backup_codes/confirm', [AccessControllers\MfaBackupCodesController::class, 'confirm']);
 });
 Route::middleware('guest')->group(function () {
-    Route::get('/mfa/verify', [\BookStack\Access\Controllers\MfaController::class, 'verify']);
-    Route::post('/mfa/totp/verify', [\BookStack\Access\Controllers\MfaTotpController::class, 'verify']);
-    Route::post('/mfa/backup_codes/verify', [\BookStack\Access\Controllers\MfaBackupCodesController::class, 'verify']);
+    Route::get('/mfa/verify', [AccessControllers\MfaController::class, 'verify']);
+    Route::post('/mfa/totp/verify', [AccessControllers\MfaTotpController::class, 'verify']);
+    Route::post('/mfa/backup_codes/verify', [AccessControllers\MfaBackupCodesController::class, 'verify']);
 });
-Route::delete('/mfa/{method}/remove', [\BookStack\Access\Controllers\MfaController::class, 'remove'])->middleware('auth');
+Route::delete('/mfa/{method}/remove', [AccessControllers\MfaController::class, 'remove'])->middleware('auth');
 
 // Social auth routes
-Route::get('/login/service/{socialDriver}', [\BookStack\Access\Controllers\SocialController::class, 'login']);
-Route::get('/login/service/{socialDriver}/callback', [\BookStack\Access\Controllers\SocialController::class, 'callback']);
-Route::post('/login/service/{socialDriver}/detach', [\BookStack\Access\Controllers\SocialController::class, 'detach'])->middleware('auth');
-Route::get('/register/service/{socialDriver}', [\BookStack\Access\Controllers\SocialController::class, 'register']);
+Route::get('/login/service/{socialDriver}', [AccessControllers\SocialController::class, 'login']);
+Route::get('/login/service/{socialDriver}/callback', [AccessControllers\SocialController::class, 'callback']);
+Route::post('/login/service/{socialDriver}/detach', [AccessControllers\SocialController::class, 'detach'])->middleware('auth');
+Route::get('/register/service/{socialDriver}', [AccessControllers\SocialController::class, 'register']);
 
 // Login/Logout routes
-Route::get('/login', [\BookStack\Access\Controllers\LoginController::class, 'getLogin']);
-Route::post('/login', [\BookStack\Access\Controllers\LoginController::class, 'login']);
-Route::post('/logout', [\BookStack\Access\Controllers\LoginController::class, 'logout']);
-Route::get('/register', [\BookStack\Access\Controllers\RegisterController::class, 'getRegister']);
-Route::get('/register/confirm', [\BookStack\Access\Controllers\ConfirmEmailController::class, 'show']);
-Route::get('/register/confirm/awaiting', [\BookStack\Access\Controllers\ConfirmEmailController::class, 'showAwaiting']);
-Route::post('/register/confirm/resend', [\BookStack\Access\Controllers\ConfirmEmailController::class, 'resend']);
-Route::get('/register/confirm/{token}', [\BookStack\Access\Controllers\ConfirmEmailController::class, 'showAcceptForm']);
-Route::post('/register/confirm/accept', [\BookStack\Access\Controllers\ConfirmEmailController::class, 'confirm']);
-Route::post('/register', [\BookStack\Access\Controllers\RegisterController::class, 'postRegister']);
+Route::get('/login', [AccessControllers\LoginController::class, 'getLogin']);
+Route::post('/login', [AccessControllers\LoginController::class, 'login']);
+Route::post('/logout', [AccessControllers\LoginController::class, 'logout']);
+Route::get('/register', [AccessControllers\RegisterController::class, 'getRegister']);
+Route::get('/register/confirm', [AccessControllers\ConfirmEmailController::class, 'show']);
+Route::get('/register/confirm/awaiting', [AccessControllers\ConfirmEmailController::class, 'showAwaiting']);
+Route::post('/register/confirm/resend', [AccessControllers\ConfirmEmailController::class, 'resend']);
+Route::get('/register/confirm/{token}', [AccessControllers\ConfirmEmailController::class, 'showAcceptForm']);
+Route::post('/register/confirm/accept', [AccessControllers\ConfirmEmailController::class, 'confirm']);
+Route::post('/register', [AccessControllers\RegisterController::class, 'postRegister']);
 
 // SAML routes
-Route::post('/saml2/login', [\BookStack\Access\Controllers\Saml2Controller::class, 'login']);
-Route::post('/saml2/logout', [\BookStack\Access\Controllers\Saml2Controller::class, 'logout']);
-Route::get('/saml2/metadata', [\BookStack\Access\Controllers\Saml2Controller::class, 'metadata']);
-Route::get('/saml2/sls', [\BookStack\Access\Controllers\Saml2Controller::class, 'sls']);
-Route::post('/saml2/acs', [\BookStack\Access\Controllers\Saml2Controller::class, 'startAcs'])->withoutMiddleware([
+Route::post('/saml2/login', [AccessControllers\Saml2Controller::class, 'login']);
+Route::post('/saml2/logout', [AccessControllers\Saml2Controller::class, 'logout']);
+Route::get('/saml2/metadata', [AccessControllers\Saml2Controller::class, 'metadata']);
+Route::get('/saml2/sls', [AccessControllers\Saml2Controller::class, 'sls']);
+Route::post('/saml2/acs', [AccessControllers\Saml2Controller::class, 'startAcs'])->withoutMiddleware([
     StartSession::class,
     ShareErrorsFromSession::class,
     VerifyCsrfToken::class,
 ]);
-Route::get('/saml2/acs', [\BookStack\Access\Controllers\Saml2Controller::class, 'processAcs']);
+Route::get('/saml2/acs', [AccessControllers\Saml2Controller::class, 'processAcs']);
 
 // OIDC routes
-Route::post('/oidc/login', [\BookStack\Access\Controllers\OidcController::class, 'login']);
-Route::get('/oidc/callback', [\BookStack\Access\Controllers\OidcController::class, 'callback']);
+Route::post('/oidc/login', [AccessControllers\OidcController::class, 'login']);
+Route::get('/oidc/callback', [AccessControllers\OidcController::class, 'callback']);
 
 // User invitation routes
-Route::get('/register/invite/{token}', [\BookStack\Access\Controllers\UserInviteController::class, 'showSetPassword']);
-Route::post('/register/invite/{token}', [\BookStack\Access\Controllers\UserInviteController::class, 'setPassword']);
+Route::get('/register/invite/{token}', [AccessControllers\UserInviteController::class, 'showSetPassword']);
+Route::post('/register/invite/{token}', [AccessControllers\UserInviteController::class, 'setPassword']);
 
 // Password reset link request routes
-Route::get('/password/email', [\BookStack\Access\Controllers\ForgotPasswordController::class, 'showLinkRequestForm']);
-Route::post('/password/email', [\BookStack\Access\Controllers\ForgotPasswordController::class, 'sendResetLinkEmail']);
+Route::get('/password/email', [AccessControllers\ForgotPasswordController::class, 'showLinkRequestForm']);
+Route::post('/password/email', [AccessControllers\ForgotPasswordController::class, 'sendResetLinkEmail']);
 
 // Password reset routes
-Route::get('/password/reset/{token}', [\BookStack\Access\Controllers\ResetPasswordController::class, 'showResetForm']);
-Route::post('/password/reset', [\BookStack\Access\Controllers\ResetPasswordController::class, 'reset']);
+Route::get('/password/reset/{token}', [AccessControllers\ResetPasswordController::class, 'showResetForm']);
+Route::post('/password/reset', [AccessControllers\ResetPasswordController::class, 'reset']);
 
 // Metadata routes
 Route::view('/help/wysiwyg', 'help.wysiwyg');