diff --git a/arbor/fvm_layout.cpp b/arbor/fvm_layout.cpp
index ffc86d5e711885b4f1c3e75245a7594486536627..19a68d2eb26a990b8858b359216a2c75c8fd8b2f 100644
--- a/arbor/fvm_layout.cpp
+++ b/arbor/fvm_layout.cpp
@@ -684,29 +684,38 @@ fvm_mechanism_data fvm_build_mechanism_data(const cable_cell_global_properties&
 
     struct synapse_instance {
         size_type cv;
-        std::map<std::string, double> param_value; // uses ordering of std::map
+        std::vector<std::pair<unsigned, double>> param_value; // sorted vector of <param_id,value> pairs
         size_type target_index;
     };
 
     for (const auto& entry: cell.synapses()) {
         const std::string& name = entry.first;
         mechanism_info info = catalogue[name];
-        std::map<std::string, double> default_param_value;
         std::vector<synapse_instance> sl;
 
+        // Map from a param string identifier to a unique unsigned int identifier
+        std::map<std::string, unsigned> param_map;
+
+        // Map from a param unsigned int identifier to a default value
+        std::map<unsigned, double> default_param_value;
+
+        unsigned id=0;
         for (const auto& kv: info.parameters) {
-            default_param_value[kv.first] = kv.second.default_value;
+            param_map[kv.first] = id;
+            default_param_value[id++] = kv.second.default_value;
         }
 
         for (const placed<mechanism_desc>& pm: entry.second) {
             verify_mechanism(info, pm.item);
 
             synapse_instance in;
-            in.param_value = default_param_value;
 
+            auto param_value_map = default_param_value;
             for (const auto& kv: pm.item.values()) {
-                in.param_value.at(kv.first) = kv.second;
+                param_value_map.at(param_map.at(kv.first)) = kv.second;
             }
+            std::copy(param_value_map.begin(), param_value_map.end(), std::back_inserter(in.param_value));
+            std::sort(in.param_value.begin(), in.param_value.end());
 
             in.target_index = pm.lid;
             in.cv = D.geometry.location_cv(cell_idx, pm.loc);
@@ -728,7 +737,7 @@ fvm_mechanism_data fvm_build_mechanism_data(const cable_cell_global_properties&
 
         fvm_mechanism_config config;
         config.kind = mechanismKind::point;
-        for (auto& pentry: default_param_value) {
+        for (auto& pentry: param_map) {
             config.param_values.emplace_back(pentry.first, std::vector<value_type>{});
         }
 
@@ -746,9 +755,12 @@ fvm_mechanism_data fvm_build_mechanism_data(const cable_cell_global_properties&
                 }
 
                 unsigned j = 0;
-                for (auto& pentry: in.param_value) {
+                for (auto& pentry: param_map) {
                     arb_assert(config.param_values[j].first==pentry.first);
-                    config.param_values[j++].second.push_back(pentry.second);
+                    auto it = std::lower_bound(in.param_value.begin(), in.param_value.end(), pentry.second, [](auto el, unsigned val) {return el.first < val;});
+
+                    arb_assert(it!= in.param_value.end());
+                    config.param_values[j++].second.push_back((*it).second);
                 }
             }
             config.target.push_back(in.target_index);