diff --git a/doc/specs/udmf_srb2.txt b/doc/specs/udmf_srb2.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c758d7e40f13d466afcfc689c679845fec71b906
--- /dev/null
+++ b/doc/specs/udmf_srb2.txt
@@ -0,0 +1,311 @@
+===============================================================================
+Universal Doom Map Format Sonic Robo Blast 2 extensions v1.0 19.02.2024
+
+    Copyright (c) 2024 Sonic Team Junior
+       uses Universal Doom Map Format Specification v1.1 as a template,
+       original document Copyright (c) 2009 James Haley.
+    Permission is granted to copy, distribute and/or modify this document
+    under the terms of the GNU Free Documentation License, Version 1.2
+    or any later version published by the Free Software Foundation;
+    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+
+===============================================================================
+
+This document discusses the UDMF implementation found in Sonic Robo Blast 2's engine.
+
+=======================================
+I. Grammar / Syntax
+=======================================
+
+    No changes.
+
+=======================================
+II. Implementation Semantics
+=======================================
+
+------------------------------------
+II.A : Storage and Retrieval of Data
+------------------------------------
+
+    No changes.
+
+-----------------------------------
+II.B : Storage Within Archive Files
+-----------------------------------
+
+    No changes.
+
+--------------------------------
+II.C : Implementation Dependence
+--------------------------------
+
+The SRB2 engine only supports the following namespace:
+    "srb2"
+
+The engine is allowed to refuse maps with an unsupported namespace,
+or emit a warning.
+
+=======================================
+III. Standardized Fields
+=======================================
+
+The SRB2 engine ignores any user-defined fields.
+All boolean fields default to false unless mentioned otherwise.
+
+Sonic Robo Blast 2 defines the following standardized fields:
+
+   vertex
+   {
+      x = <float>;        // X coordinate. No valid default.
+      y = <float>;        // Y coordinate. No valid default.
+      zfloor = <float>;   // Floor height at this vertex. Only applies to triangular sectors
+      zceiling = <float>; // Ceiling height at this vertex. Only applies to triangular sectors
+   }
+
+   linedef
+   {
+      id      = <integer>;        // ID of line. Interpreted as tag.
+      moreids = <string>;         // Additional line IDs, specified as a space separated list of numbers (e.g. "2 666 1003 4505")
+
+      v1 = <integer>;             // Index of first vertex. No valid default.
+      v2 = <integer>;             // Index of second vertex. No valid default.
+
+      blocking      = <bool>;     // Line blocks things.
+      blockmonsters = <bool>;     // Line blocks enemies.
+      twosided      = <bool>;     // Line is 2S.
+      dontpegtop    = <bool>;     // Upper texture unpegged.
+      dontpegbottom = <bool>;     // Lower texture unpegged.
+      skewtd        = <bool>;     // Upper and lower textures are skewed.
+      noclimb       = <bool>;     // Line is not climbable.
+      noskew        = <bool>;     // Middle texture is not skewed.
+      midpeg        = <bool>;     // Middle texture is pegged.
+      midsolid      = <bool>;     // Middle texture is solid.
+      wrapmidtex    = <bool>;     // Line's mid textures are wrapped.
+      nonet         = <bool>;     // Special only takes effect in singleplayer games.
+      netonly       = <bool>;     // Special only takes effect in multiplayer games.
+      bouncy        = <bool>;     // Line is bouncy.
+      transfer      = <bool>;     // In 3D floor sides, uses the sidedef properties of the control sector.
+
+      alpha       = <float>;      // Translucency of this line. Default is 1.0
+      renderstyle = <string>;     // Render style. Can be:
+                                  // - "translucent"
+                                  // - "add"
+                                  // - "subtract"
+                                  // - "reversesubtract"
+                                  // - "modulate"
+                                  // - "fog"
+                                  // Default is "translucent".
+
+      special    = <integer>; // Linedef action. Default = 0.
+      arg0       = <integer>; // Argument 0. Default = 0.
+      arg1       = <integer>; // Argument 1. Default = 0.
+      arg2       = <integer>; // Argument 2. Default = 0.
+      arg3       = <integer>; // Argument 3. Default = 0.
+      arg4       = <integer>; // Argument 4. Default = 0.
+      arg5       = <integer>; // Argument 5. Default = 0.
+      arg6       = <integer>; // Argument 6. Default = 0.
+      arg7       = <integer>; // Argument 7. Default = 0.
+      arg8       = <integer>; // Argument 8. Default = 0.
+      arg9       = <integer>; // Argument 9. Default = 0.
+      stringarg0 = <string>;  // String argument 0.
+      stringarg1 = <string>;  // String argument 1.
+
+      sidefront = <integer>; // Sidedef 1 index. No valid default.
+      sideback  = <integer>; // Sidedef 2 index. Default = -1.
+
+      comment = <string>; // A comment. Implementors should attach no special
+                          // semantic meaning to this field.
+   }
+
+   sidedef
+   {
+      offsetx = <integer>; // X offset. Default = 0.
+      offsety = <integer>; // Y offset. Default = 0.
+
+      texturetop    = <string>; // Upper texture. Default = "-".
+      texturebottom = <string>; // Lower texture. Default = "-".
+      texturemiddle = <string>; // Middle texture. Default = "-".
+
+      repeatcnt = <string>; // Number of middle texture repetitions. Default = 0
+
+      sector = <integer>; // Sector index. No valid default.
+
+      scalex_top = <float>;            // X scale for upper texture. Default = 1.0.
+      scaley_top = <float>;            // Y scale for upper texture. Default = 1.0.
+      scalex_mid = <float>;            // X scale for mid texture. Default = 1.0.
+      scaley_mid = <float>;            // Y scale for mid texture. Default = 1.0.
+      scalex_bottom = <float>;         // X scale for lower texture. Default = 1.0.
+      scaley_bottom = <float>;         // Y scale for lower texture. Default = 1.0.
+      offsetx_top = <float>;           // X offset for upper texture. Default = 0.0.
+      offsety_top = <float>;           // Y offset for upper texture. Default = 0.0.
+      offsetx_mid = <float>;           // X offset for mid texture. Default = 0.0.
+      offsety_mid = <float>;           // Y offset for mid texture. Default = 0.0.
+      offsetx_bottom = <float>;        // X offset for lower texture. Default = 0.0.
+      offsety_bottom = <float>;        // Y offset for lower texture. Default = 0.0.
+
+      comment = <string>; // A comment. Implementors should attach no special
+                          // semantic meaning to this field.
+   }
+
+   sector
+   {
+      heightfloor   = <integer>; // Floor height. Default = 0.
+      heightceiling = <integer>; // Ceiling height. Default = 0.
+
+      texturefloor   = <string>; // Floor flat. No valid default.
+      textureceiling = <string>; // Ceiling flat. No valid default.
+
+      lightlevel = <integer>;         // Light level. Default = 255.
+      lightfloor = <integer>;         // The floor's light level. Default is 0.
+      lightceiling = <integer>;       // The ceiling's light level. Default is 0.
+      lightfloorabsolute = <bool>;    // true = 'lightfloor' is an absolute value. Default is
+                                      // relative to the owning sector's light level.
+      lightceilingabsolute = <bool>;  // true = 'lightceiling' is an absolute value. Default is
+                                      // relative to the owning sector's light level.
+
+      special = <integer>; // Sector special. Default = 0.
+      id      = <integer>; // Sector tag/id. Default = 0.
+      moreids = <string>;  // Additional sector IDs/tags, specified as a space separated list of numbers (e.g. "2 666 1003 4505")
+
+      xpanningfloor = <float>;        // X texture offset of floor texture. Default = 0.0.
+      ypanningfloor = <float>;        // Y texture offset of floor texture. Default = 0.0.
+      xpanningceiling = <float>;      // X texture offset of ceiling texture. Default = 0.0.
+      ypanningceiling = <float>;      // Y texture offset of ceiling texture. Default = 0.0.
+      xscalefloor = <float>;          // X texture scale of floor texture. Default = 1.0.
+      yscalefloor = <float>;          // Y texture scale of floor texture. Default = 1.0.
+      xscaleceiling = <float>;        // X texture scale of ceiling texture. Default = 1.0.
+      yscaleceiling = <float>;        // Y texture scale of ceiling texture. Default = 1.0.
+      rotationfloor = <float>;        // Rotation of floor texture in degrees. Default = 0.0.
+      rotationceiling = <float>;      // Rotation of ceiling texture in degrees. Default = 0.0.
+      ceilingplane_a = <float>;       // Define the plane equation for the sector's ceiling. Default is a horizontal plane at 'heightceiling'.
+      ceilingplane_b = <float>;       // 'heightceiling' will still be used to calculate texture alignment.
+      ceilingplane_c = <float>;       // The plane equation will only be used if all 4 values are given.
+      ceilingplane_d = <float>;       // The plane is defined as a*x + b*y + c*z + d = 0 with the normal vector pointing downward.
+      floorplane_a = <float>;         // Define the plane equation for the sector's floor. Default is a horizontal plane at 'heightfloor'.
+      floorplane_b = <float>;         // 'heightfloor' will still be used to calculate texture alignment.
+      floorplane_c = <float>;         // The plane equation will only be used if all 4 values are given.
+      floorplane_d = <float>;         // The plane is defined as a*x + b*y + c*z + d = 0 with the normal vector pointing upward.
+
+      lightcolor          = <integer>;      // Sector's light color as RRGGBB value. Default = 0x000000.
+      lightalpha          = <integer>;      // Sector's light opacity. Default = 25.
+      fadecolor           = <integer>;      // Sector's fog color as RRGGBB value. Default = 0x000000.
+      fadealpha           = <integer>;      // Sector's fog opacity. Default = 25.
+      fadestart           = <integer>;      // Sector's fading range start. Default = 0.
+      fadeend             = <integer>;      // Sector's fading range end. Default = 31.
+      colormapfog         = <bool>;         // Sector's colormap uses fog lighting.
+      colormapfadesprites = <bool>;         // Sector's colormap affects full-bright sprites.
+      colormapprotected   = <bool>;         // Sector's colormap is not affected by colormap change specials.
+
+      flipspecial_nofloor     = <bool>;     // Trigger effects that require a plane touch are not executed when the floor is touched.
+      flipspecial_ceiling     = <bool>;     // Trigger effects that require a plane touch are executed when the ceiling is touched.
+      triggerspecial_touch    = <bool>;     // Trigger effects are executed anywhere in the sector.
+      triggerspecial_headbump = <bool>;     // Trigger effects are executed if the top of the triggerer object touches a plane.
+      triggerline_plane       = <bool>;     // Trigger effects require a plane touch to be executed.
+      triggerline_mobj        = <bool>;     // Trigger effects can be executed by non-pushable objects.
+
+      invertprecip   = <bool>;         // Inverts the precipitation effect; if the sector is considered to be indoors,
+                                       // precipitation is generated, and if the sector is considered to be outdoors,
+                                       // precipitation is not generated.
+      gravityflip        = <bool>;     // Sector flips any objects in it, if the sector has negative gravity.
+      heatwave           = <bool>;     // Sector has the heat wave effect.
+      noclipcamera       = <bool>;     // Sector is not tangible to the camera.
+      outerspace         = <bool>;     // Sector has the space countdown effect.
+      doublestepup       = <bool>;     // Sector has half the vertical height needed for objects to walk into it.
+      nostepdown         = <bool>;     // Sector has the staircase effect disabled.
+      speedpad           = <bool>;     // Sector is a speed pad.
+      starpostactivator  = <bool>;     // Sector activates any Star Posts in it when walked into by a plyer.
+      exit               = <bool>;     // Sector is an exit sector.
+      specialstagepit    = <bool>;     // Sector is a Special Stage pit.
+      returnflag         = <bool>;     // Sector returns any Capture the Flag flags that come in contact with it to their respective bases.
+      redteambase        = <bool>;     // Sector is a Red Team base.
+      blueteambase       = <bool>;     // Sector is Blue Team base.
+      fan                = <bool>;     // Sector is a fan sector.
+      supertransform     = <bool>;     // Sector transforms any players that come in contact with it into their 'super' mode.
+      forcespin          = <bool>;     // Sector forces any players that come in contact with it to roll.
+      zoomtubestart      = <bool>;     // Sector is the starting point of a zoom tube path.
+      zoomtubeend        = <bool>;     // Sector is the ending point of a zoom tube path.
+      finishline         = <bool>;     // Sector is a Circuit finish line.
+      ropehang           = <bool>;     // Sector is a rope hang. Must be applied to a 3D floor.
+      jumpflip           = <bool>;     // Sector flips the gravity of players who jump from it.
+      gravityoverride    = <bool>;     // Reverse gravity effect is only applied when an object is in the sector.
+
+      friction            = <float>;   // Sector's friction factor.
+      gravity             = <float>;   // Sector's gravity. Default is 1.0.
+      damagetype          = <integer>; // Damage type for sector damage. Can be:
+                                       // - "None"
+                                       // - "Generic"
+                                       // - "Water"
+                                       // - "Fire"
+                                       // - "Lava"
+                                       // - "Electric"
+                                       // - "Spike"
+                                       // - "DeathPitTilt"
+                                       // - "DeathPitNoTilt"
+                                       // - "Instakill"
+                                       // - "SpecialStage"
+                                       // Default = "None".
+      triggertag          = <integer>; // Tag to trigger when this sector is entered. Default = 0.
+      triggerer           = <string>;  // Who can execute the trigger tag when this sector is entered. Can be:
+                                       // - "Player"
+                                       // - "AllPlayers"
+                                       // - "Mobj"
+                                       // Default = "Player".
+
+      comment = <string>; // A comment. Implementors should attach no special
+                          // semantic meaning to this field.
+   }
+
+   thing
+   {
+      id      = <integer>; // Thing ID. Default = 0.
+      moreids = <string>;  // Additional thing IDs, specified as a space separated list of numbers (e.g. "2 666 1003 4505")
+
+      x = <float>; // X coordinate. No valid default.
+      y = <float>; // Y coordinate. No valid default.
+
+      height = <float>; // Z height relative to floor.
+                        // Relative to ceiling if flip = true.
+                        // Absolute if absolutez = true.
+                        // Default = 0.
+
+      angle     = <integer>; // Map angle of thing in degrees. Default = 0 (East).
+      pitch     = <integer>; // Pitch of thing in degrees. Default = 0 (horizontal).
+      roll      = <integer>; // Roll of thing in degrees. Default = 0.
+      scalex    = <float>;   // Horizontal visual scaling on thing. Default = 1.0.
+      scaley    = <float>;   // Vertical visual scaling on thing. Default = 1.0.
+      scale     = <float>;   // Vertical and horizontal visual scaling on thing. Default = 1.0.
+      mobjscale = <float>;   // Physical scale of the thing. Default = 1.0.
+
+      type = <integer>; // Thing type. No valid default.
+
+      flip       = <bool>; // Thing spawns flipped, on the ceiling.
+      absolutez  = <bool>; // If true, the thing height is absolute, instead of being relative to the floor or ceiling.
+
+      arg0       = <integer>; // Argument 0. Default = 0.
+      arg1       = <integer>; // Argument 1. Default = 0.
+      arg2       = <integer>; // Argument 2. Default = 0.
+      arg3       = <integer>; // Argument 3. Default = 0.
+      arg4       = <integer>; // Argument 4. Default = 0.
+      arg5       = <integer>; // Argument 5. Default = 0.
+      arg6       = <integer>; // Argument 6. Default = 0.
+      arg7       = <integer>; // Argument 7. Default = 0.
+      arg8       = <integer>; // Argument 8. Default = 0.
+      arg9       = <integer>; // Argument 9. Default = 0.
+      stringarg0 = <string>;  // String argument 0.
+      stringarg1 = <string>;  // String argument 1.
+
+      comment = <string>; // A comment. Implementors should attach no special
+                          // semantic meaning to this field.
+   }
+
+
+=======================================
+Changelog
+=======================================
+
+1.0: 19.02.2024
+Initial version.
+
+===============================================================================
+EOF
+===============================================================================
\ No newline at end of file