diff --git a/src/DynareBison.yy b/src/DynareBison.yy
index 46d142535490be9e4ec037e9095b1e0b5fa6d4ba..8e42c8aa8579864bc3a4b0489c1919f2ba4d4817 100644
--- a/src/DynareBison.yy
+++ b/src/DynareBison.yy
@@ -136,7 +136,7 @@ class ParsingDriver;
 %left TIMES DIVIDE
 %precedence UNARY
 %nonassoc POWER
-%token EXP LOG LN LOG10 SIN COS TAN ASIN ACOS ATAN ERF ERFC DIFF ADL AUXILIARY_MODEL_NAME
+%token EXP LOG LN LOG10 SIN COS TAN ASIN ACOS ATAN SINH COSH TANH ASINH ACOSH ATANH ERF ERFC DIFF ADL AUXILIARY_MODEL_NAME
 %token SQRT CBRT NORMCDF NORMPDF STEADY_STATE EXPECTATION
 /* GSA analysis */
 %token DYNARE_SENSITIVITY MORRIS STAB REDFORM PPRIOR PRIOR_RANGE PPOST ILPTAU MORRIS_NLIV
@@ -736,6 +736,18 @@ expression : '(' expression ')'
              { $$ = driver.add_acos($3); }
            | ATAN '(' expression ')'
              { $$ = driver.add_atan($3); }
+           | SINH '(' expression ')'
+             { $$ = driver.add_sinh($3); }
+           | COSH '(' expression ')'
+             { $$ = driver.add_cosh($3); }
+           | TANH '(' expression ')'
+             { $$ = driver.add_tanh($3); }
+           | ASINH '(' expression ')'
+             { $$ = driver.add_asinh($3); }
+           | ACOSH '(' expression ')'
+             { $$ = driver.add_acosh($3); }
+           | ATANH '(' expression ')'
+             { $$ = driver.add_atanh($3); }
            | SQRT '(' expression ')'
              { $$ = driver.add_sqrt($3); }
            | CBRT '(' expression ')'
@@ -1046,6 +1058,18 @@ hand_side : '(' hand_side ')'
             { $$ = driver.add_acos($3); }
           | ATAN '(' hand_side ')'
             { $$ = driver.add_atan($3); }
+          | SINH '(' hand_side ')'
+            { $$ = driver.add_sinh($3); }
+          | COSH '(' hand_side ')'
+            { $$ = driver.add_cosh($3); }
+          | TANH '(' hand_side ')'
+            { $$ = driver.add_tanh($3); }
+          | ASINH '(' hand_side ')'
+            { $$ = driver.add_asinh($3); }
+          | ACOSH '(' hand_side ')'
+            { $$ = driver.add_acosh($3); }
+          | ATANH '(' hand_side ')'
+            { $$ = driver.add_atanh($3); }
           | SQRT '(' hand_side ')'
             { $$ = driver.add_sqrt($3); }
           | CBRT '(' hand_side ')'
diff --git a/src/DynareFlex.ll b/src/DynareFlex.ll
index 438dfcdc7a7c6ac97bae4b877cc398de99cc2096..e19aa7ea8d80c4fda784b7b6b50704278ca21f18 100644
--- a/src/DynareFlex.ll
+++ b/src/DynareFlex.ll
@@ -920,6 +920,12 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4])
 <DYNARE_STATEMENT,DYNARE_BLOCK>asin {return token::ASIN;}
 <DYNARE_STATEMENT,DYNARE_BLOCK>acos {return token::ACOS;}
 <DYNARE_STATEMENT,DYNARE_BLOCK>atan {return token::ATAN;}
+<DYNARE_STATEMENT,DYNARE_BLOCK>sinh {return token::SINH;}
+<DYNARE_STATEMENT,DYNARE_BLOCK>cosh {return token::COSH;}
+<DYNARE_STATEMENT,DYNARE_BLOCK>tanh {return token::TANH;}
+<DYNARE_STATEMENT,DYNARE_BLOCK>asinh {return token::ASINH;}
+<DYNARE_STATEMENT,DYNARE_BLOCK>acosh {return token::ACOSH;}
+<DYNARE_STATEMENT,DYNARE_BLOCK>atanh {return token::ATANH;}
 <DYNARE_STATEMENT,DYNARE_BLOCK>sqrt {return token::SQRT;}
 <DYNARE_STATEMENT,DYNARE_BLOCK>cbrt {return token::CBRT;}
 <DYNARE_STATEMENT,DYNARE_BLOCK>max {return token::MAX;}
diff --git a/src/ExprNode.cc b/src/ExprNode.cc
index 6f2a95af7c3217bcab165f3b9da923c90e4d2cc6..83136997f0cd0b36e04b6257d84af2d250c08980 100644
--- a/src/ExprNode.cc
+++ b/src/ExprNode.cc
@@ -2048,7 +2048,7 @@ UnaryOpNode::composeDerivatives(expr_t darg, int deriv_id)
     case UnaryOpcode::atanh:
       t11 = datatree.AddTimes(arg, arg);
       t12 = datatree.AddMinus(datatree.One, t11);
-      return datatree.AddTimes(darg, t12);
+      return datatree.AddDivide(darg, t12);
     case UnaryOpcode::sqrt:
       t11 = datatree.AddPlus(this, this);
       return datatree.AddDivide(darg, t11);