diff --git a/matlab/+mom/matched_irfs_blocks.m b/matlab/+mom/matched_irfs_blocks.m
new file mode 100644
index 0000000000000000000000000000000000000000..1b422478864e709918f426c8880f254839983609
--- /dev/null
+++ b/matlab/+mom/matched_irfs_blocks.m
@@ -0,0 +1,81 @@
+function [data_irfs, weightMat, irfIndex, maxIrfHorizon] = matched_irfs_blocks(matched_irfs, matched_irfs_weight, varobs_id, obs_nbr, exo_nbr, endo_names)
+% [data_irfs, weightMat, irfIndex, maxIrfHorizon] = matched_irfs_blocks(matched_irfs, matched_irfs_weight, varobs_id, obs_nbr, exo_nbr, endo_names)
+% -------------------------------------------------------------------------
+% Checks and transforms matched_irfs and matched_irfs_weight blocks
+% for further use in the estimation.
+% -------------------------------------------------------------------------
+% INPUTS
+% matched_irfs:        [cell array] original matched_irfs block
+% matched_irfs_weight: [cell array] original matched_irfs_weight block
+% varobs_id:           [vector]     index for observable variables in endo_names
+% obs_nbr:             [scalar]     number of observable variables
+% exo_nbr:             [scalar]     number of exogenous variables
+% endo_names:          [cell array] list of endogenous variables
+% -------------------------------------------------------------------------
+% OUTPUT
+% data_irfs:           [matrix]     irfs for VAROBS as declared in matched_irfs block
+% weightMat:           [matrix]     weighting matrix for irfs as declared in matched_irfs_weight block
+% irfIndex:            [vector]     index for selecting specific irfs from full irf matrix of observables
+% maxIrfHorizon:       [scalar]     maximum irf horizon as declared in matched_irfs block
+% -------------------------------------------------------------------------
+% This function is called by
+%  o mom.run
+% -------------------------------------------------------------------------
+
+% Copyright © 2023 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 <https://www.gnu.org/licenses/>.
+
+
+maxIrfHorizon = max(cellfun(@(x) x(end), matched_irfs(:,1))); % get maximum irf horizon
+% create full matrix where 1st dimension are irf periods, 2nd dimension are variables as declared in VAROBS, 3rd dimension are shocks.
+data_irfs = nan(maxIrfHorizon,obs_nbr,exo_nbr);
+% overwrite nan values if they are declared in matched_irfs block; remaining nan values will be later ignored in the matching
+for jj = 1:size(matched_irfs,1)
+    idVar       = matched_irfs{jj,1}(1);
+    idVarobs    = find(varobs_id==idVar,1);
+    idShock     = matched_irfs{jj,1}(2);
+    idIrfPeriod = matched_irfs{jj,1}(3);
+    irfValue    = matched_irfs{jj,2};
+    if isempty(idVarobs)
+        skipline;
+        error('method_of_moments: You specified an irf matching involving variable %s, but it is not declared as a varobs!',endo_names{idVar})
+    end
+    data_irfs(idIrfPeriod,idVarobs,idShock) = irfValue;
+end
+% create (full) empirical weighting matrix
+weightMat = eye(maxIrfHorizon*obs_nbr*exo_nbr); % identity matrix by default: all irfs are equally important
+for jj = 1:size(matched_irfs_weight,1)
+    idVar1 = matched_irfs_weight{jj,1}(1);  idVarobs1 = find(varobs_id==idVar1,1);  idShock1 = matched_irfs_weight{jj,1}(2);  idIrfPeriod1 = matched_irfs_weight{jj,1}(3);
+    idVar2 = matched_irfs_weight{jj,2}(1);  idVarobs2 = find(varobs_id==idVar2,1);  idShock2 = matched_irfs_weight{jj,2}(2);  idIrfPeriod2 = matched_irfs_weight{jj,2}(3);
+    weightMatValue = matched_irfs_weight{jj,3};
+    if isempty(idVarobs1)
+        skipline;
+        error('method_of_moments: You specified a weight for an irf matching involving variable %s, but it is not a varobs!',endo_names{idVar1})
+    end
+    if isempty(idVarobs2)s
+        skipline;
+        error('method_of_moments: You specified a weight for an irf matching involving variable %s, but it is not a varobs!',endo_names{idVar2})
+    end
+    idweightMat1 = sub2ind(size(data_irfs),idIrfPeriod1,idVarobs1,idShock1);
+    idweightMat2 = sub2ind(size(data_irfs),idIrfPeriod2,idVarobs2,idShock2);
+    weightMat(idweightMat1,idweightMat2) = weightMatValue;
+    weightMat(idweightMat2,idweightMat1) = weightMatValue; % symmetry
+end
+% focus only on specified irfs
+irfIndex = find(~isnan(data_irfs));
+data_irfs = data_irfs(irfIndex);
+weightMat = weightMat(irfIndex,irfIndex);
\ No newline at end of file
diff --git a/matlab/+mom/matched_moments_block.m b/matlab/+mom/matched_moments_block.m
index 9bdf9da739fbca66338a273a0c587d234df4b879..c25e2740fdcbceb08de51093be7269fff367cd38 100644
--- a/matlab/+mom/matched_moments_block.m
+++ b/matlab/+mom/matched_moments_block.m
@@ -1,8 +1,8 @@
 function matched_moments = matched_moments_block(matched_moments, mom_method)
-% function matched_moments = matched_moments_block(matched_moments, mom_method)
+% matched_moments = matched_moments_block(matched_moments, mom_method)
+% -------------------------------------------------------------------------
+% Checks and transforms matched_moments block for further use in the estimation
 % -------------------------------------------------------------------------
-% Checks and transforms matched_moments bock for further use in the estimation
-% =========================================================================
 % INPUTS
 % matched_moments: [cell array] original matched_moments block
 % mom_method:      [string]     method of moments method (GMM or SMM)
@@ -12,7 +12,8 @@ function matched_moments = matched_moments_block(matched_moments, mom_method)
 % -------------------------------------------------------------------------
 % This function is called by
 %  o mom.run
-% =========================================================================
+% -------------------------------------------------------------------------
+
 % Copyright © 2023 Dynare Team
 %
 % This file is part of Dynare.
@@ -29,7 +30,7 @@ function matched_moments = matched_moments_block(matched_moments, mom_method)
 %
 % You should have received a copy of the GNU General Public License
 % along with Dynare.  If not, see <https://www.gnu.org/licenses/>.
-% =========================================================================
+
 
 matched_moments_orig = matched_moments;
 % higher-order product moments not supported yet for GMM