diff --git a/matlab/@dynSeries/qdiff.m b/matlab/@dynSeries/qdiff.m
new file mode 100644
index 0000000000000000000000000000000000000000..835f0ec0c99e45a5c902469bf7ab909fcda484b3
--- /dev/null
+++ b/matlab/@dynSeries/qdiff.m
@@ -0,0 +1,101 @@
+function us = qdiff(ts)
+
+%@info:
+%! @deftypefn {Function File} {@var{us} =} qdiff (@var{ts})
+%! @anchor{qdiff}
+%! @sp 1
+%! Computes quaterly differences.
+%! @sp 2
+%! @strong{Inputs}
+%! @sp 1
+%! @table @var
+%! @item ts
+%! Dynare time series object, instantiated by @ref{dynSeries}
+%! @end table
+%! @sp 2
+%! @strong{Outputs}
+%! @sp 1
+%! @table @var
+%! @item us
+%! Dynare time series object with transformed data field.
+%! @end table
+%! @end deftypefn
+%@eod:
+
+% Copyright (C) 2012 Dynare Team
+%
+% This file is part of Dynare.
+%
+% Dynare is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Dynare is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
+
+% AUTHOR(S) stephane DOT adjemian AT univ DASH lemans DOT fr
+
+us = ts;
+
+switch ts.freq
+  case 1
+    error('dynSeries::qgrowth: I cannot compute quaterly differences from yearly data!')
+  case 4
+    us.data(2:end,:) = ts.data(2:end,:)-ts.data(1:end-1,:);
+    us.data(1,:) = NaN;
+  case 12
+    us.data(4:end,:) = ts.data(4:end,:)-ts.data(1:end-3,:);
+    us.data(1:3,:) = NaN;
+  case 52
+    error('dynSeries::qgrowth: I do not know yet how to compute quaterly differences from weekly data!')
+  otherwise
+    error(['dynSeries::ygrowth: object ' inputname(1) ' has unknown frequency']);
+end
+
+%@test:1
+%$ t = zeros(2,1);
+%$
+%$ try
+%$     data = transpose(0:1:50);
+%$     ts = dynSeries(data,'1950Q1');
+%$     ts = ts.qdiff;
+%$     t(1) = 1;
+%$ catch
+%$     t = 0;
+%$ end
+%$
+%$ if length(t)>1
+%$     DATA = NaN(1,ts.vobs);
+%$     DATA = [DATA; ones(ts.nobs-1,ts.vobs)];
+%$     t(2) = dyn_assert(ts.data,DATA,1e-15);
+%$ end
+%$
+%$ T = all(t);
+%@eof:1
+
+%@test:2
+%$ t = zeros(2,1);
+%$
+%$ try
+%$     data = transpose(0:1:80);
+%$     ts = dynSeries(data,'1950M1');
+%$     ts = ts.qdiff;
+%$     t(1) = 1;
+%$ catch
+%$     t = 0;
+%$ end
+%$
+%$ if length(t)>1
+%$     DATA = NaN(3,ts.vobs);
+%$     DATA = [DATA; 3*ones(ts.nobs-3,ts.vobs)];
+%$     t(2) = dyn_assert(ts.data,DATA,1e-15);
+%$ end
+%$
+%$ T = all(t);
+%@eof:2
\ No newline at end of file
diff --git a/matlab/@dynSeries/qgrowth.m b/matlab/@dynSeries/qgrowth.m
new file mode 100644
index 0000000000000000000000000000000000000000..ea532332f947b939dc4ad740705edf3ec5bf2050
--- /dev/null
+++ b/matlab/@dynSeries/qgrowth.m
@@ -0,0 +1,101 @@
+function us = qgrowth(ts)
+
+%@info:
+%! @deftypefn {Function File} {@var{us} =} qgrowth (@var{ts})
+%! @anchor{qgrowth}
+%! @sp 1
+%! Computes quaterly growth rates.
+%! @sp 2
+%! @strong{Inputs}
+%! @sp 1
+%! @table @var
+%! @item ts
+%! Dynare time series object, instantiated by @ref{dynSeries}
+%! @end table
+%! @sp 2
+%! @strong{Outputs}
+%! @sp 1
+%! @table @var
+%! @item us
+%! Dynare time series object with transformed data field.
+%! @end table
+%! @end deftypefn
+%@eod:
+
+% Copyright (C) 2012 Dynare Team
+%
+% This file is part of Dynare.
+%
+% Dynare is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Dynare is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
+
+% AUTHOR(S) stephane DOT adjemian AT univ DASH lemans DOT fr
+
+us = ts;
+
+switch ts.freq
+  case 1
+    error('dynSeries::qgrowth: I cannot compute quaterly growth rates from yearly data!')
+  case 4
+    us.data(2:end,:) = ts.data(2:end,:)./ts.data(1:end-1,:) - 1;
+    us.data(1,:) = NaN;
+  case 12
+    us.data(4:end,:) = ts.data(4:end,:)./ts.data(1:end-3,:) - 1;
+    us.data(1:3,:) = NaN;
+  case 52
+    error('dynSeries::qgrowth: I do not know yet how to compute quaterly growth rates from weekly data!')
+  otherwise
+    error(['dynSeries::ygrowth: object ' inputname(1) ' has unknown frequency']);
+end
+
+%@test:1
+%$ t = zeros(2,1);
+%$
+%$ try
+%$     data = (1+.01).^transpose(0:1:50);
+%$     ts = dynSeries(data,'1950Q1');
+%$     ts = ts.qgrowth;
+%$     t(1) = 1;
+%$ catch
+%$     t = 0;
+%$ end
+%$
+%$ if length(t)>1
+%$     DATA = NaN(1,ts.vobs);
+%$     DATA = [DATA; .01*ones(ts.nobs-1,ts.vobs)];
+%$     t(2) = dyn_assert(ts.data,DATA,1e-15);
+%$ end
+%$
+%$ T = all(t);
+%@eof:1
+
+%@test:2
+%$ t = zeros(2,1);
+%$
+%$ try
+%$     data = (1+.01).^transpose(0:1:80);
+%$     ts = dynSeries(data,'1950M1');
+%$     ts = ts.qgrowth;
+%$     t(1) = 1;
+%$ catch
+%$     t = 0;
+%$ end
+%$
+%$ if length(t)>1
+%$     DATA = NaN(3,ts.vobs);
+%$     DATA = [DATA; (1.01^3-1)*ones(ts.nobs-3,ts.vobs)];
+%$     t(2) = dyn_assert(ts.data,DATA,1e-15);
+%$ end
+%$
+%$ T = all(t);
+%@eof:2
\ No newline at end of file
diff --git a/matlab/@dynSeries/subsref.m b/matlab/@dynSeries/subsref.m
index ce2335e824c503b68adc152163dac366c2f905ea..1d9b0ea548b9f9749dc7cabf7d18b3ce306b3f42 100644
--- a/matlab/@dynSeries/subsref.m
+++ b/matlab/@dynSeries/subsref.m
@@ -67,7 +67,7 @@ if length(S)==1 && isequal(S.type,'.')
     switch S.subs
       case {'data','nobs','vobs','name','tex','freq','time','init'}        % Public members.
         us = builtin('subsref', ts, S);
-      case {'log','exp'}                                                   % Give "dot access" to public methods.
+      case {'log','exp','ygrowth','qgrowth','ydiff','qdiff'}               % Give "dot access" to public methods.
         us = feval(S.subs,ts);
       case {'save'}
         us = NaN;
diff --git a/matlab/@dynSeries/ydiff.m b/matlab/@dynSeries/ydiff.m
new file mode 100644
index 0000000000000000000000000000000000000000..55c07f91e9b3da5e93c7f3e8d7f4413424dd1d11
--- /dev/null
+++ b/matlab/@dynSeries/ydiff.m
@@ -0,0 +1,127 @@
+function us = ydiff(ts)
+
+%@info:
+%! @deftypefn {Function File} {@var{us} =} ydiff (@var{ts})
+%! @anchor{ydiff}
+%! @sp 1
+%! Computes annual differences.
+%! @sp 2
+%! @strong{Inputs}
+%! @sp 1
+%! @table @var
+%! @item ts
+%! Dynare time series object, instantiated by @ref{dynSeries}
+%! @end table
+%! @sp 2
+%! @strong{Outputs}
+%! @sp 1
+%! @table @var
+%! @item us
+%! Dynare time series object with transformed data field.
+%! @end table
+%! @end deftypefn
+%@eod:
+
+% Copyright (C) 2012 Dynare Team
+%
+% This file is part of Dynare.
+%
+% Dynare is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Dynare is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
+
+% AUTHOR(S) stephane DOT adjemian AT univ DASH lemans DOT fr
+
+us = ts;
+
+switch ts.freq
+  case 1
+    us.data(2:end,:) = ts.data(2:end,:)-ts.data(1:end-1,:);
+    us.data(1,:) = NaN;
+  case 4
+    us.data(5:end,:) = ts.data(5:end,:)-ts.data(1:end-4,:);
+    us.data(1:4,:) = NaN;
+  case 12
+    us.data(13:end,:) = ts.data(13:end,:)-ts.data(1:end-12,:);
+    us.data(1:12,:) = NaN;
+  case 52
+    us.data(53:end,:) = ts.data(53:end,:)-ts.data(1:end-52,:);
+    us.data(1:52,:) = NaN;
+  otherwise
+    error(['dynSeries::ygrowth: object ' inputname(1) ' has unknown frequency']);
+end
+
+%@test:1
+%$ t = zeros(2,1);
+%$
+%$ try
+%$     data = transpose(1:100);
+%$     ts = dynSeries(data,'1950Q1');
+%$     ts = ts.ydiff;
+%$     t(1) = 1;
+%$ catch
+%$     t = 0;
+%$ end
+%$
+%$
+%$ if length(t)>1
+%$     DATA = NaN(4,ts.vobs);
+%$     DATA = [DATA; 4*ones(ts.nobs-4,ts.vobs)];
+%$     t(2) = dyn_assert(ts.data,DATA);
+%$ end
+%$
+%$ T = all(t);
+%@eof:1
+
+%@test:2
+%$ t = zeros(2,1);
+%$
+%$ try
+%$     data = transpose(1:100);
+%$     ts = dynSeries(data,'1950M1');
+%$     ts = ts.ydiff;
+%$     t(1) = 1;
+%$ catch
+%$     t = 0;
+%$ end
+%$
+%$
+%$ if length(t)>1
+%$     DATA = NaN(12,ts.vobs);
+%$     DATA = [DATA; 12*ones(ts.nobs-12,ts.vobs)];
+%$     t(2) = dyn_assert(ts.data,DATA);
+%$ end
+%$
+%$ T = all(t);
+%@eof:2
+
+%@test:3
+%$ t = zeros(2,1);
+%$
+%$ try
+%$     data = transpose(1:100);
+%$     ts = dynSeries(data,'1950W1');
+%$     ts = ts.ydiff;
+%$     t(1) = 1;
+%$ catch
+%$     t = 0;
+%$ end
+%$
+%$
+%$ if length(t)>1
+%$     DATA = NaN(52,ts.vobs);
+%$     DATA = [DATA; 52*ones(ts.nobs-52,ts.vobs)];
+%$     t(2) = dyn_assert(ts.data,DATA);
+%$ end
+%$
+%$ T = all(t);
+%@eof:3
\ No newline at end of file
diff --git a/matlab/@dynSeries/ygrowth.m b/matlab/@dynSeries/ygrowth.m
new file mode 100644
index 0000000000000000000000000000000000000000..995ecd3ba93e079909ab7de292631e8228fa1858
--- /dev/null
+++ b/matlab/@dynSeries/ygrowth.m
@@ -0,0 +1,127 @@
+function us = ygrowth(ts)
+
+%@info:
+%! @deftypefn {Function File} {@var{us} =} ygrowth (@var{ts})
+%! @anchor{ygrowth}
+%! @sp 1
+%! Computes annual growth rates.
+%! @sp 2
+%! @strong{Inputs}
+%! @sp 1
+%! @table @var
+%! @item ts
+%! Dynare time series object, instantiated by @ref{dynSeries}
+%! @end table
+%! @sp 2
+%! @strong{Outputs}
+%! @sp 1
+%! @table @var
+%! @item us
+%! Dynare time series object with transformed data field.
+%! @end table
+%! @end deftypefn
+%@eod:
+
+% Copyright (C) 2012 Dynare Team
+%
+% This file is part of Dynare.
+%
+% Dynare is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Dynare is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
+
+% AUTHOR(S) stephane DOT adjemian AT univ DASH lemans DOT fr
+
+us = ts;
+
+switch ts.freq
+  case 1
+    us.data(2:end,:) = ts.data(2:end,:)./ts.data(1:end-1,:) - 1;
+    us.data(1,:) = NaN;
+  case 4
+    us.data(5:end,:) = ts.data(5:end,:)./ts.data(1:end-4,:) - 1;
+    us.data(1:4,:) = NaN;
+  case 12
+    us.data(13:end,:) = ts.data(13:end,:)./ts.data(1:end-12,:) - 1;
+    us.data(1:12,:) = NaN;
+  case 52
+    us.data(53:end,:) = ts.data(53:end,:)./ts.data(1:end-52,:) - 1;
+    us.data(1:52,:) = NaN;
+  otherwise
+    error(['dynSeries::ygrowth: object ' inputname(1) ' has unknown frequency']);
+end
+
+%@test:1
+%$ t = zeros(2,1);
+%$
+%$ try
+%$     data = repmat(transpose(1:4),100,1);
+%$     ts = dynSeries(data,'1950Q1');
+%$     ts = ts.ygrowth;
+%$     t(1) = 1;
+%$ catch
+%$     t = 0;
+%$ end
+%$
+%$
+%$ if length(t)>1
+%$     DATA = NaN(4,ts.vobs);
+%$     DATA = [DATA; zeros(ts.nobs-4,ts.vobs)];
+%$     t(2) = dyn_assert(ts.data,DATA);
+%$ end
+%$
+%$ T = all(t);
+%@eof:1
+
+%@test:2
+%$ t = zeros(2,1);
+%$
+%$ try
+%$     data = repmat(transpose(1:12),100,1);
+%$     ts = dynSeries(data,'1950M1');
+%$     ts = ts.ygrowth;
+%$     t(1) = 1;
+%$ catch
+%$     t = 0;
+%$ end
+%$
+%$
+%$ if length(t)>1
+%$     DATA = NaN(12,ts.vobs);
+%$     DATA = [DATA; zeros(ts.nobs-12,ts.vobs)];
+%$     t(2) = dyn_assert(ts.data,DATA);
+%$ end
+%$
+%$ T = all(t);
+%@eof:2
+
+%@test:3
+%$ t = zeros(2,1);
+%$
+%$ try
+%$     data = repmat(transpose(1:52),100,1);
+%$     ts = dynSeries(data,'1950W1');
+%$     ts = ts.ygrowth;
+%$     t(1) = 1;
+%$ catch
+%$     t = 0;
+%$ end
+%$
+%$
+%$ if length(t)>1
+%$     DATA = NaN(52,ts.vobs);
+%$     DATA = [DATA; zeros(ts.nobs-52,ts.vobs)];
+%$     t(2) = dyn_assert(ts.data,DATA);
+%$ end
+%$
+%$ T = all(t);
+%@eof:3
\ No newline at end of file