diff --git a/test/test_spectrallibraries.py b/test/test_spectrallibraries.py
index 0262d1eb818930ab838709638b74d881faa61726..22c053c2982239a574a61af0dec29478c354b224 100644
--- a/test/test_spectrallibraries.py
+++ b/test/test_spectrallibraries.py
@@ -334,6 +334,14 @@ class TestInit(unittest.TestCase):
         dmodel = SpectralLibraryTableModel(speclib, parent=w)
         fmodel = SpectralLibraryTableFilterModel(dmodel, parent=w)
 
+        cnt = len(speclib)
+        self.assertEqual(cnt, dmodel.rowCount())
+        speclib.removeProfiles(speclib[0])
+        self.assertEqual(cnt - 1, len(speclib))
+        self.assertEqual(cnt - 1, dmodel.rowCount())
+        self.assertEqual(cnt - 1, fmodel.rowCount())
+
+
 
         #https://stackoverflow.com/questions/671340/qsortfilterproxymodel-maptosource-crashes-no-info-why
         #!!! use filterModel.index(row, col), NOT filterModel.createIndex(row, col)!
@@ -360,10 +368,29 @@ class TestInit(unittest.TestCase):
         p.show()
 
 
+    def test_plotWidget(self):
+
+        speclib = self.createSpeclib()
+        model = SpectralLibraryTableModel(speclib=speclib)
+        w = SpectralLibraryPlotWidget()
+        w.setModel(model)
+
+        self.assertIsInstance(w, SpectralLibraryPlotWidget)
+
+        pdis = [i for i in w.plotItem.items if isinstance(i, SpectralProfilePlotDataItem)]
+        self.assertTrue(len(speclib), len(pdis))
+        for pdi in pdis:
+            self.assertTrue(pdi.isVisible())
 
 
+        p = speclib[3]
+        fid = p.id()
 
+        speclib.removeProfiles(p)
 
+        pdis = [i for i in w.plotItem.items if isinstance(i, SpectralProfilePlotDataItem)]
+        for pdi in pdis:
+            self.assertFalse(pdi.mProfile.id() == fid)
 
         pass
 
diff --git a/timeseriesviewer/sandbox.py b/timeseriesviewer/sandbox.py
index 4233093163b44ca7c22f7282b67e5c17ca8eee8c..c489f984828412b6cd7f391d677efad32ee4f535 100644
--- a/timeseriesviewer/sandbox.py
+++ b/timeseriesviewer/sandbox.py
@@ -352,8 +352,11 @@ if __name__ == '__main__':
     if False: sandboxQgisBridge()
     if False: sandboxGui()
 
-    if True: sandboxTestdata()
+    if False: sandboxTestdata()
     if False: sandboxDemo()
+    if True:
+        import timeseriesviewer.spectrallibraries
+        timeseriesviewer.spectrallibraries.__sandbox()
     #close QGIS
     qgsApp.exec_()
     qgsApp.exitQgis()
diff --git a/timeseriesviewer/spectrallibraries.py b/timeseriesviewer/spectrallibraries.py
index 756655406a4229936aaf6409ed1880320f8f8601..cbc9c8005b78d318221921f2a4b2570debdf5078 100644
--- a/timeseriesviewer/spectrallibraries.py
+++ b/timeseriesviewer/spectrallibraries.py
@@ -20,15 +20,18 @@
 """
 
 #see http://python-future.org/str_literals.html for str issue discussion
-import os, re, tempfile, pickle, copy, shutil
+import os, re, tempfile, pickle, copy, shutil, locale
 from collections import OrderedDict
 from qgis.core import *
 from qgis.gui import *
-import pyqtgraph as pg
-from pyqtgraph import functions as fn
 from qgis.PyQt.QtCore import *
 from qgis.PyQt.QtGui import *
 from qgis.PyQt.QtWidgets import *
+from qgis.core import QgsField, QgsFields, QgsFeature, QgsMapLayer, QgsVectorLayer, QgsConditionalStyle
+from qgis.gui import QgsMapCanvas, QgsDockWidget
+from pyqtgraph.widgets.PlotWidget import PlotWidget
+from pyqtgraph.graphicsItems.PlotDataItem import PlotDataItem
+import pyqtgraph.functions as fn
 import numpy as np
 from osgeo import gdal, gdal_array
 
@@ -43,6 +46,7 @@ FILTERS = 'ENVI Spectral Library (*.esl *.sli);;CSV Table (*.csv)'
 PICKLE_PROTOCOL = pickle.HIGHEST_PROTOCOL
 HIDDEN_ATTRIBUTE_PREFIX = '__serialized__'
 
+
 def gdalDataset(pathOrDataset, eAccess=gdal.GA_ReadOnly):
     """
 
@@ -155,7 +159,7 @@ class SpectralLibraryTableView(QgsAttributeTableView):
         assert isinstance(index, QModelIndex)
 
         featureIDs = self.mSelectionManager.selectedFeatureIds()
-        indices = self.selectedFeatureIndices()
+        featureIndices = self.fidsToIndices(featureIDs)
         if not isinstance(featureIDs, list):
             s = ""
 
@@ -173,13 +177,12 @@ class SpectralLibraryTableView(QgsAttributeTableView):
         menu.addSeparator()
         a = menu.addAction('Style...')
         a.triggered.connect(lambda b, ids=featureIDs : self.onSetStyle(ids))
-        a = menu.addAction('Show')
-        a.triggered.connect(lambda : self.setCheckState(Qt.Checked))
-        a = menu.addAction('Hide')
-        a.triggered.connect(lambda: self.setCheckState(Qt.Unchecked))
-        a = menu.addAction('Remove')
-        a.triggered.connect(lambda : self.model().removeProfiles(self.selectedSpectra()))
-        #menu.popup(QCursor.pos())
+        a = menu.addAction('Show profiles')
+        a.triggered.connect(lambda : self.setCheckState(featureIndices, Qt.Checked))
+        a = menu.addAction('Hide profiles')
+        a.triggered.connect(lambda: self.setCheckState(featureIndices, Qt.Unchecked))
+        a = menu.addAction('Remove profiles')
+        a.triggered.connect(lambda : self.onRemoveFIDs(featureIDs))
 
 
     def spectralLibrary(self):
@@ -187,6 +190,7 @@ class SpectralLibraryTableView(QgsAttributeTableView):
 
 
     def onCopy2Clipboard(self, fids, mode):
+        assert isinstance(fids, list)
         assert mode in ClipboardIO.WritingModes().modes()
 
         speclib = self.spectralLibrary()
@@ -202,18 +206,32 @@ class SpectralLibraryTableView(QgsAttributeTableView):
         speclib.getFeatures(fids)
         speclib.exportProfiles()
 
-
-    def selectedFeatureIndices(self):
+    def fidsToIndices(self, fids):
         """
-        Returns the zero-column QModelIndex of all selected features
-        :return: [list-of-QModelIndex]
+        Converts feature ids into FilterModel QModelIndices
+        :param fids: [list-of-int]
+        :return:
         """
-
-        ids = self.mSelectionManager.selectedFeatureIds()
+        if isinstance(fids, int):
+            fids = [fids]
+        assert isinstance(fids, list)
         fmodel = self.model()
-        indices = [fmodel.fidToIndex(id) for id in ids]
+        indices = [fmodel.fidToIndex(id) for id in fids]
         return [fmodel.index(idx.row(), 0) for idx in indices]
 
+    def onRemoveFIDs(self, fids):
+
+        speclib = self.spectralLibrary()
+        assert isinstance(speclib, SpectralLibrary)
+        b = speclib.isEditable()
+        if not b:
+            speclib.startEditing()
+
+        speclib.deleteFeatures(fids)
+        if not b:
+            speclib.commitChanges()
+
+
     def onSetStyle(self, featureIDs):
         fmodel = self.model()
         indices = self.selectedFeatureIndices()
@@ -229,10 +247,10 @@ class SpectralLibraryTableView(QgsAttributeTableView):
                 for idx in indices:
                     fmodel.setData(idx, style, Qt.DecorationRole)
 
-    def setCheckState(self, checkState):
+    def setCheckState(self, indices, checkState):
         fmodel = self.model()
 
-        for idx in self.selectedFeatureIndices():
+        for idx in indices:
             fmodel.setData(idx, checkState, Qt.CheckStateRole)
 
 
@@ -334,18 +352,31 @@ class SpectralProfileMapTool(QgsMapToolEmitPoint):
 
 """
 
-class SpectralProfilePlotDataItem(pg.PlotDataItem):
+class SpectralProfilePlotDataItem(PlotDataItem):
 
     def __init__(self, spectralProfile):
         assert isinstance(spectralProfile, SpectralProfile)
         super(SpectralProfilePlotDataItem, self).__init__()
         self.mProfile = spectralProfile
-        self.setData(x=spectralProfile.xValues(), y=spectralProfile.yValues())
 
+        self.setData(x=spectralProfile.xValues(), y=spectralProfile.yValues())
+        self.setStyle(self.mProfile.style())
     def setClickable(self, b, width=None):
         assert isinstance(b, bool)
         self.curve.setClickable(b, width=width)
 
+
+    def setStyle(self, style):
+        assert isinstance(style, PlotStyle)
+        self.setVisible(style.isVisible())
+
+        self.setSymbol(style.markerSymbol)
+        self.setSymbolBrush(style.markerBrush)
+        self.setSymbolSize(style.markerSize)
+        self.setSymbolPen(style.markerPen)
+        self.setPen(style.linePen)
+
+
     def setColor(self, color):
         if not isinstance(color, QColor):
             color = QColor(color)
@@ -806,26 +837,16 @@ class ClipboardIO(AbstractSpectralLibraryIO):
         return SpectralLibrary()
 
     @staticmethod
-    def write(speclib, path=None, mode=None, sep=None, dec=None, newline=None):
+    def write(speclib, path=None, mode=None, sep=None, newline=None):
         if mode is None:
             mode = ClipboardIO.WritingModes.ALL
         assert isinstance(speclib, SpectralLibrary)
 
         mimeData = QMimeData()
 
-        import locale
-        lang, enc = locale.getdefaultlocale()
 
         if not isinstance(sep, str):
-            if lang.startswith('de_'):
-                sep = '\t'
-            else:
-                sep = ';'
-        if not isinstance(dec, str):
-            if lang.startswith('de_'):
-                dec = ','
-            else:
-                sep = '.'
+            sep = '\t'
 
         if not isinstance(newline, str):
             newline = '\r\n'
@@ -871,9 +892,8 @@ class ClipboardIO(AbstractSpectralLibraryIO):
                 if value in excluded:
                     formatedLine.append('')
                 else:
-                    if not isinstance(value, str):
-                        value = str(value)
-                        value = value.replace('.', dec)
+                    if type(value) in [float, int]:
+                        value = locale.str(value)
                     formatedLine.append(value)
             csvlines.append(sep.join(formatedLine))
         text = newline.join(csvlines)
@@ -1355,8 +1375,6 @@ class SpectralLibrary(QgsVectorLayer):
         return None
 
 
-    sigProfilesAdded = pyqtSignal([list], [list, list])
-    sigProfilesRemoved = pyqtSignal([list], [list, list])
     sigNameChanged = pyqtSignal(str)
 
     def __init__(self, name='SpectralLibrary', fields=None):
@@ -1441,6 +1459,29 @@ class SpectralLibrary(QgsVectorLayer):
             self.commitChanges()
         s = ""
 
+    def removeProfiles(self, profiles):
+        """
+        Removes profiles from this ProfileSet
+        :param profiles: Profile or [list-of-profiles] to be removed
+        :return: [list-of-remove profiles] (only profiles that existed in this set before)
+        """
+        if not isinstance(profiles, list):
+            profiles = [profiles]
+
+        for p in profiles:
+            assert isinstance(p, SpectralProfile)
+
+        fids = [p.id() for p in profiles]
+        if len(fids) == 0:
+            return
+
+        inEditMode = self.isEditable()
+        if not inEditMode:
+            self.startEditing()
+        self.deleteFeatures(fids)
+        if not inEditMode:
+            self.commitChanges()
+
     def profiles(self):
         return self[:]
 
@@ -1500,26 +1541,6 @@ class SpectralLibrary(QgsVectorLayer):
 
         return []
 
-    def removeProfiles(self, profiles):
-        """
-        Removes profiles from this ProfileSet
-        :param profiles: Profile or [list-of-profiles] to be removed
-        :return: [list-of-remove profiles] (only profiles that existed in this set before)
-        """
-        to_remove = self.extractProfileList(profiles)
-
-        indices_to_remove = sorted([self.mProfiles.index(p) for p in to_remove if p in self.mProfiles], reverse=True)
-        to_remove = [self.mProfiles[i] for i in indices_to_remove]
-
-        if len(to_remove) > 0:
-            for p in to_remove:
-                self.mProfiles.remove(p)
-            self.sigProfilesRemoved[list].emit(to_remove)
-            self.sigProfilesRemoved[list, list].emit(to_remove, indices_to_remove)
-
-        s = ""
-
-
 
     def yRange(self):
         profiles = self.profiles()
@@ -1687,6 +1708,7 @@ class SpectralLibraryTableModel(QgsAttributeTableModel):
         if role is None or not index.isValid():
             return False
 
+        result = False
         speclib = self.layer()
         assert isinstance(speclib, SpectralLibrary)
         if index.column() == 0 and role in [Qt.CheckStateRole, Qt.DecorationRole]:
@@ -1706,7 +1728,6 @@ class SpectralLibraryTableModel(QgsAttributeTableModel):
             result = speclib.updateFeature(profile)
             if not b:
                 speclib.commitChanges()
-            return result
 
             #f = self.layer().getFeature(profile.id())
             #i = f.fieldNameIndex(SpectralProfile.STYLE_FIELD)
@@ -1714,10 +1735,13 @@ class SpectralLibraryTableModel(QgsAttributeTableModel):
             #result = super().setData(self.index(index.row(), self.mcnStyle), value, role=Qt.EditRole)
             #if not b:
             #    self.layer().commitChanges()
-
+        if result:
+            self.dataChanged.emit(index, index, [role])
         else:
-            return super().setData(index, value, role=role)
+            result = super().setData(index, value, role=role)
+
 
+        return result
 
     def supportedDragActions(self):
         return Qt.CopyAction
@@ -1802,6 +1826,103 @@ class UnitComboBoxItemModel(OptionListModel):
         return value
 
 
+class SpectralLibraryPlotWidget(PlotWidget):
+
+    def __init__(self, parent=None):
+        super(SpectralLibraryPlotWidget, self).__init__(parent)
+        self.mModel = None
+        self.mPlotItems = dict()
+        self.setAntialiasing(True)
+        self.setAcceptDrops(True)
+
+
+    def setModel(self, model):
+        assert isinstance(model, SpectralLibraryTableModel)
+        self.mModel = model
+        self.mModel.rowsAboutToBeRemoved.connect(self.onRowsAboutToBeRemoved)
+        self.mModel.rowsInserted.connect(self.onRowsInserted)
+        self.mModel.dataChanged.connect(self.onDataChanged)
+        if self.mModel.rowCount() > 0:
+            self.onRowsInserted(self.mModel.index(0,0), 0, self.mModel.rowCount())
+
+    def onDataChanged(self, topLeft, bottomRight, roles):
+
+        if topLeft.column() == 0:
+            for row in range(topLeft.row(), bottomRight.row()+1):
+                fid = self.mModel.rowToId(row)
+                idx = self.mModel.idToIndex(fid)
+                profile = self.mModel.spectralProfile(idx)
+
+                pdi = self.mPlotItems.get(fid)
+                if isinstance(pdi, SpectralProfilePlotDataItem):
+                    if len(roles) == 0 or Qt.DecorationRole in roles or Qt.CheckStateRole in roles:
+                        pdi.setStyle(profile.style())
+
+
+    def onRowsAboutToBeRemoved(self, index, first, last):
+
+        fids = [self.mModel.rowToId(i) for i in range(first, last+1)]
+        fids = [fid for fid in fids if fid in list(self.mPlotItems.keys())]
+        pdis = [self.mPlotItems.pop(fid) for fid in fids]
+        pdis = [pdi for pdi in pdis if isinstance(pdi, SpectralProfilePlotDataItem)]
+        for pdi in pdis:
+            self.removeItem(pdi)
+
+    def onRowsInserted(self, index, first, last):
+
+        for i in range(first, last+1):
+            fid = self.mModel.rowToId(i)
+            if fid < 0:
+                continue
+
+            idx = self.mModel.index(i,0)
+            p = self.mModel.spectralProfile(idx)
+            assert fid == p.id()
+
+            pdi = SpectralProfilePlotDataItem(p)
+            self.mPlotItems[fid] = pdi
+            self.addItem(pdi)
+
+    def dragEnterEvent(self, event):
+        assert isinstance(event, QDragEnterEvent)
+        if event.mimeData().hasFormat(MIMEDATA_SPECLIB):
+            event.accept()
+
+    def dragMoveEvent(self, event):
+        assert isinstance(event, QDragMoveEvent)
+        if event.mimeData().hasFormat(MIMEDATA_SPECLIB):
+            event.accept()
+
+
+    def dropEvent(self, event):
+        assert isinstance(event, QDropEvent)
+        mimeData = event.mimeData()
+
+        if mimeData.hasFormat(MIMEDATA_SPECLIB):
+            speclib = pickle.loads(mimeData.data(MIMEDATA_SPECLIB))
+            self.mSpeclib.addSpeclib(speclib)
+            event.accept()
+
+    def onProfilesAdded(self, profiles):
+        # todo: remove some PDIs from plot if there are too many
+        pi = self.getPlotItem()
+        if True:
+            to_remove = max(0, len(pi.listDataItems()) - self.m_plot_max)
+            if to_remove > 0:
+                for pdi in pi.listDataItems()[0:to_remove]:
+                    pi.removeItem(pdi)
+
+        for p in profiles:
+            self.mPlotXUnitModel.addOption(Option(p.xUnit()))
+            pi.addItem(self.createPDI(p))
+
+        self.btnRemoveAttribute.setEnabled(len(self.mSpeclib.metadataAttributes()) > 0)
+
+    def onProfilesRemoved(self, profiles):
+        for p in profiles:
+            self.removePDI(p)
+        self.btnRemoveAttribute.setEnabled(len(self.mSpeclib.metadataAttributes()) > 0)
+
 
 class SpectralLibraryWidget(QFrame, loadUI('spectrallibrarywidget.ui')):
     sigLoadFromMapRequest = pyqtSignal()
@@ -1835,29 +1956,24 @@ class SpectralLibraryWidget(QFrame, loadUI('spectrallibrarywidget.ui')):
         self.tableViewSpeclib.setDropIndicatorShown(True)
 
         self.mModel = SpectralLibraryTableModel()
-        self.mSpeclib = self.mModel.mSpecLib
+        self.mFilterModel = SpectralLibraryTableFilterModel(self.mModel)
+        self.mSpeclib = self.mModel.speclib()
+
+        # view.setFeatureSelectionManager(featureSelectionManager)
+        self.mTableConfig = None
+        self.updateTableConfig()
+
 
-        self.mSpeclib.sigProfilesAdded.connect(self.onProfilesAdded)
-        self.mSpeclib.sigProfilesRemoved.connect(self.onProfilesRemoved)
         self.mPlotDataItems = dict() #stores plotDataItems
 
 
         #self.mModel.sigAttributeAdded.connect(self.onAttributesChanged)
         #self.mModel.sigAttributeRemoved.connect(self.onAttributesChanged)
 
-        self.tableViewSpeclib.setModel(self.mModel)
-        self.mSelectionModel = QItemSelectionModel(self.mModel)
-        self.mSelectionModel.selectionChanged.connect(self.onSelectionChanged)
-        #self.mSelectionModel.currentChanged.connect(self.onCurrentSelectionChanged)
-        self.tableViewSpeclib.setSelectionModel(self.mSelectionModel)
-
+        self.tableViewSpeclib.setModel(self.mFilterModel)
+        self.plotWidget.setModel(self.mModel)
 
-        self.plotWidget.setAntialiasing(True)
-        self.plotWidget.setAcceptDrops(True)
 
-        self.plotWidget.dragEnterEvent = self.dragEnterEvent
-        self.plotWidget.dragMoveEvent = self.dragMoveEvent
-        self.plotWidget.dropEvent = self.dropEvent
         pi = self.plotWidget.getPlotItem()
         pi.setAcceptDrops(True)
 
@@ -1883,6 +1999,23 @@ class SpectralLibraryWidget(QFrame, loadUI('spectrallibrarywidget.ui')):
             )
         )
 
+
+    def updateTableConfig(self):
+        """
+        Updates the QgsAttributeTableConfig, basically only to hide columns to be hidden.
+        """
+
+        self.mTableConfig = QgsAttributeTableConfig()
+        self.mTableConfig.update(self.mSpeclib.fields())
+
+        for i, columnConfig in enumerate(self.mTableConfig.columns()):
+            if columnConfig.name.startswith(HIDDEN_ATTRIBUTE_PREFIX):
+                self.mTableConfig.setColumnHidden(i, True)
+
+        self.mSpeclib.setAttributeTableConfig(self.mTableConfig)
+        self.mFilterModel.setAttributeTableConfig(self.mTableConfig)
+        #self.tableViewSpeclib.setAttributeTableConfig(self.mTableConfig)
+
     def setMapInteraction(self, b):
         assert isinstance(b, bool)
         if b is None or b is False:
@@ -1892,25 +2025,6 @@ class SpectralLibraryWidget(QFrame, loadUI('spectrallibrarywidget.ui')):
     def mapInteraction(self):
         return self.btnBoxMapInteraction.isEnabled()
 
-    def dragEnterEvent(self, event):
-        assert isinstance(event, QDragEnterEvent)
-        if event.mimeData().hasFormat(mimedata.MDF_SPECTRALLIBRARY):
-            event.accept()
-
-    def dragMoveEvent(self, event):
-        assert isinstance(event, QDragMoveEvent)
-        if event.mimeData().hasFormat(mimedata.MDF_SPECTRALLIBRARY):
-            event.accept()
-
-
-    def dropEvent(self, event):
-        assert isinstance(event, QDropEvent)
-        mimeData = event.mimeData()
-
-        if mimeData.hasFormat(mimedata.MDF_SPECTRALLIBRARY):
-            speclib = SpectralLibrary.readFromPickleDump(mimeData.data(mimedata.MDF_SPECTRALLIBRARY))
-            self.mSpeclib.addSpeclib(speclib)
-            event.accept()
 
     def onAttributesChanged(self):
         self.btnRemoveAttribute.setEnabled(len(self.mSpeclib.metadataAttributes()) > 0)
@@ -1950,20 +2064,6 @@ class SpectralLibraryWidget(QFrame, loadUI('spectrallibrarywidget.ui')):
         self.mSpeclib.exportProfiles()
 
 
-    def onProfilesAdded(self, profiles):
-        # todo: remove some PDIs from plot if there are too many
-        pi = self.getPlotItem()
-        if True:
-            to_remove = max(0, len(pi.listDataItems()) - self.m_plot_max)
-            if to_remove > 0:
-                for pdi in pi.listDataItems()[0:to_remove]:
-                    pi.removeItem(pdi)
-
-        for p in profiles:
-            self.mPlotXUnitModel.addOption(Option(p.xUnit()))
-            pi.addItem(self.createPDI(p))
-
-        self.btnRemoveAttribute.setEnabled(len(self.mSpeclib.metadataAttributes()) > 0)
 
     def addSpectralPlotItem(self, pdi):
         assert isinstance(pdi, SpectralProfilePlotDataItem)
@@ -1971,10 +2071,6 @@ class SpectralLibraryWidget(QFrame, loadUI('spectrallibrarywidget.ui')):
 
         pi.addItem(pdi)
 
-    def onProfilesRemoved(self, profiles):
-        for p in profiles:
-            self.removePDI(p)
-        self.btnRemoveAttribute.setEnabled(len(self.mSpeclib.metadataAttributes()) > 0)
 
     def addSpeclib(self, speclib):
         if isinstance(speclib, SpectralLibrary):
@@ -2132,13 +2228,13 @@ class SpectralLibraryFeatureSelectionManager(QgsIFeatureSelectionManager):
     def setSelectedFeatures(self, ids):
         self.mLayer.selectByIds(ids)
 
-if __name__ == "__main__":
-
+def __sandbox():
 
 
     app = initQgisApplication()
     app.messageLog().messageReceived.connect(lambda args: print(args) )
 
+
     from example.Images import Img_2014_06_16_LE72270652014167CUB00_BOA, re_2014_06_25
 
     p = Img_2014_06_16_LE72270652014167CUB00_BOA
@@ -2161,39 +2257,48 @@ if __name__ == "__main__":
     speclib.addProfiles([p1,p2],0)
     speclib.addSpeclib(SpectralLibrary.readFromRasterPositions(p, pos))
     speclib.startEditing()
-    w = QFrame()
-    w.setLayout(QHBoxLayout())
 
-    model = SpectralLibraryTableModel(speclib=speclib, parent=w)
-    fmodel = SpectralLibraryTableFilterModel(model)
-    view = SpectralLibraryTableView(parent=w)
-    #view = QgsAttributeTableView(parent=w)
-    # view = QTableView()
-    # from qgis.gui import QgsVectorLayerSelectionManager
-    # featureSelectionManager = QgsVectorLayerSelectionManager(speclib)
 
-    view.setModel(fmodel)
+    if False:
+
+        w = QFrame()
+        w.setLayout(QHBoxLayout())
+
+        model = SpectralLibraryTableModel(speclib=speclib, parent=w)
+        fmodel = SpectralLibraryTableFilterModel(model)
+        view = SpectralLibraryTableView(parent=w)
+        #view = QgsAttributeTableView(parent=w)
+        # view = QTableView()
+        # from qgis.gui import QgsVectorLayerSelectionManager
+        # featureSelectionManager = QgsVectorLayerSelectionManager(speclib)
 
+        view.setModel(fmodel)
 
-    # view.setFeatureSelectionManager(featureSelectionManager)
-    config = QgsAttributeTableConfig()
-    config.update(speclib.fields())
 
-    for i, columnConfig in enumerate(config.columns()):
+        # view.setFeatureSelectionManager(featureSelectionManager)
+        config = QgsAttributeTableConfig()
+        config.update(speclib.fields())
 
-        if columnConfig.name.startswith(HIDDEN_ATTRIBUTE_PREFIX):
-            config.setColumnHidden(i, True)
+        for i, columnConfig in enumerate(config.columns()):
 
-    speclib.setAttributeTableConfig(config)
-    fmodel.setAttributeTableConfig(config)
-    view.setAttributeTableConfig(config)
+            if columnConfig.name.startswith(HIDDEN_ATTRIBUTE_PREFIX):
+                config.setColumnHidden(i, True)
+
+        speclib.setAttributeTableConfig(config)
+        fmodel.setAttributeTableConfig(config)
+        view.setAttributeTableConfig(config)
+
+        #view.setSelectionBehavior(QAbstractItemView.SelectItems)
+        #view.setSelectionMode(QAbstractItemView.ExtendedSelection)
+
+        w.layout().addWidget(view)
+    else:
+        w = SpectralLibraryWidget()
 
-    #view.setSelectionBehavior(QAbstractItemView.SelectItems)
-    #view.setSelectionMode(QAbstractItemView.ExtendedSelection)
+        w.mSpeclib.addSpeclib(speclib)
 
-    w.layout().addWidget(view)
-    w.show()
-    w.resize(QSize(800, 200))
+        w.show()
+        w.resize(QSize(800, 200))
 
     app.exec_()
     print('Finished')
diff --git a/timeseriesviewer/ui/spectrallibrarywidget.ui b/timeseriesviewer/ui/spectrallibrarywidget.ui
index 26d79bc891da32756d262ea41cb8bbd8cf9aa434..013c6dfa0a51d57e8602eb1a3297551f6ac0cc35 100644
--- a/timeseriesviewer/ui/spectrallibrarywidget.ui
+++ b/timeseriesviewer/ui/spectrallibrarywidget.ui
@@ -106,6 +106,9 @@
            <property name="toolTip">
             <string>Select a spectrum from a map.</string>
            </property>
+           <property name="styleSheet">
+            <string notr="true"/>
+           </property>
            <property name="text">
             <string>Select from map</string>
            </property>
@@ -329,7 +332,7 @@
         <number>0</number>
        </property>
        <item>
-        <widget class="PlotWidget" name="plotWidget"/>
+        <widget class="SpectralLibraryPlotWidget" name="plotWidget"/>
        </item>
        <item>
         <widget class="QFrame" name="btnBarPlotOptions">
@@ -427,6 +430,9 @@
          <property name="acceptDrops">
           <bool>true</bool>
          </property>
+         <property name="frameShadow">
+          <enum>QFrame::Plain</enum>
+         </property>
          <property name="dragEnabled">
           <bool>true</bool>
          </property>
@@ -454,16 +460,16 @@
   </layout>
  </widget>
  <customwidgets>
-  <customwidget>
-   <class>PlotWidget</class>
-   <extends>QGraphicsView</extends>
-   <header>pyqtgraph</header>
-  </customwidget>
   <customwidget>
    <class>SpectralLibraryTableView</class>
    <extends>QTableView</extends>
    <header>timeseriesviewer/spectrallibraries</header>
   </customwidget>
+  <customwidget>
+   <class>SpectralLibraryPlotWidget</class>
+   <extends>QGraphicsView</extends>
+   <header>timeseriesviewer/spectrallibraries</header>
+  </customwidget>
  </customwidgets>
  <resources>
   <include location="resources.qrc"/>