Index: /cpp/frams/_demos/genooper_test.cpp
===================================================================
--- /cpp/frams/_demos/genooper_test.cpp	(revision 138)
+++ /cpp/frams/_demos/genooper_test.cpp	(revision 139)
@@ -26,5 +26,5 @@
 	gm.p_report(NULL, NULL);
 
-	const char* src = (argc > 1) ? argv[1] : "/*9*/RRR";
+	const char* src = (argc > 1) ? argv[1] : "/*9*/UUU";
 	Geno gsrc(src, -1, "First");
 	printGenAndTitle(gsrc, "source genotype (gsrc)");
@@ -42,8 +42,8 @@
 	printGenAndTitle(ginvalid, "invalid");
 
-	Geno fixed = gm.Validate(ginvalid);
-	printGenAndTitle(fixed, "validated");
+	Geno gvalidated = gm.Validate(ginvalid);
+	printGenAndTitle(gvalidated, "validated");
 
-	printf("\nHTMLized: %s\n", (const char*)gm.HTMLize((const char*)fixed.getGene()));
+	printf("\nHTMLized: %s\n", (const char*)gm.HTMLize((const char*)gvalidated.getGene()));
 
 	return 0;
Index: /cpp/frams/_demos/part_shapes.cpp
===================================================================
--- /cpp/frams/_demos/part_shapes.cpp	(revision 138)
+++ /cpp/frams/_demos/part_shapes.cpp	(revision 139)
@@ -9,50 +9,50 @@
 int main()
 {
-Model *m=new Model;
-Part *p1,*p2;
-Joint *j;
+	Model m;
+	Part *p1, *p2;
+	Joint *j;
 
-m->open();
+	m.open();
 
-// chain of ellipsoids - subsequent parts are placed relative to the previous part's orientation and location
-p1=m->addNewPart(Part::SHAPE_ELLIPSOID); //initial part
-p1->scale=Pt3D(1.0,0.7,0.4);
+	// chain of ellipsoids - subsequent parts are placed relative to the previous part's orientation and location
+	p1 = m.addNewPart(Part::SHAPE_ELLIPSOID); //initial part
+	p1->scale = Pt3D(1.0, 0.7, 0.4);
 
-Orient rotation=Orient_1; //must be initialized explicitly because the default Orient constructor does not initialize anything
-rotation.rotate(Pt3D(0.1,0.2,0.3));
+	Orient rotation = Orient_1; //must be initialized explicitly because the default Orient constructor does not initialize anything
+	rotation.rotate(Pt3D(0.1, 0.2, 0.3));
 
-for(int N=10;N>0;N--,p1=p2)
+	for (int N = 10; N > 0; N--, p1 = p2)
 	{
-	p2=m->addNewPart(Part::SHAPE_ELLIPSOID);
-	p2->scale=p1->scale*0.9; //each part is smaller than its predecessor
-	
-	Pt3D advance(p1->scale.x,0,0); //advance by previous part's ellipsoid x radius
-	p2->p = p1->p + p1->o.transform(advance); //advance vector transformed by p1 orientation == in p1 local coordinates
-	p2->setOrient(p1->o.transform(rotation)); //rotation transformed by p1 orientation
+		p2 = m.addNewPart(Part::SHAPE_ELLIPSOID);
+		p2->scale = p1->scale*0.9; //each part is smaller than its predecessor
 
-	m->addNewJoint(p1,p2,Joint::SHAPE_SOLID); //all parts must be connected
+		Pt3D advance(p1->scale.x, 0, 0); //advance by previous part's ellipsoid x radius
+		p2->p = p1->p + p1->o.transform(advance); //advance vector transformed by p1's orientation (i.e., in p1's local coordinates)
+		p2->setOrient(p1->o.transform(rotation)); //rotation transformed by p1's orientation
+
+		m.addNewJoint(p1, p2, Joint::SHAPE_SOLID); //all parts must be connected
 	}
 
-// chain of cyllinders - line segments between points calculated from the parametric formula P(a)=(2-2*cos(a),2*sin(a)) (circle with r=2)
-Pt3D prev,next;
-p1=m->getPart(0);
-for(float a=0;a<M_PI;a+=M_PI/10)
+	// chain of cyllinders - line segments between points calculated from the parametric formula P(a)=(2-2*cos(a),2*sin(a)) (circle with r=2)
+	Pt3D prev, next;
+	p1 = m.getPart(0);
+	for (float a = 0; a<M_PI; a += M_PI / 10)
 	{
-	Pt3D next(2-2*cos(a),0,2*sin(a));
-	if (a>0)
+		Pt3D next(2 - 2 * cos(a), 0, 2 * sin(a));
+		if (a>0)
 		{
-		p2=m->addNewPart(Part::SHAPE_CYLINDER);
-		p2->setPositionAndRotationFromAxis(prev,next);
-		p2->scale=Pt3D(prev.distanceTo(next)*0.5,0.05,0.05);// distance*0.5 because scale is "radius", not cylinder length
+			p2 = m.addNewPart(Part::SHAPE_CYLINDER);
+			p2->setPositionAndRotationFromAxis(prev, next);
+			p2->scale = Pt3D(prev.distanceTo(next)*0.5, 0.05, 0.05);// distance*0.5 because scale is "radius", not cylinder length
 
-		m->addNewJoint(p1,p2,Joint::SHAPE_SOLID); //all parts must be connected
+			m.addNewJoint(p1, p2, Joint::SHAPE_SOLID); //all parts must be connected
 		}
-	p1=p2;
-	prev=next;
+		p1 = p2;
+		prev = next;
 	}
 
-m->close();
-puts((const char*)m->getF0Geno().toString());
-// the genotype can be fed directly to the genotype viewer, like this:
-// part_shapes | theater -g -vpart_shapes -
+	m.close();
+	puts((const char*)m.getF0Geno().toString());
+	// the genotype can be fed directly to the genotype viewer, like this:
+	// part_shapes | theater -g -vpart_shapes -
 }
Index: /cpp/frams/genetics/defgenoconv.cpp
===================================================================
--- /cpp/frams/genetics/defgenoconv.cpp	(revision 138)
+++ /cpp/frams/genetics/defgenoconv.cpp	(revision 139)
@@ -7,68 +7,74 @@
 #include GEN_CONFIG_FILE
 
-#ifdef USE_GENCONV_F10
+#ifdef USE_GENCONV_f10
 #include "f1/conv_f1.h"
 #endif
-#ifdef USE_GENCONV_F20
+#ifdef USE_GENCONV_f20
 #include "f2/conv_f2.h"
 #endif
-#ifdef USE_GENCONV_F32
+#ifdef USE_GENCONV_f32
 #include "f3/conv_f3.h"
 #endif
-#ifdef USE_GENCONV_F40
+#ifdef USE_GENCONV_f40
 #include "f4/conv_f4.h"
 #endif
-#ifdef USE_GENCONV_F41_TEST
+#ifdef USE_GENCONV_f41_TEST
 #include "f4/conv_f4.h"
 #endif
-#ifdef USE_GENCONV_F50
+#ifdef USE_GENCONV_f50
 #include "f5/conv_f5.h"
 #endif
-#ifdef USE_GENCONV_F60
+#ifdef USE_GENCONV_f60
 #include "f6/geno_f6.h"
 #endif
-#ifdef USE_GENCONV_F70
+#ifdef USE_GENCONV_f70
 #include "f7/conv_f7.h"
 #endif
-#ifdef USE_GENCONV_F81
+#ifdef USE_GENCONV_f81
 #include "f8/conv_f8tof1.h"
 #endif
-#ifdef USE_GENCONV_F90
+#ifdef USE_GENCONV_f90
 #include "f9/conv_f9.h"
+#endif
+#ifdef USE_GENCONV_fF0
+#include "fF/conv_fF.h"
 #endif
 
 DefaultGenoConvManager::DefaultGenoConvManager()
 {
-#ifdef USE_GENCONV_F10
-addConverter(new GenoConv_F1());
+#ifdef USE_GENCONV_f10
+	addConverter(new GenoConv_f1());
 #endif
-#ifdef USE_GENCONV_F20
-addConverter(new GenoConv_F20());
+#ifdef USE_GENCONV_f20
+	addConverter(new GenoConv_f20());
 #endif
-#ifdef USE_GENCONV_F32
-addConverter(new GenoConv_F32());
+#ifdef USE_GENCONV_f32
+	addConverter(new GenoConv_f32());
 #endif
-#ifdef USE_GENCONV_F40
-addConverter(new GenoConv_F40());
+#ifdef USE_GENCONV_f40
+	addConverter(new GenoConv_f40());
 #endif
-#ifdef USE_GENCONV_F41_TEST
-addConverter(new GenoConv_F41_TestOnly());
+#ifdef USE_GENCONV_f41_TEST
+	addConverter(new GenoConv_f41_TestOnly());
 #endif
-#ifdef USE_GENCONV_F50
-addConverter(new GenoConv_F50);
+#ifdef USE_GENCONV_f50
+	addConverter(new GenoConv_f50);
 #endif
-#ifdef USE_GENCONV_F60
-addConverter(new GenoConv_F60);
+#ifdef USE_GENCONV_f60
+	addConverter(new GenoConv_f60);
 #endif
-#ifdef USE_GENCONV_F70
-addConverter(new GenoConv_F70);
+#ifdef USE_GENCONV_f70
+	addConverter(new GenoConv_f70);
 #endif
-#ifdef USE_GENCONV_F81
-addConverter(new GenoConv_F8ToF1());
+#ifdef USE_GENCONV_f81
+	addConverter(new GenoConv_f8ToF1());
 #endif
-#ifdef USE_GENCONV_F90
-addConverter(new GenoConv_F90);
+#ifdef USE_GENCONV_f90
+	addConverter(new GenoConv_f90);
+#endif
+#ifdef USE_GENCONV_fF0
+	addConverter(new GenoConv_fF0);
 #endif
 
-param.updatetab();
+	param.updatetab();
 }
Index: /cpp/frams/genetics/f1/conv_f1.cpp
===================================================================
--- /cpp/frams/genetics/f1/conv_f1.cpp	(revision 138)
+++ /cpp/frams/genetics/f1/conv_f1.cpp	(revision 139)
@@ -100,5 +100,5 @@
 
 /** main conversion function - with conversion map support */
-SString GenoConv_F1::convert(SString &i,MultiMap *map)
+SString GenoConv_f1::convert(SString &i,MultiMap *map)
 {
 const char* g=(const char*)i;
Index: /cpp/frams/genetics/f1/conv_f1.h
===================================================================
--- /cpp/frams/genetics/f1/conv_f1.h	(revision 138)
+++ /cpp/frams/genetics/f1/conv_f1.h	(revision 139)
@@ -60,8 +60,8 @@
  
 */
-class GenoConv_F1: public GenoConverter
+class GenoConv_f1: public GenoConverter
 {
 public:
-GenoConv_F1()
+GenoConv_f1()
 	{
 	name="Recursive encoding";
@@ -70,5 +70,5 @@
 	}
 SString convert(SString &i,MultiMap *map);
-~GenoConv_F1() {}
+~GenoConv_f1() {}
 };
 
Index: /cpp/frams/genetics/f9/conv_f9.cpp
===================================================================
--- /cpp/frams/genetics/f9/conv_f9.cpp	(revision 138)
+++ /cpp/frams/genetics/f9/conv_f9.cpp	(revision 139)
@@ -10,5 +10,5 @@
 #define APPLY_DETERMINISTIC_BODY_NOISE //this representation easily produces perfectly vertical sticks that would stay upright forever. In most cases such infinite perfection is not desired, so we make the construct less perfect by perturbing its coordinates.
 
-GenoConv_F90::GenoConv_F90()
+GenoConv_f90::GenoConv_f90()
 {
 	name = "Turtle3D-ortho encoding";
@@ -25,5 +25,5 @@
 //const char* turtle_commandsZ_f9="0000-+";
 
-SString GenoConv_F90::convert(SString &in, MultiMap *map)
+SString GenoConv_f90::convert(SString &in, MultiMap *map)
 {
 	vector<XYZ_LOC> vertices;
@@ -55,5 +55,5 @@
 }
 
-int GenoConv_F90::addSegment(Model &m,vector<XYZ_LOC> &vertices,const XYZ_LOC &new_vertex,int recently_added)
+int GenoConv_f90::addSegment(Model &m,vector<XYZ_LOC> &vertices,const XYZ_LOC &new_vertex,int recently_added)
 {
 	if (vertices.size()<1)
@@ -77,5 +77,5 @@
 }
 
-int GenoConv_F90::findVertexAt(vector<XYZ_LOC> &vertices,const XYZ_LOC &vertex)
+int GenoConv_f90::findVertexAt(vector<XYZ_LOC> &vertices,const XYZ_LOC &vertex)
 {
 	for(int i=0;i<vertices.size();i++)
@@ -85,5 +85,5 @@
 
 
-int GenoConv_F90::addNewVertex(Model &m,vector<XYZ_LOC> &vertices,const XYZ_LOC &new_vertex)
+int GenoConv_f90::addNewVertex(Model &m,vector<XYZ_LOC> &vertices,const XYZ_LOC &new_vertex)
 {
 	Part *p=new Part;
@@ -110,5 +110,5 @@
 }
 
-void GenoConv_F90::setColors(Model &m) //sets fixed (independent from genes) colors and widths on a model, purely for aesthetic purposes
+void GenoConv_f90::setColors(Model &m) //sets fixed (independent from genes) colors and widths on a model, purely for aesthetic purposes
 {
 	//a rainbow on Joints: from the first one red, through middle green, to blue or violet - last
@@ -145,5 +145,5 @@
 }
 
-void GenoConv_F90::perturbPartLocations(Model &m) //deterministic "body noise", see APPLY_DETERMINISTIC_BODY_NOISE
+void GenoConv_f90::perturbPartLocations(Model &m) //deterministic "body noise", see APPLY_DETERMINISTIC_BODY_NOISE
 {
 	for(int i=0;i<m.getPartCount();i++)
Index: /cpp/frams/genetics/f9/conv_f9.h
===================================================================
--- /cpp/frams/genetics/f9/conv_f9.h	(revision 138)
+++ /cpp/frams/genetics/f9/conv_f9.h	(revision 139)
@@ -29,10 +29,10 @@
 
 // The f9->f0 converter
-class GenoConv_F90: public GenoConverter
+class GenoConv_f90: public GenoConverter
 {
 public:
-	GenoConv_F90();
+	GenoConv_f90();
 
-	//implementation GenoConverter method
+	//implementation of the GenoConverter method
 	SString convert(SString &in, MultiMap *map);
 
Index: /cpp/frams/genetics/f9/oper_f9.h
===================================================================
--- /cpp/frams/genetics/f9/oper_f9.h	(revision 138)
+++ /cpp/frams/genetics/f9/oper_f9.h	(revision 139)
@@ -18,5 +18,5 @@
 	int crossOver(char *&g1,char *&g2,float& chg1,float& chg2);
 	unsigned long style(const char *g, int pos);
-	char* getSimplest() {return "R";}
+	const char* getSimplest() {return "R";}
 
 	double mut_prob; //mutation probability
Index: /cpp/frams/genetics/gen-config-GDK.h
===================================================================
--- /cpp/frams/genetics/gen-config-GDK.h	(revision 138)
+++ /cpp/frams/genetics/gen-config-GDK.h	(revision 139)
@@ -12,17 +12,17 @@
  */
 
-#define USE_GENCONV_F10
-//#define USE_GENCONV_F21
-//#define USE_GENCONV_F30
-//#define USE_GENCONV_F40
-//#define USE_GENCONV_F41_TEST
-//#define USE_GENCONV_F50
-#define USE_GENCONV_F90
+#define USE_GENCONV_f10
+//#define USE_GENCONV_f21
+//#define USE_GENCONV_f30
+//#define USE_GENCONV_f40
+//#define USE_GENCONV_f41_TEST
+//#define USE_GENCONV_f50
+#define USE_GENCONV_f90
 
-//#define USE_GENMAN_F0
-//#define USE_GENMAN_F1
-//#define USE_GENMAN_F2
-//#define USE_GENMAN_F3
-//#define USE_GENMAN_F4
-//#define USE_GENMAN_F5
-#define USE_GENMAN_F9
+//#define USE_GENMAN_f0
+//#define USE_GENMAN_f1
+//#define USE_GENMAN_f2
+//#define USE_GENMAN_f3
+//#define USE_GENMAN_f4
+//#define USE_GENMAN_f5
+#define USE_GENMAN_f9
Index: /cpp/frams/genetics/genman.cpp
===================================================================
--- /cpp/frams/genetics/genman.cpp	(revision 138)
+++ /cpp/frams/genetics/genman.cpp	(revision 139)
@@ -11,36 +11,39 @@
 
 
-#ifdef USE_GENMAN_F0
+#ifdef USE_GENMAN_f0
 #include "f0/oper_f0.h"
 #endif
-#ifdef USE_GENMAN_F0FUZZY
+#ifdef USE_GENMAN_f0FUZZY
 #include "f0/oper_f0Fuzzy.h"
 #endif
-#ifdef USE_GENMAN_F1
+#ifdef USE_GENMAN_f1
 #include "f1/oper_f1.h"
 #endif
-#ifdef USE_GENMAN_F2
+#ifdef USE_GENMAN_f2
 #include "f2/oper_f2.h"
 #endif
-#ifdef USE_GENMAN_F2
+#ifdef USE_GENMAN_f2
 #include "f3/oper_f3.h"
 #endif
-#ifdef USE_GENMAN_F4
+#ifdef USE_GENMAN_f4
 #include "f4/oper_f4.h"
 #endif
-#ifdef USE_GENMAN_F5
+#ifdef USE_GENMAN_f5
 #include "f5/oper_f5.h"
 #endif
-#ifdef USE_GENMAN_F6
+#ifdef USE_GENMAN_f6
 #include "f6/oper_f6.h"
 #endif
-#ifdef USE_GENMAN_F7
+#ifdef USE_GENMAN_f7
 #include "f7/oper_f7.h"
 #endif
-#ifdef USE_GENMAN_F8
+#ifdef USE_GENMAN_f8
 #include "f8/oper_f8.h"
 #endif
-#ifdef USE_GENMAN_F9
+#ifdef USE_GENMAN_f9
 #include "f9/oper_f9.h"
+#endif
+#ifdef USE_GENMAN_fF
+#include "fF/oper_fF.h"
 #endif
 
@@ -101,36 +104,39 @@
 	clearStats();
 
-#ifdef USE_GENMAN_F0
+#ifdef USE_GENMAN_f0
 	geno_fx_list.push_back(new Geno_f0);
 #endif
-#ifdef USE_GENMAN_F0FUZZY
+#ifdef USE_GENMAN_f0FUZZY
 	geno_fx_list.push_back(new Geno_f0Fuzzy);
 #endif
-#ifdef USE_GENMAN_F1
+#ifdef USE_GENMAN_f1
 	geno_fx_list.push_back(new Geno_f1);
 #endif
-#ifdef USE_GENMAN_F2
+#ifdef USE_GENMAN_f2
 	geno_fx_list.push_back(new Geno_f2);
 #endif
-#ifdef USE_GENMAN_F3
+#ifdef USE_GENMAN_f3
 	geno_fx_list.push_back(new Geno_f3);
 #endif
-#ifdef USE_GENMAN_F4
+#ifdef USE_GENMAN_f4
 	geno_fx_list.push_back(new Geno_f4);
 #endif
-#ifdef USE_GENMAN_F5
+#ifdef USE_GENMAN_f5
 	geno_fx_list.push_back(new Geno_f5);
 #endif
-#ifdef USE_GENMAN_F6
+#ifdef USE_GENMAN_f6
 	geno_fx_list.push_back(new Geno_f6);
 #endif
-#ifdef USE_GENMAN_F7
+#ifdef USE_GENMAN_f7
 	geno_fx_list.push_back(new Geno_f7);
 #endif
-#ifdef USE_GENMAN_F8
+#ifdef USE_GENMAN_f8
 	geno_fx_list.push_back(new Geno_f8);
 #endif
-#ifdef USE_GENMAN_F9
+#ifdef USE_GENMAN_f9
 	geno_fx_list.push_back(new GenoOper_f9);
+#endif
+#ifdef USE_GENMAN_fF
+	geno_fx_list.push_back(new GenoOper_fF);
 #endif
 
Index: /cpp/frams/genetics/oper_fx.h
===================================================================
--- /cpp/frams/genetics/oper_fx.h	(revision 138)
+++ /cpp/frams/genetics/oper_fx.h	(revision 139)
@@ -160,5 +160,5 @@
 
 /**\return a pointer to the simplest genotype string*/
-   virtual char* getSimplest() {return NULL;}
+   virtual const char* getSimplest() {return NULL;}
 
 /**You may want to have your genotype colored. This method provides desired character styles for genes.
Index: /cpp/frams/util/3d.h
===================================================================
--- /cpp/frams/util/3d.h	(revision 138)
+++ /cpp/frams/util/3d.h	(revision 139)
@@ -62,4 +62,7 @@
 void getAngles(const Pt3D& X,const Pt3D& dir);
 void vectorProduct(const Pt3D& a,const Pt3D& b);
+Pt3D vectorProduct(const Pt3D& p) const {return (*this)*p;}
+Pt3D entrywiseProduct(const Pt3D &p) const {return Pt3D(x*p.x,y*p.y,z*p.z);} ///< also known as Hadamard product or Schur product
+double dotProduct(const Pt3D& p) const {return x*p.x+y*p.y+z*p.z;}
 bool normalize();
 };
