diff --git a/include/halco/hicann-dls/vx/cadc.h b/include/halco/hicann-dls/vx/cadc.h
index 727d5b738f918fd213856445b57c2d09c5a6e7f6..6e11c238ade0cd458ca109250da6c8163f9fcb54 100644
--- a/include/halco/hicann-dls/vx/cadc.h
+++ b/include/halco/hicann-dls/vx/cadc.h
@@ -114,6 +114,121 @@ struct GENPYBIND(inline_base("*")) CADCSamplesOnDLS
 	constexpr explicit CADCSamplesOnDLS(uintmax_t const val = 0) : rant_t(val) {}
 };
 
+
+struct SynapseQuadOnDLS;
+struct SynapseWeightQuadOnDLS;
+struct SynapseLabelQuadOnDLS;
+struct SynapseCorrelationCalibQuadOnDLS;
+
+
+HALCO_COORDINATE_MIXIN(CADCChannelTypeMixin, CADCChannelType, cadc_channel_type)
+
+struct GENPYBIND(inline_base("*CADCChannelTypeMixin*")) CADCSampleQuadUnspecifiedReadoutOnSynram
+    : public CADCChannelTypeMixin<CADCSampleQuadUnspecifiedReadoutOnSynram, SynapseQuadOnSynram>
+{
+	CADCSampleQuadUnspecifiedReadoutOnSynram() = default;
+
+	explicit CADCSampleQuadUnspecifiedReadoutOnSynram(
+	    SynapseQuadOnSynram const& quad, CADCChannelType const& cadc_channel_type) :
+	    mixin_t(quad, cadc_channel_type)
+	{}
+
+	explicit CADCSampleQuadUnspecifiedReadoutOnSynram(enum_type const& e) : mixin_t(e) {}
+
+	SynapseQuadOnSynram toSynapseQuadOnSynram() const
+	{
+		return This();
+	}
+};
+
+
+HALCO_COORDINATE_MIXIN(CADCReadoutTypeMixin, CADCReadoutType, cadc_readout_type)
+
+struct GENPYBIND(inline_base("*CADCReadoutTypeMixin*")) CADCSampleQuadOnSynram
+    : public CADCReadoutTypeMixin<CADCSampleQuadOnSynram, CADCSampleQuadUnspecifiedReadoutOnSynram>
+{
+	CADCSampleQuadOnSynram() = default;
+
+	explicit CADCSampleQuadOnSynram(
+	    SynapseQuadOnSynram const& quad,
+	    CADCChannelType const& cadc_channel_type,
+	    CADCReadoutType const& cadc_readout_type = CADCReadoutType()) :
+	    mixin_t(
+	        CADCSampleQuadUnspecifiedReadoutOnSynram(quad, cadc_channel_type), cadc_readout_type)
+	{}
+
+	explicit CADCSampleQuadOnSynram(enum_type const& e) : mixin_t(e) {}
+
+	CADCSampleQuadUnspecifiedReadoutOnSynram toCADCSampleQuadUnspecifiedReadoutOnSynram() const
+	{
+		return This();
+	}
+};
+
+struct GENPYBIND(inline_base("*SynramMixin*")) CADCSampleQuadOnDLS
+    : public SynramMixin<CADCSampleQuadOnDLS, CADCSampleQuadOnSynram>
+{
+	CADCSampleQuadOnDLS() = default;
+
+	explicit CADCSampleQuadOnDLS(CADCSampleQuadOnSynram const& block, SynramOnDLS const& synram) :
+	    mixin_t(block, synram)
+	{}
+
+	explicit CADCSampleQuadOnDLS(enum_type const& e) : mixin_t(e) {}
+
+	CADCSampleQuadOnSynram toCADCSampleQuadOnSynram() const
+	{
+		return This();
+	}
+
+	SynapseQuadOnDLS toSynapseQuadOnDLS() const;
+	SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const;
+	SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const;
+	SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const;
+};
+
+struct GENPYBIND(inline_base("*CADCChannelTypeMixin*")) CADCChannelConfigOnSynram
+    : public CADCChannelTypeMixin<CADCChannelConfigOnSynram, CADCChannelColumnOnSynram>
+{
+	CADCChannelConfigOnSynram() = default;
+
+	explicit CADCChannelConfigOnSynram(
+	    CADCChannelColumnOnSynram const& quad, CADCChannelType const& cadc_channel_type) :
+	    mixin_t(quad, cadc_channel_type)
+	{}
+
+	explicit CADCChannelConfigOnSynram(enum_type const& e) : mixin_t(e) {}
+
+	CADCChannelColumnOnSynram toCADCChannelColumnOnSynram() const
+	{
+		return This();
+	}
+	SynapseOnSynapseRow toSynapseOnSynapseRow() const
+	{
+		return SynapseOnSynapseRow(int(toCADCChannelColumnOnSynram().toEnum()));
+	}
+};
+
+
+struct GENPYBIND(inline_base("*SynramMixin*")) CADCChannelConfigOnDLS
+    : public SynramMixin<CADCChannelConfigOnDLS, CADCChannelConfigOnSynram>
+{
+	CADCChannelConfigOnDLS() = default;
+
+	explicit CADCChannelConfigOnDLS(
+	    CADCChannelConfigOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) :
+	    mixin_t(block, synram)
+	{}
+
+	explicit CADCChannelConfigOnDLS(enum_type const& e) : mixin_t(e) {}
+
+	CADCChannelConfigOnSynram toCADCChannelConfigOnSynram() const
+	{
+		return This();
+	}
+	NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const;
+};
+
 } // namespace halco::hicann_dls::vx
 
 namespace std {
@@ -125,5 +240,10 @@ HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCChannelColumnOnSynram)
 HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCSampleRowOnDLS)
 HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCOffsetSRAMTimingConfigOnDLS)
 HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCSamplesOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCSampleQuadOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCChannelConfigOnSynram)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCChannelConfigOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCSampleQuadUnspecifiedReadoutOnSynram)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCSampleQuadOnSynram)
 
 } // namespace std
diff --git a/include/halco/hicann-dls/vx/cadc_ns_includes.h b/include/halco/hicann-dls/vx/cadc_ns_includes.h
deleted file mode 100644
index 476016dcc03f8ac0f8ba8f14c70a3ddde1e91261..0000000000000000000000000000000000000000
--- a/include/halco/hicann-dls/vx/cadc_ns_includes.h
+++ /dev/null
@@ -1,123 +0,0 @@
-struct SynapseQuadOnDLS;
-struct SynapseWeightQuadOnDLS;
-struct SynapseLabelQuadOnDLS;
-struct SynapseCorrelationCalibQuadOnDLS;
-
-using CADCOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCOnDLS;
-using CADCConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCConfigOnDLS;
-using CADCChannelType GENPYBIND(visible) = halco::hicann_dls::vx::CADCChannelType;
-using CADCReadoutType GENPYBIND(visible) = halco::hicann_dls::vx::CADCReadoutType;
-using CADCChannelColumnOnSynram GENPYBIND(visible) =
-    halco::hicann_dls::vx::CADCChannelColumnOnSynram;
-using CADCSampleRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleRowOnDLS;
-using CADCOffsetSRAMTimingConfigOnDLS GENPYBIND(visible) =
-    halco::hicann_dls::vx::CADCOffsetSRAMTimingConfigOnDLS;
-using CADCSamplesOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSamplesOnDLS;
-
-HALCO_COORDINATE_MIXIN(CADCChannelTypeMixin, CADCChannelType, cadc_channel_type)
-
-struct GENPYBIND(inline_base("*CADCChannelTypeMixin*")) CADCSampleQuadUnspecifiedReadoutOnSynram
-    : public CADCChannelTypeMixin<CADCSampleQuadUnspecifiedReadoutOnSynram, SynapseQuadOnSynram>
-{
-	CADCSampleQuadUnspecifiedReadoutOnSynram() = default;
-
-	explicit CADCSampleQuadUnspecifiedReadoutOnSynram(
-	    SynapseQuadOnSynram const& quad, CADCChannelType const& cadc_channel_type) :
-	    mixin_t(quad, cadc_channel_type)
-	{}
-
-	explicit CADCSampleQuadUnspecifiedReadoutOnSynram(enum_type const& e) : mixin_t(e) {}
-
-	SynapseQuadOnSynram toSynapseQuadOnSynram() const
-	{
-		return This();
-	}
-};
-
-
-HALCO_COORDINATE_MIXIN(CADCReadoutTypeMixin, CADCReadoutType, cadc_readout_type)
-
-struct GENPYBIND(inline_base("*CADCReadoutTypeMixin*")) CADCSampleQuadOnSynram
-    : public CADCReadoutTypeMixin<CADCSampleQuadOnSynram, CADCSampleQuadUnspecifiedReadoutOnSynram>
-{
-	CADCSampleQuadOnSynram() = default;
-
-	explicit CADCSampleQuadOnSynram(
-	    SynapseQuadOnSynram const& quad,
-	    CADCChannelType const& cadc_channel_type,
-	    CADCReadoutType const& cadc_readout_type = CADCReadoutType()) :
-	    mixin_t(
-	        CADCSampleQuadUnspecifiedReadoutOnSynram(quad, cadc_channel_type), cadc_readout_type)
-	{}
-
-	explicit CADCSampleQuadOnSynram(enum_type const& e) : mixin_t(e) {}
-
-	CADCSampleQuadUnspecifiedReadoutOnSynram toCADCSampleQuadUnspecifiedReadoutOnSynram() const
-	{
-		return This();
-	}
-};
-
-struct GENPYBIND(inline_base("*SynramMixin*")) CADCSampleQuadOnDLS
-    : public SynramMixin<CADCSampleQuadOnDLS, CADCSampleQuadOnSynram>
-{
-	CADCSampleQuadOnDLS() = default;
-
-	explicit CADCSampleQuadOnDLS(CADCSampleQuadOnSynram const& block, SynramOnDLS const& synram) :
-	    mixin_t(block, synram)
-	{}
-
-	explicit CADCSampleQuadOnDLS(enum_type const& e) : mixin_t(e) {}
-
-	CADCSampleQuadOnSynram toCADCSampleQuadOnSynram() const
-	{
-		return This();
-	}
-
-	SynapseQuadOnDLS toSynapseQuadOnDLS() const;
-	SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const;
-	SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const;
-	SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const;
-};
-
-struct GENPYBIND(inline_base("*CADCChannelTypeMixin*")) CADCChannelConfigOnSynram
-    : public CADCChannelTypeMixin<CADCChannelConfigOnSynram, CADCChannelColumnOnSynram>
-{
-	CADCChannelConfigOnSynram() = default;
-
-	explicit CADCChannelConfigOnSynram(
-	    CADCChannelColumnOnSynram const& quad, CADCChannelType const& cadc_channel_type) :
-	    mixin_t(quad, cadc_channel_type)
-	{}
-
-	explicit CADCChannelConfigOnSynram(enum_type const& e) : mixin_t(e) {}
-
-	CADCChannelColumnOnSynram toCADCChannelColumnOnSynram() const
-	{
-		return This();
-	}
-	SynapseOnSynapseRow toSynapseOnSynapseRow() const
-	{
-		return SynapseOnSynapseRow(int(toCADCChannelColumnOnSynram().toEnum()));
-	}
-};
-
-
-struct GENPYBIND(inline_base("*SynramMixin*")) CADCChannelConfigOnDLS
-    : public SynramMixin<CADCChannelConfigOnDLS, CADCChannelConfigOnSynram>
-{
-	CADCChannelConfigOnDLS() = default;
-
-	explicit CADCChannelConfigOnDLS(
-	    CADCChannelConfigOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) :
-	    mixin_t(block, synram)
-	{}
-
-	explicit CADCChannelConfigOnDLS(enum_type const& e) : mixin_t(e) {}
-
-	CADCChannelConfigOnSynram toCADCChannelConfigOnSynram() const
-	{
-		return This();
-	}
-	NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const;
-};
diff --git a/include/halco/hicann-dls/vx/cadc_ns_includes_impl.h b/include/halco/hicann-dls/vx/cadc_ns_includes_impl.h
deleted file mode 100644
index c23af82be37814901b2118d6bbfce02c86af0e6e..0000000000000000000000000000000000000000
--- a/include/halco/hicann-dls/vx/cadc_ns_includes_impl.h
+++ /dev/null
@@ -1,31 +0,0 @@
-SynapseQuadOnDLS CADCSampleQuadOnDLS::toSynapseQuadOnDLS() const
-{
-	return SynapseQuadOnDLS(
-	    toCADCSampleQuadOnSynram()
-	        .toCADCSampleQuadUnspecifiedReadoutOnSynram()
-	        .toSynapseQuadOnSynram(),
-	    toSynramOnDLS());
-}
-
-SynapseWeightQuadOnDLS CADCSampleQuadOnDLS::toSynapseWeightQuadOnDLS() const
-{
-	return toSynapseQuadOnDLS().toSynapseWeightQuadOnDLS();
-}
-
-SynapseLabelQuadOnDLS CADCSampleQuadOnDLS::toSynapseLabelQuadOnDLS() const
-{
-	return toSynapseQuadOnDLS().toSynapseLabelQuadOnDLS();
-}
-
-SynapseCorrelationCalibQuadOnDLS CADCSampleQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const
-{
-	return toSynapseQuadOnDLS().toSynapseCorrelationCalibQuadOnDLS();
-}
-
-
-NeuronConfigBlockOnDLS CADCChannelConfigOnDLS::toNeuronConfigBlockOnDLS() const
-{
-	return NeuronConfigBlockOnDLS(
-	    (2 * toSynramOnDLS().toEnum()) +
-	    (toSynapseOnSynapseRow() / NeuronConfigOnNeuronConfigBlock::size));
-}
diff --git a/include/halco/hicann-dls/vx/neuron.h b/include/halco/hicann-dls/vx/neuron.h
index 5017042c914792cbaf1bfe379eee31b79fc1dca1..dc0157a2b59e54903ef3eeaa9bbfa324881dbbe2 100644
--- a/include/halco/hicann-dls/vx/neuron.h
+++ b/include/halco/hicann-dls/vx/neuron.h
@@ -6,7 +6,13 @@
 #include "halco/common/mixin.h"
 #include "halco/common/typed_array.h"
 
+#include "halco/hicann-dls/vx/quad.h"
 #include "halco/hicann-dls/vx/synapse.h"
+#include "halco/hicann-dls/vx/synram.h"
+
+namespace cereal {
+class access;
+} // namespace cereal
 
 namespace halco::hicann_dls::vx GENPYBIND_TAG_HALCO_HICANN_DLS_VX {
 
@@ -19,6 +25,7 @@ struct SpikeCounterReadBlockOnDLS;
 struct SpikeCounterReadOnDLS;
 struct SpikeCounterResetBlockOnDLS;
 struct SpikeCounterResetOnDLS;
+struct SynapseOnSynapseRow;
 struct NeuronEventOutputOnNeuronBackendBlock;
 struct NeuronEventOutputOnDLS;
 struct CrossbarInputOnDLS;
@@ -26,6 +33,8 @@ struct NeuronBackendConfigBlockOnDLS;
 struct BlockPostPulseOnDLS;
 struct ColumnCorrelationQuadOnDLS;
 struct ColumnCurrentQuadOnDLS;
+struct NeuronConfigOnDLS;
+struct NeuronBackendConfigOnDLS;
 
 /**********\
    Neuron
@@ -323,6 +332,323 @@ struct GENPYBIND(inline_base("*")) NeuronBlockOnDLS
 	{}
 };
 
+
+/**
+ * Horizontal neuron location on the two dimensional neuron grid.
+ */
+struct GENPYBIND(inline_base("*")) NeuronColumnOnDLS
+    : public common::detail::RantWrapper<NeuronColumnOnDLS, uint_fast16_t, 255, 0>
+    , public common::detail::XRangedTrait
+{
+	constexpr explicit NeuronColumnOnDLS(uintmax_t const val = 0) GENPYBIND(implicit_conversion) :
+	    rant_t(val)
+	{}
+
+	SynapseOnSynapseRow toSynapseOnSynapseRow() const;
+	CapMemColumnOnCapMemBlock toCapMemColumnOnCapMemBlock() const;
+	NeuronEventOutputOnDLS toNeuronEventOutputOnDLS() const;
+};
+
+/**
+ * DLS-global neuron location on the two dimensional neuron grid.
+ */
+struct GENPYBIND(inline_base("*")) AtomicNeuronOnDLS
+    : public common::detail::GridCoordinate<AtomicNeuronOnDLS, NeuronColumnOnDLS, NeuronRowOnDLS>
+{
+	GRID_COMMON_CONSTRUCTORS(AtomicNeuronOnDLS)
+
+	NeuronColumnOnDLS toNeuronColumnOnDLS() const
+	{
+		return x();
+	}
+	NeuronRowOnDLS toNeuronRowOnDLS() const
+	{
+		return y();
+	}
+
+	NeuronResetOnDLS toNeuronResetOnDLS() const;
+	SpikeCounterReadOnDLS toSpikeCounterReadOnDLS() const;
+	SpikeCounterResetOnDLS toSpikeCounterResetOnDLS() const;
+	NeuronConfigOnDLS toNeuronConfigOnDLS() const;
+	NeuronBackendConfigOnDLS toNeuronBackendConfigOnDLS() const;
+
+	CapMemBlockOnDLS toCapMemBlockOnDLS() const;
+	CapMemColumnOnCapMemBlock toCapMemColumnOnCapMemBlock() const;
+	SynramOnDLS toSynramOnDLS() const;
+	SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const;
+	ColumnCorrelationQuadOnDLS toColumnCorrelationQuadOnDLS() const;
+	ColumnCurrentQuadOnDLS toColumnCurrentQuadOnDLS() const;
+};
+
+
+/**
+ * Horizontal neuron location on a logical neuron.
+ */
+struct GENPYBIND(inline_base("*")) NeuronColumnOnLogicalNeuron
+    : public common::detail::RantWrapper<
+          NeuronColumnOnLogicalNeuron,
+          uint_fast16_t,
+          (NeuronColumnOnDLS::size / NeuronBackendConfigBlockOnDLS::size) - 1,
+          0>
+    , public common::detail::XRangedTrait
+{
+	constexpr explicit NeuronColumnOnLogicalNeuron(uintmax_t const val = 0)
+	    GENPYBIND(implicit_conversion) :
+	    rant_t(val)
+	{}
+};
+
+
+/**
+ * Local neuron location on a logical neuron.
+ */
+struct GENPYBIND(inline_base("*")) AtomicNeuronOnLogicalNeuron
+    : public common::detail::GridCoordinate<
+          AtomicNeuronOnLogicalNeuron,
+          NeuronColumnOnLogicalNeuron,
+          NeuronRowOnLogicalNeuron>
+{
+	GRID_COMMON_CONSTRUCTORS(AtomicNeuronOnLogicalNeuron)
+
+	NeuronColumnOnLogicalNeuron toNeuronColumnOnLogicalNeuron() const
+	{
+		return x();
+	}
+	NeuronRowOnLogicalNeuron toNeuronRowOnLogicalNeuron() const
+	{
+		return y();
+	}
+
+	enum class Direction
+	{
+		left,
+		right,
+		opposite_row
+	};
+
+	/**
+	 * Get neighbor if it exists on the chip.
+	 * @throws OverflowError if neighbor does not exist
+	 * @return AtomicNeuronOnLogicalNeuron
+	 */
+	AtomicNeuronOnLogicalNeuron get_neighbor(Direction const& direction) const;
+};
+
+
+/**
+ * Compartment index.
+ * Its range is chosen such that the maximally possible number of compartments in a neuron backend
+ * block can be created. This is size-2, because one compartment has to connect top and bottom row
+ * and therefore consists of two atomic neuron circuits.
+ */
+struct GENPYBIND(inline_base("*")) CompartmentOnLogicalNeuron
+    : public common::detail::RantWrapper<
+          CompartmentOnLogicalNeuron,
+          uint_fast16_t,
+          (AtomicNeuronOnDLS::size / NeuronBackendConfigBlockOnDLS::size) - 2,
+          0>
+{
+	constexpr explicit CompartmentOnLogicalNeuron(uintmax_t const val = 0)
+	    GENPYBIND(implicit_conversion) :
+	    rant_t(val)
+	{}
+};
+
+
+/**
+ * Logical neuron compartments.
+ */
+struct GENPYBIND(visible) LogicalNeuronCompartments
+{
+	typedef std::vector<AtomicNeuronOnLogicalNeuron> Compartment;
+	typedef std::map<CompartmentOnLogicalNeuron, Compartment> Compartments;
+
+	LogicalNeuronCompartments() = default;
+	/**
+	 * Construct logical neuron compartments from compartments.
+	 * The compartment members are to be unique.
+	 * @param compartments Compartments to construct neuron from
+	 */
+	explicit LogicalNeuronCompartments(Compartments const& compartments);
+
+	Compartments const& get_compartments() const;
+
+	/**
+	 * Flip locations in the x dimension.
+	 * 1 2 3 4 becomes 4 3 2 1
+	 * 5 6                 6 5
+	 * @return Flipped compartments
+	 */
+	LogicalNeuronCompartments flip_x() const;
+
+	/**
+	 * Flip locations in the y dimension.
+	 * 1 2 3 4 becomes 5 6
+	 * 5 6             1 2 3 4
+	 * @return Flipped compartments
+	 */
+	LogicalNeuronCompartments flip_y() const;
+
+	NeuronColumnOnLogicalNeuron get_left_most_column() const;
+	NeuronColumnOnLogicalNeuron get_right_most_column() const;
+
+	NeuronRowOnLogicalNeuron get_top_most_row() const;
+	NeuronRowOnLogicalNeuron get_bottom_most_row() const;
+
+	bool operator==(LogicalNeuronCompartments const& other) const;
+	bool operator!=(LogicalNeuronCompartments const& other) const;
+
+	bool operator<(LogicalNeuronCompartments const& other) const;
+	bool operator>(LogicalNeuronCompartments const& other) const;
+	bool operator<=(LogicalNeuronCompartments const& other) const;
+	bool operator>=(LogicalNeuronCompartments const& other) const;
+
+	GENPYBIND(stringstream)
+	friend std::ostream& operator<<(std::ostream& os, LogicalNeuronCompartments const& config);
+
+private:
+	friend class cereal::access;
+	template <typename Archive>
+	void serialize(Archive& ar, uint32_t);
+
+	Compartments m_compartments;
+};
+
+
+/**
+ * Logical neuron location on the neuron grid.
+ */
+struct GENPYBIND(visible) LogicalNeuronOnDLS
+{
+	typedef std::map<CompartmentOnLogicalNeuron, std::vector<AtomicNeuronOnDLS>> PlacedCompartments;
+
+	LogicalNeuronOnDLS() = default;
+
+	/**
+	 * Construct logical neuron location from compartments and global anchor.
+	 * The compartments' relative coordinates are anchored at the left top corner.
+	 * @param compartments Compartments to construct neuron from
+	 * @param anchor Anchor to construct neuron from
+	 */
+	LogicalNeuronOnDLS(
+	    LogicalNeuronCompartments const& compartments, AtomicNeuronOnDLS const& anchor);
+
+	/**
+	 * Get compartments placed by anchor.
+	 * @return Placed compartments
+	 */
+	PlacedCompartments get_placed_compartments() const;
+
+	bool operator==(LogicalNeuronOnDLS const& other) const;
+	bool operator!=(LogicalNeuronOnDLS const& other) const;
+
+	GENPYBIND(stringstream)
+	friend std::ostream& operator<<(std::ostream& os, LogicalNeuronOnDLS const& config);
+
+	bool operator<(LogicalNeuronOnDLS const& other) const;
+	bool operator>(LogicalNeuronOnDLS const& other) const;
+	bool operator<=(LogicalNeuronOnDLS const& other) const;
+	bool operator>=(LogicalNeuronOnDLS const& other) const;
+
+private:
+	friend class cereal::access;
+	template <typename Archive>
+	void serialize(Archive& ar, uint32_t);
+
+	PlacedCompartments m_compartments;
+};
+
+
+HALCO_COORDINATE_MIXIN(NeuronConfigMixin, NeuronConfigBlockOnDLS, neuron)
+
+struct GENPYBIND(inline_base("*NeuronConfigMixin*")) NeuronConfigOnDLS
+    : public NeuronConfigMixin<NeuronConfigOnDLS, NeuronConfigOnNeuronConfigBlock>
+{
+	NeuronConfigOnDLS() = default;
+
+	explicit NeuronConfigOnDLS(
+	    NeuronConfigOnNeuronConfigBlock const& neuron,
+	    NeuronConfigBlockOnDLS const& block = NeuronConfigBlockOnDLS()) :
+	    mixin_t(neuron, block)
+	{}
+
+	explicit NeuronConfigOnDLS(enum_type const& e) : mixin_t(e) {}
+
+	NeuronConfigOnNeuronConfigBlock toNeuronConfigOnNeuronConfigBlock() const
+	{
+		return This();
+	}
+	NeuronResetOnDLS toNeuronResetOnDLS() const;
+	SpikeCounterReadOnDLS toSpikeCounterReadOnDLS() const;
+	SpikeCounterResetOnDLS toSpikeCounterResetOnDLS() const;
+	AtomicNeuronOnDLS toAtomicNeuronOnDLS() const;
+	SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const;
+	EntryOnQuad toEntryOnQuad() const;
+	NeuronRowOnDLS toNeuronRowOnDLS() const;
+	SynapseOnSynapseRow toSynapseOnSynapseRow() const;
+	NeuronBackendConfigBlockOnDLS toNeuronBackendConfigBlockOnDLS() const;
+	NeuronBackendConfigOnNeuronBackendConfigBlock toNeuronBackendConfigOnNeuronBackendConfigBlock()
+	    const;
+	CommonNeuronBackendConfigOnDLS toCommonNeuronBackendConfigOnDLS() const;
+	NeuronBackendConfigOnDLS toNeuronBackendConfigOnDLS() const;
+	SynramOnDLS toSynramOnDLS() const;
+	ColumnCorrelationQuadOnDLS toColumnCorrelationQuadOnDLS() const;
+	ColumnCurrentQuadOnDLS toColumnCurrentQuadOnDLS() const;
+};
+
+struct GENPYBIND(inline_base("*NeuronBackendConfigMixin*")) NeuronBackendConfigOnDLS
+    : public NeuronBackendConfigMixin<
+          NeuronBackendConfigOnDLS,
+          NeuronBackendConfigOnNeuronBackendConfigBlock>
+{
+	NeuronBackendConfigOnDLS() = default;
+
+	explicit NeuronBackendConfigOnDLS(
+	    NeuronBackendConfigOnNeuronBackendConfigBlock const& neuron,
+	    NeuronBackendConfigBlockOnDLS const& block = NeuronBackendConfigBlockOnDLS()) :
+	    mixin_t(neuron, block)
+	{}
+
+	explicit NeuronBackendConfigOnDLS(enum_type const& e) : mixin_t(e) {}
+
+	NeuronBackendConfigOnNeuronBackendConfigBlock toNeuronBackendConfigOnNeuronBackendConfigBlock()
+	    const
+	{
+		return This();
+	}
+
+	NeuronColumnOnDLS toNeuronColumnOnDLS() const;
+	NeuronRowOnDLS toNeuronRowOnDLS() const;
+	CommonNeuronBackendConfigOnDLS toCommonNeuronBackendConfigOnDLS() const;
+	SpikeCounterReadOnDLS toSpikeCounterReadOnDLS() const;
+	SpikeCounterResetOnDLS toSpikeCounterResetOnDLS() const;
+	NeuronConfigOnDLS toNeuronConfigOnDLS() const;
+	AtomicNeuronOnDLS toAtomicNeuronOnDLS() const;
+	SynramOnDLS toSynramOnDLS() const;
+	NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const;
+};
+
+struct GENPYBIND(inline_base("*SynramMixin*")) NeuronResetQuadOnDLS
+    : public SynramMixin<NeuronResetQuadOnDLS, SynapseQuadColumnOnDLS>
+{
+	NeuronResetQuadOnDLS() = default;
+
+	explicit NeuronResetQuadOnDLS(
+	    SynapseQuadColumnOnDLS const& quad, SynramOnDLS const& synram = SynramOnDLS()) :
+	    mixin_t(quad, synram)
+	{}
+
+	explicit NeuronResetQuadOnDLS(enum_type const& e) : mixin_t(e) {}
+
+	SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const
+	{
+		return This();
+	}
+	typedef common::typed_array<NeuronResetOnDLS, EntryOnQuad> neuron_reset_type
+	    GENPYBIND(opaque(false));
+	neuron_reset_type toNeuronResetOnDLS() const;
+};
+
 } // namespace halco::hicann_dls::vx
 
 namespace std {
@@ -349,5 +675,13 @@ HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronSRAMTimingConfigOnDLS)
 HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronBackendSRAMTimingConfigOnDLS)
 HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronRowOnLogicalNeuron)
 HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronBlockOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronColumnOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::AtomicNeuronOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronColumnOnLogicalNeuron)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::AtomicNeuronOnLogicalNeuron)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CompartmentOnLogicalNeuron)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronConfigOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronBackendConfigOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronResetQuadOnDLS)
 
 } // namespace std
diff --git a/include/halco/hicann-dls/vx/neuron_ns_includes.h b/include/halco/hicann-dls/vx/neuron_ns_includes.h
deleted file mode 100644
index d3f5091bad9e36979c6685c9e8584a7c4b2e1e82..0000000000000000000000000000000000000000
--- a/include/halco/hicann-dls/vx/neuron_ns_includes.h
+++ /dev/null
@@ -1,354 +0,0 @@
-struct NeuronConfigOnDLS;
-struct NeuronBackendConfigOnDLS;
-
-using NeuronRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronRowOnDLS;
-using NeuronConfigOnNeuronConfigBlock GENPYBIND(visible) =
-    halco::hicann_dls::vx::NeuronConfigOnNeuronConfigBlock;
-using NeuronConfigBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronConfigBlockOnDLS;
-using NeuronBackendConfigOnNeuronBackendConfigBlock GENPYBIND(visible) =
-    halco::hicann_dls::vx::NeuronBackendConfigOnNeuronBackendConfigBlock;
-using NeuronBackendConfigBlockOnDLS GENPYBIND(visible) =
-    halco::hicann_dls::vx::NeuronBackendConfigBlockOnDLS;
-using CommonNeuronBackendConfigOnDLS GENPYBIND(visible) =
-    halco::hicann_dls::vx::CommonNeuronBackendConfigOnDLS;
-using NeuronResetOnNeuronResetBlock GENPYBIND(visible) =
-    halco::hicann_dls::vx::NeuronResetOnNeuronResetBlock;
-using NeuronResetBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetBlockOnDLS;
-using NeuronResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetOnDLS;
-using BlockPostPulseOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::BlockPostPulseOnDLS;
-using SpikeCounterReadOnSpikeCounterReadBlock GENPYBIND(visible) =
-    halco::hicann_dls::vx::SpikeCounterReadOnSpikeCounterReadBlock;
-using SpikeCounterReadBlockOnDLS GENPYBIND(visible) =
-    halco::hicann_dls::vx::SpikeCounterReadBlockOnDLS;
-using SpikeCounterReadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SpikeCounterReadOnDLS;
-using SpikeCounterResetOnSpikeCounterResetBlock GENPYBIND(visible) =
-    halco::hicann_dls::vx::SpikeCounterResetOnSpikeCounterResetBlock;
-using SpikeCounterResetBlockOnDLS GENPYBIND(visible) =
-    halco::hicann_dls::vx::SpikeCounterResetBlockOnDLS;
-using SpikeCounterResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SpikeCounterResetOnDLS;
-using NeuronEventOutputOnNeuronBackendBlock GENPYBIND(visible) =
-    halco::hicann_dls::vx::NeuronEventOutputOnNeuronBackendBlock;
-using NeuronEventOutputOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronEventOutputOnDLS;
-using NeuronSRAMTimingConfigOnDLS GENPYBIND(visible) =
-    halco::hicann_dls::vx::NeuronSRAMTimingConfigOnDLS;
-using NeuronBackendSRAMTimingConfigOnDLS GENPYBIND(visible) =
-    halco::hicann_dls::vx::NeuronBackendSRAMTimingConfigOnDLS;
-using NeuronRowOnLogicalNeuron = halco::hicann_dls::vx::NeuronRowOnLogicalNeuron;
-using NeuronBlockOnDLS = halco::hicann_dls::vx::NeuronBlockOnDLS;
-
-
-/**
- * Horizontal neuron location on the two dimensional neuron grid.
- */
-struct GENPYBIND(inline_base("*")) NeuronColumnOnDLS
-    : public common::detail::RantWrapper<NeuronColumnOnDLS, uint_fast16_t, 255, 0>
-    , public common::detail::XRangedTrait
-{
-	constexpr explicit NeuronColumnOnDLS(uintmax_t const val = 0) GENPYBIND(implicit_conversion) :
-	    rant_t(val)
-	{}
-
-	SynapseOnSynapseRow toSynapseOnSynapseRow() const;
-	CapMemColumnOnCapMemBlock toCapMemColumnOnCapMemBlock() const;
-	NeuronEventOutputOnDLS toNeuronEventOutputOnDLS() const;
-};
-
-/**
- * DLS-global neuron location on the two dimensional neuron grid.
- */
-struct GENPYBIND(inline_base("*")) AtomicNeuronOnDLS
-    : public common::detail::GridCoordinate<AtomicNeuronOnDLS, NeuronColumnOnDLS, NeuronRowOnDLS>
-{
-	GRID_COMMON_CONSTRUCTORS(AtomicNeuronOnDLS)
-
-	NeuronColumnOnDLS toNeuronColumnOnDLS() const
-	{
-		return x();
-	}
-	NeuronRowOnDLS toNeuronRowOnDLS() const
-	{
-		return y();
-	}
-
-	NeuronResetOnDLS toNeuronResetOnDLS() const;
-	SpikeCounterReadOnDLS toSpikeCounterReadOnDLS() const;
-	SpikeCounterResetOnDLS toSpikeCounterResetOnDLS() const;
-	NeuronConfigOnDLS toNeuronConfigOnDLS() const;
-	NeuronBackendConfigOnDLS toNeuronBackendConfigOnDLS() const;
-
-	CapMemBlockOnDLS toCapMemBlockOnDLS() const;
-	CapMemColumnOnCapMemBlock toCapMemColumnOnCapMemBlock() const;
-	SynramOnDLS toSynramOnDLS() const;
-	SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const;
-	ColumnCorrelationQuadOnDLS toColumnCorrelationQuadOnDLS() const;
-	ColumnCurrentQuadOnDLS toColumnCurrentQuadOnDLS() const;
-};
-
-
-/**
- * Horizontal neuron location on a logical neuron.
- */
-struct GENPYBIND(inline_base("*")) NeuronColumnOnLogicalNeuron
-    : public common::detail::RantWrapper<
-          NeuronColumnOnLogicalNeuron,
-          uint_fast16_t,
-          (NeuronColumnOnDLS::size / NeuronBackendConfigBlockOnDLS::size) - 1,
-          0>
-    , public common::detail::XRangedTrait
-{
-	constexpr explicit NeuronColumnOnLogicalNeuron(uintmax_t const val = 0)
-	    GENPYBIND(implicit_conversion) :
-	    rant_t(val)
-	{}
-};
-
-
-/**
- * Local neuron location on a logical neuron.
- */
-struct GENPYBIND(inline_base("*")) AtomicNeuronOnLogicalNeuron
-    : public common::detail::GridCoordinate<
-          AtomicNeuronOnLogicalNeuron,
-          NeuronColumnOnLogicalNeuron,
-          NeuronRowOnLogicalNeuron>
-{
-	GRID_COMMON_CONSTRUCTORS(AtomicNeuronOnLogicalNeuron)
-
-	NeuronColumnOnLogicalNeuron toNeuronColumnOnLogicalNeuron() const
-	{
-		return x();
-	}
-	NeuronRowOnLogicalNeuron toNeuronRowOnLogicalNeuron() const
-	{
-		return y();
-	}
-
-	enum class Direction
-	{
-		left,
-		right,
-		opposite_row
-	};
-
-	/**
-	 * Get neighbor if it exists on the chip.
-	 * @throws OverflowError if neighbor does not exist
-	 * @return AtomicNeuronOnLogicalNeuron
-	 */
-	AtomicNeuronOnLogicalNeuron get_neighbor(Direction const& direction) const;
-};
-
-
-/**
- * Compartment index.
- * Its range is chosen such that the maximally possible number of compartments in a neuron backend
- * block can be created. This is size-2, because one compartment has to connect top and bottom row
- * and therefore consists of two atomic neuron circuits.
- */
-struct GENPYBIND(inline_base("*")) CompartmentOnLogicalNeuron
-    : public common::detail::RantWrapper<
-          CompartmentOnLogicalNeuron,
-          uint_fast16_t,
-          (AtomicNeuronOnDLS::size / NeuronBackendConfigBlockOnDLS::size) - 2,
-          0>
-{
-	constexpr explicit CompartmentOnLogicalNeuron(uintmax_t const val = 0)
-	    GENPYBIND(implicit_conversion) :
-	    rant_t(val)
-	{}
-};
-
-
-/**
- * Logical neuron compartments.
- */
-struct GENPYBIND(visible) LogicalNeuronCompartments
-{
-	typedef std::vector<AtomicNeuronOnLogicalNeuron> Compartment;
-	typedef std::map<CompartmentOnLogicalNeuron, Compartment> Compartments;
-
-	LogicalNeuronCompartments() = default;
-	/**
-	 * Construct logical neuron compartments from compartments.
-	 * The compartment members are to be unique.
-	 * @param compartments Compartments to construct neuron from
-	 */
-	explicit LogicalNeuronCompartments(Compartments const& compartments);
-
-	Compartments const& get_compartments() const;
-
-	/**
-	 * Flip locations in the x dimension.
-	 * 1 2 3 4 becomes 4 3 2 1
-	 * 5 6                 6 5
-	 * @return Flipped compartments
-	 */
-	LogicalNeuronCompartments flip_x() const;
-
-	/**
-	 * Flip locations in the y dimension.
-	 * 1 2 3 4 becomes 5 6
-	 * 5 6             1 2 3 4
-	 * @return Flipped compartments
-	 */
-	LogicalNeuronCompartments flip_y() const;
-
-	NeuronColumnOnLogicalNeuron get_left_most_column() const;
-	NeuronColumnOnLogicalNeuron get_right_most_column() const;
-
-	NeuronRowOnLogicalNeuron get_top_most_row() const;
-	NeuronRowOnLogicalNeuron get_bottom_most_row() const;
-
-	bool operator==(LogicalNeuronCompartments const& other) const;
-	bool operator!=(LogicalNeuronCompartments const& other) const;
-
-	bool operator<(LogicalNeuronCompartments const& other) const;
-	bool operator>(LogicalNeuronCompartments const& other) const;
-	bool operator<=(LogicalNeuronCompartments const& other) const;
-	bool operator>=(LogicalNeuronCompartments const& other) const;
-
-	GENPYBIND(stringstream)
-	friend std::ostream& operator<<(std::ostream& os, LogicalNeuronCompartments const& config);
-
-private:
-	friend class cereal::access;
-	template <typename Archive>
-	void serialize(Archive& ar, uint32_t);
-
-	Compartments m_compartments;
-};
-
-
-/**
- * Logical neuron location on the neuron grid.
- */
-struct GENPYBIND(visible) LogicalNeuronOnDLS
-{
-	typedef std::map<CompartmentOnLogicalNeuron, std::vector<AtomicNeuronOnDLS>> PlacedCompartments;
-
-	LogicalNeuronOnDLS() = default;
-
-	/**
-	 * Construct logical neuron location from compartments and global anchor.
-	 * The compartments' relative coordinates are anchored at the left top corner.
-	 * @param compartments Compartments to construct neuron from
-	 * @param anchor Anchor to construct neuron from
-	 */
-	LogicalNeuronOnDLS(
-	    LogicalNeuronCompartments const& compartments, AtomicNeuronOnDLS const& anchor);
-
-	/**
-	 * Get compartments placed by anchor.
-	 * @return Placed compartments
-	 */
-	PlacedCompartments get_placed_compartments() const;
-
-	bool operator==(LogicalNeuronOnDLS const& other) const;
-	bool operator!=(LogicalNeuronOnDLS const& other) const;
-
-	GENPYBIND(stringstream)
-	friend std::ostream& operator<<(std::ostream& os, LogicalNeuronOnDLS const& config);
-
-	bool operator<(LogicalNeuronOnDLS const& other) const;
-	bool operator>(LogicalNeuronOnDLS const& other) const;
-	bool operator<=(LogicalNeuronOnDLS const& other) const;
-	bool operator>=(LogicalNeuronOnDLS const& other) const;
-
-private:
-	friend class cereal::access;
-	template <typename Archive>
-	void serialize(Archive& ar, uint32_t);
-
-	PlacedCompartments m_compartments;
-};
-
-
-HALCO_COORDINATE_MIXIN(NeuronConfigMixin, NeuronConfigBlockOnDLS, neuron)
-
-struct GENPYBIND(inline_base("*NeuronConfigMixin*")) NeuronConfigOnDLS
-    : public NeuronConfigMixin<NeuronConfigOnDLS, NeuronConfigOnNeuronConfigBlock>
-{
-	NeuronConfigOnDLS() = default;
-
-	explicit NeuronConfigOnDLS(
-	    NeuronConfigOnNeuronConfigBlock const& neuron,
-	    NeuronConfigBlockOnDLS const& block = NeuronConfigBlockOnDLS()) :
-	    mixin_t(neuron, block)
-	{}
-
-	explicit NeuronConfigOnDLS(enum_type const& e) : mixin_t(e) {}
-
-	NeuronConfigOnNeuronConfigBlock toNeuronConfigOnNeuronConfigBlock() const
-	{
-		return This();
-	}
-	NeuronResetOnDLS toNeuronResetOnDLS() const;
-	SpikeCounterReadOnDLS toSpikeCounterReadOnDLS() const;
-	SpikeCounterResetOnDLS toSpikeCounterResetOnDLS() const;
-	AtomicNeuronOnDLS toAtomicNeuronOnDLS() const;
-	SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const;
-	EntryOnQuad toEntryOnQuad() const;
-	NeuronRowOnDLS toNeuronRowOnDLS() const;
-	SynapseOnSynapseRow toSynapseOnSynapseRow() const;
-	NeuronBackendConfigBlockOnDLS toNeuronBackendConfigBlockOnDLS() const;
-	NeuronBackendConfigOnNeuronBackendConfigBlock toNeuronBackendConfigOnNeuronBackendConfigBlock()
-	    const;
-	CommonNeuronBackendConfigOnDLS toCommonNeuronBackendConfigOnDLS() const;
-	NeuronBackendConfigOnDLS toNeuronBackendConfigOnDLS() const;
-	SynramOnDLS toSynramOnDLS() const;
-	ColumnCorrelationQuadOnDLS toColumnCorrelationQuadOnDLS() const;
-	ColumnCurrentQuadOnDLS toColumnCurrentQuadOnDLS() const;
-};
-
-struct GENPYBIND(inline_base("*NeuronBackendConfigMixin*")) NeuronBackendConfigOnDLS
-    : public NeuronBackendConfigMixin<
-          NeuronBackendConfigOnDLS,
-          NeuronBackendConfigOnNeuronBackendConfigBlock>
-{
-	NeuronBackendConfigOnDLS() = default;
-
-	explicit NeuronBackendConfigOnDLS(
-	    NeuronBackendConfigOnNeuronBackendConfigBlock const& neuron,
-	    NeuronBackendConfigBlockOnDLS const& block = NeuronBackendConfigBlockOnDLS()) :
-	    mixin_t(neuron, block)
-	{}
-
-	explicit NeuronBackendConfigOnDLS(enum_type const& e) : mixin_t(e) {}
-
-	NeuronBackendConfigOnNeuronBackendConfigBlock toNeuronBackendConfigOnNeuronBackendConfigBlock()
-	    const
-	{
-		return This();
-	}
-
-	NeuronColumnOnDLS toNeuronColumnOnDLS() const;
-	NeuronRowOnDLS toNeuronRowOnDLS() const;
-	CommonNeuronBackendConfigOnDLS toCommonNeuronBackendConfigOnDLS() const;
-	SpikeCounterReadOnDLS toSpikeCounterReadOnDLS() const;
-	SpikeCounterResetOnDLS toSpikeCounterResetOnDLS() const;
-	NeuronConfigOnDLS toNeuronConfigOnDLS() const;
-	AtomicNeuronOnDLS toAtomicNeuronOnDLS() const;
-	SynramOnDLS toSynramOnDLS() const;
-	NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const;
-};
-
-struct GENPYBIND(inline_base("*SynramMixin*")) NeuronResetQuadOnDLS
-    : public SynramMixin<NeuronResetQuadOnDLS, SynapseQuadColumnOnDLS>
-{
-	NeuronResetQuadOnDLS() = default;
-
-	explicit NeuronResetQuadOnDLS(
-	    SynapseQuadColumnOnDLS const& quad, SynramOnDLS const& synram = SynramOnDLS()) :
-	    mixin_t(quad, synram)
-	{}
-
-	explicit NeuronResetQuadOnDLS(enum_type const& e) : mixin_t(e) {}
-
-	SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const
-	{
-		return This();
-	}
-	typedef common::typed_array<NeuronResetOnDLS, EntryOnQuad> neuron_reset_type
-	    GENPYBIND(opaque(false));
-	neuron_reset_type toNeuronResetOnDLS() const;
-};
diff --git a/include/halco/hicann-dls/vx/neuron_ns_includes_impl.h b/include/halco/hicann-dls/vx/neuron_ns_includes_impl.h
deleted file mode 100644
index 6626737e9435980c055f027e1d82c4ebf8199710..0000000000000000000000000000000000000000
--- a/include/halco/hicann-dls/vx/neuron_ns_includes_impl.h
+++ /dev/null
@@ -1,515 +0,0 @@
-NeuronResetOnDLS NeuronConfigOnDLS::toNeuronResetOnDLS() const
-{
-	auto block = toNeuronConfigBlockOnDLS().toNeuronResetBlockOnDLS();
-	return NeuronResetOnDLS(
-	    NeuronResetOnNeuronResetBlock(
-	        toNeuronConfigOnNeuronConfigBlock() +
-	        ((toNeuronConfigBlockOnDLS() / NeuronResetBlockOnDLS::size)
-	             ? NeuronConfigOnNeuronConfigBlock::size
-	             : 0)),
-	    block);
-}
-
-SpikeCounterReadOnDLS NeuronConfigOnDLS::toSpikeCounterReadOnDLS() const
-{
-	return SpikeCounterReadOnDLS(toNeuronResetOnDLS().toEnum());
-}
-
-SpikeCounterResetOnDLS NeuronConfigOnDLS::toSpikeCounterResetOnDLS() const
-{
-	return SpikeCounterResetOnDLS(toNeuronResetOnDLS().toEnum());
-}
-
-SynapseOnSynapseRow NeuronColumnOnDLS::toSynapseOnSynapseRow() const
-{
-	return SynapseOnSynapseRow(toEnum());
-}
-
-CapMemColumnOnCapMemBlock NeuronColumnOnDLS::toCapMemColumnOnCapMemBlock() const
-{
-	return CapMemColumnOnCapMemBlock(toEnum() % NeuronConfigOnNeuronConfigBlock::size);
-}
-
-NeuronEventOutputOnDLS NeuronColumnOnDLS::toNeuronEventOutputOnDLS() const
-{
-	return NeuronEventOutputOnDLS(common::Enum(toEnum() / (size / NeuronEventOutputOnDLS::size)));
-}
-
-NeuronConfigOnDLS AtomicNeuronOnDLS::toNeuronConfigOnDLS() const
-{
-	return NeuronConfigOnDLS(toEnum());
-}
-
-NeuronResetOnDLS AtomicNeuronOnDLS::toNeuronResetOnDLS() const
-{
-	return toNeuronConfigOnDLS().toNeuronResetOnDLS();
-}
-
-SpikeCounterReadOnDLS AtomicNeuronOnDLS::toSpikeCounterReadOnDLS() const
-{
-	return toNeuronConfigOnDLS().toSpikeCounterReadOnDLS();
-}
-
-SpikeCounterResetOnDLS AtomicNeuronOnDLS::toSpikeCounterResetOnDLS() const
-{
-	return toNeuronConfigOnDLS().toSpikeCounterResetOnDLS();
-}
-
-NeuronBackendConfigOnDLS AtomicNeuronOnDLS::toNeuronBackendConfigOnDLS() const
-{
-	return NeuronBackendConfigOnDLS(toNeuronResetOnDLS().toEnum());
-}
-
-CapMemColumnOnCapMemBlock AtomicNeuronOnDLS::toCapMemColumnOnCapMemBlock() const
-{
-	return toNeuronColumnOnDLS().toCapMemColumnOnCapMemBlock();
-}
-
-CapMemBlockOnDLS AtomicNeuronOnDLS::toCapMemBlockOnDLS() const
-{
-	return toNeuronConfigOnDLS().toNeuronConfigBlockOnDLS().toCapMemBlockOnDLS();
-}
-
-NeuronRowOnDLS NeuronConfigOnDLS::toNeuronRowOnDLS() const
-{
-	return NeuronRowOnDLS(toEnum() / SynapseOnSynapseRow::size);
-}
-
-SynapseOnSynapseRow NeuronConfigOnDLS::toSynapseOnSynapseRow() const
-{
-	return SynapseOnSynapseRow(toEnum() % SynapseOnSynapseRow::size);
-}
-
-AtomicNeuronOnDLS NeuronConfigOnDLS::toAtomicNeuronOnDLS() const
-{
-	return AtomicNeuronOnDLS(toSynapseOnSynapseRow().toNeuronColumnOnDLS(), toNeuronRowOnDLS());
-}
-
-SynapseQuadColumnOnDLS NeuronConfigOnDLS::toSynapseQuadColumnOnDLS() const
-{
-	return toSynapseOnSynapseRow().toSynapseQuadColumnOnDLS();
-}
-
-EntryOnQuad NeuronConfigOnDLS::toEntryOnQuad() const
-{
-	return toSynapseOnSynapseRow().toEntryOnQuad();
-}
-
-NeuronBackendConfigBlockOnDLS NeuronConfigOnDLS::toNeuronBackendConfigBlockOnDLS() const
-{
-	return toAtomicNeuronOnDLS().toNeuronBackendConfigOnDLS().toNeuronBackendConfigBlockOnDLS();
-}
-
-NeuronBackendConfigOnNeuronBackendConfigBlock
-NeuronConfigOnDLS::toNeuronBackendConfigOnNeuronBackendConfigBlock() const
-{
-	return toAtomicNeuronOnDLS()
-	    .toNeuronBackendConfigOnDLS()
-	    .toNeuronBackendConfigOnNeuronBackendConfigBlock();
-}
-
-NeuronBackendConfigOnDLS NeuronConfigOnDLS::toNeuronBackendConfigOnDLS() const
-{
-	return toAtomicNeuronOnDLS().toNeuronBackendConfigOnDLS();
-}
-
-CommonNeuronBackendConfigOnDLS NeuronConfigOnDLS::toCommonNeuronBackendConfigOnDLS() const
-{
-	return toNeuronBackendConfigBlockOnDLS().toCommonNeuronBackendConfigOnDLS();
-}
-
-NeuronColumnOnDLS NeuronBackendConfigOnDLS::toNeuronColumnOnDLS() const
-{
-	return NeuronColumnOnDLS(
-	    (toNeuronBackendConfigOnNeuronBackendConfigBlock() %
-	     NeuronConfigOnNeuronConfigBlock::size) +
-	    (toNeuronBackendConfigBlockOnDLS() * NeuronConfigOnNeuronConfigBlock::size));
-}
-
-NeuronRowOnDLS NeuronBackendConfigOnDLS::toNeuronRowOnDLS() const
-{
-	return NeuronRowOnDLS(
-	    toNeuronBackendConfigOnNeuronBackendConfigBlock() / NeuronConfigOnNeuronConfigBlock::size);
-}
-
-AtomicNeuronOnDLS NeuronBackendConfigOnDLS::toAtomicNeuronOnDLS() const
-{
-	return AtomicNeuronOnDLS(toNeuronColumnOnDLS(), toNeuronRowOnDLS());
-}
-
-NeuronConfigOnDLS NeuronBackendConfigOnDLS::toNeuronConfigOnDLS() const
-{
-	return toAtomicNeuronOnDLS().toNeuronConfigOnDLS();
-}
-
-SpikeCounterReadOnDLS NeuronBackendConfigOnDLS::toSpikeCounterReadOnDLS() const
-{
-	return toNeuronConfigOnDLS().toSpikeCounterReadOnDLS();
-}
-
-SpikeCounterResetOnDLS NeuronBackendConfigOnDLS::toSpikeCounterResetOnDLS() const
-{
-	return toNeuronConfigOnDLS().toSpikeCounterResetOnDLS();
-}
-
-CommonNeuronBackendConfigOnDLS NeuronBackendConfigOnDLS::toCommonNeuronBackendConfigOnDLS() const
-{
-	return toNeuronBackendConfigBlockOnDLS().toCommonNeuronBackendConfigOnDLS();
-}
-
-SynramOnDLS AtomicNeuronOnDLS::toSynramOnDLS() const
-{
-	return toNeuronRowOnDLS().toSynramOnDLS();
-}
-
-SynramOnDLS NeuronConfigOnDLS::toSynramOnDLS() const
-{
-	return toAtomicNeuronOnDLS().toSynramOnDLS();
-}
-
-SynramOnDLS NeuronBackendConfigOnDLS::toSynramOnDLS() const
-{
-	return toAtomicNeuronOnDLS().toSynramOnDLS();
-}
-
-NeuronConfigBlockOnDLS NeuronBackendConfigOnDLS::toNeuronConfigBlockOnDLS() const
-{
-	return toNeuronConfigOnDLS().toNeuronConfigBlockOnDLS();
-}
-
-SynapseQuadColumnOnDLS AtomicNeuronOnDLS::toSynapseQuadColumnOnDLS() const
-{
-	return toNeuronConfigOnDLS().toSynapseQuadColumnOnDLS();
-}
-
-ColumnCorrelationQuadOnDLS AtomicNeuronOnDLS::toColumnCorrelationQuadOnDLS() const
-{
-	return ColumnCorrelationQuadOnDLS(
-	    toSynapseQuadColumnOnDLS().toColumnCorrelationQuadOnSynram(), toSynramOnDLS());
-}
-
-ColumnCurrentQuadOnDLS AtomicNeuronOnDLS::toColumnCurrentQuadOnDLS() const
-{
-	return ColumnCurrentQuadOnDLS(
-	    toSynapseQuadColumnOnDLS().toColumnCurrentQuadOnSynram(), toSynramOnDLS());
-}
-
-ColumnCorrelationQuadOnDLS NeuronConfigOnDLS::toColumnCorrelationQuadOnDLS() const
-{
-	return toAtomicNeuronOnDLS().toColumnCorrelationQuadOnDLS();
-}
-
-ColumnCurrentQuadOnDLS NeuronConfigOnDLS::toColumnCurrentQuadOnDLS() const
-{
-	return toAtomicNeuronOnDLS().toColumnCurrentQuadOnDLS();
-}
-
-common::typed_array<NeuronResetOnDLS, EntryOnQuad> NeuronResetQuadOnDLS::toNeuronResetOnDLS() const
-{
-	common::typed_array<NeuronResetOnDLS, EntryOnQuad> ret;
-	auto const columns = toSynapseQuadColumnOnDLS().toNeuronColumnOnDLS();
-	for (auto const e : common::iter_all<EntryOnQuad>()) {
-		ret[e] =
-		    AtomicNeuronOnDLS(columns[e], toSynramOnDLS().toNeuronRowOnDLS()).toNeuronResetOnDLS();
-	}
-	return ret;
-}
-
-AtomicNeuronOnLogicalNeuron AtomicNeuronOnLogicalNeuron::get_neighbor(
-    Direction const& direction) const
-{
-	switch (direction) {
-		case Direction::left: {
-			AtomicNeuronOnLogicalNeuron neighbor(NeuronColumnOnLogicalNeuron(x().value() - 1), y());
-			return neighbor;
-		}
-		case Direction::right: {
-			AtomicNeuronOnLogicalNeuron neighbor(NeuronColumnOnLogicalNeuron(x().value() + 1), y());
-			return neighbor;
-		}
-		case Direction::opposite_row: {
-			AtomicNeuronOnLogicalNeuron neighbor(
-			    x(), NeuronRowOnLogicalNeuron((y().value() + 1) % NeuronRowOnLogicalNeuron::size));
-			return neighbor;
-		}
-		default: {
-#ifndef __ppu__
-			throw std::logic_error(
-			    "Unsupported direction for neighbor for AtomicNeuronOnLogicalNeuron was chosen.");
-#else
-			exit(1);
-#endif
-		}
-	}
-}
-
-LogicalNeuronCompartments::LogicalNeuronCompartments(Compartments const& compartments)
-{
-	std::set<AtomicNeuronOnLogicalNeuron> unique;
-	size_t n = 0;
-	for (auto const& [_, compartment] : compartments) {
-		unique.insert(compartment.begin(), compartment.end());
-		n += compartment.size();
-	}
-	if (unique.size() != n) {
-#ifndef __ppu__
-		throw std::runtime_error("Multiple compartments contain the same neuron(s).");
-#else
-		exit(1);
-#endif
-	}
-	m_compartments = compartments;
-}
-
-LogicalNeuronCompartments::Compartments const& LogicalNeuronCompartments::get_compartments() const
-{
-	return m_compartments;
-}
-
-NeuronColumnOnLogicalNeuron LogicalNeuronCompartments::get_left_most_column() const
-{
-	NeuronColumnOnLogicalNeuron lmost(NeuronColumnOnLogicalNeuron::max);
-	for (auto const& [_, compartment] : m_compartments) {
-		auto const lm =
-		    std::min_element(
-		        compartment.begin(), compartment.end(),
-		        [](auto const& a, auto const& b) {
-			        return a.toNeuronColumnOnLogicalNeuron() < b.toNeuronColumnOnLogicalNeuron();
-		        })
-		        ->toNeuronColumnOnLogicalNeuron();
-		lmost = std::min(lm, lmost);
-	}
-	return lmost;
-}
-
-NeuronColumnOnLogicalNeuron LogicalNeuronCompartments::get_right_most_column() const
-{
-	NeuronColumnOnLogicalNeuron rmost(NeuronColumnOnLogicalNeuron::min);
-	for (auto const& [_, compartment] : m_compartments) {
-		auto const rm =
-		    std::max_element(
-		        compartment.begin(), compartment.end(),
-		        [](auto const& a, auto const& b) {
-			        return a.toNeuronColumnOnLogicalNeuron() < b.toNeuronColumnOnLogicalNeuron();
-		        })
-		        ->toNeuronColumnOnLogicalNeuron();
-		rmost = std::max(rm, rmost);
-	}
-	return rmost;
-}
-
-NeuronRowOnLogicalNeuron LogicalNeuronCompartments::get_top_most_row() const
-{
-	NeuronRowOnLogicalNeuron tmost(NeuronRowOnLogicalNeuron::max);
-	for (auto const& [_, compartment] : m_compartments) {
-		auto const tm =
-		    std::min_element(
-		        compartment.begin(), compartment.end(),
-		        [](auto const& a, auto const& b) {
-			        return a.toNeuronRowOnLogicalNeuron() < b.toNeuronRowOnLogicalNeuron();
-		        })
-		        ->toNeuronRowOnLogicalNeuron();
-		tmost = std::min(tm, tmost);
-	}
-	return tmost;
-}
-
-NeuronRowOnLogicalNeuron LogicalNeuronCompartments::get_bottom_most_row() const
-{
-	NeuronRowOnLogicalNeuron bmost(NeuronRowOnLogicalNeuron::min);
-	for (auto const& [_, compartment] : m_compartments) {
-		auto const bm =
-		    std::max_element(
-		        compartment.begin(), compartment.end(),
-		        [](auto const& a, auto const& b) {
-			        return a.toNeuronRowOnLogicalNeuron() < b.toNeuronRowOnLogicalNeuron();
-		        })
-		        ->toNeuronRowOnLogicalNeuron();
-		bmost = std::max(bm, bmost);
-	}
-	return bmost;
-}
-
-LogicalNeuronCompartments LogicalNeuronCompartments::flip_x() const
-{
-	Compartments flipped_compartments;
-	auto const lmost = get_left_most_column();
-	auto const rmost = get_right_most_column();
-	for (auto const& [index, compartment] : m_compartments) {
-		Compartment& flipped_compartment = flipped_compartments[index];
-		for (auto const& neuron : compartment) {
-			flipped_compartment.push_back(AtomicNeuronOnLogicalNeuron(
-			    NeuronColumnOnLogicalNeuron(
-			        lmost.value() + rmost.value() - neuron.toNeuronColumnOnLogicalNeuron().value()),
-			    neuron.toNeuronRowOnLogicalNeuron()));
-		}
-	}
-	return LogicalNeuronCompartments(flipped_compartments);
-}
-
-LogicalNeuronCompartments LogicalNeuronCompartments::flip_y() const
-{
-	Compartments flipped_compartments;
-	auto const tmost = get_top_most_row();
-	auto const bmost = get_bottom_most_row();
-	for (auto const& [index, compartment] : m_compartments) {
-		Compartment& flipped_compartment = flipped_compartments[index];
-		for (auto const& neuron : compartment) {
-			flipped_compartment.push_back(AtomicNeuronOnLogicalNeuron(
-			    neuron.toNeuronColumnOnLogicalNeuron(),
-			    NeuronRowOnLogicalNeuron(
-			        tmost.value() + bmost.value() - neuron.toNeuronRowOnLogicalNeuron().value())));
-		}
-	}
-	return LogicalNeuronCompartments(flipped_compartments);
-}
-
-bool LogicalNeuronCompartments::operator==(LogicalNeuronCompartments const& other) const
-{
-	return m_compartments == other.m_compartments;
-}
-
-bool LogicalNeuronCompartments::operator!=(LogicalNeuronCompartments const& other) const
-{
-	return !(*this == other);
-}
-
-bool LogicalNeuronCompartments::operator<(LogicalNeuronCompartments const& other) const
-{
-	return m_compartments < other.m_compartments;
-}
-
-bool LogicalNeuronCompartments::operator>(LogicalNeuronCompartments const& other) const
-{
-	return m_compartments > other.m_compartments;
-}
-
-bool LogicalNeuronCompartments::operator<=(LogicalNeuronCompartments const& other) const
-{
-	return m_compartments <= other.m_compartments;
-}
-
-bool LogicalNeuronCompartments::operator>=(LogicalNeuronCompartments const& other) const
-{
-	return m_compartments >= other.m_compartments;
-}
-
-#ifndef __ppu__
-std::ostream& operator<<(std::ostream& os, LogicalNeuronCompartments const& config)
-{
-	os << "LogicalNeuronCompartments(\n";
-	for (auto const& [index, compartment] : config.m_compartments) {
-		os << index << "\n";
-		for (auto const& neuron : compartment) {
-			os << "\t" << neuron << "\n";
-		}
-	}
-	os << ")";
-	return os;
-}
-
-template <typename Archive>
-void LogicalNeuronCompartments::serialize(Archive& ar, uint32_t const)
-{
-	ar(m_compartments);
-}
-#endif
-
-LogicalNeuronOnDLS::LogicalNeuronOnDLS(
-    LogicalNeuronCompartments const& compartments, AtomicNeuronOnDLS const& anchor)
-{
-	auto const lmost = compartments.get_left_most_column();
-	auto const rmost = compartments.get_right_most_column();
-	auto const bmost = compartments.get_bottom_most_row();
-	auto const tmost = compartments.get_top_most_row();
-	auto const height = bmost.value() - tmost.value();
-	auto const width = rmost.value() - lmost.value();
-
-	if ((anchor.toNeuronRowOnDLS().value() + height) > NeuronRowOnDLS::max) {
-#ifndef __ppu__
-		throw std::runtime_error(
-		    "LogicalNeuron anchor results in placement of compartments outside of neuron grid.");
-#else
-		exit(1);
-#endif
-	}
-	if ((((anchor.toNeuronColumnOnDLS().value()) < NeuronColumnOnLogicalNeuron::max) &&
-	     ((anchor.toNeuronColumnOnDLS().value() + width) > NeuronColumnOnLogicalNeuron::max)) ||
-	    (((anchor.toNeuronColumnOnDLS().value()) > NeuronColumnOnLogicalNeuron::max) &&
-	     ((anchor.toNeuronColumnOnDLS().value() + width) > NeuronColumnOnDLS::max))) {
-#ifndef __ppu__
-		throw std::runtime_error(
-		    "LogicalNeuron anchor results in placement of compartments outside of neuron grid.");
-#else
-		exit(1);
-#endif
-	}
-	for (auto const& [index, compartment] : compartments.get_compartments()) {
-		auto& placed_compartment = m_compartments[index];
-		for (auto const& neuron : compartment) {
-			placed_compartment.push_back(AtomicNeuronOnDLS(
-			    NeuronColumnOnDLS(
-			        anchor.toNeuronColumnOnDLS().value() +
-			        neuron.toNeuronColumnOnLogicalNeuron().value() - lmost.value()),
-			    NeuronRowOnDLS(
-			        anchor.toNeuronRowOnDLS().value() +
-			        neuron.toNeuronRowOnLogicalNeuron().value() - tmost.value())));
-		}
-	}
-}
-
-LogicalNeuronOnDLS::PlacedCompartments LogicalNeuronOnDLS::get_placed_compartments() const
-{
-	return m_compartments;
-}
-
-bool LogicalNeuronOnDLS::operator==(LogicalNeuronOnDLS const& other) const
-{
-	return (m_compartments == other.m_compartments);
-}
-
-bool LogicalNeuronOnDLS::operator!=(LogicalNeuronOnDLS const& other) const
-{
-	return !(*this == other);
-}
-
-bool LogicalNeuronOnDLS::operator<(LogicalNeuronOnDLS const& other) const
-{
-	return m_compartments < other.m_compartments;
-}
-
-bool LogicalNeuronOnDLS::operator>(LogicalNeuronOnDLS const& other) const
-{
-	return m_compartments > other.m_compartments;
-}
-
-bool LogicalNeuronOnDLS::operator<=(LogicalNeuronOnDLS const& other) const
-{
-	return m_compartments <= other.m_compartments;
-}
-
-bool LogicalNeuronOnDLS::operator>=(LogicalNeuronOnDLS const& other) const
-{
-	return m_compartments >= other.m_compartments;
-}
-
-#ifndef __ppu__
-std::ostream& operator<<(std::ostream& os, LogicalNeuronOnDLS const& config)
-{
-	os << "LogicalNeuronOnDLS(\n";
-	for (auto const& [index, compartment] : config.m_compartments) {
-		os << index << "\n";
-		for (auto const& neuron : compartment) {
-			os << "\t" << neuron << "\n";
-		}
-	}
-	os << ")";
-	return os;
-}
-
-template <typename Archive>
-void LogicalNeuronOnDLS::serialize(Archive& ar, uint32_t const)
-{
-	ar(m_compartments);
-}
-#endif
diff --git a/include/halco/hicann-dls/vx/switch_rows_ns_includes.h b/include/halco/hicann-dls/vx/switch_rows.h
similarity index 85%
rename from include/halco/hicann-dls/vx/switch_rows_ns_includes.h
rename to include/halco/hicann-dls/vx/switch_rows.h
index 093a2e5e11c71d762051bf7b7014e69b3e90ec65..05f5f164b7c1dc1aacaa24158dff55c1801ee15b 100644
--- a/include/halco/hicann-dls/vx/switch_rows_ns_includes.h
+++ b/include/halco/hicann-dls/vx/switch_rows.h
@@ -1,10 +1,11 @@
-#include <stdint.h>
-
+#pragma once
 #include "halco/common/genpybind.h"
 #include "halco/common/geometry.h"
-
 #include "halco/hicann-dls/vx/synapse.h"
 #include "halco/hicann-dls/vx/synram.h"
+#include <stdint.h>
+
+namespace halco::hicann_dls::vx GENPYBIND_TAG_HALCO_HICANN_DLS_VX {
 
 /************************\
   ColumnCorrelationQuad
@@ -100,3 +101,14 @@ struct GENPYBIND(inline_base("*SynramMixin*")) ColumnCurrentQuadOnDLS
 		return This();
 	}
 };
+
+} // namespace halco::hicann_dls::vx::v3
+
+namespace std {
+
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::ColumnCorrelationQuadOnSynram)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::ColumnCurrentQuadOnSynram)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::ColumnCorrelationQuadOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::ColumnCurrentQuadOnDLS)
+
+} // namespace std
diff --git a/include/halco/hicann-dls/vx/synapse.h b/include/halco/hicann-dls/vx/synapse.h
index dbfc335516d689a780c4e2fa963c75fceec70e5f..96c00f6f28fa017d2b7bdad05b8e94b0deaab9a0 100644
--- a/include/halco/hicann-dls/vx/synapse.h
+++ b/include/halco/hicann-dls/vx/synapse.h
@@ -17,6 +17,15 @@ struct SynapseRowOnDLS;
 struct SynapseWeightRowOnDLS;
 struct SynapseLabelRowOnDLS;
 struct SynapseCorrelationCalibRowOnDLS;
+struct ColumnCorrelationQuadOnSynram;
+struct ColumnCurrentQuadOnSynram;
+struct NeuronColumnOnDLS;
+struct SynapseQuadOnDLS;
+struct SynapseWeightQuadOnDLS;
+struct SynapseLabelQuadOnDLS;
+struct SynapseCorrelationCalibQuadOnDLS;
+struct SynapseRowOnSynram;
+struct CADCChannelColumnOnSynram;
 
 /***********\
    Synapse
@@ -259,6 +268,209 @@ struct GENPYBIND(inline_base("*")) SynapseBlockOnDLS
 	static const SynapseBlockOnDLS bottom;
 };
 
+
+struct GENPYBIND(inline_base("*")) SynapseQuadColumnOnDLS
+    : public common::detail::RantWrapper<SynapseQuadColumnOnDLS, uint_fast16_t, 63, 0>
+    , public common::detail::XRangedTrait
+{
+	constexpr explicit SynapseQuadColumnOnDLS(uintmax_t const val = 0)
+	    GENPYBIND(implicit_conversion) :
+	    rant_t(val)
+	{}
+
+	constexpr explicit SynapseQuadColumnOnDLS(common::X const& x) GENPYBIND(implicit_conversion) :
+	    rant_t(x)
+	{}
+
+	ColumnCorrelationQuadOnSynram toColumnCorrelationQuadOnSynram() const;
+	ColumnCurrentQuadOnSynram toColumnCurrentQuadOnSynram() const;
+	typedef common::typed_array<NeuronColumnOnDLS, EntryOnQuad> neuron_column_type
+	    GENPYBIND(opaque(false));
+	neuron_column_type toNeuronColumnOnDLS() const;
+};
+
+struct GENPYBIND(inline_base("*")) SynapseQuadOnSynram
+    : public common::detail::
+          GridCoordinate<SynapseQuadOnSynram, SynapseQuadColumnOnDLS, SynapseRowOnSynram>
+{
+	GRID_COMMON_CONSTRUCTORS(SynapseQuadOnSynram)
+
+	SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const
+	{
+		return x();
+	}
+	SynapseRowOnSynram toSynapseRowOnSynram() const
+	{
+		return y();
+	}
+};
+
+struct GENPYBIND(inline_base("*SynramMixin*")) SynapseQuadOnDLS
+    : public SynramMixin<SynapseQuadOnDLS, SynapseQuadOnSynram>
+{
+	SynapseQuadOnDLS() = default;
+
+	explicit SynapseQuadOnDLS(
+	    SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) :
+	    mixin_t(block, synram)
+	{}
+
+	explicit SynapseQuadOnDLS(enum_type const& e) : mixin_t(e) {}
+
+	SynapseQuadOnSynram toSynapseQuadOnSynram() const
+	{
+		return This();
+	}
+
+	NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const;
+	SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const;
+	SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const;
+	SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const;
+};
+
+struct GENPYBIND(inline_base("*SynramMixin*")) CorrelationResetOnDLS
+    : public SynramMixin<CorrelationResetOnDLS, SynapseQuadOnSynram>
+{
+	CorrelationResetOnDLS() = default;
+
+	explicit CorrelationResetOnDLS(
+	    SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) :
+	    mixin_t(block, synram)
+	{}
+
+	explicit CorrelationResetOnDLS(enum_type const& e) : mixin_t(e) {}
+
+	SynapseQuadOnSynram toSynapseQuadOnSynram() const
+	{
+		return This();
+	}
+};
+
+struct GENPYBIND(inline_base("*SynramMixin*")) SynapseWeightQuadOnDLS
+    : public SynramMixin<SynapseWeightQuadOnDLS, SynapseQuadOnSynram>
+{
+	SynapseWeightQuadOnDLS() = default;
+
+	explicit SynapseWeightQuadOnDLS(
+	    SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) :
+	    mixin_t(block, synram)
+	{}
+
+	explicit SynapseWeightQuadOnDLS(enum_type const& e) : mixin_t(e) {}
+
+	SynapseQuadOnSynram toSynapseQuadOnSynram() const
+	{
+		return This();
+	}
+
+	NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const;
+	SynapseQuadOnDLS toSynapseQuadOnDLS() const;
+	SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const;
+	SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const;
+};
+
+
+struct GENPYBIND(inline_base("*SynramMixin*")) SynapseLabelQuadOnDLS
+    : public SynramMixin<SynapseLabelQuadOnDLS, SynapseQuadOnSynram>
+{
+	SynapseLabelQuadOnDLS() = default;
+
+	explicit SynapseLabelQuadOnDLS(
+	    SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) :
+	    mixin_t(block, synram)
+	{}
+
+	explicit SynapseLabelQuadOnDLS(enum_type const& e) : mixin_t(e) {}
+
+	SynapseQuadOnSynram toSynapseQuadOnSynram() const
+	{
+		return This();
+	}
+
+	NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const;
+	SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const;
+	SynapseQuadOnDLS toSynapseQuadOnDLS() const;
+	SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const;
+};
+
+
+struct GENPYBIND(inline_base("*SynramMixin*")) SynapseCorrelationCalibQuadOnDLS
+    : public SynramMixin<SynapseCorrelationCalibQuadOnDLS, SynapseQuadOnSynram>
+{
+	SynapseCorrelationCalibQuadOnDLS() = default;
+
+	explicit SynapseCorrelationCalibQuadOnDLS(
+	    SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) :
+	    mixin_t(block, synram)
+	{}
+
+	explicit SynapseCorrelationCalibQuadOnDLS(enum_type const& e) : mixin_t(e) {}
+
+	SynapseQuadOnSynram toSynapseQuadOnSynram() const
+	{
+		return This();
+	}
+
+	NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const;
+	SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const;
+	SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const;
+	SynapseQuadOnDLS toSynapseQuadOnDLS() const;
+};
+
+
+struct GENPYBIND(inline_base("*")) SynapseOnSynapseRow
+    : public common::detail::RantWrapper<SynapseOnSynapseRow, uint_fast16_t, 255, 0>
+    , public common::detail::XRangedTrait
+{
+	constexpr explicit SynapseOnSynapseRow(uintmax_t const value = 0)
+	    GENPYBIND(implicit_conversion) :
+	    rant_t(value)
+	{}
+
+	explicit SynapseOnSynapseRow(
+	    EntryOnQuad const& syn_on_quad, SynapseQuadColumnOnDLS const& quad);
+
+	EntryOnQuad toEntryOnQuad() const;
+	SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const;
+	NeuronColumnOnDLS toNeuronColumnOnDLS() const;
+	CADCChannelColumnOnSynram toCADCChannelColumnOnSynram() const;
+};
+
+struct GENPYBIND(inline_base("*")) SynapseOnSynram
+    : public common::detail::
+          GridCoordinate<SynapseOnSynram, SynapseOnSynapseRow, SynapseRowOnSynram>
+{
+	GRID_COMMON_CONSTRUCTORS(SynapseOnSynram)
+
+	SynapseOnSynapseRow toSynapseOnSynapseRow() const
+	{
+		return x();
+	}
+
+	SynapseRowOnSynram toSynapseRowOnSynram() const
+	{
+		return y();
+	}
+};
+
+struct GENPYBIND(inline_base("*SynramMixin*")) SynapseOnDLS
+    : public SynramMixin<SynapseOnDLS, SynapseOnSynram>
+{
+	SynapseOnDLS() = default;
+
+	explicit SynapseOnDLS(
+	    SynapseOnSynram const& synapse, SynramOnDLS const& synram = SynramOnDLS()) :
+	    mixin_t(synapse, synram)
+	{}
+
+	explicit SynapseOnDLS(enum_type const& e) : mixin_t(e) {}
+
+	SynapseOnSynram toSynapseOnSynram() const
+	{
+		return This();
+	}
+};
+
 } // namespace halco::hicann_dls::vx
 
 namespace std {
@@ -277,5 +489,15 @@ HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseWeightMatrixOnDLS)
 HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseLabelMatrixOnDLS)
 HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseCorrelationCalibMatrixOnDLS)
 HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseBlockOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseQuadColumnOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseQuadOnSynram)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseOnSynapseRow)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseOnSynram)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseQuadOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseWeightQuadOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseLabelQuadOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseCorrelationCalibQuadOnDLS)
+HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CorrelationResetOnDLS)
 
 } // namespace std
diff --git a/include/halco/hicann-dls/vx/synapse_ns_includes.h b/include/halco/hicann-dls/vx/synapse_ns_includes.h
deleted file mode 100644
index 888c576238ea9a64cdfc6ea9f613350c48aa4dd1..0000000000000000000000000000000000000000
--- a/include/halco/hicann-dls/vx/synapse_ns_includes.h
+++ /dev/null
@@ -1,176 +0,0 @@
-struct ColumnCorrelationQuadOnSynram;
-struct ColumnCurrentQuadOnSynram;
-struct NeuronColumnOnDLS;
-struct SynapseQuadOnDLS;
-struct SynapseWeightQuadOnDLS;
-struct SynapseLabelQuadOnDLS;
-struct SynapseCorrelationCalibQuadOnDLS;
-
-using SynapseRowOnSynapseDriver GENPYBIND(visible) =
-    halco::hicann_dls::vx::SynapseRowOnSynapseDriver;
-using SynapseRowOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseRowOnSynram;
-using SynapseRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseRowOnDLS;
-using SynapseWeightRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightRowOnDLS;
-using SynapseLabelRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelRowOnDLS;
-using SynapseCorrelationCalibRowOnDLS GENPYBIND(visible) =
-    halco::hicann_dls::vx::SynapseCorrelationCalibRowOnDLS;
-using CorrelationResetRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CorrelationResetRowOnDLS;
-using ColumnCorrelationRowOnDLS GENPYBIND(visible) =
-    halco::hicann_dls::vx::ColumnCorrelationRowOnDLS;
-using ColumnCurrentRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::ColumnCurrentRowOnDLS;
-using SynapticInputOnNeuron GENPYBIND(visible) = halco::hicann_dls::vx::SynapticInputOnNeuron;
-using SynapseBiasSelectionOnDLS GENPYBIND(visible) =
-    halco::hicann_dls::vx::SynapseBiasSelectionOnDLS;
-using SynapseWeightMatrixOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightMatrixOnDLS;
-using SynapseLabelMatrixOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelMatrixOnDLS;
-using SynapseCorrelationCalibMatrixOnDLS GENPYBIND(visible) =
-    halco::hicann_dls::vx::SynapseCorrelationCalibMatrixOnDLS;
-using SynapseBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseBlockOnDLS;
-
-struct GENPYBIND(inline_base("*")) SynapseQuadColumnOnDLS
-    : public common::detail::RantWrapper<SynapseQuadColumnOnDLS, uint_fast16_t, 63, 0>
-    , public common::detail::XRangedTrait
-{
-	constexpr explicit SynapseQuadColumnOnDLS(uintmax_t const val = 0)
-	    GENPYBIND(implicit_conversion) :
-	    rant_t(val)
-	{}
-
-	constexpr explicit SynapseQuadColumnOnDLS(common::X const& x) GENPYBIND(implicit_conversion) :
-	    rant_t(x)
-	{}
-
-	ColumnCorrelationQuadOnSynram toColumnCorrelationQuadOnSynram() const;
-	ColumnCurrentQuadOnSynram toColumnCurrentQuadOnSynram() const;
-	typedef common::typed_array<NeuronColumnOnDLS, EntryOnQuad> neuron_column_type
-	    GENPYBIND(opaque(false));
-	neuron_column_type toNeuronColumnOnDLS() const;
-};
-
-struct GENPYBIND(inline_base("*")) SynapseQuadOnSynram
-    : public common::detail::
-          GridCoordinate<SynapseQuadOnSynram, SynapseQuadColumnOnDLS, SynapseRowOnSynram>
-{
-	GRID_COMMON_CONSTRUCTORS(SynapseQuadOnSynram)
-
-	SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const
-	{
-		return x();
-	}
-	SynapseRowOnSynram toSynapseRowOnSynram() const
-	{
-		return y();
-	}
-};
-
-struct GENPYBIND(inline_base("*SynramMixin*")) SynapseQuadOnDLS
-    : public SynramMixin<SynapseQuadOnDLS, SynapseQuadOnSynram>
-{
-	SynapseQuadOnDLS() = default;
-
-	explicit SynapseQuadOnDLS(
-	    SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) :
-	    mixin_t(block, synram)
-	{}
-
-	explicit SynapseQuadOnDLS(enum_type const& e) : mixin_t(e) {}
-
-	SynapseQuadOnSynram toSynapseQuadOnSynram() const
-	{
-		return This();
-	}
-
-	NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const;
-	SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const;
-	SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const;
-	SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const;
-};
-
-struct GENPYBIND(inline_base("*SynramMixin*")) CorrelationResetOnDLS
-    : public SynramMixin<CorrelationResetOnDLS, SynapseQuadOnSynram>
-{
-	CorrelationResetOnDLS() = default;
-
-	explicit CorrelationResetOnDLS(
-	    SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) :
-	    mixin_t(block, synram)
-	{}
-
-	explicit CorrelationResetOnDLS(enum_type const& e) : mixin_t(e) {}
-
-	SynapseQuadOnSynram toSynapseQuadOnSynram() const
-	{
-		return This();
-	}
-};
-
-struct GENPYBIND(inline_base("*SynramMixin*")) SynapseWeightQuadOnDLS
-    : public SynramMixin<SynapseWeightQuadOnDLS, SynapseQuadOnSynram>
-{
-	SynapseWeightQuadOnDLS() = default;
-
-	explicit SynapseWeightQuadOnDLS(
-	    SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) :
-	    mixin_t(block, synram)
-	{}
-
-	explicit SynapseWeightQuadOnDLS(enum_type const& e) : mixin_t(e) {}
-
-	SynapseQuadOnSynram toSynapseQuadOnSynram() const
-	{
-		return This();
-	}
-
-	NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const;
-	SynapseQuadOnDLS toSynapseQuadOnDLS() const;
-	SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const;
-	SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const;
-};
-
-
-struct GENPYBIND(inline_base("*SynramMixin*")) SynapseLabelQuadOnDLS
-    : public SynramMixin<SynapseLabelQuadOnDLS, SynapseQuadOnSynram>
-{
-	SynapseLabelQuadOnDLS() = default;
-
-	explicit SynapseLabelQuadOnDLS(
-	    SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) :
-	    mixin_t(block, synram)
-	{}
-
-	explicit SynapseLabelQuadOnDLS(enum_type const& e) : mixin_t(e) {}
-
-	SynapseQuadOnSynram toSynapseQuadOnSynram() const
-	{
-		return This();
-	}
-
-	NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const;
-	SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const;
-	SynapseQuadOnDLS toSynapseQuadOnDLS() const;
-	SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const;
-};
-
-
-struct GENPYBIND(inline_base("*SynramMixin*")) SynapseCorrelationCalibQuadOnDLS
-    : public SynramMixin<SynapseCorrelationCalibQuadOnDLS, SynapseQuadOnSynram>
-{
-	SynapseCorrelationCalibQuadOnDLS() = default;
-
-	explicit SynapseCorrelationCalibQuadOnDLS(
-	    SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) :
-	    mixin_t(block, synram)
-	{}
-
-	explicit SynapseCorrelationCalibQuadOnDLS(enum_type const& e) : mixin_t(e) {}
-
-	SynapseQuadOnSynram toSynapseQuadOnSynram() const
-	{
-		return This();
-	}
-
-	NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const;
-	SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const;
-	SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const;
-	SynapseQuadOnDLS toSynapseQuadOnDLS() const;
-};
diff --git a/include/halco/hicann-dls/vx/synapse_ns_includes_impl.h b/include/halco/hicann-dls/vx/synapse_ns_includes_impl.h
deleted file mode 100644
index 877354ff727b1e4b1c32779c2b8e0c1ee1768683..0000000000000000000000000000000000000000
--- a/include/halco/hicann-dls/vx/synapse_ns_includes_impl.h
+++ /dev/null
@@ -1,94 +0,0 @@
-ColumnCorrelationQuadOnSynram SynapseQuadColumnOnDLS::toColumnCorrelationQuadOnSynram() const
-{
-	return ColumnCorrelationQuadOnSynram(toEnum());
-}
-
-ColumnCurrentQuadOnSynram SynapseQuadColumnOnDLS::toColumnCurrentQuadOnSynram() const
-{
-	return ColumnCurrentQuadOnSynram(toEnum());
-}
-
-SynapseWeightQuadOnDLS SynapseQuadOnDLS::toSynapseWeightQuadOnDLS() const
-{
-	return SynapseWeightQuadOnDLS(toEnum());
-}
-
-SynapseLabelQuadOnDLS SynapseQuadOnDLS::toSynapseLabelQuadOnDLS() const
-{
-	return SynapseLabelQuadOnDLS(toEnum());
-}
-
-SynapseCorrelationCalibQuadOnDLS SynapseQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const
-{
-	return SynapseCorrelationCalibQuadOnDLS(toEnum());
-}
-
-NeuronConfigBlockOnDLS SynapseWeightQuadOnDLS::toNeuronConfigBlockOnDLS() const
-{
-	return toSynapseQuadOnDLS().toNeuronConfigBlockOnDLS();
-}
-
-SynapseQuadOnDLS SynapseWeightQuadOnDLS::toSynapseQuadOnDLS() const
-{
-	return SynapseQuadOnDLS(toEnum());
-}
-
-SynapseLabelQuadOnDLS SynapseWeightQuadOnDLS::toSynapseLabelQuadOnDLS() const
-{
-	return SynapseLabelQuadOnDLS(toEnum());
-}
-
-SynapseCorrelationCalibQuadOnDLS SynapseWeightQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const
-{
-	return SynapseCorrelationCalibQuadOnDLS(toEnum());
-}
-
-NeuronConfigBlockOnDLS SynapseLabelQuadOnDLS::toNeuronConfigBlockOnDLS() const
-{
-	return toSynapseQuadOnDLS().toNeuronConfigBlockOnDLS();
-}
-
-SynapseWeightQuadOnDLS SynapseLabelQuadOnDLS::toSynapseWeightQuadOnDLS() const
-{
-	return SynapseWeightQuadOnDLS(toEnum());
-}
-
-SynapseQuadOnDLS SynapseLabelQuadOnDLS::toSynapseQuadOnDLS() const
-{
-	return SynapseQuadOnDLS(toEnum());
-}
-
-SynapseCorrelationCalibQuadOnDLS SynapseLabelQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const
-{
-	return SynapseCorrelationCalibQuadOnDLS(toEnum());
-}
-
-NeuronConfigBlockOnDLS SynapseCorrelationCalibQuadOnDLS::toNeuronConfigBlockOnDLS() const
-{
-	return toSynapseQuadOnDLS().toNeuronConfigBlockOnDLS();
-}
-
-SynapseWeightQuadOnDLS SynapseCorrelationCalibQuadOnDLS::toSynapseWeightQuadOnDLS() const
-{
-	return SynapseWeightQuadOnDLS(toEnum());
-}
-
-SynapseLabelQuadOnDLS SynapseCorrelationCalibQuadOnDLS::toSynapseLabelQuadOnDLS() const
-{
-	return SynapseLabelQuadOnDLS(toEnum());
-}
-
-SynapseQuadOnDLS SynapseCorrelationCalibQuadOnDLS::toSynapseQuadOnDLS() const
-{
-	return SynapseQuadOnDLS(toEnum());
-}
-
-NeuronColumnOnDLS SynapseOnSynapseRow::toNeuronColumnOnDLS() const
-{
-	return NeuronColumnOnDLS(toEnum());
-}
-
-CADCChannelColumnOnSynram SynapseOnSynapseRow::toCADCChannelColumnOnSynram() const
-{
-	return CADCChannelColumnOnSynram(toEnum());
-}
diff --git a/include/halco/hicann-dls/vx/v2/cadc.h b/include/halco/hicann-dls/vx/v2/cadc.h
index d09fe4cf8bcf0ebec4e532e7dd94fda1f12c17da..b6e6ee1c076569f6ad7dd6c387c4a4fa15146dd7 100644
--- a/include/halco/hicann-dls/vx/v2/cadc.h
+++ b/include/halco/hicann-dls/vx/v2/cadc.h
@@ -1,20 +1,25 @@
 #pragma once
 #include "halco/common/genpybind.h"
 #include "halco/hicann-dls/vx/cadc.h"
-#include "halco/hicann-dls/vx/v2/synapse.h"
 
 namespace halco::hicann_dls::vx::v2 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V2 {
 
-#include "halco/hicann-dls/vx/cadc_ns_includes.h"
+using CADCOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCOnDLS;
+using CADCConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCConfigOnDLS;
+using CADCChannelType GENPYBIND(visible) = halco::hicann_dls::vx::CADCChannelType;
+using CADCReadoutType GENPYBIND(visible) = halco::hicann_dls::vx::CADCReadoutType;
+using CADCChannelColumnOnSynram GENPYBIND(visible) =
+    halco::hicann_dls::vx::CADCChannelColumnOnSynram;
+using CADCSampleRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleRowOnDLS;
+using CADCOffsetSRAMTimingConfigOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::CADCOffsetSRAMTimingConfigOnDLS;
+using CADCSamplesOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSamplesOnDLS;
+using CADCSampleQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleQuadOnDLS;
+using CADCChannelConfigOnSynram GENPYBIND(visible) =
+    halco::hicann_dls::vx::CADCChannelConfigOnSynram;
+using CADCChannelConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCChannelConfigOnDLS;
+using CADCSampleQuadUnspecifiedReadoutOnSynram GENPYBIND(visible) =
+    halco::hicann_dls::vx::CADCSampleQuadUnspecifiedReadoutOnSynram;
+using CADCSampleQuadOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleQuadOnSynram;
 
 } // namespace halco::hicann_dls::vx::v2
-
-namespace std {
-
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::CADCSampleQuadOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::CADCChannelConfigOnSynram)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::CADCChannelConfigOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::CADCSampleQuadUnspecifiedReadoutOnSynram)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::CADCSampleQuadOnSynram)
-
-} // namespace std
diff --git a/include/halco/hicann-dls/vx/v2/neuron.h b/include/halco/hicann-dls/vx/v2/neuron.h
index 959972c127ab9a7440392550ecf743df62c4d6bd..e3c4c3a079bf6ccb687487487350f389a1a813a7 100644
--- a/include/halco/hicann-dls/vx/v2/neuron.h
+++ b/include/halco/hicann-dls/vx/v2/neuron.h
@@ -2,34 +2,56 @@
 #include "halco/common/genpybind.h"
 #include "halco/common/iter_all.h"
 #include "halco/hicann-dls/vx/neuron.h"
-#include "halco/hicann-dls/vx/v2/cadc.h"
-#include "halco/hicann-dls/vx/v2/capmem.h"
-#include "halco/hicann-dls/vx/v2/chip.h"
-#include "halco/hicann-dls/vx/v2/correlation.h"
-#include "halco/hicann-dls/vx/v2/padi.h"
-#include "halco/hicann-dls/vx/v2/ppu.h"
-#include "halco/hicann-dls/vx/v2/routing_crossbar.h"
-#include "halco/hicann-dls/vx/v2/switch_rows.h"
-#include "halco/hicann-dls/vx/v2/synapse.h"
-#include "halco/hicann-dls/vx/v2/synapse_driver.h"
-#include "halco/hicann-dls/vx/v2/synram.h"
-
-namespace cereal {
-class access;
-} // namespace cereal
 
 namespace halco::hicann_dls::vx::v2 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V2 {
 
-#include "halco/hicann-dls/vx/neuron_ns_includes.h"
+using NeuronRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronRowOnDLS;
+using NeuronConfigOnNeuronConfigBlock GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronConfigOnNeuronConfigBlock;
+using NeuronConfigBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronConfigBlockOnDLS;
+using NeuronBackendConfigOnNeuronBackendConfigBlock GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronBackendConfigOnNeuronBackendConfigBlock;
+using NeuronBackendConfigBlockOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronBackendConfigBlockOnDLS;
+using CommonNeuronBackendConfigOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::CommonNeuronBackendConfigOnDLS;
+using NeuronResetOnNeuronResetBlock GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronResetOnNeuronResetBlock;
+using NeuronResetBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetBlockOnDLS;
+using NeuronResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetOnDLS;
+using BlockPostPulseOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::BlockPostPulseOnDLS;
+using SpikeCounterReadOnSpikeCounterReadBlock GENPYBIND(visible) =
+    halco::hicann_dls::vx::SpikeCounterReadOnSpikeCounterReadBlock;
+using SpikeCounterReadBlockOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::SpikeCounterReadBlockOnDLS;
+using SpikeCounterReadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SpikeCounterReadOnDLS;
+using SpikeCounterResetOnSpikeCounterResetBlock GENPYBIND(visible) =
+    halco::hicann_dls::vx::SpikeCounterResetOnSpikeCounterResetBlock;
+using SpikeCounterResetBlockOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::SpikeCounterResetBlockOnDLS;
+using SpikeCounterResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SpikeCounterResetOnDLS;
+using NeuronEventOutputOnNeuronBackendBlock GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronEventOutputOnNeuronBackendBlock;
+using NeuronEventOutputOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronEventOutputOnDLS;
+using NeuronSRAMTimingConfigOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronSRAMTimingConfigOnDLS;
+using NeuronBackendSRAMTimingConfigOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronBackendSRAMTimingConfigOnDLS;
+using NeuronRowOnLogicalNeuron = halco::hicann_dls::vx::NeuronRowOnLogicalNeuron;
+using NeuronBlockOnDLS = halco::hicann_dls::vx::NeuronBlockOnDLS;
+using NeuronColumnOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronColumnOnDLS;
+using AtomicNeuronOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::AtomicNeuronOnDLS;
+using NeuronConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronConfigOnDLS;
+using NeuronBackendConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronBackendConfigOnDLS;
+using NeuronResetQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetQuadOnDLS;
+using LogicalNeuronOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::LogicalNeuronOnDLS;
+using LogicalNeuronCompartments GENPYBIND(visible) =
+    halco::hicann_dls::vx::LogicalNeuronCompartments;
+using AtomicNeuronOnLogicalNeuron GENPYBIND(visible) =
+    halco::hicann_dls::vx::AtomicNeuronOnLogicalNeuron;
+using NeuronColumnOnLogicalNeuron GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronColumnOnLogicalNeuron;
+using CompartmentOnLogicalNeuron GENPYBIND(visible) =
+    halco::hicann_dls::vx::CompartmentOnLogicalNeuron;
 
 } // namespace halco::hicann_dls::vx::v2
-
-namespace std {
-
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::NeuronColumnOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::AtomicNeuronOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::NeuronConfigOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::NeuronBackendConfigOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::NeuronResetQuadOnDLS)
-
-} // namespace std
diff --git a/include/halco/hicann-dls/vx/v2/switch_rows.h b/include/halco/hicann-dls/vx/v2/switch_rows.h
index b732122d6e5d6369323a0d43051e6a0567bb3971..dc65b5b4f541e246835661a5a1b5e9a7cf205296 100644
--- a/include/halco/hicann-dls/vx/v2/switch_rows.h
+++ b/include/halco/hicann-dls/vx/v2/switch_rows.h
@@ -1,19 +1,15 @@
 #pragma once
 #include "halco/common/genpybind.h"
-#include "halco/hicann-dls/vx/v2/synapse.h"
-#include "halco/hicann-dls/vx/v2/synram.h"
+#include "halco/hicann-dls/vx/switch_rows.h"
 
 namespace halco::hicann_dls::vx::v2 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V2 {
 
-#include "halco/hicann-dls/vx/switch_rows_ns_includes.h"
+using ColumnCorrelationQuadOnSynram GENPYBIND(visible) =
+    halco::hicann_dls::vx::ColumnCorrelationQuadOnSynram;
+using ColumnCurrentQuadOnSynram GENPYBIND(visible) =
+    halco::hicann_dls::vx::ColumnCurrentQuadOnSynram;
+using ColumnCorrelationQuadOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::ColumnCorrelationQuadOnDLS;
+using ColumnCurrentQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::ColumnCurrentQuadOnDLS;
 
 } // namespace halco::hicann_dls::vx::v2
-
-namespace std {
-
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::ColumnCorrelationQuadOnSynram)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::ColumnCurrentQuadOnSynram)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::ColumnCorrelationQuadOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::ColumnCurrentQuadOnDLS)
-
-} // namespace std
diff --git a/include/halco/hicann-dls/vx/v2/synapse.h b/include/halco/hicann-dls/vx/v2/synapse.h
index 16e763f8e32c23a36ae25f56a8382169df6b819e..0385a8cff750c78215f3696064922b9a5da6d603 100644
--- a/include/halco/hicann-dls/vx/v2/synapse.h
+++ b/include/halco/hicann-dls/vx/v2/synapse.h
@@ -2,79 +2,39 @@
 #include "halco/common/genpybind.h"
 #include "halco/hicann-dls/vx/cadc.h"
 #include "halco/hicann-dls/vx/synapse.h"
-#include "halco/hicann-dls/vx/v2/quad.h"
-#include "halco/hicann-dls/vx/v2/synram.h"
 
 namespace halco::hicann_dls::vx::v2 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V2 {
 
-#include "halco/hicann-dls/vx/synapse_ns_includes.h"
-
-struct GENPYBIND(inline_base("*")) SynapseOnSynapseRow
-    : public common::detail::RantWrapper<SynapseOnSynapseRow, uint_fast16_t, 255, 0>
-    , public common::detail::XRangedTrait
-{
-	constexpr explicit SynapseOnSynapseRow(uintmax_t const value = 0)
-	    GENPYBIND(implicit_conversion) :
-	    rant_t(value)
-	{}
-
-	explicit SynapseOnSynapseRow(
-	    EntryOnQuad const& syn_on_quad, SynapseQuadColumnOnDLS const& quad);
-
-	EntryOnQuad toEntryOnQuad() const;
-	SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const;
-	NeuronColumnOnDLS toNeuronColumnOnDLS() const;
-	CADCChannelColumnOnSynram toCADCChannelColumnOnSynram() const;
-};
-
-struct GENPYBIND(inline_base("*")) SynapseOnSynram
-    : public common::detail::
-          GridCoordinate<SynapseOnSynram, SynapseOnSynapseRow, SynapseRowOnSynram>
-{
-	GRID_COMMON_CONSTRUCTORS(SynapseOnSynram)
-
-	SynapseOnSynapseRow toSynapseOnSynapseRow() const
-	{
-		return x();
-	}
-
-	SynapseRowOnSynram toSynapseRowOnSynram() const
-	{
-		return y();
-	}
-};
-
-struct GENPYBIND(inline_base("*SynramMixin*")) SynapseOnDLS
-    : public SynramMixin<SynapseOnDLS, SynapseOnSynram>
-{
-	SynapseOnDLS() = default;
-
-	explicit SynapseOnDLS(
-	    SynapseOnSynram const& synapse, SynramOnDLS const& synram = SynramOnDLS()) :
-	    mixin_t(synapse, synram)
-	{}
-
-	explicit SynapseOnDLS(enum_type const& e) : mixin_t(e) {}
-
-	SynapseOnSynram toSynapseOnSynram() const
-	{
-		return This();
-	}
-};
+using SynapseRowOnSynapseDriver GENPYBIND(visible) =
+    halco::hicann_dls::vx::SynapseRowOnSynapseDriver;
+using SynapseRowOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseRowOnSynram;
+using SynapseRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseRowOnDLS;
+using SynapseWeightRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightRowOnDLS;
+using SynapseLabelRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelRowOnDLS;
+using SynapseCorrelationCalibRowOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::SynapseCorrelationCalibRowOnDLS;
+using CorrelationResetRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CorrelationResetRowOnDLS;
+using ColumnCorrelationRowOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::ColumnCorrelationRowOnDLS;
+using ColumnCurrentRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::ColumnCurrentRowOnDLS;
+using SynapticInputOnNeuron GENPYBIND(visible) = halco::hicann_dls::vx::SynapticInputOnNeuron;
+using SynapseBiasSelectionOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::SynapseBiasSelectionOnDLS;
+using SynapseWeightMatrixOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightMatrixOnDLS;
+using SynapseLabelMatrixOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelMatrixOnDLS;
+using SynapseCorrelationCalibMatrixOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::SynapseCorrelationCalibMatrixOnDLS;
+using SynapseBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseBlockOnDLS;
+using SynapseQuadColumnOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseQuadColumnOnDLS;
+using SynapseQuadOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseQuadOnSynram;
+using SynapseOnSynapseRow GENPYBIND(visible) = halco::hicann_dls::vx::SynapseOnSynapseRow;
+using SynapseOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseOnSynram;
+using SynapseOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseOnDLS;
+using SynapseQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseQuadOnDLS;
+using SynapseWeightQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightQuadOnDLS;
+using SynapseLabelQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelQuadOnDLS;
+using SynapseCorrelationCalibQuadOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::SynapseCorrelationCalibQuadOnDLS;
+using CorrelationResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CorrelationResetOnDLS;
 
 } // namespace halco::hicann_dls::vx::v2
-
-namespace std {
-
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseQuadColumnOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseQuadOnSynram)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseOnSynapseRow)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseOnSynram)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseQuadOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseWeightQuadOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseLabelQuadOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseCorrelationCalibQuadOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::CorrelationResetOnDLS)
-
-} // namespace std
diff --git a/include/halco/hicann-dls/vx/v3/cadc.h b/include/halco/hicann-dls/vx/v3/cadc.h
index f22fbcfa64cd394cff45f94bc2e58b5380a180c0..24a46c384de40ed8cf124d60866010fd73d6b209 100644
--- a/include/halco/hicann-dls/vx/v3/cadc.h
+++ b/include/halco/hicann-dls/vx/v3/cadc.h
@@ -1,20 +1,25 @@
 #pragma once
 #include "halco/common/genpybind.h"
 #include "halco/hicann-dls/vx/cadc.h"
-#include "halco/hicann-dls/vx/v3/synapse.h"
 
 namespace halco::hicann_dls::vx::v3 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V3 {
 
-#include "halco/hicann-dls/vx/cadc_ns_includes.h"
+using CADCOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCOnDLS;
+using CADCConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCConfigOnDLS;
+using CADCChannelType GENPYBIND(visible) = halco::hicann_dls::vx::CADCChannelType;
+using CADCReadoutType GENPYBIND(visible) = halco::hicann_dls::vx::CADCReadoutType;
+using CADCChannelColumnOnSynram GENPYBIND(visible) =
+    halco::hicann_dls::vx::CADCChannelColumnOnSynram;
+using CADCSampleRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleRowOnDLS;
+using CADCOffsetSRAMTimingConfigOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::CADCOffsetSRAMTimingConfigOnDLS;
+using CADCSamplesOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSamplesOnDLS;
+using CADCSampleQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleQuadOnDLS;
+using CADCChannelConfigOnSynram GENPYBIND(visible) =
+    halco::hicann_dls::vx::CADCChannelConfigOnSynram;
+using CADCChannelConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCChannelConfigOnDLS;
+using CADCSampleQuadUnspecifiedReadoutOnSynram GENPYBIND(visible) =
+    halco::hicann_dls::vx::CADCSampleQuadUnspecifiedReadoutOnSynram;
+using CADCSampleQuadOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleQuadOnSynram;
 
 } // namespace halco::hicann_dls::vx::v3
-
-namespace std {
-
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::CADCSampleQuadOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::CADCChannelConfigOnSynram)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::CADCChannelConfigOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::CADCSampleQuadUnspecifiedReadoutOnSynram)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::CADCSampleQuadOnSynram)
-
-} // namespace std
diff --git a/include/halco/hicann-dls/vx/v3/neuron.h b/include/halco/hicann-dls/vx/v3/neuron.h
index 4a841482907d34dac0ac32da92a218aa8d41e795..08aee054879b3f5148e52398ca9f0220772e6ff5 100644
--- a/include/halco/hicann-dls/vx/v3/neuron.h
+++ b/include/halco/hicann-dls/vx/v3/neuron.h
@@ -2,34 +2,56 @@
 #include "halco/common/genpybind.h"
 #include "halco/common/iter_all.h"
 #include "halco/hicann-dls/vx/neuron.h"
-#include "halco/hicann-dls/vx/v3/cadc.h"
-#include "halco/hicann-dls/vx/v3/capmem.h"
-#include "halco/hicann-dls/vx/v3/chip.h"
-#include "halco/hicann-dls/vx/v3/correlation.h"
-#include "halco/hicann-dls/vx/v3/padi.h"
-#include "halco/hicann-dls/vx/v3/ppu.h"
-#include "halco/hicann-dls/vx/v3/routing_crossbar.h"
-#include "halco/hicann-dls/vx/v3/switch_rows.h"
-#include "halco/hicann-dls/vx/v3/synapse.h"
-#include "halco/hicann-dls/vx/v3/synapse_driver.h"
-#include "halco/hicann-dls/vx/v3/synram.h"
-
-namespace cereal {
-class access;
-} // namespace cereal
 
 namespace halco::hicann_dls::vx::v3 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V3 {
 
-#include "halco/hicann-dls/vx/neuron_ns_includes.h"
+using NeuronRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronRowOnDLS;
+using NeuronConfigOnNeuronConfigBlock GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronConfigOnNeuronConfigBlock;
+using NeuronConfigBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronConfigBlockOnDLS;
+using NeuronBackendConfigOnNeuronBackendConfigBlock GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronBackendConfigOnNeuronBackendConfigBlock;
+using NeuronBackendConfigBlockOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronBackendConfigBlockOnDLS;
+using CommonNeuronBackendConfigOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::CommonNeuronBackendConfigOnDLS;
+using NeuronResetOnNeuronResetBlock GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronResetOnNeuronResetBlock;
+using NeuronResetBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetBlockOnDLS;
+using NeuronResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetOnDLS;
+using BlockPostPulseOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::BlockPostPulseOnDLS;
+using SpikeCounterReadOnSpikeCounterReadBlock GENPYBIND(visible) =
+    halco::hicann_dls::vx::SpikeCounterReadOnSpikeCounterReadBlock;
+using SpikeCounterReadBlockOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::SpikeCounterReadBlockOnDLS;
+using SpikeCounterReadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SpikeCounterReadOnDLS;
+using SpikeCounterResetOnSpikeCounterResetBlock GENPYBIND(visible) =
+    halco::hicann_dls::vx::SpikeCounterResetOnSpikeCounterResetBlock;
+using SpikeCounterResetBlockOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::SpikeCounterResetBlockOnDLS;
+using SpikeCounterResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SpikeCounterResetOnDLS;
+using NeuronEventOutputOnNeuronBackendBlock GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronEventOutputOnNeuronBackendBlock;
+using NeuronEventOutputOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronEventOutputOnDLS;
+using NeuronSRAMTimingConfigOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronSRAMTimingConfigOnDLS;
+using NeuronBackendSRAMTimingConfigOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronBackendSRAMTimingConfigOnDLS;
+using NeuronRowOnLogicalNeuron = halco::hicann_dls::vx::NeuronRowOnLogicalNeuron;
+using NeuronBlockOnDLS = halco::hicann_dls::vx::NeuronBlockOnDLS;
+using NeuronColumnOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronColumnOnDLS;
+using AtomicNeuronOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::AtomicNeuronOnDLS;
+using NeuronConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronConfigOnDLS;
+using NeuronBackendConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronBackendConfigOnDLS;
+using NeuronResetQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetQuadOnDLS;
+using LogicalNeuronOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::LogicalNeuronOnDLS;
+using LogicalNeuronCompartments GENPYBIND(visible) =
+    halco::hicann_dls::vx::LogicalNeuronCompartments;
+using AtomicNeuronOnLogicalNeuron GENPYBIND(visible) =
+    halco::hicann_dls::vx::AtomicNeuronOnLogicalNeuron;
+using NeuronColumnOnLogicalNeuron GENPYBIND(visible) =
+    halco::hicann_dls::vx::NeuronColumnOnLogicalNeuron;
+using CompartmentOnLogicalNeuron GENPYBIND(visible) =
+    halco::hicann_dls::vx::CompartmentOnLogicalNeuron;
 
 } // namespace halco::hicann_dls::vx::v3
-
-namespace std {
-
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::NeuronColumnOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::AtomicNeuronOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::NeuronConfigOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::NeuronBackendConfigOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::NeuronResetQuadOnDLS)
-
-} // namespace std
diff --git a/include/halco/hicann-dls/vx/v3/switch_rows.h b/include/halco/hicann-dls/vx/v3/switch_rows.h
index f97feab5dedb9676da45b14de164d78ecde49d9e..8ebfc50269d4517e83570eb511ef2944c0c9dce8 100644
--- a/include/halco/hicann-dls/vx/v3/switch_rows.h
+++ b/include/halco/hicann-dls/vx/v3/switch_rows.h
@@ -1,19 +1,15 @@
 #pragma once
 #include "halco/common/genpybind.h"
-#include "halco/hicann-dls/vx/v3/synapse.h"
-#include "halco/hicann-dls/vx/v3/synram.h"
+#include "halco/hicann-dls/vx/switch_rows.h"
 
 namespace halco::hicann_dls::vx::v3 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V3 {
 
-#include "halco/hicann-dls/vx/switch_rows_ns_includes.h"
+using ColumnCorrelationQuadOnSynram GENPYBIND(visible) =
+    halco::hicann_dls::vx::ColumnCorrelationQuadOnSynram;
+using ColumnCurrentQuadOnSynram GENPYBIND(visible) =
+    halco::hicann_dls::vx::ColumnCurrentQuadOnSynram;
+using ColumnCorrelationQuadOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::ColumnCorrelationQuadOnDLS;
+using ColumnCurrentQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::ColumnCurrentQuadOnDLS;
 
 } // namespace halco::hicann_dls::vx::v3
-
-namespace std {
-
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::ColumnCorrelationQuadOnSynram)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::ColumnCurrentQuadOnSynram)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::ColumnCorrelationQuadOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::ColumnCurrentQuadOnDLS)
-
-} // namespace std
diff --git a/include/halco/hicann-dls/vx/v3/synapse.h b/include/halco/hicann-dls/vx/v3/synapse.h
index 634998dc3c61398b6996fac0b7ffabba5dab7fc7..51b86ed84afe85a92fc503b338f9ef22343c0a64 100644
--- a/include/halco/hicann-dls/vx/v3/synapse.h
+++ b/include/halco/hicann-dls/vx/v3/synapse.h
@@ -2,79 +2,39 @@
 #include "halco/common/genpybind.h"
 #include "halco/hicann-dls/vx/cadc.h"
 #include "halco/hicann-dls/vx/synapse.h"
-#include "halco/hicann-dls/vx/v3/quad.h"
-#include "halco/hicann-dls/vx/v3/synram.h"
 
 namespace halco::hicann_dls::vx::v3 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V3 {
 
-#include "halco/hicann-dls/vx/synapse_ns_includes.h"
-
-struct GENPYBIND(inline_base("*")) SynapseOnSynapseRow
-    : public common::detail::RantWrapper<SynapseOnSynapseRow, uint_fast16_t, 255, 0>
-    , public common::detail::XRangedTrait
-{
-	constexpr explicit SynapseOnSynapseRow(uintmax_t const value = 0)
-	    GENPYBIND(implicit_conversion) :
-	    rant_t(value)
-	{}
-
-	explicit SynapseOnSynapseRow(
-	    EntryOnQuad const& syn_on_quad, SynapseQuadColumnOnDLS const& quad);
-
-	EntryOnQuad toEntryOnQuad() const;
-	SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const;
-	NeuronColumnOnDLS toNeuronColumnOnDLS() const;
-	CADCChannelColumnOnSynram toCADCChannelColumnOnSynram() const;
-};
-
-struct GENPYBIND(inline_base("*")) SynapseOnSynram
-    : public common::detail::
-          GridCoordinate<SynapseOnSynram, SynapseOnSynapseRow, SynapseRowOnSynram>
-{
-	GRID_COMMON_CONSTRUCTORS(SynapseOnSynram)
-
-	SynapseOnSynapseRow toSynapseOnSynapseRow() const
-	{
-		return x();
-	}
-
-	SynapseRowOnSynram toSynapseRowOnSynram() const
-	{
-		return y();
-	}
-};
-
-struct GENPYBIND(inline_base("*SynramMixin*")) SynapseOnDLS
-    : public SynramMixin<SynapseOnDLS, SynapseOnSynram>
-{
-	SynapseOnDLS() = default;
-
-	explicit SynapseOnDLS(
-	    SynapseOnSynram const& synapse, SynramOnDLS const& synram = SynramOnDLS()) :
-	    mixin_t(synapse, synram)
-	{}
-
-	explicit SynapseOnDLS(enum_type const& e) : mixin_t(e) {}
-
-	SynapseOnSynram toSynapseOnSynram() const
-	{
-		return This();
-	}
-};
+using SynapseRowOnSynapseDriver GENPYBIND(visible) =
+    halco::hicann_dls::vx::SynapseRowOnSynapseDriver;
+using SynapseRowOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseRowOnSynram;
+using SynapseRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseRowOnDLS;
+using SynapseWeightRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightRowOnDLS;
+using SynapseLabelRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelRowOnDLS;
+using SynapseCorrelationCalibRowOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::SynapseCorrelationCalibRowOnDLS;
+using CorrelationResetRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CorrelationResetRowOnDLS;
+using ColumnCorrelationRowOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::ColumnCorrelationRowOnDLS;
+using ColumnCurrentRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::ColumnCurrentRowOnDLS;
+using SynapticInputOnNeuron GENPYBIND(visible) = halco::hicann_dls::vx::SynapticInputOnNeuron;
+using SynapseBiasSelectionOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::SynapseBiasSelectionOnDLS;
+using SynapseWeightMatrixOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightMatrixOnDLS;
+using SynapseLabelMatrixOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelMatrixOnDLS;
+using SynapseCorrelationCalibMatrixOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::SynapseCorrelationCalibMatrixOnDLS;
+using SynapseBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseBlockOnDLS;
+using SynapseQuadColumnOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseQuadColumnOnDLS;
+using SynapseQuadOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseQuadOnSynram;
+using SynapseOnSynapseRow GENPYBIND(visible) = halco::hicann_dls::vx::SynapseOnSynapseRow;
+using SynapseOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseOnSynram;
+using SynapseOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseOnDLS;
+using SynapseQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseQuadOnDLS;
+using SynapseWeightQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightQuadOnDLS;
+using SynapseLabelQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelQuadOnDLS;
+using SynapseCorrelationCalibQuadOnDLS GENPYBIND(visible) =
+    halco::hicann_dls::vx::SynapseCorrelationCalibQuadOnDLS;
+using CorrelationResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CorrelationResetOnDLS;
 
 } // namespace halco::hicann_dls::vx::v3
-
-namespace std {
-
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseQuadColumnOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseQuadOnSynram)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseOnSynapseRow)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseOnSynram)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseQuadOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseWeightQuadOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseLabelQuadOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseCorrelationCalibQuadOnDLS)
-HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::CorrelationResetOnDLS)
-
-} // namespace std
diff --git a/src/halco/hicann-dls/vx/cadc.cpp b/src/halco/hicann-dls/vx/cadc.cpp
index a75b9acb28abd28a8642eabdf1494006df644766..d8d41d58cc1e41b03119577ce6d125ccbe4a1c3e 100644
--- a/src/halco/hicann-dls/vx/cadc.cpp
+++ b/src/halco/hicann-dls/vx/cadc.cpp
@@ -42,4 +42,36 @@ SynapseCorrelationCalibRowOnDLS CADCSampleRowOnDLS::toSynapseCorrelationCalibRow
 	return SynapseCorrelationCalibRowOnDLS(toEnum());
 }
 
+SynapseQuadOnDLS CADCSampleQuadOnDLS::toSynapseQuadOnDLS() const
+{
+	return SynapseQuadOnDLS(
+	    toCADCSampleQuadOnSynram()
+	        .toCADCSampleQuadUnspecifiedReadoutOnSynram()
+	        .toSynapseQuadOnSynram(),
+	    toSynramOnDLS());
+}
+
+SynapseWeightQuadOnDLS CADCSampleQuadOnDLS::toSynapseWeightQuadOnDLS() const
+{
+	return toSynapseQuadOnDLS().toSynapseWeightQuadOnDLS();
+}
+
+SynapseLabelQuadOnDLS CADCSampleQuadOnDLS::toSynapseLabelQuadOnDLS() const
+{
+	return toSynapseQuadOnDLS().toSynapseLabelQuadOnDLS();
+}
+
+SynapseCorrelationCalibQuadOnDLS CADCSampleQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const
+{
+	return toSynapseQuadOnDLS().toSynapseCorrelationCalibQuadOnDLS();
+}
+
+
+NeuronConfigBlockOnDLS CADCChannelConfigOnDLS::toNeuronConfigBlockOnDLS() const
+{
+	return NeuronConfigBlockOnDLS(
+	    (2 * toSynramOnDLS().toEnum()) +
+	    (toSynapseOnSynapseRow() / NeuronConfigOnNeuronConfigBlock::size));
+}
+
 } // namespace halco::hicann_dls::vx
diff --git a/src/halco/hicann-dls/vx/neuron.cpp b/src/halco/hicann-dls/vx/neuron.cpp
index 468573477e8bce1b926c568a8ecf9670dae5e881..bd88405fbb39aa796cff7102caa4979fb00ed10b 100644
--- a/src/halco/hicann-dls/vx/neuron.cpp
+++ b/src/halco/hicann-dls/vx/neuron.cpp
@@ -4,8 +4,18 @@
 #include "halco/hicann-dls/vx/capmem.h"
 #include "halco/hicann-dls/vx/hemisphere.h"
 #include "halco/hicann-dls/vx/routing_crossbar.h"
+#include "halco/hicann-dls/vx/switch_rows.h"
 #include "halco/hicann-dls/vx/synapse.h"
 
+#ifndef __ppu__
+#include "halco/common/cerealization_geometry.h"
+#include <cereal/archives/json.hpp>
+#include <cereal/archives/portable_binary.hpp>
+#include <cereal/cereal.hpp>
+#include <cereal/types/map.hpp>
+#include <cereal/types/vector.hpp>
+#endif
+
 namespace halco::hicann_dls::vx {
 
 #define HEMISPHERE_CLASS NeuronRowOnDLS
@@ -74,4 +84,534 @@ CrossbarInputOnDLS NeuronEventOutputOnDLS::toCrossbarInputOnDLS() const
 	return CrossbarInputOnDLS(toEnum());
 }
 
+NeuronResetOnDLS NeuronConfigOnDLS::toNeuronResetOnDLS() const
+{
+	auto block = toNeuronConfigBlockOnDLS().toNeuronResetBlockOnDLS();
+	return NeuronResetOnDLS(
+	    NeuronResetOnNeuronResetBlock(
+	        toNeuronConfigOnNeuronConfigBlock() +
+	        ((toNeuronConfigBlockOnDLS() / NeuronResetBlockOnDLS::size)
+	             ? NeuronConfigOnNeuronConfigBlock::size
+	             : 0)),
+	    block);
+}
+
+SpikeCounterReadOnDLS NeuronConfigOnDLS::toSpikeCounterReadOnDLS() const
+{
+	return SpikeCounterReadOnDLS(toNeuronResetOnDLS().toEnum());
+}
+
+SpikeCounterResetOnDLS NeuronConfigOnDLS::toSpikeCounterResetOnDLS() const
+{
+	return SpikeCounterResetOnDLS(toNeuronResetOnDLS().toEnum());
+}
+
+SynapseOnSynapseRow NeuronColumnOnDLS::toSynapseOnSynapseRow() const
+{
+	return SynapseOnSynapseRow(toEnum());
+}
+
+CapMemColumnOnCapMemBlock NeuronColumnOnDLS::toCapMemColumnOnCapMemBlock() const
+{
+	return CapMemColumnOnCapMemBlock(toEnum() % NeuronConfigOnNeuronConfigBlock::size);
+}
+
+NeuronEventOutputOnDLS NeuronColumnOnDLS::toNeuronEventOutputOnDLS() const
+{
+	return NeuronEventOutputOnDLS(common::Enum(toEnum() / (size / NeuronEventOutputOnDLS::size)));
+}
+
+NeuronConfigOnDLS AtomicNeuronOnDLS::toNeuronConfigOnDLS() const
+{
+	return NeuronConfigOnDLS(toEnum());
+}
+
+NeuronResetOnDLS AtomicNeuronOnDLS::toNeuronResetOnDLS() const
+{
+	return toNeuronConfigOnDLS().toNeuronResetOnDLS();
+}
+
+SpikeCounterReadOnDLS AtomicNeuronOnDLS::toSpikeCounterReadOnDLS() const
+{
+	return toNeuronConfigOnDLS().toSpikeCounterReadOnDLS();
+}
+
+SpikeCounterResetOnDLS AtomicNeuronOnDLS::toSpikeCounterResetOnDLS() const
+{
+	return toNeuronConfigOnDLS().toSpikeCounterResetOnDLS();
+}
+
+NeuronBackendConfigOnDLS AtomicNeuronOnDLS::toNeuronBackendConfigOnDLS() const
+{
+	return NeuronBackendConfigOnDLS(toNeuronResetOnDLS().toEnum());
+}
+
+CapMemColumnOnCapMemBlock AtomicNeuronOnDLS::toCapMemColumnOnCapMemBlock() const
+{
+	return toNeuronColumnOnDLS().toCapMemColumnOnCapMemBlock();
+}
+
+CapMemBlockOnDLS AtomicNeuronOnDLS::toCapMemBlockOnDLS() const
+{
+	return toNeuronConfigOnDLS().toNeuronConfigBlockOnDLS().toCapMemBlockOnDLS();
+}
+
+NeuronRowOnDLS NeuronConfigOnDLS::toNeuronRowOnDLS() const
+{
+	return NeuronRowOnDLS(toEnum() / SynapseOnSynapseRow::size);
+}
+
+SynapseOnSynapseRow NeuronConfigOnDLS::toSynapseOnSynapseRow() const
+{
+	return SynapseOnSynapseRow(toEnum() % SynapseOnSynapseRow::size);
+}
+
+AtomicNeuronOnDLS NeuronConfigOnDLS::toAtomicNeuronOnDLS() const
+{
+	return AtomicNeuronOnDLS(toSynapseOnSynapseRow().toNeuronColumnOnDLS(), toNeuronRowOnDLS());
+}
+
+SynapseQuadColumnOnDLS NeuronConfigOnDLS::toSynapseQuadColumnOnDLS() const
+{
+	return toSynapseOnSynapseRow().toSynapseQuadColumnOnDLS();
+}
+
+EntryOnQuad NeuronConfigOnDLS::toEntryOnQuad() const
+{
+	return toSynapseOnSynapseRow().toEntryOnQuad();
+}
+
+NeuronBackendConfigBlockOnDLS NeuronConfigOnDLS::toNeuronBackendConfigBlockOnDLS() const
+{
+	return toAtomicNeuronOnDLS().toNeuronBackendConfigOnDLS().toNeuronBackendConfigBlockOnDLS();
+}
+
+NeuronBackendConfigOnNeuronBackendConfigBlock
+NeuronConfigOnDLS::toNeuronBackendConfigOnNeuronBackendConfigBlock() const
+{
+	return toAtomicNeuronOnDLS()
+	    .toNeuronBackendConfigOnDLS()
+	    .toNeuronBackendConfigOnNeuronBackendConfigBlock();
+}
+
+NeuronBackendConfigOnDLS NeuronConfigOnDLS::toNeuronBackendConfigOnDLS() const
+{
+	return toAtomicNeuronOnDLS().toNeuronBackendConfigOnDLS();
+}
+
+CommonNeuronBackendConfigOnDLS NeuronConfigOnDLS::toCommonNeuronBackendConfigOnDLS() const
+{
+	return toNeuronBackendConfigBlockOnDLS().toCommonNeuronBackendConfigOnDLS();
+}
+
+NeuronColumnOnDLS NeuronBackendConfigOnDLS::toNeuronColumnOnDLS() const
+{
+	return NeuronColumnOnDLS(
+	    (toNeuronBackendConfigOnNeuronBackendConfigBlock() %
+	     NeuronConfigOnNeuronConfigBlock::size) +
+	    (toNeuronBackendConfigBlockOnDLS() * NeuronConfigOnNeuronConfigBlock::size));
+}
+
+NeuronRowOnDLS NeuronBackendConfigOnDLS::toNeuronRowOnDLS() const
+{
+	return NeuronRowOnDLS(
+	    toNeuronBackendConfigOnNeuronBackendConfigBlock() / NeuronConfigOnNeuronConfigBlock::size);
+}
+
+AtomicNeuronOnDLS NeuronBackendConfigOnDLS::toAtomicNeuronOnDLS() const
+{
+	return AtomicNeuronOnDLS(toNeuronColumnOnDLS(), toNeuronRowOnDLS());
+}
+
+NeuronConfigOnDLS NeuronBackendConfigOnDLS::toNeuronConfigOnDLS() const
+{
+	return toAtomicNeuronOnDLS().toNeuronConfigOnDLS();
+}
+
+SpikeCounterReadOnDLS NeuronBackendConfigOnDLS::toSpikeCounterReadOnDLS() const
+{
+	return toNeuronConfigOnDLS().toSpikeCounterReadOnDLS();
+}
+
+SpikeCounterResetOnDLS NeuronBackendConfigOnDLS::toSpikeCounterResetOnDLS() const
+{
+	return toNeuronConfigOnDLS().toSpikeCounterResetOnDLS();
+}
+
+CommonNeuronBackendConfigOnDLS NeuronBackendConfigOnDLS::toCommonNeuronBackendConfigOnDLS() const
+{
+	return toNeuronBackendConfigBlockOnDLS().toCommonNeuronBackendConfigOnDLS();
+}
+
+SynramOnDLS AtomicNeuronOnDLS::toSynramOnDLS() const
+{
+	return toNeuronRowOnDLS().toSynramOnDLS();
+}
+
+SynramOnDLS NeuronConfigOnDLS::toSynramOnDLS() const
+{
+	return toAtomicNeuronOnDLS().toSynramOnDLS();
+}
+
+SynramOnDLS NeuronBackendConfigOnDLS::toSynramOnDLS() const
+{
+	return toAtomicNeuronOnDLS().toSynramOnDLS();
+}
+
+NeuronConfigBlockOnDLS NeuronBackendConfigOnDLS::toNeuronConfigBlockOnDLS() const
+{
+	return toNeuronConfigOnDLS().toNeuronConfigBlockOnDLS();
+}
+
+SynapseQuadColumnOnDLS AtomicNeuronOnDLS::toSynapseQuadColumnOnDLS() const
+{
+	return toNeuronConfigOnDLS().toSynapseQuadColumnOnDLS();
+}
+
+ColumnCorrelationQuadOnDLS AtomicNeuronOnDLS::toColumnCorrelationQuadOnDLS() const
+{
+	return ColumnCorrelationQuadOnDLS(
+	    toSynapseQuadColumnOnDLS().toColumnCorrelationQuadOnSynram(), toSynramOnDLS());
+}
+
+ColumnCurrentQuadOnDLS AtomicNeuronOnDLS::toColumnCurrentQuadOnDLS() const
+{
+	return ColumnCurrentQuadOnDLS(
+	    toSynapseQuadColumnOnDLS().toColumnCurrentQuadOnSynram(), toSynramOnDLS());
+}
+
+ColumnCorrelationQuadOnDLS NeuronConfigOnDLS::toColumnCorrelationQuadOnDLS() const
+{
+	return toAtomicNeuronOnDLS().toColumnCorrelationQuadOnDLS();
+}
+
+ColumnCurrentQuadOnDLS NeuronConfigOnDLS::toColumnCurrentQuadOnDLS() const
+{
+	return toAtomicNeuronOnDLS().toColumnCurrentQuadOnDLS();
+}
+
+common::typed_array<NeuronResetOnDLS, EntryOnQuad> NeuronResetQuadOnDLS::toNeuronResetOnDLS() const
+{
+	common::typed_array<NeuronResetOnDLS, EntryOnQuad> ret;
+	auto const columns = toSynapseQuadColumnOnDLS().toNeuronColumnOnDLS();
+	for (auto const e : common::iter_all<EntryOnQuad>()) {
+		ret[e] =
+		    AtomicNeuronOnDLS(columns[e], toSynramOnDLS().toNeuronRowOnDLS()).toNeuronResetOnDLS();
+	}
+	return ret;
+}
+
+AtomicNeuronOnLogicalNeuron AtomicNeuronOnLogicalNeuron::get_neighbor(
+    Direction const& direction) const
+{
+	switch (direction) {
+		case Direction::left: {
+			AtomicNeuronOnLogicalNeuron neighbor(NeuronColumnOnLogicalNeuron(x().value() - 1), y());
+			return neighbor;
+		}
+		case Direction::right: {
+			AtomicNeuronOnLogicalNeuron neighbor(NeuronColumnOnLogicalNeuron(x().value() + 1), y());
+			return neighbor;
+		}
+		case Direction::opposite_row: {
+			AtomicNeuronOnLogicalNeuron neighbor(
+			    x(), NeuronRowOnLogicalNeuron((y().value() + 1) % NeuronRowOnLogicalNeuron::size));
+			return neighbor;
+		}
+		default: {
+#ifndef __ppu__
+			throw std::logic_error(
+			    "Unsupported direction for neighbor for AtomicNeuronOnLogicalNeuron was chosen.");
+#else
+			exit(1);
+#endif
+		}
+	}
+}
+
+LogicalNeuronCompartments::LogicalNeuronCompartments(Compartments const& compartments)
+{
+	std::set<AtomicNeuronOnLogicalNeuron> unique;
+	size_t n = 0;
+	for (auto const& [_, compartment] : compartments) {
+		unique.insert(compartment.begin(), compartment.end());
+		n += compartment.size();
+	}
+	if (unique.size() != n) {
+#ifndef __ppu__
+		throw std::runtime_error("Multiple compartments contain the same neuron(s).");
+#else
+		exit(1);
+#endif
+	}
+	m_compartments = compartments;
+}
+
+LogicalNeuronCompartments::Compartments const& LogicalNeuronCompartments::get_compartments() const
+{
+	return m_compartments;
+}
+
+NeuronColumnOnLogicalNeuron LogicalNeuronCompartments::get_left_most_column() const
+{
+	NeuronColumnOnLogicalNeuron lmost(NeuronColumnOnLogicalNeuron::max);
+	for (auto const& [_, compartment] : m_compartments) {
+		auto const lm =
+		    std::min_element(
+		        compartment.begin(), compartment.end(),
+		        [](auto const& a, auto const& b) {
+			        return a.toNeuronColumnOnLogicalNeuron() < b.toNeuronColumnOnLogicalNeuron();
+		        })
+		        ->toNeuronColumnOnLogicalNeuron();
+		lmost = std::min(lm, lmost);
+	}
+	return lmost;
+}
+
+NeuronColumnOnLogicalNeuron LogicalNeuronCompartments::get_right_most_column() const
+{
+	NeuronColumnOnLogicalNeuron rmost(NeuronColumnOnLogicalNeuron::min);
+	for (auto const& [_, compartment] : m_compartments) {
+		auto const rm =
+		    std::max_element(
+		        compartment.begin(), compartment.end(),
+		        [](auto const& a, auto const& b) {
+			        return a.toNeuronColumnOnLogicalNeuron() < b.toNeuronColumnOnLogicalNeuron();
+		        })
+		        ->toNeuronColumnOnLogicalNeuron();
+		rmost = std::max(rm, rmost);
+	}
+	return rmost;
+}
+
+NeuronRowOnLogicalNeuron LogicalNeuronCompartments::get_top_most_row() const
+{
+	NeuronRowOnLogicalNeuron tmost(NeuronRowOnLogicalNeuron::max);
+	for (auto const& [_, compartment] : m_compartments) {
+		auto const tm =
+		    std::min_element(
+		        compartment.begin(), compartment.end(),
+		        [](auto const& a, auto const& b) {
+			        return a.toNeuronRowOnLogicalNeuron() < b.toNeuronRowOnLogicalNeuron();
+		        })
+		        ->toNeuronRowOnLogicalNeuron();
+		tmost = std::min(tm, tmost);
+	}
+	return tmost;
+}
+
+NeuronRowOnLogicalNeuron LogicalNeuronCompartments::get_bottom_most_row() const
+{
+	NeuronRowOnLogicalNeuron bmost(NeuronRowOnLogicalNeuron::min);
+	for (auto const& [_, compartment] : m_compartments) {
+		auto const bm =
+		    std::max_element(
+		        compartment.begin(), compartment.end(),
+		        [](auto const& a, auto const& b) {
+			        return a.toNeuronRowOnLogicalNeuron() < b.toNeuronRowOnLogicalNeuron();
+		        })
+		        ->toNeuronRowOnLogicalNeuron();
+		bmost = std::max(bm, bmost);
+	}
+	return bmost;
+}
+
+LogicalNeuronCompartments LogicalNeuronCompartments::flip_x() const
+{
+	Compartments flipped_compartments;
+	auto const lmost = get_left_most_column();
+	auto const rmost = get_right_most_column();
+	for (auto const& [index, compartment] : m_compartments) {
+		Compartment& flipped_compartment = flipped_compartments[index];
+		for (auto const& neuron : compartment) {
+			flipped_compartment.push_back(AtomicNeuronOnLogicalNeuron(
+			    NeuronColumnOnLogicalNeuron(
+			        lmost.value() + rmost.value() - neuron.toNeuronColumnOnLogicalNeuron().value()),
+			    neuron.toNeuronRowOnLogicalNeuron()));
+		}
+	}
+	return LogicalNeuronCompartments(flipped_compartments);
+}
+
+LogicalNeuronCompartments LogicalNeuronCompartments::flip_y() const
+{
+	Compartments flipped_compartments;
+	auto const tmost = get_top_most_row();
+	auto const bmost = get_bottom_most_row();
+	for (auto const& [index, compartment] : m_compartments) {
+		Compartment& flipped_compartment = flipped_compartments[index];
+		for (auto const& neuron : compartment) {
+			flipped_compartment.push_back(AtomicNeuronOnLogicalNeuron(
+			    neuron.toNeuronColumnOnLogicalNeuron(),
+			    NeuronRowOnLogicalNeuron(
+			        tmost.value() + bmost.value() - neuron.toNeuronRowOnLogicalNeuron().value())));
+		}
+	}
+	return LogicalNeuronCompartments(flipped_compartments);
+}
+
+bool LogicalNeuronCompartments::operator==(LogicalNeuronCompartments const& other) const
+{
+	return m_compartments == other.m_compartments;
+}
+
+bool LogicalNeuronCompartments::operator!=(LogicalNeuronCompartments const& other) const
+{
+	return !(*this == other);
+}
+
+bool LogicalNeuronCompartments::operator<(LogicalNeuronCompartments const& other) const
+{
+	return m_compartments < other.m_compartments;
+}
+
+bool LogicalNeuronCompartments::operator>(LogicalNeuronCompartments const& other) const
+{
+	return m_compartments > other.m_compartments;
+}
+
+bool LogicalNeuronCompartments::operator<=(LogicalNeuronCompartments const& other) const
+{
+	return m_compartments <= other.m_compartments;
+}
+
+bool LogicalNeuronCompartments::operator>=(LogicalNeuronCompartments const& other) const
+{
+	return m_compartments >= other.m_compartments;
+}
+
+#ifndef __ppu__
+std::ostream& operator<<(std::ostream& os, LogicalNeuronCompartments const& config)
+{
+	os << "LogicalNeuronCompartments(\n";
+	for (auto const& [index, compartment] : config.m_compartments) {
+		os << index << "\n";
+		for (auto const& neuron : compartment) {
+			os << "\t" << neuron << "\n";
+		}
+	}
+	os << ")";
+	return os;
+}
+
+template <typename Archive>
+void LogicalNeuronCompartments::serialize(Archive& ar, uint32_t const)
+{
+	ar(m_compartments);
+}
+#endif
+
+LogicalNeuronOnDLS::LogicalNeuronOnDLS(
+    LogicalNeuronCompartments const& compartments, AtomicNeuronOnDLS const& anchor)
+{
+	auto const lmost = compartments.get_left_most_column();
+	auto const rmost = compartments.get_right_most_column();
+	auto const bmost = compartments.get_bottom_most_row();
+	auto const tmost = compartments.get_top_most_row();
+	auto const height = bmost.value() - tmost.value();
+	auto const width = rmost.value() - lmost.value();
+
+	if ((anchor.toNeuronRowOnDLS().value() + height) > NeuronRowOnDLS::max) {
+#ifndef __ppu__
+		throw std::runtime_error(
+		    "LogicalNeuron anchor results in placement of compartments outside of neuron grid.");
+#else
+		exit(1);
+#endif
+	}
+	if ((((anchor.toNeuronColumnOnDLS().value()) < NeuronColumnOnLogicalNeuron::max) &&
+	     ((anchor.toNeuronColumnOnDLS().value() + width) > NeuronColumnOnLogicalNeuron::max)) ||
+	    (((anchor.toNeuronColumnOnDLS().value()) > NeuronColumnOnLogicalNeuron::max) &&
+	     ((anchor.toNeuronColumnOnDLS().value() + width) > NeuronColumnOnDLS::max))) {
+#ifndef __ppu__
+		throw std::runtime_error(
+		    "LogicalNeuron anchor results in placement of compartments outside of neuron grid.");
+#else
+		exit(1);
+#endif
+	}
+	for (auto const& [index, compartment] : compartments.get_compartments()) {
+		auto& placed_compartment = m_compartments[index];
+		for (auto const& neuron : compartment) {
+			placed_compartment.push_back(AtomicNeuronOnDLS(
+			    NeuronColumnOnDLS(
+			        anchor.toNeuronColumnOnDLS().value() +
+			        neuron.toNeuronColumnOnLogicalNeuron().value() - lmost.value()),
+			    NeuronRowOnDLS(
+			        anchor.toNeuronRowOnDLS().value() +
+			        neuron.toNeuronRowOnLogicalNeuron().value() - tmost.value())));
+		}
+	}
+}
+
+LogicalNeuronOnDLS::PlacedCompartments LogicalNeuronOnDLS::get_placed_compartments() const
+{
+	return m_compartments;
+}
+
+bool LogicalNeuronOnDLS::operator==(LogicalNeuronOnDLS const& other) const
+{
+	return (m_compartments == other.m_compartments);
+}
+
+bool LogicalNeuronOnDLS::operator!=(LogicalNeuronOnDLS const& other) const
+{
+	return !(*this == other);
+}
+
+bool LogicalNeuronOnDLS::operator<(LogicalNeuronOnDLS const& other) const
+{
+	return m_compartments < other.m_compartments;
+}
+
+bool LogicalNeuronOnDLS::operator>(LogicalNeuronOnDLS const& other) const
+{
+	return m_compartments > other.m_compartments;
+}
+
+bool LogicalNeuronOnDLS::operator<=(LogicalNeuronOnDLS const& other) const
+{
+	return m_compartments <= other.m_compartments;
+}
+
+bool LogicalNeuronOnDLS::operator>=(LogicalNeuronOnDLS const& other) const
+{
+	return m_compartments >= other.m_compartments;
+}
+
+#ifndef __ppu__
+std::ostream& operator<<(std::ostream& os, LogicalNeuronOnDLS const& config)
+{
+	os << "LogicalNeuronOnDLS(\n";
+	for (auto const& [index, compartment] : config.m_compartments) {
+		os << index << "\n";
+		for (auto const& neuron : compartment) {
+			os << "\t" << neuron << "\n";
+		}
+	}
+	os << ")";
+	return os;
+}
+
+template <typename Archive>
+void LogicalNeuronOnDLS::serialize(Archive& ar, uint32_t const)
+{
+	ar(m_compartments);
+}
+#endif
+
+#ifndef __ppu__
+#define EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(CLASS_NAME)                                          \
+	template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME(                                     \
+	    cereal::JSONOutputArchive&, std::uint32_t const);                                          \
+	template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME(                                     \
+	    cereal::JSONInputArchive&, std::uint32_t const);                                           \
+	template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME(                                     \
+	    cereal::PortableBinaryOutputArchive&, std::uint32_t const);                                \
+	template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME(                                     \
+	    cereal::PortableBinaryInputArchive&, std::uint32_t const);
+
+EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(LogicalNeuronCompartments)
+EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(LogicalNeuronOnDLS)
+#endif
 } // namespace halco::hicann_dls::vx
diff --git a/src/halco/hicann-dls/vx/synapse.cpp b/src/halco/hicann-dls/vx/synapse.cpp
index 9ce7691bafe9d61f0c1f59bd7b1a708bb29dc5d9..5a5bc83c91b141cab85e444a636640c77f3d4b38 100644
--- a/src/halco/hicann-dls/vx/synapse.cpp
+++ b/src/halco/hicann-dls/vx/synapse.cpp
@@ -5,6 +5,7 @@
 #include "halco/hicann-dls/vx/neuron.h"
 #include "halco/hicann-dls/vx/padi.h"
 #include "halco/hicann-dls/vx/ppu.h"
+#include "halco/hicann-dls/vx/switch_rows.h"
 #include "halco/hicann-dls/vx/synapse_driver.h"
 
 
@@ -124,4 +125,138 @@ SynapseCorrelationCalibMatrixOnDLS const SynapseCorrelationCalibMatrixOnDLS::bot
 SynapseBlockOnDLS const SynapseBlockOnDLS::top{enum_vertical_top};
 SynapseBlockOnDLS const SynapseBlockOnDLS::bottom{enum_vertical_bottom};
 
+ColumnCorrelationQuadOnSynram SynapseQuadColumnOnDLS::toColumnCorrelationQuadOnSynram() const
+{
+	return ColumnCorrelationQuadOnSynram(toEnum());
+}
+
+ColumnCurrentQuadOnSynram SynapseQuadColumnOnDLS::toColumnCurrentQuadOnSynram() const
+{
+	return ColumnCurrentQuadOnSynram(toEnum());
+}
+
+SynapseWeightQuadOnDLS SynapseQuadOnDLS::toSynapseWeightQuadOnDLS() const
+{
+	return SynapseWeightQuadOnDLS(toEnum());
+}
+
+SynapseLabelQuadOnDLS SynapseQuadOnDLS::toSynapseLabelQuadOnDLS() const
+{
+	return SynapseLabelQuadOnDLS(toEnum());
+}
+
+SynapseCorrelationCalibQuadOnDLS SynapseQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const
+{
+	return SynapseCorrelationCalibQuadOnDLS(toEnum());
+}
+
+NeuronConfigBlockOnDLS SynapseWeightQuadOnDLS::toNeuronConfigBlockOnDLS() const
+{
+	return toSynapseQuadOnDLS().toNeuronConfigBlockOnDLS();
+}
+
+SynapseQuadOnDLS SynapseWeightQuadOnDLS::toSynapseQuadOnDLS() const
+{
+	return SynapseQuadOnDLS(toEnum());
+}
+
+SynapseLabelQuadOnDLS SynapseWeightQuadOnDLS::toSynapseLabelQuadOnDLS() const
+{
+	return SynapseLabelQuadOnDLS(toEnum());
+}
+
+SynapseCorrelationCalibQuadOnDLS SynapseWeightQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const
+{
+	return SynapseCorrelationCalibQuadOnDLS(toEnum());
+}
+
+NeuronConfigBlockOnDLS SynapseLabelQuadOnDLS::toNeuronConfigBlockOnDLS() const
+{
+	return toSynapseQuadOnDLS().toNeuronConfigBlockOnDLS();
+}
+
+SynapseWeightQuadOnDLS SynapseLabelQuadOnDLS::toSynapseWeightQuadOnDLS() const
+{
+	return SynapseWeightQuadOnDLS(toEnum());
+}
+
+SynapseQuadOnDLS SynapseLabelQuadOnDLS::toSynapseQuadOnDLS() const
+{
+	return SynapseQuadOnDLS(toEnum());
+}
+
+SynapseCorrelationCalibQuadOnDLS SynapseLabelQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const
+{
+	return SynapseCorrelationCalibQuadOnDLS(toEnum());
+}
+
+NeuronConfigBlockOnDLS SynapseCorrelationCalibQuadOnDLS::toNeuronConfigBlockOnDLS() const
+{
+	return toSynapseQuadOnDLS().toNeuronConfigBlockOnDLS();
+}
+
+SynapseWeightQuadOnDLS SynapseCorrelationCalibQuadOnDLS::toSynapseWeightQuadOnDLS() const
+{
+	return SynapseWeightQuadOnDLS(toEnum());
+}
+
+SynapseLabelQuadOnDLS SynapseCorrelationCalibQuadOnDLS::toSynapseLabelQuadOnDLS() const
+{
+	return SynapseLabelQuadOnDLS(toEnum());
+}
+
+SynapseQuadOnDLS SynapseCorrelationCalibQuadOnDLS::toSynapseQuadOnDLS() const
+{
+	return SynapseQuadOnDLS(toEnum());
+}
+
+NeuronColumnOnDLS SynapseOnSynapseRow::toNeuronColumnOnDLS() const
+{
+	return NeuronColumnOnDLS(toEnum());
+}
+
+CADCChannelColumnOnSynram SynapseOnSynapseRow::toCADCChannelColumnOnSynram() const
+{
+	return CADCChannelColumnOnSynram(toEnum());
+}
+
+
+common::typed_array<NeuronColumnOnDLS, EntryOnQuad> SynapseQuadColumnOnDLS::toNeuronColumnOnDLS()
+    const
+{
+	common::typed_array<NeuronColumnOnDLS, EntryOnQuad> ret;
+	for (auto const e : common::iter_all<EntryOnQuad>()) {
+		ret[e] = NeuronColumnOnDLS(
+		    ((toEnum() % (size / 2)) * EntryOnQuad::size + e.toEnum()) * 2 +
+		    (toEnum() / (size / 2)));
+	}
+	return ret;
+}
+
+NeuronConfigBlockOnDLS SynapseQuadOnDLS::toNeuronConfigBlockOnDLS() const
+{
+	bool east = toSynapseQuadColumnOnDLS() % (SynapseQuadColumnOnDLS::size / 2) >=
+	            (SynapseQuadColumnOnDLS::size / 4);
+	return NeuronConfigBlockOnDLS(toSynramOnDLS().toEnum() * 2 + east);
+}
+
+SynapseOnSynapseRow::SynapseOnSynapseRow(
+    EntryOnQuad const& syn_on_quad, SynapseQuadColumnOnDLS const& quad) :
+    rant_t(
+        (3 - syn_on_quad.toEnum()) * 2 +
+        (quad.toEnum() % (SynapseQuadColumnOnDLS::size / 2)) * EntryOnQuad::size * 2 +
+        quad.toEnum() / (SynapseQuadColumnOnDLS::size / 2))
+{}
+
+EntryOnQuad SynapseOnSynapseRow::toEntryOnQuad() const
+{
+	return EntryOnQuad(3 - ((toEnum() / 2) % EntryOnQuad::size));
+}
+
+SynapseQuadColumnOnDLS SynapseOnSynapseRow::toSynapseQuadColumnOnDLS() const
+{
+	return SynapseQuadColumnOnDLS(
+	    ((toEnum() % 2) * SynapseQuadColumnOnDLS::size / 2) + (toEnum() / (2 * EntryOnQuad::size)));
+}
+
 } // namespace halco::hicann_dls::vx
diff --git a/src/halco/hicann-dls/vx/v2/cadc.cpp b/src/halco/hicann-dls/vx/v2/cadc.cpp
deleted file mode 100644
index 94917a38307b072e06d0d0cd9751f31509415467..0000000000000000000000000000000000000000
--- a/src/halco/hicann-dls/vx/v2/cadc.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-#include "halco/hicann-dls/vx/v2/cadc.h"
-
-#include "halco/hicann-dls/vx/v2/neuron.h"
-#include "halco/hicann-dls/vx/v2/synapse.h"
-#include "halco/hicann-dls/vx/v2/synram.h"
-
-namespace halco::hicann_dls::vx::v2 {
-
-#include "halco/hicann-dls/vx/cadc_ns_includes_impl.h"
-
-} // namespace halco::hicann_dls::vx::v2
diff --git a/src/halco/hicann-dls/vx/v2/neuron.cpp b/src/halco/hicann-dls/vx/v2/neuron.cpp
deleted file mode 100644
index f31afc884726f1f2a98adb689e2e863720a67198..0000000000000000000000000000000000000000
--- a/src/halco/hicann-dls/vx/v2/neuron.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "halco/hicann-dls/vx/v2/neuron.h"
-
-#ifndef __ppu__
-#include "halco/common/cerealization_geometry.h"
-#include <cereal/archives/json.hpp>
-#include <cereal/archives/portable_binary.hpp>
-#include <cereal/cereal.hpp>
-#include <cereal/types/map.hpp>
-#include <cereal/types/vector.hpp>
-#endif
-
-namespace halco::hicann_dls::vx::v2 {
-
-#include "halco/hicann-dls/vx/neuron_ns_includes_impl.h"
-
-#ifndef __ppu__
-#define EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(CLASS_NAME)                                          \
-	template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME(                                     \
-	    cereal::JSONOutputArchive&, std::uint32_t const);                                          \
-	template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME(                                     \
-	    cereal::JSONInputArchive&, std::uint32_t const);                                           \
-	template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME(                                     \
-	    cereal::PortableBinaryOutputArchive&, std::uint32_t const);                                \
-	template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME(                                     \
-	    cereal::PortableBinaryInputArchive&, std::uint32_t const);
-
-EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(LogicalNeuronCompartments)
-EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(LogicalNeuronOnDLS)
-#endif
-
-} // namespace halco::hicann_dls::vx::v2
diff --git a/src/halco/hicann-dls/vx/v2/synapse.cpp b/src/halco/hicann-dls/vx/v2/synapse.cpp
deleted file mode 100644
index 991cfad66f55f9f360379da907a3f5d4bccab9da..0000000000000000000000000000000000000000
--- a/src/halco/hicann-dls/vx/v2/synapse.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-#include "halco/hicann-dls/vx/v2/synapse.h"
-
-#include "halco/common/iter_all.h"
-#include "halco/hicann-dls/vx/v2/cadc.h"
-#include "halco/hicann-dls/vx/v2/chip.h"
-#include "halco/hicann-dls/vx/v2/correlation.h"
-#include "halco/hicann-dls/vx/v2/neuron.h"
-#include "halco/hicann-dls/vx/v2/padi.h"
-#include "halco/hicann-dls/vx/v2/ppu.h"
-#include "halco/hicann-dls/vx/v2/switch_rows.h"
-#include "halco/hicann-dls/vx/v2/synapse_driver.h"
-
-
-namespace halco::hicann_dls::vx::v2 {
-
-#include "halco/hicann-dls/vx/synapse_ns_includes_impl.h"
-
-common::typed_array<NeuronColumnOnDLS, EntryOnQuad> SynapseQuadColumnOnDLS::toNeuronColumnOnDLS()
-    const
-{
-	common::typed_array<NeuronColumnOnDLS, EntryOnQuad> ret;
-	for (auto const e : common::iter_all<EntryOnQuad>()) {
-		ret[e] = NeuronColumnOnDLS(
-		    ((toEnum() % (size / 2)) * EntryOnQuad::size + e.toEnum()) * 2 +
-		    (toEnum() / (size / 2)));
-	}
-	return ret;
-}
-
-NeuronConfigBlockOnDLS SynapseQuadOnDLS::toNeuronConfigBlockOnDLS() const
-{
-	bool east = toSynapseQuadColumnOnDLS() % (SynapseQuadColumnOnDLS::size / 2) >=
-	            (SynapseQuadColumnOnDLS::size / 4);
-	return NeuronConfigBlockOnDLS(toSynramOnDLS().toEnum() * 2 + east);
-}
-
-SynapseOnSynapseRow::SynapseOnSynapseRow(
-    EntryOnQuad const& syn_on_quad, SynapseQuadColumnOnDLS const& quad) :
-    rant_t(
-        (3 - syn_on_quad.toEnum()) * 2 +
-        (quad.toEnum() % (SynapseQuadColumnOnDLS::size / 2)) * EntryOnQuad::size * 2 +
-        quad.toEnum() / (SynapseQuadColumnOnDLS::size / 2))
-{}
-
-EntryOnQuad SynapseOnSynapseRow::toEntryOnQuad() const
-{
-	return EntryOnQuad(3 - ((toEnum() / 2) % EntryOnQuad::size));
-}
-
-SynapseQuadColumnOnDLS SynapseOnSynapseRow::toSynapseQuadColumnOnDLS() const
-{
-	return SynapseQuadColumnOnDLS(
-	    ((toEnum() % 2) * SynapseQuadColumnOnDLS::size / 2) + (toEnum() / (2 * EntryOnQuad::size)));
-}
-
-} // namespace halco::hicann_dls::vx
diff --git a/src/halco/hicann-dls/vx/v3/cadc.cpp b/src/halco/hicann-dls/vx/v3/cadc.cpp
deleted file mode 100644
index c7897e235f62c5d6efc6b531fcf2afa966f9d3c6..0000000000000000000000000000000000000000
--- a/src/halco/hicann-dls/vx/v3/cadc.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-#include "halco/hicann-dls/vx/v3/cadc.h"
-
-#include "halco/hicann-dls/vx/v3/neuron.h"
-#include "halco/hicann-dls/vx/v3/synapse.h"
-#include "halco/hicann-dls/vx/v3/synram.h"
-
-namespace halco::hicann_dls::vx::v3 {
-
-#include "halco/hicann-dls/vx/cadc_ns_includes_impl.h"
-
-} // namespace halco::hicann_dls::vx::v3
diff --git a/src/halco/hicann-dls/vx/v3/neuron.cpp b/src/halco/hicann-dls/vx/v3/neuron.cpp
deleted file mode 100644
index a40066735bfeb75c50b7dd51ac5000db192ebc92..0000000000000000000000000000000000000000
--- a/src/halco/hicann-dls/vx/v3/neuron.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "halco/hicann-dls/vx/v3/neuron.h"
-
-#ifndef __ppu__
-#include "halco/common/cerealization_geometry.h"
-#include <cereal/archives/json.hpp>
-#include <cereal/archives/portable_binary.hpp>
-#include <cereal/cereal.hpp>
-#include <cereal/types/map.hpp>
-#include <cereal/types/vector.hpp>
-#endif
-
-namespace halco::hicann_dls::vx::v3 {
-
-#include "halco/hicann-dls/vx/neuron_ns_includes_impl.h"
-
-#ifndef __ppu__
-#define EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(CLASS_NAME)                                          \
-	template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME(                                     \
-	    cereal::JSONOutputArchive&, std::uint32_t const);                                          \
-	template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME(                                     \
-	    cereal::JSONInputArchive&, std::uint32_t const);                                           \
-	template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME(                                     \
-	    cereal::PortableBinaryOutputArchive&, std::uint32_t const);                                \
-	template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME(                                     \
-	    cereal::PortableBinaryInputArchive&, std::uint32_t const);
-
-EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(LogicalNeuronCompartments)
-EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(LogicalNeuronOnDLS)
-#endif
-
-} // namespace halco::hicann_dls::vx::v3
diff --git a/src/halco/hicann-dls/vx/v3/synapse.cpp b/src/halco/hicann-dls/vx/v3/synapse.cpp
deleted file mode 100644
index 98c1f100db95eee625c4dff5e9bca7c847e99e44..0000000000000000000000000000000000000000
--- a/src/halco/hicann-dls/vx/v3/synapse.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-#include "halco/hicann-dls/vx/v3/synapse.h"
-
-#include "halco/common/iter_all.h"
-#include "halco/hicann-dls/vx/v3/cadc.h"
-#include "halco/hicann-dls/vx/v3/chip.h"
-#include "halco/hicann-dls/vx/v3/correlation.h"
-#include "halco/hicann-dls/vx/v3/neuron.h"
-#include "halco/hicann-dls/vx/v3/padi.h"
-#include "halco/hicann-dls/vx/v3/ppu.h"
-#include "halco/hicann-dls/vx/v3/switch_rows.h"
-#include "halco/hicann-dls/vx/v3/synapse_driver.h"
-
-
-namespace halco::hicann_dls::vx::v3 {
-
-#include "halco/hicann-dls/vx/synapse_ns_includes_impl.h"
-
-common::typed_array<NeuronColumnOnDLS, EntryOnQuad> SynapseQuadColumnOnDLS::toNeuronColumnOnDLS()
-    const
-{
-	common::typed_array<NeuronColumnOnDLS, EntryOnQuad> ret;
-	for (auto const e : common::iter_all<EntryOnQuad>()) {
-		ret[e] = NeuronColumnOnDLS(
-		    ((toEnum() % (size / 2)) * EntryOnQuad::size + e.toEnum()) * 2 +
-		    (toEnum() / (size / 2)));
-	}
-	return ret;
-}
-
-NeuronConfigBlockOnDLS SynapseQuadOnDLS::toNeuronConfigBlockOnDLS() const
-{
-	bool east = toSynapseQuadColumnOnDLS() % (SynapseQuadColumnOnDLS::size / 2) >=
-	            (SynapseQuadColumnOnDLS::size / 4);
-	return NeuronConfigBlockOnDLS(toSynramOnDLS().toEnum() * 2 + east);
-}
-
-SynapseOnSynapseRow::SynapseOnSynapseRow(
-    EntryOnQuad const& syn_on_quad, SynapseQuadColumnOnDLS const& quad) :
-    rant_t(
-        (3 - syn_on_quad.toEnum()) * 2 +
-        (quad.toEnum() % (SynapseQuadColumnOnDLS::size / 2)) * EntryOnQuad::size * 2 +
-        quad.toEnum() / (SynapseQuadColumnOnDLS::size / 2))
-{}
-
-EntryOnQuad SynapseOnSynapseRow::toEntryOnQuad() const
-{
-	return EntryOnQuad(3 - ((toEnum() / 2) % EntryOnQuad::size));
-}
-
-SynapseQuadColumnOnDLS SynapseOnSynapseRow::toSynapseQuadColumnOnDLS() const
-{
-	return SynapseQuadColumnOnDLS(
-	    ((toEnum() % 2) * SynapseQuadColumnOnDLS::size / 2) + (toEnum() / (2 * EntryOnQuad::size)));
-}
-
-} // namespace halco::hicann_dls::vx