diff --git a/api/blueprints/SubTaskAPI.py b/api/blueprints/SubTaskAPI.py
index d6e3d1025d26aaec1c57d09bb5c7b6eff4ffa3fa..67cbfca7582f048b20595f8726c27e96c7db0a88 100644
--- a/api/blueprints/SubTaskAPI.py
+++ b/api/blueprints/SubTaskAPI.py
@@ -56,7 +56,7 @@ def construct_blueprint(database):
         if not __subtask_exists(subTaskID):
             return jsonify({"success": False, "msg": "No sub task with id '{}' existing".format(subTaskID)}), 400
 
-        database.delete_roadmap(subTaskID)
+        database.delete_sub_task(subTaskID)
         return jsonify({"success": True})
 
     @subtask_api.route('/subtask', methods=['PUT'])
diff --git a/api/blueprints/TaskAPI.py b/api/blueprints/TaskAPI.py
index f1cbdfe5df5e3fe11f91c5ca87b9286dff632a2d..289c2a0a8002b68aadd5eb991bd5d965c54d138c 100644
--- a/api/blueprints/TaskAPI.py
+++ b/api/blueprints/TaskAPI.py
@@ -56,7 +56,7 @@ def construct_blueprint(database):
         if not __task_exists(taskID):
             return jsonify({"success": False, "msg": "No task with id '{}' existing".format(taskID)}), 400
 
-        database.delete_roadmap(taskID)
+        database.delete_task(taskID)
         return jsonify({"success": True})
 
     @task_api.route('/task', methods=['PUT'])
diff --git a/api/docs/api.html b/api/docs/api.html
index 5fe23d6c96176bcc49316df4fe9572628986e1d7..76ee8997781ad245070d33c0e3583d17a1bd2df3 100644
--- a/api/docs/api.html
+++ b/api/docs/api.html
@@ -35,7 +35,7 @@
 <script>
 window.onload = function() {
 
-  var spec = {"openapi": "3.0.0", "servers": [{"description": "Roadmaps API Server", "url": "https://roadmaps.thecodelabs.de:10000/"}], "info": {"description": "The Official Roadmaps API", "version": "2.3.0", "title": "Roadmaps API"}, "tags": [{"name": "admins", "description": "Secured Admin-only calls"}, {"name": "public", "description": "Operations available to the public"}], "paths": {"/version": {"get": {"tags": ["public"], "summary": "Gets information about the server version", "operationId": "version", "responses": {"200": {"description": "The server version information", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Version"}}}}}}}, "/login": {"post": {"tags": ["public"], "summary": "Gets a bearer JSON Web Token", "operationId": "login", "requestBody": {"description": "Credentials", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Credentials"}}}}, "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TokenResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/roadmaps": {"get": {"tags": ["public"], "summary": "Gets all roadmaps", "operationId": "roadmaps", "responses": {"200": {"description": "All available roadmaps", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Roadmap"}}}}}}}}, "/roadmap/{roadmapID}": {"get": {"tags": ["public"], "summary": "Gets  a specific roadmap", "operationId": "roadmap", "parameters": [{"in": "path", "name": "roadmapID", "description": "The roadmap ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "The roadmap", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Roadmap"}}}}}}, "delete": {"tags": ["admins"], "description": "Deletes a roadmap based on the given ID", "operationId": "deleteRoadmap", "parameters": [{"in": "path", "name": "roadmapID", "description": "The roadmap ID", "required": true, "schema": {"type": "integer"}}], "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/roadmap": {"post": {"tags": ["admins"], "summary": "Adds a new roadmap", "operationId": "addRoadmap", "requestBody": {"description": "Roadmap to add", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NewRoadmap"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}, "put": {"tags": ["admins"], "summary": "Updates a roadmap", "operationId": "updateRoadmap", "requestBody": {"description": "Roadmap to update", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Roadmap"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/roadmap/{roadmapID}/full": {"get": {"tags": ["public"], "summary": "Gets  a specific roadmap with all milestones, tasks and sub tasks", "operationId": "roadmapFull", "parameters": [{"in": "path", "name": "roadmapID", "description": "The roadmap ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "The roadmap", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RoadmapFull"}}}}}}}, "/milestones/{roadmapID}": {"get": {"tags": ["public"], "summary": "Gets all milestones for a roadmap", "operationId": "milestones", "parameters": [{"in": "path", "name": "roadmapID", "description": "The roadmap ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "All milestones for the given roadmap ID", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Milestone"}}}}}}}}, "/milestones/{roadmapID}/open": {"get": {"tags": ["public"], "summary": "Gets all open milestones for a roadmap", "operationId": "openMilestones", "parameters": [{"in": "path", "name": "roadmapID", "description": "The roadmap ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "All open milestones for the given roadmap ID", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Milestone"}}}}}}}}, "/milestones/{roadmapID}/latest": {"get": {"tags": ["public"], "summary": "Gets the lastest finished milestone for a roadmap", "operationId": "latestMilestone", "parameters": [{"in": "path", "name": "roadmapID", "description": "The roadmap ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "The latest finished milestone for the given roadmap ID", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Milestone"}}}}}}}, "/milestone/{milestoneID}": {"get": {"tags": ["public"], "summary": "Gets  a specific milestone", "operationId": "milestone", "parameters": [{"in": "path", "name": "milestoneID", "description": "The milestone ID", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "The milestone", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Milestone"}}}}}}, "delete": {"tags": ["admins"], "description": "Deletes a milestone based on the given ID", "operationId": "deleteMilestone", "parameters": [{"in": "path", "name": "milestoneID", "description": "The milestone ID", "required": true, "schema": {"type": "integer"}}], "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/milestone": {"post": {"tags": ["admins"], "summary": "Adds a new milestone", "operationId": "addMilestone", "requestBody": {"description": "Milestone to add", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NewMilestone"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}, "put": {"tags": ["admins"], "summary": "Updates a milestone", "operationId": "updateMilestone", "requestBody": {"description": "Milestone to update", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Milestone"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/tasks/{milestoneID}": {"get": {"tags": ["public"], "summary": "Gets all tasks for a milestone", "operationId": "tasks", "parameters": [{"in": "path", "name": "milestoneID", "description": "The milestone ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "All tasks for the given milestone ID", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Task"}}}}}}}}, "/tasks/{milestoneID}/open": {"get": {"tags": ["public"], "summary": "Gets all open tasks for a milestone", "operationId": "openTasks", "parameters": [{"in": "path", "name": "milestoneID", "description": "The milestone ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "All open tasks for the given milestone ID", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Task"}}}}}}}}, "/task/{taskID}": {"get": {"tags": ["public"], "summary": "Gets  a specific task", "operationId": "task", "parameters": [{"in": "path", "name": "taskID", "description": "The task ID", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "The task", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Task"}}}}}}, "delete": {"tags": ["admins"], "description": "Deletes a task based on the given ID", "operationId": "deleteTask", "parameters": [{"in": "path", "name": "taskID", "description": "The task ID", "required": true, "schema": {"type": "integer"}}], "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/task": {"post": {"tags": ["admins"], "summary": "Adds a new task", "operationId": "addTask", "requestBody": {"description": "Task to add", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NewTask"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}, "put": {"tags": ["admins"], "summary": "Updates a task", "operationId": "updateTask", "requestBody": {"description": "Task to update", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Task"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/subtasks/{taskID}": {"get": {"tags": ["public"], "summary": "Gets all sub taks for a task", "operationId": "substasks", "parameters": [{"in": "path", "name": "taskID", "description": "The task ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "All sub tasks for the given task ID", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/SubTask"}}}}}}}}, "/subtasks/{taskID}/open": {"get": {"tags": ["public"], "summary": "Gets all open sub taks for a task", "operationId": "openSubtasks", "parameters": [{"in": "path", "name": "taskID", "description": "The task ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "All open sub tasks for the given task ID", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/SubTask"}}}}}}}}, "/subtask/{subtaskID}": {"get": {"tags": ["public"], "summary": "Gets  a specific sub task", "operationId": "subtask", "parameters": [{"in": "path", "name": "subtaskID", "description": "The sub task ID", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "The sub task", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubTask"}}}}}}, "delete": {"tags": ["admins"], "description": "Deletes a sub task based on the given ID", "operationId": "deleteSubTask", "parameters": [{"in": "path", "name": "subtaskID", "description": "The sub task ID", "required": true, "schema": {"type": "integer"}}], "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/subtask": {"post": {"tags": ["admins"], "summary": "Adds a new sub task", "operationId": "addSubTask", "requestBody": {"description": "Sub task to add", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NewSubTask"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}, "put": {"tags": ["admins"], "summary": "Updates a sub task", "operationId": "updateSubTask", "requestBody": {"description": "Sub task to update", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubTask"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}}, "components": {"securitySchemes": {"BearerAuth": {"type": "http", "scheme": "bearer", "bearerFormat": "JWT"}}, "schemas": {"Version": {"type": "object", "required": ["code", "name", "date"], "properties": {"code": {"type": "integer", "example": 1}, "name": {"type": "string", "example": "v1.0.0"}, "date": {"type": "string", "format": "date", "example": "30.05.19"}}}, "Credentials": {"type": "object", "required": ["username", "password"], "properties": {"username": {"type": "string", "example": "admin"}, "password": {"type": "string", "example": "123"}}}, "Roadmap": {"type": "object", "required": ["ID", "Projectname"], "properties": {"ID": {"type": "integer", "example": 1}, "Projectname": {"type": "string", "example": "Example Roadmap"}}}, "RoadmapFull": {"allOf": [{"$ref": "#/components/schemas/Roadmap"}, {"type": "object", "properties": {"milestones": {"type": "array", "items": {"allOf": [{"$ref": "#/components/schemas/Milestone"}, {"type": "object", "properties": {"tasks": {"type": "array", "items": {"allOf": [{"$ref": "#/components/schemas/Task"}, {"type": "object", "properties": {"subtasks": {"type": "array", "items": {"$ref": "#/components/schemas/SubTask"}}}}]}}}}]}}}}]}, "NewRoadmap": {"type": "object", "required": ["Projectname"], "properties": {"Projectname": {"type": "string", "example": "Example Roadmap"}}}, "Milestone": {"type": "object", "required": ["ID", "RoadmapID", "VersionCode", "VersionName", "Title", "DueDate", "CompletionDate", "Status"], "properties": {"ID": {"type": "integer", "example": 1}, "RoadmapID": {"type": "integer", "example": 2}, "VersionCode": {"type": "integer", "example": 3}, "VersionName": {"type": "string", "example": "v1.0.0"}, "Title": {"type": "string", "example": "My awesome milestone"}, "DueDate": {"type": "string", "format": "date", "example": "2019-05-30"}, "CompletionDate": {"type": "string", "format": "date", "example": "2019-05-30"}, "Status": {"type": "integer", "enum": [0, 1]}}}, "NewMilestone": {"type": "object", "required": ["RoadmapID", "VersionCode", "VersionName", "Title", "DueDate", "CompletionDate", "Status"], "properties": {"RoadmapID": {"type": "integer", "example": 2}, "VersionCode": {"type": "integer", "example": 3}, "VersionName": {"type": "string", "example": "v1.0.0"}, "Title": {"type": "string", "example": "My awesome milestone"}, "DueDate": {"type": "string", "format": "date", "example": "2019-05-30"}, "CompletionDate": {"type": "string", "format": "date", "example": "2019-05-30"}, "Status": {"type": "integer", "enum": [0, 1]}}}, "Task": {"type": "object", "required": ["ID", "MilestoneID", "Title", "Description", "Status"], "properties": {"ID": {"type": "integer", "example": 1}, "MilestoneID": {"type": "integer", "example": 2}, "Title": {"type": "string", "example": "My awesome task"}, "Description": {"type": "string", "example": "Lorem Ipsum dolor sit amet"}, "Status": {"type": "integer", "enum": [0, 1]}}}, "NewTask": {"type": "object", "required": ["MilestoneID", "Title", "Description", "Status"], "properties": {"MilestoneID": {"type": "integer", "example": 2}, "Title": {"type": "string", "example": "My awesome task"}, "Description": {"type": "string", "example": "Lorem Ipsum dolor sit amet"}, "Status": {"type": "integer", "enum": [0, 1]}}}, "SubTask": {"type": "object", "required": ["ID", "TaskID", "Title", "Description", "Status"], "properties": {"ID": {"type": "integer", "example": 1}, "TaskID": {"type": "integer", "example": 2}, "Title": {"type": "string", "example": "My awesome sub task"}, "Description": {"type": "string", "example": "Lorem Ipsum dolor sit amet"}, "Status": {"type": "integer", "enum": [0, 1]}}}, "NewSubTask": {"type": "object", "required": ["TaskID", "Title", "Description", "Status"], "properties": {"TaskID": {"type": "integer", "example": 2}, "Title": {"type": "string", "example": "My awesome sub task"}, "Description": {"type": "string", "example": "Lorem Ipsum dolor sit amet"}, "Status": {"type": "integer", "enum": [0, 1]}}}, "UnauthorizedResponse": {"description": "Access token is missing or invalid", "properties": {"msg": {"type": "string", "example": "Missing Authorization Header"}}}, "TokenResponse": {"description": "JSON web token", "properties": {"access_token": {"type": "string"}}}, "SuccessResponse": {"required": ["success"], "properties": {"success": {"type": "boolean"}}}, "ErrorResponse": {"required": ["success", "msg"], "properties": {"success": {"type": "boolean"}, "msg": {"type": "string"}}}}}};
+  var spec = {"openapi": "3.0.0", "servers": [{"description": "Roadmaps API Server", "url": "https://roadmaps.thecodelabs.de:10000/"}], "info": {"description": "The Official Roadmaps API", "version": "2.3.1", "title": "Roadmaps API"}, "tags": [{"name": "admins", "description": "Secured Admin-only calls"}, {"name": "public", "description": "Operations available to the public"}], "paths": {"/version": {"get": {"tags": ["public"], "summary": "Gets information about the server version", "operationId": "version", "responses": {"200": {"description": "The server version information", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Version"}}}}}}}, "/login": {"post": {"tags": ["public"], "summary": "Gets a bearer JSON Web Token", "operationId": "login", "requestBody": {"description": "Credentials", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Credentials"}}}}, "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TokenResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/roadmaps": {"get": {"tags": ["public"], "summary": "Gets all roadmaps", "operationId": "roadmaps", "responses": {"200": {"description": "All available roadmaps", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Roadmap"}}}}}}}}, "/roadmap/{roadmapID}": {"get": {"tags": ["public"], "summary": "Gets  a specific roadmap", "operationId": "roadmap", "parameters": [{"in": "path", "name": "roadmapID", "description": "The roadmap ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "The roadmap", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Roadmap"}}}}}}, "delete": {"tags": ["admins"], "description": "Deletes a roadmap based on the given ID", "operationId": "deleteRoadmap", "parameters": [{"in": "path", "name": "roadmapID", "description": "The roadmap ID", "required": true, "schema": {"type": "integer"}}], "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/roadmap": {"post": {"tags": ["admins"], "summary": "Adds a new roadmap", "operationId": "addRoadmap", "requestBody": {"description": "Roadmap to add", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NewRoadmap"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}, "put": {"tags": ["admins"], "summary": "Updates a roadmap", "operationId": "updateRoadmap", "requestBody": {"description": "Roadmap to update", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Roadmap"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/roadmap/{roadmapID}/full": {"get": {"tags": ["public"], "summary": "Gets  a specific roadmap with all milestones, tasks and sub tasks", "operationId": "roadmapFull", "parameters": [{"in": "path", "name": "roadmapID", "description": "The roadmap ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "The roadmap", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RoadmapFull"}}}}}}}, "/milestones/{roadmapID}": {"get": {"tags": ["public"], "summary": "Gets all milestones for a roadmap", "operationId": "milestones", "parameters": [{"in": "path", "name": "roadmapID", "description": "The roadmap ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "All milestones for the given roadmap ID", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Milestone"}}}}}}}}, "/milestones/{roadmapID}/open": {"get": {"tags": ["public"], "summary": "Gets all open milestones for a roadmap", "operationId": "openMilestones", "parameters": [{"in": "path", "name": "roadmapID", "description": "The roadmap ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "All open milestones for the given roadmap ID", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Milestone"}}}}}}}}, "/milestones/{roadmapID}/latest": {"get": {"tags": ["public"], "summary": "Gets the lastest finished milestone for a roadmap", "operationId": "latestMilestone", "parameters": [{"in": "path", "name": "roadmapID", "description": "The roadmap ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "The latest finished milestone for the given roadmap ID", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Milestone"}}}}}}}, "/milestone/{milestoneID}": {"get": {"tags": ["public"], "summary": "Gets  a specific milestone", "operationId": "milestone", "parameters": [{"in": "path", "name": "milestoneID", "description": "The milestone ID", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "The milestone", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Milestone"}}}}}}, "delete": {"tags": ["admins"], "description": "Deletes a milestone based on the given ID", "operationId": "deleteMilestone", "parameters": [{"in": "path", "name": "milestoneID", "description": "The milestone ID", "required": true, "schema": {"type": "integer"}}], "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/milestone": {"post": {"tags": ["admins"], "summary": "Adds a new milestone", "operationId": "addMilestone", "requestBody": {"description": "Milestone to add", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NewMilestone"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}, "put": {"tags": ["admins"], "summary": "Updates a milestone", "operationId": "updateMilestone", "requestBody": {"description": "Milestone to update", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Milestone"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/tasks/{milestoneID}": {"get": {"tags": ["public"], "summary": "Gets all tasks for a milestone", "operationId": "tasks", "parameters": [{"in": "path", "name": "milestoneID", "description": "The milestone ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "All tasks for the given milestone ID", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Task"}}}}}}}}, "/tasks/{milestoneID}/open": {"get": {"tags": ["public"], "summary": "Gets all open tasks for a milestone", "operationId": "openTasks", "parameters": [{"in": "path", "name": "milestoneID", "description": "The milestone ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "All open tasks for the given milestone ID", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Task"}}}}}}}}, "/task/{taskID}": {"get": {"tags": ["public"], "summary": "Gets  a specific task", "operationId": "task", "parameters": [{"in": "path", "name": "taskID", "description": "The task ID", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "The task", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Task"}}}}}}, "delete": {"tags": ["admins"], "description": "Deletes a task based on the given ID", "operationId": "deleteTask", "parameters": [{"in": "path", "name": "taskID", "description": "The task ID", "required": true, "schema": {"type": "integer"}}], "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/task": {"post": {"tags": ["admins"], "summary": "Adds a new task", "operationId": "addTask", "requestBody": {"description": "Task to add", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NewTask"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}, "put": {"tags": ["admins"], "summary": "Updates a task", "operationId": "updateTask", "requestBody": {"description": "Task to update", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Task"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/subtasks/{taskID}": {"get": {"tags": ["public"], "summary": "Gets all sub taks for a task", "operationId": "substasks", "parameters": [{"in": "path", "name": "taskID", "description": "The task ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "All sub tasks for the given task ID", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/SubTask"}}}}}}}}, "/subtasks/{taskID}/open": {"get": {"tags": ["public"], "summary": "Gets all open sub taks for a task", "operationId": "openSubtasks", "parameters": [{"in": "path", "name": "taskID", "description": "The task ID", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "All open sub tasks for the given task ID", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/SubTask"}}}}}}}}, "/subtask/{subtaskID}": {"get": {"tags": ["public"], "summary": "Gets  a specific sub task", "operationId": "subtask", "parameters": [{"in": "path", "name": "subtaskID", "description": "The sub task ID", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "The sub task", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubTask"}}}}}}, "delete": {"tags": ["admins"], "description": "Deletes a sub task based on the given ID", "operationId": "deleteSubTask", "parameters": [{"in": "path", "name": "subtaskID", "description": "The sub task ID", "required": true, "schema": {"type": "integer"}}], "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/subtask": {"post": {"tags": ["admins"], "summary": "Adds a new sub task", "operationId": "addSubTask", "requestBody": {"description": "Sub task to add", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NewSubTask"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}, "put": {"tags": ["admins"], "summary": "Updates a sub task", "operationId": "updateSubTask", "requestBody": {"description": "Sub task to update", "required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubTask"}}}}, "security": [{"BearerAuth": []}], "responses": {"200": {"description": "success response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuccessResponse"}}}}, "401": {"description": "unauthorized response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnauthorizedResponse"}}}}, "default": {"description": "error response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}}, "components": {"securitySchemes": {"BearerAuth": {"type": "http", "scheme": "bearer", "bearerFormat": "JWT"}}, "schemas": {"Version": {"type": "object", "required": ["code", "name", "date"], "properties": {"code": {"type": "integer", "example": 1}, "name": {"type": "string", "example": "v1.0.0"}, "date": {"type": "string", "format": "date", "example": "30.05.19"}}}, "Credentials": {"type": "object", "required": ["username", "password"], "properties": {"username": {"type": "string", "example": "admin"}, "password": {"type": "string", "example": "123"}}}, "Roadmap": {"type": "object", "required": ["ID", "Projectname"], "properties": {"ID": {"type": "integer", "example": 1}, "Projectname": {"type": "string", "example": "Example Roadmap"}}}, "RoadmapFull": {"allOf": [{"$ref": "#/components/schemas/Roadmap"}, {"type": "object", "properties": {"milestones": {"type": "array", "items": {"allOf": [{"$ref": "#/components/schemas/Milestone"}, {"type": "object", "properties": {"tasks": {"type": "array", "items": {"allOf": [{"$ref": "#/components/schemas/Task"}, {"type": "object", "properties": {"subtasks": {"type": "array", "items": {"$ref": "#/components/schemas/SubTask"}}}}]}}}}]}}}}]}, "NewRoadmap": {"type": "object", "required": ["Projectname"], "properties": {"Projectname": {"type": "string", "example": "Example Roadmap"}}}, "Milestone": {"type": "object", "required": ["ID", "RoadmapID", "VersionCode", "VersionName", "Title", "DueDate", "CompletionDate", "Status"], "properties": {"ID": {"type": "integer", "example": 1}, "RoadmapID": {"type": "integer", "example": 2}, "VersionCode": {"type": "integer", "example": 3}, "VersionName": {"type": "string", "example": "v1.0.0"}, "Title": {"type": "string", "example": "My awesome milestone"}, "DueDate": {"type": "string", "format": "date", "example": "2019-05-30"}, "CompletionDate": {"type": "string", "format": "date", "example": "2019-05-30"}, "Status": {"type": "integer", "enum": [0, 1]}}}, "NewMilestone": {"type": "object", "required": ["RoadmapID", "VersionCode", "VersionName", "Title", "DueDate", "CompletionDate", "Status"], "properties": {"RoadmapID": {"type": "integer", "example": 2}, "VersionCode": {"type": "integer", "example": 3}, "VersionName": {"type": "string", "example": "v1.0.0"}, "Title": {"type": "string", "example": "My awesome milestone"}, "DueDate": {"type": "string", "format": "date", "example": "2019-05-30"}, "CompletionDate": {"type": "string", "format": "date", "example": "2019-05-30"}, "Status": {"type": "integer", "enum": [0, 1]}}}, "Task": {"type": "object", "required": ["ID", "MilestoneID", "Title", "Description", "Status"], "properties": {"ID": {"type": "integer", "example": 1}, "MilestoneID": {"type": "integer", "example": 2}, "Title": {"type": "string", "example": "My awesome task"}, "Description": {"type": "string", "example": "Lorem Ipsum dolor sit amet"}, "Status": {"type": "integer", "enum": [0, 1]}}}, "NewTask": {"type": "object", "required": ["MilestoneID", "Title", "Description", "Status"], "properties": {"MilestoneID": {"type": "integer", "example": 2}, "Title": {"type": "string", "example": "My awesome task"}, "Description": {"type": "string", "example": "Lorem Ipsum dolor sit amet"}, "Status": {"type": "integer", "enum": [0, 1]}}}, "SubTask": {"type": "object", "required": ["ID", "TaskID", "Title", "Description", "Status"], "properties": {"ID": {"type": "integer", "example": 1}, "TaskID": {"type": "integer", "example": 2}, "Title": {"type": "string", "example": "My awesome sub task"}, "Description": {"type": "string", "example": "Lorem Ipsum dolor sit amet"}, "Status": {"type": "integer", "enum": [0, 1]}}}, "NewSubTask": {"type": "object", "required": ["TaskID", "Title", "Description", "Status"], "properties": {"TaskID": {"type": "integer", "example": 2}, "Title": {"type": "string", "example": "My awesome sub task"}, "Description": {"type": "string", "example": "Lorem Ipsum dolor sit amet"}, "Status": {"type": "integer", "enum": [0, 1]}}}, "UnauthorizedResponse": {"description": "Access token is missing or invalid", "properties": {"msg": {"type": "string", "example": "Missing Authorization Header"}}}, "TokenResponse": {"description": "JSON web token", "properties": {"access_token": {"type": "string"}}}, "SuccessResponse": {"required": ["success"], "properties": {"success": {"type": "boolean"}}}, "ErrorResponse": {"required": ["success", "msg"], "properties": {"success": {"type": "boolean"}, "msg": {"type": "string"}}}}}};
 
   // Build a system
   const ui = SwaggerUIBundle({
diff --git a/api/docs/api.yml b/api/docs/api.yml
index b8b92466d3c7f975835710dbd40d1e9837bb9572..0f1f6cea831bbd650747d06673eb5b535d8d1fdd 100644
--- a/api/docs/api.yml
+++ b/api/docs/api.yml
@@ -4,7 +4,7 @@ servers:
     url: https://roadmaps.thecodelabs.de:10000/
 info:
   description: The Official Roadmaps API
-  version: "2.3.0"
+  version: "2.3.1"
   title: Roadmaps API
 tags:
   - name: admins
diff --git a/api/version.json b/api/version.json
index 7b222b3a591d39cf4b119723ea1575d0341b2c10..2cbfbaf299a8bb81ea5e2acb856ee16dc654ad31 100644
--- a/api/version.json
+++ b/api/version.json
@@ -1,7 +1,7 @@
 {
     "version": {
-        "name": "v2.3.0",
-        "code": 7,
+        "name": "v2.3.1",
+        "code": 8,
         "date": "29.07.19"
     }
 }
\ No newline at end of file