diff --git a/packages/rtl/namespaced/BrowserApi.ServiceWorker.pas b/packages/rtl/namespaced/BrowserApi.ServiceWorker.pas
new file mode 100644
index 0000000..a7a9aee
--- /dev/null
+++ b/packages/rtl/namespaced/BrowserApi.ServiceWorker.pas
@@ -0,0 +1,3 @@
+{$DEFINE FPC_DOTTEDUNITS}
+unit BrowserApi.ServiceWorker;
+{$include ../src/serviceworker.pas}
diff --git a/packages/rtl/namespaced/BrowserApi.SharedWorker.pas b/packages/rtl/namespaced/BrowserApi.SharedWorker.pas
new file mode 100644
index 0000000..dab53ee
--- /dev/null
+++ b/packages/rtl/namespaced/BrowserApi.SharedWorker.pas
@@ -0,0 +1,3 @@
+{$DEFINE FPC_DOTTEDUNITS}
+unit BrowserApi.SharedWorker;
+{$include ../src/sharedworker.pas}
diff --git a/packages/rtl/namespaced/BrowserApi.WorkerBase.pas b/packages/rtl/namespaced/BrowserApi.WorkerBase.pas
new file mode 100644
index 0000000..fbf0b6f
--- /dev/null
+++ b/packages/rtl/namespaced/BrowserApi.WorkerBase.pas
@@ -0,0 +1,3 @@
+{$DEFINE FPC_DOTTEDUNITS}
+unit BrowserApi.WorkerBase;
+{$include ../src/webworkerbase.pas}
diff --git a/packages/rtl/src/serviceworker.pas b/packages/rtl/src/serviceworker.pas
new file mode 100644
index 0000000..1c967f0
--- /dev/null
+++ b/packages/rtl/src/serviceworker.pas
@@ -0,0 +1,60 @@
+{$IFNDEF FPC_DOTTEDUNITS}
+unit serviceworker;
+{$ENDIF}
+
+{$mode ObjFPC}
+{$modeswitch externalclass}
+
+interface
+
+uses
+  {$IFDEF FPC_DOTTEDUNITS}
+  JSApi.JS, BrowserApi.WebOrWorker, BrowserApi.WorkerBase;
+  {$ELSE}
+  js, weborworker, webworkerbase;
+  {$Endif}
+
+Type
+  {$IFDEF FPC_DOTTEDUNITS}
+  TJSWorkerNavigator = BrowserApi.WorkerBase.TJSWorkerNavigator;
+  TJSWorkerLocation = BrowserApi.WorkerBase.TJSWorkerLocation;
+  TJSWorkerGlobalScope = BrowserApi.WorkerBase.TJSWorkerGlobalScope;
+  {$ELSE}
+  TJSWorkerNavigator = webworkerbase.TJSWorkerNavigator;
+  TJSWorkerLocation = webworkerbase.TJSWorkerLocation;
+  TJSWorkerGlobalScope = webworkerbase.TJSWorkerGlobalScope;
+  {$ENDIF}
+
+  { TJSServiceworkerGlobalScope }
+
+  TJSClientsMatchAllOptions = class external name 'Object'
+    includeUncontrolled : Boolean;
+    type_ : string; external name 'type';
+  end;
+
+  TJSClients = class external name 'Clients' (TJSObject)
+    function claim : TJSPromise;
+    function get(ID : String) : TJSPromise;
+    function matchAll : TJSPromise;
+    function matchAll(Options : TJSClientsMatchAllOptions) : TJSPromise;
+    function matchAll(Options : TJSObject) : TJSPromise;
+    function openWindow(url : string) : TJSPromise;
+  end;
+
+  TJSServiceworkerGlobalScope = class external name 'ServiceWorkerGlobalScope' (TJSWorkerGlobalScope)
+  private
+    FClients: TJSClients; external name 'clients';
+    FRegistration: TJSServiceWorkerRegistration; external name 'registration';
+  Public
+    Function SkipWaiting : TJSPromise; external name 'skipWaiting';
+    property registration : TJSServiceWorkerRegistration Read FRegistration;
+    property clients : TJSClients Read FClients;
+  end;
+
+var
+  Self_ : TJSServiceworkerGlobalScope; external name 'self';
+
+implementation
+
+end.
+
diff --git a/packages/rtl/src/sharedworker.pas b/packages/rtl/src/sharedworker.pas
new file mode 100644
index 0000000..b2c50e5
--- /dev/null
+++ b/packages/rtl/src/sharedworker.pas
@@ -0,0 +1,44 @@
+{$IFNDEF FPC_DOTTEDUNITS}
+unit sharedworker;
+{$ENDIF}
+
+{$mode ObjFPC}
+{$modeswitch externalclass}
+
+interface
+
+uses
+{$IFDEF FPC_DOTTEDUNITS}
+  JSApi.JS, BrowserApi.WebOrWorker, BrowserApi.WorkerBase;
+{$ELSE}
+  js, weborworker, webworkerbase;
+{$Endif}
+
+Type
+  {$IFDEF FPC_DOTTEDUNITS}
+  TJSWorkerNavigator = BrowserApi.WebWorkerBase.TJSWorkerNavigator;
+  TJSWorkerLocation = BrowserApi.WebWorkerBase.TJSWorkerLocation;
+  TJSWorkerGlobalScope = BrowserApi.WebWorkerBase.TJSWorkerGlobalScope;
+  {$ELSE}
+  TJSWorkerNavigator = webworkerbase.TJSWorkerNavigator;
+  TJSWorkerLocation = webworkerbase.TJSWorkerLocation;
+  TJSWorkerGlobalScope = webworkerbase.TJSWorkerGlobalScope;
+  {$ENDIF}
+  { TJSServiceworkerGlobalScope }
+
+  TJSSharedWorkerGlobalScope = class external name 'SharedWorkerGlobalScope' (TJSWorkerGlobalScope)
+  private
+    FName : String; external name 'name';
+  Public
+    procedure close;
+    property name : string Read FName;
+  end;
+
+var
+  Self_ : TJSSharedWorkerGlobalScope; external name 'self';
+
+
+implementation
+
+end.
+
diff --git a/packages/rtl/src/weborworker.pas b/packages/rtl/src/weborworker.pas
index 5cbdb6c..e838b02 100644
--- a/packages/rtl/src/weborworker.pas
+++ b/packages/rtl/src/weborworker.pas
@@ -1603,16 +1603,6 @@ type
     Property action : String Read Faction;
   end;
 
-  { --------------------------------------------------------------------
-    TJSServiceWorkerGlobalScope
-    --------------------------------------------------------------------}
-
-  TJSServiceWorkerGlobalScope = class external name 'ServiceWorkerGlobalScope'
-  Private
-  Public
-      onnotificationclick : TJSEventHandler;
-      onnotificationclose : TJSEventHandler;
-  end;
 
   TCanvasCoordType = double;
   { TJSImageData }
diff --git a/packages/rtl/src/webworker.pas b/packages/rtl/src/webworker.pas
index f144628..d80c208 100644
--- a/packages/rtl/src/webworker.pas
+++ b/packages/rtl/src/webworker.pas
@@ -23,113 +23,41 @@ interface
 
 uses
 {$IFDEF FPC_DOTTEDUNITS}
-  JSApi.JS, BrowserApi.WebOrWorker;
+  JSApi.JS, BrowserApi.WebOrWorker, BrowserApi.WorkerBase;
 {$ELSE}
-  JS, weborworker;
+  JS, weborworker, webworkerbase;
 {$ENDIF}
 
 Type
-
-  { TJSWorkerNavigator }
-
-  TJSWorkerNavigator = class external name 'WorkerNavigator' (TJSObject)
-  private
-    FhardwareConcurrency: Integer; external name 'hardwareConcurrency';
-    FLanguage: String; external name 'language';
-    FLanguages: TJSStringDynArray; external name 'languages';
-    FOnline: boolean; external name 'onLine';
-    FPlatform: string; external name 'platform';
-    FUserAgent: string; external name 'userAgent';
-  public
-    property language : String read FLanguage;
-    property languages : TJSStringDynArray read FLanguages;
-    property onLine : boolean read FOnline;
-    property platform : string read FPlatform;
-    property userAgent : string read FUserAgent;
-    property hardwareConcurrency : Integer Read FhardwareConcurrency;
-  end;
-
-  { TJSWorkerLocation }
-
-  TJSWorkerLocation = class external name 'WorkerLocation' (TJSObject)
-  Private
-    FHash: string;external name 'hash';
-    FHost: string;external name 'host';
-    FHostName: string;external name 'hostname';
-    FHRef: string; external name 'href';
-    FOrigin : string; external name 'origin';
-    FPathName: string;external name 'pathname';
-    FPort: string;external name 'port';
-    FProtocol: string;external name 'protocol';
-    FSearch: string;external name 'search';
-  Public
-    Property hash : string Read FHash;
-    Property host : string read FHost;
-    Property hostname : string read FHostName;
-    Property href : string read FHRef;
-    Property pathname : string Read FPathName;
-    Property port : string Read FPort;
-    Property protocol : string Read FProtocol;
-    Property search : string read FSearch;
-    property origin : string read FOrigin;
-  end;
-
-  { TJSWorkerGlobalScope }
-
-  TJSWorkerGlobalScope = class external name 'WorkerGlobalScope' (TWindowOrWorkerGlobalScope)
-  private
-    FConsole: TJSConsole; external name 'console';
-    FLocation: TJSWorkerLocation; external name 'location';
-    FNavigator: TJSWorkerNavigator; external name 'navigator';
-    FSelf : TJSWorkerGlobalScope external name 'self';
-  Public
-    procedure importScripts(path : string); varargs;
-    property Navigator: TJSWorkerNavigator read FNavigator;
-    property console : TJSConsole Read FConsole;
-    property location : TJSWorkerLocation Read FLocation;
-    Property Self_ : TJSWorkerGlobalScope Read FSelf;
-  end;
+  {$IFDEF FPC_DOTTEDUNITS}
+  TJSWorkerNavigator = BrowserApi.WorkerBase.TJSWorkerNavigator;
+  TJSWorkerLocation = BrowserApi.WorkerBase.TJSWorkerLocation;
+  TJSWorkerGlobalScope = BrowserApi.WorkerBase.TJSWorkerGlobalScope;
+  {$ELSE}
+  TJSWorkerNavigator = webworkerbase.TJSWorkerNavigator;
+  TJSWorkerLocation = webworkerbase.TJSWorkerLocation;
+  TJSWorkerGlobalScope = webworkerbase.TJSWorkerGlobalScope;
+  {$ENDIF}
 
   { TJSDedicatedWorkerGlobalScope }
+  TJSAnimationFrameCallBack = reference to procedure(aTimeStamp : TJSDOMHighResTimeStamp);
 
   TJSDedicatedWorkerGlobalScope = class external name 'DedicatedWorkerGlobalScope' (TJSWorkerGlobalScope)
   private
     FName: String; external name 'name';
   Public
+    Procedure cancelAnimationFrame(handle : NativeInt);
     Procedure close;
     Procedure postMessage(aMessage : JSValue); overload;
     Procedure postMessage(aMessage : JSValue; TransferableObjects : Array of JSValue); overload;
+    function RequestAnimationFrame(aCallback : TJSAnimationFrameCallBack) : NativeInt;
     Property name : String Read FName;
   end;
 
-  TJSClientsMatchAllOptions = class external name 'Object'
-    includeUncontrolled : Boolean;
-    type_ : string; external name 'type';
-  end;
 
-  TJSClients = class external name 'Clients' (TJSObject)
-    function claim : TJSPromise;
-    function get(ID : String) : TJSPromise;
-    function matchAll : TJSPromise;
-    function matchAll(Options : TJSClientsMatchAllOptions) : TJSPromise;
-    function matchAll(Options : TJSObject) : TJSPromise;
-    function openWindow(url : string) : TJSPromise;
-  end;
-
-  { TJSServiceworkerGlobalScope }
-
-  TJSServiceworkerGlobalScope = class external name 'ServiceWorkerGlobalScope' (TJSWorkerGlobalScope)
-  private
-    FClients: TJSClients; external name 'clients';
-    FRegistration: TJSServiceWorkerRegistration; external name 'registration';
-  Public
-    Function SkipWaiting : TJSPromise; external name 'skipWaiting';
-    property registration : TJSServiceWorkerRegistration Read FRegistration;
-    property clients : TJSClients Read FClients;
-  end;
 
 Var
-  Self_ : TJSServiceWorkerGlobalScope; external name 'self';
+  Self_ : TJSDedicatedWorkerGlobalScope; external name 'self';
   location : TJSWorkerLocation ; external name 'location';
   console : TJSConsole; external name 'console';
   navigator : TJSWorkerNavigator; external name 'navigator';