diff --git a/GeoModelTools/ExpressionEvaluator/ExpressionEvaluator/IEvaluator.h b/GeoModelTools/ExpressionEvaluator/ExpressionEvaluator/IEvaluator.h
index 10c1392509fe9b6f3a09d084c8ffb791f89b9d27..898188f566357273eebe3752552b4de7662de0d5 100755
--- a/GeoModelTools/ExpressionEvaluator/ExpressionEvaluator/IEvaluator.h
+++ b/GeoModelTools/ExpressionEvaluator/ExpressionEvaluator/IEvaluator.h
@@ -21,6 +21,21 @@ class IEvaluator {
    */
   ~IEvaluator() {;} 
 
+  enum {
+    OK,                         /**< Everything OK */
+    WARNING_EXISTING_VARIABLE,  /**< Redefinition of existing variable */
+    WARNING_EXISTING_FUNCTION,  /**< Redefinition of existing function */
+    WARNING_BLANK_STRING,       /**< Empty input string */
+    ERROR_NOT_A_NAME,           /**< Not allowed sysmbol in the name of variable or function */
+    ERROR_SYNTAX_ERROR,         /**< Systax error */
+    ERROR_UNPAIRED_PARENTHESIS, /**< Unpaired parenthesis */
+    ERROR_UNEXPECTED_SYMBOL,    /**< Unexpected sysbol */
+    ERROR_UNKNOWN_VARIABLE,     /**< Non-existing variable */
+    ERROR_UNKNOWN_FUNCTION,     /**< Non-existing function */
+    ERROR_EMPTY_PARAMETER,      /**< Function call has empty parameter */
+    ERROR_CALCULATION_ERROR     /**< Error during calculation */
+  };
+
   virtual double evaluate(const char * expression) = 0;
 
   virtual int status() const {return 0;}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h
index 5cb7628ecb69c8d1c269574c398fcdab11d48915..088b1e1345a516727062fb942f52a7a7e56cc19e 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h
@@ -51,7 +51,7 @@ XERCES_CPP_NAMESPACE_BEGIN
 class DOMNode;
 XERCES_CPP_NAMESPACE_END
 
-class Evaluator;
+class IEvaluator;
 
 class Gmx2Geo {
 public:
@@ -61,7 +61,7 @@ private:
     Gmx2Geo(const Gmx2Geo &right);
     Gmx2Geo & operator=(const Gmx2Geo &right);
 
-    int doDefines(xercesc::DOMDocument *doc, Evaluator &eval);
+    int doDefines(xercesc::DOMDocument *doc, IEvaluator &eval);
     int doPositionIndex(xercesc::DOMDocument *doc, GmxUtil &gmxUtil);
     int doReadoutGeometry(xercesc::DOMDocument *doc, GmxUtil &gmxUtil);
     void addParam(xercesc::DOMNode *node, std::map<std::string, std::string> &params);
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h
index 04df4d4545b19887948d38c812e8f2d4ba7ffeb1..6231baad44f9d35c1f1c7e524ce4fe52cb0a48bb 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h
@@ -9,11 +9,9 @@
 //    to element handlers instead of a (changing??) list.
 //
 #include <string>
-#ifndef STANDALONE_GMX
-#include "CLHEP/Evaluator/Evaluator.h"
-#else
-#include "ExpressionEvaluator/Evaluator.h"
-#endif
+
+#include "ExpressionEvaluator/ExprtkEvaluator.h"
+
 #include "GeoModelXml/MaterialManager.h"
 #include "GeoModelXml/ProcessorRegistry.h"
 #include "GeoModelXml/Element2GeoItemRegistry.h"
@@ -38,9 +36,7 @@
 #include "GeoModelXml/MakeTransformationref.h"
 #include "GeoModelXml/MakeTranslation.h"
 #include "GeoModelXml/MakeRotation.h"
-#ifndef STANDALONE_GMX
-#include "GeoModelXml/MakeScaling.h"
-#endif
+// #include "GeoModelXml/MakeScaling.h"
 
 #include "GeoModelXml/shape/MakeSimplePolygonBrep.h"
 #include "GeoModelXml/shape/MakeEllipticalTube.h"
@@ -73,11 +69,9 @@ public:
     GmxInterface *gmxInterface();
     double evaluate(char const *expression);
     std::string debracket(std::string expression);
-#ifndef STANDALONE_GMX
-    HepTool::Evaluator eval;
-#else
-    Evaluator eval;
-#endif
+
+    ExprtkEvaluator eval;
+
     PositionIndex positionIndex;
     MaterialManager* matManager=0;
     ProcessorRegistry processorRegistry;
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h
index 59a730ac5861a86125fa867409459fefc1c05931..bf544162cdfe659a8dee4f8776cc3bf0b1d55e69 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h
@@ -20,7 +20,7 @@
 #include <map>
 #include <string>
 
-class Evaluator;
+class IEvaluator;
 
 class PositionIndex {
 public:
@@ -39,7 +39,7 @@ public:
     std::string formula(std::string name);
     void setFormula(std::string name, std::string formula);
 
-    void indices(std::map<std::string, int> &index, Evaluator &eval);
+    void indices(std::map<std::string, int> &index, IEvaluator &eval);
 
 private:
     int m_level;
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx
index a6f28adb549d7080cb6781b942c2f3bedf76f89c..e85cd245d3b92083c54a84097dce80e063073d4b 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx
@@ -104,7 +104,7 @@ Gmx2Geo::Gmx2Geo(const string xmlFile, GeoPhysVol *addHere, GmxInterface &gmxInt
     XMLPlatformUtils::Terminate();
 }
 
-int Gmx2Geo::doDefines(DOMDocument *doc, Evaluator &eval) {
+int Gmx2Geo::doDefines(DOMDocument *doc, IEvaluator &eval) {
 //
 //    Add all defines to the CLHEP::Evaluator
 //
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx
index 599efd360dd43b16dc0499432a2eca9972408f1b..fd4f138164c64a88e349aecc99ac51e47f9cada1 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx
@@ -117,7 +117,7 @@ double GmxUtil::evaluate(char const *expression) {
 #ifndef STANDALONE_GMX
     if (eval.status() != HepTool::Evaluator::OK) {
 #else
-    if (eval.status() != Evaluator::OK) {
+    if (eval.status() != IEvaluator::OK) {
 #endif
 #ifndef STANDALONE_GMX
         msglog << MSG::FATAL << "GeoModelXml Error processing Evaluator expression. Error name <" <<
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx
index 7a2b3ad659ec29447be38a2f2fd0b6892f8a1daa..33e1f899b69ab89e358aad61fc4604d7ddd429b8 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx
@@ -68,7 +68,7 @@ void PositionIndex::setFormula(std::string name, std::string formula) {
     m_formula[name] = formula;
 }
 
-void PositionIndex::indices(map<string, int> &index, Evaluator &eval) {
+void PositionIndex::indices(map<string, int> &index, IEvaluator &eval) {
     index.clear(); // In case caller uses it many times
 //
 //    Set Copy Number of each Level (CNL_i) up to current level