diff --git a/Applications/DataExplorer/DataView/StationTreeView.cpp b/Applications/DataExplorer/DataView/StationTreeView.cpp
index 7b61fc1ad4b16b5d711b197c7f96c7d9680d2605..84a7b4630f8cb812923257aafdad2e6efeb156d1 100644
--- a/Applications/DataExplorer/DataView/StationTreeView.cpp
+++ b/Applications/DataExplorer/DataView/StationTreeView.cpp
@@ -121,9 +121,9 @@ void StationTreeView::contextMenuEvent(QContextMenuEvent* event)
         QAction* setNameAction = menu.addAction("Set name...");
         connect(setNameAction, SIGNAL(triggered()), this,
                 SLOT(setNameForElement()));
-        if (static_cast<StationTreeModel*>(model())
-                ->stationFromIndex(index, temp_name)
-                ->type() == GeoLib::Station::StationType::BOREHOLE)
+        if (dynamic_cast<GeoLib::StationBorehole*>(
+                static_cast<StationTreeModel*>(model())->stationFromIndex(
+                    index, temp_name)))
         {
             QAction* stratAction = menu.addAction("Display Stratigraphy...");
             QAction* exportAction = menu.addAction("Export to GMS...");
diff --git a/Applications/DataExplorer/VtkVis/VtkStationSource.cpp b/Applications/DataExplorer/VtkVis/VtkStationSource.cpp
index 0e44ba4933a41a77e067e4a9fce25a0d9b90ae00..560afd8e69543741606c681e8da05ffdb94120e4 100644
--- a/Applications/DataExplorer/VtkVis/VtkStationSource.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkStationSource.cpp
@@ -95,8 +95,7 @@ int VtkStationSource::RequestData(vtkInformation* request,
         }
     }
 
-    bool isBorehole = static_cast<GeoLib::Station*>((*_stations)[0])->type() ==
-                      GeoLib::Station::StationType::BOREHOLE;
+    bool isBorehole = dynamic_cast<GeoLib::StationBorehole*>((*_stations)[0]);
 
     vtkSmartPointer<vtkInformation> outInfo =
         outputVector->GetInformationObject(0);
diff --git a/Applications/DataExplorer/VtkVis/VtkStationSource.h b/Applications/DataExplorer/VtkVis/VtkStationSource.h
index a422022d7e1115bfc2b6df0f092b1d68d86f9505..04d876f1ebd3d3e889e67b999f1c2bcb21edbfae 100644
--- a/Applications/DataExplorer/VtkVis/VtkStationSource.h
+++ b/Applications/DataExplorer/VtkVis/VtkStationSource.h
@@ -17,6 +17,7 @@
 #include <vtkPolyDataAlgorithm.h>
 
 #include "Applications/DataHolderLib/Color.h"
+#include "GeoLib/StationBorehole.h"
 #include "GeoLib/Station.h"
 #include "VtkAlgorithmProperties.h"
 
@@ -36,10 +37,6 @@ public:
     const std::map<std::string, DataHolderLib::Color>& getColorLookupTable() const
         { return _colorLookupTable; }
 
-    /// Returns the type of observation site represented in this source object
-    GeoLib::Station::StationType getType() const
-        { return static_cast<GeoLib::Station*>((*_stations)[0])->type(); };
-
     /// Sets a predefined color lookup table for the colouring of borehole stratigraphies
 //    int setColorLookupTable(const std::string &filename)
 //        { return GeoLib::readColorLookupTable(_colorLookupTable, filename); }
diff --git a/Applications/DataExplorer/mainwindow.cpp b/Applications/DataExplorer/mainwindow.cpp
index 591fbc0657f4843d6a8515375c87f6b3e973fd3e..548c9c38f279679328bd29a14bc67860cee5e23b 100644
--- a/Applications/DataExplorer/mainwindow.cpp
+++ b/Applications/DataExplorer/mainwindow.cpp
@@ -1242,17 +1242,16 @@ void MainWindow::showDiagramPrefsDialog(QModelIndex& index)
     GeoLib::Station* stn =
         _geo_model->getStationModel()->stationFromIndex(index, listName);
 
-    if ((stn->type() == GeoLib::Station::StationType::STATION) &&
-        stn->getSensorData())
+    if (dynamic_cast<GeoLib::StationBorehole*>(stn))
+    {
+        OGSError::box("No time series data available for borehole.");
+    }
+    else if (dynamic_cast<GeoLib::Station*>(stn) && stn->getSensorData())
     {
         auto* prefs(new DiagramPrefsDialog(stn));
         prefs->setAttribute(Qt::WA_DeleteOnClose);
         prefs->show();
     }
-    if (stn->type() == GeoLib::Station::StationType::BOREHOLE)
-    {
-        OGSError::box("No time series data available for borehole.");
-    }
 }
 
 void MainWindow::showDiagramPrefsDialog()
diff --git a/GeoLib/IO/XmlIO/Qt/XmlStnInterface.cpp b/GeoLib/IO/XmlIO/Qt/XmlStnInterface.cpp
index 5321bb8351cc9cb0cc60c3c9d85ae54467eaced2..0b7fe8bf5d2f25009c68c1cae799cc4bfee22348 100644
--- a/GeoLib/IO/XmlIO/Qt/XmlStnInterface.cpp
+++ b/GeoLib/IO/XmlIO/Qt/XmlStnInterface.cpp
@@ -264,8 +264,7 @@ bool XmlStnInterface::write()
     const std::vector<GeoLib::Point*>* stations(
         _geo_objs.getStationVec(export_name));
     bool const is_borehole =
-        static_cast<GeoLib::Station*>((*stations)[0])->type() ==
-        GeoLib::Station::StationType::BOREHOLE;
+        dynamic_cast<GeoLib::StationBorehole*>((*stations)[0]);
 
     doc.appendChild(root);
     QDomElement stationListTag = doc.createElement("stationlist");
diff --git a/GeoLib/SensorData.cpp b/GeoLib/SensorData.cpp
index 87918e9c523485e172519c3f06ea04983942c186..70b3f87f4fc9614e8c5bdc1d77279d063dc96dde 100644
--- a/GeoLib/SensorData.cpp
+++ b/GeoLib/SensorData.cpp
@@ -28,18 +28,16 @@ SensorData::SensorData(const std::string& file_name)
 }
 
 SensorData::SensorData(std::vector<std::size_t> time_steps)
-    : _start(time_steps[0]),
-      _end(time_steps[time_steps.size() - 1]),
+    : _start(time_steps.front()),
+      _end(time_steps.back()),
       _step_size(0),
       _time_unit(TimeStepType::NONE),
       _time_steps(time_steps)
 {
-    for (std::size_t i = 1; i < time_steps.size(); i++)
+    if (!std::is_sorted(
+            time_steps.begin(), time_steps.end(), std::less_equal{}))
     {
-        if (time_steps[i - 1] >= time_steps[i])
-        {
-            ERR("Error in SensorData() - Time series has no order!");
-        }
+        ERR("Error in SensorData() - Time series has no order!");
     }
 }
 
diff --git a/GeoLib/Station.cpp b/GeoLib/Station.cpp
index bf27f494f84df932b84ee78c76361f6886e78ddd..a7586ecdb45c73b7c5444085c39cd2a2f99c80c7 100644
--- a/GeoLib/Station.cpp
+++ b/GeoLib/Station.cpp
@@ -22,56 +22,49 @@
 
 namespace GeoLib
 {
-Station::Station(double x, double y, double z, std::string name,
-                 Station::StationType type)
-    : Point(x, y, z), _name(std::move(name)), _type(type)
+Station::Station(double x, double y, double z, std::string name)
+    : Point(x, y, z), _name(std::move(name))
 {
 }
 
-Station::Station(Point* coords, std::string name, Station::StationType type)
-    : Point(*coords), _name(std::move(name)), _type(type)
+Station::Station(Point* coords, std::string name)
+    : Point(*coords), _name(std::move(name))
 {
 }
 
 Station::Station(Station const& src)
     : Point(src),
       _name(src._name),
-      _type(src._type),
-      _station_value(src._station_value)
+      _station_value(src._station_value),
+      _sensor_data(src._sensor_data.get() != nullptr
+                       ? new SensorData(*(src._sensor_data.get()))
+                       : nullptr)
 {
 }
 
-Station::~Station()
-{
-    delete this->_sensor_data;
-}
-
 Station* Station::createStation(const std::string& line)
 {
-    Station* station = new Station();
     std::list<std::string> fields = BaseLib::splitString(line, '\t');
 
-    if (fields.size() >= 3)
-    {
-        auto it = fields.begin();
-        station->_name = *it;
-        (*station)[0] = std::strtod(
-            (BaseLib::replaceString(",", ".", *(++it))).c_str(), nullptr);
-        (*station)[1] = std::strtod(
-            (BaseLib::replaceString(",", ".", *(++it))).c_str(), nullptr);
-        if (++it != fields.end())
-        {
-            (*station)[2] = std::strtod(
-                (BaseLib::replaceString(",", ".", *it)).c_str(), nullptr);
-        }
-    }
-    else
+    if (fields.size() < 3)
     {
         INFO("Station::createStation() - Unexpected file format.");
-        delete station;
         return nullptr;
     }
-    return station;
+
+    auto it = fields.begin();
+    std::string name = *it;
+    auto const x = std::strtod(
+        (BaseLib::replaceString(",", ".", *(++it))).c_str(), nullptr);
+    auto const y = std::strtod(
+        (BaseLib::replaceString(",", ".", *(++it))).c_str(), nullptr);
+    auto z = 0.0;
+    if (++it != fields.end())
+    {
+        z = std::strtod((BaseLib::replaceString(",", ".", *it)).c_str(),
+                        nullptr);
+    }
+    return new Station(x, y, z, name);
 }
 
 Station* Station::createStation(const std::string& name, double x, double y,
diff --git a/GeoLib/Station.h b/GeoLib/Station.h
index 875998dcd6c9c8f5fbea7a8c3e33f7307302fb57..7c39ab31616e43ddba2aac723f1e0c51ac843bc6 100644
--- a/GeoLib/Station.h
+++ b/GeoLib/Station.h
@@ -14,6 +14,7 @@
 
 #pragma once
 
+#include <memory>
 #include <string>
 
 #include "Point.h"
@@ -35,14 +36,6 @@ namespace GeoLib
 class Station : public Point
 {
 public:
-    /// Signals if the object is a "simple" Station or a Borehole (i.e. containing borehole-specific information).
-    enum class StationType
-    {
-        INVALID = 0,
-        STATION,
-        BOREHOLE
-    };
-
     /**
      * \brief Constructor
      *
@@ -51,15 +44,11 @@ public:
      * \param y The y-coordinate of the station.
      * \param z The z-coordinate of the station.
      * \param name The name of the station.
-     * \param type The type of the station, see Station::StationType for
-     * possible values.
      */
     explicit Station(double x = 0.0, double y = 0.0, double z = 0.0,
-                     std::string name = "",
-                     Station::StationType type = Station::StationType::STATION);
+                     std::string name = "");
 
-    explicit Station(Point* coords, std::string name = "",
-                     Station::StationType type = Station::StationType::STATION);
+    explicit Station(Point* coords, std::string name = "");
 
     /**
      * Constructor copies the source object
@@ -67,16 +56,11 @@ public:
      */
     Station(Station const& src);
 
-    ~Station() override;
-
     /// Returns the name of the station.
     std::string const& getName() const { return _name; }
 
     void setName(std::string const& name) { _name = name; }
 
-    /// Returns the GeoSys-station-type for the station.
-    StationType type() const { return _type; }
-
     /// Creates a Station-object from information contained in a string (assuming the string has the right format)
     static Station* createStation(const std::string &line);
 
@@ -90,16 +74,18 @@ public:
     void setStationValue(double station_value) { this->_station_value = station_value; }
 
     /// Allows to add sensor data from a CSV file to the observation site
-    void addSensorDataFromCSV(const std::string &file_name) { this->_sensor_data = new SensorData(file_name); }
+    void addSensorDataFromCSV(const std::string& file_name)
+    {
+        _sensor_data.reset(new SensorData(file_name));
+    }
 
     /// Returns all the sensor data for this observation site
-    const SensorData* getSensorData() const { return this->_sensor_data; }
+    const SensorData* getSensorData() const { return _sensor_data.get(); }
 
 private:
     std::string _name;
-    StationType _type{Station::StationType::STATION};  // GeoSys Station Type
     double _station_value{0.0};
-    SensorData* _sensor_data{nullptr};
+    std::unique_ptr<SensorData> _sensor_data{nullptr};
 };
 
 bool isStation(GeoLib::Point const* pnt);
diff --git a/GeoLib/StationBorehole.cpp b/GeoLib/StationBorehole.cpp
index aa521ad5c065d271c9526d04475669fde32d207e..9e0119f74257bf37ef15141189873b5cf43aca64 100644
--- a/GeoLib/StationBorehole.cpp
+++ b/GeoLib/StationBorehole.cpp
@@ -29,15 +29,10 @@ namespace GeoLib
 // The Borehole class //
 ////////////////////////
 
-StationBorehole::StationBorehole(double x,
-                                 double y,
-                                 double z,
-                                 double const depth,
-                                 const std::string& name,
+StationBorehole::StationBorehole(double x, double y, double z,
+                                 double const depth, const std::string& name,
                                  int date)
-    : Station(x, y, z, name, Station::StationType::BOREHOLE),
-      _depth(depth),
-      _date(date)
+    : Station(x, y, z, name), _depth(depth), _date(date)
 {
     // add first point of borehole
     _profilePntVec.push_back(this);