diff --git a/src/@dseries/diff.m b/src/@dseries/diff.m
new file mode 100644
index 0000000000000000000000000000000000000000..80ca080c58ac2c682195319fd97712fb4b07b4a0
--- /dev/null
+++ b/src/@dseries/diff.m
@@ -0,0 +1,49 @@
+function o = diff(o) % --*-- Unitary tests --*--
+
+% Computes differences.
+%
+% INPUTS
+% - o   [dseries]
+%
+% OUTPUTS
+% - o   [dseries]
+
+% Copyright (C) 2017 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/>.
+
+o = copy(o);
+o.diff_();
+
+%@test:1
+%$ try
+%$     data = transpose(0:1:50);
+%$     ts = dseries(data,'1950Q1');
+%$     ds = ts.diff();
+%$     t(1) = 1;
+%$ catch
+%$     t(1) = 0;
+%$ end
+%$
+%$ if t(1)
+%$     DATA = NaN(1,ds.vobs);
+%$     DATA = [DATA; ones(ds.nobs-1,ds.vobs)];
+%$     t(2) = dassert(ds.data, DATA, 1e-15);
+%$     t(3) = dassert(ts.data, data, 1e-15);
+%$ end
+%$
+%$ T = all(t);
+%@eof:1
\ No newline at end of file
diff --git a/src/@dseries/diff_.m b/src/@dseries/diff_.m
new file mode 100644
index 0000000000000000000000000000000000000000..551fe23ce57215a19ae8637a249dc4d980e23e1e
--- /dev/null
+++ b/src/@dseries/diff_.m
@@ -0,0 +1,56 @@
+function o = diff_(o) % --*-- Unitary tests --*--
+
+% Computes differences, independently of the frequency.
+%
+% INPUTS
+% - o   [dseries]
+%
+% OUTPUTS
+% - o   [dseries]
+
+% Copyright (C) 2017 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/>.
+
+o.data(2:end,:) = o.data(2:end,:)-o.data(1:end-1,:);
+o.data(1,:) = NaN;
+
+for i = 1:vobs(o)
+    if isempty(o.ops{i})
+        o.ops(i) = {['diff(' o.name{i} ')']};
+    else
+        o.ops(i) = {['diff(' o.ops{i} ')']};
+    end
+end
+
+%@test:1
+%$ try
+%$     data = transpose(0:1:50);
+%$     ts = dseries(data,'1950Q1');
+%$     ts.diff_;
+%$     t(1) = 1;
+%$ catch
+%$     t(1) = 0;
+%$ end
+%$
+%$ if t(1)
+%$     DATA = NaN(1,ts.vobs);
+%$     DATA = [DATA; ones(ts.nobs-1,ts.vobs)];
+%$     t(2) = dassert(ts.data,DATA,1e-15);
+%$ end
+%$
+%$ T = all(t);
+%@eof:1
\ No newline at end of file
diff --git a/src/@dseries/subsref.m b/src/@dseries/subsref.m
index 9f6f47f55b7a946cfeeeb888be6a2933b7d8e2eb..23ee9f4f10c02e8383b1e22103f1dd2db17850e9 100644
--- a/src/@dseries/subsref.m
+++ b/src/@dseries/subsref.m
@@ -132,6 +132,7 @@ switch S(1).type
             'qgrowth','qgrowth_', ...
             'ydiff','ydiff_', ...
             'qdiff','qdiff_', ...
+            'diff', 'diff_', ...
             'abs','abs_', ...
             'isnan', ...
             'firstdate', ...