Small DT and single precision floating point
If DT is small (e.g. 0.01) and single precision floating point is used I have observed that
int riT= (int) (runtime/DT);
resulted in riT== 0 for runtime= 0.01 and hence no time stepping.
I suggest to amend all user projects that do a similar step to use:
int riT= (int) (runtime/DT+1e-6);

diff --git a/doxygen/09_ReleaseNotes.dox b/doxygen/09_ReleaseNotes.dox
index a58991c7c..4ab2b3220 100644
--- a/doxygen/09_ReleaseNotes.dox
+++ b/doxygen/09_ReleaseNotes.dox
@@ -1,4 +1,16 @@
 /*! \page ReleaseNotes Release Notes
+Release Notes for GeNN v4.3.1 (PyGeNN 0.4.1)
+====
+This release fixes several small issues found in the 4.3.0 release.
+
+Bug fixes:
+----
+1. Fixed reference-counting bugs in PyGeNN that prevented multiple models from being instantiated.
+2. Fixed PyGeNN interface for downloading connectivity from GPU.
+3. Fixed host initialisation of sparse connectivity initialisation snippet extra global parameters using the CPU backend.
+4. Upgraded <a href="https://github.com/SergiusTheBest/plog">third-party logging library</a> to fix issues compiling SpineML generator with Visual Studio 2019.
+5. Fixed bug in new code generator that didn't disambiguate between pre or postsynaptic neuron parameters and synapse parameters with the same name.
+
 Release Notes for GeNN v4.3.0 (PyGeNN 0.4.0)
 ====
 This release adds a number of significant new features to GeNN as well as making small improvements to PyGeNN.
diff --git a/setup.py b/setup.py
index a563cadba..6b9fe4344 100644
--- a/setup.py
+++ b/setup.py
@@ -129,7 +129,7 @@ for filename, namespace, kwargs in backends:
                                  **backend_extension_kwargs))
 
 setup(name = "pygenn",
-      version = "0.4.0",
+      version = "0.4.1",
       packages = find_packages(),
       package_data={"pygenn": package_data},
 
diff --git a/src/genn/genn/code_generator/generateSynapseUpdate.cc b/src/genn/genn/code_generator/generateSynapseUpdate.cc
index 13482ab6a..f21510a63 100644
--- a/src/genn/genn/code_generator/generateSynapseUpdate.cc
+++ b/src/genn/genn/code_generator/generateSynapseUpdate.cc
@@ -18,7 +18,7 @@ namespace
 {
 void applySynapseSubstitutions(CodeGenerator::CodeStream &os, std::string code, const std::string &errorContext,
                                const CodeGenerator::SynapseGroupMergedBase &sg, const CodeGenerator::Substitutions &baseSubs,
-                               const ModelSpecInternal &model, const CodeGenerator::BackendBase &backend)
+                               const ModelSpecInternal &model)
 {
     const auto *wu = sg.getArchetype().getWUModel();
 
@@ -167,16 +167,16 @@ void CodeGenerator::generateSynapseUpdate(CodeStream &os, const MergedStructData
             os << code;
         },
         // Presynaptic spike
-        [&backend, &model](CodeStream &os, const PresynapticUpdateGroupMerged &sg, Substitutions &baseSubs)
+        [&model](CodeStream &os, const PresynapticUpdateGroupMerged &sg, Substitutions &baseSubs)
         {
             applySynapseSubstitutions(os, sg.getArchetype().getWUModel()->getSimCode(), "simCode",
-                                      sg, baseSubs, model, backend);
+                                      sg, baseSubs, model);
         },
         // Presynaptic spike-like event
-        [&backend, &model](CodeStream &os, const PresynapticUpdateGroupMerged &sg, Substitutions &baseSubs)
+        [&model](CodeStream &os, const PresynapticUpdateGroupMerged &sg, Substitutions &baseSubs)
         {
             applySynapseSubstitutions(os, sg.getArchetype().getWUModel()->getEventCode(), "eventCode",
-                                      sg, baseSubs, model, backend);
+                                      sg, baseSubs, model);
         },
         // Procedural connectivity
         [&backend, &model](CodeStream &os, const PresynapticUpdateGroupMerged &sg, Substitutions &baseSubs)
@@ -218,7 +218,7 @@ void CodeGenerator::generateSynapseUpdate(CodeStream &os, const MergedStructData
             }
         },
         // Postsynaptic learning code
-        [&backend, &modelMerged](CodeStream &os, const PostsynapticUpdateGroupMerged &sg, const Substitutions &baseSubs)
+        [&modelMerged](CodeStream &os, const PostsynapticUpdateGroupMerged &sg, const Substitutions &baseSubs)
         {
             const auto *wum = sg.getArchetype().getWUModel();
             if (!wum->getLearnPostSupportCode().empty()) {
@@ -226,10 +226,10 @@ void CodeGenerator::generateSynapseUpdate(CodeStream &os, const MergedStructData
             }
 
             applySynapseSubstitutions(os, wum->getLearnPostCode(), "learnPostCode",
-                                      sg, baseSubs, modelMerged.getModel(), backend);
+                                      sg, baseSubs, modelMerged.getModel());
         },
         // Synapse dynamics
-        [&backend, &modelMerged](CodeStream &os, const SynapseDynamicsGroupMerged &sg, const Substitutions &baseSubs)
+        [&modelMerged](CodeStream &os, const SynapseDynamicsGroupMerged &sg, const Substitutions &baseSubs)
         {
             const auto *wum = sg.getArchetype().getWUModel();
             if (!wum->getSynapseDynamicsSuppportCode().empty()) {
@@ -237,7 +237,7 @@ void CodeGenerator::generateSynapseUpdate(CodeStream &os, const MergedStructData
             }
 
             applySynapseSubstitutions(os, wum->getSynapseDynamicsCode(), "synapseDynamics",
-                                      sg, baseSubs, modelMerged.getModel(), backend);
+                                      sg, baseSubs, modelMerged.getModel());
         },
         // Push EGP handler
         [&backend, &mergedStructData](CodeStream &os)
diff --git a/version.txt b/version.txt
index 80895903a..f77856a6f 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-4.3.0
+4.3.1
['setup.py', 'doxygen/09_ReleaseNotes.dox', 'version.txt', 'src/genn/genn/code_generator/generateSynapseUpdate.cc']