Index: cpp/frams/_demos/app_group_names.txt
===================================================================
--- cpp/frams/_demos/app_group_names.txt	(revision 724)
+++ cpp/frams/_demos/app_group_names.txt	(revision 724)
@@ -0,0 +1,44 @@
+# Framsticks application parameter group names, test data for paramtree_stdin_test.cpp
+# usage: paramtree_stdin_test <app_group_names.txt
+
+Experiment
+Files
+Advanced scripting
+Error handling
+Experiment: Parameters
+Experiment: Status
+World
+World: ODE Parameters
+World: ODE Parameters: Creatures Collisions
+World: ODE Parameters: Ground Collisions
+Genetics
+Genetics: Active operators
+Genetics: Neurons to add
+Genetics: f0
+Genetics: f0: Parts
+Genetics: f0: Joints
+Genetics: f0: Neurons
+Genetics: f0: Connections
+Genetics: f1
+Genetics: f1: Morphology
+Genetics: f1: Neuron net
+Genetics: f2
+Genetics: f3
+Genetics: f3: Mutation
+Genetics: f3: Crossover
+Genetics: f4
+Genetics: f9
+Genetics: fF
+Genetics: Conversions
+Creature: Neurons
+Creature: Imperfection
+Creature: Neurons: Enabled
+Creature: Similarity
+Creature: Symmetry
+Creature: Geometry
+Creature: Body constraints
+User scripts
+Experiment: Gene pools
+Experiment: Populations
+Experiment: Gene pools: Initial gene pool
+Experiment: Populations: Live creatures
Index: cpp/frams/_demos/paramtree_paramlist_test.cpp
===================================================================
--- cpp/frams/_demos/paramtree_paramlist_test.cpp	(revision 724)
+++ cpp/frams/_demos/paramtree_paramlist_test.cpp	(revision 724)
@@ -0,0 +1,44 @@
+#include <frams/util/sstringutils.h>
+#include <common/virtfile/stdiofile.h>
+#include <frams/genetics/preconfigured.h>
+#include <frams/param/paramtree.h>
+#include <frams/param/mutparamlist.h>
+#include <frams/vm/classes/genoobj.h>
+#include <frams/vm/classes/collectionobj.h>
+#include <frams/vm/classes/3dobject.h>
+#include <frams/neuro/neuroimpl.h>
+#include <frams/neuro/neurofactory.h>
+#include <frams/model/geometry/modelgeoclass.h>
+#include <frams/model/modelobj.h>
+#include "genotypeloader.h"
+#include "paramtree_print.h"
+
+// This program tests parameter tree construction for all paramtab's that are available in SDK.
+// See paramtree_test.cpp and app_group_names.txt for a more complete set (from Framsticks GUI) of paramtab objects.
+int main()
+{
+	StdioFILE::setStdio(); //setup VirtFILE::Vstdin/out/err
+	PreconfiguredGenetics genetics;
+
+	Param minigenotype_param(minigenotype_paramtab);
+	NeuroFactory neurofac;
+	neurofac.setStandardImplementation();
+	NeuroNetConfig nn_config(&neurofac);
+	ModelGeometry modelgeo;
+
+	MutableParamList combined;
+	combined += &genetics.genman.par;
+	combined += &GenoObj::getStaticParam();
+	combined += &ModelObj::getStaticParam();
+	combined += &VectorObject::getStaticParam();
+	combined += &DictionaryObject::getStaticParam();
+	combined += &Pt3D_Ext::getStaticParam();
+	combined += &Orient_Ext::getStaticParam();
+	combined += &minigenotype_param;
+	combined += &nn_config.par;
+	combined += &modelgeo.par;
+
+	ParamTree tree(combined);
+
+	printTree(&tree.root);
+}
Index: cpp/frams/_demos/paramtree_stdin_test.cpp
===================================================================
--- cpp/frams/_demos/paramtree_stdin_test.cpp	(revision 724)
+++ cpp/frams/_demos/paramtree_stdin_test.cpp	(revision 724)
@@ -0,0 +1,52 @@
+#include <frams/util/sstringutils.h>
+#include <common/virtfile/stdiofile.h>
+#include <frams/param/paramtree.h>
+#include "paramtree_print.h"
+
+class EmptyParamWithGroupsForTesting : public Param
+{
+	std::vector<ParamEntry> entries;
+	std::vector<std::shared_ptr<std::string>> strings; //could be a simple vector of strings, but then char* pointers can change when adding new strings and so ParamEntry structures would need updating. Therefore using "vector of string pointers" instead of "vector of strings".
+public:
+	EmptyParamWithGroupsForTesting()
+	{
+		ParamEntry zero_ending = { 0, 0, 0, 0 };
+		entries.push_back(zero_ending);
+	}
+	void addGroup(const char* name)
+	{
+		std::shared_ptr<string> str(new std::string(name));
+		strings.push_back(str);
+		ParamEntry tmp = { str.get()->c_str(), 0, 0, 0 };
+		entries.insert(entries.begin() + (entries.size() - 1), tmp);
+		entries[0].group = entries.size() - 1;
+		setParamTab(getParamTab());
+	}
+	ParamEntry *getParamTab()
+	{
+		return &entries[0];
+	}
+};
+
+int main()
+{
+	SString group_names;
+	StdioFILE::setStdio();//setup VirtFILE::Vstdin/out/err
+	loadSString(VirtFILE::Vstdin, group_names);
+	int pos = 0;
+	SString line;
+	EmptyParamWithGroupsForTesting param;
+	puts("(loading group names from stdin)");
+	while (group_names.getNextToken(pos, line, '\n'))
+	{
+		if ((line.len() > 0) && (line[line.len() - 1] == '\r')) //support for reading \r\n files...
+			line = line.substr(0, line.len() - 1);
+		if (line.len() > 0 && line[0] != '#') // skip empty lines and #commment lines
+			param.addGroup(line.c_str());
+	}
+	printf("%d groups\n\n", param.getGroupCount());
+
+	ParamTree tree(param);
+
+	printTree(&tree.root);
+}
