diff --git a/matlab/default_option_values.m b/matlab/default_option_values.m
index 9bd440fd9623ec501c93e1322fd3812b60b0b65c..cbdec9e3c06bca2d16eca63574c0f9905b837f8d 100644
--- a/matlab/default_option_values.m
+++ b/matlab/default_option_values.m
@@ -69,7 +69,6 @@ options_.mode_check.nolik = false;
 options_.huge_number = 1e7;
 
 % Default number of threads for parallelized mex files.
-options_.threads.kronecker.A_times_B_kronecker_C = 1;
 options_.threads.kronecker.sparse_hessian_times_B_kronecker_C = 1;
 options_.threads.local_state_space_iteration_2 = 1;
 
diff --git a/matlab/dyn_risky_steadystate_solver.m b/matlab/dyn_risky_steadystate_solver.m
index dd6ad0832298b2842ac5336763e75f99fd37ae85..d8fe2ede16a647a3edae27e3baaa42ddccc8589a 100644
--- a/matlab/dyn_risky_steadystate_solver.m
+++ b/matlab/dyn_risky_steadystate_solver.m
@@ -183,7 +183,6 @@ else
         print_info(info,options.noprint,options);
     end
     dr = dyn_second_order_solver(d1,d2,dr,M,...
-                                 options.threads.kronecker.A_times_B_kronecker_C,...
                                  options.threads.kronecker.sparse_hessian_times_B_kronecker_C);
 end
 
@@ -274,7 +273,6 @@ if info
 end
 
 dr_np = dyn_second_order_solver(d1_np,d2_np,dr_np,pm.M_np,...
-                                options.threads.kronecker.A_times_B_kronecker_C,...
                                 options.threads.kronecker.sparse_hessian_times_B_kronecker_C);
 end
 
@@ -312,7 +310,6 @@ if isfield(options,'portfolio') && options.portfolio == 1
     end
 
     dr_np = dyn_second_order_solver(d1_np,d2_np,dr_np,pm.M_np,...
-                                    options.threads.kronecker.A_times_B_kronecker_C,...
                                     options.threads.kronecker.sparse_hessian_times_B_kronecker_C);
 end
 
diff --git a/matlab/dyn_second_order_solver.m b/matlab/dyn_second_order_solver.m
index 5040d14933c6ff8bbd335189767e62bd06fd43dc..e1cd86f4db72e8c6e42bc88692788f05a2056a1a 100644
--- a/matlab/dyn_second_order_solver.m
+++ b/matlab/dyn_second_order_solver.m
@@ -1,7 +1,7 @@
-function dr = dyn_second_order_solver(jacobia,hessian_mat,dr,M_,threads_ABC,threads_BC)
+function dr = dyn_second_order_solver(jacobia,hessian_mat,dr,M_,threads_BC)
 
 %@info:
-%! @deftypefn {Function File} {@var{dr} =} dyn_second_order_solver (@var{jacobia},@var{hessian_mat},@var{dr},@var{M_},@var{threads_ABC},@var{threads_BC})
+%! @deftypefn {Function File} {@var{dr} =} dyn_second_order_solver (@var{jacobia},@var{hessian_mat},@var{dr},@var{M_},@var{threads_BC})
 %! @anchor{dyn_second_order_solver}
 %! @sp 1
 %! Computes the second order reduced form of the DSGE model
@@ -17,8 +17,6 @@ function dr = dyn_second_order_solver(jacobia,hessian_mat,dr,M_,threads_ABC,thre
 %! Matlab's structure describing the reduced form solution of the model.
 %! @item M_
 %! Matlab's structure describing the model (initialized by @code{dynare}).
-%! @item threads_ABC
-%! Integer controlling number of threads in A_times_B_kronecker_C
 %! @item threads_BC
 %! Integer controlling number of threads in sparse_hessian_times_B_kronecker_C
 %! @end table
@@ -125,7 +123,7 @@ hu1 = [hu;zeros(np-nspred,M_.exo_nbr)];
 [nrhx,nchx] = size(Gy);
 [nrhu1,nchu1] = size(hu1);
 
-[abcOut,err] = A_times_B_kronecker_C(dr.ghxx,Gy,hu1,threads_ABC);
+[abcOut,err] = A_times_B_kronecker_C(dr.ghxx,Gy,hu1);
 mexErrCheck('A_times_B_kronecker_C', err);
 B1 = B*abcOut;
 rhs = -[rhs; zeros(n-M_.endo_nbr,size(rhs,2))]-B1;
@@ -139,7 +137,7 @@ dr.ghxu = A\rhs;
 [rhs, err] = sparse_hessian_times_B_kronecker_C(hessian_mat,zu,threads_BC);
 mexErrCheck('sparse_hessian_times_B_kronecker_C', err);
 
-[B1, err] = A_times_B_kronecker_C(B*dr.ghxx,hu1,threads_ABC);
+[B1, err] = A_times_B_kronecker_C(B*dr.ghxx,hu1);
 mexErrCheck('A_times_B_kronecker_C', err);
 rhs = -[rhs; zeros(n-M_.endo_nbr,size(rhs,2))]-B1;
 
diff --git a/matlab/evaluate_planner_objective.m b/matlab/evaluate_planner_objective.m
index fe65a47d9177a9bfd10ea027db4b32c399d173f7..d0a06d771fed3534dd47cde4b56ed3e5f0436f90 100644
--- a/matlab/evaluate_planner_objective.m
+++ b/matlab/evaluate_planner_objective.m
@@ -54,20 +54,20 @@ ys = oo.dr.ys;
 %second order terms
 Uyy = full(Uyy);
 
-[Uyygygy, err] = A_times_B_kronecker_C(Uyy,gy,gy,options.threads.kronecker.A_times_B_kronecker_C);
+[Uyygygy, err] = A_times_B_kronecker_C(Uyy,gy,gy);
 mexErrCheck('A_times_B_kronecker_C', err);
-[Uyygugu, err] = A_times_B_kronecker_C(Uyy,gu,gu,options.threads.kronecker.A_times_B_kronecker_C);
+[Uyygugu, err] = A_times_B_kronecker_C(Uyy,gu,gu);
 mexErrCheck('A_times_B_kronecker_C', err);
-[Uyygygu, err] = A_times_B_kronecker_C(Uyy,gy,gu,options.threads.kronecker.A_times_B_kronecker_C);
+[Uyygygu, err] = A_times_B_kronecker_C(Uyy,gy,gu);
 mexErrCheck('A_times_B_kronecker_C', err);
 
 Wbar =U/(1-beta); %steady state welfare
 Wy = Uy*gy/(eye(nspred)-beta*Gy);
 Wu = Uy*gu+beta*Wy*Gu;
 Wyy = Uyygygy/(eye(nspred*nspred)-beta*kron(Gy,Gy));
-[Wyygugu, err] = A_times_B_kronecker_C(Wyy,Gu,Gu,options.threads.kronecker.A_times_B_kronecker_C);
+[Wyygugu, err] = A_times_B_kronecker_C(Wyy,Gu,Gu);
 mexErrCheck('A_times_B_kronecker_C', err);
-[Wyygygu,err] = A_times_B_kronecker_C(Wyy,Gy,Gu,options.threads.kronecker.A_times_B_kronecker_C);
+[Wyygygu,err] = A_times_B_kronecker_C(Wyy,Gy,Gu);
 mexErrCheck('A_times_B_kronecker_C', err);
 Wuu = Uyygugu+beta*Wyygugu;
 Wyu = Uyygygu+beta*Wyygygu;
@@ -90,19 +90,19 @@ end
 yhat1 = yhat1(dr.order_var(nstatic+(1:nspred)),1)-dr.ys(dr.order_var(nstatic+(1:nspred)));
 u = oo.exo_simul(1,:)';
 
-[Wyyyhatyhat1, err] = A_times_B_kronecker_C(Wyy,yhat1,yhat1,options.threads.kronecker.A_times_B_kronecker_C);
+[Wyyyhatyhat1, err] = A_times_B_kronecker_C(Wyy,yhat1,yhat1);
 mexErrCheck('A_times_B_kronecker_C', err);
-[Wuuuu, err] = A_times_B_kronecker_C(Wuu,u,u,options.threads.kronecker.A_times_B_kronecker_C);
+[Wuuuu, err] = A_times_B_kronecker_C(Wuu,u,u);
 mexErrCheck('A_times_B_kronecker_C', err);
-[Wyuyhatu1, err] = A_times_B_kronecker_C(Wyu,yhat1,u,options.threads.kronecker.A_times_B_kronecker_C);
+[Wyuyhatu1, err] = A_times_B_kronecker_C(Wyu,yhat1,u);
 mexErrCheck('A_times_B_kronecker_C', err);
 planner_objective_value(1) = Wbar+Wy*yhat1+Wu*u+Wyuyhatu1 ...
     + 0.5*(Wyyyhatyhat1 + Wuuuu+Wss);
 if options.ramsey_policy
     yhat2 = yhat2(dr.order_var(nstatic+(1:nspred)),1)-dr.ys(dr.order_var(nstatic+(1:nspred)));
-    [Wyyyhatyhat2, err] = A_times_B_kronecker_C(Wyy,yhat2,yhat2,options.threads.kronecker.A_times_B_kronecker_C);
+    [Wyyyhatyhat2, err] = A_times_B_kronecker_C(Wyy,yhat2,yhat2);
     mexErrCheck('A_times_B_kronecker_C', err);
-    [Wyuyhatu2, err] = A_times_B_kronecker_C(Wyu,yhat2,u,options.threads.kronecker.A_times_B_kronecker_C);
+    [Wyuyhatu2, err] = A_times_B_kronecker_C(Wyu,yhat2,u);
     mexErrCheck('A_times_B_kronecker_C', err);
     planner_objective_value(2) = Wbar+Wy*yhat2+Wu*u+Wyuyhatu2 ...
         + 0.5*(Wyyyhatyhat2 + Wuuuu+Wss);
diff --git a/matlab/missing/mex/kronecker/A_times_B_kronecker_C.m b/matlab/missing/mex/kronecker/A_times_B_kronecker_C.m
index 8e0837d3d175a5efa3d56f67a67933fbb3ef74d7..7a8d09498e5820f905ce68cbe509ca812e9dd9c4 100644
--- a/matlab/missing/mex/kronecker/A_times_B_kronecker_C.m
+++ b/matlab/missing/mex/kronecker/A_times_B_kronecker_C.m
@@ -1,7 +1,7 @@
-function [D, err] = A_times_B_kronecker_C(A,B,C,fake)
+function [D, err] = A_times_B_kronecker_C(A,B,C)
 
 %@info:
-%! @deftypefn {Function File} {[@var{D}, @var{err}] =} A_times_B_kronecker_C (@var{A},@var{B},@var{C},@var{fake})
+%! @deftypefn {Function File} {[@var{D}, @var{err}] =} A_times_B_kronecker_C (@var{A},@var{B},@var{C})
 %! @anchor{kronecker/A_times_B_kronecker_C}
 %! @sp 1
 %! Computes A*kron(B,C).
@@ -15,8 +15,6 @@ function [D, err] = A_times_B_kronecker_C(A,B,C,fake)
 %! mB*nB matrix of doubles.
 %! @item C
 %! mC*nC matrix of doubles.
-%! @item fake
-%! Anything you want, just a fake parameter (because the mex version admits a last argument specifying the number of threads to be used in parallel mode).
 %! @end table
 %! @sp 2
 %! @strong{Outputs}
@@ -111,4 +109,4 @@ else
         D = A * kron(B,B);
     end
 end
-err = 0;
\ No newline at end of file
+err = 0;
diff --git a/matlab/missing/mex/local_state_space_iterations/local_state_space_iteration_2.m b/matlab/missing/mex/local_state_space_iterations/local_state_space_iteration_2.m
index 5224567289988d3c29e6b21a42e3aee5b647f324..b63ad6c92b542ac0cf8682d81191dfa250b5c335 100644
--- a/matlab/missing/mex/local_state_space_iterations/local_state_space_iteration_2.m
+++ b/matlab/missing/mex/local_state_space_iterations/local_state_space_iteration_2.m
@@ -79,12 +79,12 @@ function [y,y_] = local_state_space_iteration_2(yhat,epsilon,ghx,ghu,constant,gh
 %           frederic DOT karame AT univ DASH evry DOT fr
 
 if nargin==9
-    pruning = 0; numthreads = a;
+    pruning = 0;
     if nargout>1
         error('local_state_space_iteration_2:: Numbers of input and output argument are inconsistent!')
     end
 elseif nargin==11
-    pruning = 1; numthreads = c; yhat_ = a; ss = b;
+    pruning = 1; yhat_ = a; ss = b;
     if nargout~=2
         error('local_state_space_iteration_2:: Numbers of input and output argument are inconsistent!')
     end
@@ -92,22 +92,20 @@ else
     error('local_state_space_iteration_2:: Wrong number of input arguments!')
 end
 
-number_of_threads = numthreads;
-
 switch pruning
   case 0
     for i =1:size(yhat,2)
         y(:,i) = constant + ghx*yhat(:,i) + ghu*epsilon(:,i) ...
-                 + A_times_B_kronecker_C(.5*ghxx,yhat(:,i),number_of_threads)  ...
-                 + A_times_B_kronecker_C(.5*ghuu,epsilon(:,i),number_of_threads) ...
-                 + A_times_B_kronecker_C(ghxu,yhat(:,i),epsilon(:,i),number_of_threads);
+                 + A_times_B_kronecker_C(.5*ghxx,yhat(:,i))  ...
+                 + A_times_B_kronecker_C(.5*ghuu,epsilon(:,i)) ...
+                 + A_times_B_kronecker_C(ghxu,yhat(:,i),epsilon(:,i));
     end
   case 1
     for i =1:size(yhat,2)
         y(:,i) = constant + ghx*yhat(:,i) + ghu*epsilon(:,i) ...
-                 + A_times_B_kronecker_C(.5*ghxx,yhat_(:,i),number_of_threads)  ...
-                 + A_times_B_kronecker_C(.5*ghuu,epsilon(:,i),number_of_threads) ...
-                 + A_times_B_kronecker_C(ghxu,yhat_(:,i),epsilon(:,i),number_of_threads);
+                 + A_times_B_kronecker_C(.5*ghxx,yhat_(:,i))  ...
+                 + A_times_B_kronecker_C(.5*ghuu,epsilon(:,i)) ...
+                 + A_times_B_kronecker_C(ghxu,yhat_(:,i),epsilon(:,i));
     end
     y_ = ghx*yhat_+ghu*epsilon;
     y_ = bsxfun(@plus,y_,ss);
diff --git a/matlab/set_dynare_threads.m b/matlab/set_dynare_threads.m
index 2bdfc1145d8657977b53b6805d8337bd8c186188..30dbf2febc5963e56ac702425b0b4b759e2b3231 100644
--- a/matlab/set_dynare_threads.m
+++ b/matlab/set_dynare_threads.m
@@ -37,8 +37,6 @@ if ~isint(n)
 end
 
 switch mexname
-  case 'A_times_B_kronecker_C'
-    options_.threads.kronecker.A_times_B_kronecker_C = n;
   case 'sparse_hessian_times_B_kronecker_C'
     options_.threads.kronecker.sparse_hessian_times_B_kronecker_C = n;
   case 'local_state_space_iteration_2'
@@ -47,4 +45,4 @@ switch mexname
     message = [ mexname ' is not a known parallel mex file.' ];
     message_id  = 'Dynare:Threads:UnknownParallelMex';
     warning(message_id,message);
-end
\ No newline at end of file
+end
diff --git a/matlab/simult_.m b/matlab/simult_.m
index c255a2b8a40a19bf87abde44a33365de5df3506a..e4fa39618d78d5d464e60893062f8811a5264614 100644
--- a/matlab/simult_.m
+++ b/matlab/simult_.m
@@ -98,11 +98,11 @@ else
                 yhat1 = y__(order_var(k2))-dr.ys(order_var(k2));
                 yhat2 = y_(order_var(k2),i-1)-dr.ys(order_var(k2));
                 epsilon = ex_(i-1,:)';
-                [abcOut1, err] = A_times_B_kronecker_C(.5*dr.ghxx,yhat1,options_.threads.kronecker.A_times_B_kronecker_C);
+                [abcOut1, err] = A_times_B_kronecker_C(.5*dr.ghxx,yhat1);
                 mexErrCheck('A_times_B_kronecker_C', err);
-                [abcOut2, err] = A_times_B_kronecker_C(.5*dr.ghuu,epsilon,options_.threads.kronecker.A_times_B_kronecker_C);
+                [abcOut2, err] = A_times_B_kronecker_C(.5*dr.ghuu,epsilon);
                 mexErrCheck('A_times_B_kronecker_C', err);
-                [abcOut3, err] = A_times_B_kronecker_C(dr.ghxu,yhat1,epsilon,options_.threads.kronecker.A_times_B_kronecker_C);
+                [abcOut3, err] = A_times_B_kronecker_C(dr.ghxu,yhat1,epsilon);
                 mexErrCheck('A_times_B_kronecker_C', err);
                 y_(order_var,i) = constant + dr.ghx*yhat2 + dr.ghu*epsilon ...
                     + abcOut1 + abcOut2 + abcOut3;
@@ -112,11 +112,11 @@ else
             for i = 2:iter+M_.maximum_lag
                 yhat = y_(order_var(k2),i-1)-dr.ys(order_var(k2));
                 epsilon = ex_(i-1,:)';
-                [abcOut1, err] = A_times_B_kronecker_C(.5*dr.ghxx,yhat,options_.threads.kronecker.A_times_B_kronecker_C);
+                [abcOut1, err] = A_times_B_kronecker_C(.5*dr.ghxx,yhat);
                 mexErrCheck('A_times_B_kronecker_C', err);
-                [abcOut2, err] = A_times_B_kronecker_C(.5*dr.ghuu,epsilon,options_.threads.kronecker.A_times_B_kronecker_C);
+                [abcOut2, err] = A_times_B_kronecker_C(.5*dr.ghuu,epsilon);
                 mexErrCheck('A_times_B_kronecker_C', err);
-                [abcOut3, err] = A_times_B_kronecker_C(dr.ghxu,yhat,epsilon,options_.threads.kronecker.A_times_B_kronecker_C);
+                [abcOut3, err] = A_times_B_kronecker_C(dr.ghxu,yhat,epsilon);
                 mexErrCheck('A_times_B_kronecker_C', err);
                 y_(dr.order_var,i) = constant + dr.ghx*yhat + dr.ghu*epsilon ...
                     + abcOut1 + abcOut2 + abcOut3;
@@ -138,7 +138,6 @@ else
         ghuuu = dr.ghuuu;
         ghxss = dr.ghxss;
         ghuss = dr.ghuss;
-        threads = options_.threads.kronecker.A_times_B_kronecker_C;
         nspred = M_.nspred;
         ipred = M_.nstatic+(1:nspred);
         %construction follows Andreasen et al (2013), Technical
@@ -151,29 +150,29 @@ else
             u = ex_(i-1,:)';
             %construct terms of order 2 from second order part, based
             %on linear component yhat1
-            [gyy, err] = A_times_B_kronecker_C(ghxx,yhat1,threads);
+            [gyy, err] = A_times_B_kronecker_C(ghxx,yhat1);
             mexErrCheck('A_times_B_kronecker_C', err);
-            [guu, err] = A_times_B_kronecker_C(ghuu,u,threads);
+            [guu, err] = A_times_B_kronecker_C(ghuu,u);
             mexErrCheck('A_times_B_kronecker_C', err);
-            [gyu, err] = A_times_B_kronecker_C(ghxu,yhat1,u,threads);
+            [gyu, err] = A_times_B_kronecker_C(ghxu,yhat1,u);
             mexErrCheck('A_times_B_kronecker_C', err);
             %construct terms of order 3 from second order part, based
             %on order 2 component yhat2
-            [gyy12, err] = A_times_B_kronecker_C(ghxx,yhat1,yhat2,threads);
+            [gyy12, err] = A_times_B_kronecker_C(ghxx,yhat1,yhat2);
             mexErrCheck('A_times_B_kronecker_C', err);
-            [gy2u, err] = A_times_B_kronecker_C(ghxu,yhat2,u,threads);
+            [gy2u, err] = A_times_B_kronecker_C(ghxu,yhat2,u);
             mexErrCheck('A_times_B_kronecker_C', err);
             %construct terms of order 3, all based on first order component yhat1
             y2a = kron(yhat1,yhat1);
-            [gyyy, err] = A_times_B_kronecker_C(ghxxx,y2a,yhat1,threads);
+            [gyyy, err] = A_times_B_kronecker_C(ghxxx,y2a,yhat1);
             mexErrCheck('A_times_B_kronecker_C', err);
             u2a = kron(u,u);
-            [guuu, err] = A_times_B_kronecker_C(ghuuu,u2a,u,threads);
+            [guuu, err] = A_times_B_kronecker_C(ghuuu,u2a,u);
             mexErrCheck('A_times_B_kronecker_C', err);
             yu = kron(yhat1,u);
-            [gyyu, err] = A_times_B_kronecker_C(ghxxu,yhat1,yu,threads);
+            [gyyu, err] = A_times_B_kronecker_C(ghxxu,yhat1,yu);
             mexErrCheck('A_times_B_kronecker_C', err);
-            [gyuu, err] = A_times_B_kronecker_C(ghxuu,yu,u,threads);
+            [gyuu, err] = A_times_B_kronecker_C(ghxuu,yu,u);
             mexErrCheck('A_times_B_kronecker_C', err);
             %add all terms of order 3, linear component based on third
             %order yhat3
diff --git a/matlab/stochastic_solvers.m b/matlab/stochastic_solvers.m
index 2c2591f9689a9ad0a0263d48b08541da25a813a5..6dfcb8120f6292aba5fcc318eab36b113ab32052 100644
--- a/matlab/stochastic_solvers.m
+++ b/matlab/stochastic_solvers.m
@@ -268,7 +268,6 @@ else
     if local_order > 1
         % Second order
         dr = dyn_second_order_solver(jacobia_,hessian1,dr,M_,...
-                                     options_.threads.kronecker.A_times_B_kronecker_C,...
                                      options_.threads.kronecker.sparse_hessian_times_B_kronecker_C);
 
         % reordering second order derivatives, used for deterministic
diff --git a/mex/sources/kronecker/A_times_B_kronecker_C.cc b/mex/sources/kronecker/A_times_B_kronecker_C.cc
index ecdcd022a31df64b0dc68c34564f9e92afe32b4d..071122e3f9932975d72d3e50a7aec77a5fe5fca4 100644
--- a/mex/sources/kronecker/A_times_B_kronecker_C.cc
+++ b/mex/sources/kronecker/A_times_B_kronecker_C.cc
@@ -25,37 +25,10 @@
 #include <dynmex.h>
 #include <dynblas.h>
 
-#ifdef USE_OMP
-# include <omp.h>
-#endif
-
-#define DEBUG_OMP 0
-
 void
 full_A_times_kronecker_B_C(const double *A, const double *B, const double *C, double *D,
-                           blas_int mA, blas_int nA, blas_int mB, blas_int nB, blas_int mC, blas_int nC, int number_of_threads)
+                           blas_int mA, blas_int nA, blas_int mB, blas_int nB, blas_int mC, blas_int nC)
 {
-#ifdef USE_OMP
-# pragma omp parallel for num_threads(number_of_threads)
-  for (blas_int colD = 0; colD < nB*nC; colD++)
-    {
-# if DEBUG_OMP
-      mexPrintf("%d thread number is %d (%d).\n", colD, omp_get_thread_num(), omp_get_num_threads());
-# endif
-      blas_int colB = colD/nC;
-      blas_int colC = colD%nC;
-      for (blas_int colA = 0; colA < nA; colA++)
-        {
-          blas_int rowB = colA/mC;
-          blas_int rowC = colA%mC;
-          blas_int idxA = colA*mA;
-          blas_int idxD = colD*mA;
-          double BC = B[colB*mB+rowB]*C[colC*mC+rowC];
-          for (blas_int rowD = 0; rowD < mA; rowD++)
-            D[idxD+rowD] += A[idxA+rowD]*BC;
-        }
-    }
-#else
   const blas_int shiftA = mA*mC;
   const blas_int shiftD = mA*nC;
   blas_int kd = 0, ka = 0;
@@ -70,33 +43,11 @@ full_A_times_kronecker_B_C(const double *A, const double *B, const double *C, do
         }
       kd += shiftD;
     }
-#endif
 }
 
 void
-full_A_times_kronecker_B_B(const double *A, const double *B, double *D, blas_int mA, blas_int nA, blas_int mB, blas_int nB, int number_of_threads)
+full_A_times_kronecker_B_B(const double *A, const double *B, double *D, blas_int mA, blas_int nA, blas_int mB, blas_int nB)
 {
-#ifdef USE_OMP
-# pragma omp parallel for num_threads(number_of_threads)
-  for (blas_int colD = 0; colD < nB*nB; colD++)
-    {
-# if DEBUG_OMP
-      mexPrintf("%d thread number is %d (%d).\n", colD, omp_get_thread_num(), omp_get_num_threads());
-# endif
-      blas_int j1B = colD/nB;
-      blas_int j2B = colD%nB;
-      for (blas_int colA = 0; colA < nA; colA++)
-        {
-          blas_int i1B = colA/mB;
-          blas_int i2B = colA%mB;
-          blas_int idxA = colA*mA;
-          blas_int idxD = colD*mA;
-          double BB = B[j1B*mB+i1B]*B[j2B*mB+i2B];
-          for (blas_int rowD = 0; rowD < mA; rowD++)
-            D[idxD+rowD] += A[idxA+rowD]*BB;
-        }
-    }
-#else
   const blas_int shiftA = mA*mB;
   const blas_int shiftD = mA*nB;
   blas_int kd = 0, ka = 0;
@@ -111,15 +62,14 @@ full_A_times_kronecker_B_B(const double *A, const double *B, double *D, blas_int
         }
       kd += shiftD;
     }
-#endif
 }
 
 void
 mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
 {
   // Check input and output:
-  if (nrhs > 4 || nrhs < 3)
-    DYN_MEX_FUNC_ERR_MSG_TXT("A_times_B_kronecker_C takes 3 or 4 input arguments and provides 2 output arguments.");
+  if (nrhs > 3 || nrhs < 2)
+    DYN_MEX_FUNC_ERR_MSG_TXT("A_times_B_kronecker_C takes 2 or 3 input arguments and provides 2 output arguments.");
 
   // Get & Check dimensions (columns and rows):
   size_t mA = mxGetM(prhs[0]);
@@ -127,7 +77,7 @@ mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
   size_t mB = mxGetM(prhs[1]);
   size_t nB = mxGetN(prhs[1]);
   size_t mC, nC;
-  if (nrhs == 4) // A·(B⊗C) is to be computed.
+  if (nrhs == 3) // A·(B⊗C) is to be computed.
     {
       mC = mxGetM(prhs[2]);
       nC = mxGetN(prhs[2]);
@@ -140,30 +90,24 @@ mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
         DYN_MEX_FUNC_ERR_MSG_TXT("Input dimension error!");
     }
   // Get input matrices:
-  int numthreads;
   const double *A = mxGetPr(prhs[0]);
   const double *B = mxGetPr(prhs[1]);
-  const double *C;
-  if (nrhs == 4)
-    {
-      C = mxGetPr(prhs[2]);
-      numthreads = static_cast<int>(mxGetScalar(prhs[3]));
-    }
-  else
-    numthreads = static_cast<int>(mxGetScalar(prhs[2]));
+  const double *C{nullptr};
+  if (nrhs == 3)
+    C = mxGetPr(prhs[2]);
 
   // Initialization of the ouput:
-  if (nrhs == 4)
+  if (nrhs == 3)
     plhs[0] = mxCreateDoubleMatrix(mA, nB*nC, mxREAL);
   else
     plhs[0] = mxCreateDoubleMatrix(mA, nB*nB, mxREAL);
   double *D = mxGetPr(plhs[0]);
 
   // Computational part:
-  if (nrhs == 3)
-    full_A_times_kronecker_B_B(A, B, D, mA, nA, mB, nB, numthreads);
+  if (nrhs == 2)
+    full_A_times_kronecker_B_B(A, B, D, mA, nA, mB, nB);
   else
-    full_A_times_kronecker_B_C(A, B, C, D, mA, nA, mB, nB, mC, nC, numthreads);
+    full_A_times_kronecker_B_C(A, B, C, D, mA, nA, mB, nB, mC, nC);
 
   plhs[1] = mxCreateDoubleScalar(0);
 }