diff --git a/src/core/protocol/errors/ErrorResponse.ts b/src/core/protocol/errors/ErrorResponse.ts
index d5526250..93ae6e45 100644
--- a/src/core/protocol/errors/ErrorResponse.ts
+++ b/src/core/protocol/errors/ErrorResponse.ts
@@ -140,6 +140,37 @@ export class SCNotFoundErrorResponse extends SCError {
}
}
+/**
+ * An error that is returned whenever there is an unexpected error while creating a plugin
+ */
+export class SCPluginRegisteringFailedErrorResponse extends SCError {
+ /**
+ * Create a PluginRegisteringFailedError
+ * @param message Describes what went wrong wile registering the plugin
+ * @param stack Set to true if a stack trace should be created
+ */
+ constructor(message: string, stack?: boolean) {
+ super('PluginRegisteringFailedError', message, 500, stack);
+ }
+}
+
+/**
+ * An error that is returned whenever there is a plugin request that is supposed to register a route, that is already
+ * registered
+ */
+export class SCPluginRouteAlreadyRegisteredErrorResponse extends SCError {
+ /**
+ * Create a PluginRouteAlreadyRegisteredError
+ * @param registeredName The name by the plugin that has already registered the route previously
+ * @param registeredUrl The URL by the plugin that has already registered the route previously
+ * @param stack Set to true if a stack trace should be created
+ */
+ constructor(registeredName: string, registeredUrl: string, stack?: boolean) {
+ super('PluginRouteAlreadyRegisteredError',
+ `Already registered by "${registeredName}" under URL "${registeredUrl}".`, 409, stack);
+ }
+}
+
/**
* An error that is returned whenever there is a syntax error
*/
diff --git a/src/core/protocol/routes/plugin/PluginRegisterRequest.ts b/src/core/protocol/routes/plugin/PluginRegisterRequest.ts
new file mode 100644
index 00000000..dc9b5ec7
--- /dev/null
+++ b/src/core/protocol/routes/plugin/PluginRegisterRequest.ts
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2019 StApps
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see .
+ */
+import {Schema} from 'jsonschema';
+import {SCAbstractRoute, SCRouteHttpVerbs} from '../../../Route';
+import {
+ SCInternalServerErrorResponse,
+ SCMethodNotAllowedErrorResponse, SCPluginRegisteringFailedErrorResponse, SCPluginRouteAlreadyRegisteredErrorResponse,
+ SCRequestBodyTooLargeErrorResponse,
+ SCSyntaxErrorResponse,
+} from '../../errors/ErrorResponse';
+
+/**
+ * Plugin register request
+ *
+ * @validatable
+ */
+export type SCPluginRegisterRequest = AddPlugin | RemovePlugin;
+interface AddPlugin {
+ /**
+ * The desired action, so whether the plugin should be added or removed.
+ */
+ action: 'add';
+
+ /**
+ * The address of the plugin.
+ */
+ address: string;
+
+ /**
+ * The name of the plugin.
+ * Just for debugging purposes, to more easily identify conflicts.
+ */
+ name: string;
+
+ /**
+ * How the requests of the plugin looks like, a JSON schema for validation
+ */
+ pluginRequestSchema: Schema;
+
+ /**
+ * How the responses of the plugin looks like, a JSON schema for validation
+ */
+ pluginResponseSchema: Schema;
+
+ /**
+ * the desired route, for example /feedback.
+ */
+ route: string;
+}
+interface RemovePlugin {
+ /**
+ * The desired action, so whether the plugin should be added or removed.
+ */
+ action: 'remove';
+
+ /**
+ * The route of the plugin you want to remove
+ */
+ route: string;
+}
+
+/**
+ * Route to register Plugins
+ */
+export class SCPluginRegisterRoute extends SCAbstractRoute {
+ constructor() {
+ super();
+ this.errorNames = [
+ SCInternalServerErrorResponse,
+ SCMethodNotAllowedErrorResponse,
+ SCPluginRegisteringFailedErrorResponse,
+ SCPluginRouteAlreadyRegisteredErrorResponse,
+ SCRequestBodyTooLargeErrorResponse,
+ SCSyntaxErrorResponse,
+ ];
+ this.method = SCRouteHttpVerbs.POST;
+ this.requestBodyName = 'SCPluginRegisterRequest';
+ this.responseBodyName = 'SCPluginRegisterResponse';
+ this.statusCodeSuccess = 200;
+ this.urlFragment = '/plugin/register';
+ }
+}
diff --git a/src/core/protocol/routes/plugin/PluginRegisterResponse.ts b/src/core/protocol/routes/plugin/PluginRegisterResponse.ts
new file mode 100644
index 00000000..8bbad81a
--- /dev/null
+++ b/src/core/protocol/routes/plugin/PluginRegisterResponse.ts
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2019 StApps
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see .
+ */
+
+/**
+ * Plugin register response
+ *
+ * @validatable
+ */
+export interface SCPluginRegisterResponse {
+ /**
+ * Whether the desired action succeeded or failed (true for success, false if an error occurred).
+ */
+ success: boolean;
+}