diff --git a/matlab/@dynDate/subsref.m b/matlab/@dynDate/subsref.m
index f611aaef795d7baed8fa8181afaffac25cbb19b3..f9d0da121b1f1815f04cb391b2b22b199ac2ffe0 100644
--- a/matlab/@dynDate/subsref.m
+++ b/matlab/@dynDate/subsref.m
@@ -32,7 +32,7 @@ function B = subsref(A,S)
 %! @end deftypefn
 %@eod:
 
-% Copyright (C) 2011, 2012 Dynare Team
+% Copyright (C) 2011, 2012, 2013 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -49,75 +49,98 @@ function B = subsref(A,S)
 % You should have received a copy of the GNU General Public License
 % along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
 
-% Original author: stephane DOT adjemian AT univ DASH lemans DOT fr
-
-% Allow to populate an empty dynDate object or update a dynDate object
-if isequal(length(S),1) && isequal(S.type,'()')
-    if isequal(length(S.subs),1) && ischar(S.subs{1})
-        B = dynDate(S.subs{1});
-        return
-    elseif isequal(length(S.subs),1) && isnumeric(S.subs{1})
-        % Yearly data are assumed.
-        if isequal(A.freq,1)
-            B = dynDate(S.subs{1});
-            return
-        end
-    elseif isequal(length(S.subs),2) && isequal(length(S.subs{1}),1) && isequal(length(S.subs{2}),1)
-        tmp = [];
-        switch A.freq
-          case 4
-            % Quaterly data
-            if S.subs{2}<5 && S.subs{2}>0
-                tmp = [num2str(S.subs{1}), 'Q' num2str(S.subs{2})];
-            end
-          case 12
-            % Monthly data
-            if S.subs{2}<13 && S.subs{2}>0
-                tmp = [num2str(S.subs{1}), 'M' num2str(S.subs{2})];
+switch S(1).type
+  case '.'
+    switch S(1).subs
+      case 'format'
+        B = format(A);
+      case {'time', 'freq'}
+        B = builtin('subsref', A, S(1));
+      otherwise
+        error('dynDate::subsref: Unknown public member of method!')
+    end
+  case '()'
+    switch length(S(1).subs)
+      case 1
+        if ischar(S(1).subs{1})
+            if numel(S(1).subs{1})==1 && isempty(strmatch(S(1).subs{1},{'W','M','Q','Y'},'exact'))
+                error(['dynDate::subsref: To set the frequency, the input argument of dynDate object ''' inputname(1) ''' should be ''W'', ''M'', ''Q'' or ''Y''.'])
             end
-          case 52
-            % Weekly data
-            if S.subs{2}<53 && S.subs{2}>0
-                tmp = [num2str(S.subs{1}), 'W' num2str(S.subs{2})];
+            % Set the frequency (if numel==1) of an empty dynDate object or set the date (if numel>1).
+            B = dynDate(S(1).subs{1});
+        elseif isnumeric(S(1).subs{1}) && isscalar(S(1).subs{1}) && isint(S(1).subs{1})
+            if (~isnan(A.freq) && A.freq==1) || isnan(A.freq)
+                B = dynDate(S(1).subs{1});
+            else
+                error(['dynDate::subsref: dynDate object ''' inputname(1) ''' was not instantiated for years.'])
             end
-          otherwise
-            %
+        else
+            error('dynDate::subsref: Something is wrong in your syntax!')
         end
-        if ~isempty(tmp)
-            B = dynDate(tmp);
-            return
+      case 2% Populate an empty dynDate object
+        if isnan(A.freq)
+            error(['dynDate::subsref: I cannot interpret the two inputs of dynDate object ''' inputname(1) ''' because frequency is not set.'])
+        else
+            tmp = [];
+            switch A.freq
+              case 4
+                % Quaterly data
+                if isint(S(1).subs{2}) && isint(S(1).subs{1}) && S(1).subs{2}<5 && S(1).subs{2}>0
+                    tmp = [int2str(S(1).subs{1}), 'Q' int2str(S(1).subs{2})];
+                else
+                    if ~isint(S(1).subs{2}) || ~(S(1).subs{2}<5 && S(1).subs{2}>0)
+                        error(['dynDate::subsref: The second input argument of dynDate object ''' inputname(1) ''' (' num2str(S(1).subs{2})  ') should be a positive integer less than or equal to 4.'])
+                    end
+                    if ~isint(S(1).subs{2})
+                        error(['dynDate::subsref: The first input argument of dynDate object ''' inputname(1) ''' (' num2str(S(1).subs{1})  ') should be an integer.'])
+                    end
+                end
+              case 12
+                % Monthly data
+                if isint(S(1).subs{2}) && isint(S(1).subs{1}) && S(1).subs{2}<13 && S(1).subs{2}>0
+                    tmp = [num2str(S(1).subs{1}), 'M' num2str(S(1).subs{2})];
+                else
+                    if ~isint(S(1).subs{2}) || ~(S(1).subs{2}<13 && S(1).subs{2}>0)
+                        error(['dynDate::subsref: The second input argument of dynDate object ''' inputname(1) ''' (' num2str(S(1).subs{2})  ') should be a positive integer less than or equal to 12.'])
+                    end
+                    if ~isint(S(1).subs{2})
+                        error(['dynDate::subsref: The first input argument of dynDate object ''' inputname(1) ''' (' num2str(S(1).subs{1})  ') should be an integer.'])
+                    end
+                end
+              case 52
+                % Weekly data
+                if isint(S(1).subs{2}) && isint(S(1).subs{1}) && S(1).subs{2}<53 && S(1).subs{2}>0
+                    tmp = [num2str(S(1).subs{1}), 'W' num2str(S(1).subs{2})];
+                else
+                    if ~isint(S(1).subs{2}) || ~(S(1).subs{2}<53 && S(1).subs{2}>0)
+                        error(['dynDate::subsref: The second input argument of dynDate object ''' inputname(1) ''' (' num2str(S(1).subs{2})  ') should be a positive integer less than or equal to 52.'])
+                    end
+                    if ~isint(S(1).subs{2})
+                        error(['dynDate::subsref: The first input argument of dynDate object ''' inputname(1) ''' (' num2str(S(1).subs{1})  ') should be an integer.'])
+                    end                    
+                end
+              case 1
+                % Yearly data
+                error('dynDate::subsref: Frequency is set for years. You should not provide more than one integer input argument (to set the year)!')
+              otherwise
+                error('dynDate::subsref: Unknown frequency!')
+            end
+            if ~isempty(tmp)
+                B = dynDate(tmp);
+            end
         end
+      otherwise
+        error(['dynDate::subsref: dynDate object ''' inputname(1) ''' cannot have more than two inputs.'])
     end
+  otherwise
+    error('dynDate::subsref: Something is wrong in your syntax!')
 end
 
-% Give access to dynDate methods (format).
-if isequal(length(S),1) && isequal(S.type,'.') && ( strcmp(S.subs,'format') )
-    B = format(A);
-    return
-end
-
-
-% Give access to dynDate properties (time and freq).
-if isequal(length(S),1) && isequal(S.type,'.') && ( strcmp(S.subs,'time') || strcmp(S.subs,'freq') )
-    B = builtin('subsref', A, S);
-    return
+S = shiftS(S);
+if ~isempty(S)
+    B = subsref(B, S);
 end
 
-% Allow more complex call to subsref such that:
-%
-% a = dynDate();
-% a('2009M4').time
-%
-% should return a row vector [2009 4]. Note that the object name should not match any function name
-% declared in the matlab's path.
-if length(S)>1 && isequal(S(1).type,'()') && isequal(S(2).type,'.')
-    tmp = dynDate(S(1).subs{1});
-    B = builtin('subsref', tmp, S(2));
-    return
-end
-
-error('dynDate::subsref: You''re trying to do something wrong!')
-
 %@test:1
 %$ t = zeros(3,1);
 %$