Index: cpp/frams/_demos/f0_variants_test.cpp
===================================================================
--- cpp/frams/_demos/f0_variants_test.cpp	(revision 338)
+++ cpp/frams/_demos/f0_variants_test.cpp	(revision 348)
@@ -79,11 +79,13 @@
 DefaultGenoConvManager gcm;
 gcm.addDefaultConverters();
-Geno::useConverters(gcm);
+Geno::useConverters(&gcm);
 
+Geno::Validators validators;
+Geno::useValidators(&validators);
 ModelGenoValidator model_validator;
-Geno::addValidator(&model_validator); //This simple validator handles all cases where a converter for a particular format is available but there is no genetic operator. Converters may be less strict in detecting invalid genotypes but it is better than nothing
+validators+=&model_validator; //This simple validator handles all cases where a converter for a particular format is available but there is no genetic operator. Converters may be less strict in detecting invalid genotypes but it is better than nothing
 
 SString gen(argc>1?argv[1]:"X[|G:1.23]");
-if (!strcmp(gen,"-"))
+if (!strcmp(gen.c_str(),"-"))
 	{
 	gen=0;
@@ -92,7 +94,7 @@
 	}
 Geno g(gen);
-printf("\nSource genotype: '%s'\n",(const char*)g.getGene());
+printf("\nSource genotype: '%s'\n",g.getGene().c_str());
 printf("                  ( format %c %s)\n",
-       g.getFormat(), (const char*)g.getComment());
+       g.getFormat(), g.getComment().c_str());
 
 Model m(g);//.getConverted('0'));
@@ -112,6 +114,6 @@
 save_as_f0(f0_no_skipping_defaults,m,false);
 
-printf("\n==== with defdata (skips default values) ======\n%s\n",(const char*)f0_skipping_defaults);
-printf("\n==== without defdata (saves all fields) ======\n%s\n",(const char*)f0_no_skipping_defaults);
+printf("\n==== with defdata (skips default values) ======\n%s\n",f0_skipping_defaults.c_str());
+printf("\n==== without defdata (saves all fields) ======\n%s\n",f0_no_skipping_defaults.c_str());
 
 return 0;
Index: cpp/frams/_demos/full_props.cpp
===================================================================
--- cpp/frams/_demos/full_props.cpp	(revision 338)
+++ cpp/frams/_demos/full_props.cpp	(revision 348)
@@ -97,5 +97,5 @@
 Geno f0_g;
 m.makeGeno(f0_g,NULL,reverse);//third arg is "handle_defaults" == whether f0 should omit default property values
-puts((const char*)f0_g.toString());
+puts(f0_g.toString().c_str());
 
 return 0;
Index: cpp/frams/_demos/geno_test.cpp
===================================================================
--- cpp/frams/_demos/geno_test.cpp	(revision 338)
+++ cpp/frams/_demos/geno_test.cpp	(revision 348)
@@ -24,5 +24,5 @@
 	}
 SString gen(argv[1]);
-if (!strcmp(gen,"-"))
+if (!strcmp(gen.c_str(),"-"))
 	{
 	gen=0;
Index: cpp/frams/_demos/genoconv_test.cpp
===================================================================
--- cpp/frams/_demos/genoconv_test.cpp	(revision 338)
+++ cpp/frams/_demos/genoconv_test.cpp	(revision 348)
@@ -77,5 +77,5 @@
 {
 SString dst;
-const char* src=in;
+const char* src=in.c_str();
 const char* t;
 int insideneuron=0;
@@ -112,5 +112,5 @@
 {
 printf("Genotype:\n%s\nFormat: %c\nValid: %s\nComment: %s\n",
-	(const char*)g.getGene(),g.getFormat(),g.isValid()?"yes":"no",(const char*)g.getComment());
+	g.getGene().c_str(),g.getFormat(),g.isValid()?"yes":"no",g.getComment().c_str());
 }
 
@@ -124,8 +124,10 @@
 gcm.addConverter(new GenoConv_Test2());
 gcm.addConverter(new GenoConv_Test3());
-Geno::useConverters(gcm);
+Geno::useConverters(&gcm);
 
+Geno::Validators validators;
 ModelGenoValidator model_validator;
-Geno::addValidator(&model_validator);
+validators+=&model_validator;
+Geno::useValidators(&validators);
 
 const char* src=(argc>1)?argv[1]:"X";
Index: cpp/frams/_demos/genomanipulation.cpp
===================================================================
--- cpp/frams/_demos/genomanipulation.cpp	(revision 338)
+++ cpp/frams/_demos/genomanipulation.cpp	(revision 348)
@@ -34,5 +34,5 @@
 	const char* type=pi.type(i);
 	if (*type=='p') continue;
-	printf("%2d. %8s = %-20s %-3s %-10s  %-10s\n",i,pi.id(i),(const char*)pi.get(i),pi.type(i),pi.name(i),pi.grname(pi.group(i)));
+	printf("%2d. %8s = %-20s %-3s %-10s  %-10s\n",i,pi.id(i),pi.get(i).c_str(),pi.type(i),pi.name(i),pi.grname(pi.group(i)));
 	}
 }
@@ -47,10 +47,10 @@
 pi.getMinMax(i,minprop,maxprop,def);
 printf("      Change property #%d to random value from range [%g..%g]\n",i,minprop,maxprop);
-printf("      Current value of '%s' (%s) is '%s'\n",pi.id(i),pi.name(i),(const char*)pi.get(i));
+printf("      Current value of '%s' (%s) is '%s'\n",pi.id(i),pi.name(i),pi.get(i).c_str());
 char t[100];
 sprintf(t,"%g",minprop+(rnd01)*(maxprop-minprop));
 printf("      Setting new value... [ using ParamInterface::set() ]\n");
 pi.set(i,t);
-printf("      The value is now '%s'\n",(const char*)pi.get(i));
+printf("      The value is now '%s'\n",pi.get(i).c_str());
 }
 
@@ -79,5 +79,5 @@
 CHANGE_ONE_PROPERTY(p->extraProperties());
 p->getModel().close();
-printf("\nLet's see f0... (check out part #%d !)\n\n%s\n", p->refno, (const char*)p->getModel().getF0Geno().getGene());
+printf("\nLet's see f0... (check out part #%d !)\n\n%s\n", p->refno, p->getModel().getF0Geno().getGene().c_str());
 }
 
@@ -91,5 +91,5 @@
 j->getModel().close();
 printf("The Part's position is changed, but everything else stays intact:\n\n%s\n",
-       (const char*)j->getModel().getF0Geno().getGene());
+       j->getModel().getF0Geno().getGene().c_str());
 }
 
@@ -104,5 +104,5 @@
 j->getModel().close();
 printf("Position of the second Part referenced by this joint (part #%d) is now changed:\n\n%s\n",
-       j->part2->refno, (const char*)j->getModel().getF0Geno().getGene());
+       j->part2->refno, j->getModel().getF0Geno().getGene().c_str());
 printf("If no delta fields are defined, they will be computed automatically.\n"
        "You can always delete existing delta values by using Joint::resetDelta().\n"
@@ -112,5 +112,5 @@
 j->resetDelta();
 j->getModel().close();
-printf("As you can see, Joint's delta fields have altered:\n\n%s\n", (const char*)j->getModel().getF0Geno().getGene());
+printf("As you can see, Joint's delta fields have altered:\n\n%s\n", j->getModel().getF0Geno().getGene().c_str());
 }
 
@@ -123,5 +123,5 @@
 j->getModel().close();
 printf("f0 is now:\n\n%s\n...so this is %s joint.\n",
-       (const char*)j->getModel().getF0Geno().getGene(), option?"a delta":"an absolute");
+       j->getModel().getF0Geno().getGene().c_str(), option?"a delta":"an absolute");
 
 }
@@ -155,5 +155,5 @@
 CHANGE_ONE_PROPERTY(j->extraProperties());
 j->getModel().close();
-printf("And after that we have this genotype:\n\n%s\n", (const char*)j->getModel().getF0Geno().getGene());
+printf("And after that we have this genotype:\n\n%s\n", j->getModel().getF0Geno().getGene().c_str());
 }
 
@@ -178,15 +178,15 @@
 printf("\nThe most unusual thing is 'details' field (d).\n"
        "It is something like separate object with its own set of properties.\n"
-       "Currently the value of 'd' is '%s'.\n",(const char*)n->getDetails());
+       "Currently the value of 'd' is '%s'.\n",n->getDetails().c_str());
 
 {
 NeuroClass* cl=n->getClass();
 if (!cl)
-	printf("It should contain the class name but the meaning of '%s' is unknown\n",(const char*)n->getDetails());
+	printf("It should contain the class name but the meaning of '%s' is unknown\n",n->getDetails().c_str());
 else
 {
 
 printf("'%s' is the class name (Neuro::getClassName() == '%s') and means '%s'.\n",
-       (const char*)cl->getName(),(const char*)cl->getName(),(const char*)cl->getLongName());
+       cl->getName().c_str(),cl->getName().c_str(),cl->getLongName().c_str());
 printf("Neuro::getClass() gives you information about basic characteristic\n"
        "of the class, that can be analyzed automatically.\n");
@@ -208,5 +208,5 @@
 	p.update();
 	n->getModel().close();
-	printf("After that, 'details' contains the new object: '%s'.\n",(const char*)n->getDetails());
+	printf("After that, 'details' contains the new object: '%s'.\n",n->getDetails().c_str());
 	}
 else
@@ -224,8 +224,8 @@
 	NeuroClass* cl=n->getClass(i);
 	Param p=cl->getProperties();
-	printf("%2d.%6s  %-20s  %2d\n",i,(const char*)cl->getName(),(const char*)cl->getLongName(),p.getPropCount());
+	printf("%2d.%6s  %-20s  %2d\n",i,cl->getName().c_str(),cl->getLongName().c_str(),p.getPropCount());
 	}
 int cl=rand() % n->getClassCount();
-printf("\nLet's change the Neuro's class to '%s'...\n",(const char*)n->getClassName(cl));
+printf("\nLet's change the Neuro's class to '%s'...\n",n->getClassName(cl).c_str());
 n->getModel().open();
 n->setClass(n->getClass(cl));
@@ -242,6 +242,6 @@
 if (n->getInputCount()>0)
 {
-	printf("Info for input #0 = \"%s\"\n",(const char*)n->getInputInfo(0));
-	printf("Info for input #0, field \"%s\" = \"%s\"\n", "abc", (const char*)n->getInputInfo(0,"abc"));
+	printf("Info for input #0 = \"%s\"\n",n->getInputInfo(0).c_str());
+	printf("Info for input #0, field \"%s\" = \"%s\"\n", "abc", n->getInputInfo(0,"abc").c_str());
 	n->setInputInfo(0,"test",44);
 	n->setInputInfo(0,"abc","yeah");
@@ -250,5 +250,5 @@
 n->getModel().close();
 printf("The final object description will be then: '%s'\nAnd the full f0 genotype:\n\n%s\n",
-       (const char*)n->getDetails(), (const char*)n->getModel().getF0Geno().getGene());
+       n->getDetails().c_str(), n->getModel().getF0Geno().getGene().c_str());
 
 
@@ -257,8 +257,8 @@
 void findingConverters()
 {
-GenoConverter *gc=Geno::getConverters().findConverters(0,'1');
+GenoConverter *gc=Geno::getConverters()->findConverters(0,'1');
 if (gc) printf("found converter accepting f1: \"%s\"\n",gc->name);
 SListTempl<GenoConverter*> found;
-Geno::getConverters().findConverters(&found,-1,'0');
+Geno::getConverters()->findConverters(&found,-1,'0');
 printf("found %d converter(s) producing f0\n",found.size());
 }
@@ -274,5 +274,5 @@
 
 SString gen(argc>1?argv[1]:"X[|G:1.23]");
-if (!strcmp(gen,"-"))
+if (!strcmp(gen.c_str(),"-"))
 	{
 	gen=0;
@@ -281,7 +281,7 @@
 	}
 Geno g(gen);
-printf("\nSource genotype: '%s'\n",(const char*)g.getGene());
+printf("\nSource genotype: '%s'\n",g.getGene().c_str());
 printf("                  ( format %c %s)\n",
-       g.getFormat(), (const char*)g.getComment());
+       g.getFormat(), g.getComment().c_str());
 
 Model m(g);//.getConverted('0'));
@@ -292,5 +292,5 @@
 	return 2;	
 	}
-printf("Converted to f0:\n%s\n",(const char*)m.getF0Geno().getGene());
+printf("Converted to f0:\n%s\n",m.getF0Geno().getGene().c_str());
 
 printf("Model contains: %d part(s)\n"
@@ -340,5 +340,5 @@
 		NeuroItem *ni=n->getNeuroItem(j);
 		printf("        item #%d - '%s', conn=%d, weight=%g\n",
-		       j,(const char*)ni->getDetails(),ni->conn_refno,ni->weight);
+		       j,ni->getDetails().c_str(),ni->conn_refno,ni->weight);
 		}
 	}
Index: cpp/frams/_demos/genooper_test.cpp
===================================================================
--- cpp/frams/_demos/genooper_test.cpp	(revision 338)
+++ cpp/frams/_demos/genooper_test.cpp	(revision 348)
@@ -9,5 +9,5 @@
 {
 	printf("Genotype: %s\nFormat: %c\nValid: %s\nComment: %s\n",
-		(const char*)g.getGene(), g.getFormat(), g.isValid() ? "yes" : "no", g.getComment().len() == 0 ? "(empty)" : (const char*)g.getComment());
+		g.getGene().c_str(), g.getFormat(), g.isValid() ? "yes" : "no", g.getComment().len() == 0 ? "(empty)" : g.getComment().c_str());
 }
 
@@ -47,5 +47,5 @@
 	printGenAndTitle(gvalidated, "validated");
 
-	printf("\nHTMLized: %s\n", (const char*)genetics.genman.HTMLize((const char*)gvalidated.getGene()));
+	printf("\nHTMLized: %s\n", genetics.genman.HTMLize(gvalidated.getGene().c_str()).c_str());
 
 	return 0;
Index: cpp/frams/_demos/geometry/apices_test.cpp
===================================================================
--- cpp/frams/_demos/geometry/apices_test.cpp	(revision 338)
+++ cpp/frams/_demos/geometry/apices_test.cpp	(revision 348)
@@ -47,5 +47,5 @@
 	// Finishing result Model and printing its genotype.
 	resultModel.close();
-	puts((const char*)resultModel.getF0Geno().toString());
+	puts(resultModel.getF0Geno().toString().c_str());
 }
 
Index: cpp/frams/_demos/geometry/geometrytestutils.cpp
===================================================================
--- cpp/frams/_demos/geometry/geometrytestutils.cpp	(revision 338)
+++ cpp/frams/_demos/geometry/geometrytestutils.cpp	(revision 348)
@@ -25,10 +25,10 @@
 		
 		fprintf(stderr, "%d. (%6d chars) %s\n", count, genotype->genotype.len(),
-			(const char*)genotype->name);
+			genotype->name.c_str());
 	}
 	
 	if (loader.getStatus() == MiniGenotypeLoader::OnError)
 	{
-		fprintf(stderr, "Error: %s\n", (const char*)loader.getError());
+		fprintf(stderr, "Error: %s\n", loader.getError().c_str());
 		return 2;
 	}
@@ -58,5 +58,5 @@
 		count++;
 		
-		if ((genoIndex == count) || (strcmp((const char*)genotype->name, genoName) == 0))
+		if ((genoIndex == count) || (strcmp(genotype->name.c_str(), genoName) == 0))
 		{
 			Model model(genotype->genotype);
@@ -75,5 +75,5 @@
 	if (loader.getStatus() == MiniGenotypeLoader::OnError)
 	{
-		fprintf(stderr, "Error: %s\n", (const char*)loader.getError());
+		fprintf(stderr, "Error: %s\n", loader.getError().c_str());
 		return 2;
 	}
@@ -156,5 +156,5 @@
 		"GENO_ID - either genotype name or index (1-based)\n"
 		"SHAPE - 1=ellipsoid, 2=cuboid, 3=cylinder, others or none=random\n",
-		(const char*)header);
+		header.c_str());
 	return 1;
 }
@@ -220,5 +220,5 @@
 		"DENSITY - minimal number of samples per unit\n"
 		"SHAPE - 1=ellipsoid, 2=cuboid, 3=cylinder, others or none=random\n",
-		(const char*)header);
+		header.c_str());
 	return 1;
 }
Index: cpp/frams/_demos/geometry/info_test.cpp
===================================================================
--- cpp/frams/_demos/geometry/info_test.cpp	(revision 338)
+++ cpp/frams/_demos/geometry/info_test.cpp	(revision 348)
@@ -72,5 +72,5 @@
 	// Finishing result Model and printing its genotype.
 	resultModel.close();
-	puts((const char*)resultModel.getF0Geno().toString());
+	puts(resultModel.getF0Geno().toString().c_str());
 	
 	// Printing calculated values.
Index: cpp/frams/_demos/geometry/surface_test.cpp
===================================================================
--- cpp/frams/_demos/geometry/surface_test.cpp	(revision 338)
+++ cpp/frams/_demos/geometry/surface_test.cpp	(revision 348)
@@ -47,5 +47,5 @@
 	// Finishing result Model and printing its genotype.
 	resultModel.close();
-	puts((const char*)resultModel.getF0Geno().toString());
+	puts(resultModel.getF0Geno().toString().c_str());
 }
 
Index: cpp/frams/_demos/geometry/volume_test.cpp
===================================================================
--- cpp/frams/_demos/geometry/volume_test.cpp	(revision 338)
+++ cpp/frams/_demos/geometry/volume_test.cpp	(revision 348)
@@ -39,5 +39,5 @@
 	// Finishing result Model and printing its genotype.
 	resultModel.close();
-	puts((const char*)resultModel.getF0Geno().toString());
+	puts(resultModel.getF0Geno().toString().c_str());
 }
 
Index: cpp/frams/_demos/loader_test.cpp
===================================================================
--- cpp/frams/_demos/loader_test.cpp	(revision 338)
+++ cpp/frams/_demos/loader_test.cpp	(revision 348)
@@ -45,15 +45,15 @@
 		else
 			{
-			if (strcmp((const char*)loaded->name,selected))
+			if (strcmp(loaded->name.c_str(),selected))
 				continue;
 			}
-		puts((const char*)loaded->genotype);
+		puts(loaded->genotype.c_str());
 		return 0;
 		}
-	fprintf(stderr,"%d. %s\t(%d characters)\n",count,(const char*)loaded->name,loaded->genotype.len());
+	fprintf(stderr,"%d. %s\t(%d characters)\n",count,loaded->name.c_str(),loaded->genotype.len());
 	}
 // the loop repeats until loaded==NULL, which could be beacause of error
 if (loader.getStatus()==MiniGenotypeLoader::OnError)
-	fprintf(stderr,"Error: %s",(const char*)loader.getError());
+	fprintf(stderr,"Error: %s",loader.getError().c_str());
 // (otherwise it was the end of the file)
 if (selected)
Index: cpp/frams/_demos/loader_test_param.cpp
===================================================================
--- cpp/frams/_demos/loader_test_param.cpp	(revision 338)
+++ cpp/frams/_demos/loader_test_param.cpp	(revision 348)
@@ -84,5 +84,5 @@
 		{
 		case MultiParamLoader::OnComment:
-			fprintf(stderr, "comment: '%s'\n", (const char*)loader.getComment());
+			fprintf(stderr, "comment: '%s'\n", loader.getComment().c_str());
 			break;
 
@@ -92,5 +92,5 @@
 			// In fact, this method is used not just for truly unknown objects but also for
 			// dynamic objects that cannot be added using MultiParamLoader.addObject().
-			fprintf(stderr, "unknown object found: '%s' (will be skipped)\n", (const char*)loader.getObjectName());
+			fprintf(stderr, "unknown object found: '%s' (will be skipped)\n", loader.getObjectName().c_str());
 			break;
 
@@ -98,7 +98,7 @@
 			fprintf(stderr, "loaded:\n");
 			for (int i = 0; i < param.getPropCount(); i++)
-				fprintf(stderr, "%s=%s\n", param.id(i), (const char*)param.getText(i));
-			fprintf(stderr, "type of 'x1' is: %s\n", (const char*)data.x1.typeDescription());
-			fprintf(stderr, "type of 'x2' is: %s\n", (const char*)data.x2.typeDescription());
+				fprintf(stderr, "%s=%s\n", param.id(i), param.getText(i).c_str());
+			fprintf(stderr, "type of 'x1' is: %s\n", data.x1.typeDescription().c_str());
+			fprintf(stderr, "type of 'x2' is: %s\n", data.x2.typeDescription().c_str());
 			fprintf(stderr, "-----\n\n");
 			param.save(&virt_stdout);
@@ -112,5 +112,5 @@
 
 		case MultiParamLoader::OnError:
-			fprintf(stderr, "Error: %s", (const char*)loader.getError());
+			fprintf(stderr, "Error: %s", loader.getError().c_str());
 		}
 	}
Index: cpp/frams/_demos/multiline_f0_test.cpp
===================================================================
--- cpp/frams/_demos/multiline_f0_test.cpp	(revision 338)
+++ cpp/frams/_demos/multiline_f0_test.cpp	(revision 348)
@@ -19,5 +19,5 @@
 
 SString gen(argc>1?argv[1]:"X[|G:1.23]");
-if (!strcmp(gen,"-"))
+if (!strcmp(gen.c_str(),"-"))
 	{
 	gen=0;
@@ -26,7 +26,7 @@
 	}
 Geno g(gen);
-printf("\nSource genotype: '%s'\n",(const char*)g.getGene());
+printf("\nSource genotype: '%s'\n",g.getGene().c_str());
 printf("                  ( format %c %s)\n",
-       g.getFormat(), (const char*)g.getComment());
+       g.getFormat(), g.getComment().c_str());
 
 Model m(g);//.getConverted('0'));
@@ -37,5 +37,5 @@
 	return 2;	
 	}
-printf("Converted to f0:\n%s\n",(const char*)m.getF0Geno().getGene());
+printf("Converted to f0:\n%s\n",m.getF0Geno().getGene().c_str());
 
 printf("\nusing Param::save() to create the \"expanded\" form of the f0 genotype...\n(MultiParamLoader should be able to load this)");
@@ -87,5 +87,5 @@
 	}
 
-printf("\n============================\n%s\n",(const char*)f.getString());
+printf("\n============================\n%s\n",f.getString().c_str());
 
 return 0;
Index: cpp/frams/_demos/neuro_layout_test.cpp
===================================================================
--- cpp/frams/_demos/neuro_layout_test.cpp	(revision 338)
+++ cpp/frams/_demos/neuro_layout_test.cpp	(revision 348)
@@ -94,5 +94,5 @@
 	}
 SString gen(argv[1]);
-if (!strcmp(gen,"-"))
+if (!strcmp(gen.c_str(),"-"))
 	{
 	gen=0;
@@ -116,5 +116,5 @@
 	{
 	int *xywh=nn_layout.GetXYWH(i);
-	printf("#%-3d %s\t%d,%d\t%dx%d\n",i,(const char*)m.getNeuro(i)->getClassName(),
+	printf("#%-3d %s\t%d,%d\t%dx%d\n",i,m.getNeuro(i)->getClassName().c_str(),
 	       xywh[0],xywh[1],xywh[2],xywh[3]);
 	}
@@ -130,6 +130,6 @@
 	{
 	int *xywh=nn_layout.GetXYWH(i);
-	SString label=SString::sprintf("%d:%s",i,(const char*)m.getNeuro(i)->getClassName());
-	screen.put(xywh[0],xywh[1],(const char*)label);
+	SString label=SString::sprintf("%d:%s",i,m.getNeuro(i)->getClassName().c_str());
+	screen.put(xywh[0],xywh[1],label.c_str());
 	}
 screen.print();
Index: cpp/frams/_demos/neuro_test.cpp
===================================================================
--- cpp/frams/_demos/neuro_test.cpp	(revision 338)
+++ cpp/frams/_demos/neuro_test.cpp	(revision 348)
@@ -69,5 +69,5 @@
 	}
 SString gen(argv[1]);
-if (!strcmp(gen,"-"))
+if (!strcmp(gen.c_str(),"-"))
 	{
 	gen=0;
@@ -98,5 +98,5 @@
 			{
 			if (no_impl) no_impl_names+=',';
-			no_impl_names+=SString::sprintf("#%d.%s",i,(const char*)n->getClassName());
+			no_impl_names+=SString::sprintf("#%d.%s",i,n->getClassName().c_str());
 			no_impl++;
 			}
@@ -104,11 +104,11 @@
 			{
 			if (init_err) init_err_names+=',';
-			init_err_names+=SString::sprintf("#%d.%s",i,(const char*)n->getClassName());
+			init_err_names+=SString::sprintf("#%d.%s",i,n->getClassName().c_str());
 			init_err++;
 			}
 		}
 	printf("\n");
-	if (no_impl) printf("%d x missing implementation (%s)\n",no_impl,(const char*)no_impl_names);
-	if (init_err) printf("%d x failed initialization (%s)\n",init_err,(const char*)init_err_names);
+	if (no_impl) printf("%d x missing implementation (%s)\n",no_impl,no_impl_names.c_str());
+	if (init_err) printf("%d x failed initialization (%s)\n",init_err,init_err_names.c_str());
 	}
 int steps=1;
@@ -119,5 +119,5 @@
 	{
 	n=m.getNeuro(i);
-	printf("\t#%d.%s",i,(const char*)n->getClassName());
+	printf("\t#%d.%s",i,n->getClassName().c_str());
 	}
 printf("\n");
Index: cpp/frams/_demos/part_shapes.cpp
===================================================================
--- cpp/frams/_demos/part_shapes.cpp	(revision 338)
+++ cpp/frams/_demos/part_shapes.cpp	(revision 348)
@@ -52,5 +52,5 @@
 
 	m.close();
-	puts((const char*)m.getF0Geno().toString());
+	puts(m.getF0Geno().toString().c_str());
 	// the genotype can be fed directly to the genotype viewer, like this:
 	// part_shapes | theater -g -
Index: cpp/frams/_demos/printconvmap.cpp
===================================================================
--- cpp/frams/_demos/printconvmap.cpp	(revision 338)
+++ cpp/frams/_demos/printconvmap.cpp	(revision 348)
@@ -56,10 +56,10 @@
 SString g2=gen2;
 stripstring(g2);
-const char* g=g1;
+const char* g=g1.c_str();
 y=0;
 MultiRange *mr;
 MultiRange emptyrange;
 printN(' ',GEN1MAX);
-printf("   %s\n",(const char*)g2);
+printf("   %s\n",g2.c_str());
 int begin=map.getBegin();
 int end=map.getEnd();
@@ -83,5 +83,5 @@
 	if ((y2-y) > GEN1MAX) y2=y+GEN1MAX;
 	if (y2>(y+len1)) y2=y+len1;
-	printmapping(g+y,y2-y,*mr,g2,g2.len());
+	printmapping(g+y,y2-y,*mr,g2.c_str(),g2.len());
 	y=y2;
 	}
Index: cpp/frams/_demos/serial_test.cpp
===================================================================
--- cpp/frams/_demos/serial_test.cpp	(revision 338)
+++ cpp/frams/_demos/serial_test.cpp	(revision 348)
@@ -60,5 +60,5 @@
 				{
 				printIndent(indent+3);
-				printf("key \"%s\"\n",(const char*)it->key);
+				printf("key \"%s\"\n",it->key.c_str());
 				print((ExtValue*)it->value,indent+6,&next_trace);
 				}
@@ -67,5 +67,5 @@
 		}
 	}
-puts((const char*)v->getString());
+puts(v->getString().c_str());
 }
 
Index: cpp/frams/_demos/shapeconvert.cpp
===================================================================
--- cpp/frams/_demos/shapeconvert.cpp	(revision 338)
+++ cpp/frams/_demos/shapeconvert.cpp	(revision 348)
@@ -87,5 +87,5 @@
 
 	Geno f0_g = newmodel.getF0Geno();
-	puts((const char*)f0_g.toString());
+	puts(f0_g.toString().c_str());
 
 	return 0;
