Index: TFP-WebServer/WebServer/src/UrlHandlers/AbsHandler.cs
===================================================================
--- TFP-WebServer/WebServer/src/UrlHandlers/AbsHandler.cs	(revision 460)
+++ TFP-WebServer/WebServer/src/UrlHandlers/AbsHandler.cs	(revision 463)
@@ -26,4 +26,5 @@
 			parent = _parent;
 			urlBasePath = _relativePath;
+			parent.OpenApiHelpers.LoadOpenApiSpec (this);
 		}
 	}
Index: TFP-WebServer/WebServer/src/UrlHandlers/ItemIconHandler.cs
===================================================================
--- TFP-WebServer/WebServer/src/UrlHandlers/ItemIconHandler.cs	(revision 460)
+++ TFP-WebServer/WebServer/src/UrlHandlers/ItemIconHandler.cs	(revision 463)
@@ -31,20 +31,30 @@
 			}
 
+			if (!_context.RequestPath.EndsWith (".png", StringComparison.OrdinalIgnoreCase)) {
+				_context.Response.StatusCode = (int) HttpStatusCode.BadRequest;
+				return;
+			}
+
 			string requestFileName = _context.RequestPath.Remove (0, urlBasePath.Length);
-			requestFileName = requestFileName.Remove (requestFileName.LastIndexOf ('.'));
-
-			if (icons.ContainsKey (requestFileName) && _context.RequestPath.EndsWith (".png", StringComparison.OrdinalIgnoreCase)) {
-				_context.Response.ContentType = MimeType.GetMimeType (".png");
-
-				byte[] itemIconData = icons [requestFileName];
-
-				_context.Response.ContentLength64 = itemIconData.Length;
-				_context.Response.OutputStream.Write (itemIconData, 0, itemIconData.Length);
-			} else {
-				_context.Response.StatusCode = (int) HttpStatusCode.NotFound;
+			int indexOfExtSep = requestFileName.LastIndexOf ('.');
+			if (indexOfExtSep < 0) {
+				_context.Response.StatusCode = (int) HttpStatusCode.BadRequest;
+				return;
+			}
+
+			requestFileName = requestFileName.Remove (indexOfExtSep);
+
+			if (!icons.TryGetValue (requestFileName, out byte[] icon)) {
+				_context.Response.StatusCode = (int)HttpStatusCode.NotFound;
 				if (logMissingFiles) {
 					Log.Out ($"[Web] IconHandler: FileNotFound: \"{_context.RequestPath}\" ");
 				}
-			}
+				return;
+			}
+
+			_context.Response.ContentType = MimeType.GetMimeType (".png");
+
+			_context.Response.ContentLength64 = icon.Length;
+			_context.Response.OutputStream.Write (icon, 0, icon.Length);
 		}
 
Index: TFP-WebServer/WebServer/src/UrlHandlers/ItemIconHandler.openapi.yaml
===================================================================
--- TFP-WebServer/WebServer/src/UrlHandlers/ItemIconHandler.openapi.yaml	(revision 463)
+++ TFP-WebServer/WebServer/src/UrlHandlers/ItemIconHandler.openapi.yaml	(revision 463)
@@ -0,0 +1,58 @@
+openapi: 3.1.0
+info:
+  title: ItemIconHandler
+  version: '1'
+
+components:
+  parameters:
+    IconNameParameter:
+      name: name
+      in: path
+      required: true
+      schema:
+        type: string
+      description: Name of icon
+
+    IconTintParameter:
+      name: tint
+      in: path
+      required: true
+      schema:
+        type: string
+        pattern: '^[0-9A-Z]{6}$'
+      description: Tint color of icon as 6 hex digits RGB value
+
+
+paths:
+  /BASEPATH/{name}__{tint}.png:
+    get:
+      tags:
+        - Resources
+      summary: ItemIcon get
+      description: Get a specific item icon with the given tint
+      operationId: ItemIconHandler.get.name
+      parameters:
+        - $ref: '#/components/parameters/IconNameParameter'
+        - $ref: '#/components/parameters/IconTintParameter'
+      responses:
+        200:
+          description: Item icon with tint
+          content:
+            image/png:
+              schema:
+                type: string
+                format: binary
+        400:
+          description: Invalid request
+          content:
+            text/plain:
+              schema:
+                type: string
+                const: ''
+        404:
+          description: ItemIcon or tint not found
+          content:
+            text/plain:
+              schema:
+                type: string
+                const: ''
Index: TFP-WebServer/WebServer/src/UrlHandlers/SessionHandler.openapi.yaml
===================================================================
--- TFP-WebServer/WebServer/src/UrlHandlers/SessionHandler.openapi.yaml	(revision 463)
+++ TFP-WebServer/WebServer/src/UrlHandlers/SessionHandler.openapi.yaml	(revision 463)
@@ -0,0 +1,117 @@
+openapi: 3.1.0
+info:
+  title: SessionHandler
+  version: '1'
+
+components:
+  requestBodies:
+    SessionLoginBodyIn:
+      content:
+        application/json:
+          schema:
+            type: object
+            properties:
+              username:
+                type: string
+              password:
+                type: string
+                format: password
+            required:
+              - username
+              - password
+      required: true
+
+
+paths:
+  /BASEPATH/login:
+    post:
+      tags:
+        - Session
+      summary: Login with web username
+      description: Try logging in with a web username/password combination created with the 'createwebuser' command.
+      operationId: SessionHandler.get.login
+      requestBody:
+        $ref: '#/components/requestBodies/SessionLoginBodyIn'
+      responses:
+        200:
+          description: Login succeeded, SessionID cookie will be set
+          content:
+            plain/text:
+              schema:
+                type: string
+                const: ''
+        400:
+          description: Invalid request
+          content:
+            plain/text:
+              schema:
+                type: string
+                enum:
+                  - 'NoLoginData'
+                  - 'InvalidLoginJson'
+        401:
+          description: Login failed
+          content:
+            plain/text:
+              schema:
+                type: string
+                const: 'UserPassInvalid'
+        500:
+          description: Internal error during login
+          content:
+            plain/text:
+              schema:
+                type: string
+                const: 'LoginError'
+
+  /BASEPATH/logout:
+    get:
+      tags:
+        - Session
+      summary: Logout
+      description: Log out from
+      operationId: SessionHandler.get.logout
+      responses:
+        302:
+          description: Logged out, redirect to page base
+          headers: 
+            Location:
+              description: Page base URL
+              schema:
+                type: string
+                const: '/app'
+
+  /BASEPATH/loginsteam:
+    get:
+      tags:
+        - Session
+      summary: Login with Steam
+      description: Log in with Steam's OpenID service
+      operationId: SessionHandler.get.loginsteam
+      responses:
+        302:
+          description: Redirect to Steam's OpenID page
+          headers:
+            Location:
+              description: Steam OpenID URL
+              schema:
+                type: string
+
+  /BASEPATH/verifysteamopenid:
+    get:
+      tags:
+        - Session
+      summary: Login with Steam - Verification
+      description: Callback from Steam's OpenID service, verifying the login result
+      operationId: SessionHandler.get.verifysteamopenid
+      responses:
+        302:
+          description: Redirect to page base or error page
+          headers:
+            Location:
+              description: Page base URL or error page
+              schema:
+                type: string
+                enum:
+                  - '/app'
+                  - '/app/error/SteamLoginFailed'
Index: TFP-WebServer/WebServer/src/UrlHandlers/UserStatusHandler.openapi.yaml
===================================================================
--- TFP-WebServer/WebServer/src/UrlHandlers/UserStatusHandler.openapi.yaml	(revision 463)
+++ TFP-WebServer/WebServer/src/UrlHandlers/UserStatusHandler.openapi.yaml	(revision 463)
@@ -0,0 +1,87 @@
+openapi: 3.1.0
+info:
+  title: UserStatusHandler
+  version: '1'
+
+components:
+  schemas:
+    UserStatusElement:
+      type: object
+      properties:
+        loggedIn:
+          type: boolean
+          examples:
+            - true
+        username:
+          type: string
+          examples:
+            - TheFunPimp
+        permissionLevel:
+          type: integer
+          examples:
+            - 0
+        permissions:
+          type: array
+          items:
+            type: object
+            properties:
+              module:
+                type: string
+                examples:
+                  - webapi.markers
+              allowed:
+                type: object
+                properties:
+                  GET:
+                    type: boolean
+                    examples:
+                      - true
+                  POST:
+                    type: boolean
+                    examples:
+                      - true
+                  PUT:
+                    type: boolean
+                    examples:
+                      - false
+                  DELETE:
+                    type: boolean
+                    examples:
+                      - false
+                required:
+                  - GET
+      required:
+        - loggedIn
+        - username
+        - permissionLevel
+        - permissions
+
+
+paths:
+  /BASEPATH/:
+    get:
+      tags:
+        - Session
+      summary: User status info
+      description: Get information about the currently logged in user
+      operationId: UserStatusHandler.get
+      responses:
+        200:
+          description: User status
+          content:
+            application/json:
+              schema:
+                type: object
+                properties:
+                  data:
+                    $ref: '#/components/schemas/UserStatusElement'
+                  meta:
+                    $ref: './openapi.yaml#/components/schemas/ResultEnvelopeMeta'
+                required:
+                  - data
+                  - meta
+      security:
+        - {}
+        - apiTokenName: [ ]
+          apiTokenSecret: [ ]
+        - sessionCookie: [ ]
