diff --git a/data_storage.cpp b/data_storage.cpp
index daef44f3d3156575c1de3665abf209a87bf96c17..c82b64998b5926e01c305e8bde19751cd515db87 100644
--- a/data_storage.cpp
+++ b/data_storage.cpp
@@ -41,6 +41,21 @@ DataStorage::DataStorage(
   buffered_spikes_.reserve(32 * 1024 * 1024 / sizeof(Spike)); // Reserve 32mb
 }
 
+void DataStorage::AddNeuronId(uint64_t neuron_id) {
+  std::unique_lock<std::mutex> lock(neuron_ids_mutex_);
+  const auto insert_position =
+      std::lower_bound(neuron_ids_.begin(), neuron_ids_.end(), neuron_id);
+  if (insert_position == neuron_ids_.end() || *insert_position != neuron_id) {
+    neuron_ids_.insert(insert_position, neuron_id);
+  }
+}
+
+std::vector<uint64_t> DataStorage::GetNeuronIds() {
+  std::unique_lock<std::mutex> lock(neuron_ids_mutex_);
+  std::vector<uint64_t> temp_neuron_ids = neuron_ids_;
+  return temp_neuron_ids;
+}
+
 void DataStorage::AddSpike(double simulation_time, std::uint64_t gid) {
   std::unique_lock<std::mutex> lock(spike_mutex_);
   constexpr auto spike_occured_before = [](const Spike& lhs, const Spike& rhs) {
@@ -95,27 +110,31 @@ void DataStorage::Flush() {
   // buffered_spikes_.clear();
 }
 
-void DataStorage::AddMultimeterMeasurement(std::uint64_t device_id, 
-    const std::string& attribute_name, const double simulation_time,
-    const std::uint64_t gid, const double value) {
+void DataStorage::AddMultimeterMeasurement(std::uint64_t device_id,
+                                           const std::string& attribute_name,
+                                           const double simulation_time,
+                                           const std::uint64_t gid,
+                                           const double value) {
   std::unique_lock<std::mutex> lock(measurement_mutex_);
   auto& measurement = buffered_measurements_[device_id][attribute_name];
   auto& simulation_times = measurement.simulation_times;
   auto& gids = measurement.gids;
   auto& values = measurement.values;
 
-  auto time_iterator = std::lower_bound(simulation_times.begin(), 
-      simulation_times.end(), simulation_time);
+  auto time_iterator = std::lower_bound(
+      simulation_times.begin(), simulation_times.end(), simulation_time);
   auto time_index = std::distance(simulation_times.begin(), time_iterator);
-  if (time_iterator == simulation_times.end() || 
+  if (time_iterator == simulation_times.end() ||
       *time_iterator != simulation_time) {
     simulation_times.insert(time_iterator, simulation_time);
-    
-    auto new_values = std::vector<double>(simulation_times.size() * gids.size(), 0.0);
+
+    auto new_values =
+        std::vector<double>(simulation_times.size() * gids.size(), 0.0);
     for (std::size_t t = 0; t < simulation_times.size(); ++t)
       for (std::size_t g = 0; g < gids.size(); ++g)
         if (t != time_index)
-          new_values[t * gids.size() + g] = values[(t > time_index ? t - 1 : t) * gids.size() + g];
+          new_values[t * gids.size() + g] =
+              values[(t > time_index ? t - 1 : t) * gids.size() + g];
     values = new_values;
   }
 
@@ -123,20 +142,23 @@ void DataStorage::AddMultimeterMeasurement(std::uint64_t device_id,
   auto gid_index = std::distance(gids.begin(), gid_iterator);
   if (gid_iterator == gids.end() || *gid_iterator != gid) {
     gids.insert(gid_iterator, gid);
-  
-    auto new_values = std::vector<double>(simulation_times.size() * gids.size(), 0.0);
+
+    auto new_values =
+        std::vector<double>(simulation_times.size() * gids.size(), 0.0);
     for (std::size_t t = 0; t < simulation_times.size(); ++t)
       for (std::size_t g = 0; g < gids.size(); ++g)
         if (g != gid_index)
-          new_values[t * gids.size() + g] = values[t * gids.size() + (g > gid_index ? g - 1 : g)];
+          new_values[t * gids.size() + g] =
+              values[t * gids.size() + (g > gid_index ? g - 1 : g)];
     values = new_values;
   }
-  
+
   values[time_index * gids.size() + gid_index] = value;
 }
 
-std::unordered_map<std::uint64_t, std::unordered_map<std::string, 
-    MultimeterMeasurements>> DataStorage::GetMultimeterMeasurements() {
+std::unordered_map<std::uint64_t,
+                   std::unordered_map<std::string, MultimeterMeasurements>>
+DataStorage::GetMultimeterMeasurements() {
   std::unique_lock<std::mutex> lock(measurement_mutex_);
   auto measurements = buffered_measurements_;
   return measurements;
diff --git a/data_storage.hpp b/data_storage.hpp
index 0ecdbefd9dce8bacc09dbdfdcfa1bb917e87db84..580a0c9348982197007202626aed2075394689f7 100644
--- a/data_storage.hpp
+++ b/data_storage.hpp
@@ -36,6 +36,9 @@ class DataStorage {
   DataStorage(const std::string& filename
               /*, hsize_t time_chunk_size, hsize_t neuronids_chunk_size*/);
 
+  void AddNeuronId(uint64_t neuron_ids);
+  std::vector<uint64_t> GetNeuronIds();
+
   void AddSpike(double simulation_time, std::uint64_t gid);
   std::vector<Spike> GetSpikes();
   void Flush();
@@ -52,6 +55,9 @@ class DataStorage {
  private:
   // std::unique_ptr<H5::H5File> h5_file_;
 
+  std::mutex neuron_ids_mutex_;
+  std::vector<uint64_t> neuron_ids_;
+
   // uint64_t flushed_spikes_count = 0;
   std::vector<Spike> buffered_spikes_;
   // H5::DataSet spikes_times_dataset_;
diff --git a/recording_backend_insite.cpp b/recording_backend_insite.cpp
index 7b80a00eb4a890b5bef7eec68a3ca074cdac3504..2810505e55910583045398cc08d381088f889e61 100644
--- a/recording_backend_insite.cpp
+++ b/recording_backend_insite.cpp
@@ -31,12 +31,12 @@ std::string ReadDatabaseHost() {
   }
 }
 
-}
+}  // namespace
 
 RecordingBackendInsite::RecordingBackendInsite()
     : data_storage_("tgest"),
-      http_server_("http://0.0.0.0:" + get_port_string(), &data_storage_),
-      database_connection_("postgresql://postgres@" + ReadDatabaseHost()) {
+      database_connection_("postgresql://postgres@" + ReadDatabaseHost()),
+      http_server_("http://0.0.0.0:" + get_port_string(), &data_storage_, &database_connection_) {
   pqxx::work txn(database_connection_);
   simulation_node_id_ = txn.exec1(
                                "INSERT INTO nest_simulation_node (address) "
@@ -266,6 +266,7 @@ void RecordingBackendInsite::write(const nest::RecordingDevice& device,
         std::lower_bound(new_neuron_infos_.begin(), new_neuron_infos_.end(),
                          neuron_info),
         neuron_info);
+    data_storage_.AddNeuronId(neuron_info.gid);
   }
 }
 
diff --git a/recording_backend_insite.h b/recording_backend_insite.h
index aa8ec277c0b42494f00ca8a632c7cf690c100d52..93c071e3d9e575e041af79e9cac5ac5c8026b6c9 100644
--- a/recording_backend_insite.h
+++ b/recording_backend_insite.h
@@ -62,8 +62,8 @@ class RecordingBackendInsite : public nest::RecordingBackend {
   std::string get_port_string() const;
 
   DataStorage data_storage_;
-  HttpServer http_server_;
   pqxx::connection database_connection_;
+  HttpServer http_server_;
   int simulation_node_id_;
   std::vector<NeuronInfo> neuron_infos_;
   std::vector<NeuronInfo> new_neuron_infos_;