diff --git a/src/DynareMain.cc b/src/DynareMain.cc
index 4d2f2e7de707fc5a98db12fb117c793e83f9d84d..6874fb96c9a9df2d6d38c7f2addff8f4ef28bddc 100644
--- a/src/DynareMain.cc
+++ b/src/DynareMain.cc
@@ -157,9 +157,6 @@ main(int argc, char **argv)
   LanguageOutputType language{LanguageOutputType::matlab};
   string mexext;
   filesystem::path matlabroot;
-  filesystem::path dynareroot{argv[0]};
-  dynareroot = dynareroot.parent_path();
-  dynareroot = dynareroot / ".." / "..";
   bool onlymodel = false;
   bool use_dll = false;
 
@@ -406,6 +403,14 @@ main(int argc, char **argv)
 
   cout << "Starting preprocessing of the model file ..." << endl;
 
+  // Determine root of Dynare installation
+  const filesystem::path argv0{argv[0]};
+  // Normal case: binary is in preprocessor/dynare-preprocessor(.exe)?
+  filesystem::path dynareroot = argv0.parent_path().parent_path();
+  if (argv0.filename().stem() == "dynare_m")
+    // Special case: backward compatibility location in matlab/preprocessor64/dynare_m(.exe)?
+    dynareroot = dynareroot.parent_path();
+
   // Construct basename (i.e. remove file extension if there is one)
   string basename = argv[1];
   if (size_t pos = basename.find_last_of('.');