diff --git a/Source/Plugins/BuilderModes/Resources/Actions.cfg b/Source/Plugins/BuilderModes/Resources/Actions.cfg
index 86a01b7d4a6a853ac1bde6e5bd17e5c15e341500..d7ae909b5355c3d1c190772d902d47cc41013ad5 100755
--- a/Source/Plugins/BuilderModes/Resources/Actions.cfg
+++ b/Source/Plugins/BuilderModes/Resources/Actions.cfg
@@ -723,6 +723,7 @@ raisebrightness8
 	allowmouse = true;
 	allowscroll = true;
 	repeat = true;
+	disregardalt = true;
 }
 
 lowerbrightness8
@@ -734,6 +735,7 @@ lowerbrightness8
 	allowmouse = true;
 	allowscroll = true;
 	repeat = true;
+	disregardalt = true;
 }
 
 movetextureleft
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs
index 32e52bf16cc063093e01c9971018ce70513e6a88..5ec651566018919bb5a13a515ee5d0e7cf362bc0 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs
@@ -830,7 +830,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		}
 
 		// Sector brightness change
-		public virtual void OnChangeTargetBrightness(bool up)
+		public virtual void OnChangeTargetBrightness(bool up, bool local)
 		{
 			mode.CreateUndo("Change sector brightness", UndoGroup.SectorBrightnessChange, Sector.Sector.FixedIndex);
 			
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
index 45f4f7ec6d8b524f06d6569bb700b99c681edf73..24dffc1e40e2fe903efab2b213ed595691afeaed 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
@@ -1585,10 +1585,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		}
 		
 		// Sector brightness change
-		public virtual void OnChangeTargetBrightness(bool up)
+		public virtual void OnChangeTargetBrightness(bool up, bool local)
 		{
 			//mxd. Change UDMF wall light?
-			if(General.Map.UDMF && (General.Map.Config.DistinctWallBrightness || General.Map.Config.DistinctSidedefPartBrightness))
+			if(General.Map.UDMF && (General.Map.Config.DistinctWallBrightness || General.Map.Config.DistinctSidedefPartBrightness) && local)
 			{
 				string fieldname = "light";
 				string fieldabsolutename = "lightabsolute";
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
index c45d0309175396a089b1955a717371b874b69eaa..aed974525cff2792626ed87794f0d873f182692f 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
@@ -3508,18 +3508,20 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		[BeginAction("raisebrightness8")]
 		public void RaiseBrightness8()
 		{
+			bool local = General.Interface.AltState;
 			PreAction(UndoGroup.SectorBrightnessChange);
 			List<IVisualEventReceiver> objs = GetSelectedObjects(true, true, false, false, false);
-			foreach(IVisualEventReceiver i in objs) i.OnChangeTargetBrightness(true);
+			foreach(IVisualEventReceiver i in objs) i.OnChangeTargetBrightness(true, local);
 			PostAction();
 		}
 
 		[BeginAction("lowerbrightness8")]
 		public void LowerBrightness8()
 		{
+			bool local = General.Interface.AltState;
 			PreAction(UndoGroup.SectorBrightnessChange);
 			List<IVisualEventReceiver> objs = GetSelectedObjects(true, true, false, false, false);
-			foreach(IVisualEventReceiver i in objs) i.OnChangeTargetBrightness(false);
+			foreach(IVisualEventReceiver i in objs) i.OnChangeTargetBrightness(false, local);
 			PostAction();
 		}
 
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualSlope.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualSlope.cs
index 329adb62eba9212517ac8e9f43f14a207aafecce..f76b70be954b9b4839771c95334c5d438fd7a7c8 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualSlope.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualSlope.cs
@@ -110,7 +110,7 @@ namespace CodeImp.DoomBuilder.VisualModes
 		// Unused
 		public void OnSelectBegin() { }
 		public void OnEditBegin() { }
-		public void OnChangeTargetBrightness(bool up) { }
+		public void OnChangeTargetBrightness(bool up, bool local) { }
 		public void OnChangeTextureOffset(int horizontal, int vertical, bool doSurfaceAngleCorrection) { }
 		public void OnSelectTexture() { }
 		public void OnCopyTexture() { }
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs
index 29ddb26fc4f6aa42490134c785be33658959298c..389a39d68d7611a4f388394e5a1ada897ec63f96 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs
@@ -699,7 +699,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		// Unused
 		public void OnSelectBegin() { }
 		public void OnEditBegin() { }
-		public void OnChangeTargetBrightness(bool up) { }
+		public void OnChangeTargetBrightness(bool up, bool local) { }
 		public void OnChangeTextureOffset(int horizontal, int vertical, bool doSurfaceAngleCorrection) { }
 		public void OnSelectTexture() { }
 		public void OnCopyTexture() { }
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs
index 3de36f62fd465331ef30919ce223c430a2c358b8..e7483c76ad7992b82535a05358b0d248122d0885 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs
@@ -240,7 +240,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void OnSelectBegin() { }
 		public void OnEditBegin() { }
 		public void OnMouseMove(MouseEventArgs e) { }
-		public void OnChangeTargetBrightness(bool up) { }
+		public void OnChangeTargetBrightness(bool up, bool local) { }
 		public void OnChangeTextureOffset(int horizontal, int vertical, bool doSurfaceAngleCorrection) { }
 		public void OnChangeScale(int incrementX, int incrementY) { }
 		public void OnSelectTexture() { }
diff --git a/Source/Plugins/BuilderModes/VisualModes/IVisualEventReceiver.cs b/Source/Plugins/BuilderModes/VisualModes/IVisualEventReceiver.cs
index cde7f2ca6469a4155f058756c900212457920e61..8c5d73dd32168dee1a91da2a0e0fa29a5065e593 100755
--- a/Source/Plugins/BuilderModes/VisualModes/IVisualEventReceiver.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/IVisualEventReceiver.cs
@@ -34,7 +34,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		void OnEditEnd();
 		void OnMouseMove(MouseEventArgs e);
 		void OnChangeTargetHeight(int amount);
-		void OnChangeTargetBrightness(bool up);
+		void OnChangeTargetBrightness(bool up, bool local);
 		void OnChangeTextureOffset(int horizontal, int vertical, bool doSurfaceAngleCorrection);
 		void OnChangeScale(int incrementX, int incrementY); //mxd
 		void OnResetTextureOffset();
diff --git a/Source/Plugins/BuilderModes/VisualModes/NullVisualEventReceiver.cs b/Source/Plugins/BuilderModes/VisualModes/NullVisualEventReceiver.cs
index e6abe0e4104420909f0e5c8970c8425f9ad70bd8..dfe8b05b8f2f13463e18ecdedd400cb88e7d99d5 100755
--- a/Source/Plugins/BuilderModes/VisualModes/NullVisualEventReceiver.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/NullVisualEventReceiver.cs
@@ -33,7 +33,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void OnEditEnd()	{ }
 		public void OnMouseMove(MouseEventArgs e) {	}
 		public void OnChangeTargetHeight(int amount) { }
-		public void OnChangeTargetBrightness(bool up) { }
+		public void OnChangeTargetBrightness(bool up, bool local) { }
 		public void OnChangeTextureOffset(int horizontal, int vertical, bool doSurfaceAngleCorrection) { }
 		public void OnChangeScale(int incrementX, int incrementY) { } //mxd
 		public void OnResetTextureOffset() { }
diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs
index a1d85c029ded767e65ae7cf84f309d0bf02d28de..1ee4422a2bd9a657186b7177ce5e3aeeccdb7ab4 100755
--- a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs
@@ -436,7 +436,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		}
 
 		//mxd. Sector brightness change
-		public override void OnChangeTargetBrightness(bool up) 
+		public override void OnChangeTargetBrightness(bool up, bool local) 
 		{
 			if(level != null && level.sector != Sector.Sector) 
 			{
@@ -451,17 +451,17 @@ namespace CodeImp.DoomBuilder.BuilderModes
 				}
 
 				if(index > -1 && index < Sector.ExtraCeilings.Count)
-					((BaseVisualSector)mode.GetVisualSector(Sector.ExtraCeilings[index].level.sector)).Floor.OnChangeTargetBrightness(up);
+					((BaseVisualSector)mode.GetVisualSector(Sector.ExtraCeilings[index].level.sector)).Floor.OnChangeTargetBrightness(up, false);
 				else
-					base.OnChangeTargetBrightness(up);
+					base.OnChangeTargetBrightness(up, false);
 			} 
 			else 
 			{
 				// Change the sector brightness if the map is not in UDMF format, or this ceiling is part of 3D-floor,
-				// or the game configuration doesn't support distinct surfave brightnesses
-				if(!General.Map.UDMF || (level != null && Sector.Sector != level.sector) || !General.Map.Config.DistinctFloorAndCeilingBrightness) 
+				// or the game configuration doesn't support distinct surface brightnesses
+				if(!General.Map.UDMF || (level != null && Sector.Sector != level.sector) || !General.Map.Config.DistinctFloorAndCeilingBrightness || !local) 
 				{
-					base.OnChangeTargetBrightness(up);
+					base.OnChangeTargetBrightness(up, false);
 					return;
 				}
 
diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs
index 8be4c2161e2b7585f633d1a98420999d19f49885..64a6732e131dac0398f4668ee40f03b21df67532 100755
--- a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs
@@ -390,30 +390,53 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		}
 
 		//mxd. Sector brightness change
-		public override void OnChangeTargetBrightness(bool up) 
+		public override void OnChangeTargetBrightness(bool up, bool local) 
 		{
-			if(level != null) 
+			// This floor is part of 3D-floor
+			if (level != null && level.sector != Sector.Sector)
 			{
-				// This floor is part of 3D-floor
-				if(level.sector != Sector.Sector)
-				{
-					BaseVisualSector vs = (BaseVisualSector)mode.GetVisualSector(level.sector);
-					vs.Floor.OnChangeTargetBrightness(up);
-					vs.UpdateSectorGeometry(true);
-				}
-				// This is actual floor of a sector with extrafloors
-				else if(Sector.ExtraFloors.Count > 0 && !Sector.ExtraFloors[0].ExtraFloor.Floor.restrictlighting && !Sector.ExtraFloors[0].ExtraFloor.Floor.disablelighting)
+				BaseVisualSector vs = (BaseVisualSector)mode.GetVisualSector(level.sector);
+				vs.Floor.OnChangeTargetBrightness(up, local);
+				vs.UpdateSectorGeometry(true);
+			}
+			// This is actual floor of a sector with extrafloors
+			else if (level != null && Sector.ExtraFloors.Count > 0 && !Sector.ExtraFloors[0].ExtraFloor.Floor.restrictlighting && !Sector.ExtraFloors[0].ExtraFloor.Floor.disablelighting)
+			{
+				Sector.ExtraFloors[0].OnChangeTargetBrightness(up, local);
+			}
+			else
+			{
+				// Change the sector brightness if the map is not in UDMF format, or this floor is part of 3D-floor,
+				// or the game configuration doesn't support distinct surface brightnesses
+				if (!General.Map.UDMF || (level != null && Sector.Sector != level.sector) || !General.Map.Config.DistinctFloorAndCeilingBrightness || !local)
 				{
-					Sector.ExtraFloors[0].OnChangeTargetBrightness(up);
+					base.OnChangeTargetBrightness(up, false);
+					return;
 				}
+
+				int light = Sector.Sector.Fields.GetValue("lightfloor", 0);
+				bool absolute = Sector.Sector.Fields.GetValue("lightfloorabsolute", false);
+				int newLight;
+
+				if (up)
+					newLight = General.Map.Config.BrightnessLevels.GetNextHigher(light, absolute);
 				else
-				{
-					base.OnChangeTargetBrightness(up);
-				}
-			} 
-			else 
-			{
-				base.OnChangeTargetBrightness(up);
+					newLight = General.Map.Config.BrightnessLevels.GetNextLower(light, absolute);
+
+				if (newLight == light) return;
+
+				//create undo
+				mode.CreateUndo("Change floor brightness", UndoGroup.SurfaceBrightnessChange, Sector.Sector.FixedIndex);
+				Sector.Sector.Fields.BeforeFieldsChange();
+
+				//apply changes
+				UniFields.SetInteger(Sector.Sector.Fields, "lightfloor", newLight, (absolute ? int.MinValue : 0));
+				mode.SetActionResult("Changed floor brightness to " + newLight + ".");
+				Sector.Sector.UpdateNeeded = true;
+				Sector.Sector.UpdateCache();
+
+				//rebuild sector
+				Sector.UpdateSectorGeometry(false);
 			}
 		}