diff --git a/timeseriesviewer/profilevisualization.py b/timeseriesviewer/profilevisualization.py
index cc3031ea423e247b00b2d4091faed2bf0c9749d1..38ce7662977298c96551e029ebfca10fa0d93de6 100644
--- a/timeseriesviewer/profilevisualization.py
+++ b/timeseriesviewer/profilevisualization.py
@@ -156,7 +156,6 @@ class PlotSettingsModel2DWidgetDelegate(QStyledItemDelegate):
         super(PlotSettingsModel2DWidgetDelegate, self).__init__(parent=parent)
         self._preferedSize = QgsFieldExpressionWidget().sizeHint()
         self.mTableView = tableView
-        self.mFeatureListModel = QgsFeatureListModel()
         self.mTemporalProfileLayer = temporalProfileLayer
         self.mTimeSeries = temporalProfileLayer.timeSeries()
 
@@ -235,12 +234,10 @@ class PlotSettingsModel2DWidgetDelegate(QStyledItemDelegate):
 
                 elif cname == model.cnTemporalProfile:
                     w = QgsFeatureListComboBox(parent=parent)
-                    #w = QComboBox(parent=parent)
-                    #w.setModel(self.mTemporalProfileListModel)
                     w.setSourceLayer(self.mTemporalProfileLayer)
-                    w.setIdentifierField('$id')
-                    w.setDisplayExpression('$id + "name"')
-                    s = ""
+                    w.setIdentifierField('id')
+                    w.setDisplayExpression('to_string("id")+\'  \'+"name"')
+                    w.setAllowNull(False)
                 else:
                     raise NotImplementedError()
         return w
@@ -292,12 +289,8 @@ class PlotSettingsModel2DWidgetDelegate(QStyledItemDelegate):
                     editor.setCurrentIndex(idx.row())
             elif cname == model.cnTemporalProfile:
                 assert isinstance(editor, QgsFeatureListComboBox)
-
                 value = editor.identifierValue()
-
                 if value != QVariant():
-                    row = editor.currentIndex()
-
                     plotStyle = index.data(role=Qt.UserRole)
                     TP = plotStyle.temporalProfile()
                     editor.setIdentifierValue(TP.id())
@@ -331,10 +324,10 @@ class PlotSettingsModel2DWidgetDelegate(QStyledItemDelegate):
 
             elif cname == model.cnTemporalProfile:
                 assert isinstance(w, QgsFeatureListComboBox)
-                t = w.currentText()
-                TP = w.itemData(w.currentIndex(), role=Qt.UserRole)
-                #assert isinstance(TP, TemporalProfile)
-                model.setData(index, TP, Qt.EditRole)
+                fid = w.identifierValue()
+                if isinstance(fid, int):
+                    TP = self.mTemporalProfileLayer.mProfiles.get(fid)
+                    model.setData(index, TP, Qt.EditRole)
 
             else:
                 raise NotImplementedError()
@@ -416,10 +409,10 @@ class PlotSettingsModel3DWidgetDelegate(QStyledItemDelegate):
 
                 elif cname == model.cnTemporalProfile:
                     w = QgsFeatureListComboBox(parent=parent)
-
                     w.setSourceLayer(self.mTemporalProfileLayer)
+                    w.setIdentifierField('id')
+                    w.setDisplayExpression('to_string("id")+\'  \'+"name"')
                     w.setAllowNull(False)
-
                 else:
                     raise NotImplementedError()
         return w
@@ -491,11 +484,14 @@ class PlotSettingsModel3DWidgetDelegate(QStyledItemDelegate):
                     editor.setCurrentIndex(idx.row())
             elif cname == model.cnTemporalProfile:
                 assert isinstance(editor, QgsFeatureListComboBox)
+                value = editor.identifierValue()
+                if value != QVariant():
+                    plotStyle = index.data(role=Qt.UserRole)
+                    TP = plotStyle.temporalProfile()
+                    editor.setIdentifierValue(TP.id())
+                else:
+                    s  = ""
 
-                TP = index.data(role=Qt.UserRole)
-                if isinstance(TP, TemporalProfile):
-                    idx = m.tp2idx(TP)
-                    editor.setCurrentIndex(idx)
             else:
                 raise NotImplementedError()
 
@@ -525,10 +521,11 @@ class PlotSettingsModel3DWidgetDelegate(QStyledItemDelegate):
                 s = ""
 
             elif cname == model.cnTemporalProfile:
-                assert isinstance(w, QComboBox)
-                TP = w.itemData(w.currentIndex(), role=Qt.UserRole)
-                #assert isinstance(TP, TemporalProfile)
-                model.setData(index, TP, Qt.EditRole)
+                assert isinstance(w, QgsFeatureListComboBox)
+                fid = w.identifierValue()
+                if isinstance(fid, int):
+                    TP = self.mTemporalProfileLayer.mProfiles.get(fid)
+                    model.setData(index, TP, Qt.EditRole)
 
             else:
                 raise NotImplementedError()
@@ -1228,16 +1225,7 @@ class ProfileViewDockUI(QgsDockWidget, loadUI('profileviewdock.ui')):
         self.pxViewModel2D = None
         self.pxViewModel3D = None
 
-        self.tableView2DProfiles.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)
-        self.tableView2DProfiles.setSortingEnabled(True)
-        self.tableViewTemporalProfiles.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)
-        self.tableViewTemporalProfiles.setSortingEnabled(True)
-
-        self.menuTPSaveOptions = QMenu()
-        self.menuTPSaveOptions.addAction(self.actionSaveTPCoordinates)
-        self.menuTPSaveOptions.addAction(self.actionSaveTPCSV)
-        self.menuTPSaveOptions.addAction(self.actionSaveTPVector)
-        self.btnSaveTemporalProfiles.setMenu(self.menuTPSaveOptions)
+        self.tableView2DProfiles.horizontalHeader().setResizeMode(QHeaderView.Interactive)
 
     def init3DWidgets(self, mode):
         assert mode in ['gl']
@@ -1310,11 +1298,11 @@ class SpectralTemporalVisualization(QObject):
     sigMoveToDate = pyqtSignal(np.datetime64)
 
 
-    def __init__(self, timeSeries, parent=None):
+    def __init__(self, timeSeries, profileDock):
         super(SpectralTemporalVisualization, self).__init__()
 
-
-        self.ui = ProfileViewDockUI(parent)
+        assert isinstance(profileDock, ProfileViewDockUI)
+        self.ui = profileDock
 
         import timeseriesviewer.pixelloader
         if DEBUG:
@@ -1330,18 +1318,34 @@ class SpectralTemporalVisualization(QObject):
         self.plot3D = self.ui.plotWidget3D
 
         # temporal profile collection to store loaded values
-        self.temporalProfileLayer = TemporalProfileLayer(self.TS)
-        self.temporalProfileLayer.setMaxProfiles(self.ui.sbMaxTP.value())
-        self.temporalProfileLayer.sigTemporalProfilesAdded.connect(self.onTemporalProfilesAdded)
+        self.mTemporalProfileLayer = TemporalProfileLayer(self.TS)
+        self.mTemporalProfileLayer.sigTemporalProfilesAdded.connect(self.onTemporalProfilesAdded)
+        self.mTemporalProfileLayer.startEditing()
         #self.tpCollectionListModel = TemporalProfileCollectionListModel(self.tpCollection)
-        self.tpModel = TemporalProfileTableModel(self.temporalProfileLayer)
+        self.tpModel = TemporalProfileTableModel(self.mTemporalProfileLayer)
         self.tpFilterModel = TemporalProfileTableFilterModel(self.tpModel)
 
-        self.ui.tableViewTemporalProfiles.setModel(self.tpModel)
+        self.ui.tableViewTemporalProfiles.setModel(self.tpFilterModel)
         self.ui.tableViewTemporalProfiles.selectionModel().selectionChanged.connect(self.onTemporalProfileSelectionChanged)
-        self.ui.tableViewTemporalProfiles.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)
+        self.ui.tableViewTemporalProfiles.horizontalHeader().setResizeMode(QHeaderView.Interactive)
+        self.ui.tableViewTemporalProfiles.setSortingEnabled(True)
         #self.ui.tableViewTemporalProfiles.contextMenuEvent = self.onTemporalProfilesContextMenu
         # pixel loader to load pixel values in parallel
+        config = QgsAttributeTableConfig()
+        config.update(self.mTemporalProfileLayer.fields())
+        config.setActionWidgetVisible(True)
+
+        hidden = [FN_ID]
+        for i, columnConfig in enumerate(config.columns()):
+
+            assert isinstance(columnConfig, QgsAttributeTableConfig.ColumnConfig)
+            config.setColumnHidden(i, columnConfig.name in hidden)
+
+
+        self.mTemporalProfilesTableConfig = config
+        self.mTemporalProfileLayer.setAttributeTableConfig(self.mTemporalProfilesTableConfig)
+        self.tpFilterModel.setAttributeTableConfig(self.mTemporalProfilesTableConfig)
+        #self.ui.tableViewTemporalProfiles.setAttributeTable(self.mTemporalProfilesTableConfig)
 
 
         self.pixelLoader = PixelLoader()
@@ -1355,10 +1359,10 @@ class SpectralTemporalVisualization(QObject):
         self.ui.tableView2DProfiles.setModel(self.plotSettingsModel2D)
         self.ui.tableView2DProfiles.setSortingEnabled(False)
         self.ui.tableView2DProfiles.selectionModel().selectionChanged.connect(self.onPlot2DSelectionChanged)
-        self.ui.tableView2DProfiles.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)
+        self.ui.tableView2DProfiles.horizontalHeader().setResizeMode(QHeaderView.Interactive)
         self.plotSettingsModel2D.sigDataChanged.connect(self.requestUpdate)
         self.plotSettingsModel2D.rowsInserted.connect(self.onRowsInserted2D)
-        self.delegateTableView2D = PlotSettingsModel2DWidgetDelegate(self.ui.tableView2DProfiles, self.temporalProfileLayer)
+        self.delegateTableView2D = PlotSettingsModel2DWidgetDelegate(self.ui.tableView2DProfiles, self.mTemporalProfileLayer)
         self.delegateTableView2D.setItemDelegates(self.ui.tableView2DProfiles)
 
 
@@ -1367,14 +1371,16 @@ class SpectralTemporalVisualization(QObject):
         self.ui.tableView3DProfiles.setModel(self.plotSettingsModel3D)
         self.ui.tableView3DProfiles.setSortingEnabled(False)
         self.ui.tableView2DProfiles.selectionModel().selectionChanged.connect(self.onPlot3DSelectionChanged)
-        self.ui.tableView3DProfiles.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)
+        self.ui.tableView3DProfiles.horizontalHeader().setResizeMode(QHeaderView.Interactive)
         self.plotSettingsModel3D.rowsInserted.connect(self.onRowsInserted3D)
-        self.delegateTableView3D = PlotSettingsModel3DWidgetDelegate(self.ui.tableView3DProfiles, self.temporalProfileLayer)
+        self.delegateTableView3D = PlotSettingsModel3DWidgetDelegate(self.ui.tableView3DProfiles, self.mTemporalProfileLayer)
         self.delegateTableView3D.setItemDelegates(self.ui.tableView3DProfiles)
 
         self.reset3DCamera()
 
 
+        def temporalProfileLayer():
+            return self.mTemporalProfileLayer
 
 
         def onTemporalProfilesRemoved(removedProfiles):
@@ -1382,7 +1388,7 @@ class SpectralTemporalVisualization(QObject):
 
             affectedStyles2D = [p for p in self.plotSettingsModel2D if p.temporalProfile() in removedProfiles]
             affectedStyles3D = [p for p in self.plotSettingsModel3D if p.temporalProfile() in removedProfiles]
-            alternativeProfile = self.temporalProfileLayer[-1] if len(self.temporalProfileLayer) > 0 else None
+            alternativeProfile = self.mTemporalProfileLayer[-1] if len(self.mTemporalProfileLayer) > 0 else None
             for s in affectedStyles2D:
                 assert isinstance(s, TemporalProfile2DPlotStyle)
                 m = self.plotSettingsModel2D
@@ -1397,7 +1403,7 @@ class SpectralTemporalVisualization(QObject):
                 idx = m.createIndex(idx.row(), m.columnNames.index(m.cnTemporalProfile))
                 m.setData(idx, alternativeProfile, Qt.EditRole)
 
-        self.temporalProfileLayer.sigTemporalProfilesRemoved.connect(onTemporalProfilesRemoved)
+        self.mTemporalProfileLayer.sigTemporalProfilesRemoved.connect(onTemporalProfilesRemoved)
 
         # remove / add plot style
         def on2DPlotStyleRemoved(plotStyles):
@@ -1419,8 +1425,8 @@ class SpectralTemporalVisualization(QObject):
             if v != n:
                 self.ui.sbMaxTP.setValue(n)
 
-        self.temporalProfileLayer.sigMaxProfilesChanged.connect(onMaxProfilesChanged)
-        self.temporalProfileLayer.setMaxProfiles(SETTINGS.value('max_temporalprofiles', 64))
+        self.mTemporalProfileLayer.sigMaxProfilesChanged.connect(onMaxProfilesChanged)
+        self.mTemporalProfileLayer.setMaxProfiles(SETTINGS.value('max_temporalprofiles', 64))
 
 
 
@@ -1437,12 +1443,12 @@ class SpectralTemporalVisualization(QObject):
 
         self.initActions()
 
-    def profileLocationLayer(self):
+    def temporalProfileLayer(self):
         """
         Returns a QgsVectorLayer that is used to store profile coordinates.
         :return:
         """
-        return self.temporalProfileLayer.mLocations
+        return self.mTemporalProfileLayer
 
     def onTemporalProfilesContextMenu(self, event):
         assert isinstance(event, QContextMenuEvent)
@@ -1510,7 +1516,7 @@ class SpectralTemporalVisualization(QObject):
             m.removeTemporalProfiles(temporalProfiles)
 
     def createNewPlotStyle2D(self):
-        l = len(self.temporalProfileLayer)
+        l = len(self.mTemporalProfileLayer)
 
 
         plotStyle = TemporalProfile2DPlotStyle()
@@ -1520,8 +1526,8 @@ class SpectralTemporalVisualization(QObject):
         if len(sensors) > 0:
             plotStyle.setSensor(sensors[0])
 
-        if len(self.temporalProfileLayer) > 0:
-            temporalProfile = self.temporalProfileLayer[0]
+        if len(self.mTemporalProfileLayer) > 0:
+            temporalProfile = self.mTemporalProfileLayer[0]
             plotStyle.setTemporalProfile(temporalProfile)
 
 
@@ -1552,8 +1558,8 @@ class SpectralTemporalVisualization(QObject):
         plotStyle = TemporalProfile3DPlotStyle()
         plotStyle.sigExpressionUpdated.connect(self.updatePlot3D)
 
-        if len(self.temporalProfileLayer) > 0:
-            temporalProfile = self.temporalProfileLayer[0]
+        if len(self.mTemporalProfileLayer) > 0:
+            temporalProfile = self.mTemporalProfileLayer[0]
             plotStyle.setTemporalProfile(temporalProfile)
             if len(self.plotSettingsModel3D) > 0:
                 color = self.plotSettingsModel3D[-1].color()
@@ -1573,8 +1579,9 @@ class SpectralTemporalVisualization(QObject):
             sensor = pdi.mPlotStyle.sensor()
             tp = pdi.mPlotStyle.temporalProfile()
             if isinstance(tp, TemporalProfile) and isinstance(sensor, SensorInstrument):
+                c = tp.coordinate()
                 info = ['Sensor:{}'.format(sensor.name()),
-                        'Coordinate:{}, {}'.format(tp.mCoordinate.x(), tp.mCoordinate.y())]
+                        'Coordinate:{}, {}'.format(c.x(), c.y())]
                 self.ui.tbInfo2D.setPlainText('\n'.join(info))
 
 
@@ -1583,9 +1590,9 @@ class SpectralTemporalVisualization(QObject):
             sensor = pdi.mPlotStyle.sensor()
             tp = pdi.mPlotStyle.temporalProfile()
             if isinstance(tp, TemporalProfile) and isinstance(sensor, SensorInstrument):
-
+                c = tp.coordinate()
                 info = ['Sensor: {}'.format(sensor.name()),
-                        'Coordinate: {}, {}'.format(tp.mCoordinate.x(), tp.mCoordinate.y())]
+                        'Coordinate: {}, {}'.format(c.x(), c.y())]
 
                 for item in spottedItems:
                     pos = item.pos()
@@ -1597,14 +1604,14 @@ class SpectralTemporalVisualization(QObject):
                 self.ui.tbInfo2D.setPlainText('\n'.join(info))
 
     def onTemporalProfilesAdded(self, profiles):
-        self.temporalProfileLayer.prune()
+        self.mTemporalProfileLayer.prune()
         for plotStyle in self.plotSettingsModel3D:
             assert isinstance(plotStyle, TemporalProfilePlotStyleBase)
             if not isinstance(plotStyle.temporalProfile(), TemporalProfile):
                 r = self.plotSettingsModel3D.plotStyle2idx(plotStyle).row()
                 c = self.plotSettingsModel3D.columnIndex(self.plotSettingsModel3D.cnTemporalProfile)
                 idx = self.plotSettingsModel3D.createIndex(r,c)
-                self.plotSettingsModel3D.setData(idx, self.temporalProfileLayer[0])
+                self.plotSettingsModel3D.setData(idx, self.mTemporalProfileLayer[0])
 
     def onTemporalProfileSelectionChanged(self, selected, deselected):
         nSelected = len(selected)
@@ -1623,81 +1630,23 @@ class SpectralTemporalVisualization(QObject):
 
         self.ui.actionRemoveStyle2D.setEnabled(False)
         self.ui.actionRemoveTemporalProfile.setEnabled(False)
-
-
-        self.ui.btnAddStyle2D.setDefaultAction(self.ui.actionAddStyle2D)
-        self.ui.btnRemoveStyle2D.setDefaultAction(self.ui.actionRemoveStyle2D)
-
-        self.ui.btnLoadTPFromOgr.setDefaultAction(self.ui.actionLoadTPFromOgr)
-
-        self.ui.btnAddStyle3D.setDefaultAction(self.ui.actionAddStyle3D)
-        self.ui.btnRemoveStyle3D.setDefaultAction(self.ui.actionRemoveStyle3D)
-
         self.ui.actionAddStyle2D.triggered.connect(self.createNewPlotStyle2D)
         self.ui.actionAddStyle3D.triggered.connect(self.createNewPlotStyle3D)
-
-
-        self.ui.btnRefresh2D.setDefaultAction(self.ui.actionRefresh2D)
-        self.ui.btnRefresh3D.setDefaultAction(self.ui.actionRefresh3D)
-        self.ui.btnRemoveTemporalProfile.setDefaultAction(self.ui.actionRemoveTemporalProfile)
-
-        self.ui.btnReset2DPlot.setDefaultAction(self.ui.actionReset2DPlot)
-        self.ui.btnReset3DCamera.setDefaultAction(self.ui.actionReset3DCamera)
-
         self.ui.actionRefresh2D.triggered.connect(self.updatePlot2D)
         self.ui.actionRefresh3D.triggered.connect(self.updatePlot3D)
-
-        self.ui.btnLoadProfile1.setDefaultAction(self.ui.actionLoadProfileRequest)
-        self.ui.btnLoadProfile2.setDefaultAction(self.ui.actionLoadProfileRequest)
-        self.ui.btnLoadProfile3.setDefaultAction(self.ui.actionLoadProfileRequest)
-
-
-
         self.ui.actionRemoveStyle2D.triggered.connect(lambda:self.removePlotStyles2D(self.selected2DPlotStyles()))
         self.ui.actionRemoveTemporalProfile.triggered.connect(lambda :self.removeTemporalProfiles(self.selectedTemporalProfiles()))
 
         self.ui.actionReset2DPlot.triggered.connect(self.plot2D.resetViewBox)
         self.plot2D.resetTransform()
         self.ui.actionReset3DCamera.triggered.connect(self.reset3DCamera)
+        self.ui.actionLoadTPFromOgr.triggered.connect(lambda : self.loadCoordinatesFromOgr(None))
 
-        self.temporalProfileLayer.sigMaxProfilesChanged.connect(self.ui.sbMaxTP.setValue)
-        self.ui.sbMaxTP.valueChanged.connect(self.temporalProfileLayer.setMaxProfiles)
 
-        self.ui.actionLoadTPFromOgr.triggered.connect(lambda : self.loadCoordinatesFromOgr(None))
+        #set actions to be shown in the TemporalProfileTableView context menu
+        ma = [self.ui.actionSaveTemporalProfiles, self.ui.actionLoadMissingValues]
+        self.ui.tableViewTemporalProfiles.setContextMenuActions(ma)
 
-        from timeseriesviewer.temporalprofiles2d import saveTemporalProfiles
-        DEF_PATH = None
-
-        self.ui.actionSaveTPCoordinates.triggered.connect(
-            lambda: saveTemporalProfiles(self.temporalProfileLayer[:],
-                                         QFileDialog.getSaveFileName(
-                        self.ui, 'Save Temporal Profile Coordinates',
-                        DEF_PATH, 'ESRI Shapefile (*.shp);;Geopackage (*.gpkg);;Textfile (*.csv *.txt)'
-                    )[0], mode='coordinate'
-                                         )
-        )
-
-        self.ui.actionSaveTPCSV.triggered.connect(
-            lambda: saveTemporalProfiles(self.temporalProfileLayer[:],
-                                         QFileDialog.getSaveFileName(
-                                             self.ui, 'Save Temporal Profiles to Text File.',
-                                             DEF_PATH,
-                                             'Textfile (*.csv *.txt)'
-                                         )[0], mode ='all'
-                                         )
-        )
-
-
-        self.ui.actionSaveTPVector.triggered.connect(
-            lambda: saveTemporalProfiles(self.temporalProfileLayer[:],
-                                         QFileDialog.getSaveFileName(
-                                             self.ui, 'Save Temporal Profiles to Vector File.',
-                                             DEF_PATH,
-                                             'ESRI Shapefile (*.shp);;Geopackage (*.gpkg)'
-                                         )[0], mode = 'all'
-                                         )
-        )
-        #todo: self.ui.actionRemoveStyle2D.triggered.connect(self.plotSettingsModel.createPlotStyle)
 
     def loadCoordinatesFromOgr(self, path):
         if path is None:
@@ -1720,21 +1669,16 @@ class SpectralTemporalVisualization(QObject):
                 if isinstance(geom, QgsGeometry):
                     point = geom.centroid().constGet()
                     #TP = TemporalProfile(self.TS, SpatialPoint(ds.crs(), point))
-                    TP = self.temporalProfileLayer.createTemporaProfile(self.TS, SpatialPoint(ds.crs(), point))
+                    TP = self.mTemporalProfileLayer.createTemporaProfile(self.TS, SpatialPoint(ds.crs(), point))
                     name = ' '.join([str(a) for a in feature.attributes()])
                     TP.setName(name)
-                    if not TP in self.temporalProfileLayer:
+                    if not TP in self.mTemporalProfileLayer:
                         newProfiles.append(TP)
 
             if True and len(newProfiles) > 0:
-                self.temporalProfileLayer.setMaxProfiles(len(self.temporalProfileLayer) + len(newProfiles))
-
-                self.temporalProfileLayer.insertTemporalProfiles(newProfiles)
-
-
-
-
+                self.mTemporalProfileLayer.setMaxProfiles(len(self.mTemporalProfileLayer) + len(newProfiles))
 
+                self.mTemporalProfileLayer.insertTemporalProfiles(newProfiles)
 
 
     def reset3DCamera(self, *args):
@@ -1762,7 +1706,7 @@ class SpectralTemporalVisualization(QObject):
         if d.success():
 
             t = 'Loaded {} pixel from {}.'.format(len(d.resProfiles), bn)
-            self.temporalProfileLayer.addPixelLoaderResult(d)
+            self.mTemporalProfileLayer.addPixelLoaderResult(d)
             self.updateRequested = True
         else:
             t = 'Failed loading from {}.'.format(bn)
@@ -1810,7 +1754,7 @@ class SpectralTemporalVisualization(QObject):
         """
         Loads all band values of collected locations that have not been loaded until now
         """
-        spatialPoints = [tp.coordinate() for tp in self.temporalProfileLayer]
+        spatialPoints = [tp.coordinate() for tp in self.mTemporalProfileLayer]
         self.loadCoordinate(spatialPoints=spatialPoints, mode='all', backgroundProcess=backgroundProcess)
 
     LOADING_MODES = ['missing','reload','all']
@@ -1861,12 +1805,12 @@ class SpectralTemporalVisualization(QObject):
 
         for spatialPoint in spatialPoints:
             assert isinstance(spatialPoint, SpatialPoint)
-            TP = self.temporalProfileLayer.fromSpatialPoint(spatialPoint)
+            TP = self.mTemporalProfileLayer.fromSpatialPoint(spatialPoint)
             #if not TP exists for this point, create an empty one
             if not isinstance(TP, TemporalProfile):
-                TP = self.temporalProfileLayer.createTemporalProfiles(spatialPoint)[0]
+                TP = self.mTemporalProfileLayer.createTemporalProfiles(spatialPoint)[0]
 
-                if len(self.temporalProfileLayer) == 1:
+                if len(self.mTemporalProfileLayer) == 1:
                     if len(self.plotSettingsModel2D) == 0:
                         self.createNewPlotStyle2D()
 
@@ -1945,7 +1889,7 @@ class SpectralTemporalVisualization(QObject):
     @QtCore.pyqtSlot()
     def onDataUpdate(self):
 
-        self.temporalProfileLayer.prune()
+        self.mTemporalProfileLayer.prune()
 
         for plotSetting in self.plotSettingsModel2D:
             assert isinstance(plotSetting, TemporalProfile2DPlotStyle)
@@ -1997,7 +1941,7 @@ class SpectralTemporalVisualization(QObject):
             for plotStyle3D in self.plotSettingsModel3D:
                 assert isinstance(plotStyle3D, TemporalProfile3DPlotStyle)
                 if plotStyle3D.isPlotable():
-                    coordinates.append(plotStyle3D.temporalProfile().mCoordinate)
+                    coordinates.append(plotStyle3D.temporalProfile().coordinate())
 
             if len(coordinates) > 0:
                 self.loadCoordinate(coordinates, mode='all')
diff --git a/timeseriesviewer/ui/profileviewdock.ui b/timeseriesviewer/ui/profileviewdock.ui
index 74f99600fcae72c42d86dbe318140002b5e6b8b8..60c3330dbc9818ff60be8780a69d7a53ce0ef4a5 100644
--- a/timeseriesviewer/ui/profileviewdock.ui
+++ b/timeseriesviewer/ui/profileviewdock.ui
@@ -146,7 +146,7 @@
           </sizepolicy>
          </property>
          <property name="currentIndex">
-          <number>1</number>
+          <number>0</number>
          </property>
          <widget class="QWidget" name="page2D">
           <layout class="QVBoxLayout" name="verticalLayout_3">
@@ -165,6 +165,27 @@
            <property name="bottomMargin">
             <number>0</number>
            </property>
+           <item>
+            <widget class="QToolBar" name="toolbar2DPlot">
+             <property name="styleSheet">
+              <string notr="true"/>
+             </property>
+             <property name="iconSize">
+              <size>
+               <width>18</width>
+               <height>18</height>
+              </size>
+             </property>
+             <property name="floatable">
+              <bool>false</bool>
+             </property>
+             <addaction name="actionLoadProfileRequest"/>
+             <addaction name="actionRefresh2D"/>
+             <addaction name="actionReset2DPlot"/>
+             <addaction name="actionAddStyle2D"/>
+             <addaction name="actionRemoveStyle2D"/>
+            </widget>
+           </item>
            <item>
             <widget class="QSplitter" name="splitter2D">
              <property name="orientation">
@@ -205,102 +226,6 @@
                <property name="bottomMargin">
                 <number>0</number>
                </property>
-               <item>
-                <layout class="QHBoxLayout" name="horizontalLayout_5">
-                 <property name="spacing">
-                  <number>1</number>
-                 </property>
-                 <property name="topMargin">
-                  <number>0</number>
-                 </property>
-                 <item>
-                  <widget class="QToolButton" name="btnLoadProfile1">
-                   <property name="text">
-                    <string>...</string>
-                   </property>
-                   <property name="icon">
-                    <iconset resource="resources.qrc">
-                     <normaloff>:/timeseriesviewer/icons/mIconTemporalProfile.svg</normaloff>:/timeseriesviewer/icons/mIconTemporalProfile.svg</iconset>
-                   </property>
-                   <property name="autoRaise">
-                    <bool>true</bool>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QToolButton" name="btnRefresh2D">
-                   <property name="text">
-                    <string>...</string>
-                   </property>
-                   <property name="icon">
-                    <iconset resource="resources.qrc">
-                     <normaloff>:/timeseriesviewer/icons/mActionRefresh.svg</normaloff>:/timeseriesviewer/icons/mActionRefresh.svg</iconset>
-                   </property>
-                   <property name="autoRaise">
-                    <bool>true</bool>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QToolButton" name="btnReset2DPlot">
-                   <property name="text">
-                    <string>...</string>
-                   </property>
-                   <property name="icon">
-                    <iconset resource="resources.qrc">
-                     <normaloff>:/timeseriesviewer/icons/mActionZoomFullExtent.svg</normaloff>:/timeseriesviewer/icons/mActionZoomFullExtent.svg</iconset>
-                   </property>
-                   <property name="autoRaise">
-                    <bool>true</bool>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QToolButton" name="btnAddStyle2D">
-                   <property name="text">
-                    <string>...</string>
-                   </property>
-                   <property name="icon">
-                    <iconset resource="resources.qrc">
-                     <normaloff>:/timeseriesviewer/icons/mActionAdd.svg</normaloff>:/timeseriesviewer/icons/mActionAdd.svg</iconset>
-                   </property>
-                   <property name="autoRaise">
-                    <bool>true</bool>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QToolButton" name="btnRemoveStyle2D">
-                   <property name="enabled">
-                    <bool>false</bool>
-                   </property>
-                   <property name="text">
-                    <string>...</string>
-                   </property>
-                   <property name="icon">
-                    <iconset resource="resources.qrc">
-                     <normaloff>:/timeseriesviewer/icons/mActionRemove.svg</normaloff>:/timeseriesviewer/icons/mActionRemove.svg</iconset>
-                   </property>
-                   <property name="autoRaise">
-                    <bool>true</bool>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <spacer name="horizontalSpacer_2">
-                   <property name="orientation">
-                    <enum>Qt::Horizontal</enum>
-                   </property>
-                   <property name="sizeHint" stdset="0">
-                    <size>
-                     <width>40</width>
-                     <height>20</height>
-                    </size>
-                   </property>
-                  </spacer>
-                 </item>
-                </layout>
-               </item>
                <item>
                 <widget class="QTableView" name="tableView2DProfiles">
                  <property name="sizePolicy">
@@ -352,7 +277,7 @@
                  <property name="title">
                   <string>Data Value(s)</string>
                  </property>
-                 <property name="collapsed">
+                 <property name="collapsed" stdset="0">
                   <bool>true</bool>
                  </property>
                  <layout class="QVBoxLayout" name="verticalLayout_8">
@@ -448,6 +373,27 @@
            <property name="bottomMargin">
             <number>0</number>
            </property>
+           <item>
+            <widget class="QToolBar" name="toolbar3DPlot">
+             <property name="styleSheet">
+              <string notr="true"/>
+             </property>
+             <property name="iconSize">
+              <size>
+               <width>18</width>
+               <height>18</height>
+              </size>
+             </property>
+             <property name="floatable">
+              <bool>false</bool>
+             </property>
+             <addaction name="actionLoadProfileRequest"/>
+             <addaction name="actionRefresh3D"/>
+             <addaction name="actionReset3DCamera"/>
+             <addaction name="actionAddStyle3D"/>
+             <addaction name="actionRemoveStyle3D"/>
+            </widget>
+           </item>
            <item>
             <widget class="QSplitter" name="splitter3D">
              <property name="orientation">
@@ -485,99 +431,6 @@
                <property name="bottomMargin">
                 <number>0</number>
                </property>
-               <item>
-                <layout class="QHBoxLayout" name="horizontalLayout_6">
-                 <property name="spacing">
-                  <number>1</number>
-                 </property>
-                 <property name="topMargin">
-                  <number>0</number>
-                 </property>
-                 <item>
-                  <widget class="QToolButton" name="btnLoadProfile2">
-                   <property name="text">
-                    <string>...</string>
-                   </property>
-                   <property name="icon">
-                    <iconset resource="resources.qrc">
-                     <normaloff>:/timeseriesviewer/icons/mIconTemporalProfile.svg</normaloff>:/timeseriesviewer/icons/mIconTemporalProfile.svg</iconset>
-                   </property>
-                   <property name="autoRaise">
-                    <bool>true</bool>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QToolButton" name="btnRefresh3D">
-                   <property name="text">
-                    <string>...</string>
-                   </property>
-                   <property name="icon">
-                    <iconset>
-                     <normaloff>:/timeseriesviewer/icons/mActionRefresh.png</normaloff>:/timeseriesviewer/icons/mActionRefresh.png</iconset>
-                   </property>
-                   <property name="autoRaise">
-                    <bool>true</bool>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QToolButton" name="btnReset3DCamera">
-                   <property name="text">
-                    <string>...</string>
-                   </property>
-                   <property name="icon">
-                    <iconset resource="resources.qrc">
-                     <normaloff>:/timeseriesviewer/icons/mActionZoomFullExtent.svg</normaloff>:/timeseriesviewer/icons/mActionZoomFullExtent.svg</iconset>
-                   </property>
-                   <property name="autoRaise">
-                    <bool>true</bool>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QToolButton" name="btnAddStyle3D">
-                   <property name="text">
-                    <string>...</string>
-                   </property>
-                   <property name="icon">
-                    <iconset resource="resources.qrc">
-                     <normaloff>:/timeseriesviewer/icons/mActionAdd.svg</normaloff>:/timeseriesviewer/icons/mActionAdd.svg</iconset>
-                   </property>
-                   <property name="autoRaise">
-                    <bool>true</bool>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QToolButton" name="btnRemoveStyle3D">
-                   <property name="text">
-                    <string>...</string>
-                   </property>
-                   <property name="icon">
-                    <iconset resource="resources.qrc">
-                     <normaloff>:/timeseriesviewer/icons/mActionRemove.svg</normaloff>:/timeseriesviewer/icons/mActionRemove.svg</iconset>
-                   </property>
-                   <property name="autoRaise">
-                    <bool>true</bool>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <spacer name="horizontalSpacer_3">
-                   <property name="orientation">
-                    <enum>Qt::Horizontal</enum>
-                   </property>
-                   <property name="sizeHint" stdset="0">
-                    <size>
-                     <width>40</width>
-                     <height>20</height>
-                    </size>
-                   </property>
-                  </spacer>
-                 </item>
-                </layout>
-               </item>
                <item>
                 <widget class="QTableView" name="tableView3DProfiles">
                  <property name="sizePolicy">
@@ -704,112 +557,27 @@ background-color: rgb(0, 0, 0);</string>
                <number>0</number>
               </property>
               <item>
-               <layout class="QHBoxLayout" name="horizontalLayout_7">
-                <property name="spacing">
-                 <number>1</number>
+               <widget class="QToolBar" name="toolbarTemporalProfiles">
+                <property name="styleSheet">
+                 <string notr="true"/>
                 </property>
-                <property name="topMargin">
-                 <number>0</number>
+                <property name="iconSize">
+                 <size>
+                  <width>18</width>
+                  <height>18</height>
+                 </size>
                 </property>
-                <item>
-                 <widget class="QToolButton" name="btnLoadProfile3">
-                  <property name="text">
-                   <string>...</string>
-                  </property>
-                  <property name="icon">
-                   <iconset resource="resources.qrc">
-                    <normaloff>:/timeseriesviewer/icons/mIconTemporalProfile.svg</normaloff>:/timeseriesviewer/icons/mIconTemporalProfile.svg</iconset>
-                  </property>
-                  <property name="autoRaise">
-                   <bool>true</bool>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QToolButton" name="btnLoadTPFromOgr">
-                  <property name="text">
-                   <string>...</string>
-                  </property>
-                  <property name="icon">
-                   <iconset resource="resources.qrc">
-                    <normaloff>:/timeseriesviewer/icons/mActionAddOgrLayer.svg</normaloff>:/timeseriesviewer/icons/mActionAddOgrLayer.svg</iconset>
-                  </property>
-                  <property name="autoRaise">
-                   <bool>true</bool>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QToolButton" name="btnRemoveTemporalProfile">
-                  <property name="text">
-                   <string>...</string>
-                  </property>
-                  <property name="icon">
-                   <iconset resource="resources.qrc">
-                    <normaloff>:/timeseriesviewer/icons/mActionRemove.svg</normaloff>:/timeseriesviewer/icons/mActionRemove.svg</iconset>
-                  </property>
-                  <property name="autoRaise">
-                   <bool>true</bool>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QToolButton" name="btnSaveTemporalProfiles">
-                  <property name="text">
-                   <string>...</string>
-                  </property>
-                  <property name="icon">
-                   <iconset resource="resources.qrc">
-                    <normaloff>:/timeseriesviewer/icons/mActionFileSave.svg</normaloff>:/timeseriesviewer/icons/mActionFileSave.svg</iconset>
-                  </property>
-                  <property name="popupMode">
-                   <enum>QToolButton::MenuButtonPopup</enum>
-                  </property>
-                  <property name="autoRaise">
-                   <bool>true</bool>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QLabel" name="label_2">
-                  <property name="text">
-                   <string>Max. Coordinates</string>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QSpinBox" name="sbMaxTP">
-                  <property name="toolTip">
-                   <string>Set the maximum number of temporal profiles loaded. Adding more will delete the most oldest profile data. </string>
-                  </property>
-                  <property name="minimum">
-                   <number>1</number>
-                  </property>
-                  <property name="maximum">
-                   <number>256</number>
-                  </property>
-                  <property name="value">
-                   <number>3</number>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <spacer name="horizontalSpacer_4">
-                  <property name="orientation">
-                   <enum>Qt::Horizontal</enum>
-                  </property>
-                  <property name="sizeHint" stdset="0">
-                   <size>
-                    <width>40</width>
-                    <height>20</height>
-                   </size>
-                  </property>
-                 </spacer>
-                </item>
-               </layout>
+                <property name="floatable">
+                 <bool>false</bool>
+                </property>
+                <addaction name="actionLoadProfileRequest"/>
+                <addaction name="actionLoadTPFromOgr"/>
+                <addaction name="actionRemoveTemporalProfile"/>
+                <addaction name="actionSaveTemporalProfiles"/>
+               </widget>
               </item>
               <item>
-               <widget class="QTableView" name="tableViewTemporalProfiles">
+               <widget class="TemporalProfileTableView" name="tableViewTemporalProfiles">
                 <property name="frameShape">
                  <enum>QFrame::NoFrame</enum>
                 </property>
@@ -1025,30 +793,6 @@ background-color: rgb(0, 0, 0);</string>
     <string>Reset View</string>
    </property>
   </action>
-  <action name="actionSaveTPVector">
-   <property name="text">
-    <string>Save to vectorfile</string>
-   </property>
-   <property name="toolTip">
-    <string>Save the temporal profiles into a vectorfile</string>
-   </property>
-  </action>
-  <action name="actionSaveTPCSV">
-   <property name="text">
-    <string>Save to CSV textfile</string>
-   </property>
-   <property name="toolTip">
-    <string>Save the temporal profiles as CSV text file.</string>
-   </property>
-  </action>
-  <action name="actionSaveTPCoordinates">
-   <property name="text">
-    <string>Save Coordinates</string>
-   </property>
-   <property name="toolTip">
-    <string>Save the temporal profile coordinates.</string>
-   </property>
-  </action>
   <action name="actionAddStyle3D">
    <property name="icon">
     <iconset resource="resources.qrc">
@@ -1097,6 +841,24 @@ background-color: rgb(0, 0, 0);</string>
     <string>Reset View</string>
    </property>
   </action>
+  <action name="actionLoadMissingValues">
+   <property name="icon">
+    <iconset resource="resources.qrc">
+     <normaloff>:/timeseriesviewer/icons/mActionRefresh.svg</normaloff>:/timeseriesviewer/icons/mActionRefresh.svg</iconset>
+   </property>
+   <property name="text">
+    <string>LoadMissingValues</string>
+   </property>
+  </action>
+  <action name="actionSaveTemporalProfiles">
+   <property name="icon">
+    <iconset resource="resources.qrc">
+     <normaloff>:/timeseriesviewer/icons/mActionFileSaveAs.svg</normaloff>:/timeseriesviewer/icons/mActionFileSaveAs.svg</iconset>
+   </property>
+   <property name="text">
+    <string>SaveTemporalProfiles</string>
+   </property>
+  </action>
  </widget>
  <customwidgets>
   <customwidget>
@@ -1110,6 +872,11 @@ background-color: rgb(0, 0, 0);</string>
    <extends>QGraphicsView</extends>
    <header>timeseriesviewer.profilevisualization</header>
   </customwidget>
+  <customwidget>
+   <class>TemporalProfileTableView</class>
+   <extends>QTableView</extends>
+   <header>timeseriesviewer.temporalprofiles2d</header>
+  </customwidget>
  </customwidgets>
  <resources>
   <include location="resources.qrc"/>
@@ -1122,8 +889,8 @@ background-color: rgb(0, 0, 0);</string>
    <slot>setCurrentIndex(int)</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>38</x>
-     <y>110</y>
+     <x>37</x>
+     <y>132</y>
     </hint>
     <hint type="destinationlabel">
      <x>213</x>