diff --git "a/src\\ShapeUpgrade\\ShapeUpgrade_UnifySameDomain.cxx" "b/src\\ShapeUpgrade\\ShapeUpgrade_UnifySameDomain.cxx"
index 6126155..f2f6326 100644
@@ -231,6 +231,73 @@ static Standard_Boolean getCylinder(Handle(Geom_Surface)& theInSurface,
   return isCylinder;
 }
 
+//=======================================================================
+//function : GetLinExtrudeDirection
+//purpose  : auxilary
+//=======================================================================
+static Standard_Boolean GetLinExtrudeDirection(Handle(Geom_Surface)& theInSurface,
+    gp_Dir& theOutDirection)
+{
+    Standard_Boolean hasDirection = Standard_False;
+
+    if(theInSurface->IsKind(STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion)))
+    {
+        Handle(Geom_SurfaceOfLinearExtrusion) aLES =
+            Handle(Geom_SurfaceOfLinearExtrusion)::DownCast(theInSurface);
+
+        theOutDirection = aLES->Direction();
+
+        hasDirection = Standard_True;
+    }
+
+    return hasDirection;
+}
+
+//=======================================================================
+//function : CompareCuves
+//purpose  : auxilary
+//=======================================================================
+static Standard_Boolean CompareCuves(const Handle(Geom_Curve)& aCurve1,
+    const Handle(Geom_Curve)& aCurve2, Standard_Real theLinearTol, Standard_Real theAngularTol)
+{
+    Standard_Boolean isSame = Standard_False;
+
+    if(aCurve1 == aCurve2)
+    {
+        isSame = Standard_True;
+    }
+    else if(aCurve1->IsKind(STANDARD_TYPE(Geom_BSplineCurve)) &&
+        aCurve2->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))
+    {
+        Handle(Geom_BSplineCurve) aBSC1 = Handle(Geom_BSplineCurve)::DownCast(aCurve1);
+        Handle(Geom_BSplineCurve) aBSC2 = Handle(Geom_BSplineCurve)::DownCast(aCurve2);
+
+        if((aBSC1->StartPoint().IsEqual(aBSC2->StartPoint(), theLinearTol) &&
+            aBSC1->IsEqual(aBSC2, theLinearTol)) ||
+            (aBSC1->StartPoint().IsEqual(aBSC2->EndPoint(), theLinearTol) &&
+            aBSC1->IsEqual(Handle(Geom_BSplineCurve)::DownCast(aBSC2->Reversed()), theLinearTol)))
+        {
+            isSame = Standard_True;
+        }
+    }
+    else if(aCurve1->IsKind(STANDARD_TYPE(Geom_BezierCurve)) &&
+        aCurve2->IsKind(STANDARD_TYPE(Geom_BezierCurve)))
+    {
+        Handle(Geom_BezierCurve) aBSC1 = Handle(Geom_BezierCurve)::DownCast(aCurve1);
+        Handle(Geom_BezierCurve) aBSC2 = Handle(Geom_BezierCurve)::DownCast(aCurve2);
+
+        if((aBSC1->StartPoint().IsEqual(aBSC2->StartPoint(), theLinearTol) &&
+            aBSC1->IsEqual(aBSC2, theLinearTol)) ||
+            (aBSC1->StartPoint().IsEqual(aBSC2->EndPoint(), theLinearTol) &&
+            aBSC1->IsEqual(Handle(Geom_BezierCurve)::DownCast(aBSC2->Reversed()), theLinearTol)))
+        {
+            isSame = Standard_True;
+        }
+    }
+
+    return isSame;
+}
+
 //=======================================================================
 //function : ClearRts
 //purpose  : auxilary
@@ -371,17 +438,36 @@ static Standard_Boolean IsSameDomain(const TopoDS_Face& aFace,
       if (fabs(aCyl1.Radius() - aCyl2.Radius()) < theLinTol) {
         gp_Dir aDir1 = aCyl1.Position().Direction();
         gp_Dir aDir2 = aCyl2.Position().Direction();
-        if (aDir1.IsParallel(aDir2, Precision::Angular())) {
+        if (aDir1.IsParallel(aDir2, theAngTol)) {
           gp_Pnt aLoc1 = aCyl1.Location();
           gp_Pnt aLoc2 = aCyl2.Location();
           gp_Vec aVec12 (aLoc1, aLoc2);
           if (aVec12.SquareMagnitude() < theLinTol*theLinTol ||
-              aVec12.IsParallel(aDir1, Precision::Angular())) {
+              aVec12.IsParallel(aDir1, theAngTol)) {
             return Standard_True;
           }
         }
       }
     }
+    else
+    {
+        gp_Dir aDir1, aDir2;
+        if(GetLinExtrudeDirection(S1, aDir1) && 
+            GetLinExtrudeDirection(S2, aDir2) &&
+            aDir1.IsParallel(aDir2, theAngTol))
+        {
+            Handle(Geom_SurfaceOfLinearExtrusion) aLES1 =
+                Handle(Geom_SurfaceOfLinearExtrusion)::DownCast(S1);
+            Handle(Geom_SurfaceOfLinearExtrusion) aLES2 =
+                Handle(Geom_SurfaceOfLinearExtrusion)::DownCast(S2);
+
+            if(CompareCuves(aLES1->BasisCurve(), aLES2->BasisCurve(),
+                theLinTol, theAngTol))
+            {
+                return Standard_True;
+            }
+        }
+    }
   }
 
   return Standard_False;
@@ -1376,8 +1462,7 @@ void ShapeUpgrade_UnifySameDomain::IntUnifyFaces(const TopoDS_Shape& theInpShape
           gp_Dir aDN2;
           if (GetNormalToSurface(aCheckedFaceOriginal, edge, aTMid, aDN2)) {
             // and check if the adjacent faces are having approximately same normals
-            Standard_Real anAngle = aDN1.Angle(aDN2);
-            if (anAngle > myAngTol) {
+            if (!aDN1.IsParallel(aDN2, myAngTol)) {
               continue;
             }
           }
