diff --git a/modules/mol/base/src/impl/query_ast.cc b/modules/mol/base/src/impl/query_ast.cc
index 697ff173f1271b36e576d37acff20e9e50df5d58..ea96a485877b9c01226f4acdfa94e69c526fcb99 100644
--- a/modules/mol/base/src/impl/query_ast.cc
+++ b/modules/mol/base/src/impl/query_ast.cc
@@ -120,6 +120,7 @@ StringOrRegexParam::StringOrRegexParam():
 StringOrRegexParam::StringOrRegexParam(const String& s):
   is_regex_(false),r_(),s_(s)
 {
+  String special("[]{}()");
   for(String::const_iterator it=s.begin();it!=s.end();++it) {
     if((*it)=='?' || (*it)=='*') {
       is_regex_=true;
@@ -130,12 +131,16 @@ StringOrRegexParam::StringOrRegexParam(const String& s):
   if(is_regex_) {
     std::ostringstream e;
     for(String::const_iterator it=s.begin();it!=s.end();++it) {
-      if((*it)=='?') {
-	e << ".";
-      } else if((*it)=='*') {
-	e << ".*";
+      
+      if((*it)=='?' && (it==s.begin() || (*(it-1))!='\\')) {
+        e << ".";
+      } else if((*it)=='*' && (it==s.begin() || (*(it-1))!='\\')) {
+        e << ".*";
       } else {
-	e << *it;
+        if (special.find(*it)!=String::npos) {
+          e << '\\';
+        }
+        e << *it;
       }
     }
     //std::cerr << "assembling regex [" << e.str() << "]... ";
diff --git a/modules/mol/base/src/impl/query_impl.cc b/modules/mol/base/src/impl/query_impl.cc
index cc5f80240bd1ddaff070ea42d518891c84419772..a70cfa813b39d63d9337cfb6135846d63796f8fb 100644
--- a/modules/mol/base/src/impl/query_impl.cc
+++ b/modules/mol/base/src/impl/query_impl.cc
@@ -148,7 +148,7 @@ QueryToken QueryLexer::LexNumericToken() {
 }
 
 bool is_ident_or_str(char c) {
-  static String allowed_chars("_*?");
+  static String allowed_chars("_*?\\");
   return isalnum(c) || allowed_chars.find_first_of(c)!=String::npos;
 }
 
@@ -158,7 +158,8 @@ QueryToken QueryLexer::LexIdentOrStringToken() {
   bool force_string=false;
   while (current_<query_string_.length() && 
          is_ident_or_str(query_string_[current_])) {
-    if (query_string_[current_]=='*' || query_string_[current_]=='?') {
+    if (query_string_[current_]=='*' || query_string_[current_]=='?' ||
+        query_string_[current_]=='\\') {
       force_string=true;
     }
     current_++;