diff --git a/lcl/buttons.pp b/lcl/buttons.pp
index a57da4bef2..44de84f2f2 100644
--- a/lcl/buttons.pp
+++ b/lcl/buttons.pp
@@ -87,6 +87,7 @@ type
     function GetWidth: Integer;
     procedure SetGlyph(Value: TBitmap);
     procedure SetNumGlyphs(Value: TNumGlyphs);
+    procedure ClearImages;
   protected
     // IUnknown
     function QueryInterface(const iid: tguid; out obj): longint; stdcall;
diff --git a/lcl/include/bitbtn.inc b/lcl/include/bitbtn.inc
index 64bc48e987..0059c757ce 100644
--- a/lcl/include/bitbtn.inc
+++ b/lcl/include/bitbtn.inc
@@ -148,11 +148,11 @@ end;
 procedure TCustomBitBtn.SetNumGlyphs(AValue: Integer);
 begin
   if AValue < 0 then AValue := 1;
-  if AValue > 4 then AValue := 4;
+  if AValue > High(TNumGlyphs) then AValue := High(TNumGlyphs);
 
   if AValue <> FButtonGlyph.NumGlyphs then
   Begin
-    FButtonGlyph.NumGlyphs :=  TNumGlyphs(AValue);
+    FButtonGlyph.NumGlyphs := TNumGlyphs(AValue);
     Invalidate;
   end;
 end;
diff --git a/lcl/include/buttonglyph.inc b/lcl/include/buttonglyph.inc
index 5edb3b66fc..b516359a29 100644
--- a/lcl/include/buttonglyph.inc
+++ b/lcl/include/buttonglyph.inc
@@ -95,10 +95,10 @@ begin
   begin
     if FOriginal.Width mod FOriginal.Height = 0 then
     begin
-      GlyphCount:= FOriginal.Width div FOriginal.Height;
-      if GlyphCount > 4 then
-        GlyphCount:= 1;
-      FNumGlyphs:= TNumGlyphs(GlyphCount);
+      GlyphCount := FOriginal.Width div FOriginal.Height;
+      if GlyphCount > High(TNumGlyphs) then
+        GlyphCount := Low(TNumGlyphs);
+      FNumGlyphs := TNumGlyphs(GlyphCount);
     end;
   end;
   GlyphChanged(FOriginal);
@@ -126,6 +126,7 @@ begin
   begin
     FImagesCache.UnregisterListener(Self);
     FImagesCache := nil; // cache can free on unregister
+    ClearImages;
   end;
 
   if (FOriginal.Width > 0) and (FOriginal.Height > 0) then
@@ -179,6 +180,15 @@ begin
   end;
 end;
 
+procedure TButtonGlyph.ClearImages;
+var
+  i: TButtonState;
+begin
+  FImages := nil;
+  for i := Low(TButtonState) to High(TButtonState) do
+    FImageIndexes[i] := -1;
+end;
+
 function TButtonGlyph.QueryInterface(const iid: tguid; out obj): longint; stdcall;
 begin
   if GetInterface(iid, obj) then
diff --git a/lcl/include/speedbutton.inc b/lcl/include/speedbutton.inc
index 20423c5ad7..a99d8f585c 100644
--- a/lcl/include/speedbutton.inc
+++ b/lcl/include/speedbutton.inc
@@ -238,11 +238,11 @@ end;
 procedure TCustomSpeedButton.SetNumGlyphs(Value : integer);
 Begin
   if Value < 0 then Value := 1;
-  if Value > 4 then Value := 4;
+  if Value > High(TNumGlyphs) then Value := High(TNumGlyphs);
 
   if Value <> TButtonGlyph(fGlyph).NumGlyphs then
   Begin
-    TButtonGlyph(fGlyph).NumGlyphs :=  TNumGlyphs(Value);
+    TButtonGlyph(fGlyph).NumGlyphs := TNumGlyphs(Value);
     Invalidate;
   end;
 end;