Index: /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java
===================================================================
--- /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java	(revision 21701)
+++ /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java	(revision 21702)
@@ -35,5 +35,6 @@
 	
 	private double len = 0;
-	double lwidth;
+	private double lwidth;
+	private double heading;
 	private boolean angconstrainted;
 	private double angconstraint = 0;
@@ -76,8 +77,14 @@
 		updMetrics();
 	}
-	public void setPlace(EastNorth p2,double width,double lenstep) {
-		double heading = p1.heading(p2);
+	private void updatePos() {
+		en1 = p1;
+		en2 = new EastNorth(p1.east()+Math.sin(heading)*len*meter,p1.north()+Math.cos(heading)*len*meter);
+		en3 = new EastNorth(p1.east()+Math.sin(heading)*len*meter+Math.cos(heading)*lwidth*meter,p1.north()+Math.cos(heading)*len*meter-Math.sin(heading)*lwidth*meter);
+		en4 = new EastNorth(p1.east()+Math.cos(heading)*lwidth*meter,p1.north()-Math.sin(heading)*lwidth*meter);
+	}
+	public void setPlace(EastNorth p2,double width,double lenstep,boolean ignoreConstraint) {
+		heading = p1.heading(p2);
 		double hdang = 0;
-		if (angconstrainted) {
+		if (angconstrainted && !ignoreConstraint) {
 			hdang = Math.round((heading-angconstraint)/Math.PI*4);
 			if (hdang>=8)hdang-=8;
@@ -88,15 +95,14 @@
 		if (lenstep <= 0) len=distance; else len = Math.round(distance/lenstep)*lenstep;
 		if (len == 0) return;
-
-		en1 = p1;
-		en2 = new EastNorth(p1.east()+Math.sin(heading)*len*meter,p1.north()+Math.cos(heading)*len*meter);
-		en3 = new EastNorth(p1.east()+Math.sin(heading)*len*meter+Math.cos(heading)*width*meter,p1.north()+Math.cos(heading)*len*meter-Math.sin(heading)*width*meter);
-		en4 = new EastNorth(p1.east()+Math.cos(heading)*width*meter,p1.north()-Math.sin(heading)*width*meter);
-
 		lwidth = width;
+		updatePos();
 		Main.map.statusLine.setHeading(Math.toDegrees(heading));
-		if (angconstrainted) {
+		if (angconstrainted && !ignoreConstraint) {
 			Main.map.statusLine.setAngle(hdang*45);
 		}
+	}
+	public void setWidth(double width) {
+		lwidth = width;
+		updatePos();
 	}
 	public void paint(Graphics2D g, MapView mv) {
Index: /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/DrawBuildingAction.java
===================================================================
--- /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/DrawBuildingAction.java	(revision 21701)
+++ /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/DrawBuildingAction.java	(revision 21702)
@@ -184,5 +184,5 @@
 				p2 = latlon2eastNorth(n.getCoor());
 			}
-			building.setPlace(p2, width, e.isControlDown()?0:lenstep);
+			building.setPlace(p2, width, e.isShiftDown()?0:lenstep,e.isShiftDown());
 			Main.map.statusLine.setDist(building.getLength());
 			return;
@@ -204,5 +204,5 @@
 				/p1.distanceSq(p2) * building.getLength();
 			
-			building.setPlace(p2, mwidth, lenstep);
+			building.setWidth(mwidth);
 			Main.map.statusLine.setDist(Math.abs(mwidth));			
 			return;
