diff --git a/src/QABugs/QABugs_11.cxx b/src/QABugs/QABugs_11.cxx
index ef0c381cb4..78b24ce412 100644
--- a/src/QABugs/QABugs_11.cxx
+++ b/src/QABugs/QABugs_11.cxx
@@ -4608,26 +4608,6 @@ Standard_Integer OCC22301 (Draw_Interpretor& di, Standard_Integer argc, const ch
 
   return 0;
 }
-#include <ShapeFix_FixSmallFace.hxx>
-Standard_Integer OCC22586 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
-{
-	
-  if (argc != 3) {
-    di << "Usage : " << argv[0] << " shape resshape\n";
-    return 1;
-  }
-  
-  // try to read a shape:
-  TopoDS_Shape aShape=DBRep::Get(argv[1]);
-  ShapeFix_FixSmallFace aFixSmallFaces;
-  aFixSmallFaces.Init (aShape);
-  aFixSmallFaces.Perform();
-  TopoDS_Shape aResShape = aFixSmallFaces.Shape();
-  DBRep::Set(argv[2],aResShape);
-  
-  return 0;
-
-}
 
 #include <NCollection_DataMap.hxx>
 Standard_Integer OCC22744 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
@@ -4910,7 +4890,6 @@ void QABugs::Commands_11(Draw_Interpretor& theCommands) {
   theCommands.Add("OCC20627", "OCC20627", __FILE__, OCC20627, group);
   theCommands.Add("OCC17424", "OCC17424  shape X_Pnt Y_Pnt Z_Pnt X_Dir Y_Dir Z_Dir PInf", __FILE__, OCC17424, group);
   theCommands.Add("OCC22301", "OCC22301", __FILE__, OCC22301, group);
-  theCommands.Add("OCC22586", "OCC22586 shape resshape", __FILE__, OCC22586, group);
   theCommands.Add("OCC22736", "OCC22736 X_mirrorFirstPoint Y_mirrorFirstPoint X_mirrorSecondPoint Y_mirrorSecondPoint X_p1 Y_p1 X_p2 Y_p2", __FILE__, OCC22736, group);
   theCommands.Add("OCC22744", "OCC22744", __FILE__, OCC22744, group);
   theCommands.Add("OCC22762", "OCC22762 x1 y1 z1 x2 y2 z3", __FILE__, OCC22762, group);
diff --git a/src/SWDRAW/SWDRAW_ShapeFix.cxx b/src/SWDRAW/SWDRAW_ShapeFix.cxx
index 69e545ab9a..9ede795a60 100644
--- a/src/SWDRAW/SWDRAW_ShapeFix.cxx
+++ b/src/SWDRAW/SWDRAW_ShapeFix.cxx
@@ -39,6 +39,7 @@
 #include <ShapeExtend_WireData.hxx>
 #include <ShapeFix.hxx>
 #include <ShapeFix_Face.hxx>
+#include <ShapeFix_FixSmallFace.hxx>
 #include <ShapeFix_Shape.hxx>
 #include <ShapeFix_ShapeTolerance.hxx>
 #include <ShapeFix_Wire.hxx>
@@ -633,6 +634,42 @@ static Standard_Integer fixsmalledges(Draw_Interpretor& di, Standard_Integer n,
   return 0;
 }
 
+//=======================================================================
+//function : fixsmallfaces
+//purpose  : 
+//=======================================================================
+
+Standard_Integer fixsmallfaces (Draw_Interpretor& theDI, Standard_Integer theArgc, const char** theArgv)
+{
+  if (theArgc < 3)
+  {
+    std::cerr << "Use: " << theArgv[0] << " result shape [tolerance]" << std::endl;
+    return 1;
+  }
+  
+  TopoDS_Shape aShape = DBRep::Get(theArgv[2]);
+  if (aShape.IsNull()) {
+    theDI << "Error: Shape " << theArgv[2] << " is null\n";
+    return 1;
+  }
+
+  Standard_Real aPrec = (theArgc < 4 ? 1. : Draw::Atof(theArgv[3]));
+
+  ShapeFix_FixSmallFace aFixSmallFaces;
+  aFixSmallFaces.Init (aShape);
+  aFixSmallFaces.SetPrecision(aPrec);
+  aFixSmallFaces.Perform();
+  if (! aFixSmallFaces.Shape().IsSame (aShape))
+  {
+    theDI << "Small faces are removed";
+    aShape = aFixSmallFaces.Shape();
+  }
+
+  DBRep::Set (theArgv[1], aShape);
+
+  return 0;
+}
+
 //=======================================================================
 //function : checkoverlapedges
 //purpose  : 
@@ -823,6 +860,8 @@ static Standard_Integer connectedges(Draw_Interpretor& di, Standard_Integer n, c
 		   __FILE__,fixsmall,g);
   theCommands.Add ("fixsmalledges","result shape [toler mode amxangle]",
 		   __FILE__,fixsmalledges,g);
+  theCommands.Add ("fixsmallfaces","result shape [toler=1.]",
+		   __FILE__,fixsmallfaces,g);
   theCommands.Add ("checkoverlapedges","edge1 edge2 [toler domaindist]",
 		   __FILE__,checkoverlapedges,g);
   theCommands.Add ("checkfclass2d","face ucoord vcoord",
diff --git a/tests/bugs/modalg_2/bug22586 b/tests/bugs/modalg_2/bug22586
index ca49c4f1d6..3d6beda719 100755
--- a/tests/bugs/modalg_2/bug22586
+++ b/tests/bugs/modalg_2/bug22586
@@ -1,22 +1,15 @@
 pload QAcommands
 
-puts "==========="
-puts "OCC22586"
-puts "==========="
+puts "# ==================================================================="
+puts "# 0022586: ShapeFix_FixSmallFace mistakenly removes a non-small pipe-like face with a seam edge"
+puts "# ==================================================================="
 puts ""
-#######################################################################
-# ShapeFix_FixSmallFace mistakenly removes a non-small pipe-like face with a seam edge
-#######################################################################
 
 set BugNumber OCC22586
 
 restore [locate_data_file OCC22586.brep] shape 
 
-if { [catch { OCC22586 shape result } catch_result] } {
-    puts "Faulty ${BugNumber}"
-} else {
-    puts "${BugNumber}  OK"
-}
+fixsmallfaces result shape 1.e-7
 
 checkprops result -s 10975
 checkview -display result -3d -path ${imagedir}/${test_image}.png
diff --git a/tests/bugs/modalg_7/bug28112 b/tests/bugs/modalg_7/bug28112_1
similarity index 100%
rename from tests/bugs/modalg_7/bug28112
rename to tests/bugs/modalg_7/bug28112_1
diff --git a/tests/bugs/modalg_7/bug28112_2 b/tests/bugs/modalg_7/bug28112_2
new file mode 100644
index 0000000000..61f38508e5
--- /dev/null
+++ b/tests/bugs/modalg_7/bug28112_2
@@ -0,0 +1,21 @@
+puts "# ================================================================="
+puts "# 0028112:  E x c e p t i o n  during offset computation"
+puts "# ================================================================="
+
+puts ""
+puts "# Fixing small faces on first shape..."
+restore [locate_data_file bug28112_1.brep] shape1
+fixsmallfaces fix1 shape1 -1
+checknbshapes fix1 -face 4
+
+puts ""
+puts "# Fixing small faces on second shape..."
+restore [locate_data_file bug28112_2.brep] shape2
+fixsmallfaces fix2 shape2 -1
+checknbshapes fix2 -face 4
+
+puts ""
+puts "# Trying offset on both shapes to ensure that it works after removal"
+puts "# of small faces"
+offsetshapesimple res1 fix1 10.
+offsetshapesimple res2 fix2 10.