diff --git a/resources/context_help/QgsFieldCalculator-en_US b/resources/context_help/QgsFieldCalculator-en_US
new file mode 100644
index 00000000000..c4c19cb9f20
--- /dev/null
+++ b/resources/context_help/QgsFieldCalculator-en_US
@@ -0,0 +1,71 @@
+
+
+ Operation |
+ Description |
+
+
+
+ column_name
+ "column_name"
+ |
+ value of field column_name |
+
+'string' | literal string value |
+number | number |
+NULL | null value |
+a OR b | a or b are true. |
+a AND b | a and b are true. |
+NOT a | inverted boolean value of a |
+a IS NULL | a has no value |
+a IS NOT NULL | a has a value |
+a IN ( value, [, value] ) | a is one of the listed values |
+a NOT IN ( value, [, value] ) | a is not one of the listed values |
+a = b | a and b are equal |
+
+
+ a != b
+ a <> b
+ |
+ a and b are not equal |
+
+a <= b | a is less or equal b |
+a >= b | a is greater or equal b |
+a > b | a is greater than b |
+a < b | a is less than b |
+a ~ b | a matches regular expression b |
+a LIKE b | a is like b |
+a ILIKE b | a is like b (case insensitive) |
+sqrt(a) | square root |
+sin(a) | sinus of a |
+cos(a) | cosinus of b |
+tan(a) | tangens of a |
+asin(a) | arcussinus of a |
+acos(a) | arcuscosinus of a |
+atan(a) | arcustangens of a |
+to int(a) | convert string a to integer |
+to real(a) | convert string a to real |
+to string(a) | convert number a to string |
+lower(a) | convert string a to lower case |
+upper(a) | convert string a to upper case |
+length(a) | length of string a |
+atan2(y,x) | arcustangens of y/x using the signs of the two arguments to determine the quadrant of the result. |
+replace(a,replacethis,withthat) | replace replacethis with withthat in string a |
+
substr(a,from,len) | len characters of string a starting from from (first character index is 1) |
+
a || b | concatenate strings a and b |
+$rownum | number current row |
+$area | area of polygon |
+$length | area of line |
+$id | feature id |
+a ^ b | a raised to the power of b |
+a * b | a multiplied by b |
+a * b | a divided by b |
+a + b | a plus b |
+a - b | a minus b |
++a | positive sign |
+-a | negative value of a |
+
diff --git a/src/app/qgsfieldcalculator.cpp b/src/app/qgsfieldcalculator.cpp
index 8956d6993b1..1b9bad38222 100644
--- a/src/app/qgsfieldcalculator.cpp
+++ b/src/app/qgsfieldcalculator.cpp
@@ -36,8 +36,6 @@ QgsFieldCalculator::QgsFieldCalculator( QgsVectorLayer* vl ): QDialog(), mVector
mOuputFieldWidthSpinBox->setValue( 10 );
mOutputFieldPrecisionSpinBox->setValue( 3 );
-
-
//disable ok button until there is text for output field and expression
mButtonBox->button( QDialogButtonBox::Ok )->setEnabled( false );
diff --git a/src/app/qgsfieldcalculator.h b/src/app/qgsfieldcalculator.h
index eaa74a55009..9ef89697d30 100644
--- a/src/app/qgsfieldcalculator.h
+++ b/src/app/qgsfieldcalculator.h
@@ -17,6 +17,7 @@
#define QGSFIELDCALCULATOR_H
#include "ui_qgsfieldcalculatorbase.h"
+#include "qgscontexthelp.h"
class QgsVectorLayer;
@@ -61,6 +62,8 @@ class QgsFieldCalculator: public QDialog, private Ui::QgsFieldCalculatorBase
void on_mExpressionTextEdit_textChanged();
void on_mOutputFieldTypeComboBox_activated( int index );
+ void on_mButtonBox_helpRequested() { QgsContextHelp::run( metaObject()->className() ); }
+
private:
//default constructor forbidden
QgsFieldCalculator();
diff --git a/src/core/qgssearchstringlexer.ll b/src/core/qgssearchstringlexer.ll
index 7a83a314309..e766a5179b7 100644
--- a/src/core/qgssearchstringlexer.ll
+++ b/src/core/qgssearchstringlexer.ll
@@ -83,18 +83,24 @@ string "'"{str_char}*"'"
"LIKE" { yylval.op = QgsSearchTreeNode::opLike; return COMPARISON; }
"ILIKE" { yylval.op = QgsSearchTreeNode::opILike; return COMPARISON; }
-"sqrt" { yylval.op = QgsSearchTreeNode::opSQRT; return FUNCTION;}
-"sin" { yylval.op = QgsSearchTreeNode::opSIN; return FUNCTION;}
-"cos" { yylval.op = QgsSearchTreeNode::opCOS; return FUNCTION;}
-"tan" { yylval.op = QgsSearchTreeNode::opTAN; return FUNCTION;}
-"asin" { yylval.op = QgsSearchTreeNode::opASIN; return FUNCTION;}
-"acos" { yylval.op = QgsSearchTreeNode::opACOS; return FUNCTION;}
-"atan" { yylval.op = QgsSearchTreeNode::opATAN; return FUNCTION;}
-"to int" { yylval.op = QgsSearchTreeNode::opTOINT; return FUNCTION;}
-"to real" { yylval.op = QgsSearchTreeNode::opTOREAL; return FUNCTION;}
-"to string" { yylval.op = QgsSearchTreeNode::opTOSTRING; return FUNCTION;}
-"lower" { yylval.op = QgsSearchTreeNode::opLOWER; return FUNCTION;}
-"upper" { yylval.op = QgsSearchTreeNode::opUPPER; return FUNCTION;}
+"sqrt" { yylval.op = QgsSearchTreeNode::opSQRT; return FUNCTION1;}
+"sin" { yylval.op = QgsSearchTreeNode::opSIN; return FUNCTION1;}
+"cos" { yylval.op = QgsSearchTreeNode::opCOS; return FUNCTION1;}
+"tan" { yylval.op = QgsSearchTreeNode::opTAN; return FUNCTION1;}
+"asin" { yylval.op = QgsSearchTreeNode::opASIN; return FUNCTION1;}
+"acos" { yylval.op = QgsSearchTreeNode::opACOS; return FUNCTION1;}
+"atan" { yylval.op = QgsSearchTreeNode::opATAN; return FUNCTION1;}
+"to int" { yylval.op = QgsSearchTreeNode::opTOINT; return FUNCTION1;}
+"to real" { yylval.op = QgsSearchTreeNode::opTOREAL; return FUNCTION1;}
+"to string" { yylval.op = QgsSearchTreeNode::opTOSTRING; return FUNCTION1;}
+"lower" { yylval.op = QgsSearchTreeNode::opLOWER; return FUNCTION1;}
+"upper" { yylval.op = QgsSearchTreeNode::opUPPER; return FUNCTION1;}
+"length" { yylval.op = QgsSearchTreeNode::opSTRLEN; return FUNCTION1;}
+
+"atan2" { yylval.op = QgsSearchTreeNode::opATAN2; return FUNCTION2;}
+
+"replace" { yylval.op = QgsSearchTreeNode::opREPLACE; return FUNCTION3;}
+"substr" { yylval.op = QgsSearchTreeNode::opSUBSTR; return FUNCTION3;}
"||" { return CONCAT; }
diff --git a/src/core/qgssearchstringparser.yy b/src/core/qgssearchstringparser.yy
index 6c9a8a1870d..1ba37c1a28d 100644
--- a/src/core/qgssearchstringparser.yy
+++ b/src/core/qgssearchstringparser.yy
@@ -61,7 +61,9 @@ void addToTmpNodes(QgsSearchTreeNode* node);
%token