diff --git a/packages/cef4delphi_lazarus.lpk b/packages/cef4delphi_lazarus.lpk
index 5af74a7a..c46187eb 100644
--- a/packages/cef4delphi_lazarus.lpk
+++ b/packages/cef4delphi_lazarus.lpk
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <CONFIG>
-  <Package Version="4">
+  <Package Version="5">
     <PathDelim Value="\"/>
     <Name Value="CEF4Delphi_Lazarus"/>
     <Type Value="RunAndDesignTime"/>
@@ -850,19 +850,23 @@
         <UnitName Value="uCEFLazarusOsrBrowserWindow"/>
       </Item202>
     </Files>
-    <RequiredPkgs Count="4">
+    <CompatibilityMode Value="True"/>
+    <RequiredPkgs Count="5">
       <Item1>
-        <PackageName Value="dcpcrypt"/>
+        <PackageName Value="IDEIntf"/>
       </Item1>
       <Item2>
-        <PackageName Value="LCL"/>
+        <PackageName Value="dcpcrypt"/>
       </Item2>
       <Item3>
-        <PackageName Value="LCLBase"/>
+        <PackageName Value="LCL"/>
       </Item3>
       <Item4>
-        <PackageName Value="FCL"/>
+        <PackageName Value="LCLBase"/>
       </Item4>
+      <Item5>
+        <PackageName Value="FCL"/>
+      </Item5>
     </RequiredPkgs>
     <UsageOptions>
       <UnitPath Value="$(PkgOutDir)"/>
diff --git a/source/uCEFLazarusOsrBrowserWindow.pas b/source/uCEFLazarusOsrBrowserWindow.pas
index bbe4ffc3..79476f86 100644
--- a/source/uCEFLazarusOsrBrowserWindow.pas
+++ b/source/uCEFLazarusOsrBrowserWindow.pas
@@ -44,21 +44,33 @@ interface
 
 uses
   {$IFDEF FPC}
-  LResources,
+  LResources, PropEdits,
   {$ENDIF}
   uCEFApplication, uCEFChromiumWindow, uCEFTypes, uCEFInterfaces, uCEFChromium,
   uCEFLinkedWinControlBase, uCEFLazApplication, uCEFBufferPanel,
   uCEFLazarusBrowserWindow, uCEFBitmapBitBuffer, uCEFMiscFunctions,
-  uCEFConstants, Forms, ExtCtrls, LCLType, Graphics, Controls, syncobjs,
-  LazLogger, Classes, sysutils, math;
+  uCEFConstants, uCEFChromiumEvents, Forms, ExtCtrls, LCLType, Graphics,
+  Controls, syncobjs, LazLogger, Classes, sysutils, math;
 
 type
 
   TBrowserMouseEvent = procedure(Sender: TObject; Button: TMouseButton;
-                          Shift: TShiftState; X, Y: Integer;
-                          var AHandled: Boolean) of Object;
+    Shift: TShiftState; X, Y: Integer;
+    var AHandled: Boolean) of Object;
+  TBrowserMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState;
+    X, Y: Integer;
+    var AHandled: Boolean) of Object;
+  TBrowserMouseWheelEvent = procedure(Sender: TObject; Shift: TShiftState;
+    WheelDelta: Integer; MousePos: TPoint;
+    var AHandled: Boolean) of Object;
+  TBrowserKeyEvent = procedure(Sender: TObject; var Key: Word; Shift: TShiftState; var AHandled: Boolean) of Object;
+  //TBrowserKeyPressEvent = procedure(Sender: TObject; var Key: char; var AHandled: Boolean) of Object;
+  TBrowserUTF8KeyPressEvent = procedure(Sender: TObject; var UTF8Key: TUTF8Char; var AHandled: Boolean) of Object;
 
 
+  TLazOsrChromium = class(TLazChromium)
+  end;
+
   { TLazarusOsrBrowserWindow }
 
   TLazarusOsrBrowserWindow = class(TBufferPanel)
@@ -114,17 +126,22 @@ type
         AHeight: Integer);
 
     private
-      FChromium  : TLazChromium;
+      FChromium  : TLazOsrChromium;
 
       FOnBrowserClosed  : TNotifyEvent;
       FOnBrowserCreated : TNotifyEvent;
+      FOnKeyDown: TBrowserKeyEvent;
+      FOnKeyUp: TBrowserKeyEvent;
       FOnMouseDown: TBrowserMouseEvent;
+      FOnMouseMove: TBrowserMouseMoveEvent;
       FOnMouseUp: TBrowserMouseEvent;
+      FOnMouseWheel: TBrowserMouseWheelEvent;
+      FOnUtf8KeyPress: TBrowserUTF8KeyPressEvent;
 
       procedure DoCreateBrowserAfterContext(Sender: TObject);
 
     protected
-      function    GetChromium: TLazChromium;
+      function    GetChromium: TLazOsrChromium;
       function    getModifiers(Shift: TShiftState): TCefEventFlags;
       function    getKeyModifiers(Shift: TShiftState): TCefEventFlags;
       function    GetButton(Button: TMouseButton): TCefMouseButtonType;
@@ -166,13 +183,18 @@ type
       procedure   LoadURL(aURL: ustring);
     //
     published
-      property    Chromium : TLazChromium    read GetChromium;
+      property    Chromium : TLazOsrChromium    read GetChromium;
 
       property    OnBrowserCreated : TNotifyEvent read FOnBrowserCreated write FOnBrowserCreated;
       property    OnBrowserClosed  : TNotifyEvent read FOnBrowserClosed write FOnBrowserClosed;
 
-      property    OnMouseDown: TBrowserMouseEvent read FOnMouseDown write FOnMouseDown;
-      property    OnMouseUp: TBrowserMouseEvent read FOnMouseUp write FOnMouseUp;
+      property    OnMouseDown:    TBrowserMouseEvent      read FOnMouseDown write FOnMouseDown;
+      property    OnMouseUp:      TBrowserMouseEvent      read FOnMouseUp write FOnMouseUp;
+      property    OnMouseMove:    TBrowserMouseMoveEvent  read FOnMouseMove write FOnMouseMove;
+      property    OnMouseWheel:   TBrowserMouseWheelEvent read FOnMouseWheel write FOnMouseWheel;
+      property    OnKeyDown:      TBrowserKeyEvent        read FOnKeyDown write FOnKeyDown;
+      property    OnKeyUp:        TBrowserKeyEvent        read FOnKeyUp write FOnKeyUp;
+      property    OnUtf8KeyPress: TBrowserUTF8KeyPressEvent read FOnUtf8KeyPress write FOnUtf8KeyPress;
   end;
 
 {$IFDEF FPC}
@@ -498,7 +520,7 @@ begin
   end;
 end;
 
-function TLazarusOsrBrowserWindow.GetChromium: TLazChromium;
+function TLazarusOsrBrowserWindow.GetChromium: TLazOsrChromium;
 begin
   Result := FChromium;
 end;
@@ -649,8 +671,14 @@ end;
 procedure TLazarusOsrBrowserWindow.MouseMove(Shift: TShiftState; X, Y: Integer);
 var
   TempEvent : TCefMouseEvent;
+  IsHandled: Boolean;
 begin
   inherited MouseMove(Shift, X, Y);
+  IsHandled := False;
+  if FOnMouseMove <> nil then
+    FOnMouseMove(Self, Shift, X, Y, IsHandled);
+  if IsHandled then
+    exit;
 
   TempEvent.x         := x;
   TempEvent.y         := y;
@@ -699,8 +727,14 @@ function TLazarusOsrBrowserWindow.DoMouseWheel(Shift: TShiftState;
   WheelDelta: Integer; MousePos: TPoint): Boolean;
 var
   TempEvent  : TCefMouseEvent;
+  IsHandled: Boolean;
 begin
   Result := inherited DoMouseWheel(Shift, WheelDelta, MousePos);
+  IsHandled := False;
+  if FOnMouseWheel <> nil then
+    FOnMouseWheel(Self, Shift, WheelDelta, MousePos, IsHandled);
+  if IsHandled then
+    exit;
 
   TempEvent.x         := MousePos.x;
   TempEvent.y         := MousePos.y;
@@ -717,7 +751,16 @@ end;
 procedure TLazarusOsrBrowserWindow.KeyDown(var Key: Word; Shift: TShiftState);
 var
   TempKeyEvent : TCefKeyEvent;
+  IsHandled: Boolean;
 begin
+  IsHandled := False;
+  if FOnKeyDown <> nil then
+    FOnKeyDown(Self, Key, Shift, IsHandled);
+  if IsHandled then begin
+    inherited KeyDown(Key, Shift);
+    exit;
+  end;
+
   FLastKeyDown := Key;
   if (Key <> 0) and (Chromium <> nil) then
     begin
@@ -742,7 +785,16 @@ procedure TLazarusOsrBrowserWindow.UTF8KeyPress(var UTF8Key: TUTF8Char);
 var
   TempKeyEvent : TCefKeyEvent;
   TempString   : UnicodeString;
+  IsHandled: Boolean;
 begin
+  IsHandled := False;
+  if FOnUtf8KeyPress <> nil then
+    FOnUtf8KeyPress(Self, UTF8Key, IsHandled);
+  if IsHandled then begin
+    inherited UTF8KeyPress(UTF8Key);
+    exit;
+  end;
+
   if Focused then
     begin
       TempString := UTF8Decode(UTF8Key);
@@ -773,7 +825,16 @@ end;
 procedure TLazarusOsrBrowserWindow.KeyUp(var Key: Word; Shift: TShiftState);
 var
   TempKeyEvent : TCefKeyEvent;
+  IsHandled: Boolean;
 begin
+  IsHandled := False;
+  if FOnKeyUp <> nil then
+    FOnKeyUp(Self, Key, Shift, IsHandled);
+  if IsHandled then begin
+    inherited KeyUp(Key, Shift);
+    exit;
+  end;
+
   if (Key <> 0) and (Chromium <> nil) then
     begin
       TempKeyEvent.kind                    := KEYEVENT_KEYUP;
@@ -843,9 +904,9 @@ begin
   FSelectedRange.from   := 0;
   FSelectedRange.to_    := 0;
 
-  FChromium := TLazChromium.Create(Self);
-  FChromium.OnBrowserClosed              := {$IFDEF FPC}@{$ENDIF}DoOnClosed;
-  FChromium.OnBrowserCreated             := {$IFDEF FPC}@{$ENDIF}DoOnCreated;
+  FChromium := TLazOsrChromium.Create(Self);
+  FChromium.InternalOnBrowserClosed              := {$IFDEF FPC}@{$ENDIF}DoOnClosed;
+  FChromium.InternalOnBrowserCreated             := {$IFDEF FPC}@{$ENDIF}DoOnCreated;
 
   FChromium.OnPaint                      := {$IFDEF FPC}@{$ENDIF}DoChromiumPaint;
   FChromium.OnGetViewRect                := {$IFDEF FPC}@{$ENDIF}DoGetChromiumViewRect;
@@ -910,6 +971,17 @@ procedure Register;
 begin
 //  {$I res/tlazarusosrbrowserwindow.lrs}
   RegisterComponents('Chromium', [TLazarusOsrBrowserWindow]);
+  RegisterPropertyEditor(TypeInfo(TOnClose),                      TLazOsrChromium,'OnClose',THiddenPropertyEditor);
+  RegisterPropertyEditor(TypeInfo(TOnPaint),                      TLazOsrChromium,'OnPaint',THiddenPropertyEditor);
+  RegisterPropertyEditor(TypeInfo(TOnGetViewRect),                TLazOsrChromium,'OnGetViewRect',THiddenPropertyEditor);
+  RegisterPropertyEditor(TypeInfo(TOnCursorChange),               TLazOsrChromium,'OnCursorChange',THiddenPropertyEditor);
+  RegisterPropertyEditor(TypeInfo(TOnGetScreenPoint),             TLazOsrChromium,'OnGetScreenPoint',THiddenPropertyEditor);
+  RegisterPropertyEditor(TypeInfo(TOnGetScreenInfo),              TLazOsrChromium,'OnGetScreenInfo',THiddenPropertyEditor);
+  RegisterPropertyEditor(TypeInfo(TOnPopupShow),                  TLazOsrChromium,'OnPopupShow',THiddenPropertyEditor);
+  RegisterPropertyEditor(TypeInfo(TOnPopupSize),                  TLazOsrChromium,'OnPopupSize',THiddenPropertyEditor);
+  RegisterPropertyEditor(TypeInfo(TOnTooltip),                    TLazOsrChromium,'OnTooltip',THiddenPropertyEditor);
+  RegisterPropertyEditor(TypeInfo(TOnBeforePopup),                TLazOsrChromium,'OnBeforePopup',THiddenPropertyEditor);
+  RegisterPropertyEditor(TypeInfo(TOnIMECompositionRangeChanged), TLazOsrChromium,'OnIMECompositionRangeChanged',THiddenPropertyEditor);
 end;
 {$ENDIF}
 
diff --git a/source/uceflazarusbrowserwindow.pas b/source/uceflazarusbrowserwindow.pas
index fa68d1ac..f697e74f 100644
--- a/source/uceflazarusbrowserwindow.pas
+++ b/source/uceflazarusbrowserwindow.pas
@@ -44,11 +44,11 @@ interface
 
 uses
   {$IFDEF FPC}
-  LResources,
+  LResources, PropEdits,
   {$ENDIF}
   uCEFApplication, uCEFChromiumWindow, uCEFTypes, uCEFInterfaces, uCEFChromium,
-  uCEFLinkedWinControlBase, uCEFLazApplication, uCEFBrowserViewComponent, Forms,
-  ExtCtrls, Controls, Classes, sysutils;
+  uCEFLinkedWinControlBase, uCEFLazApplication, uCEFBrowserViewComponent,
+  uCEFChromiumEvents, Forms, ExtCtrls, Controls, Classes, sysutils;
 
 type
 
@@ -63,18 +63,22 @@ type
     private type
       TLazChromiumState   = (csNoBrowser, csCreatingBrowser, csHasBrowser, csClosingBrowser, csCloseAfterCreate);
     private
-      FState               : TLazChromiumState;
-      FOnBrowserClosed     : TNotifyEvent;
-      FOnBrowserCreated    : TNotifyEvent;
+      FInternalOnGotFocus: TOnGotFocus;
+      FState                    : TLazChromiumState;
+      FInternalOnBrowserClosed  : TNotifyEvent;
+      FInternalOnBrowserCreated : TNotifyEvent;
 
       FLoadUrl, FFrameName : ustring;
       function GetIsClosing: Boolean;
+      procedure SetInternalOnClose(AValue: TOnClose);
 
     protected
       function    GetHasBrowser : boolean; reintroduce;
 
       procedure   doOnBeforeClose(const ABrowser: ICefBrowser); override;
       procedure   doOnAfterCreated(const ABrowser: ICefBrowser); override;
+      procedure   doOnGotFocus(const Abrowser: ICefBrowser); override;
+      function    MustCreateFocusHandler: boolean; override;
 
       procedure   DoCreated(Data: PtrInt);
       procedure   DoOnClosed(Data: PtrInt);
@@ -108,8 +112,9 @@ type
          - OnBrowserCreated: the parent event may be called when procedure Initialized is still false.
          - OnBrowserCreated: may not be called, if the CloseBrowser has already been called
       *)
-      property    OnBrowserCreated : TNotifyEvent read FOnBrowserCreated write FOnBrowserCreated;
-      property    OnBrowserClosed  : TNotifyEvent read FOnBrowserClosed write FOnBrowserClosed;
+      property    InternalOnBrowserCreated : TNotifyEvent read FInternalOnBrowserCreated write FInternalOnBrowserCreated;
+      property    InternalOnBrowserClosed  : TNotifyEvent read FInternalOnBrowserClosed  write FInternalOnBrowserClosed;
+      property    InternalOnGotFocus       : TOnGotFocus  read FInternalOnGotFocus       write FInternalOnGotFocus;
   end;
 
   TLazarusBrowserWindow = class;
@@ -148,6 +153,7 @@ type
       *)
       procedure   WaitForBrowserClosed;
 
+    published
       property Chromium: TLazChromium read FChromium;
   end;
 
@@ -167,6 +173,7 @@ type
 
       procedure   DoCreateBrowser(Sender: TObject);
       procedure   DoCreateBrowserAfterContext(Sender: TObject);
+      function    GetLazChromium: TLazChromium;
     protected
       function    GetChromium: TChromium; override;
       procedure   DestroyHandle; override;
@@ -188,7 +195,7 @@ type
       procedure   LoadURL(aURL: ustring);
 
     published
-      property    Chromium; //        : TChromium    read GetChromium;
+      property    Chromium: TLazChromium read GetLazChromium;
 
       property    OnBrowserCreated : TNotifyEvent read FOnBrowserCreated write FOnBrowserCreated;
       (* OnBrowserClosed will not be called, if the TLazarusBrowserWindow is
@@ -210,6 +217,11 @@ begin
   Result := FState in [csCloseAfterCreate, csClosingBrowser];
 end;
 
+procedure TLazChromium.SetInternalOnClose(AValue: TOnClose);
+begin
+  inherited OnClose := AValue;
+end;
+
 function TLazChromium.GetHasBrowser: boolean;
 begin
   Result := (FState <> csNoBrowser) or (inherited GetHasBrowser);
@@ -233,6 +245,19 @@ begin
   Application.QueueAsyncCall(@DoCreated, 0);
 end;
 
+procedure TLazChromium.doOnGotFocus(const Abrowser: ICefBrowser);
+begin
+  inherited doOnGotFocus(Abrowser);
+  if Assigned(FInternalOnGotFocus) then
+    FInternalOnGotFocus(Self, Abrowser);
+end;
+
+function TLazChromium.MustCreateFocusHandler: boolean;
+begin
+  Result := assigned(FInternalOnGotFocus) or
+            inherited MustCreateFocusHandler;
+end;
+
 procedure TLazChromium.DoCreated(Data: PtrInt);
 var
   u, f: ustring;
@@ -247,8 +272,8 @@ begin
           LoadURL(u, f);
         end;
 
-        if (FOnBrowserCreated <> nil) then
-          FOnBrowserCreated(Self);
+        if (FInternalOnBrowserCreated <> nil) then
+          FInternalOnBrowserCreated(Self);
       end;
     csCloseAfterCreate: begin
         FState := csHasBrowser;
@@ -259,8 +284,8 @@ end;
 
 procedure TLazChromium.DoOnClosed(Data: PtrInt);
 begin
-  if (FOnBrowserClosed <> nil) then
-    FOnBrowserClosed(Self);
+  if (FInternalOnBrowserClosed <> nil) then
+    FInternalOnBrowserClosed(Self);
 end;
 
 constructor TLazChromium.Create(AOwner: TComponent);
@@ -400,15 +425,15 @@ begin
   FBrowserWindow := AOwner;
   FWrapperState  := wsNone;
 
+  FChromium                  := TLazChromium.Create(nil);
   if not(csDesigning in AOwner.ComponentState) then
     begin
-      FChromium                  := TLazChromium.Create(nil);
-      FChromium.OnClose          := {$IFDEF FPC}@{$ENDIF}BrowserThread_OnClose;
-      FChromium.OnBrowserClosed  := {$IFDEF FPC}@{$ENDIF}DoOnBeforeClose;
-      FChromium.OnBrowserCreated := {$IFDEF FPC}@{$ENDIF}DoOnAfterCreated;
+      FChromium.OnClose                  := {$IFDEF FPC}@{$ENDIF}BrowserThread_OnClose;
+      FChromium.InternalOnBrowserClosed  := {$IFDEF FPC}@{$ENDIF}DoOnBeforeClose;
+      FChromium.InternalOnBrowserCreated := {$IFDEF FPC}@{$ENDIF}DoOnAfterCreated;
       {$IFDEF LINUX}
       // This is a workaround for the CEF issue #2026. Read below for more info.
-      FChromium.OnGotFocus     := {$IFDEF FPC}@{$ENDIF}BrowserThread_OnGotFocus;
+      FChromium.InternalOnGotFocus     := {$IFDEF FPC}@{$ENDIF}BrowserThread_OnGotFocus;
       {$ENDIF}
     end;
 
@@ -518,6 +543,11 @@ begin
   {$ENDIF}
 end;
 
+function TLazarusBrowserWindow.GetLazChromium: TLazChromium;
+begin
+  Result := FChromiumWrapper.Chromium;
+end;
+
 function TLazarusBrowserWindow.GetChromium: TChromium;
 begin
   Result := FChromiumWrapper.FChromium;
@@ -643,6 +673,8 @@ procedure Register;
 begin
   {$I res/tlazarusbrowserwindow.lrs}
   RegisterComponents('Chromium', [TLazarusBrowserWindow]);
+  RegisterPropertyEditor(ClassTypeInfo(TLazChromium), nil,'',TClassPropertyEditor);
+  RegisterPropertyEditor(TypeInfo(TOnClose), TLazChromium, 'OnClose', THiddenPropertyEditor);
 end;
 {$ENDIF}