Index: /cpp/frams/genetics/f1/conv_f1.cpp
===================================================================
--- /cpp/frams/genetics/f1/conv_f1.cpp	(revision 725)
+++ /cpp/frams/genetics/f1/conv_f1.cpp	(revision 726)
@@ -111,5 +111,5 @@
 	Builder builder(g, map ? 1 : 0);
 	builder.model.open();
-	builder.grow(-1, g, Pt3D_0, stdprops, -1); // uses Model::singleStepBuild to create model elements
+	builder.grow(-1, g, Pt3D_0, stdprops, -1); // uses Model::addFromString() to create model elements
 	if (builder.invalid) return SString();
 	builder.addPendingInputs();
@@ -323,15 +323,15 @@
 {
 	double len = min(2.0, c.length);
-	sprintf(tmp, "j:p1=%ld,p2=%ld,dx=%lg,rx=%lg,ry=%lg,rz=%lg,stam=%lg,vr=%g,vg=%g,vb=%g",
+	sprintf(tmp, "p1=%ld,p2=%ld,dx=%lg,rx=%lg,ry=%lg,rz=%lg,stam=%lg,vr=%g,vg=%g,vb=%g",
 		part1, part2, len, angle.x, angle.y, angle.z, c.stamina, c.cred, c.cgreen, c.cblue);
 	lastjoint_muscle_power = c.muscle_power;
-	return model.singleStepBuild(tmp, makeRange(g));
+	return model.addFromString(Model::JointType, tmp, makeRange(g));
 }
 
 int Builder::growPart(F1Props &c, const char *g)
 {
-	sprintf(tmp, "p:dn=%lg,fr=%lg,ing=%lg,as=%lg,vs=%g,vr=%g,vg=%g,vb=%g",
+	sprintf(tmp, "dn=%lg,fr=%lg,ing=%lg,as=%lg,vs=%g,vr=%g,vg=%g,vb=%g",
 		1.0 / c.weight, c.friction, c.ingestion, c.assimilation, c.visual_size, c.cred, c.cgreen, c.cblue);
-	return model.singleStepBuild(tmp, makeRange(g));
+	return model.addFromString(Model::PartType, tmp, makeRange(g));
 }
 
Index: /cpp/frams/genetics/f4/conv_f4.cpp
===================================================================
--- /cpp/frams/genetics/f4/conv_f4.cpp	(revision 725)
+++ /cpp/frams/genetics/f4/conv_f4.cpp	(revision 726)
@@ -178,9 +178,9 @@
 			// new part object for firstend
 			// coordinates are left to be computed by Model
-			sprintf(tmpLine, "p:fr=%g,ing=%g,as=%g",
+			sprintf(tmpLine, "fr=%g,ing=%g,as=%g",
 				/*1.0/C->P.mass,*/ C->P.friction, C->P.ingestion, C->P.assimilation
 				//C->firstend.x, C->firstend.y, C->firstend.z
 				);
-			partidx = singleStepBuild(tmpLine, &range);
+			partidx = addFromString(PartType, tmpLine, &range);
 			if (partidx < 0) return -1;
 			jj_p1_refno = partidx;
@@ -194,9 +194,9 @@
 		}
 		// new part object for lastend
-		sprintf(tmpLine, "p:fr=%g,ing=%g,as=%g",
+		sprintf(tmpLine, "fr=%g,ing=%g,as=%g",
 			//C->lastend.x, C->lastend.y, C->lastend.z
 			/*"vol=" 1.0/C->P.mass,*/ C->P.friction, C->P.ingestion, C->P.assimilation
 			);
-		partidx = singleStepBuild(tmpLine, &range);
+		partidx = addFromString(PartType, tmpLine, &range);
 		if (partidx < 0) return -2;
 		C->p2_refno = partidx;
@@ -207,5 +207,5 @@
 		if ((jj_p1_refno < 0) || (jj_p1_refno >= getPartCount())) return -11;
 		if ((jj_p2_refno < 0) || (jj_p2_refno >= getPartCount())) return -12;
-		sprintf(tmpLine, "j:p1=%ld,p2=%ld,dx=%g,dy=0,dz=0,rx=%g,ry=0,rz=%g"\
+		sprintf(tmpLine, "p1=%ld,p2=%ld,dx=%g,dy=0,dz=0,rx=%g,ry=0,rz=%g"\
 			",stam=%g",
 			jj_p1_refno, jj_p2_refno,
@@ -218,5 +218,5 @@
 			C->P.stamina
 			);
-		partidx = singleStepBuild(tmpLine, &range);
+		partidx = addFromString(JointType, tmpLine, &range);
 		if (partidx < 0) return -13;
 		C->joint_refno = partidx;
@@ -230,8 +230,8 @@
 		if ((p_refno < 0) || (p_refno >= getPartCount())) return -21;
 		// joint_refno is currently not used
-		sprintf(tmpLine, "n:p=%ld,d=\"N:in=%g,fo=%g,si=%g\"",
+		sprintf(tmpLine, "p=%ld,d=\"N:in=%g,fo=%g,si=%g\"",
 			p_refno,
 			C->inertia, C->force, C->sigmo);
-		partidx = singleStepBuild(tmpLine, &range);
+		partidx = addFromString(NeuronType, tmpLine, &range);
 		if (partidx < 0) return -22;
 		C->neuro_refno = partidx;
@@ -241,11 +241,11 @@
 		{
 			if (1 == C->ctrl)
-				sprintf(tmpLine, "n:j=%d,d=\"@:p=%g\"", C->dadlink->joint_refno, C->P.muscle_power);
+				sprintf(tmpLine, "j=%d,d=\"@:p=%g\"", C->dadlink->joint_refno, C->P.muscle_power);
 			else
-				sprintf(tmpLine, "n:j=%d,d=\"|:p=%g,r=%g\"", C->dadlink->joint_refno, C->P.muscle_power, C->mz);
-			partidx = singleStepBuild(tmpLine, &range);
+				sprintf(tmpLine, "j=%d,d=\"|:p=%g,r=%g\"", C->dadlink->joint_refno, C->P.muscle_power, C->mz);
+			partidx = addFromString(NeuronType, tmpLine, &range);
 			if (partidx < 0) return -32;
-			sprintf(tmpLine, "c:%d,%d", partidx, n_refno);
-			if (singleStepBuild(tmpLine, &range) < 0) return -33;
+			sprintf(tmpLine, "%d,%d", partidx, n_refno);
+			if (addFromString(NeuronConnectionType, tmpLine, &range) < 0) return -33;
 		}
 
@@ -256,12 +256,12 @@
 
 			tmpLine[0] = 0;
-			if (1 == C->links[j]->t) sprintf(tmpLine, "n:p=%d,d=\"*\"", p_refno);
-			if (2 == C->links[j]->t) sprintf(tmpLine, "n:j=%d,d=\"G\"", C->dadlink->joint_refno);
-			if (3 == C->links[j]->t) sprintf(tmpLine, "n:p=%d,d=\"T\"", p_refno);
-			if (4 == C->links[j]->t) sprintf(tmpLine, "n:p=%d,d=\"S\"", p_refno);
+			if (1 == C->links[j]->t) sprintf(tmpLine, "p=%d,d=\"*\"", p_refno);
+			if (2 == C->links[j]->t) sprintf(tmpLine, "j=%d,d=\"G\"", C->dadlink->joint_refno);
+			if (3 == C->links[j]->t) sprintf(tmpLine, "p=%d,d=\"T\"", p_refno);
+			if (4 == C->links[j]->t) sprintf(tmpLine, "p=%d,d=\"S\"", p_refno);
 			int from = -1;
 			if (tmpLine[0]) //input from receptor
 			{
-				from = singleStepBuild(tmpLine, &range);
+				from = addFromString(NeuronType, tmpLine, &range);
 				if (from < 0) return -34;
 			} /*could be 'else'...*/
@@ -270,6 +270,6 @@
 			if (from >= 0)
 			{
-				sprintf(tmpLine, "c:%d,%d,%g", n_refno, from, C->links[j]->w);
-				if (singleStepBuild(tmpLine, &range) < 0) return -35;
+				sprintf(tmpLine, "%d,%d,%g", n_refno, from, C->links[j]->w);
+				if (addFromString(NeuronConnectionType, tmpLine, &range) < 0) return -35;
 			}
 		}
Index: /cpp/frams/model/model.cpp
===================================================================
--- /cpp/frams/model/model.cpp	(revision 725)
+++ /cpp/frams/model/model.cpp	(revision 726)
@@ -22,8 +22,4 @@
 	startenergy = 1.0;
 	checklevel = 1;
-#ifdef MODEL_V1_COMPATIBLE
-	oldneurocount=-1; // == unknown
-	oldconnections=0;
-#endif
 	map = 0;
 	f0map = 0;
@@ -295,4 +291,19 @@
 }
 
+Model::ItemType Model::itemTypeFromLinePrefix(const char* line)
+{
+struct PrefixAndItem { const char* prefix; ItemType type; };
+static const PrefixAndItem types[]={ {"m:",ModelType},{"p:",PartType},{"j:",JointType},{"n:",NeuronType},{"c:",NeuronConnectionType},{NULL} };
+for(const PrefixAndItem *t=types;t->prefix!=NULL;t++)
+	{
+	const char* in=line;
+	const char* pattern=t->prefix;
+	for(;*in==*pattern;in++,pattern++)
+		if (*pattern==':')
+			return t->type;
+	}
+return UnknownType;
+}
+
 void Model::build()
 {
@@ -322,4 +333,22 @@
 	for (; f0txt.getNextToken(pos, line, '\n'); lnum++)
 	{
+		const char* line_ptr=line.c_str();
+		for (; *line_ptr; line_ptr++)
+			if (!strchr(" \r\t", *line_ptr)) break;
+		if (*line_ptr == '#') continue;
+		if (!*line_ptr) continue;
+
+		const char* colon=strchr(line_ptr,':');
+		ItemType type=UnknownType;
+		SString excluding_prefix;
+		if (colon!=NULL)
+			{
+			colon++;
+			type=itemTypeFromLinePrefix(line_ptr);
+			for (; *colon; colon++)
+				if (!strchr(" \r\t", *colon)) break;
+			excluding_prefix=colon;
+			}
+		
 		if (autobuildmaps)
 		{
@@ -328,5 +357,5 @@
 		}
 		mh.reset();
-		if (singleStepBuild(line, lnum, autobuildmaps ? (&frommap) : 0) == -1)
+		if (addFromString(type, excluding_prefix, lnum, autobuildmaps ? (&frommap) : 0) == -1)
 		{
 			buildstatus = invalid;
@@ -558,13 +587,13 @@
 }
 
-int Model::singleStepBuild(const SString &singleline, const MultiRange* srcrange)
-{
-	return singleStepBuild(singleline, 0, srcrange);
-}
-
-int Model::singleStepBuild(const SString &singleline, int line_num, const MultiRange* srcrange)
+int Model::addFromString(ItemType item_type, const SString &singleline, const MultiRange* srcrange)
+{
+	return addFromString(item_type,singleline, 0, srcrange);
+}
+
+int Model::addFromString(ItemType item_type, const SString &singleline, int line_num, const MultiRange* srcrange)
 {
 	SString error_message;
-	int result = singleStepBuildNoLog(singleline, error_message, srcrange);
+	int result = addFromStringNoLog(item_type, singleline, error_message, srcrange);
 	if (result < 0)
 	{
@@ -579,19 +608,15 @@
 }
 
-int Model::singleStepBuildNoLog(const SString &line, SString& error_message, const MultiRange* srcrange)
+int Model::addFromStringNoLog(ItemType item_type, const SString &line, SString& error_message, const MultiRange* srcrange)
 {
 	error_message = SString::empty();
-	const char*t = line.c_str();
 	ParamInterface::LoadOptions opts;
-	for (; *t; t++, opts.offset++)
-		if (!strchr(" \r\t", *t)) break;
-	if (*t == '#') return 0;
-	if (!*t) return 0;
-	if (!strncmp(t, "p:", 2))
-	{
+	switch(item_type)
+		{
+		case PartType:
+		{
 		Param partparam(f0_part_paramtab);
 		Part *p = new Part();
 		partparam.select(p);
-		opts.offset += 2;
 		partparam.load(ParamInterface::FormatSingleLine, line, &opts);
 		if (opts.parse_failed) { delete p; error_message = "Invalid 'p:'"; return -1; }
@@ -601,20 +626,20 @@
 		if (srcrange) p->setMapping(*srcrange);
 		return getPartCount() - 1;
-	}
-	if (!strncmp(t, "m:", 2))
-	{
+		}
+
+		case ModelType:
+		{
 		Param modelparam(f0_model_paramtab);
 		modelparam.select(this);
-		opts.offset += 2;
 		modelparam.load(ParamInterface::FormatSingleLine, line, &opts);
 		if (opts.parse_failed) { error_message = "Invalid 'm:'"; return -1; }
 		return 0;
-	}
-	else if (!strncmp(t, "j:", 2))
-	{
+		}
+
+		case JointType:
+		{
 		Param jointparam(f0_joint_paramtab);
 		Joint *j = new Joint();
 		jointparam.select(j);
-		opts.offset += 2;
 		j->owner = this;
 		jointparam.load(ParamInterface::FormatSingleLine, line, &opts);
@@ -640,28 +665,13 @@
 			return -1;
 		}
-	}
-	else if (!strncmp(t, "n:", 2)) // neuro (or the old neuro object as the special case)
-	{
+		}
+
+		case NeuronType:
+		{
 		Param neuroparam(f0_neuro_paramtab);
 		Neuro *nu = new Neuro();
 		neuroparam.select(nu);
-		opts.offset += 2;
 		neuroparam.load(ParamInterface::FormatSingleLine, line, &opts);
 		if (opts.parse_failed) { delete nu; error_message = "Invalid 'n:'"; return -1; }
-#ifdef MODEL_V1_COMPATIBLE
-		if (nu->neuro_refno>=0) // parent specified...
-		{
-			if (nu->neuro_refno >= getNeuroCount()) // and it's illegal
-			{
-				delete nu;
-				return -1;
-			}
-			Neuro *parentNU=getNeuro(nu->neuro_refno);
-			parentNU->addInput(nu,nu->weight);
-			// default class for parented units: n-n link
-			//if (nu->moredata.len()==0) nu->moredata="-";
-		}
-		else
-#endif
 		{
 			// default class for unparented units: standard neuron
@@ -680,7 +690,4 @@
 			}
 			*/
-#ifdef MODEL_V1_COMPATIBLE
-		nu->weight=1.0;
-#endif
 		nu->owner = this;
 		// attach to part/joint
@@ -703,25 +710,15 @@
 		if (srcrange) nu->setMapping(*srcrange);
 		// todo: check part/joint ref# 
-#ifdef MODEL_V1_COMPATIBLE
-		if (hasOldNeuroLayout())
-		{
-			int count=old_getNeuroCount();
-			neurons.insert(count,nu);
-			oldneurocount=count+1;
-			return oldneurocount-1;
-		}
-		else
-#endif
 		{
 			neurons += nu;
 			return neurons.size() - 1;
 		}
-	}
-	else if (!strncmp(t, "c:", 2)) // add input
-	{
+		}
+
+		case NeuronConnectionType:			
+		{
 		Param ncparam(f0_neuroconn_paramtab);
 		NeuroConn c;
 		ncparam.select(&c);
-		opts.offset += 2;
 		ncparam.load(ParamInterface::FormatSingleLine, line, &opts);
 		if (opts.parse_failed) { error_message = "Invalid 'c:'"; return -1; }
@@ -739,100 +736,12 @@
 		error_message = SString::sprintf("Invalid reference to Neuro #%d", n1_ok ? c.n2_refno : c.n1_refno);
 		return -1;
-	}
-#ifdef MODEL_V1_COMPATIBLE
-	else if (!strncmp(t,"ni:",3)) // old neuroitem
-	{
-		// we always use old layout for "ni:"
-		Param neuroitemparam(f0_neuroitem_paramtab);
-		Neuro *nu=new Neuro();
-		neuroitemparam.select(nu);
-		opts.offset+=3;
-		neuroitemparam.loadSingleLine(line,opts);
-		if (opts.parse_failed) {delete nu; return -1;}
-		// illegal parent?
-		if ((nu->neuro_refno<0)||(nu->neuro_refno>=old_getNeuroCount()))
-		{
-			delete nu;
+		}
+
+		case UnknownType: //handled by addFromString for uniform error handling
 			return -1;
 		}
-		Neuro *parentN=getNeuro(nu->neuro_refno);
-		// copy part/joint refno from parent, if possible
-		if ((nu->part_refno<0)&&(parentN->part_refno>=0))
-			nu->part_refno=parentN->part_refno;
-		if ((nu->joint_refno<0)&&(parentN->joint_refno>=0))
-			nu->joint_refno=parentN->joint_refno;
-		nu->owner=this;
-		// attach to part/joint
-		if (nu->part_refno>=0)
-			nu->attachToPart(nu->part_refno);
-		if (nu->joint_refno>=0)
-			nu->attachToJoint(nu->joint_refno);
-		if (srcrange)
-			nu->setMapping(*srcrange);
-		// special case: old muscles
-		// PARENT neuron will be set up to be the CHILD of the current one (!)
-		if (nu->isOldEffector())
-		{
-			nu->neuro_refno=parentN->refno;
-			neurons+=nu;
-			nu->owner=this;
-			nu->addInput(parentN,nu->weight); // (!)
-			nu->weight=1.0;
-			parentN->invalidateOldItems();
-			return 0; // !!! -> ...getItemCount()-1;
-		}
-		parentN->addInput(nu,nu->weight);
-		neurons+=nu;
-		parentN->invalidateOldItems();
-		if (nu->getClassName().len()==0)
-		{
-			nu->setClassName("-");
-			// for compatibility, "ni" can define a n-n connection
-			// referring to non-existent neuron (which will be hopefully defined later)
-			// internal check will add the proper input to this unit
-			// if conn_refno >=0 and input count==0
-			oldconnections=1;
-			if (srcrange)
-				parentN->addMapping(*srcrange);
-		}
-		else
-			nu->weight=1.0;
-		return 0; // !!! -> ...getItemCount()-1;
-	}
-#endif
-	else return -1;
-}
-
-#ifdef MODEL_V1_COMPATIBLE
-int Model::addOldConnectionsInputs()
-{
-	if (!oldconnections) return 1;
-	Neuro* n;
-	for (int i=0;i<neurons.size();i++)
-	{
-		n=(Neuro*)neurons(i);
-		if (n->conn_refno>=0)
-			if (n->isNNConnection())
-				if (n->conn_refno < old_getNeuroCount())
-				{ // good reference
-			Neuro* parent=n->parent; // nn connection has exactly one parent
-			int inp=parent->findInput(n);
-			Neuro* target=getNeuro(n->conn_refno);
-			parent->setInput(inp,target,n->weight);
-			removeNeuro(i,0); // no need to remove references
-			i--;
-				}
-				else
-				{
-					logPrintf("Model","internalCheck",LOG_ERROR,
-						"illegal N-N connection #%d (reference to #%d)%s",
-						i,n->conn_refno,nameForErrors().c_str());
-					return 0;
-				}
-	}
-	oldconnections=0;
-	return 1;
-}
-#endif
+	return -1;
+}
+
 
 /////////////
@@ -847,39 +756,6 @@
 	neurons.insert(newpos, n);
 	// conn_refno could be broken -> fix it
-#ifdef MODEL_V1_COMPATIBLE
-	for (int i=0;i<neurons.size();i++)
-	{
-		Neuro *n2=getNeuro(i);
-		if (n2->isNNConnection())
-			if (n2->conn_refno == oldpos) n2->conn_refno=newpos;
-			else
-			{ if (n2->conn_refno > oldpos) n2->conn_refno--;
-		if (n2->conn_refno >= newpos) n2->conn_refno++; }
-	}
-	invalidateOldNeuroCount();
-#endif
-}
-
-#ifdef MODEL_V1_COMPATIBLE
-/** move all old neurons (class "N") to the front of the neurons list.
-	@return number of old neurons
-	*/
-int Model::reorderToOldLayout()
-{
-	Neuro *n;
-	int neurocount=0;
-	for (int i=0;i<neurons.size();i++)
-	{
-		n=(Neuro*)neurons(i);
-		if (n->isOldNeuron())
-		{
-			moveNeuro(i,neurocount);
-			neurocount++;
-			i=neurocount-1;
-		}
-	}
-	return neurocount;
-}
-#endif
+}
+
 ////////////
 
@@ -1058,8 +934,4 @@
 		}
 	}
-#ifdef MODEL_V1_COMPATIBLE
-	if (!addOldConnectionsInputs())
-		return 0;
-#endif
 
 	updateNeuroRefno(); // valid refno is important for n-n connections check (later)
@@ -1068,12 +940,4 @@
 	{
 		n = (Neuro*)neurons(i);
-#ifdef MODEL_V1_COMPATIBLE
-		VALIDMINMAX(n,Neuro,inertia);
-		VALIDMINMAX(n,Neuro,force);
-		VALIDMINMAX(n,Neuro,sigmo);
-		n->conn_refno=-1;
-		n->weight=1.0;
-		n->neuro_refno=-1;
-#endif
 		n->part_refno = (n->part) ? n->part->refno : -1;
 		n->joint_refno = (n->joint) ? n->joint->refno : -1;
@@ -1245,38 +1109,4 @@
 }
 
-
-////////////////////
-
-#ifdef MODEL_V1_COMPATIBLE
-void Model::calcOldNeuroCount()
-{
-	if (oldneurocount>=0) return;
-	oldneurocount=reorderToOldLayout();
-}
-
-int Model::old_getNeuroCount()
-{ calcOldNeuroCount();
-return oldneurocount;}
-
-Neuro* Model::old_getNeuro(int i) 
-{calcOldNeuroCount();
-return (i<oldneurocount)? (Neuro*)getNeuro(i) : (Neuro*)0;
-}
-
-int Model::old_findNeuro(Neuro* n)
-{calcOldNeuroCount();
-return findNeuro(n);}
-
-Neuro *Model::old_addNewNeuro()
-{
-	int count=old_getNeuroCount();
-	Neuro *nu=addNewNeuro();
-	nu->setClassName("N");
-	moveNeuro(nu->refno,oldneurocount);
-	oldneurocount=count+1;
-	return (Neuro*)nu;
-}
-#endif
-
 ///////////////////////
 
Index: /cpp/frams/model/model.h
===================================================================
--- /cpp/frams/model/model.h	(revision 725)
+++ /cpp/frams/model/model.h	(revision 726)
@@ -75,33 +75,4 @@
 	SList parts, joints, neurons;
 	char partmappingchanged;
-
-#ifdef MODEL_V1_COMPATIBLE
-	/** NeuroCount value.
-		compatibility_neurocount = -1 if its value is unknown and the layout is not compatible
-		@see reorderToOldLayout()
-		*/
-	int oldneurocount;
-	char oldconnections;
-
-	/** calculate oldNeuroCount */
-	void calcOldNeuroCount();
-	/** some new calls can invalidate old compatibility data */
-	void invalidateOldNeuroCount() {oldneurocount=-1;}
-	/**
-	   for compatibility with old NeuroClass the layout of Neurons
-	   is changed when old 'Neuro' accessing methods are in use.
-	   Neurons:
-	   0 .. compatibility_neurocount-1                : old Neurons (class "N")
-	   compatibility_neurocount .. neurons.size()-1   : other units
-	   */
-	int reorderToOldLayout();
-
-	/** check if compatibility should be preserved */
-	int hasOldNeuroLayout() {return oldneurocount>=0;}
-
-	/** add inputs to the old "-" units.
-		@return 1=ok, 0=invalid input detected  */
-	int addOldConnectionsInputs();
-#endif
 
 	void internalCopy(const Model &mod);
@@ -284,4 +255,6 @@
 	void clear();
 
+	enum ItemType { UnknownType,ModelType,PartType,JointType,NeuronType,NeuronConnectionType };
+	static ItemType itemTypeFromLinePrefix(const char* line);
 	/** Execute single line of <B>f0</B> genotype.
 		Return value is non-negative reference number of the created item,
@@ -291,9 +264,9 @@
 		@param srcrange source genotype range which will be mapped to this element
 		*/
-	int singleStepBuild(const SString &singleline, int line_num, const MultiRange* srcrange = NULL);
+	int addFromString(ItemType item_type,const SString &singleline, int line_num, const MultiRange* srcrange = NULL);
 	/** Execute single line of <B>f0</B> genotype - compatiblity variant */
-	int singleStepBuild(const SString &singleline, const MultiRange* srcrange = NULL);
+	int addFromString(ItemType item_type,const SString &singleline, const MultiRange* srcrange = NULL);
 	/** Execute single line of <B>f0</B> genotype - low level variant, used by Model::build(), error messages returned as string instead of calling logger */
-	int singleStepBuildNoLog(const SString &singleline, SString& error_message, const MultiRange* srcrange = 0);
+	int addFromStringNoLog(ItemType item_type,const SString &singleline, SString& error_message, const MultiRange* srcrange = 0);
 
 	/// separate build stages (for future use)
@@ -346,21 +319,4 @@
 	/// you can access neurons 0 .. getNeuroCount()-1.
 	Neuro *getNeuro(int i) const;
-
-#ifdef MODEL_V1_COMPATIBLE
-	/* compatibility calls for accessing old Neuro objects */
-
-	/// @deprecated Neuro class will be removed soon
-	/// @see compat
-	int old_getNeuroCount();
-	/// you can access neurons 0 .. getNeuroCount()-1.
-	/// @deprecated Neuro class will be removed soon
-	Neuro *old_getNeuro(int i);
-	/// @see addNewNeuro, addNeuro
-	/// @deprecated Neuro class will be removed soon
-	Neuro *old_addNewNeuro();
-	/// @return neuro index or -1 if not found
-	/// @deprecated Neuro class will be removed soon
-	int old_findNeuro(Neuro* n);
-#endif
 
 	/** create new Part and add it to the model. @see addPart()  */
Index: /cpp/frams/model/modelparts.cpp
===================================================================
--- /cpp/frams/model/modelparts.cpp	(revision 725)
+++ /cpp/frams/model/modelparts.cpp	(revision 726)
@@ -193,11 +193,5 @@
 Neuro::Neuro(double _state, double _inertia, double _force, double _sigmo)
 	:PartBase(getDefaultStyle()), state(_state)
-#ifdef MODEL_V1_COMPATIBLE
-	,inertia(_inertia),force(_force),sigmo(_sigmo)
-#endif
-{
-#ifdef MODEL_V1_COMPATIBLE
-	olditems=0;
-#endif
+{
 	flags = 0;
 	myclass = 0;
@@ -217,7 +211,4 @@
 	parent = 0; part = 0; joint = 0;
 	parentcount = 0;
-#ifdef MODEL_V1_COMPATIBLE
-	olditems=0;
-#endif
 	flags = 0;
 	part_refno = -1; joint_refno = -1;
@@ -227,7 +218,4 @@
 Neuro::~Neuro()
 {
-#ifdef MODEL_V1_COMPATIBLE
-	if (olditems) delete olditems;
-#endif
 	int i;
 	for (i = 0; i < inputs.size(); i++)
@@ -281,13 +269,4 @@
 {
 	refno = src.refno;
-#ifdef MODEL_V1_COMPATIBLE
-	neuro_refno=-1;
-	conn_refno=-1;
-	force=src.force;
-	sigmo=src.sigmo;
-	inertia=src.inertia;
-	weight=src.weight;
-	olditems=0;
-#endif
 	state = src.state;
 	part_refno = -1;
@@ -567,80 +546,4 @@
 #endif
 }
-
-/////// old items
-#ifdef MODEL_V1_COMPATIBLE
-void OldItems::buildlist()
-{ // guaranteed to work only for old NN layouts
-	// (neurons,neuro connections, old receptors and effectors)
-	if (listok) return;
-	// inputs can contain both neuroitem connections (details="") and direct neuron references (details="N")
-	// in OldItems we create neuroitems freom direct references
-	for(int i=0;i<neuro.getInputCount();i++)
-	{
-		float w;
-		Neuro *n=neuro.getInput(i,w);
-		if (n->isOldNeuron())
-		{
-			Neuro *ni=new Neuro();
-			ni->setClassName("-");
-			ni->weight=w;
-			ni->neuro_refno=neuro.refno;
-			ni->conn_refno=n->refno;
-			items+=ni;
-			syntitems+=ni;
-		}
-		else
-		{
-			items+=n;
-			n->weight=w;
-		}
-	}
-	SList outputs;
-	neuro.findOutputs(outputs);
-	FOREACH(Neuro*,n,outputs)
-	{
-		if (n->isNNConnection() || n->isOldNeuron())
-			outputs-=n;
-	}
-	items+=outputs;
-	listok=1;
-}
-
-void OldItems::freelist()
-{
-	FOREACH(Neuro*,n,syntitems)
-		delete n;
-	syntitems.clear();
-	items.clear();
-	listok=0;
-}
-
-int OldItems::getItemCount()
-{
-	buildlist();
-	return items.size();
-}
-
-NeuroItem *OldItems::getNeuroItem(int i)
-{
-	buildlist();
-	return (NeuroItem*)items(i);
-}
-
-NeuroItem *OldItems::addNewNeuroItem()
-{
-	Neuro *nu=neuro.getModel().addNewNeuro();
-	nu->setClassName("-");
-	if (listok) items+=nu;
-	neuro.addInput(nu);
-	return (NeuroItem*)nu;
-}
-
-int OldItems::findNeuroItem(NeuroItem *ni)
-{
-	buildlist();
-	return items.find((void*)ni);
-}
-#endif
 
 ///////////////////////////////////////
@@ -801,49 +704,7 @@
 }
 
-
 /////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////
 
 #include F0_CLASSES_FILE
-
-#ifdef MODEL_V1_COMPATIBLE
-
-#define FIELDSTRUCT Neuro
-ParamEntry f0_old_neuro_tab[]=
-{
-	{"Connections",2,6,"n",},
-	{"Other properties",},
-	{"p",0,0,"part ref#","d",FIELD(part_refno),},
-	{"j",0,0,"joint ref#","d",FIELD(joint_refno),},
-	{"s",1,0,"state","f",FIELD(state),},
-	{"in",1,0,"Inertia","f",FIELD(inertia),},
-	{"fo",1,0,"Force","f",FIELD(force),},
-	{"si",1,0,"Sigmoid","f",FIELD(sigmo),},
-	{0,0,0,},
-}; 
-#undef FIELDSTRUCT
-
-#define FIELDSTRUCT NeuroItem
-ParamEntry f0_neuroitem_paramtab[]=
-{
-	{"Connections",3,12,"ni",},
-	{"Geometry",},
-	{"Other",},
-	{"n",0,0,"neuron ref#","d",FIELD(neuro_refno),},
-	{"c",2,0,"connection ref#","d",FIELD(conn_refno),},
-	{"w",2,0,"connection weight","f",FIELD(weight),},
-	{"p",0,0,"part ref#","d",FIELD(part_refno),},
-	{"j",0,0,"joint ref#","d",FIELD(joint_refno),},
-	{"px",1,0,"position.x","f",FIELD(pos.x),},
-	{"py",1,0,"position.y","f",FIELD(pos.y),},
-	{"pz",1,0,"position.z","f",FIELD(pos.z),},
-	{"rx",1,0,"rotation.x","f",FIELD(rot.x),},
-	{"ry",1,0,"rotation.y","f",FIELD(rot.y),},
-	{"rz",1,0,"rotation.z","f",FIELD(rot.z),},
-	{"d",2,0,"item details","s",GETSET(details),},
-	{0,0,0,},
-}; 
-#undef FIELDSTRUCT
-#endif
 
 ////////////////////////////////////////
Index: /cpp/frams/model/modelparts.h
===================================================================
--- /cpp/frams/model/modelparts.h	(revision 725)
+++ /cpp/frams/model/modelparts.h	(revision 726)
@@ -19,6 +19,4 @@
 
 #include <stdio.h>
-
-//#define MODEL_V1_COMPATIBLE
 
 class Model;
@@ -289,27 +287,4 @@
 class Neuro;
 
-#ifdef MODEL_V1_COMPATIBLE
-class NeuroItem;
-
-/** for compatibility with old Neuro/NeuroItem  */
-class OldItems
-{
-	Neuro &neuro;
-	SList syntitems; ///< to be deleted
-	SList items;
-	int listok;
-public:
-	OldItems(Neuro &n):neuro(n),listok(0) {}
-	~OldItems() {freelist();}
-	void buildlist();
-	void freelist();
-
-	int getItemCount();
-	NeuroItem *getNeuroItem(int i);
-	NeuroItem *addNewNeuroItem();
-	int findNeuroItem(NeuroItem *n);
-};
-#endif
-
 /** Single processing unit in Framsticks NN.  */
 class Neuro : public PartBase
@@ -482,30 +457,4 @@
 	static int getClassIndex(const NeuroClass*nc);
 
-#ifdef MODEL_V1_COMPATIBLE
-	friend class OldItems;
-	paInt neuro_refno; ///< parent ref# (called neuro_refno for compatibility with old Neuro class), @see moredata
-	paInt conn_refno; ///< the other neuron ref# in N-N connections, can be used by some other items
-	double weight; ///< weight of the N-N connection and (all?) receptors
-	double inertia,force,sigmo; //!!!
-
-	/** @deprecated provided only for compatibility with old Neuro/NeuroItem classes.
-		use getInputCount() instead. @sa getInputCount() */
-	int getItemCount() {return oldItems().getItemCount();}
-
-	/** @deprecated provided only for compatibility with old Neuro/NeuroItem classes.
-		use getInput() instead. @sa getInput() */
-	NeuroItem* getNeuroItem(int i) {return oldItems().getNeuroItem(i);}
-#endif
-
-protected:
-#ifdef MODEL_V1_COMPATIBLE
-	/** old Neuro compatibility */
-	OldItems* olditems;
-	OldItems& oldItems() {if (!olditems) olditems=new OldItems(*this); return *olditems;}
-	void invalidateOldItems() {if (olditems) olditems->freelist();}
-#endif
-
-public:
-
 	// not really private, but you should not access those directly
 	double state;
@@ -522,15 +471,4 @@
 };
 
-#ifdef MODEL_V1_COMPATIBLE
-class NeuroItem;
-
-/// for compatibility with old NeuroItem class.
-class NeuroItem: public Neuro
-{
-public:
-	NeuroItem() {}
-};
-#endif
-
 class NeuroExt : public Neuro
 {
Index: /cpp/frams/neuro/impl/neuroimpl-simple.cpp
===================================================================
--- /cpp/frams/neuro/impl/neuroimpl-simple.cpp	(revision 725)
+++ /cpp/frams/neuro/impl/neuroimpl-simple.cpp	(revision 726)
@@ -12,9 +12,4 @@
 int NI_StdNeuron::lateinit()
 {
-#ifdef MODEL_V1_COMPATIBLE
-if (inertia<0) inertia=neuro->inertia;
-if (force<0) force=neuro->force;
-if (sigmo>1e9) sigmo=neuro->sigmo;
-#endif
 istate=newstate+neuro->state; // neuro->state -> random initialization
 calcOutput();
Index: /cpp/frams/neuro/impl/neuroimpl-simple.h
===================================================================
--- /cpp/frams/neuro/impl/neuroimpl-simple.h	(revision 725)
+++ /cpp/frams/neuro/impl/neuroimpl-simple.h	(revision 726)
@@ -19,10 +19,5 @@
   public:
 double inertia,force,sigmo;
-NI_StdNeuron():velocity(0)
-#ifdef MODEL_V1_COMPATIBLE
-	,inertia(-1),force(-1),sigmo(1e10)// illegal values, will be adjusted in lateinit()
-#else
-	,inertia(0),force(0),sigmo(0)
-#endif
+NI_StdNeuron():velocity(0),inertia(0),force(0),sigmo(0)
 	{paramentries=NI_StdNeuron_tab;}
 NeuroImpl* makeNew(){return new NI_StdNeuron();} // for NeuroFactory
