diff --git a/cpp_frep/frep.cpp b/cpp_frep/frep.cpp
index 1eb182c2aa6baa0d05256b110116567fcf7986fa..59b88bc801e620477c0698f1d44ea3d419a55327 100755
--- a/cpp_frep/frep.cpp
+++ b/cpp_frep/frep.cpp
@@ -152,6 +152,50 @@ namespace cpp_frep {
             }
         // private:
             
+    };
+
+    class InvoluteGear: public FrepPrimitive {
+        public:
+            scalar module   =1.0f;
+            scalar angle    =20.0f;
+            scalar teeth    =10.0f;
+            scalar addendum =1.0f;
+            scalar dedendum =1.1f;
+            const float  PI_F=3.14159265358979f;
+
+
+            InvoluteGear():module (1.0f), addendum (1.0f), dedendum (1.1f), angle (20.0f), teeth (10.0f) {
+                name="Rectangle";
+            };
+            InvoluteGear(scalar module_, scalar addendum_,scalar dedendum_,scalar angle_,scalar teeth_) {
+                module   =module_;
+                angle    =angle_;
+                teeth    =teeth_;
+                addendum =addendum_;
+                dedendum =dedendum_;
+                name="Gear";
+            };
+
+            scalar eval(){
+                scalar rp = module*teeth/2.0f;     // pitch radius
+                scalar rb = rp*cos(angle);         // base radius
+                scalar ha = addendum*module;       // addendum height
+                scalar hd= dedendum*module;        // dedendum height
+                scalar ai = tan(angle)-angle;      // involute angle
+                scalar ap = 2.0f*PI_F/teeth;       // pitch angle
+
+                angle=PI_F*angle/180.0f;
+ 
+                scalar fn=std::max(std::min(std::min((rp+ha)-sqrtf(X*X+Y*Y),remainderf((PI_F+atan2f(Y,X)),ap)-(sqrtf(pow(std::max(rb,sqrtf(X*X+Y*Y))/rb,2.0)-1.0)-acosf(rb/std::max(rb,sqrt(X*X+Y*Y))))),-(sqrtf(powf(std::max(rb,sqrtf(X*X+Y*Y))/rb,2.0)-1.0)-acosf(rb/std::max(rb,sqrtf(X*X+Y*Y))))-(-(ap/2+2*ai)+remainderf((PI_F+atan2f(Y,X)),ap))),(rp-hd)-sqrtf(X*X+Y*Y));
+
+                return fn;
+            }
+
+            InvoluteGear get(){
+                return *this;
+            }
+        // private:
+            
     };
     //..................................................................//
 
@@ -657,4 +701,7 @@ namespace cpp_frep {
     };
     //..................................................................//
 
+    
+    
+
 }
diff --git a/cpp_frep/main.cpp b/cpp_frep/main.cpp
index 275057ec3d2473af6e5196fb427c06f38aeb2ad6..280c7eef5eda59864c1e91181b3c72a33cc3259f 100755
--- a/cpp_frep/main.cpp
+++ b/cpp_frep/main.cpp
@@ -496,7 +496,9 @@ int main(int const, char const**) {
     // drawFrep(tree,minX, maxX, minY, maxY, dx, dy,"final",false);
 
     PolarArray pa2(&r,45.0f,0.5f);
-    drawFrep(&pa2,minX, maxX, minY, maxY, dx, dy,"polar",true);
+    InvoluteGear gear( 1.0f,  1.0f, 1.1f, 20.0f, 8.0f) ;
+    Scale sc(&gear,0.0f,0.0f,0.25f,0.25f);
+    drawFrep(&sc,minX, maxX, minY, maxY, dx, dy,"gear",true);
 
     tree.printGenome();