diff -ruN uppsrc/ide/LayDes/item.cpp uppsrc/ide/LayDes/item.cpp
--- uppsrc/ide/LayDes/item.cpp	2013-05-16 19:57:12 +0400
+++ uppsrc/ide/LayDes/item.cpp	2013-05-31 11:47:40 +0400
@@ -101,47 +101,78 @@
 		property[i].SetCharset(charset);
 }
 
+template <Ctrl::Logc Pos(int a, int size)>
+inline void ReadPos(CParser& p, Ctrl::Logc& pos)
+{
+	Point pt = ReadPoint(p);
+	pos = Pos(pt.x, pt.y);
+}
+
 void LayoutItem::ReadProperties(CParser& p, bool addunknown)
 {
 	do {
-		if(p.Id("LeftPosZ") || p.Id("LeftPos")) {
-			Point pt = ReadPoint(p);
-			pos.x = Ctrl::PosLeft(pt.x, pt.y);
+		if(p.Id("LeftPosZ"))
+			ReadPos<Ctrl::PosLeft>(p, pos.x);
+		else
+		if(p.Id("LeftPos")) {
+			ReadPos<Ctrl::PosLeft>(p, pos.x);
+			zoom.NoZoomX();
 		}
 		else
-		if(p.Id("RightPosZ") || p.Id("RightPos")) {
-			Point pt = ReadPoint(p);
-			pos.x = Ctrl::PosRight(pt.x, pt.y);
+		if(p.Id("RightPosZ"))
+			ReadPos<Ctrl::PosRight>(p, pos.x);
+		else
+		if(p.Id("RightPos")) {
+			ReadPos<Ctrl::PosRight>(p, pos.x);
+			zoom.NoZoomX();
 		}
 		else
-		if(p.Id("HSizePosZ") || p.Id("HSizePos")) {
-			Point pt = ReadPoint(p);
-			pos.x = Ctrl::PosSize(pt.x, pt.y);
+		if(p.Id("HSizePosZ"))
+			ReadPos<Ctrl::PosSize>(p, pos.x);
+		else
+		if(p.Id("HSizePos")) {
+			ReadPos<Ctrl::PosSize>(p, pos.x);
+			zoom.NoZoomX();
 		}
 		else
-		if(p.Id("HCenterPosZ") || p.Id("HCenterPos")) {
-			Point pt = ReadPoint(p);
-			pos.x = Ctrl::PosCenter(pt.x, pt.y);
+		if(p.Id("HCenterPosZ"))
+			ReadPos<Ctrl::PosCenter>(p, pos.x);
+		else
+		if(p.Id("HCenterPos")) {
+			ReadPos<Ctrl::PosCenter>(p, pos.x);
+			zoom.NoZoomX();
 		}
 		else
-		if(p.Id("TopPosZ") || p.Id("TopPos")) {
-			Point pt = ReadPoint(p);
-			pos.y = Ctrl::PosLeft(pt.x, pt.y);
+		if(p.Id("TopPosZ"))
+			ReadPos<Ctrl::PosLeft>(p, pos.y);
+		else
+		if(p.Id("TopPos")) {
+			ReadPos<Ctrl::PosLeft>(p, pos.y);
+			zoom.NoZoomY();
 		}
 		else
-		if(p.Id("BottomPosZ") || p.Id("BottomPos")) {
-			Point pt = ReadPoint(p);
-			pos.y = Ctrl::PosRight(pt.x, pt.y);
+		if(p.Id("BottomPosZ"))
+			ReadPos<Ctrl::PosRight>(p, pos.y);
+		else
+		if(p.Id("BottomPos")) {
+			ReadPos<Ctrl::PosRight>(p, pos.y);
+			zoom.NoZoomY();
 		}
 		else
-		if(p.Id("VSizePosZ") || p.Id("VSizePos")) {
-			Point pt = ReadPoint(p);
-			pos.y = Ctrl::PosSize(pt.x, pt.y);
+		if(p.Id("VSizePosZ"))
+			ReadPos<Ctrl::PosSize>(p, pos.y);
+		else
+		if(p.Id("VSizePos")) {
+			ReadPos<Ctrl::PosSize>(p, pos.y);
+			zoom.NoZoomY();
 		}
 		else
-		if(p.Id("VCenterPosZ") || p.Id("VCenterPos")) {
-			Point pt = ReadPoint(p);
-			pos.y = Ctrl::PosCenter(pt.x, pt.y);
+		if(p.Id("VCenterPosZ"))
+			ReadPos<Ctrl::PosCenter>(p, pos.y);
+		else
+		if(p.Id("VCenterPos")) {
+			ReadPos<Ctrl::PosCenter>(p, pos.y);
+			zoom.NoZoomY();
 		}
 		else {
 			String name = p.ReadId();
@@ -178,6 +209,11 @@
 	return -1;
 }
 
+inline const char *CharZoom(bool zoom)
+{
+	return zoom ? "Z" : "";
+}
+
 String LayoutItem::SaveProperties(int y) const
 {
 	String out;
@@ -188,16 +224,16 @@
 			out << '.' << ip.name << '(' << ip.Save() << ')';
 	}
 	switch(pos.x.GetAlign()) {
-	case Ctrl::LEFT:   out << Format(".LeftPosZ(%d, %d)", pos.x.GetA(), pos.x.GetB()); break;
-	case Ctrl::RIGHT:  out << Format(".RightPosZ(%d, %d)", pos.x.GetA(), pos.x.GetB()); break;
-	case Ctrl::SIZE:   out << Format(".HSizePosZ(%d, %d)", pos.x.GetA(), pos.x.GetB()); break;
-	case Ctrl::CENTER: out << Format(".HCenterPosZ(%d, %d)", pos.x.GetB(), pos.x.GetA()); break;
+	case Ctrl::LEFT:   out << Format(".LeftPos%s(%d, %d)", CharZoom(zoom.x), pos.x.GetA(), pos.x.GetB()); break;
+	case Ctrl::RIGHT:  out << Format(".RightPos%s(%d, %d)", CharZoom(zoom.x), pos.x.GetA(), pos.x.GetB()); break;
+	case Ctrl::SIZE:   out << Format(".HSizePos%s(%d, %d)", CharZoom(zoom.x), pos.x.GetA(), pos.x.GetB()); break;
+	case Ctrl::CENTER: out << Format(".HCenterPos%s(%d, %d)", CharZoom(zoom.x), pos.x.GetB(), pos.x.GetA()); break;
 	}
 	switch(pos.y.GetAlign()) {
-	case Ctrl::TOP:    out << Format(".TopPosZ(%d, %d)", pos.y.GetA() - y, pos.y.GetB()); break;
-	case Ctrl::BOTTOM: out << Format(".BottomPosZ(%d, %d)", pos.y.GetA(), pos.y.GetB()); break;
-	case Ctrl::SIZE:   out << Format(".VSizePosZ(%d, %d)", pos.y.GetA(), pos.y.GetB()); break;
-	case Ctrl::CENTER: out << Format(".VCenterPosZ(%d, %d)", pos.y.GetB(), pos.y.GetA()); break;
+	case Ctrl::TOP:    out << Format(".TopPos%s(%d, %d)", CharZoom(zoom.y), pos.y.GetA() - y, pos.y.GetB()); break;
+	case Ctrl::BOTTOM: out << Format(".BottomPos%s(%d, %d)", CharZoom(zoom.y), pos.y.GetA(), pos.y.GetB()); break;
+	case Ctrl::SIZE:   out << Format(".VSizePos%s(%d, %d)", CharZoom(zoom.y), pos.y.GetA(), pos.y.GetB()); break;
+	case Ctrl::CENTER: out << Format(".VCenterPos%s(%d, %d)", CharZoom(zoom.y), pos.y.GetB(), pos.y.GetA()); break;
 	}
 	out.Remove(0);
 	return out;
diff -ruN uppsrc/ide/LayDes/laydes.cpp uppsrc/ide/LayDes/laydes.cpp
--- uppsrc/ide/LayDes/laydes.cpp	2013-05-25 23:14:35 +0400
+++ uppsrc/ide/LayDes/laydes.cpp	2013-05-31 10:59:19 +0400
@@ -1388,6 +1388,21 @@
 	}
 }
 
+void LayDes::ZoomLayout(bool zoom)
+{
+	if(currentlayout < 0)
+		return;
+	LayoutData& c = CurrentLayout();
+	for(int i = 0, n = c.item.GetCount(); i < n; ++i)
+		c.item[i].zoom.ZoomBoth(zoom);
+}
+
+void LayDes::LayoutMakeBar(Bar& bar)
+{
+	bar.Add("Zoomable layout items (default)", THISBACK1(ZoomLayout, true));
+	bar.Add("Not zoomable layout items", THISBACK1(ZoomLayout, false));
+}
+
 void LayDes::LayoutMenu(Bar& bar)
 {
 	bool iscursor = layoutlist.IsCursor();
@@ -1395,6 +1410,7 @@
 	bar.Add(iscursor, "Duplicate layout..", THISBACK(DuplicateLayout));
 	bar.Add(iscursor, "Rename layout..", THISBACK(RenameLayout));
 	bar.Add(iscursor, "Remove layout..", THISBACK(RemoveLayout));
+	bar.Add(iscursor, "Make", THISBACK(LayoutMakeBar));
 	bar.Separator();
 	bar.Add(iscursor && layoutlist.GetCursor() > 0,
 	        AK_MOVELAYOUTUP, LayImg::MoveUp(), THISBACK(MoveLayoutUp));
diff -ruN uppsrc/ide/LayDes/LayDes.h uppsrc/ide/LayDes/LayDes.h
--- uppsrc/ide/LayDes/LayDes.h	2013-05-25 23:14:35 +0400
+++ uppsrc/ide/LayDes/LayDes.h	2013-05-31 11:46:34 +0400
@@ -164,10 +164,24 @@
 	PropertyPane();
 };
 
+struct ZoomPos {
+	bool x, y;
+
+	ZoomPos(bool x, bool y) : x(x), y(y) {}
+	ZoomPos() : x(true), y(true)         {}
+	ZoomPos& ZoomX(bool zoom = true)     { x = zoom; return *this; }
+	ZoomPos& ZoomY(bool zoom = true)     { y = zoom; return *this; }
+	ZoomPos& ZoomBoth(bool zoom = true)  { x = y = zoom; return *this; }
+	ZoomPos& NoZoomX()                   { return ZoomX(false); }
+	ZoomPos& NoZoomY()                   { return ZoomY(false); }
+	ZoomPos& NoZoomBoth()                { return ZoomBoth(false); }
+};
+
 struct LayoutItem {
 	String              type;
 	String              variable;
 	Ctrl::LogPos        pos;
+	ZoomPos             zoom;
 	Array<ItemProperty> property;
 	bool                hide;
 	byte                charset;
@@ -414,6 +428,8 @@
 	void        NextLayout();
 	void        MoveLayoutUp();
 	void        MoveLayoutDown();
+	void        ZoomLayout(bool zoom);
+	void        LayoutMakeBar(Bar& bar);
 	void        LayoutMenu(Bar& bar);
 
 	void        EditBar(Bar& bar);
