Index: lcl/interfaces/win32/win32callback.inc
===================================================================
--- lcl/interfaces/win32/win32callback.inc	(revision 10148)
+++ lcl/interfaces/win32/win32callback.inc	(working copy)
@@ -82,7 +82,12 @@
 {$endif}
   PrevWndProc := GetWindowInfo(Window)^.DefWndProc;
   if PrevWndProc = nil then
-    Result := Windows.DefWindowProc(Window, Msg, WParam, LParam)
+    {$ifdef WindowsUnicodeSupport}
+      if UnicodeEnabledOS then Result := Windows.DefWindowProcW(Window, Msg, WParam, LParam)
+      else Result := Windows.DefWindowProc(Window, Msg, WParam, LParam)
+    {$else}
+      Result := Windows.DefWindowProc(Window, Msg, WParam, LParam)
+    {$endif}
   else begin
     // combobox child edit weirdness: combobox handling WM_SIZE will compare text
     // to list of strings, and if appears in there, will set the text, and select it
@@ -2126,7 +2131,12 @@
       DisposeWindowInfo(Window);
     end;
   else
-    Result := Windows.DefWindowProc(Window, Msg, WParam, LParam);
+    {$ifdef WindowsUnicodeSupport}
+      if UnicodeEnabledOS then Result := Windows.DefWindowProcW(Window, Msg, WParam, LParam)
+      else Result := Windows.DefWindowProc(Window, Msg, WParam, LParam);
+    {$else}
+      Result := Windows.DefWindowProc(Window, Msg, WParam, LParam)
+    {$endif}
   end;
 end;
 
Index: lcl/interfaces/win32/win32object.inc
===================================================================
--- lcl/interfaces/win32/win32object.inc	(revision 10148)
+++ lcl/interfaces/win32/win32object.inc	(working copy)
@@ -409,7 +409,12 @@
 
 procedure TWin32WidgetSet.AppSetTitle(const ATitle: string);
 begin
+  {$ifdef WindowsUnicodeSupport}
+  if UnicodeEnabledOS then Windows.SetWindowTextW(FAppHandle, Utf8ToPWideChar(ATitle))
+  else Windows.SetWindowText(FAppHandle, PChar(Utf8ToAnsi(ATitle)));
+  {$else}
   Windows.SetWindowText(FAppHandle, PChar(ATitle));
+  {$endif}
 end;
 
 {------------------------------------------------------------------------------
@@ -499,8 +504,49 @@
 Function TWin32WidgetSet.WinRegister: Boolean;
 Var
   WindowClass: WndClass;
+  WindowClassW: WndClassW;
 Begin
   Assert(False, 'Trace:WinRegister - Start');
+{$ifdef WindowsUnicodeSupport}
+  if UnicodeEnabledOS then
+  begin
+    With WindowClassW Do
+    Begin
+      Style := CS_DBLCLKS{CS_HRedraw or CS_VRedraw};
+      LPFnWndProc := @WindowProc;
+      CbClsExtra := 0;
+      CbWndExtra := 0;
+      hInstance := System.HInstance;
+      hIcon := Windows.LoadIcon(MainInstance, 'MAINICON');
+      if hIcon = 0 then
+       hIcon := Windows.LoadIcon(0, IDI_APPLICATION);
+      hCursor := LoadCursor(0, IDC_ARROW);
+      hbrBackground := 0; {GetSysColorBrush(Color_BtnFace);}
+      LPSzMenuName := Nil;
+      LPSzClassName := Utf8PCharToPWideChar(@ClsName);
+    End;
+    Result := Windows.RegisterClassW(@WindowClassW) <> 0;
+  end
+  else
+  begin
+    With WindowClass Do
+    Begin
+      Style := CS_DBLCLKS{CS_HRedraw or CS_VRedraw};
+      LPFnWndProc := @WindowProc;
+      CbClsExtra := 0;
+      CbWndExtra := 0;
+      hInstance := System.HInstance;
+      hIcon := Windows.LoadIcon(MainInstance, 'MAINICON');
+      if hIcon = 0 then
+       hIcon := Windows.LoadIcon(0, IDI_APPLICATION);
+      hCursor := LoadCursor(0, IDC_ARROW);
+      hbrBackground := 0; {GetSysColorBrush(Color_BtnFace);}
+      LPSzMenuName := Nil;
+      LPSzClassName := @ClsName;
+    End;
+    Result := Windows.RegisterClass(@WindowClass) <> 0;
+  end;
+{$else}
   With WindowClass Do
   Begin
     Style := CS_DBLCLKS{CS_HRedraw or CS_VRedraw};
@@ -517,6 +563,7 @@
     LPSzClassName := @ClsName;
   End;
   Result := Windows.RegisterClass(@WindowClass) <> 0;
+{$endif}
   Assert(False, 'Trace:WinRegister - Exit');
 End;
 
Index: lcl/interfaces/win32/win32proc.pp
===================================================================
--- lcl/interfaces/win32/win32proc.pp	(revision 10148)
+++ lcl/interfaces/win32/win32proc.pp	(working copy)
@@ -107,6 +107,11 @@
 function MeasureText(const AWinControl: TWinControl; Text: string; var Width, Height: integer): boolean;
 function GetControlText(AHandle: HWND): string;
 
+// String functions
+
+function Utf8PCharToPWideChar(param: PChar): PWideChar;
+function Utf8ToPWideChar(param: string): PWideChar;
+
 type
   PDisableWindowsInfo = ^TDisableWindowsInfo;
   TDisableWindowsInfo = record
@@ -118,6 +123,8 @@
   DefaultWindowInfo: TWindowInfo;
   WindowInfoAtom: ATOM;
   ChangedMenus: TList; // list of HWNDs which menus needs to be redrawn
+  WinVersion: TOSVersionInfo;
+  UnicodeEnabledOS: Boolean;
 
 implementation
 
@@ -1130,7 +1137,17 @@
   GetWindowText(AHandle, PChar(Result), TextLen + 1);
 end;
 
+function Utf8PCharToPWideChar(param: PChar): PWideChar;
+begin
+  Result := PWideChar(Utf8Decode(string(param)));
+end;
 
+function Utf8ToPWideChar(param: string): PWideChar;
+begin
+  Result := PWideChar(Utf8Decode(param));
+end;
+
+
 {$IFDEF ASSERT_IS_ON}
   {$UNDEF ASSERT_IS_ON}
   {$C-}
@@ -1143,6 +1160,15 @@
   WindowInfoAtom := Windows.GlobalAddAtom('WindowInfo');
   ChangedMenus := TList.Create;
 
+ {$ifdef WindowsUnicodeSupport}
+
+  WinVersion.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
+  GetVersionEx(WinVersion);
+
+  UnicodeEnabledOS := (WinVersion.dwPlatformID = VER_PLATFORM_WIN32_NT);
+
+ {$endif}
+
 finalization
 
   Windows.GlobalDeleteAtom(WindowInfoAtom);
Index: lcl/interfaces/win32/win32wscontrols.pp
===================================================================
--- lcl/interfaces/win32/win32wscontrols.pp	(revision 10148)
+++ lcl/interfaces/win32/win32wscontrols.pp	(working copy)
@@ -200,8 +200,20 @@
       end else begin
         MenuHandle := HMENU(nil);
       end;
-      Window := CreateWindowEx(FlagsEx, pClassName, WindowTitle, Flags,
+
+      {$ifdef WindowsUnicodeSupport}
+      if UnicodeEnabledOS then
+        Window := CreateWindowExW(FlagsEx, Utf8PCharToPWideChar(pClassName),
+          Utf8PCharToPWideChar(WindowTitle), Flags,
+          Left, Top, Width, Height, Parent, MenuHandle, HInstance, Nil)
+      else
+        Window := CreateWindowEx(FlagsEx, pClassName, WindowTitle, Flags,
           Left, Top, Width, Height, Parent, MenuHandle, HInstance, Nil);
+      {$else}
+        Window := CreateWindowEx(FlagsEx, pClassName, WindowTitle, Flags,
+          Left, Top, Width, Height, Parent, MenuHandle, HInstance, Nil);
+      {$endif}
+
       if Window = 0 then
       begin
         raise exception.create('failed to create win32 control, error: '+IntToStr(GetLastError()));
@@ -415,7 +427,12 @@
 Begin
   if not WSCheckHandleAllocated(AWincontrol, 'SetText')
   then Exit;
+  {$ifdef WindowsUnicodeSupport}
+  if UnicodeEnabledOS then Windows.SetWindowTextW(AWinControl.Handle, Utf8ToPWideChar(AText))
+  else Windows.SetWindowText(AWinControl.Handle, PChar(Utf8ToAnsi(AText)));
+  {$else}
   Windows.SetWindowText(AWinControl.Handle, PChar(AText));
+  {$endif}
 End;
 
 class procedure TWin32WSWinControl.ConstraintsChange(const AWinControl: TWinControl);
