Index: TFP-WebServer/WebServer/src/Permissions/AdminApiTokens.cs
===================================================================
--- TFP-WebServer/WebServer/src/Permissions/AdminApiTokens.cs	(revision 485)
+++ TFP-WebServer/WebServer/src/Permissions/AdminApiTokens.cs	(revision 487)
@@ -19,5 +19,5 @@
 		}
 
-		protected override void ParseElement (XmlElement _childElement) {
+		public override void ParseElement (XmlElement _childElement) {
 			if (ApiToken.TryParse (_childElement, out ApiToken apiToken)) {
 				tokens [apiToken.Name] = apiToken;
Index: TFP-WebServer/WebServer/src/Permissions/AdminWebModules.cs
===================================================================
--- TFP-WebServer/WebServer/src/Permissions/AdminWebModules.cs	(revision 485)
+++ TFP-WebServer/WebServer/src/Permissions/AdminWebModules.cs	(revision 487)
@@ -1,4 +1,7 @@
+using System;
 using System.Collections.Generic;
 using System.Xml;
+using JetBrains.Annotations;
+using UnityEngine;
 
 namespace Webserver.Permissions {
@@ -16,11 +19,20 @@
 
 		public override void Clear () {
+			allModulesList.Clear ();
 			modules.Clear ();
 		}
 
-		protected override void ParseElement (XmlElement _childElement) {
-			if (WebModule.TryParse (_childElement, out WebModule webModule)) {
-				modules [webModule.Name] = webModule;
-			}
+		public override void ParseElement (XmlElement _childElement) {
+			allModulesList.Clear ();
+
+			if (!WebModule.TryParse (_childElement, out WebModule webModule)) {
+				return;
+			}
+
+			if (knownModules.TryGetValue (webModule.Name, out WebModule knownModule)) {
+				webModule = webModule.FixPermissionLevelsFromKnownModule (knownModule);
+			}
+			
+			modules [webModule.Name] = webModule;
 		}
 
@@ -43,5 +55,5 @@
 			lock (Parent) {
 				allModulesList.Clear ();
-				
+			
 				modules [_module.Name] = _module;
 				Parent.Save ();
@@ -80,11 +92,11 @@
 #endregion
 		
-		public struct WebModule {
-			public string Name;
-			public int LevelGlobal;
-			public int[] LevelPerMethod;
-			public bool IsDefault;
-
-			public WebModule (string _name, int _level, bool _isDefault = false) {
+		public readonly struct WebModule {
+			public readonly string Name;
+			public readonly int LevelGlobal;
+			public readonly int[] LevelPerMethod;
+			public readonly bool IsDefault;
+
+			public WebModule (string _name, int _level, bool _isDefault) {
 				LevelPerMethod = null;
 				
@@ -94,6 +106,6 @@
 			}
 
-			public WebModule (string _name, int _levelGlobal, int[] _levelPerMethod, bool _isDefault = false) {
-				if (_levelPerMethod == null || _levelPerMethod.Length != (int)ERequestMethod.Count) {
+			public WebModule (string _name, int _levelGlobal, int[] _levelPerMethod, bool _isDefault) {
+				if (_levelPerMethod != null && _levelPerMethod.Length != (int)ERequestMethod.Count) {
 					LevelPerMethod = createDefaultPerMethodArray ();
 
@@ -205,9 +217,31 @@
 				}
 
-				_result = perMethodLevels != null ? new WebModule (name, permissionLevel, perMethodLevels) : new WebModule (name, permissionLevel);
+				_result = new WebModule (name, permissionLevel, perMethodLevels, false);
 
 				return true;
 			}
 
+			[MustUseReturnValue]
+			public WebModule SetLevelGlobal (int _level) {
+				int[] perMethodClone = LevelPerMethod == null ? null : new int[LevelPerMethod.Length];
+				if (perMethodClone != null) {
+					Array.Copy (LevelPerMethod, perMethodClone, perMethodClone.Length);
+				}
+
+				return new WebModule (Name, _level, perMethodClone, false);
+			}
+
+			[MustUseReturnValue]
+			public WebModule SetLevelForMethod (ERequestMethod _method, int _level) {
+				int[] perMethodClone = createDefaultPerMethodArray ();
+				if (LevelPerMethod != null) {
+					Array.Copy (LevelPerMethod, perMethodClone, perMethodClone.Length);
+				}
+
+				perMethodClone[(int)_method] = _level;
+				
+				return new WebModule (Name, LevelGlobal, perMethodClone, false);
+			}
+			
 			private static int[] createDefaultPerMethodArray () {
 				int[] result = new int[(int)ERequestMethod.Count];
@@ -219,4 +253,23 @@
 				return result;
 			}
+
+			[MustUseReturnValue]
+			public WebModule FixPermissionLevelsFromKnownModule (WebModule _knownModule) {
+				if (_knownModule.LevelPerMethod == null) {
+					if (LevelPerMethod != null) {
+						return new WebModule (Name, LevelGlobal, false);
+					}
+					return this;
+				}
+				
+				WebModule result = this;
+				for (int i = 0; i < _knownModule.LevelPerMethod.Length; i++) {
+					if (result.LevelPerMethod == null || result.LevelPerMethod[i] == MethodLevelNotSupported) {
+						result = result.SetLevelForMethod ((ERequestMethod)i, _knownModule.LevelPerMethod[i]);
+					}
+				}
+
+				return result;
+			}
 		}
 
@@ -253,13 +306,20 @@
 
 		public void AddKnownModule (WebModule _module) {
+			if (!_module.IsDefault) {
+				Log.Warning ($"Call to AddKnownModule with IsDefault==false! From:\n{StackTraceUtility.ExtractStackTrace()}");
+			}
+
 			if (string.IsNullOrEmpty (_module.Name)) {
 				return;
 			}
 
-			_module.IsDefault = true;
-			
 			lock (Parent) {
 				allModulesList.Clear ();
 				knownModules [_module.Name] = _module;
+				
+				if (modules.TryGetValue (_module.Name, out WebModule overrideModule)) {
+					overrideModule = overrideModule.FixPermissionLevelsFromKnownModule (_module);
+					modules[_module.Name] = overrideModule;
+				}
 			}
 		}
Index: TFP-WebServer/WebServer/src/Permissions/AdminWebUsers.cs
===================================================================
--- TFP-WebServer/WebServer/src/Permissions/AdminWebUsers.cs	(revision 485)
+++ TFP-WebServer/WebServer/src/Permissions/AdminWebUsers.cs	(revision 487)
@@ -21,5 +21,5 @@
 		}
 
-		protected override void ParseElement (XmlElement _childElement) {
+		public override void ParseElement (XmlElement _childElement) {
 			if (WebUser.TryParse (_childElement, out WebUser webUser)) {
 				users [webUser.Name] = webUser;
