diff --git a/GeoModelDBManager/GeoModelDBManager/GMDBManager.h b/GeoModelDBManager/GeoModelDBManager/GMDBManager.h
index 9593df11440a9b746aeaf04b2a2b0020846a2d6e..d5a49139dd4a16f48dd37f566f914ec313da964e 100644
--- a/GeoModelDBManager/GeoModelDBManager/GMDBManager.h
+++ b/GeoModelDBManager/GeoModelDBManager/GMDBManager.h
@@ -161,13 +161,19 @@ public:
 	QString getDBFilePath();
 
 	QStringList getRootPhysVol();
+  std::vector<std::string> getRootPhysVolStd();
 
 	QStringList getItem(QString geoType, unsigned int id);
 	QStringList getItem(unsigned int tableId, unsigned int id);
-	QStringList getItemFromTableName(QString tableName, unsigned int id);
+	
+  QStringList getItemFromTableName(QString tableName, unsigned int id);
+  std::vector<std::string> getItemFromTableNameStd(QString tableName, unsigned int id);
+  
 	QStringList getItemAndType(unsigned int tableId, unsigned int id);
+  std::vector<std::string> getItemAndTypeStd(unsigned int tableId, unsigned int id);
 
 	QString getNodeTypeFromTableId(unsigned int id);
+  std::string getNodeTypeFromTableIdStd(unsigned int id);
 
 	QMap<unsigned int, QStringList> getVPhysVolChildren(const unsigned int id, const QString nodeType, const unsigned int copyN);
 
@@ -177,6 +183,7 @@ public:
 
 	QHash<unsigned int, QStringList> getTableFromNodeType(QString nodeType);
   std::vector<std::vector<std::string>> getTableFromNodeTypeStd(std::string nodeType);
+  
 	QHash<unsigned int, QString> getAll_TableIDsNodeTypes();
 	QHash<QString, unsigned int> getAll_NodeTypesTableIDs();
   std::unordered_map<unsigned int, std::string> getAll_TableIDsNodeTypesStd();
@@ -195,6 +202,8 @@ private:
 	QStringList getTableColNamesFromDB(QString tableName) const;
 
 	QString getTableNameFromTableId(unsigned int tabId);
+  std::string getTableNameFromTableIdStd(unsigned int tabId);
+  
 	QVariant getTableIdFromNodeType(QString nodeType);
 	void storeNodeType(QString nodeType, QString tableName);
 	QString getTableNameFromNodeType(QString nodeType);
diff --git a/GeoModelDBManager/src/GMDBManager.cpp b/GeoModelDBManager/src/GMDBManager.cpp
index ffd5480c2833b53b45cce17f0a2f873dee65aba8..2c1b077986abb7f78bc630cf890aba232446ed02 100644
--- a/GeoModelDBManager/src/GMDBManager.cpp
+++ b/GeoModelDBManager/src/GMDBManager.cpp
@@ -10,6 +10,8 @@
 #include <QSqlDriver>
 #include <QDebug>
 
+#include <stdlib.h> /* exit, EXIT_FAILURE */
+
 
 static std::string dbversion = "0.3.0"; // added GeoElement support (Sep 2019)
 
@@ -55,7 +57,6 @@ GMDBManager::GMDBManager(const QString &path) : m_dbpath(path), m_dbIsOK(false),
 
 GMDBManager::~GMDBManager()
 {
-	// JFB commented: qDebug() << "GMDBManager: destructor";
 	if (m_db.isOpen())
 	{
 		m_db.close();
@@ -887,6 +888,22 @@ QStringList GMDBManager::getItemAndType(unsigned int tableId, unsigned int id)
 	return results;
 
 }
+std::vector<std::string> GMDBManager::getItemAndTypeStd(unsigned int tableId, unsigned int id)
+{
+  std::vector<std::string> results;
+  
+  QString tableName = getTableNameFromTableId(tableId);
+  std::string nodeType  = getNodeTypeFromTableIdStd(tableId);
+  std::vector<std::string> item  =  getItemFromTableNameStd(tableName, id);
+
+  // add the type
+  results.push_back( nodeType );
+  // add the item
+  results.insert(results.end(), item.begin(), item.end());
+  
+  return results;
+  
+}
 
 
 QStringList GMDBManager::getItemFromTableName(QString tableName, unsigned int id)
@@ -922,6 +939,41 @@ QStringList GMDBManager::getItemFromTableName(QString tableName, unsigned int id
 	return params;
 }
 
+std::vector<std::string> GMDBManager::getItemFromTableNameStd(QString tableName, unsigned int id)
+{
+  if (m_deepDebug) qDebug() << "GMDBManager::getItemFromTableName(tableName, id)"<< tableName << QString::number(id);
+  /*
+   * 2. Get the object from DB
+   */
+  // prepare a SQL string with the right table name
+  QString queryStr = QString("SELECT * FROM %1 WHERE id = (?)").arg(tableName);
+  // prepare the query
+  QSqlQuery q;
+  if (!q.prepare( queryStr )) {
+    showError(q.lastError());
+//    return QStringList();
+    exit(EXIT_FAILURE);
+  }
+  q.addBindValue(id);
+  q.exec();
+  
+  std::vector<std::string> params;
+  
+  // get the number of columns of the DB table
+  int nCols = (m_tableNames[tableName]).size();
+  
+  while (q.next()) {
+    
+    for( int ii=0; ii<nCols; ++ii)
+      params.push_back( q.value(ii).toString().toStdString() );
+  }
+  if (params.size()==0) {
+    qWarning() << "WARNING!!" << "Item" << id << "does not exist in table" << tableName << "!!";
+  }
+  return params;
+}
+
+
 // get the list of children for a single GeoVPhysVol (i.e., GeoPhysVol or GeoFullPhysVol)
 QMap<unsigned int, QStringList> GMDBManager::getVPhysVolChildren(const unsigned int id, const QString nodeType, const unsigned int parentCopyNumber)
 {
@@ -1080,7 +1132,6 @@ QString GMDBManager::getTableNameFromNodeType(QString nodeType)
 // TODO: this and other methods could take data from in-memory maps, without asking to the DB all the times
 QString GMDBManager::getTableNameFromTableId(unsigned int tabId)
 {
-	// JFB commented: qDebug() << "GMDBManager::getTableNameFromTableId()";
 	QSqlQuery q;
 	if (!q.prepare(QLatin1String("SELECT tableName FROM GeoNodesTypes WHERE id = (?)"))) {
 		showError(q.lastError());
@@ -1097,10 +1148,27 @@ QString GMDBManager::getTableNameFromTableId(unsigned int tabId)
 
 	return tableName;
 }
+std::string GMDBManager::getTableNameFromTableIdStd(unsigned int tabId)
+{
+  QSqlQuery q;
+  if (!q.prepare(QLatin1String("SELECT tableName FROM GeoNodesTypes WHERE id = (?)"))) {
+    showError(q.lastError());
+//    return QString();
+    exit(EXIT_FAILURE);
+  }
+  q.addBindValue(tabId);
+  q.exec();
+  
+  std::string tableName;
+  while (q.next()) {
+    tableName = q.value(0).toString().toStdString();
+  }
+  
+  return tableName;
+}
 
 QString GMDBManager::getNodeTypeFromTableId(unsigned int tabId)
 {
-	// JFB commented: qDebug() << "GMDBManager::getNodeTypeFromTableId()";
 	QSqlQuery q;
 	if (!q.prepare(QLatin1String("SELECT nodeType FROM GeoNodesTypes WHERE id = (?)"))) {
 		showError(q.lastError());
@@ -1112,12 +1180,28 @@ QString GMDBManager::getNodeTypeFromTableId(unsigned int tabId)
 	QString nodeType;
 	while (q.next()) {
 		nodeType = q.value(0).toString();
-		// JFB commented: qDebug() << "tableName:" << nodeType;
 	}
 
 	return nodeType;
 }
-
+std::string GMDBManager::getNodeTypeFromTableIdStd(unsigned int tabId)
+{
+  QSqlQuery q;
+  if (!q.prepare(QLatin1String("SELECT nodeType FROM GeoNodesTypes WHERE id = (?)"))) {
+    showError(q.lastError());
+    // return QString();
+    exit(EXIT_FAILURE);
+  }
+  q.addBindValue(tabId);
+  q.exec();
+  
+  std::string nodeType;
+  while (q.next()) {
+    nodeType = q.value(0).toString().toStdString();
+  }
+  
+  return nodeType;
+}
 
 QHash<unsigned int, QString> GMDBManager::getAll_TableIDsNodeTypes()
 {
@@ -1679,6 +1763,21 @@ QStringList GMDBManager::getRootPhysVol()
 	return getItemAndType(typeId.toUInt(), id.toUInt());
 }
 
+std::vector<std::string> GMDBManager::getRootPhysVolStd()
+{
+  // get the ID of the ROOT vol from the table "RootVolume"
+  QSqlQuery query = selectAllFromTable("RootVolume");
+  
+  unsigned int id;
+  unsigned int typeId;
+  while (query.next()) {
+    id = query.value(1).toUInt();
+    typeId = query.value(2).toUInt();
+  }
+  return getItemAndTypeStd(typeId, id);
+}
+
+
 QString GMDBManager::getDBFilePath()
 {
     return m_dbpath;
diff --git a/GeoModelRead/GeoModelRead/ReadGeoModel.h b/GeoModelRead/GeoModelRead/ReadGeoModel.h
index 7ab9a1436b978c78e3b138b9838c32ab3a63f565..5d0baa9b37af07fde2629227be44e481e03ab85c 100644
--- a/GeoModelRead/GeoModelRead/ReadGeoModel.h
+++ b/GeoModelRead/GeoModelRead/ReadGeoModel.h
@@ -103,22 +103,17 @@ private:
   void buildAllNameTags();
 
   
-  std::string getEnvVar( std::string const & key ) const;
 
 	GeoPhysVol* buildGeoModelPrivate();
 
   GeoBox* buildDummyShape();
 
   void loopOverAllChildrenInBunches();
-  
-	void processChild(GeoVPhysVol* parentVol, bool &isRootVolume, const QStringList &child);
-  
   void loopOverAllChildrenRecords(std::vector<std::vector<std::string>> records);
   void processParentChild(const std::vector<std::string> &parentchild);
 
 	GeoPhysVol* getRootVolume();
 
-	GeoVPhysVol* parseChildren(GeoVPhysVol* vol, QMap<unsigned int, QStringList> children, int depth = 0);
 
   GeoVPhysVol* buildVPhysVolInstance(const unsigned int id, const unsigned int tableId, const unsigned int copyNumber);
   GeoVPhysVol* buildVPhysVol(const unsigned int id, const unsigned int tableId, unsigned int logVol_ID=0);
@@ -202,14 +197,16 @@ private:
 
 
   // Utility functions
-	void checkInputString(QString input);
+  std::string getEnvVar( std::string const & key ) const;
   std::vector<std::string> splitString(const std::string& s, char delimiter);
 	void printTrf(GeoTrf::Transform3D t);
-	void printTransformationValues(QStringList t);
-	QList<double> convertQstringListToDouble(QStringList listin);
-  std::vector<std::string> toStdVectorStrings(QStringList qlist);
-  QStringList toQStringList(std::vector<std::string> vec);
   void printStdVectorStrings(std::vector<std::string> vec); //TODO: move it to utility class
+  
+  // void printTransformationValues(QStringList t); // TODO: move to a Qt utility class
+  // QList<double> convertQstringListToDouble(QStringList listin); // TODO: move to a Qt utility class
+  // std::vector<std::string> toStdVectorStrings(QStringList qlist); // TODO: move to a Qt utility class
+  // QStringList toQStringList(std::vector<std::string> vec); // TODO: move to a Qt utility class
+  // void checkInputString(QString input); // TODO: move to an utility class
 
 
 	// input arguments
@@ -236,7 +233,6 @@ private:
   std::vector<std::vector<std::string>> m_materials;
   std::vector<std::vector<std::string>> m_elements;
   std::vector<std::vector<std::string>> m_shapes;
-//  QHash<unsigned int, QStringList> m_functions;
   std::vector<std::vector<std::string>> m_functions;
   std::vector<std::vector<std::string>> m_allchildren;
   
@@ -244,7 +240,8 @@ private:
   std::unordered_map<std::string, unsigned int> m_tableName_toTableID; // to look for table ID starting from node's type name
 
   
-	QStringList m_root_vol_data;
+//  QStringList m_root_vol_data;
+  std::vector<std::string> m_root_vol_data;
 
   //! memory chaches
   std::vector<GeoPhysVol*> m_memMapPhysVols;
diff --git a/GeoModelRead/src/ReadGeoModel.cpp b/GeoModelRead/src/ReadGeoModel.cpp
index 8ea5e1cdebf4d70c3800d7fafd53ada6cd05ebe1..46fc2dd6f3899366a364cdadd30af18dbddbdaf6 100644
--- a/GeoModelRead/src/ReadGeoModel.cpp
+++ b/GeoModelRead/src/ReadGeoModel.cpp
@@ -199,7 +199,8 @@ GeoPhysVol* ReadGeoModel::buildGeoModelPrivate()
   m_allchildren = m_dbManager->getChildrenTableStd();
   
 	// get the root volume data
-	m_root_vol_data = m_dbManager->getRootPhysVol();
+//  m_root_vol_data = m_dbManager->getRootPhysVol();
+  m_root_vol_data = m_dbManager->getRootPhysVolStd();
 
   // get DB metadata
   m_tableID_toTableName = m_dbManager->getAll_TableIDsNodeTypesStd();
@@ -677,14 +678,14 @@ void ReadGeoModel::checkNodePtr(GeoGraphNode* nodePtr, std::string varName, std:
   }
 }
 
-
-void ReadGeoModel::checkInputString(QString input)
-{
-	if (input.isEmpty() || input.isNull() || input == "NULL") {
-		std::cout << "ERROR!!! Input QString is empty or equal to 'NULL'!!! Aborting..." << std::endl;
-		exit(1);
-	}
-}
+  // TODO: move it to an utility class
+//void ReadGeoModel::checkInputString(QString input)
+//{
+//  if (input.isEmpty() || input.isNull() || input == "NULL") {
+//    std::cout << "ERROR!!! Input QString is empty or equal to 'NULL'!!! Aborting..." << std::endl;
+//    exit(1);
+//  }
+//}
 
 
 // Instantiate a PhysVol and get its children
@@ -696,9 +697,6 @@ GeoVPhysVol* ReadGeoModel::buildVPhysVolInstance(const unsigned int id, const un
     muxCout.unlock();
   }
 
-  checkInputString(QString::number(id));
-	checkInputString(QString::number(tableId));
-
 	// A - if the instance has been previously built, return that
   if ( nullptr != getVPhysVol(id, tableId, copyN)) {
 //  if (isVPhysVolBuilt(id, tableId, copyN)) {
@@ -709,7 +707,6 @@ GeoVPhysVol* ReadGeoModel::buildVPhysVolInstance(const unsigned int id, const un
     }
 		return dynamic_cast<GeoVPhysVol*>(getVPhysVol(id, tableId, copyN));
 	}
-
   
   // B - if not built already, then get the actual volume,
   // which should be already built by now,
@@ -831,8 +828,8 @@ GeoPhysVol* ReadGeoModel::getRootVolume()
     std::cout << "ReadGeoModel::getRootVolume()" << std::endl;
     muxCout.unlock();
   }
-	const unsigned int id = m_root_vol_data[1].toUInt();
-	const unsigned int tableId = m_root_vol_data[2].toUInt();
+  const unsigned int id = std::stoi(m_root_vol_data[1]); // TODO: GetRoot() should return integers instead of strings...
+  const unsigned int tableId = std::stoi(m_root_vol_data[2]);
 	const unsigned int copyNumber = 1; // the Root volume has only one copy by definition
   GeoPhysVol* root = dynamic_cast<GeoPhysVol*>(buildVPhysVolInstance(id, tableId, copyNumber));
   checkNodePtr(root, "root", __func__, __PRETTY_FUNCTION__);
@@ -976,10 +973,10 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 
   // Get shape's parameters from the stored string.
   // This will be interpreted differently according to the shape.
-  std::vector<std::string> std_shapePars = splitString(parameters, ';');
+  std::vector<std::string> shapePars = splitString(parameters, ';');
   
   // FIXME: this is a temporary, ugly shortcut to postpone the QStrinList-->vector<string> move
-  QStringList shapePars = toQStringList(std_shapePars);
+//  QStringList shapePars = toQStringList(std_shapePars);
   
   
 	if (m_deepDebug) {
@@ -996,13 +993,13 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 			double YHalfLength = 0.;
 			double ZHalfLength = 0.;
 			// get parameters from DB string
-			foreach( QString par, shapePars) {
-					QStringList vars = par.split("=");
-					QString varName = vars[0];
-					QString varValue = vars[1];
-					if (varName == "XHalfLength") XHalfLength = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "YHalfLength") YHalfLength = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "ZHalfLength") ZHalfLength = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
+      for( auto& par : shapePars) {
+        std::vector<std::string> vars = splitString(par, '=');
+        std::string varName = vars[0];
+        std::string varValue = vars[1];
+        if (varName == "XHalfLength") XHalfLength = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+        if (varName == "YHalfLength") YHalfLength = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+        if (varName == "ZHalfLength") ZHalfLength = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
 			}
 		shape = new GeoBox(XHalfLength, YHalfLength, ZHalfLength);
 	}
@@ -1016,18 +1013,18 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 		double SPhi = 0.;
 		double DPhi = 0.;
 		// get parameters from DB string
-		foreach( QString par, shapePars) {
-			QStringList vars = par.split("=");
-			QString varName = vars[0];
-			QString varValue = vars[1];
+    for( auto& par : shapePars) {
+      std::vector<std::string> vars = splitString(par, '=');
+      std::string varName = vars[0];
+      std::string varValue = vars[1];
       // std::cout << "varValue Cons:" << varValue;
-			if (varName == "RMin1") RMin1 = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "RMin2") RMin2 = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "RMax1") RMax1 = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "RMax2") RMax2 = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "DZ") DZ = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "SPhi") SPhi = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "DPhi") DPhi = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
+			if (varName == "RMin1") RMin1 = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "RMin2") RMin2 = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "RMax1") RMax1 = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "RMax2") RMax2 = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "DZ")    DZ = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "SPhi")  SPhi = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "DPhi")  DPhi = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
 		}
 		shape = new GeoCons (RMin1, RMin2, RMax1, RMax2, DZ, SPhi, DPhi);
 	}
@@ -1047,15 +1044,15 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 		double SPhi = 0.;
 		double DPhi = 0.;
 		// get parameters from DB string
-		foreach( QString par, shapePars) {
-			QStringList vars = par.split("=");
-			QString varName = vars[0];
-			QString varValue = vars[1];
-			if (varName == "Rmin") Rmin = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "Rmax") Rmax = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "Rtor") Rtor = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "SPhi") SPhi = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "DPhi") DPhi = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
+    for( auto& par : shapePars) {
+      std::vector<std::string> vars = splitString(par, '=');
+      std::string varName = vars[0];
+      std::string varValue = vars[1];
+			if (varName == "Rmin") Rmin = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "Rmax") Rmax = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "Rtor") Rtor = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "SPhi") SPhi = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "DPhi") DPhi = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
 		}
 		shape = new GeoTorus (Rmin, Rmax, Rtor, SPhi, DPhi);
 	}
@@ -1068,16 +1065,16 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 		double Theta = 0.;
 		double Phi = 0.;
 		// get parameters from DB string
-		foreach( QString par, shapePars) {
-			QStringList vars = par.split("=");
-			QString varName = vars[0];
-			QString varValue = vars[1];
-			if (varName == "XHalfLength") XHalfLength = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "YHalfLength") YHalfLength = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "ZHalfLength") ZHalfLength = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "Alpha") Alpha = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "Theta") Theta = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "Phi") Phi = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
+    for( auto& par : shapePars) {
+      std::vector<std::string> vars = splitString(par, '=');
+      std::string varName = vars[0];
+      std::string varValue = vars[1];
+			if (varName == "XHalfLength") XHalfLength = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "YHalfLength") YHalfLength = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "ZHalfLength") ZHalfLength = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "Alpha")       Alpha = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "Theta")       Theta = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "Phi")         Phi = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
 		}
 		shape = new GeoPara (XHalfLength, YHalfLength, ZHalfLength, Alpha, Theta, Phi);
 	}
@@ -1088,10 +1085,10 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 		unsigned int NZPlanes = 0;
 
 		bool error = 0;
-		QString par;
-		QStringList vars;
-		QString varName;
-		QString varValue;
+    std::string par;
+    std::vector<std::string> vars;
+    std::string varName;
+    std::string varValue;
 
 		GeoPcon* pcon = nullptr;
 
@@ -1102,12 +1099,12 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 			// get the three first GeoPcon parameters: the SPhi and DPhi angles, plus the number of Z planes
 			for( int it=0; it < 3; it++) {
 				par = shapePars[it];
-				vars = par.split("=");
+				vars = splitString(par, '=');
 				varName = vars[0];
 				varValue = vars[1];
-				if (varName == "SPhi") SPhi = varValue.toDouble();
-				if (varName == "DPhi") DPhi = varValue.toDouble();
-				if (varName == "NZPlanes") NZPlanes = varValue.toDouble();
+				if (varName == "SPhi")     SPhi = std::stod(varValue);
+				if (varName == "DPhi")     DPhi = std::stod(varValue);
+				if (varName == "NZPlanes") NZPlanes = std::stoi(varValue);
 			}
 			// build the basic GeoPcon shape
 			pcon = new GeoPcon(SPhi, DPhi);
@@ -1116,31 +1113,30 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 			for (int it=3; it < sizePars; it++)
 			{
 				par = shapePars[it];
-				vars = par.split("=");
+				vars = splitString(par, '=');
 				varName = vars[0];
 				varValue = vars[1];
-				// qInfo() << "it:" << it << "par:" << par << "varName:" << varName << "varValue:" << varValue;
 
 				if (varName == "ZPos") {
 
-					double zpos = varValue.toDouble();
+					double zpos = std::stod(varValue);
 					double rmin=0., rmax=0.;
 
 					it++; // go to next variable
 
 					par = shapePars[it];
-					vars = par.split("=");
+					vars = splitString(par, '=');
 					varName = vars[0];
 					varValue = vars[1];
-					if (varName == "ZRmin") rmin = varValue.toDouble();
+					if (varName == "ZRmin") rmin = std::stod(varValue);
 					else error = 1;
 					it++; // go to next variable
 
 					par = shapePars[it];
-					vars = par.split("=");
+					vars = splitString(par, '=');
 					varName = vars[0];
 					varValue = vars[1];
-					if (varName == "ZRmax") rmax = varValue.toDouble();
+					if (varName == "ZRmax") rmax = std::stod(varValue);
 					else error = 1;
 
 					if(error) {
@@ -1198,10 +1194,11 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 
 		bool error = false;
 		GeoPgon* pgon = nullptr;
-		QString par;
-		QStringList vars;
-		QString varName;
-		QString varValue;
+    
+    std::string par;
+    std::vector<std::string> vars;
+    std::string varName;
+    std::string varValue;
 
 		int sizePars = shapePars.size();
 		// check if we have more than 3 parameters
@@ -1210,14 +1207,14 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 			// get the first four GeoPgon parameters: the SPhi and DPhi angles, plus the number of Z planes
 			for( int it=0; it < 4; it++) {
 				par = shapePars[it];
-				vars = par.split("=");
+				vars = splitString(par, '=');
 				varName = vars[0];
 				varValue = vars[1];
 				// qInfo() << "vars: " << vars; // for debug only
-				if (varName == "SPhi") SPhi = varValue.toDouble();
-				if (varName == "DPhi") DPhi = varValue.toDouble();
-				if (varName == "NSides") NSides = varValue.toUInt();// * SYSTEM_OF_UNITS::mm;
-				if (varName == "NZPlanes") NZPlanes = varValue.toDouble();
+				if (varName == "SPhi") SPhi = std::stod(varValue);
+				if (varName == "DPhi") DPhi = std::stod(varValue);
+				if (varName == "NSides") NSides = std::stoi(varValue);// * SYSTEM_OF_UNITS::mm;
+				if (varName == "NZPlanes") NZPlanes = std::stoi(varValue);
 
 			}
 			// build the basic GeoPgon shape
@@ -1227,31 +1224,31 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 			for (int it=4; it < sizePars; it++)
 			{
 				par = shapePars[it];
-				vars = par.split("=");
+				vars = splitString(par, '=');
 				varName = vars[0];
 				varValue = vars[1];
 				// qInfo() << "it:" << it << "par:" << par << "varName:" << varName << "varValue:" << varValue;
 
 				if (varName == "ZPos") {
 
-					double zpos = varValue.toDouble();
+					double zpos = std::stod(varValue);
 					double rmin=0., rmax=0.;
 
 					it++; // go to next variable
 
 					par = shapePars[it];
-					vars = par.split("=");
+					vars = splitString(par, '=');
 					varName = vars[0];
 					varValue = vars[1];
-					if (varName == "ZRmin") rmin = varValue.toDouble();
+					if (varName == "ZRmin") rmin = std::stod(varValue);
 					else error = 1;
 					it++; // go to next variable
 
 					par = shapePars[it];
-					vars = par.split("=");
+					vars = splitString(par, '=');
 					varName = vars[0];
 					varValue = vars[1];
-					if (varName == "ZRmax") rmax = varValue.toDouble();
+					if (varName == "ZRmax") rmax = std::stod(varValue);
 					else error = 1;
 
 					if(error) {
@@ -1305,10 +1302,11 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 		GeoGenericTrapVertices Vertices;
 		bool error = false;
 		GeoGenericTrap* gTrap = nullptr;
-		QString par;
-		QStringList vars;
-		QString varName;
-		QString varValue;
+		
+    std::string par;
+    std::vector<std::string> vars;
+    std::string varName;
+    std::string varValue;
 
 		int sizePars = shapePars.size();
 		// check if we have more than 3 parameters
@@ -1317,12 +1315,12 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 			// get the two GeoGenericTrap parameters: the ZHalfLength plus the number of vertices
 			for( int it=0; it < 2; it++) {
 				par = shapePars[it];
-				vars = par.split("=");
+				vars = splitString(par, '=');
 				varName = vars[0];
 				varValue = vars[1];
 				// qInfo() << "vars: " << vars; // for debug only
-				if (varName == "ZHalfLength") ZHalfLength = varValue.toDouble();
-				if (varName == "NVertices") NVertices = varValue.toUInt();
+				if (varName == "ZHalfLength") ZHalfLength = std::stod(varValue);
+				if (varName == "NVertices")   NVertices = std::stoi(varValue);
 			}
 
 
@@ -1331,23 +1329,23 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 			for (int it=2; it < NVertices; it++)
 			{
 				par = shapePars[it];
-				vars = par.split("=");
+				vars = splitString(par, '=');
 				varName = vars[0];
 				varValue = vars[1];
 				// qInfo() << "it:" << it << "par:" << par << "varName:" << varName << "varValue:" << varValue;
 
 				if (varName == "X") {
 
-					double x = varValue.toDouble();
+					double x = std::stod(varValue);
 
 					it++; // go to next variable
 
 					par = shapePars[it];
-					vars = par.split("=");
+					vars = splitString(par, '=');
 					varName = vars[0];
 					varValue = vars[1];
 					if (varName == "Y") {
-					  double y = varValue.toDouble();
+					  double y = std::stod(varValue);
 					  Vertices.push_back(GeoTwoVector(x,y));
 					}
 					else {
@@ -1396,10 +1394,11 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 
 		bool error = 0;
 		GeoSimplePolygonBrep* sh = nullptr;
-		QString par;
-		QStringList vars;
-		QString varName;
-		QString varValue;
+    
+    std::string par;
+    std::vector<std::string> vars;
+    std::string varName;
+    std::string varValue;
 
 		int sizePars = shapePars.size();
 		// check if we have more than 2 parameters
@@ -1408,12 +1407,12 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 			// get the first two GeoSimplePolygonBrep parameters: DZ and the number of vertices.
 			for( int it=0; it < 2; it++) {
 				par = shapePars[it];
-				vars = par.split("=");
+				vars = splitString(par, '=');
 				varName = vars[0];
 				varValue = vars[1];
 				// qInfo() << "vars: " << vars; // for debug only
-				if (varName == "DZ") DZ = varValue.toDouble();
-				if (varName == "NVertices") NVertices = varValue.toDouble();
+				if (varName == "DZ")        DZ = std::stod(varValue);
+				if (varName == "NVertices") NVertices = std::stoi(varValue);
 				//else if (varName == "NVertices") NVertices = varValue.toDouble();
 				//else error = 1;
 				//if(error) std::cout << "ERROR! GeoSimplePolygonBrep parameters are not correctly stored! -->" << vars;
@@ -1426,19 +1425,19 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 			for (int it=2; it < sizePars; it++)
 			{
 				par = shapePars[it];
-				vars = par.split("=");
+				vars = splitString(par, '=');
 				varName = vars[0];
 				varValue = vars[1];
-				if (varName == "xV") xV = varValue.toDouble();
+				if (varName == "xV") xV = std::stod(varValue);
 				else error = 1;
 
 				it++; // go to next variable (they come in pairs)
 
 				par = shapePars[it];
-				vars = par.split("=");
+				vars = splitString(par, '=');
 				varName = vars[0];
 				varValue = vars[1];
-				if (varName == "yV") yV = varValue.toDouble();
+				if (varName == "yV") yV = std::stod(varValue);
 				else error = 1;
 
 				if(error) {
@@ -1489,10 +1488,11 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 
 		bool error = 0;
 		GeoTessellatedSolid* sh = nullptr;
-		QString par;
-		QStringList vars;
-		QString varName;
-		QString varValue;
+		
+    std::string par;
+    std::vector<std::string> vars;
+    std::string varName;
+    std::string varValue;
 
 		int sizePars = shapePars.size();
 		// check if we have at least 13 parameters,
@@ -1502,10 +1502,10 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 
 			// get the first parameter
 			par = shapePars[0];
-			vars = par.split("=");
+			vars = splitString(par, '=');
 			varName = vars[0];
 			varValue = vars[1];
-			if (varName == "nFacets") nFacets = varValue.toInt();
+			if (varName == "nFacets") nFacets = std::stoi(varValue);
 			else {
         muxCout.lock();
         qWarning("ERROR!! - GeoTessellatedSolid - nFacets is not defined!!");
@@ -1523,7 +1523,7 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 			{
 				// get facet type
 				par = shapePars[it];
-				vars = par.split("=");
+				vars = splitString(par, '=');
 				varName = vars[0];
 				if (varName == "QUAD") {
 					facetType = "QUAD";
@@ -1543,7 +1543,7 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 				// get the type of the vertexes composing the facet
 				bool isAbsolute = true;
 				par = shapePars[it];
-				vars = par.split("=");
+				vars = splitString(par, '=');
 				varName = vars[0];
 				varValue = vars[1];
 				if (varName == "vT") {
@@ -1562,10 +1562,10 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 
 				unsigned int nVertexes = 0;
 				par = shapePars[it];
-				vars = par.split("=");
+				vars = splitString(par, '=');
 				varName = vars[0];
 				varValue = vars[1];
-				if (varName == "nV") nVertexes = varValue.toUInt();
+				if (varName == "nV") nVertexes = std::stoi(varValue);
 				else {
           muxCout.lock();
 					std::cout << "ERROR! - GeoTessellatedSolid - nVertices not defined!" << std::endl;
@@ -1593,10 +1593,10 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 
 						double xV=0.;
 						par = shapePars[it];
-						vars = par.split("=");
+						vars = splitString(par, '=');
 						varName = vars[0];
 						varValue = vars[1];
-						if (varName == "xV") xV = varValue.toDouble();
+						if (varName == "xV") xV = std::stod(varValue);
 						else {
               muxCout.lock();
 							//FIXME: std::cout << "ERROR! Got '" << varName << "' instead of 'xV'!" << std::endl;
@@ -1608,10 +1608,10 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 
 						double yV=0.;
 						par = shapePars[it];
-						vars = par.split("=");
+						vars = splitString(par, '=');
 						varName = vars[0];
 						varValue = vars[1];
-						if (varName == "yV") yV = varValue.toDouble();
+						if (varName == "yV") yV = std::stod(varValue);
 						else {
               muxCout.lock();
 							//FIXME: std::cout << "ERROR! Got '" << varName << "' instead of 'yV'!" << std::endl;
@@ -1623,10 +1623,10 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 
 						double zV=0.;
 						par = shapePars[it];
-						vars = par.split("=");
+						vars = splitString(par, '=');
 						varName = vars[0];
 						varValue = vars[1];
-						if (varName == "zV") zV = varValue.toDouble();
+						if (varName == "zV") zV = std::stod(varValue);
 						else {
               muxCout.lock();
 							//FIXME: std::cout << "ERROR! Got '" << varName << "' instead of 'zV'!" << std::endl;
@@ -1667,30 +1667,30 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 
 						double xV=0.;
 						par = shapePars[it];
-						vars = par.split("=");
+						vars = splitString(par, '=');
 						varName = vars[0];
 						varValue = vars[1];
-						if (varName == "xV") xV = varValue.toDouble();
+						if (varName == "xV") xV = std::stod(varValue);
 						else error = 1;
 
 						it++; // go to the next coordinate
 
 						double yV=0.;
 						par = shapePars[it];
-						vars = par.split("=");
+						vars = splitString(par, '=');
 						varName = vars[0];
 						varValue = vars[1];
-						if (varName == "yV") yV = varValue.toDouble();
+						if (varName == "yV") yV = std::stod(varValue);
 						else error = 1;
 
 						it++; // go to the next coordinate
 
 						double zV=0.;
 						par = shapePars[it];
-						vars = par.split("=");
+						vars = splitString(par, '=');
 						varName = vars[0];
 						varValue = vars[1];
-						if (varName == "zV") zV = varValue.toDouble();
+						if (varName == "zV") zV = std::stod(varValue);
 						else error = 1;
 
 						if(error) {
@@ -1755,21 +1755,21 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 			double Dxdypdzp = 0.;
 			double Angleydzp = 0.;
 			// get parameters
-			foreach( QString par, shapePars) {
-					QStringList vars = par.split("=");
-					QString varName = vars[0];
-					QString varValue = vars[1];
-					if (varName == "ZHalfLength") ZHalfLength = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "Theta") Theta = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "Phi") Phi = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "Dydzn") Dydzn = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "Dxdyndzn") Dxdyndzn = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "Dxdypdzn") Dxdypdzn = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "Angleydzn") Angleydzn = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "Dydzp") Dydzp = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "Dxdyndzp") Dxdyndzp = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "Dxdypdzp") Dxdypdzp = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "Angleydzp") Angleydzp = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
+    for( auto& par : shapePars) {
+      std::vector<std::string> vars = splitString(par, '=');
+      std::string varName = vars[0];
+      std::string varValue = vars[1];
+					if (varName == "ZHalfLength") ZHalfLength = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "Theta")       Theta = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "Phi")         Phi = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "Dydzn")       Dydzn = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "Dxdyndzn")    Dxdyndzn = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "Dxdypdzn")    Dxdypdzn = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "Angleydzn")   Angleydzn = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "Dydzp")       Dydzp = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "Dxdyndzp")    Dxdyndzp = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "Dxdypdzp")    Dxdypdzp = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "Angleydzp")   Angleydzp = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
 			}
 		shape = new GeoTrap (ZHalfLength, Theta, Phi, Dydzn, Dxdyndzn, Dxdypdzn, Angleydzn, Dydzp, Dxdyndzp, Dxdypdzp, Angleydzp);
 	}
@@ -1781,16 +1781,16 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 			double YHalfLength2 = 0.;
 			double ZHalfLength = 0.;
 			// get parameters
-			foreach( QString par, shapePars) {
-					QStringList vars = par.split("=");
-					QString varName = vars[0];
-					QString varValue = vars[1];
+    for( auto& par : shapePars) {
+      std::vector<std::string> vars = splitString(par, '=');
+      std::string varName = vars[0];
+      std::string varValue = vars[1];
           // std::cout << "varValue:" << varValue;
-					if (varName == "XHalfLength1") XHalfLength1 = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "XHalfLength2") XHalfLength2 = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "YHalfLength1") YHalfLength1 = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "YHalfLength2") YHalfLength2 = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-					if (varName == "ZHalfLength") ZHalfLength = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
+					if (varName == "XHalfLength1") XHalfLength1 = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "XHalfLength2") XHalfLength2 = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "YHalfLength1") YHalfLength1 = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "YHalfLength2") YHalfLength2 = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+					if (varName == "ZHalfLength")  ZHalfLength = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
 			}
 		shape = new GeoTrd (XHalfLength1, XHalfLength2, YHalfLength1, YHalfLength2, ZHalfLength);
 	}
@@ -1800,13 +1800,13 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 		double RMax = 0.;
 		double ZHalfLength = 0.;
 		// get parameters
-		foreach( QString par, shapePars) {
-			QStringList vars = par.split("=");
-			QString varName = vars[0];
-			QString varValue = vars[1];
-			if (varName == "RMin") RMin = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "RMax") RMax = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "ZHalfLength") ZHalfLength = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
+    for( auto& par : shapePars) {
+      std::vector<std::string> vars = splitString(par, '=');
+      std::string varName = vars[0];
+      std::string varValue = vars[1];
+			if (varName == "RMin")        RMin = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "RMax")        RMax = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "ZHalfLength") ZHalfLength = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
 		}
 		shape = new GeoTube(RMin, RMax, ZHalfLength);
 	}
@@ -1818,15 +1818,15 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 		double SPhi = 0.;
 		double DPhi = 0.;
 		// get parameters
-		foreach( QString par, shapePars) {
-			QStringList vars = par.split("=");
-			QString varName = vars[0];
-			QString varValue = vars[1];
-			if (varName == "RMin") RMin = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "RMax") RMax = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "ZHalfLength") ZHalfLength = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "SPhi") SPhi = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
-			if (varName == "DPhi") DPhi = varValue.toDouble();// * SYSTEM_OF_UNITS::mm;
+    for( auto& par : shapePars) {
+      std::vector<std::string> vars = splitString(par, '=');
+      std::string varName = vars[0];
+      std::string varValue = vars[1];
+			if (varName == "RMin")        RMin = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "RMax")        RMax = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "ZHalfLength") ZHalfLength = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "SPhi")        SPhi = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
+			if (varName == "DPhi")        DPhi = std::stod(varValue);// * SYSTEM_OF_UNITS::mm;
 		}
 		shape = new GeoTubs (RMin, RMax, ZHalfLength, SPhi, DPhi);
 	}
@@ -1835,12 +1835,12 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 		unsigned int shapeOpId = 0;
 		unsigned int transfId = 0;
 		// get parameters
-		foreach( QString par, shapePars) {
-			QStringList vars = par.split("=");
-			QString varName = vars[0];
-			QString varValue = vars[1];
-			if (varName == "A") shapeOpId = varValue.toUInt();
-			if (varName == "X") transfId = varValue.toUInt();
+    for( auto& par : shapePars) {
+      std::vector<std::string> vars = splitString(par, '=');
+      std::string varName = vars[0];
+      std::string varValue = vars[1];
+			if (varName == "A") shapeOpId = std::stoi(varValue);
+			if (varName == "X") transfId = std::stoi(varValue);
 		}
     if (shapeOpId == 0 || transfId == 0) {
       std::cout << "ERROR! Shift shape - input operand shapes' IDs are empty! (shapeId: " << shapeOpId << ", transfId:" << transfId << ")" << std::endl;
@@ -1930,12 +1930,12 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
 		unsigned int opA = 0;
 		unsigned int opB = 0;
 		// get parameters
-		foreach( QString par, shapePars) {
-			QStringList vars = par.split("=");
-			QString varName = vars[0];
-			QString varValue = vars[1];
-			if (varName == "opA") opA = varValue.toUInt();
-			if (varName == "opB") opB = varValue.toUInt();
+    for( auto& par : shapePars) {
+      std::vector<std::string> vars = splitString(par, '=');
+      std::string varName = vars[0];
+      std::string varValue = vars[1];
+			if (varName == "opA") opA = std::stoi(varValue);
+			if (varName == "opB") opB = std::stoi(varValue);
 		}
     if (opA == 0 || opB == 0) {
       std::cout << "ERROR! Subtraction/Union/Intersection shape - input operand shapes' IDs are empty! (opA: " << opA << ", opB:" << opB << ")" << std::endl;
@@ -1979,7 +1979,6 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
           exit(EXIT_FAILURE);
         }
         
-//        GeoShapeSubtraction* shapeNew = new GeoShapeSubtraction(shapeA, shapeB);
         GeoShape* shapeNew = nullptr;
         if ("Subtraction" == type) {
           shapeNew = new GeoShapeSubtraction(shapeA, shapeB);
@@ -1991,7 +1990,6 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
           shapeNew = new GeoShapeIntersection(shapeA, shapeB);
         }
         
-//        storeBuiltShape(shapeId, shapeNew);
         shape = shapeNew;
       }
       // ...otherwise, build the Subtraction operator shape without operands
@@ -2007,11 +2005,6 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
           shapeNew = new GeoShapeIntersection;
         }
 
-        // debug
-        // muxCout.lock();
-        // std::cout << "adding 'empty' shape (2): " << shapeId << ", " << shapeNew << ", " << opA << ", " << opB << std::endl;
-        // muxCout.unlock();
-
         tuple_shapes_boolean_info tt (shapeId, shapeNew, opA, opB);
         shapes_info_sub->push_back(tt); //! Push the information about the new boolean shape at the end of the very same container we are iterating over
 
@@ -2023,14 +2016,21 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
   else if(type == "CustomShape") {
     std::string name = "";
     // check parameters
-  	if ( shapePars.size() > 0 && ((shapePars.filter("=")).size() > 0) )  // this complex test is needed to handle null strings
+    // this complex test is needed to handle null strings in the DB records
+    bool okPars = false;
+    for( auto& par : shapePars) {
+    std::string str = par.substr( par.find("=") );     // get from "=" to the end
+      if (str.size() > 0) okPars = true;
+    }
+  	//if ( shapePars.size() > 0 && ((shapePars.filter("=")).size() > 0) )  // this complex test is needed to handle null strings
+    if ( shapePars.size() > 0 && okPars )
   	{
       // get parameters
-  		foreach( QString par, shapePars) {
-  				QStringList vars = par.split("=");
-  				QString varName = vars[0];
-  				QString varValue = vars[1];
-  				if (varName == "name") name = varValue.toStdString();
+      for( auto& par : shapePars) {
+        std::vector<std::string> vars = splitString(par, '=');
+        std::string varName = vars[0];
+        std::string varValue = vars[1];
+  				if (varName == "name") name = varValue;
   			}
   	} else {
       muxCout.lock();
@@ -2045,15 +2045,22 @@ GeoShape* ReadGeoModel::buildShape(const unsigned int shapeId, type_shapes_boole
     std::string name = "";
     std::string asciiData = "";
     // check parameters
-    if ( shapePars.size() > 0 && ((shapePars.filter("=")).size() > 0) )  // this complex test is needed to handle null strings
+    // this complex test is needed to handle null strings in the DB records
+    bool okPars = false;
+    for( auto& par : shapePars) {
+      std::string str = par.substr( par.find("=") );     // get from "=" to the end
+      if (str.size() > 0) okPars = true;
+    }
+    //if ( shapePars.size() > 0 && ((shapePars.filter("=")).size() > 0) )  // this complex test is needed to handle null strings
+    if ( shapePars.size() > 0 && okPars )
   	{
       // get parameters
-      foreach( QString par, shapePars) {
-        QStringList vars = par.split("=");
-        QString varName = vars[0];
-        QString varValue = vars[1];
-        if (varName == "name") name = varValue.toStdString();
-        if (varName == "asciiData") asciiData=varValue.toStdString();
+      for( auto& par : shapePars) {
+        std::vector<std::string> vars = splitString(par, '=');
+        std::string varName = vars[0];
+        std::string varValue = vars[1];
+        if (varName == "name")      name = varValue;
+        if (varName == "asciiData") asciiData = varValue;
       }
     } else {
       // throw std::invalid_argument("UnidentifiedShape parameters' list is empty!!");
@@ -2310,25 +2317,25 @@ std::vector<std::string> ReadGeoModel::splitString(const std::string& s, const c
    return tokens;
 }
 
-  // TODO: move this to utility class/file
-QStringList ReadGeoModel::toQStringList(std::vector<std::string> vec)
-  {
-    QStringList ll;
-    for ( auto& str : vec ) {
-      ll << QString::fromStdString(str);
-    }
-    return ll;
-  }
+//  // TODO: move this to utility class/file
+//QStringList ReadGeoModel::toQStringList(std::vector<std::string> vec)
+//  {
+//    QStringList ll;
+//    for ( auto& str : vec ) {
+//      ll << QString::fromStdString(str);
+//    }
+//    return ll;
+//  }
 
-// TODO: move this to utility class/file
-std::vector<std::string> ReadGeoModel::toStdVectorStrings(QStringList qlist)
-{
-  std::vector<std::string> vec;
-  foreach(QString qstr, qlist) {
-    vec.push_back(qstr.toStdString());
-  }
-  return vec;
-}
+//// TODO: move this to utility class/file
+//std::vector<std::string> ReadGeoModel::toStdVectorStrings(QStringList qlist)
+//{
+//  std::vector<std::string> vec;
+//  foreach(QString qstr, qlist) {
+//    vec.push_back(qstr.toStdString());
+//  }
+//  return vec;
+//}
 // TODO: move this to utility class/file
 void ReadGeoModel::printStdVectorStrings(std::vector<std::string> vec)
 {
@@ -2492,26 +2499,26 @@ void ReadGeoModel::printTrf(GeoTrf::Transform3D t) {
   muxCout.unlock();
 }
 
-// TODO: should go in a QtUtils header-only class, to be used in other packages
-QList<double> ReadGeoModel::convertQstringListToDouble(QStringList listin) {
-	QList<double> listout;
-  foreach (const QString &s, listin) {
-      listout.append(s.toDouble());
-  }
-	return listout;
-}
+//// TODO: should go in a QtUtils header-only class, to be used in other packages
+//QList<double> ReadGeoModel::convertQstringListToDouble(QStringList listin) {
+//  QList<double> listout;
+//  foreach (const QString &s, listin) {
+//      listout.append(s.toDouble());
+//  }
+//  return listout;
+//}
 
-// TODO: move it to an utility class
-void ReadGeoModel::printTransformationValues(QStringList values) {
-	QList<double> t = convertQstringListToDouble(values);
-  muxCout.lock();
-  std::cout << "transformation input values: " << std::endl;
-	std::cout << "[[" << t[0] << "," << t[1] << "," << t[2] << "]["
-	                   << t[3] << "," << t[4] << "," << t[5] << "]["
-	                   << t[6] << "," << t[7] << "," << t[8] << "]["
-	                   << t[9] << "," << t[10] << "," << t[11] << "]]" << std::endl;
-  muxCout.unlock();
-}
+//// TODO: move it to an utility class
+//void ReadGeoModel::printTransformationValues(QStringList values) {
+//  QList<double> t = convertQstringListToDouble(values);
+//  muxCout.lock();
+//  std::cout << "transformation input values: " << std::endl;
+//  std::cout << "[[" << t[0] << "," << t[1] << "," << t[2] << "]["
+//                     << t[3] << "," << t[4] << "," << t[5] << "]["
+//                     << t[6] << "," << t[7] << "," << t[8] << "]["
+//                     << t[9] << "," << t[10] << "," << t[11] << "]]" << std::endl;
+//  muxCout.unlock();
+//}
 
 
 GeoAlignableTransform* ReadGeoModel::buildAlignableTransform(const unsigned int id)