diff -ruN bazaar/CtrlLibBoostPy/CtrlCore.cpp bazaar/CtrlLibBoostPy/CtrlCore.cpp
--- bazaar/CtrlLibBoostPy/CtrlCore.cpp	2011-11-06 07:29:02 +0400
+++ bazaar/CtrlLibBoostPy/CtrlCore.cpp	2013-05-26 10:12:21 +0400
@@ -88,7 +88,7 @@
 String CtrlToString(const Ctrl& c)
 {
 	return c.Name();
-	return String().Cat() << String(typeid(c).name()) << ": " << AsString(c.GetData());
+	return String(typeid(c).name()) << ": " << AsString(c.GetData());
 }
 
 enum PaintEnum {
diff -ruN bazaar/DeEncrypter/main.cpp bazaar/DeEncrypter/main.cpp
--- bazaar/DeEncrypter/main.cpp	2010-10-30 08:55:48 +0400
+++ bazaar/DeEncrypter/main.cpp	2013-05-26 10:09:32 +0400
@@ -74,13 +74,13 @@
 	fsf.Multi();
 	fsf.ClearTypes();
 	
-	if(!fsf.ExecuteOpen(String().Cat() << "Select files to " << ((encrypt)?("ENcrypt"):("DEcrypt")) ))
+	if(!fsf.ExecuteOpen(String() << "Select files to " << ((encrypt)?("ENcrypt"):("DEcrypt")) ))
 	{
 		ToInfo("Canceled");
 		return;
 	}
 	
-	if(!dirs.ExecuteSelectDir(String().Cat() << "Select directory where to put " << ((encrypt)?("ENcrypted"):("DEcrypted")) << " files (same file name used)"))
+	if(!dirs.ExecuteSelectDir(String() << "Select directory where to put " << ((encrypt)?("ENcrypted"):("DEcrypted")) << " files (same file name used)"))
 	{
 		ToInfo("Canceled");
 		return;
diff -ruN bazaar/DispatcherTest/main.cpp bazaar/DispatcherTest/main.cpp
--- bazaar/DispatcherTest/main.cpp	2012-10-07 14:00:50 +0400
+++ bazaar/DispatcherTest/main.cpp	2013-05-26 10:09:32 +0400
@@ -16,7 +16,7 @@
 	//pi.SetData(o);
 	pi.Set(o);
 	dl.SetData(o);
-	st.SetText(String().Cat() << o);
+	st.SetText(String() << o);
 }
 
 //
diff -ruN bazaar/DispatcherTest2/main.cpp bazaar/DispatcherTest2/main.cpp
--- bazaar/DispatcherTest2/main.cpp	2011-11-06 07:29:02 +0400
+++ bazaar/DispatcherTest2/main.cpp	2013-05-26 10:09:32 +0400
@@ -16,7 +16,7 @@
 	//pi.SetData(o);
 	pi.Set(o);
 	dl.SetData(o);
-	st.SetText(String().Cat() << o);
+	st.SetText(String() << o);
 }
 
 void MyPane::Dispatch(const int& o)
@@ -25,7 +25,7 @@
 	//pi.SetData(o);
 	pi.Set(o);
 	dl.SetData(o);
-	st.SetText(String().Cat() << o);
+	st.SetText(String() << o);
 }
 
 //
diff -ruN bazaar/PlotLib/PlotSymbol.cpp bazaar/PlotLib/PlotSymbol.cpp
--- bazaar/PlotLib/PlotSymbol.cpp	2010-12-13 19:27:42 +0400
+++ bazaar/PlotLib/PlotSymbol.cpp	2013-05-26 10:09:32 +0400
@@ -39,7 +39,7 @@
 }
 
 String PlotSymbol::ToString()const{
-	return String().Cat()<<s.cx<<"x"<<s.cy<<";"<<Color(c)<<";"<<Color(f)<<";"<<t;
+	return String()<<s.cx<<"x"<<s.cy<<";"<<Color(c)<<";"<<Color(f)<<";"<<t;
 }
 
 PlotSymbol* PlotSymbol::Copy()const{
diff -ruN bazaar/PointCtrlTest/main.cpp bazaar/PointCtrlTest/main.cpp
--- bazaar/PointCtrlTest/main.cpp	2011-01-05 05:06:51 +0400
+++ bazaar/PointCtrlTest/main.cpp	2013-05-26 10:09:32 +0400
@@ -38,22 +38,22 @@
 	double y = pc.GetDataY();
 	slx.SetData(x);
 	sly.SetData(y);
-	ToInfo(String().Cat() << "(" << x << "," << y << ")");
+	ToInfo(String() << "(" << x << "," << y << ")");
 }
 
 void PointCtrlTest::OnAddPoint()
 {
-	ToInfo(String().Cat() << "Added: XY(" << pc.vp.Top() << ")");
+	ToInfo(String() << "Added: XY(" << pc.vp.Top() << ")");
 }
 
 void PointCtrlTest::OnRemovePoint(int i)
 {
-	ToInfo(String().Cat() << "Removed Point @: " << i);
+	ToInfo(String() << "Removed Point @: " << i);
 }
 
 void PointCtrlTest::OnMovePoint(int i)
 {
-	ToInfo(String().Cat() << "MovePoint @: " << i << " XY(" << pc.vp[i] << ")");
+	ToInfo(String() << "MovePoint @: " << i << " XY(" << pc.vp[i] << ")");
 }
 
 GUI_APP_MAIN
diff -ruN bazaar/PopUpTest/main.cpp bazaar/PopUpTest/main.cpp
--- bazaar/PopUpTest/main.cpp	2011-01-05 05:06:51 +0400
+++ bazaar/PopUpTest/main.cpp	2013-05-26 10:09:32 +0400
@@ -3,7 +3,7 @@
 void PopUpTest::OkCB()
 {
 	String a = AsString(pu.ei.GetData());
-	drop.SetLabel(String().Cat() << "dropped OK, " << a);
+	drop.SetLabel(String() << "dropped OK, " << a);
 }
 
 void PopUpTest::CancelCB()
diff -ruN bazaar/Sound/SoundSystem.cpp bazaar/Sound/SoundSystem.cpp
--- bazaar/Sound/SoundSystem.cpp	2010-12-26 17:57:40 +0400
+++ bazaar/Sound/SoundSystem.cpp	2013-05-26 10:09:32 +0400
@@ -34,7 +34,7 @@
 }
 
 String SoundAPI::ToString()const{
-	return String().Cat() << name;
+	return String() << name;
 }
 
 /* SoundSystem */
diff -ruN bazaar/ValueCtrl/ValueCtrl.h bazaar/ValueCtrl/ValueCtrl.h
--- bazaar/ValueCtrl/ValueCtrl.h	2011-11-06 07:29:03 +0400
+++ bazaar/ValueCtrl/ValueCtrl.h	2013-05-26 10:09:32 +0400
@@ -29,7 +29,7 @@
 	int      Compare(const ValueEditKey& o) const { return SgnCompare(k, o.k); }
 	void     Serialize(Stream& s)            { s % k; }
 	String   ToString() const                { int i = GetValueTypeNoNameMap().Find(k); if(i>=0) return GetValueTypeNoNameMap()[i];
-                                               return GetValueTypeNoNameMap().Add(k, String().Cat() << "ValueTypeNo_" << k); }
+                                               return GetValueTypeNoNameMap().Add(k, String() << "ValueTypeNo_" << k); }
 	unsigned GetHashValue() const            { return UPP::GetHashValue(k); }
 	bool     IsNullInstance() const          { return IsNull(k); }
 
diff -ruN bazaar/WorkQueueTest2/main.cpp bazaar/WorkQueueTest2/main.cpp
--- bazaar/WorkQueueTest2/main.cpp	2010-08-18 06:04:35 +0400
+++ bazaar/WorkQueueTest2/main.cpp	2013-05-26 10:09:32 +0400
@@ -34,7 +34,7 @@
 
 	//show results
 	GuiLock __;
-	inf.Insert(inf.GetCursor(), String().Cat() << "-|" << i << "|-");
+	inf.Insert(inf.GetCursor(), String() << "-|" << i << "|-");
 	inf.SetCursor(inf.GetLength());
 }
 
diff -ruN examples/Puzzle/Puzzle.cpp examples/Puzzle/Puzzle.cpp
--- examples/Puzzle/Puzzle.cpp	2010-03-25 00:04:31 +0400
+++ examples/Puzzle/Puzzle.cpp	2013-05-26 10:09:32 +0400
@@ -114,7 +114,7 @@
 			if(box[i] != i + 1)
 				return;
 		String dim;
-		int& sm = score.GetAdd(String().Cat() << size.cx << "x" << size.cy);
+		int& sm = score.GetAdd(String() << size.cx << "x" << size.cy);
 		if(moves < sm) {
 			sm = moves;
 			PromptOK(t_("You win with the new best score!"));
diff -ruN rainbow/GtkMain/main.cpp rainbow/GtkMain/main.cpp
--- rainbow/GtkMain/main.cpp	2013-03-23 19:29:16 +0400
+++ rainbow/GtkMain/main.cpp	2013-05-26 10:09:32 +0400
@@ -60,7 +60,7 @@
 		};
 		Tuple2<int, const char *> *a = FindTuple(map, __countof(map), event & BUTTON);
 		Tuple2<int, const char *> *b = FindTuple(map, __countof(map), event & ACTION);
-		Log(String().Cat() << "MOUSE " << (a ? a->b : "") << '|' << (b ? b->b : "") << ' ' << p);
+		Log(String() << "MOUSE " << (a ? a->b : "") << '|' << (b ? b->b : "") << ' ' << p);
 
 		return TopWindow::MouseEvent(event, p, zdelta, keyflags);
 	}
@@ -95,13 +95,13 @@
 		w.DrawRect(GetSize(), White());
 		int y = 0;
 		w.DrawText(0, y += fcy, AsString(pos));
-		w.DrawText(0, y += fcy, String().Cat() << "Shift: " << (int)GetShift());
-		w.DrawText(0, y += fcy, String().Cat() << "Ctrl: " << (int)GetCtrl());
-		w.DrawText(0, y += fcy, String().Cat() << "Alt: " << (int)GetAlt());
-		w.DrawText(0, y += fcy, String().Cat() << "CapsLock: " << (int)GetCapsLock());
-		w.DrawText(0, y += fcy, String().Cat() << "MouseLeft: " << (int)GetMouseLeft());
-		w.DrawText(0, y += fcy, String().Cat() << "MouseRight: " << (int)GetMouseRight());
-		w.DrawText(0, y += fcy, String().Cat() << "MouseMiddle: " << (int)GetMouseMiddle());
+		w.DrawText(0, y += fcy, String() << "Shift: " << (int)GetShift());
+		w.DrawText(0, y += fcy, String() << "Ctrl: " << (int)GetCtrl());
+		w.DrawText(0, y += fcy, String() << "Alt: " << (int)GetAlt());
+		w.DrawText(0, y += fcy, String() << "CapsLock: " << (int)GetCapsLock());
+		w.DrawText(0, y += fcy, String() << "MouseLeft: " << (int)GetMouseLeft());
+		w.DrawText(0, y += fcy, String() << "MouseRight: " << (int)GetMouseRight());
+		w.DrawText(0, y += fcy, String() << "MouseMiddle: " << (int)GetMouseMiddle());
 		y = 0;
 		for(int i = 0; i < log.GetCount(); i++) {
 			w.DrawText(100, y, log[i]);
diff -ruN rainbow/WinAlt/WinAltClip.cpp rainbow/WinAlt/WinAltClip.cpp
--- rainbow/WinAlt/WinAltClip.cpp	2011-06-14 12:08:29 +0400
+++ rainbow/WinAlt/WinAltClip.cpp	2013-05-26 10:09:32 +0400
@@ -61,7 +61,7 @@
 	String s = txt;
 	s << "\n" << GetLastErrorMessage();
 	MessageBox(::GetActiveWindow(), s, "Clipboard error", MB_ICONSTOP | MB_OK | MB_APPLMODAL);
-	ClipboardLog(String().Cat() << s << " ERROR");
+	ClipboardLog(String() << s << " ERROR");
 #endif
 }
 
@@ -70,7 +70,7 @@
 void ClipboardError(const char *txt, int format)
 {
 #ifdef flagCHECKCLIPBOARD
-	ClipboardError(String().Cat() << txt << ' ' << FromWin32CF(format));
+	ClipboardError(String() << txt << ' ' << FromWin32CF(format));
 #endif
 }
 
diff -ruN rainbow/WinAlt/WinAltDnD.cpp rainbow/WinAlt/WinAltDnD.cpp
--- rainbow/WinAlt/WinAltDnD.cpp	2011-06-14 12:08:29 +0400
+++ rainbow/WinAlt/WinAltDnD.cpp	2013-05-26 10:09:32 +0400
@@ -44,7 +44,7 @@
 
 String AsString(POINTL p)
 {
-	return String().Cat() << "[" << p.x << ", " << p.y << "]";
+	return String() << "[" << p.x << ", " << p.y << "]";
 }
 
 struct UDropTarget : public IDropTarget {
diff -ruN reference/ArrayCtrl/main.cpp reference/ArrayCtrl/main.cpp
--- reference/ArrayCtrl/main.cpp	2010-03-25 00:04:32 +0400
+++ reference/ArrayCtrl/main.cpp	2013-05-26 10:09:32 +0400
@@ -22,7 +22,7 @@
 struct MyConvert : public Convert {
 	Value Format(const Value& v) const {
 		ValueArray va = v;
-		return String().Cat() << va[0] << " - " << va[1] << " - " << va[2];
+		return String() << va[0] << " - " << va[1] << " - " << va[2];
 	}
 };
 
@@ -37,7 +37,7 @@
 void ArrayCtrlExample::DoubleClick()
 {
 	if(array.IsCursor())
-		PromptOK(String().Cat() << "ID1: " << array.Get(ID1) << ", first column" << array.Get(0));
+		PromptOK(String() << "ID1: " << array.Get(ID1) << ", first column" << array.Get(0));
 }
 
 ArrayCtrlExample::ArrayCtrlExample()
diff -ruN reference/brc/bin.cpp reference/brc/bin.cpp
--- reference/brc/bin.cpp	2010-03-25 00:04:32 +0400
+++ reference/brc/bin.cpp	2013-05-26 10:09:32 +0400
@@ -8,27 +8,27 @@
 
 CONSOLE_APP_MAIN
 {
-	puts(String().Cat() << "brc length: " << bin_brc_length);
+	puts(String() << "brc length: " << bin_brc_length);
 	fflush(stdout);
-	puts(String().Cat() << "cpp length: " << bin_cpp_length);
+	puts(String() << "cpp length: " << bin_cpp_length);
 	fflush(stdout);
-	puts(String().Cat() << "all count:  " << bin_all_count);
+	puts(String() << "all count:  " << bin_all_count);
 	fflush(stdout);
-//	puts(String().Cat() << "cpp: <<<\n" << (const char *)bin_cpp << "\n>>>");
+//	puts(String() << "cpp: <<<\n" << (const char *)bin_cpp << "\n>>>");
 	MemReadStream in1(bin_cpp, bin_cpp_length);
-	puts(String().Cat() << "cpp: <<<\n" << BZ2Decompress(in1) << "\n>>>");
+	puts(String() << "cpp: <<<\n" << BZ2Decompress(in1) << "\n>>>");
 	fflush(stdout);
-//	puts(String().Cat() << "brc: <<<\n" << (const char *)bin_brc << "\n>>>");
+//	puts(String() << "brc: <<<\n" << (const char *)bin_brc << "\n>>>");
 	MemReadStream in2(bin_brc, bin_brc_length);
-	puts(String().Cat() << "brc: <<<\n" << BZ2Decompress(in2) << "\n>>>");
+	puts(String() << "brc: <<<\n" << BZ2Decompress(in2) << "\n>>>");
 	fflush(stdout);
 	for(int i = 0; i < bin_all_count; i++) {
-		puts(String().Cat() << "all length[" << i << "]: " << bin_all_length[i]);
+		puts(String() << "all length[" << i << "]: " << bin_all_length[i]);
 		fflush(stdout);
-		puts(String().Cat() << "all files[" << i << "]: " << bin_all_files[i]);
+		puts(String() << "all files[" << i << "]: " << bin_all_files[i]);
 		fflush(stdout);
 		MemReadStream in3(bin_all[i], bin_all_length[i]);
-		puts(String().Cat() << "all[" << i << "]: <<<\n" << BZ2Decompress(in3) << "\n>>>");
+		puts(String() << "all[" << i << "]: <<<\n" << BZ2Decompress(in3) << "\n>>>");
 		fflush(stdout);
 	}
 }
diff -ruN reference/Common/Common.cpp reference/Common/Common.cpp
--- reference/Common/Common.cpp	2010-03-25 00:04:32 +0400
+++ reference/Common/Common.cpp	2013-05-26 10:09:32 +0400
@@ -6,7 +6,7 @@
 	String a;
 	int    b;
 
-	String   ToString() const            { return String().Cat() << '(' << a << ", " << b << ')'; }
+	String   ToString() const            { return String() << '(' << a << ", " << b << ')'; }
 	unsigned GetHashValue() const        { return CombineHash() << a << b; }
 	int      Compare(const Foo& x) const { return CombineCompare(a, x.a)(b, x.b); }
 	void     Serialize(Stream& s)        { s % a % b; }
diff -ruN reference/CtrlRetriever/main.cpp reference/CtrlRetriever/main.cpp
--- reference/CtrlRetriever/main.cpp	2010-03-25 00:04:32 +0400
+++ reference/CtrlRetriever/main.cpp	2013-05-26 10:09:32 +0400
@@ -21,6 +21,6 @@
 	dlg.Run();
 	r.Retrieve();
 
-	PromptOK(String().Cat() << "text: [* " << DeQtf(text) << "]&"
+	PromptOK(String() << "text: [* " << DeQtf(text) << "]&"
 	                        << "option: [* " << (option ? "true" : "false"));
 }
diff -ruN reference/GuiWebCrawler/GuiWebCrawler.cpp reference/GuiWebCrawler/GuiWebCrawler.cpp
--- reference/GuiWebCrawler/GuiWebCrawler.cpp	2012-04-18 03:25:06 +0400
+++ reference/GuiWebCrawler/GuiWebCrawler.cpp	2013-05-26 10:09:32 +0400
@@ -90,8 +90,8 @@
 			else {
 				String html = w.http;
 				total += html.GetCount();
-				finished.Add(u, w.http.IsError() ? String().Cat() << w.http.GetErrorDesc()
-				                                 : String().Cat() << w.http.GetStatusCode()
+				finished.Add(u, w.http.IsError() ? String() << w.http.GetErrorDesc()
+				                                 : String() << w.http.GetStatusCode()
 				                                   << ' ' << w.http.GetReasonPhrase()
 				                                   << " (" << html.GetCount() << " bytes)",
 				             w.urli);
diff -ruN reference/RescaleFilter/main.cpp reference/RescaleFilter/main.cpp
--- reference/RescaleFilter/main.cpp	2013-04-19 19:45:37 +0400
+++ reference/RescaleFilter/main.cpp	2013-05-26 10:09:32 +0400
@@ -37,7 +37,7 @@
 			w.DrawImage(x, 600, RescaleFilter(img, Size(250, 250), RectC(40, 40, 100, 100), m));
 		}
 		
-		w.DrawText(GetSize().cx - 200, 40, String().Cat() << "Elapsed " << tm << "s");
+		w.DrawText(GetSize().cx - 200, 40, String() << "Elapsed " << tm << "s");
 	}
 	
 	void Sync()
diff -ruN reference/Switch/main.cpp reference/Switch/main.cpp
--- reference/Switch/main.cpp	2010-03-25 00:04:32 +0400
+++ reference/Switch/main.cpp	2013-05-26 10:09:32 +0400
@@ -38,5 +38,5 @@
 	dlg.s2 <<= 2;
 	if(dlg.Execute() != IDOK)
 		return;
-	PromptOK(String().Cat() << "First: " << ~dlg.s1 << ", second: " << ~dlg.s2);
+	PromptOK(String() << "First: " << ~dlg.s1 << ", second: " << ~dlg.s2);
 }
diff -ruN reference/Value/Value.cpp reference/Value/Value.cpp
--- reference/Value/Value.cpp	2012-07-12 23:59:28 +0400
+++ reference/Value/Value.cpp	2013-05-26 10:09:32 +0400
@@ -13,7 +13,7 @@
 
 	int      Compare(const RichFoo& o) const { return CombineCompare(a, o.a)(b, o.b); }
 	void     Serialize(Stream& s)            { s % a % b; }
-	String   ToString() const                { return String().Cat() << a << ", " << b; }
+	String   ToString() const                { return String() << a << ", " << b; }
 	unsigned GetHashValue() const            { return CombineHash(a, b); }
 	bool     IsNullInstance() const          { return IsNull(a); }
 
diff -ruN tutorial/Core01/main.cpp tutorial/Core01/main.cpp
--- tutorial/Core01/main.cpp	2010-03-25 00:04:32 +0400
+++ tutorial/Core01/main.cpp	2013-05-26 10:09:32 +0400
@@ -17,7 +17,7 @@
 	for(int i = 0; i < 10; i++)
 		a << i << ", ";
 	DUMP(a);
-	DUMP(String().Cat() << "Number is " << 123 << ".");
+	DUMP(String() << "Number is " << 123 << ".");
 	a = "0123456789";
 	DUMP(a.GetLength());
 	a.Insert(6, "<inserted>");
diff -ruN tutorial/Gui20c/main.cpp tutorial/Gui20c/main.cpp
--- tutorial/Gui20c/main.cpp	2010-03-25 00:04:32 +0400
+++ tutorial/Gui20c/main.cpp	2013-05-26 10:09:32 +0400
@@ -22,7 +22,7 @@
 	MyApp app;
 	switch(app.Run()) {
 	case IDOK:
-		PromptOK(String().Cat() << "OK: " << ~app.date);
+		PromptOK(String() << "OK: " << ~app.date);
 		break;
 	case IDCANCEL:
 		Exclamation("Canceled");
diff -ruN tutorial/Gui20d/main.cpp tutorial/Gui20d/main.cpp
--- tutorial/Gui20d/main.cpp	2010-03-25 00:04:32 +0400
+++ tutorial/Gui20d/main.cpp	2013-05-26 10:09:32 +0400
@@ -11,7 +11,7 @@
 	CtrlLayoutOKCancel(app, "MyApp");
 	switch(app.Run()) {
 	case IDOK:
-		PromptOK(String().Cat() << "OK: " << ~app.date);
+		PromptOK(String() << "OK: " << ~app.date);
 		break;
 	case IDCANCEL:
 		Exclamation("Canceled");
diff -ruN uppbox/MakeInstall4/Main.cpp uppbox/MakeInstall4/Main.cpp
--- uppbox/MakeInstall4/Main.cpp	2012-09-24 17:37:59 +0400
+++ uppbox/MakeInstall4/Main.cpp	2013-05-26 10:09:32 +0400
@@ -20,7 +20,7 @@
 	String r;
 	int q = Sys(s, r);
 	if(q)
-		Error(String().Cat() << "Failed: " << s << "\r\n" <<
+		Error(String() << "Failed: " << s << "\r\n" <<
 		      "Exit code: " << q << "\r\n" <<
 		      "Output: " << r);
 	return r;
diff -ruN uppbox/uppweb/www.cpp uppbox/uppweb/www.cpp
--- uppbox/uppweb/www.cpp	2013-03-23 19:29:16 +0400
+++ uppbox/uppweb/www.cpp	2013-05-26 10:09:32 +0400
@@ -269,10 +269,10 @@
 String Www(const char *topic, int lang, String topicLocation = "topic://uppweb/www/")
 {
 	String strLang = ToLower(LNGAsText(lang));
-	String www = GatherTopics(tt, String().Cat() << topicLocation << topic << "$" << strLang);
+	String www = GatherTopics(tt, String() << topicLocation << topic << "$" << strLang);
 	if (www != "index.html")
 		return www;
-	return GatherTopics(tt, String().Cat() << topicLocation << topic << "$" << "en-us");
+	return GatherTopics(tt, String() << topicLocation << topic << "$" << "en-us");
 }
 
 String FolderLinks(String package, String group, int lang)
@@ -328,7 +328,7 @@
 	Sort(ls, Isort());
 	for(int i = 0; i < ls.GetCount(); i++) {
 		String name = ls[i];
-		String link = String().Cat() << www << '$' << name << "$" << ToLower(LNGAsText(language)) << ".html";
+		String link = String() << www << '$' << name << "$" << ToLower(LNGAsText(language)) << ".html";
 		Topic& topic = tt.Add(link);
 		topic.title = name;
 		String fn = AppendFileName(
@@ -950,7 +950,7 @@
 
 	Date d = GetSysDate();
 	lastUpdate = HtmlItalic() / HtmlArial(8) / HtmlFontColor(Gray()) /
-	                   (String().Cat() << "Last update " << GetSysDate());
+	                   (String() << "Last update " << GetSysDate());
 
 //	Vector<String> amazon = Split(LoadFile(GetRcFile("amazon.txt")), '\n');//440
 
diff -ruN uppbox/Uvs2/DlgFiles.cpp uppbox/Uvs2/DlgFiles.cpp
--- uppbox/Uvs2/DlgFiles.cpp	2010-03-25 00:04:33 +0400
+++ uppbox/Uvs2/DlgFiles.cpp	2013-05-26 11:06:24 +0400
@@ -1292,7 +1292,7 @@
 	try {
 		DlgSyncProgress progress("Stahování zmìn");
 		FtpClient ftp;
-		progress.SetText(String().Cat() << "Otevírám server '" << job.host << "'");
+		progress.SetText(String() << "Otevírám server '" << job.host << "'");
 		OpenFTP(ftp);
 		progress.SetText("Stahuji index posledního bloku");
 		int hblock = GetHostBlock(ftp);
@@ -1301,10 +1301,10 @@
 		int lblock = GetLocalBlock();
 		if(!IsNull(lblock)) {
 			if(lblock > hblock)
-				throw Exc(String().Cat() << "Index posledního bloku v lokálním archivu (" << lblock
+				throw Exc(String() << "Index posledního bloku v lokálním archivu (" << lblock
 				<< ") je vìtší než na serveru (" << hblock << ").");
 			if(lblock == hblock)
-				throw Exc(String().Cat() << "Vzdálený archiv neobsahuje žádné nové zmìny.");
+				throw Exc(String() << "Vzdálený archiv neobsahuje žádné nové zmìny.");
 		}
 		Array<UvsDataBlock> blocks = Download(ftp, Nvl(lblock, 0) + 1, hblock, true, progress);
 		for(int i = 0; i < blocks.GetCount(); i++)
@@ -1477,7 +1477,7 @@
 								repv = true;
 								ft = lft - 1;
 								au = "Lost";
-								sep = String().Cat() << '#' << ft << ' ' << AsCString(au) << '\n';
+								sep = String() << '#' << ft << ' ' << AsCString(au) << '\n';
 							}
 						}
 						else {
@@ -1490,7 +1490,7 @@
 									auto_repair_rtime)) {
 									repv = true;
 									ft = rt;
-									sep = String().Cat() << '#' << ft << ' ' << AsCString(au) << '\n';
+									sep = String() << '#' << ft << ' ' << AsCString(au) << '\n';
 								}
 							}
 							if(IsNull(au)) {
@@ -1500,7 +1500,7 @@
 									auto_repair_author)) {
 									repv = true;
 									au = "Unknown";
-									sep = String().Cat() << '#' << ft << ' ' << AsCString(au) << '\n';
+									sep = String() << '#' << ft << ' ' << AsCString(au) << '\n';
 								}
 							}
 							lft = ft;
@@ -2712,7 +2712,7 @@
 	ConAdd(t_("Reading changes: "));
 	int load_total = last - first + 1;
 	for(int i = first; i <= last; i++) {
-		ConAdd(String().Cat() << (i == first || (i - first) % 5 ? " " : "\n   ") << i);
+		ConAdd(String() << (i == first || (i - first) % 5 ? " " : "\n   ") << i);
 		String path = FormatInt(i) + ".udb";
 		String filename = job.GetLocalPath(path);
 		String file = LoadFile(filename);
@@ -3214,7 +3214,7 @@
 
 void DlgFiles::ConLine(const char *text, bool arc_con)
 {
-	ConAdd(String().Cat() << text << '\n', arc_con);
+	ConAdd(String() << text << '\n', arc_con);
 }
 
 bool DlgFiles::IsSyncTime()
@@ -3248,7 +3248,7 @@
 
 void DlgFiles::SetProgressCount(int count, int total)
 {
-	progress.Text(String().Cat() << count << " / " << total);
+	progress.Text(String() << count << " / " << total);
 	progress.Set(count, total);
 }
 
diff -ruN uppbox/Uvs2/util.cpp uppbox/Uvs2/util.cpp
--- uppbox/Uvs2/util.cpp	2010-03-25 00:04:33 +0400
+++ uppbox/Uvs2/util.cpp	2013-05-26 11:08:25 +0400
@@ -1262,7 +1262,7 @@
 	static const char incomplete[] = "Neúplná nebo poškozená data, ofset ";
 	int dirlen = 0, datalen = 0;
 	if(e - p < BLOCK_KEY_LENGTH + 6 * 4)
-		throw Exc(String().Cat() << incomplete << 0);
+		throw Exc(String() << incomplete << 0);
 	if(memcmp(p, block_key, BLOCK_KEY_LENGTH))
 		throw Exc("Neplatný identifikaèní kód datového bloku.");
 	p += BLOCK_KEY_LENGTH;
@@ -1286,7 +1286,7 @@
 	p += 8;
 	int item_bytes = (version <= 1 ? 8 : 16);
 	if(e - p < item_bytes * down_count)
-		throw Exc(String().Cat() << incomplete << (p - ~data));
+		throw Exc(String() << incomplete << (p - ~data));
 	Vector<int> data_length;
 	Vector<dword> data_crc;
 	Vector<int> version_length;
diff -ruN uppdev/BiCubic/main.cpp uppdev/BiCubic/main.cpp
--- uppdev/BiCubic/main.cpp	2013-05-02 21:17:17 +0400
+++ uppdev/BiCubic/main.cpp	2013-05-26 10:09:32 +0400
@@ -199,7 +199,7 @@
 		w.DrawImage(GetSize().cx - 400, 100, rescale(TestImg::img2(), 400, 400, k, ka, ~method));
 		w.DrawImage(GetSize().cx - 400, 500, rescale(TestImg::img3(), 400, 400, k, ka, ~method));
 		
-		w.DrawText(GetSize().cx - 200, 40, String().Cat() << "Time " << tm);
+		w.DrawText(GetSize().cx - 200, 40, String() << "Time " << tm);
 
 		for(int i = 0; i < TestImg().GetCount(); i++) {
 			w.DrawImage(250 * i, GetSize().cy - 84, Rescale(TestImg().Get(i), 84, 84));
diff -ruN uppdev/brc/bin.cpp uppdev/brc/bin.cpp
--- uppdev/brc/bin.cpp	2010-03-25 00:04:51 +0400
+++ uppdev/brc/bin.cpp	2013-05-26 10:09:33 +0400
@@ -8,26 +8,26 @@
 
 CONSOLE_APP_MAIN
 {
-	puts(String().Cat() << "brc length: " << bin_brc_length);
+	puts(String() << "brc length: " << bin_brc_length);
 	fflush(stdout);
-	puts(String().Cat() << "cpp length: " << bin_cpp_length);
+	puts(String() << "cpp length: " << bin_cpp_length);
 	fflush(stdout);
-	puts(String().Cat() << "all count:  " << bin_all_count);
+	puts(String() << "all count:  " << bin_all_count);
 	fflush(stdout);
-//	puts(String().Cat() << "cpp: <<<\n" << (const char *)bin_cpp << "\n>>>");
+//	puts(String() << "cpp: <<<\n" << (const char *)bin_cpp << "\n>>>");
 	MemReadStream in1(bin_cpp, bin_cpp_length);
-	puts(String().Cat() << "cpp: <<<\n" << BZ2Decompress(in1) << "\n>>>");
+	puts(String() << "cpp: <<<\n" << BZ2Decompress(in1) << "\n>>>");
 	fflush(stdout);
-//	puts(String().Cat() << "brc: <<<\n" << (const char *)bin_brc << "\n>>>");
+//	puts(String() << "brc: <<<\n" << (const char *)bin_brc << "\n>>>");
 	MemReadStream in2(bin_brc, bin_brc_length);
-	puts(String().Cat() << "brc: <<<\n" << BZ2Decompress(in2) << "\n>>>");
+	puts(String() << "brc: <<<\n" << BZ2Decompress(in2) << "\n>>>");
 	fflush(stdout);
 	for(int i = 0; i < bin_all_count; i++) {
-		puts(String().Cat() << "all length[" << i << "]: " << bin_all_length[i]);
+		puts(String() << "all length[" << i << "]: " << bin_all_length[i]);
 		fflush(stdout);
-		puts(String().Cat() << "all files[" << i << "]: " << bin_all_files[i]);
+		puts(String() << "all files[" << i << "]: " << bin_all_files[i]);
 		fflush(stdout);
-		puts(String().Cat() << "all[" << i << "]: <<<\n" << BZ2Decompress(String(bin_all[i], bin_all_length[i])) << "\n>>>");
+		puts(String() << "all[" << i << "]: <<<\n" << BZ2Decompress(String(bin_all[i], bin_all_length[i])) << "\n>>>");
 		fflush(stdout);
 	}
 }
diff -ruN uppdev/Cham/main.cpp uppdev/Cham/main.cpp
--- uppdev/Cham/main.cpp	2010-03-25 00:04:41 +0400
+++ uppdev/Cham/main.cpp	2013-05-26 10:09:33 +0400
@@ -135,7 +135,7 @@
 	void PutLooks(const char *s, const Value *look, int count = 4)
 	{
 		for(int i = 0; i < count; i++)
-			PutLook(String().Cat() << s << " " << i, look[i]);
+			PutLook(String() << s << " " << i, look[i]);
 	}
 	
 	MyApp() {
diff -ruN uppdev/coff/uld/linkjob.cpp uppdev/coff/uld/linkjob.cpp
--- uppdev/coff/uld/linkjob.cpp	2010-03-25 00:04:51 +0400
+++ uppdev/coff/uld/linkjob.cpp	2013-05-26 10:09:33 +0400
@@ -327,7 +327,7 @@
 
 String LinkJob::Usage()
 {
-	return String().Cat()
+	return String()
 		<< NFormat("uld COFF linker, version %d.%d.r%d, release date: %`\n%s",
 			ULD_VERSION_MAJOR, ULD_VERSION_MINOR, ULD_VERSION_RELEASE, ULD_DATE, ULD_COPYRIGHT) << "\n"
 		"\n"
@@ -654,7 +654,7 @@
 					break;
 
 				case 'l':
-					LoadFile(String().Cat() << "lib" << ptr << ".a", false);
+					LoadFile(String() << "lib" << ptr << ".a", false);
 					break;
 
 				case 'M':
@@ -3078,7 +3078,7 @@
 		cache_library_index.Clear();
 		for(int i = 0; i < object_cache.GetCount(); i++) {
 			const Cache& obj = object_cache[i];
-			cache_name_index.Add(String().Cat() << obj.library << ':' << obj.file);
+			cache_name_index.Add(String() << obj.library << ':' << obj.file);
 			cache_library_index.Add(obj.library);
 		}
 	}
diff -ruN uppdev/CoreTopics/NetNode.cpp uppdev/CoreTopics/NetNode.cpp
--- uppdev/CoreTopics/NetNode.cpp	2010-03-25 00:04:41 +0400
+++ uppdev/CoreTopics/NetNode.cpp	2013-05-26 11:10:22 +0400
@@ -91,7 +91,7 @@
 			}
 			if(n.lpComment && *n.lpComment)
 				if(nn.name.GetCount())
-					nn.name = String().Cat() << FromSystemCharset(n.lpComment)
+					nn.name = FromSystemCharset(n.lpComment)
 					                         << " (" << nn.name << ")";
 				else
 					nn.name = FromSystemCharset(n.lpComment);
diff -ruN uppdev/CoreTopics/Value.h uppdev/CoreTopics/Value.h
--- uppdev/CoreTopics/Value.h	2010-03-25 00:04:41 +0400
+++ uppdev/CoreTopics/Value.h	2013-05-26 10:09:33 +0400
@@ -285,7 +285,7 @@
 	RawValueRep()                             {}
 	static const RawValueRep *Cast(const Value::Void *p) {
 		ASSERT_(dynamic_cast<const RawValueRep *>(p),
-		        String().Cat() << "Invalid value conversion: "
+		        String() << "Invalid value conversion: "
 		                       << typeid(*p).name() << " -> " << typeid(T).name());
 		return (const RawValueRep *) p;
 	}
@@ -438,7 +438,7 @@
 	static Value::Void *Create(Stream& s)            { return new RichValueRep(s); }
 	static const RichValueRep *Cast(const Value::Void *p) {
 		ASSERT_(dynamic_cast<const RichValueRep *>(p),
-		        String().Cat() << "Invalid value conversion: "
+		        String() << "Invalid value conversion: "
 		                       << typeid(*p).name() << " -> " << typeid(T).name());
 		return (const RichValueRep *) p;
 	}
diff -ruN uppdev/CoreTopics/XML.cpp uppdev/CoreTopics/XML.cpp
--- uppdev/CoreTopics/XML.cpp	2010-03-25 00:04:41 +0400
+++ uppdev/CoreTopics/XML.cpp	2013-05-26 10:09:33 +0400
@@ -415,13 +415,13 @@
 void  XmlParser::PassTag(const char *tag)
 {
 	if(!Tag(tag))
-		throw XmlError(String().Cat() << '\'' << tag << "'\' tag expected");
+		throw XmlError(String() << '\'' << tag << "'\' tag expected");
 }
 
 void  XmlParser::PassTag(const String& tag)
 {
 	if(!Tag(tag))
-		throw XmlError(String().Cat() << '\'' << tag << "'\' tag expected");
+		throw XmlError(String() << '\'' << tag << "'\' tag expected");
 }
 
 bool  XmlParser::IsEnd()
@@ -452,7 +452,7 @@
 void  XmlParser::PassEnd()
 {
 	if(!End())
-		throw XmlError(String().Cat() << "Expected \'" << (stack.GetCount() ? stack.Top().tag : String()) << "\' end-tag");
+		throw XmlError(String() << "Expected \'" << (stack.GetCount() ? stack.Top().tag : String()) << "\' end-tag");
 }
 
 bool  XmlParser::TagE(const char *tag)
diff -ruN uppdev/DropListBug/main.cpp uppdev/DropListBug/main.cpp
--- uppdev/DropListBug/main.cpp	2010-03-25 00:04:42 +0400
+++ uppdev/DropListBug/main.cpp	2013-05-26 10:09:33 +0400
@@ -30,7 +30,7 @@
 	
 	void AddButtonClicked()
 	{
-		dropList.Add(String().Cat() << chr++);
+		dropList.Add(String() << chr++);
 		dropList.SetIndex(dropList.GetCount() - 1);
 	}
 	
diff -ruN uppdev/Flex/Flex.h uppdev/Flex/Flex.h
--- uppdev/Flex/Flex.h	2010-03-25 00:04:42 +0400
+++ uppdev/Flex/Flex.h	2013-05-26 10:09:33 +0400
@@ -66,7 +66,7 @@
 	int FindUpperBound(const T& x, const Less& less = StdLess<T>()) const;
 	int FindUpperBound(const T& x) const { return FindUpperBound(x, StdLess<T>()); }
 	
-	String GetInfo() const { return String().Cat() << "NBLK:" << NBLK << ", blocks:" << blk_count; }
+	String GetInfo() const { return String() << "NBLK:" << NBLK << ", blocks:" << blk_count; }
 
 	Flex(int sh = 11) {
 		Init();
diff -ruN uppdev/Gen2/main.cpp uppdev/Gen2/main.cpp
--- uppdev/Gen2/main.cpp	2010-03-25 00:04:43 +0400
+++ uppdev/Gen2/main.cpp	2013-05-26 10:09:33 +0400
@@ -257,7 +257,7 @@
 		spot[0][i].kind = TRAP;
 		spot[PMSK][i].kind = TRAP;
 	}*/
-	Title(String().Cat() << "Step: " << step << " Gen: " << gen << ", pop: " << creature.GetCount()
+	Title(String() << "Step: " << step << " Gen: " << gen << ", pop: " << creature.GetCount()
 	      << ", born: " << born << ", died: " << died << " best: " << best);
 	Refresh();
 }
diff -ruN uppdev/NetBrowse/main.cpp uppdev/NetBrowse/main.cpp
--- uppdev/NetBrowse/main.cpp	2010-03-25 00:04:45 +0400
+++ uppdev/NetBrowse/main.cpp	2013-05-26 10:09:33 +0400
@@ -90,7 +90,7 @@
 	}
 	if(n.lpComment && *n.lpComment)
 		if(name.GetCount())
-			return String().Cat() << n.lpComment << " (" << name << ")";
+			return String() << n.lpComment << " (" << name << ")";
 		else
 			return n.lpComment;
 	return name;
diff -ruN uppdev/Network/Network.cpp uppdev/Network/Network.cpp
--- uppdev/Network/Network.cpp	2010-03-25 00:04:45 +0400
+++ uppdev/Network/Network.cpp	2013-05-26 10:09:33 +0400
@@ -36,7 +36,7 @@
 					/*
 						LOG("Is a file share");
 						LOG(lpnr[ctr].lpRemoteName);
-						FindFile ff(String().Cat() << lpnr[ctr].lpRemoteName << "\\*.*");
+						FindFile ff(String() << lpnr[ctr].lpRemoteName << "\\*.*");
 						while(ff) {
 							LOG("  " << ff.GetName());
 							ff.Next();
diff -ruN uppdev/OffsetBug/SvgDraw.cpp uppdev/OffsetBug/SvgDraw.cpp
--- uppdev/OffsetBug/SvgDraw.cpp	2010-03-25 00:04:45 +0400
+++ uppdev/OffsetBug/SvgDraw.cpp	2013-05-26 10:09:33 +0400
@@ -14,7 +14,7 @@
 	_svgNode.SetAttr("xmlns:xlink", "http://www.w3.org/1999/xlink");
 	_svgNode.SetAttr("width", xPixels);
 	_svgNode.SetAttr("height", yPixels);
-	_svgNode.SetAttr("viewBox", String().Cat() << "0 0 " << xPixels << " " << yPixels);
+	_svgNode.SetAttr("viewBox", String() << "0 0 " << xPixels << " " << yPixels);
 	
 	_defsNode = &_svgNode.Add("defs");
 	_currentParentNode = &_svgNode;
@@ -49,7 +49,7 @@
 void SvgDraw::OffsetOp(Point p)
 {
 	Begin();
-	_currentParentNode->SetAttr("transform", String().Cat() << "translate(" << p.x << ", " << p.y << ")");
+	_currentParentNode->SetAttr("transform", String() << "translate(" << p.x << ", " << p.y << ")");
 	////actual_offset += p;
 }
 
@@ -68,7 +68,7 @@
 	path.SetAttr("d", pathD);
 	clipPath.SetAttr("id", id);
 	
-	_currentParentNode->SetAttr("clip-path", String().Cat() << "url(#" << id << ")");
+	_currentParentNode->SetAttr("clip-path", String() << "url(#" << id << ")");
 
 	return false; // todo:
 }
@@ -88,9 +88,9 @@
 	path.SetAttr("d", pathD);
 	clipPath.SetAttr("id", id);
 	
-	_currentParentNode->SetAttr("transform", String().Cat() << "translate(" << r.left << ", " << r.top << ")");
+	_currentParentNode->SetAttr("transform", String() << "translate(" << r.left << ", " << r.top << ")");
 	////actual_offset += r.TopLeft();
-	_currentParentNode->SetAttr("clip-path", String().Cat() << "url(#" << id << ")");
+	_currentParentNode->SetAttr("clip-path", String() << "url(#" << id << ")");
 	
 	return false; // todo:
 }
@@ -98,14 +98,14 @@
 bool SvgDraw::ExcludeClipOp(const Rect& r)
 {
 	//todo:
-	PromptOK(String().Cat() << "ExcludeClipOp(" << r << ") not implemented");
+	PromptOK(String() << "ExcludeClipOp(" << r << ") not implemented");
 	return false;
 }
 
 bool SvgDraw::IntersectClipOp(const Rect& r)
 {
 	//todo:
-	PromptOK(String().Cat() << "IntersectClipOp(" << r << ") not implemented");
+	PromptOK(String() << "IntersectClipOp(" << r << ") not implemented");
 	return false;
 }
 
@@ -119,7 +119,7 @@
 bool SvgDraw::IsPaintingOp(const Rect& r) const
 {
 	//todo:
-	PromptOK(String().Cat() << "IsPaintingOp(" << r << ") not implemented");
+	PromptOK(String() << "IsPaintingOp(" << r << ") not implemented");
 	return false;
 }
 
@@ -290,7 +290,7 @@
 
 String SvgDraw::GetNextId()
 {
-	return String().Cat() << "id" << _nextId++;
+	return String() << "id" << _nextId++;
 }
 
 END_UPP_NAMESPACE
diff -ruN uppdev/Puzzle/Puzzle.cpp uppdev/Puzzle/Puzzle.cpp
--- uppdev/Puzzle/Puzzle.cpp	2010-03-25 00:04:46 +0400
+++ uppdev/Puzzle/Puzzle.cpp	2013-05-26 10:09:33 +0400
@@ -111,7 +111,7 @@
 			if(box[i] != i + 1)
 				return;
 		String dim;
-		int& sm = score.GetAdd(String().Cat() << size.cx << "x" << size.cy);
+		int& sm = score.GetAdd(String() << size.cx << "x" << size.cy);
 		if(moves < sm) {
 			sm = moves;
 			PromptOK(t_("You win with the new best score!"));
diff -ruN uppdev/RichTextP/EncodeHTML.cpp uppdev/RichTextP/EncodeHTML.cpp
--- uppdev/RichTextP/EncodeHTML.cpp	2010-03-25 00:04:48 +0400
+++ uppdev/RichTextP/EncodeHTML.cpp	2013-05-26 10:09:33 +0400
@@ -39,12 +39,12 @@
 
 String HtmlDot(int q, Zoom z)
 {
-	return String().Cat() << ' ' << z * q << "px";
+	return String() << ' ' << z * q << "px";
 }
 
 String HtmlDotl(int q, Zoom z)
 {
-	return String().Cat() << ' ' << max((int)!!q, z * q) << "px";
+	return String() << ' ' << max((int)!!q, z * q) << "px";
 }
 
 String HtmlStyleColor(Color c, const char *cl = "color")
diff -ruN uppdev/SqlExp/SqlExp.cpp uppdev/SqlExp/SqlExp.cpp
--- uppdev/SqlExp/SqlExp.cpp	2012-05-07 02:31:22 +0400
+++ uppdev/SqlExp/SqlExp.cpp	2013-05-26 10:09:33 +0400
@@ -48,7 +48,7 @@
 
 CONSOLE_APP_MAIN
 {
-	DLOG(SqlCompile(PGSQL, String().Cat() << '\t' << TABLE(COLUMN1, COLUMN2) << '\t' << " from \t" << TABLE << "\t"));
+	DLOG(SqlCompile(PGSQL, String() << '\t' << TABLE(COLUMN1, COLUMN2) << '\t' << " from \t" << TABLE << "\t"));
 //	return;
 	qtf << "[C1 {{1:1 SqlExp C`+`+:: PostgreSQL";
 	EXP(Select(COLUMN).From(TABLE));
diff -ruN uppdev/SvgDraw/SvgDraw.cpp uppdev/SvgDraw/SvgDraw.cpp
--- uppdev/SvgDraw/SvgDraw.cpp	2010-03-25 00:04:49 +0400
+++ uppdev/SvgDraw/SvgDraw.cpp	2013-05-26 10:09:33 +0400
@@ -23,7 +23,7 @@
 	StringBuffer final;
 	final << XmlHeader() 
 	      << XmlDocType("svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"")
-	      << svg(String().Cat() << "<defs>\n" << ~_defs << "</defs>\n" << ~_body);
+	      << svg(String() << "<defs>\n" << ~_defs << "</defs>\n" << ~_body);
 	return ~final;
 }
 
@@ -45,7 +45,7 @@
 void SvgDraw::OffsetOp(Point p)
 {
 	Begin();
-	AddAttr("transform", String().Cat() << "translate(" << p.x << ", " << p.y << ")");
+	AddAttr("transform", String() << "translate(" << p.x << ", " << p.y << ")");
 	_body << ">\n";
 	actual_offset += p;
 }
@@ -53,7 +53,7 @@
 bool SvgDraw::ClipOp(const Rect& r)
 {
 	Begin();
-	AddAttr("clip-path", String().Cat() << "url(#" << AddPath(r) << ")");
+	AddAttr("clip-path", String() << "url(#" << AddPath(r) << ")");
 	_body << ">\n";
 
 	return false; // todo:
@@ -62,8 +62,8 @@
 bool SvgDraw::ClipoffOp(const Rect& r)
 {
 	Begin();
-	AddAttr("transform", String().Cat() << "translate(" << r.left << ", " << r.top << ")");
-	AddAttr("clip-path", String().Cat() << "url(#" << AddPath(r.Offseted(-r.TopLeft())) << ")");
+	AddAttr("transform", String() << "translate(" << r.left << ", " << r.top << ")");
+	AddAttr("clip-path", String() << "url(#" << AddPath(r.Offseted(-r.TopLeft())) << ")");
 	_body << ">\n";
 	actual_offset += r.TopLeft();
 	
@@ -73,14 +73,14 @@
 bool SvgDraw::ExcludeClipOp(const Rect& r)
 {
 	//todo:
-	PromptOK(String().Cat() << "ExcludeClipOp(" << r << ") not implemented");
+	PromptOK(String() << "ExcludeClipOp(" << r << ") not implemented");
 	return false;
 }
 
 bool SvgDraw::IntersectClipOp(const Rect& r)
 {
 	//todo:
-	PromptOK(String().Cat() << "IntersectClipOp(" << r << ") not implemented");
+	PromptOK(String() << "IntersectClipOp(" << r << ") not implemented");
 	return false;
 }
 
@@ -94,7 +94,7 @@
 bool SvgDraw::IsPaintingOp(const Rect& r) const
 {
 	//todo:
-	PromptOK(String().Cat() << "IsPaintingOp(" << r << ") not implemented");
+	PromptOK(String() << "IsPaintingOp(" << r << ") not implemented");
 	return false;
 }
 
@@ -251,13 +251,13 @@
 	XmlTag t("text");
 	t("x", xAttr)("y", y + font.GetHeight())("style", style);
 	if (angle != 0)
-		t("transform", String().Cat() << "rotate(-" << (angle / 10) << ", " << x << ", " << y << ")");
+		t("transform", String() << "rotate(-" << (angle / 10) << ", " << x << ", " << y << ")");
 	AddTag(t, DeXml(WString(text).ToString()));
 }
 
 String SvgDraw::GetNextId()
 {
-	return String().Cat() << "id" << _nextId++;
+	return String() << "id" << _nextId++;
 }
 
 String SvgDraw::AddPath(Rect const &r)
diff -ruN uppdev/UWord/UWord.cpp uppdev/UWord/UWord.cpp
--- uppdev/UWord/UWord.cpp	2010-03-25 00:04:49 +0400
+++ uppdev/UWord/UWord.cpp	2013-05-26 10:09:33 +0400
@@ -285,7 +285,7 @@
 
 GUI_APP_MAIN
 {
-//	DUMP(XGetSelectionOwner(Xdisplay, XAtom(String().Cat() << "_NET_WM_CM_S" << Xscreenno)) != None);
+//	DUMP(XGetSelectionOwner(Xdisplay, XAtom(String() << "_NET_WM_CM_S" << Xscreenno)) != None);
 //	return;
 
 //	DUMP((Xheight*25.4/XheightMM));
diff -ruN uppdev/wince/wince.cpp uppdev/wince/wince.cpp
--- uppdev/wince/wince.cpp	2010-03-25 00:04:55 +0400
+++ uppdev/wince/wince.cpp	2013-05-26 10:09:33 +0400
@@ -28,25 +28,25 @@
 
 	virtual void LeftDown(Point p, dword keyflags)
 	{
-		lbl = String().Cat() << "LEFTDOWN " << p;
+		lbl = String() << "LEFTDOWN " << p;
 		Refresh();
 	}
 
 	void LeftDouble(Point p, dword keyflags)
 	{
-		lbl = String().Cat() << "LEFTDOUBLE " << p;
+		lbl = String() << "LEFTDOUBLE " << p;
 		Refresh();
 	}
 
 	virtual void LeftUp(Point p, dword keyflags)
 	{
-		lbl = String().Cat() << "LEFTUP " << p;
+		lbl = String() << "LEFTUP " << p;
 		Refresh();
 	}
 
 	virtual void MouseMove(Point p, dword keyflags)
 	{
-		lbl = String().Cat() << "MOUSEMOVE " << p;
+		lbl = String() << "MOUSEMOVE " << p;
 		Refresh();
 	}
 
diff -ruN uppsrc/BuildAll/BuildAll.cpp uppsrc/BuildAll/BuildAll.cpp
--- uppsrc/BuildAll/BuildAll.cpp	2012-11-12 23:31:17 +0400
+++ uppsrc/BuildAll/BuildAll.cpp	2013-05-26 10:09:33 +0400
@@ -34,7 +34,7 @@
 {
 	String flags = release ? "r" : "b";
 	String mn = release ? "R" : "D";
-	String n = String().Cat() << nest << '-' << bm << '-' << mn;
+	String n = String() << nest << '-' << bm << '-' << mn;
 	Cout() << n << '\n';
 	String outdir = AppendFileName(output, n);
 	DeleteFolderDeep(outdir);
diff -ruN uppsrc/coff/uar/lib.cpp uppsrc/coff/uar/lib.cpp
--- uppsrc/coff/uar/lib.cpp	2010-03-25 00:05:06 +0400
+++ uppsrc/coff/uar/lib.cpp	2013-05-26 10:09:33 +0400
@@ -14,7 +14,7 @@
 
 String UARArchiveJob::Usage()
 {
-	return String().Cat()
+	return String()
 		<< NFormat("uar COFF librarian, version %d.%d.r%d, release date %`\n%s",
 		UAR_VERSION_MAJOR, UAR_VERSION_MINOR, UAR_VERSION_RELEASE, UAR_DATE, UAR_COPYRIGHT) << "\n"
 		"\n"
diff -ruN uppsrc/coff/uld/linkjob.cpp uppsrc/coff/uld/linkjob.cpp
--- uppsrc/coff/uld/linkjob.cpp	2010-03-25 00:05:06 +0400
+++ uppsrc/coff/uld/linkjob.cpp	2013-05-26 10:09:33 +0400
@@ -301,7 +301,7 @@
 
 String LinkJob::Usage()
 {
-	return String().Cat()
+	return String()
 		<< NFormat("uld COFF linker, version %d.%d.r%d, release date: %`\n%s",
 			ULD_VERSION_MAJOR, ULD_VERSION_MINOR, ULD_VERSION_RELEASE, ULD_DATE, ULD_COPYRIGHT) << "\n"
 		"\n"
@@ -2833,7 +2833,7 @@
 		cache_library_index.Clear();
 		for(int i = 0; i < object_cache.GetCount(); i++) {
 			const Cache& obj = object_cache[i];
-			cache_name_index.Add(String().Cat() << obj.library << ':' << obj.file);
+			cache_name_index.Add(String() << obj.library << ':' << obj.file);
 			cache_library_index.Add(obj.library);
 		}
 	}
diff -ruN uppsrc/Core/Complex.h uppsrc/Core/Complex.h
--- uppsrc/Core/Complex.h	2012-04-10 15:31:52 +0400
+++ uppsrc/Core/Complex.h	2013-05-26 10:09:33 +0400
@@ -23,7 +23,7 @@
 
 template<> inline bool IsNull(const Complex& r) { return r.real() < DOUBLE_NULL_LIM || r.imag() < DOUBLE_NULL_LIM; }
 template<> inline unsigned GetHashValue(const Complex& x) { return CombineHash(x.real(), x.imag()); }
-template<> inline String AsString(const std::complex<double>& x) { return String().Cat() << "(" << x.real() << "," << x.imag() << ")"; }
+template<> inline String AsString(const std::complex<double>& x) { return String() << "(" << x.real() << "," << x.imag() << ")"; }
 template<> inline String AsString(const Complex& x) { return AsString((const std::complex<double>&)x); }
 
 template<> inline dword ValueTypeNo(const Complex*) { return COMPLEX_V; }
diff -ruN uppsrc/Core/InetUtil.cpp uppsrc/Core/InetUtil.cpp
--- uppsrc/Core/InetUtil.cpp	2013-05-16 19:57:12 +0400
+++ uppsrc/Core/InetUtil.cpp	2013-05-26 10:09:33 +0400
@@ -8,7 +8,7 @@
 	{ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
 	static const char *month[] =
 	{ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
-	return String().Cat()
+	return String()
 		<< dayofweek[DayOfWeek(tm)] << ", "
 		<< (int)tm.day << ' ' << month[tm.month - 1]
 		<< ' ' << (int)tm.year
diff -ruN uppsrc/Core/NetNode.cpp uppsrc/Core/NetNode.cpp
--- uppsrc/Core/NetNode.cpp	2010-03-25 00:04:56 +0400
+++ uppsrc/Core/NetNode.cpp	2013-05-26 11:12:34 +0400
@@ -99,7 +99,7 @@
 			}
 			if(n.lpComment && *n.lpComment)
 				if(nn.name.GetCount())
-					nn.name = String().Cat() << FromSystemCharset(n.lpComment)
+					nn.name = FromSystemCharset(n.lpComment)
 					                         << " (" << nn.name << ")";
 				else
 					nn.name = FromSystemCharset(n.lpComment);
diff -ruN uppsrc/Core/Tuple.h uppsrc/Core/Tuple.h
--- uppsrc/Core/Tuple.h	2011-11-06 07:29:10 +0400
+++ uppsrc/Core/Tuple.h	2013-05-26 10:09:33 +0400
@@ -14,7 +14,7 @@
 	
 	unsigned GetHashValue() const             { return CombineHash(a, b); }
 
-	String   ToString() const                 { return String().Cat() << '(' << a << ", " << b << ')'; }
+	String   ToString() const                 { return String() << '(' << a << ", " << b << ')'; }
 };
 
 template<typename A, typename B>
@@ -50,7 +50,7 @@
 	
 	unsigned GetHashValue() const             { return CombineHash(a, b, c); }
 	
-	String   ToString() const                 { return String().Cat() << '(' << a << ", " << b << ", " << c << ')'; }
+	String   ToString() const                 { return String() << '(' << a << ", " << b << ", " << c << ')'; }
 };
 
 template<typename A, typename B, typename C>
@@ -89,7 +89,7 @@
 	
 	unsigned GetHashValue() const             { return CombineHash(a, b, c, d); }
 
-	String   ToString() const                 { return String().Cat() << '(' << a << ", " << b << ", " << c << ", " << d << ')'; }
+	String   ToString() const                 { return String() << '(' << a << ", " << b << ", " << c << ", " << d << ')'; }
 };
 
 template<typename A, typename B, typename C, typename D>
diff -ruN uppsrc/Core/Value.hpp uppsrc/Core/Value.hpp
--- uppsrc/Core/Value.hpp	2012-09-15 11:42:31 +0400
+++ uppsrc/Core/Value.hpp	2013-05-26 10:09:33 +0400
@@ -178,14 +178,14 @@
 #ifdef _DEBUG
 		dword t = GetValueTypeNo<T>();
 		ASSERT_(t < 255 && (t == STRING_V ? IsString() : Is((byte)t)),
-		        String().Cat() << "Invalid value conversion: "
+		        String() << "Invalid value conversion: "
 		                       << GetName() << " -> " << typeid(T).name());
 #endif
 		return *(T*)&data;
 	}
 	const RawValueRep<T> *x = dynamic_cast<const RawValueRep<T>*>(ptr());
 	ASSERT_(x,
-	        String().Cat() << "Invalid value conversion: "
+	        String() << "Invalid value conversion: "
 	                       << GetName() << " -> " << typeid(T).name());
 	return x->Get();
 }
diff -ruN uppsrc/Core/XML.cpp uppsrc/Core/XML.cpp
--- uppsrc/Core/XML.cpp	2013-05-16 19:57:12 +0400
+++ uppsrc/Core/XML.cpp	2013-05-26 10:09:33 +0400
@@ -469,13 +469,13 @@
 void  XmlParser::PassTag(const char *tag)
 {
 	if(!Tag(tag))
-		throw XmlError(String().Cat() << '\'' << tag << "'\' tag expected");
+		throw XmlError(String() << '\'' << tag << "'\' tag expected");
 }
 
 void  XmlParser::PassTag(const String& tag)
 {
 	if(!Tag(tag))
-		throw XmlError(String().Cat() << '\'' << tag << "'\' tag expected");
+		throw XmlError(String() << '\'' << tag << "'\' tag expected");
 }
 
 bool  XmlParser::IsEnd()
@@ -506,7 +506,7 @@
 void  XmlParser::PassEnd()
 {
 	if(!End())
-		throw XmlError(String().Cat() << "Expected \'" << (stack.GetCount() ? stack.Top().tag : String()) << "\' end-tag");
+		throw XmlError(String() << "Expected \'" << (stack.GetCount() ? stack.Top().tag : String()) << "\' end-tag");
 }
 
 bool  XmlParser::TagE(const char *tag)
diff -ruN uppsrc/CppBase/Parser.cpp uppsrc/CppBase/Parser.cpp
--- uppsrc/CppBase/Parser.cpp	2012-11-29 23:34:05 +0400
+++ uppsrc/CppBase/Parser.cpp	2013-05-26 10:09:33 +0400
@@ -688,7 +688,7 @@
 			Decl& a = r.Add();
 			a.name = lex.GetId();
 			a.function = true;
-			a.natural = String().Cat() << "void " << a.name << "(Http& http)";
+			a.natural = String() << "void " << a.name << "(Http& http)";
 			Decl& p = a.param.Add();
 			p.name = "http";
 			p.type = "Http";
@@ -705,7 +705,7 @@
 			Decl& a = r.Add();
 			a.name = lex.GetId();
 			a.function = true;
-			a.natural = String().Cat() << "void " << a.name << "(RpcData& rpc)";
+			a.natural = String() << "void " << a.name << "(RpcData& rpc)";
 			Decl& p = a.param.Add();
 			p.name = "rpc";
 			p.type = "RpcData";
diff -ruN uppsrc/CtrlCore/Ctrl.cpp uppsrc/CtrlCore/Ctrl.cpp
--- uppsrc/CtrlCore/Ctrl.cpp	2013-04-16 22:18:32 +0400
+++ uppsrc/CtrlCore/Ctrl.cpp	2013-05-26 11:14:14 +0400
@@ -17,7 +17,7 @@
 #ifdef PLATFORM_WIN32
 	MessageBox(NULL, s, GetExeTitle(), MB_OK | MB_ICONQUESTION);
 #else
-	fputs(String().Cat() << GetExeTitle() << ": " << s << '\n', stderr);
+	fputs(GetExeTitle() << ": " << s << '\n', stderr);
 #endif
 	return true;
 }
diff -ruN uppsrc/CtrlCore/CtrlKbd.cpp uppsrc/CtrlCore/CtrlKbd.cpp
--- uppsrc/CtrlCore/CtrlKbd.cpp	2012-09-03 20:19:09 +0400
+++ uppsrc/CtrlCore/CtrlKbd.cpp	2013-05-26 10:09:33 +0400
@@ -190,7 +190,7 @@
 {
 	GuiLock __;
 	if(IsUsrLog())
-		UsrLogT(6, String().Cat() << "SETFOCUS " << Desc(this));
+		UsrLogT(6, String() << "SETFOCUS " << Desc(this));
 	LLOG("Ctrl::SetFocus " << Desc(this));
 	LLOG("focusCtrlWnd " << UPP::Name(focusCtrlWnd));
 	LLOG("Ctrl::SetFocus0 -> deferredSetFocus = NULL; was: " << UPP::Name(defferedSetFocus));
diff -ruN uppsrc/CtrlCore/Win32Clip.cpp uppsrc/CtrlCore/Win32Clip.cpp
--- uppsrc/CtrlCore/Win32Clip.cpp	2012-11-07 14:14:27 +0400
+++ uppsrc/CtrlCore/Win32Clip.cpp	2013-05-26 10:09:33 +0400
@@ -68,7 +68,7 @@
 	String s = txt;
 	s << "\n" << GetLastErrorMessage();
 	MessageBox(::GetActiveWindow(), s, "Clipboard error", MB_ICONSTOP | MB_OK | MB_APPLMODAL);
-	ClipboardLog(String().Cat() << s << " ERROR");
+	ClipboardLog(String() << s << " ERROR");
 }
 
 String FromWin32CF(int cf);
@@ -77,7 +77,7 @@
 {
 	if(!DebugClipboard()) 
 		return;
-	ClipboardError(String().Cat() << txt << ' ' << FromWin32CF(format));
+	ClipboardError(String() << txt << ' ' << FromWin32CF(format));
 }
 
 bool ClipboardOpen()
diff -ruN uppsrc/CtrlCore/Win32DnD.cpp uppsrc/CtrlCore/Win32DnD.cpp
--- uppsrc/CtrlCore/Win32DnD.cpp	2012-11-19 13:58:09 +0400
+++ uppsrc/CtrlCore/Win32DnD.cpp	2013-05-26 10:09:33 +0400
@@ -44,7 +44,7 @@
 
 String AsString(POINTL p)
 {
-	return String().Cat() << "[" << p.x << ", " << p.y << "]";
+	return String() << "[" << p.x << ", " << p.y << "]";
 }
 
 struct UDropTarget : public IDropTarget {
diff -ruN uppsrc/CtrlCore/X11Wnd.cpp uppsrc/CtrlCore/X11Wnd.cpp
--- uppsrc/CtrlCore/X11Wnd.cpp	2012-12-06 07:59:36 +0400
+++ uppsrc/CtrlCore/X11Wnd.cpp	2013-05-26 10:09:33 +0400
@@ -675,7 +675,7 @@
 bool Ctrl::IsCompositedGui()
 {
 	GuiLock __;
-	static bool b = XGetSelectionOwner(Xdisplay, XAtom(String().Cat() << "_NET_WM_CM_S" << Xscreenno)) != None;
+	static bool b = XGetSelectionOwner(Xdisplay, XAtom(String() << "_NET_WM_CM_S" << Xscreenno)) != None;
 	return b;
 }
 
diff -ruN uppsrc/Esc/Esc.cpp uppsrc/Esc/Esc.cpp
--- uppsrc/Esc/Esc.cpp	2011-11-06 07:29:11 +0400
+++ uppsrc/Esc/Esc.cpp	2013-05-26 10:09:33 +0400
@@ -440,14 +440,14 @@
 double Esc::Number(const EscValue& a, const char *oper)
 {
 	if(!a.IsNumber())
-		ThrowError(String().Cat() << "number expected for '" << oper << "', encountered " << Lims(a.ToString()));
+		ThrowError(String() << "number expected for '" << oper << "', encountered " << Lims(a.ToString()));
 	return a.GetNumber();
 }
 
 int Esc::Int(const EscValue& a, const char *oper)
 {
 	if(!a.IsInt())
-		ThrowError(String().Cat() << "integer expected for '" << oper << "', encountered " << Lims(a.ToString()));
+		ThrowError(String() << "integer expected for '" << oper << "', encountered " << Lims(a.ToString()));
 	return a.GetInt();
 }
 
diff -ruN uppsrc/Esc/EscRun.cpp uppsrc/Esc/EscRun.cpp
--- uppsrc/Esc/EscRun.cpp	2010-03-25 00:05:02 +0400
+++ uppsrc/Esc/EscRun.cpp	2013-05-26 10:09:33 +0400
@@ -76,7 +76,7 @@
 String EscEscape::DumpType(int i)
 {
 	if(i < arg.GetCount())
-		return String().Cat() << " (" << arg[i].GetTypeName() << " present)";
+		return String() << " (" << arg[i].GetTypeName() << " present)";
 	else
 		return " (not enough arguments)";
 }
@@ -85,7 +85,7 @@
 {
 	if(i < arg.GetCount() && arg[i].IsNumber())
 		return;
-	ThrowError(String().Cat() << "number expected as parameter " << i + 1 << InCall()
+	ThrowError(String() << "number expected as parameter " << i + 1 << InCall()
 	           << DumpType(i));
 }
 
@@ -107,7 +107,7 @@
 {
 	if(i < arg.GetCount() && arg[i].IsArray())
 		return;
-	ThrowError(String().Cat() << "array expected as parameter " << i + 1 << InCall()
+	ThrowError(String() << "array expected as parameter " << i + 1 << InCall()
 	           << DumpType(i));
 }
 
@@ -115,7 +115,7 @@
 {
 	if(i < arg.GetCount() && arg[i].IsMap())
 		return;
-	ThrowError(String().Cat() << "map expected as parameter " << i + 1 << InCall());
+	ThrowError(String() << "map expected as parameter " << i + 1 << InCall());
 }
 
 void Escape(ArrayMap<String, EscValue>& globals, const char *function, Callback1<EscEscape&> escape)
diff -ruN uppsrc/Geom/Draw/hrr.cpp uppsrc/Geom/Draw/hrr.cpp
--- uppsrc/Geom/Draw/hrr.cpp	2012-04-10 15:31:52 +0400
+++ uppsrc/Geom/Draw/hrr.cpp	2013-05-26 11:15:48 +0400
@@ -1466,7 +1466,7 @@
 		decoder = CreateDecoder(info);
 		if(decoder.IsEmpty()) {
 			draw.DrawText(cdest.left, cdest.top,
-				String().Cat() << "Unsupported HRR encoding: " << info.GetMethod(), StdFont());
+				String() << "Unsupported HRR encoding: " << info.GetMethod(), StdFont());
 			draw.End();
 			LLOG(EndIndent << "//HRR:x: encoder not found, exiting");
 			return;
@@ -1766,7 +1766,7 @@
 	}
 	One<StreamRasterEncoder> encoder = CreateEncoder(info);
 	if(!encoder)
-		throw Exc(String().Cat() << "Unsupported HRR encoding: " << info.GetMethod());
+		throw Exc(String() << "Unsupported HRR encoding: " << info.GetMethod());
 
 	bool abort = false;
 	try
diff -ruN uppsrc/Geom/Draw/pathDraw.cpp uppsrc/Geom/Draw/pathDraw.cpp
--- uppsrc/Geom/Draw/pathDraw.cpp	2010-03-25 00:05:02 +0400
+++ uppsrc/Geom/Draw/pathDraw.cpp	2013-05-26 11:16:51 +0400
@@ -451,7 +451,7 @@
 			else if(*p == '$')
 			{ // style name
 				if(*++p != '\"')
-					throw Exc(String().Cat() << "oèekáván znak \", nalezeno: " << StringSample(p, 10));
+					throw Exc(String() << "oèekáván znak \", nalezeno: " << StringSample(p, 10));
 				p = ParseCString(p + 1, name);
 			}
 			else if(*p == '\"')
@@ -459,24 +459,24 @@
 				String sn;
 				p = ParseCString(p + 1, sn);
 				if(*p != '=')
-					throw Exc(String().Cat() << "oèekáváno '=', nalezeno: " << StringSample(p, 10));
+					throw Exc(String() << "oèekáváno '=', nalezeno: " << StringSample(p, 10));
 				if(IsNull(sn))
-					throw Exc(String().Cat() << "název stylu je prázdný");
+					throw Exc(String() << "název stylu je prázdný");
 				for(p++; *p && *p != '\n' && (byte)*p <= ' '; p++)
 					;
 				PathStyle ps;
 				p = ps.Decode(p);
 				if(!p)
-					throw Exc(String().Cat() << "neplatná definice stylu '" << name << "'");
+					throw Exc(String() << "neplatná definice stylu '" << name << "'");
 				if(map.Find(sn) < 0 || update_existing)
 					Set(sn, ps);
 			}
 			else
-				throw Exc(String().Cat() << "neplatný zaèátek øádku: " << StringSample(p, 10));
+				throw Exc(String() << "neplatný zaèátek øádku: " << StringSample(p, 10));
 	}
 	catch(Exc e)
 	{
-		throw Exc(String().Cat() << "øádek " << line << ": " << e);
+		throw Exc(String() << "øádek " << line << ": " << e);
 	}
 }
 
diff -ruN uppsrc/Geom/fp3.cpp uppsrc/Geom/fp3.cpp
--- uppsrc/Geom/fp3.cpp	2010-03-25 00:05:02 +0400
+++ uppsrc/Geom/fp3.cpp	2013-05-26 10:09:33 +0400
@@ -151,7 +151,7 @@
 
 String Matrixf3::ToString() const
 {
-	return String().Cat() << "[x = " << x << ", y = " << y << ", z = " << z << ", a = " << a << "]";
+	return String() << "[x = " << x << ", y = " << y << ", z = " << z << ", a = " << a << "]";
 }
 
 Matrixf3 Matrixf3Move(Pointf3 vector)
diff -ruN uppsrc/Geom/geometry.cpp uppsrc/Geom/geometry.cpp
--- uppsrc/Geom/geometry.cpp	2011-04-07 22:37:18 +0400
+++ uppsrc/Geom/geometry.cpp	2013-05-26 10:09:33 +0400
@@ -263,7 +263,7 @@
 
 String Matrixf::ToString() const
 {
-	return String().Cat() << "[x = " << x << ", y = " << y << ", a = " << a << "]";
+	return String() << "[x = " << x << ", y = " << y << ", a = " << a << "]";
 }
 
 END_UPP_NAMESPACE
diff -ruN uppsrc/ide/Assist.cpp uppsrc/ide/Assist.cpp
--- uppsrc/ide/Assist.cpp	2013-04-04 14:33:26 +0400
+++ uppsrc/ide/Assist.cpp	2013-05-26 10:09:33 +0400
@@ -612,7 +612,7 @@
 			String h;
 			for(int i = 0; i < include_back; i++)
 				h << "../";
-			Paste(ToUnicode(String().Cat() << "#include " 
+			Paste(ToUnicode(String() << "#include " 
 			                << (include_local ? "\"" : "<")
 			                << h << include_path
 			                << f.name
diff -ruN uppsrc/ide/Browser/Base.cpp uppsrc/ide/Browser/Base.cpp
--- uppsrc/ide/Browser/Base.cpp	2011-11-06 07:29:11 +0400
+++ uppsrc/ide/Browser/Base.cpp	2013-05-26 10:09:33 +0400
@@ -46,7 +46,7 @@
 void BrowserScanError(int line, const String& text)
 {
 	if(s_console)
-		PutConsole(String().Cat() << s_file << " (" << line << "): " << text);
+		PutConsole(String() << s_file << " (" << line << "): " << text);
 }
 
 void SaveCodeBase()
diff -ruN uppsrc/ide/Builders/CppBuilder.cpp uppsrc/ide/Builders/CppBuilder.cpp
--- uppsrc/ide/Builders/CppBuilder.cpp	2012-04-10 15:31:52 +0400
+++ uppsrc/ide/Builders/CppBuilder.cpp	2013-05-26 10:09:33 +0400
@@ -2,7 +2,7 @@
 
 void PutCompileTime(int time, int count)
 {
-	PutConsole(String().Cat() << count << " file(s) compiled in " << GetPrintTime(time)
+	PutConsole(String() << count << " file(s) compiled in " << GetPrintTime(time)
 	           << " " << int(GetTickCount() - time) / count << " msec/file");
 }
 
diff -ruN uppsrc/ide/Builders/MakeFile.cpp uppsrc/ide/Builders/MakeFile.cpp
--- uppsrc/ide/Builders/MakeFile.cpp	2012-04-10 15:31:52 +0400
+++ uppsrc/ide/Builders/MakeFile.cpp	2013-05-26 10:09:33 +0400
@@ -120,7 +120,7 @@
 	}
 
 	makefile.config << outdir << " = $(UPPOUT)"
-		<< GetMakePath(AdjustMakePath(String().Cat() << package << '/' << method << '-' << Join(x, "-") << '/')) << "\n"
+		<< GetMakePath(AdjustMakePath(String() << package << '/' << method << '-' << Join(x, "-") << '/')) << "\n"
 		<< macros << " = " << macdef << "\n";
 
 	makefile.install << "\t-mkdir -p $(" << outdir << ")\n";
diff -ruN uppsrc/ide/Core/Hdepend.cpp uppsrc/ide/Core/Hdepend.cpp
--- uppsrc/ide/Core/Hdepend.cpp	2010-03-25 00:05:06 +0400
+++ uppsrc/ide/Core/Hdepend.cpp	2013-05-26 10:09:33 +0400
@@ -313,7 +313,7 @@
 	else {
 		info.time = ff.GetLastWriteTime();
 		if(info.time > GetSysTime() + 10)
-			PutConsole(String().Cat() << "WARNING: " << path << " has invalid (future) time " << info.time);
+			PutConsole(String() << "WARNING: " << path << " has invalid (future) time " << info.time);
 		ScanFile(path, ii);
 	}
 	return ii;
@@ -396,7 +396,7 @@
 			if(ff) {
 				Time tm = ff.GetLastWriteTime();
 				if(tm > GetSysTime() + 10)
-					PutConsole(String().Cat() << "WARNING: " << dep[i] << " has invalid (future) time " << tm);
+					PutConsole(String() << "WARNING: " << dep[i] << " has invalid (future) time " << tm);
 				if(tm > h)
 					h = tm;
 			}
@@ -419,7 +419,7 @@
 		return true;
 	for(int i = 0; i < info.depend.GetCount(); i++)
 		if(!info.bydefine[i] && !map[info.depend[i]].CanBlitz()) {
-			PutVerbose(String().Cat() << map.GetKey(info.depend[i])
+			PutVerbose(String() << map.GetKey(info.depend[i])
 			           << "(1) : blocks BLITZ of " << path);
 			return false;
 		}
diff -ruN uppsrc/ide/Core/Package.cpp uppsrc/ide/Core/Package.cpp
--- uppsrc/ide/Core/Package.cpp	2012-08-25 16:37:38 +0400
+++ uppsrc/ide/Core/Package.cpp	2013-05-26 10:09:33 +0400
@@ -64,7 +64,7 @@
 		return MatchWhen_X(when, flag);
 	}
 	catch(CParser::Error e) {
-		PutConsole(String().Cat()
+		PutConsole(String()
 		           << "Invalid When expression: " << AsCString(when) << ": " << e);
 		return false;
 	}
diff -ruN uppsrc/ide/Cpp.cpp uppsrc/ide/Cpp.cpp
--- uppsrc/ide/Cpp.cpp	2011-11-06 07:29:11 +0400
+++ uppsrc/ide/Cpp.cpp	2013-05-26 10:09:33 +0400
@@ -107,7 +107,7 @@
 void AssistScanError(int line, const String& text)
 {
 #ifdef _DEBUG_X_0
-	PutVerbose(String().Cat() << "(" << line << "): " << text);
+	PutVerbose(String() << "(" << line << "): " << text);
 #endif
 }
 
diff -ruN uppsrc/ide/Debug.cpp uppsrc/ide/Debug.cpp
--- uppsrc/ide/Debug.cpp	2012-02-02 17:40:22 +0400
+++ uppsrc/ide/Debug.cpp	2013-05-26 10:09:33 +0400
@@ -86,7 +86,7 @@
 			break;
 		case RUN_CONSOLE:
 			ShowConsole();
-			PutConsole(String().Cat() << "Executing: " << cmdline);
+			PutConsole(String() << "Executing: " << cmdline);
 			console.Sync();
 			exitcode = h->ExecuteWithInput(cmdline);
 			PutConsole("Finished in " + GetPrintTime(time) + ", exit code: " + AsString(exitcode));
diff -ruN uppsrc/ide/Debuggers/Data.cpp uppsrc/ide/Debuggers/Data.cpp
--- uppsrc/ide/Debuggers/Data.cpp	2010-03-25 00:05:06 +0400
+++ uppsrc/ide/Debuggers/Data.cpp	2013-05-26 10:09:33 +0400
@@ -317,7 +317,7 @@
 			Val typeval;
 			typeval.address = val.address;
 			TypeVal(typeval, ffs.pdbtype, t.modbase);
-			TreeNode(node, String().Cat() << '[' << ffs.name << ']', typeval);
+			TreeNode(node, String() << '[' << ffs.name << ']', typeval);
 		}
 */
 	}
diff -ruN uppsrc/ide/Debuggers/Gdb.cpp uppsrc/ide/Debuggers/Gdb.cpp
--- uppsrc/ide/Debuggers/Gdb.cpp	2011-01-23 04:02:10 +0400
+++ uppsrc/ide/Debuggers/Gdb.cpp	2013-05-26 10:09:33 +0400
@@ -61,7 +61,7 @@
 
 String Bpoint(Host& host, const String& file, int line)
 {
-	return String().Cat() << Filter(host.GetHostPath(NormalizePath(file)), CharFilterReSlash) << ":" << line + 1;
+	return String() << Filter(host.GetHostPath(NormalizePath(file)), CharFilterReSlash) << ":" << line + 1;
 }
 
 bool Gdb::TryBreak(const char *text)
diff -ruN uppsrc/ide/Debuggers/Gdb_MI2.cpp uppsrc/ide/Debuggers/Gdb_MI2.cpp
--- uppsrc/ide/Debuggers/Gdb_MI2.cpp	2012-10-09 17:37:51 +0400
+++ uppsrc/ide/Debuggers/Gdb_MI2.cpp	2013-05-26 10:09:33 +0400
@@ -611,7 +611,7 @@
 // format breakpoint line from ide file and line
 String Gdb_MI2::BreakPos(String const &file, int line)
 {
-	return String().Cat() << Filter(host->GetHostPath(NormalizePath(file)), CharFilterReSlash) << ":" << line;
+	return String() << Filter(host->GetHostPath(NormalizePath(file)), CharFilterReSlash) << ":" << line;
 }
 
 // set breakpoint
diff -ruN uppsrc/ide/Goto.cpp uppsrc/ide/Goto.cpp
--- uppsrc/ide/Goto.cpp	2011-11-06 07:29:11 +0400
+++ uppsrc/ide/Goto.cpp	2013-05-26 11:19:17 +0400
@@ -141,7 +141,7 @@
 			mf.scope = base.GetKey(i);
 			mf.virt = false;
 			mf.access = m.impl ? (int)WITHBODY : (int)PUBLIC;
-			mf.item = global ? String().Cat() << GetFileName(GetCppFile(m.file)) << " (" << m.line << ')'
+			mf.item = global ? GetFileName(GetCppFile(m.file)) << " (" << m.line << ')'
 			                 : AsString(m.line);
 			mf.typei = 0;
 			item.Add(mf);
diff -ruN uppsrc/ide/IconDes/IconDes.cpp uppsrc/ide/IconDes/IconDes.cpp
--- uppsrc/ide/IconDes/IconDes.cpp	2012-06-24 03:48:00 +0400
+++ uppsrc/ide/IconDes/IconDes.cpp	2013-05-26 10:09:33 +0400
@@ -49,7 +49,7 @@
 			Size sz = c.image.GetSize();
 			exp.GetAdd(sz) = c.image;
 			PNGEncoder png;
-			png.SaveFile(AppendFileName(folder, String().Cat() << "icon" << sz.cx << 'x' << sz.cy << ".png"), c.image);
+			png.SaveFile(AppendFileName(folder, String() << "icon" << sz.cx << 'x' << sz.cy << ".png"), c.image);
 		}
 	}
 	String d = SaveIml(m, format);
diff -ruN uppsrc/ide/idefile.cpp uppsrc/ide/idefile.cpp
--- uppsrc/ide/idefile.cpp	2012-11-11 13:02:43 +0400
+++ uppsrc/ide/idefile.cpp	2013-05-26 11:21:18 +0400
@@ -521,7 +521,7 @@
 	else {
 		RealizePath(editfile);
 		if(GetFileExt(editfile) == ".h") {
-			String n = '_' + Filter(String().Cat() << GetActivePackage() << '_' << GetFileTitle(editfile) << "_h_",
+			String n = '_' + Filter(GetActivePackage() << '_' << GetFileTitle(editfile) << "_h_",
 			                        CharFilterMacro);
 			String s;
 			s << "#ifndef " << n << "\r\n";
diff -ruN uppsrc/ide/idetool.cpp uppsrc/ide/idetool.cpp
--- uppsrc/ide/idetool.cpp	2013-05-23 05:41:12 +0400
+++ uppsrc/ide/idetool.cpp	2013-05-26 10:09:33 +0400
@@ -145,7 +145,7 @@
 
 String StatDate(int d)
 {
-	return String().Cat() << d << " days";
+	return String() << d << " days";
 }
 
 void Put(const String& name, String& qtf, const FileStat& fs)
diff -ruN uppsrc/ide/Macro.cpp uppsrc/ide/Macro.cpp
--- uppsrc/ide/Macro.cpp	2013-03-23 19:29:17 +0400
+++ uppsrc/ide/Macro.cpp	2013-05-26 10:09:33 +0400
@@ -401,7 +401,7 @@
 	One<Host> h = CreateHostRunDir();
 	h->ChDir(Nvl(rundir, GetFileFolder(target)));
 	ShowConsole();
-	PutConsole(String().Cat() << "MacroExecute: " << cmdline);
+	PutConsole(String() << "MacroExecute: " << cmdline);
 	console.Sync();
 	e = h->Execute(cmdline);
 	PutVerbose("Finished in " + GetPrintTime(time));
diff -ruN uppsrc/Oracle/OraCommon.cpp uppsrc/Oracle/OraCommon.cpp
--- uppsrc/Oracle/OraCommon.cpp	2011-01-23 04:02:10 +0400
+++ uppsrc/Oracle/OraCommon.cpp	2013-05-26 10:09:33 +0400
@@ -80,7 +80,7 @@
 }
 
 String OciParseRefError(const char *s) {
-	return String().Cat() << "Parse error: invalid ?% type specifier '" << *s << "'";
+	return String() << "Parse error: invalid ?% type specifier '" << *s << "'";
 }
 
 int OciParse(const char *statement, String& out, OciSqlConnection *conn, SqlSession *session) {
@@ -111,7 +111,7 @@
 				s = oraref.Parse(p);
 				if(!s) {
 					if(session)
-						session -> SetError(String().Cat() << "Parse error: invalid ?% type specifier '"
+						session -> SetError(String() << "Parse error: invalid ?% type specifier '"
 						<< *p << "'", statement);
 					return -1;
 				}
diff -ruN uppsrc/PdfDraw/PdfDraw.cpp uppsrc/PdfDraw/PdfDraw.cpp
--- uppsrc/PdfDraw/PdfDraw.cpp	2013-04-04 14:33:26 +0400
+++ uppsrc/PdfDraw/PdfDraw.cpp	2013-05-26 10:09:33 +0400
@@ -571,7 +571,7 @@
 					data.Cat(b);
 				}
 			}
-			mask = PutStream(data, String().Cat()
+			mask = PutStream(data, String()
 			                    << "/Type /XObject /Subtype /Image" << wh
 				                << " /BitsPerComponent 1 /ImageMask true /Decode [0 1] ");
 		}
@@ -582,7 +582,7 @@
 				while(p < e)
 					data.Cat((p++)->a);
 			}
-			smask = PutStream(data, String().Cat()
+			smask = PutStream(data, String()
 			                    << "/Type /XObject /Subtype /Image" << wh
 				                << " /BitsPerComponent 8 /ColorSpace /DeviceGray /Decode [0 1] ");
 		}
@@ -732,7 +732,7 @@
 			for(int c = 0; c < pdffont[i].GetCount(); c++) {
 				RGlyph rg = RasterGlyph(fnt, pdffont[i][c]);
 				int ii = rgobj.GetCount();
-				rgobj << PutStream(rg.data, String().Cat()
+				rgobj << PutStream(rg.data, String()
 				                   << "/Type /XObject /Subtype /Image "
 				                   << " /Width " << rg.sz.cx << " /Height " << rg.sz.cy
 					               << " /BitsPerComponent 1 /ImageMask true /Decode [0 1]");
diff -ruN uppsrc/RichBook/RichBook.cpp uppsrc/RichBook/RichBook.cpp
--- uppsrc/RichBook/RichBook.cpp	2010-03-25 00:05:03 +0400
+++ uppsrc/RichBook/RichBook.cpp	2013-05-26 10:09:33 +0400
@@ -267,7 +267,7 @@
 			para.Cat((WString)(tname + subpart), pfmt);
 		}
 		para.Cat("\t", pfmt);
-		para.Cat(FieldTypeVarID(), String().Cat() << tname << subpart << "$page", pfmt);
+		para.Cat(FieldTypeVarID(), String() << tname << subpart << "$page", pfmt);
 		out.Cat(para);
 	}
 	RLOG("MakeStdToc:\n" << AsQTF(out));
diff -ruN uppsrc/RichEdit/Clip.cpp uppsrc/RichEdit/Clip.cpp
--- uppsrc/RichEdit/Clip.cpp	2013-01-22 23:04:33 +0400
+++ uppsrc/RichEdit/Clip.cpp	2013-05-26 10:09:33 +0400
@@ -245,7 +245,7 @@
 		iw.DrawRect(0, 0, ssz.cx, ssz.cy, White);
 		sample.Paint(iw, 0, 0, 128);
 		NextUndo();
-		if(DoDragAndDrop(String().Cat() << "text/QTF;" RTFS ";" << ClipFmtsText(),
+		if(DoDragAndDrop(String() << "text/QTF;" RTFS ";" << ClipFmtsText(),
 		                 ColorMask(iw, White)) == DND_MOVE && !IsReadOnly()) {
 			RemoveSelection();
 			Action();
diff -ruN uppsrc/RichEdit/Cursor.cpp uppsrc/RichEdit/Cursor.cpp
--- uppsrc/RichEdit/Cursor.cpp	2012-01-23 16:49:13 +0400
+++ uppsrc/RichEdit/Cursor.cpp	2013-05-26 10:09:33 +0400
@@ -100,7 +100,7 @@
 	objectpos = -1;
 	Finish();
 	if(select)
-		SetSelectionSource(String().Cat() << "text/QTF;Rich Text Format;text/rtf;application/rtf;"
+		SetSelectionSource(String() << "text/QTF;Rich Text Format;text/rtf;application/rtf;"
 		                   << ClipFmtsText());
 }
 
diff -ruN uppsrc/RichText/EncodeHTML.cpp uppsrc/RichText/EncodeHTML.cpp
--- uppsrc/RichText/EncodeHTML.cpp	2013-04-04 14:33:26 +0400
+++ uppsrc/RichText/EncodeHTML.cpp	2013-05-26 10:09:33 +0400
@@ -39,12 +39,12 @@
 
 String HtmlDot(int q, Zoom z)
 {
-	return String().Cat() << ' ' << z * q << "px";
+	return String() << ' ' << z * q << "px";
 }
 
 String HtmlDotl(int q, Zoom z)
 {
-	return String().Cat() << ' ' << max((int)!!q, z * q) << "px";
+	return String() << ' ' << max((int)!!q, z * q) << "px";
 }
 
 String HtmlStyleColor(Color c, const char *cl = "color")
diff -ruN uppsrc/Sql/IntroSch.cpp uppsrc/Sql/IntroSch.cpp
--- uppsrc/Sql/IntroSch.cpp	2012-11-07 14:14:28 +0400
+++ uppsrc/Sql/IntroSch.cpp	2013-05-26 10:09:33 +0400
@@ -68,7 +68,7 @@
 void SchDbInfoColumnArray(const char *name, int items)
 {
 	for(int i = 0; i < items; i++)
-		SchDbInfoColumn(String().Cat() << name << i);
+		SchDbInfoColumn(String() << name << i);
 }
 
 const SchTableInfo& GetSchTableInfo(const String& table)
diff -ruN uppsrc/Sql/SqlCase.cpp uppsrc/Sql/SqlCase.cpp
--- uppsrc/Sql/SqlCase.cpp	2012-06-08 20:24:20 +0400
+++ uppsrc/Sql/SqlCase.cpp	2013-05-26 10:09:33 +0400
@@ -30,7 +30,7 @@
 String SqlId::Quoted() const
 {
 	if(sSqlIdQuoted && !id.IsNull())
-		return String().Cat() << '\t' << id << '\t';
+		return String() << '\t' << id << '\t';
 	return id.ToString();
 }
 
diff -ruN uppsrc/Sql/SqlStatement.cpp uppsrc/Sql/SqlStatement.cpp
--- uppsrc/Sql/SqlStatement.cpp	2013-03-23 19:29:17 +0400
+++ uppsrc/Sql/SqlStatement.cpp	2013-05-26 10:09:33 +0400
@@ -146,7 +146,7 @@
 
 SqlSelect& SqlSelect::From(const SqlId& table) {
 	const String& t1 = table.ToString();
-	text = String().Cat() << "select " << text << " from \t" << t1 << '\t';
+	text = String() << "select " << text << " from \t" << t1 << '\t';
 	tables << ',' << t1;
 	on = false;
 	return *this;
@@ -155,7 +155,7 @@
 SqlSelect& SqlSelect::From(const SqlId& table1, const SqlId& table2) {
 	const String& t1 = table1.ToString();
 	const String& t2 = table2.ToString();
-	text = String().Cat() << "select " << text << " from \t" << t1 << "\t, \t" << t2 << '\t';
+	text = String() << "select " << text << " from \t" << t1 << "\t, \t" << t2 << '\t';
 	tables << ',' << t1 << ',' << t2;
 	on = false;
 	return *this;
@@ -165,7 +165,7 @@
 	const String& t1 = table1.ToString();
 	const String& t2 = table2.ToString();
 	const String& t3 = table3.ToString();
-	text = String().Cat() << "select " << text << " from \t" << t1 << "\t, \t" << t2 << "\t, \t" << t3 << '\t';
+	text = String() << "select " << text << " from \t" << t1 << "\t, \t" << t2 << "\t, \t" << t3 << '\t';
 	tables << ',' << t1 << ',' << t2 << ',' << t3;
 	on = false;
 	return *this;
diff -ruN uppsrc/Sql/SqlVal.cpp uppsrc/Sql/SqlVal.cpp
--- uppsrc/Sql/SqlVal.cpp	2012-04-10 15:31:52 +0400
+++ uppsrc/Sql/SqlVal.cpp	2013-05-26 10:09:33 +0400
@@ -4,12 +4,12 @@
 
 SqlId SqlId::Of(const char *of) const
 {
-	return String().Cat() << of << (char)SQLC_OF << ToString();
+	return String() << of << (char)SQLC_OF << ToString();
 }
 
 SqlId SqlId::Of(SqlId id) const
 {
-	return id.IsNull() ? ToString() : String().Cat() << id.ToString() << (char)SQLC_OF << ToString();
+	return id.IsNull() ? ToString() : String() << id.ToString() << (char)SQLC_OF << ToString();
 }
 
 SqlId SqlId::operator[](const SqlId& id) const
@@ -19,7 +19,7 @@
 
 SqlId SqlId::As(const char *as) const
 {
-	return id.IsNull() ? ToString() : String().Cat() << ToString() << (char)SQLC_AS << as;
+	return id.IsNull() ? ToString() : String() << ToString() << (char)SQLC_AS << as;
 }
 
 SqlId SqlId::operator()(SqlId p) const
@@ -41,7 +41,7 @@
 
 String SqlS::operator()() const
 {
-	return String().Cat() << '(' << text << ')';
+	return String() << '(' << text << ')';
 }
 
 String SqlS::operator()(int at) const
@@ -82,7 +82,7 @@
 
 SqlVal SqlVal::As(const char *as) const {
 	SqlVal v;
-	v.SetHigh(String().Cat() << text << (char)SQLC_AS << '\t' << as << '\t');
+	v.SetHigh(String() << text << (char)SQLC_AS << '\t' << as << '\t');
 	return v;
 }
 
@@ -199,7 +199,7 @@
 SqlVal& operator|=(SqlVal& a, const SqlVal& b)     { return a = a | b; }
 
 SqlVal SqlFunc(const char *name, const SqlVal& a) {
-	return SqlVal(String().Cat() << name << '(' << ~a << ')', SqlS::FN);
+	return SqlVal(String() << name << '(' << ~a << ')', SqlS::FN);
 }
 
 SqlVal SqlFunc(const char *n, const SqlVal& a, const SqlVal& b) {
diff -ruN uppsrc/TCore/help.h uppsrc/TCore/help.h
--- uppsrc/TCore/help.h	2010-03-25 00:05:05 +0400
+++ uppsrc/TCore/help.h	2013-05-26 10:09:33 +0400
@@ -125,10 +125,10 @@
 	RegisterHelpTopicRawInfoTag(MK__s, "dpp://AppDoc//sys//" top, __FILE__, callback(&COMBINE(HelpTopicInfoTitle, MK__s)), gen)
 
 #define HELP_TOPIC_BEGIN(topic_id, language, title) \
-	HelpTopicSet("dpp://AppDoc//:://" topic_id, __FILE__, language, title, String().Cat()
+	HelpTopicSet("dpp://AppDoc//:://" topic_id, __FILE__, language, title, String()
 
 #define HELP_TOPIC(namespace_id, nesting_id, topic_id, language, title) \
-	HelpTopicSet(namespace_id, nesting_id, topic_id, __FILE__, language, title, String().Cat()
+	HelpTopicSet(namespace_id, nesting_id, topic_id, __FILE__, language, title, String()
 
 #define HELP_TOPIC_TEXT(text) << text
 #define HELP_TOPIC_END() );
diff -ruN uppsrc/TCore/service/service.cpp uppsrc/TCore/service/service.cpp
--- uppsrc/TCore/service/service.cpp	2010-03-25 00:05:05 +0400
+++ uppsrc/TCore/service/service.cpp	2013-05-26 10:09:33 +0400
@@ -65,7 +65,7 @@
 
 static String ThreadId()
 {
-	return String().Cat() << "[T" << FormatIntHex(GetCurrentThreadId()) << "]";
+	return String() << "[T" << FormatIntHex(GetCurrentThreadId()) << "]";
 }
 
 static BOOL WINAPI EventHandler(DWORD CtrlType)
diff -ruN uppsrc/TCtrlLib/Help/helputil.cpp uppsrc/TCtrlLib/Help/helputil.cpp
--- uppsrc/TCtrlLib/Help/helputil.cpp	2010-03-25 00:05:05 +0400
+++ uppsrc/TCtrlLib/Help/helputil.cpp	2013-05-26 11:23:29 +0400
@@ -639,7 +639,7 @@
 		for(int i = 0; i < 3; i++)
 			if(!section.header[i].IsVoid()) {
 				if(done) para.Cat(WString(", "), ctlfmt);
-				para.Cat((String().Cat() << hftypes[i] << ' ').ToWString(), fmt);
+				para.Cat((String() << hftypes[i] << ' ').ToWString(), fmt);
 				para.Cat(section.header[i].ToWString(), datafmt);
 				done = true;
 			}
@@ -657,7 +657,7 @@
 		for(int i = 0; i < 3; i++)
 			if(!section.footer[i].IsVoid()) {
 				if(done) para.Cat(WString(", "), ctlfmt);
-				para.Cat((String().Cat() << hftypes[i] << ' ').ToWString(), fmt);
+				para.Cat((String() << hftypes[i] << ' ').ToWString(), fmt);
 				para.Cat(section.footer[i].ToWString(), datafmt);
 				done = true;
 			}
diff -ruN uppsrc/TSql/util.cpp uppsrc/TSql/util.cpp
--- uppsrc/TSql/util.cpp	2012-04-10 15:31:52 +0400
+++ uppsrc/TSql/util.cpp	2013-05-26 11:24:37 +0400
@@ -571,7 +571,7 @@
 
 //SqlSelect SelectHint(const char *hint, SqlSet set)
 //{
-//	return hint && *hint ? SqlSelect(SqlSet(String().Cat() << "/*+ " << hint << " */ " << ~set), SqlSet::SET)
+//	return hint && *hint ? SqlSelect(SqlSet(String() << "/*+ " << hint << " */ " << ~set), SqlSet::SET)
 //	                     : SqlSelect(set);
 //}
 
@@ -590,7 +590,7 @@
 */
 SqlSet DeleteHint(const char *hint, const SqlVal& table)
 {
-	return SqlSet(String().Cat() << "delete /*+ " << hint << " */ from " << ~table, SqlSet::SETOP);
+	return SqlSet(String() << "delete /*+ " << hint << " */ from " << ~table, SqlSet::SETOP);
 }
 
 SqlSet DeleteSchemaHint(const char *hint, const SqlId& table)
diff -ruN uppsrc/Web/httpsrv.h uppsrc/Web/httpsrv.h
--- uppsrc/Web/httpsrv.h	2012-05-07 02:31:22 +0400
+++ uppsrc/Web/httpsrv.h	2013-05-26 10:09:33 +0400
@@ -1,6 +1,6 @@
-inline String HttpContentType(const String& type)           { return String().Cat() << "Content-Type: " << type << "\r\n"; }
+inline String HttpContentType(const String& type)           { return String() << "Content-Type: " << type << "\r\n"; }
 inline String HttpContentDisposition(const char *disp, const String& filename)
-{ return String().Cat() << "Content-Disposition: " << disp << "; filename=\"" << filename << "\"\r\n"; }
+{ return String() << "Content-Disposition: " << disp << "; filename=\"" << filename << "\"\r\n"; }
 inline String HttpContentInline(const String& fn)           { return HttpContentDisposition("inline", fn); }
 inline String HttpContentAttachment(const String& fn)       { return HttpContentDisposition("attachment", fn); }
 
diff -ruN upptst/OpenGlTest/main.cpp upptst/OpenGlTest/main.cpp
--- upptst/OpenGlTest/main.cpp	2010-03-25 00:05:12 +0400
+++ upptst/OpenGlTest/main.cpp	2013-05-26 10:09:33 +0400
@@ -29,7 +29,7 @@
 		_log = &log;
 	}
 	
-	void Log(String const &s) { if(_log == NULL) return; _log->Insert(_log->GetLength(), String().Cat() << "\n" << s); _log->ScrollDown(); }
+	void Log(String const &s) { if(_log == NULL) return; _log->Insert(_log->GetLength(), String() << "\n" << s); _log->ScrollDown(); }
 	
 protected:
 	virtual void GLInit()
@@ -56,7 +56,7 @@
 	{
 		ASSERT(HasRenderingContext());
 		
-		Log(String().Cat() << "-> GLResize(" << w << ", " << h << ")");
+		Log(String() << "-> GLResize(" << w << ", " << h << ")");
 	}
 	
 	virtual void GLPaint()
@@ -81,7 +81,7 @@
 	
 	void SliderCtrlAction()
 	{
-		Log(String().Cat() << "-> SliderCtrlAction(" << _slider.GetData() << ")");
+		Log(String() << "-> SliderCtrlAction(" << _slider.GetData() << ")");
 		Refresh();
 	}
 	
diff -ruN upptst/StringTest/StringTest.cpp upptst/StringTest/StringTest.cpp
--- upptst/StringTest/StringTest.cpp	2012-04-10 15:31:52 +0400
+++ upptst/StringTest/StringTest.cpp	2013-05-26 10:42:15 +0400
@@ -73,6 +73,7 @@
 	b.Cat((byte *)s, 2);
 	ASSERT(b == String("013abABxxx012301201"));
 	ASSERT((String().Cat() << 123) == String("123"));
+	ASSERT((String() << 123) == String("123"));
 	ASSERT(b.Find(2, "ABc", 1) == 5);
 	ASSERT(b.Find(2, "ABc", 6) < 0);
 	ASSERT(b.Find("AB", 0) == 5);
