Index: controls.pp
===================================================================
--- controls.pp	(revision 20785)
+++ controls.pp	(working copy)
@@ -1585,7 +1585,8 @@
     FOnGetDockCaption: TGetDockCaptionEvent;
     FWinControls: TFPList; // the child controls (only TWinControl, no TControl)
     FDefWndProc: Pointer;
-    FDockClients: TFPList;
+    //FDockClients: TFPList;
+    FNewDockClients: TFPList;
     FClientWidth: Integer;
     FClientHeight: Integer;
     FDockManager: TDockManager;
@@ -1618,6 +1619,7 @@
     function GetControlCount: Integer;
     function GetDockClientCount: Integer;
     function GetDockClients(Index: Integer): TControl;
+    function GetDockClientList: TFPList; virtual;
     function GetHandle: HWND;
     function GetIsResizing: boolean;
     function GetTabOrder: TTabOrder;
@@ -1727,6 +1729,7 @@
     procedure SetDockManager(AMgr: TDockManager);
     procedure DoFloatMsg(ADockSource: TDragDockObject); override;//CM_FLOAT
     procedure DoGetDockCaption(AControl: TControl; var ACaption: String); virtual;
+    property FDockClients: TFPList read GetDockClientList;
   protected
     // mouse and keyboard
     procedure DoEnter; dynamic;
Index: include/wincontrol.inc
===================================================================
--- include/wincontrol.inc	(revision 20785)
+++ include/wincontrol.inc	(working copy)
@@ -5935,6 +5935,26 @@
     Result := 0;
 end;
 
+{------------------------------------------------------------------------------
+  function TWinControl.GetVisibleDockClientCount: Integer;
+ ------------------------------------------------------------------------------}
+function TWinControl.GetVisibleDockClientCount: Integer;
+var
+  i: integer;
+  lst: TFPList;
+begin
+  Result := 0;
+  lst := FDockClients;
+  if lst=nil then exit;
+  for i:=lst.Count-1 downto 0 do
+    if TControl(lst[I]).Visible then inc(Result);
+end;
+
+function TWinControl.GetDockClientList: TFPList;
+begin
+  Result := FNewDockClients;
+end;
+
 function TWinControl.GetDockClients(Index: Integer): TControl;
 begin
   if FDockClients<>nil then
@@ -6054,7 +6074,8 @@
       FreeThenNil(FDockManager)
     else
       FDockManager:=nil;
-  FreeThenNil(FDockClients);
+  //FreeThenNil(FDockClients);
+  FreeThenNil(FNewDockClients);
   FreeThenNil(FTabList);
   //DebugLn('[TWinControl.Destroy] D  ',Name,':',ClassName);
   inherited Destroy;
@@ -7133,19 +7154,6 @@
 end;
 
 {------------------------------------------------------------------------------
-  function TWinControl.GetVisibleDockClientCount: Integer;
- ------------------------------------------------------------------------------}
-function TWinControl.GetVisibleDockClientCount: Integer;
-var
-  i: integer;
-begin
-  Result := 0;
-  if FDockClients=nil then exit;
-  for i:=FDockClients.Count-1 downto 0 do
-    if TControl(FDockClients[I]).Visible then inc(Result);
-end;
-
-{------------------------------------------------------------------------------
   procedure TWinControl.SetChildSizing(const AValue: TControlChildSizing);
  ------------------------------------------------------------------------------}
 procedure TWinControl.SetChildSizing(const AValue: TControlChildSizing);
@@ -7165,14 +7173,10 @@
   FDockSite := NewDockSite;
   if not (csDesigning in ComponentState) then begin
     DragManager.RegisterDockSite(Self,NewDockSite);
-    if not NewDockSite then begin
-      FreeAndNil(FDockClients);
-      FDockClients := nil;
-      DockManager := nil;
-    end
-    else begin
-      if FDockClients = nil then FDockClients := TFPList.Create;
-      DockManager := CreateDockManager;
+    if NewDockSite then begin
+      if FDockClients = nil then FNewDockClients := TFPList.Create;
+      if UseDockManager then
+        DockManager := CreateDockManager;
     end;
   end;
 end;
tc········