diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs
index 5e8281c66f1c7695b211b64faf559f5c13d55604..f1bcbb881c79760f22a269c99ebb26943a18fbe2 100755
--- a/Source/Core/Data/DataManager.cs
+++ b/Source/Core/Data/DataManager.cs
@@ -1936,6 +1936,11 @@ namespace CodeImp.DoomBuilder.Data
 					{
 						// Update the thing
 						thingtypes[actor.DoomEdNum].ModifyByDecorateActor(actor);
+
+						// Re-assign category in case it changed
+						thingtypes[actor.DoomEdNum].Category.RemoveThing(thingtypes[actor.DoomEdNum]);
+						ThingCategory tc = GetThingCategory(null, thingcategories, GetCategoryInfo(actor));
+						tc.AddThing(thingtypes[actor.DoomEdNum]);
 					}
 					else
 					{
diff --git a/Source/Core/SRB2/LuaMobjStructure.cs b/Source/Core/SRB2/LuaMobjStructure.cs
index 3b4ba4c9c2aee816ccdad31c2d19361de807b56c..c8c671fc6c960ff39b6d4cad56371a67b1cc78de 100644
--- a/Source/Core/SRB2/LuaMobjStructure.cs
+++ b/Source/Core/SRB2/LuaMobjStructure.cs
@@ -14,7 +14,7 @@ namespace CodeImp.DoomBuilder.ZDoom
 	{
         #region ================== DECORATE Actor Structure parsing
 
-        internal LuaMobjStructure(ZDTextParser zdparser, string objname)
+        internal LuaMobjStructure(ZDTextParser zdparser, string objname, int editnum)
         {
 			classname = string.Empty;
 
@@ -22,12 +22,15 @@ namespace CodeImp.DoomBuilder.ZDoom
             bool done = false; //mxd
 			General.WriteLogLine(objname);
 
-			if (string.IsNullOrEmpty(objname))
+			if (string.IsNullOrEmpty(objname) && editnum == 0)
             {
-                parser.ReportError("Expected actor class name");
+                parser.ReportError("Lua object structure has no object name or map thing number");
                 return;
             }
 
+			if (editnum > 0)
+				doomednum = editnum;
+
 			// Now parse the contents of actor structure
 
 			while (parser.SkipWhitespace(true))
@@ -38,6 +41,7 @@ namespace CodeImp.DoomBuilder.ZDoom
 				switch (token)
 				{
 					case "}":
+					case "$}":
 						// Actor scope ends here, break out of this parse loop
 						done = true;
 						break;
@@ -94,7 +98,7 @@ namespace CodeImp.DoomBuilder.ZDoom
 									props["yscale"] = values;
 									break;
 								case "doomednum":
-									doomednum = int.Parse(values[0]);
+									doomednum = (editnum > 0) ? editnum : int.Parse(values[0]);
 									goto default;
 								case "height":
 								case "radius":
diff --git a/Source/Core/SRB2/LuaParser.cs b/Source/Core/SRB2/LuaParser.cs
index c2b842644bf44dbe364999dbe57ad7ca729fc1cd..571f1e42f6a601cee1a31d90fe48313551b16e56 100644
--- a/Source/Core/SRB2/LuaParser.cs
+++ b/Source/Core/SRB2/LuaParser.cs
@@ -121,29 +121,48 @@ namespace CodeImp.DoomBuilder.ZDoom
 			{
 				// Read a token
 				string token = ReadToken();
+
 				if (!string.IsNullOrEmpty(token))
 				{
-					if (!token.StartsWith("mobjinfo[") || !token.EndsWith("]")) continue;
-					string objname = token.Substring(9).TrimEnd(new char[] { ']' });
+					string objname = null;
+					int editnum = 0;
 
-					SkipWhitespace(true);
-					token = ReadToken();
-					if (token != "=")
+					if (token.Contains("$EditInfo"))
 					{
-						continue;
+						SkipWhitespace(true);
+						token = ReadToken();
+
+						bool valid = int.TryParse(token, out editnum);
+						if (!valid || editnum <= 0)
+						{
+							continue;
+						}
+					}
+					else
+					{
+						if (!token.StartsWith("mobjinfo[") || !token.EndsWith("]")) continue;
+						objname = token.Substring(9).TrimEnd(new char[] { ']' });
+
+						SkipWhitespace(true);
+						token = ReadToken();
+
+						if (token != "=")
+						{
+							continue;
+						}
 					}
 
 					SkipWhitespace(true);
 					token = ReadToken();
+
 					if (token != "{")
 					{
 						ReportError("Invalid object definition, missing {");
 						return false;
 					}
+
 					// Read actor structure
-					ActorStructure mobj = new LuaMobjStructure(this, objname);
-					if (mobj.props.ContainsKey("doomednum"))
-						General.WriteLogLine("Mobj doomednum = " + mobj.props["doomednum"][0]);
+					ActorStructure mobj = new LuaMobjStructure(this, objname, editnum);
 					if (this.HasError) return false;
 
 					mobjs[mobj.DoomEdNum] = mobj;