diff --git a/Tracker/TrackerRecAlgs/TrackerClusterFit/test/TestBeamClusterFitDbg.py b/Tracker/TrackerRecAlgs/TrackerClusterFit/test/TestBeamClusterFitDbg.py
index a900eeb9a4ac2a328330fc32428c0a230f91042e..d2d23810bcf69c1899cf26e9cd096e3cc009fc1b 100755
--- a/Tracker/TrackerRecAlgs/TrackerClusterFit/test/TestBeamClusterFitDbg.py
+++ b/Tracker/TrackerRecAlgs/TrackerClusterFit/test/TestBeamClusterFitDbg.py
@@ -117,12 +117,20 @@ acc.merge(PoolWriteCfg(ConfigFlags))
 
 from FaserByteStreamCnvSvc.FaserByteStreamCnvSvcConfig import FaserByteStreamCnvSvcCfg
 acc.merge(FaserByteStreamCnvSvcCfg(ConfigFlags))
-#acc.merge(WaveformReconstructionCfg(ConfigFlags))
+acc.merge(WaveformReconstructionCfg(ConfigFlags))
 acc.merge(FaserSCT_ClusterizationCfg(ConfigFlags, DataObjectName="SCT_EDGEMODE_RDOs"))
 acc.merge(ClusterFitAlgCfg(ConfigFlags))
 acc.merge(TrackerSpacePointFinderCfg(ConfigFlags))
 #acc.getEventAlgo("Tracker::ClusterFitAlg").OutputLevel = DEBUG
 
+from AthenaConfiguration.ComponentFactory import CompFactory
+decoderTool = CompFactory.ScintWaveformDecoderTool(name = "ScintWaveformDecoderTool", 
+                                                   CaloChannels = [0, 1, 2, 3, 4, 5], 
+                                                   PreshowerChannels = [6, 7], 
+                                                   TriggerChannels = [8, 9],
+                                                   VetoChannels=[])
+acc.addPublicTool(decoderTool)
+
 # explicitly save RDO information
 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
 itemList = [ "xAOD::EventInfo#*",
@@ -130,12 +138,12 @@ itemList = [ "xAOD::EventInfo#*",
              "FaserSCT_RDO_Container#*",
              "xAOD::FaserTriggerData#*",
              "xAOD::FaserTriggerDataAux#*",
-#             "ScintWaveformContainer#*",
+             "ScintWaveformContainer#*",
              "TrackCollection#*",
-#             "xAOD::WaveformHitContainer#*",
-#             "xAOD::WaveformHitAuxContainer#*",
-#             "xAOD::WaveformClock#*",
-#             "xAOD::WaveformClockAuxInfo#*",
+             "xAOD::WaveformHitContainer#*",
+             "xAOD::WaveformHitAuxContainer#*",
+             "xAOD::WaveformClock#*",
+             "xAOD::WaveformClockAuxInfo#*",
            ]
 acc.merge(OutputStreamCfg(ConfigFlags, "ESD", itemList))
 acc.getEventAlgo("OutputStreamESD").AcceptAlgs = ["Tracker::ClusterFitAlg"] 
diff --git a/graphics/VTI12/VTI12Gui/src/VP1MainWindow.cxx b/graphics/VTI12/VTI12Gui/src/VP1MainWindow.cxx
index f86ddf08faf1fead9da2cfc4964a92514a57c5ed..f3f4dbe1b6de67bd31b732b0a5bf1b292c45018b 100644
--- a/graphics/VTI12/VTI12Gui/src/VP1MainWindow.cxx
+++ b/graphics/VTI12/VTI12Gui/src/VP1MainWindow.cxx
@@ -251,7 +251,7 @@ VP1MainWindow::VP1MainWindow(VP1ExecutionScheduler*sched,VP1AvailEvents * ae,QWi
 	// connect(pushButton_quicksetup_trackingstudies,SIGNAL(clicked()),this,SLOT(quickSetupTriggered()));
 	// connect(pushButton_quicksetup_calostudies,SIGNAL(clicked()),this,SLOT(quickSetupTriggered()));
 	connect(pushButton_quicksetup_geometrystudies,SIGNAL(clicked()),this,SLOT(quickSetupTriggered()));
-	connect(pushButton_quicksetup_analysisstudies,SIGNAL(clicked()),this,SLOT(quickSetupTriggered()));
+	connect(pushButton_quicksetup_waveformstudies,SIGNAL(clicked()),this,SLOT(quickSetupTriggered()));
 
 	//Default application font:
 	m_defaultfont = QApplication::font();
@@ -284,7 +284,7 @@ VP1MainWindow::VP1MainWindow(VP1ExecutionScheduler*sched,VP1AvailEvents * ae,QWi
 	// connect(action_quicklaunch_Tracking_studies,SIGNAL(triggered(bool)),this,SLOT(quickSetupTriggered()));
 	// connect(action_quicklaunch_Calo_studies,SIGNAL(triggered(bool)),this,SLOT(quickSetupTriggered()));
 	connect(action_quicklaunch_Geometry_studies,SIGNAL(triggered(bool)),this,SLOT(quickSetupTriggered()));
-	connect(action_quicklaunch_analysisstudies,SIGNAL(triggered(bool)),this,SLOT(quickSetupTriggered()));
+	connect(action_quicklaunch_waveformstudies,SIGNAL(triggered(bool)),this,SLOT(quickSetupTriggered()));
 	connect(action_quicklaunch_Storegate_browser,SIGNAL(triggered(bool)),this,SLOT(quickSetupTriggered()));
 	connect(action_quicklaunch_faser,SIGNAL(triggered(bool)),this,SLOT(quickSetupTriggered()));
 	// connect(action_quicklaunch_trackcalo_commis,SIGNAL(triggered(bool)),this,SLOT(quickSetupTriggered()));
@@ -1747,7 +1747,7 @@ void VP1MainWindow::quickSetupTriggered()
     plugfile="libVP13DCocktailPlugin.so";
     channelname="TrackCalo";
     tabname = "Track/Calo"; 
-  } */else if (sender()==pushButton_quicksetup_analysisstudies||sender()==action_quicklaunch_analysisstudies) {
+  } */else if (sender()==pushButton_quicksetup_waveformstudies||sender()==action_quicklaunch_waveformstudies) {
 
     //Open AOD file selection dialog for VP1Light
 #ifdef BUILDVP1LIGHT
@@ -1761,9 +1761,9 @@ void VP1MainWindow::quickSetupTriggered()
     pushButton_eventselect->setEnabled(true);
 #endif // BUILDVP1LIGHT
 
-    plugfile="libVP1AODPlugin.so";
-    channelname="AOD";
-    tabname = "Analysis";
+    plugfile="libVTI12WaveformPlugin.so";
+    channelname="Waveform";
+    tabname = "Waveforms";
   } else {
     addToMessageBox("quickSetupTriggered() Error: Unknown sender");
     return;
diff --git a/graphics/VTI12/VTI12Gui/src/vp1mainwindow.ui b/graphics/VTI12/VTI12Gui/src/vp1mainwindow.ui
index 6a0b7eef4a03747b6838a76330c7b3edc03e59e3..e23575d74bba2348b6c69f2b80883a9125227d60 100644
--- a/graphics/VTI12/VTI12Gui/src/vp1mainwindow.ui
+++ b/graphics/VTI12/VTI12Gui/src/vp1mainwindow.ui
@@ -608,12 +608,12 @@ p, li { white-space: pre-wrap; }
                       </widget>
                      </item>
                      <item row="2" column="0" colspan="3">
-                      <widget class="QPushButton" name="pushButton_quicksetup_analysisstudies">
+                      <widget class="QPushButton" name="pushButton_quicksetup_waveformstudies">
                        <property name="toolTip">
-                        <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Launch the Analysis Object (AOD) plugin within a new tab.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+                        <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Launch the VP1Waveform plugin within a new tab.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
                        </property>
                        <property name="text">
-                        <string>Unused</string>
+                        <string>Waveform studies</string>
                        </property>
                       </widget>
                      </item>
@@ -764,7 +764,7 @@ p, li { white-space: pre-wrap; }
     <addaction name="action_quicklaunch_Calo_studies"/> -->
     <addaction name="action_quicklaunch_Geometry_studies"/>
     <!-- <addaction name="action_quicklaunch_trackcalo_commis"/> -->
-    <addaction name="action_quicklaunch_analysisstudies"/>
+    <addaction name="action_quicklaunch_waveformstudies"/>
     <addaction name="action_quicklaunch_Storegate_browser"/>
     <addaction name="separator"/>
     <addaction name="action_exit_VP1"/>
@@ -880,9 +880,9 @@ p, li { white-space: pre-wrap; }
     <string>Open additional settings</string>
    </property>
   </action>
-  <action name="action_quicklaunch_analysisstudies">
+  <action name="action_quicklaunch_waveformstudies">
    <property name="text">
-    <string>A&amp;nalysis Studies</string>
+    <string>&amp;Waveform Studies</string>
    </property>
   </action>
  </widget>
diff --git a/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/CMakeLists.txt b/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2cf1077d7b27e87550349271d7a5ee6d2237cec9
--- /dev/null
+++ b/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/CMakeLists.txt
@@ -0,0 +1,19 @@
+################################################################################
+# Package: VTI12WaveformPlugin
+################################################################################
+
+# Declare the package name:
+atlas_subdir( VTI12WaveformPlugin )
+
+# External dependencies:
+find_package( Qt5 COMPONENTS Core Gui Widgets )
+
+# Generate MOC files automatically:
+set( CMAKE_AUTOMOC TRUE )
+
+# Build the library.
+atlas_add_library( VTI12WaveformPlugin
+   VTI12WaveformPlugin/*.h src/*.cxx src/*.qrc 
+   PUBLIC_HEADERS VTI12WaveformPlugin
+   LINK_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets 
+   PRIVATE_LINK_LIBRARIES VP1Base VTI12WaveformSystems )
diff --git a/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/VTI12WaveformPlugin/VP1WaveformChannel.h b/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/VTI12WaveformPlugin/VP1WaveformChannel.h
new file mode 100755
index 0000000000000000000000000000000000000000..b764e096df8aa3e1aceb462e3939534713b6b691
--- /dev/null
+++ b/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/VTI12WaveformPlugin/VP1WaveformChannel.h
@@ -0,0 +1,32 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/////////////////////////////////////////////////////////////
+//                                                         //
+//  Header file for class VP1GeometryChannel               //
+//                                                         //
+//  Author: Thomas Kittelmann <Thomas.Kittelmann@cern.ch>  //
+//                                                         //
+//  Initial version: May 2007                              //
+//                                                         //
+/////////////////////////////////////////////////////////////
+
+#ifndef VP1GEOMETRYCHANNEL_H
+#define VP1GEOMETRYCHANNEL_H
+
+#include "VP1Base/IVP12DStandardChannelWidget.h"
+
+class VP1WaveformChannel : public IVP12DStandardChannelWidget {
+
+  Q_OBJECT
+
+public:
+
+  VP1WaveformChannel();
+  void init();
+  virtual ~VP1WaveformChannel(){}
+
+};
+
+#endif
diff --git a/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/VTI12WaveformPlugin/VP1WaveformPlugin_VP1AutoFactory.h b/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/VTI12WaveformPlugin/VP1WaveformPlugin_VP1AutoFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..77bc35b8f4374618287a617cf4dd18a6431429e3
--- /dev/null
+++ b/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/VTI12WaveformPlugin/VP1WaveformPlugin_VP1AutoFactory.h
@@ -0,0 +1,25 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+//Autogenerated VP1 Factory Code Header File (Fri Aug 19 13:36:52 CEST 2016)
+
+#ifndef VP1WaveformPlugin_VP1AutoFactory_H
+#define VP1WaveformPlugin_VP1AutoFactory_H
+
+#include <QObject>
+#include <QStringList>
+
+#include "VP1Base/IVP1ChannelWidgetFactory.h"
+
+class VP1WaveformPlugin_VP1AutoFactory : public QObject, public IVP1ChannelWidgetFactory
+{
+  Q_OBJECT
+  Q_PLUGIN_METADATA(IID "VP1WaveformPlugin" )
+  Q_INTERFACES(IVP1ChannelWidgetFactory)
+
+public:
+  virtual QStringList channelWidgetsProvided() const;
+  virtual IVP1ChannelWidget * getChannelWidget(const QString & channelwidget);
+};
+
+#endif
diff --git a/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/src/VP1WaveformChannel.cxx b/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/src/VP1WaveformChannel.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..7187a1af1fc23e55c6da1a25ea44f9691e217b78
--- /dev/null
+++ b/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/src/VP1WaveformChannel.cxx
@@ -0,0 +1,32 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/////////////////////////////////////////////////////////////
+//                                                         //
+//  Implementation of class VP1WaveformChannel             //
+//                                                         //
+//  Author: Dave Casper <dcasper@uci.edu>                  //
+//                                                         //
+//  Initial version: August 2021                           //
+//                                                         //
+/////////////////////////////////////////////////////////////
+
+#include "VTI12WaveformPlugin/VP1WaveformChannel.h"
+#include "VTI12WaveformSystems/VP1WaveformSystem.h"
+#include "VP1Base/VP1QtUtils.h"
+
+VP1WaveformChannel::VP1WaveformChannel()
+  : IVP12DStandardChannelWidget(VP1CHANNELNAMEINPLUGIN(VP1WaveformChannel,"Waveform"),
+				"This channel shows the FASER waveform data.",
+				"dcasper@uci.edu")
+{
+}
+
+void VP1WaveformChannel::init()
+{
+  addSystem(new VP1WaveformSystem);
+  // addSystem(new VP1GeometrySystem);
+  // if (VP1QtUtils::environmentVariableIsOn("VP1_SECOND_GEOMSYS"))
+  //   addSystem(new VP1GeometrySystem(VP1GeoFlags::None,"AltGeo"),IVP13DStandardChannelWidget::StartDisabled);
+}
diff --git a/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/src/VP1WaveformPlugin_VP1AutoFactory.cxx b/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/src/VP1WaveformPlugin_VP1AutoFactory.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..7bd05df24f18c8415cdec79123915e2910453eb2
--- /dev/null
+++ b/graphics/VTI12/VTI12Plugins/VTI12WaveformPlugin/src/VP1WaveformPlugin_VP1AutoFactory.cxx
@@ -0,0 +1,24 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+//Autogenerated VP1 Factory Code Implementation File (Fri Aug 19 13:36:52 CEST 2016)
+
+#include <QtPlugin>
+#include "VTI12WaveformPlugin/VP1WaveformPlugin_VP1AutoFactory.h"
+#include "VTI12WaveformPlugin/VP1WaveformChannel.h"
+
+QStringList VP1WaveformPlugin_VP1AutoFactory::channelWidgetsProvided() const
+{
+  return QStringList()
+        << "Waveform"
+         ;
+}
+
+IVP1ChannelWidget * VP1WaveformPlugin_VP1AutoFactory::getChannelWidget(const QString & channelwidget)
+{
+  if (channelwidget == "Waveform")
+    return new VP1WaveformChannel();
+
+  return 0;
+}
+
diff --git a/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/CMakeLists.txt b/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8dcd3e3281ab36fbcb18fe0a5bf5f8b84b2fa998
--- /dev/null
+++ b/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/CMakeLists.txt
@@ -0,0 +1,24 @@
+################################################################################
+# Package: VTI12WaveformSystems
+################################################################################
+
+# Declare the package name:
+atlas_subdir( VTI12WaveformSystems )
+
+# External dependencies:
+find_package( Coin3D )
+find_package( Qt5 COMPONENTS Core Gui Widgets Charts )
+
+# Generate UI files automatically:
+set( CMAKE_AUTOUIC TRUE )
+# Generate MOC files automatically:
+set( CMAKE_AUTOMOC TRUE )
+
+# Component(s) in the package:
+atlas_add_library( VTI12WaveformSystems VTI12WaveformSystems/*.h src/*.cxx
+   PUBLIC_HEADERS VTI12WaveformSystems
+   INCLUDE_DIRS ${COIN3D_INCLUDE_DIRS} ${QT5_INCLUDE_DIRS}
+   LINK_LIBRARIES ${COIN3D_LIBRARIES} GeoPrimitives VP1Base VTI12Utils ScintRawEvent
+   Qt5::Core Qt5::Gui Qt5::Charts
+   PRIVATE_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}
+   PRIVATE_LINK_LIBRARIES GaudiKernel VP1HEPVis )
diff --git a/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/VTI12WaveformSystems/VP1WaveformSystem.h b/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/VTI12WaveformSystems/VP1WaveformSystem.h
new file mode 100644
index 0000000000000000000000000000000000000000..d17e3b60f5e58fc5709064be6c77215c21d7a5b4
--- /dev/null
+++ b/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/VTI12WaveformSystems/VP1WaveformSystem.h
@@ -0,0 +1,59 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef VP1WAVEFORMSYSTEM_H
+#define VP1WAVEFORMSYSTEM_H
+
+/////////////////////////////////////////////////////////////////////////
+//                                                                     //
+//  Header file for class VP1WaveformSystem                            //
+//                                                                     //
+//  Author: Dave Casper <dcasper@uci.edu>                              //
+//                                                                     //
+//  Initial version: August 2021                                       //
+//                                                                     //
+/////////////////////////////////////////////////////////////////////////
+
+#include "VP1Base/IVP12DSystemSimple.h"
+#include <QColor>//Fixme obsolete
+
+class VP1WaveformSystem : public IVP12DSystemSimple {
+
+  Q_OBJECT
+
+public:
+
+  ///////////////////
+  //  Constructor  //
+  ///////////////////
+
+  VP1WaveformSystem();
+
+  //////////////////////////////////////////
+  //  Reimplementations from base class:  //
+  //////////////////////////////////////////
+
+  virtual ~VP1WaveformSystem();
+  void buildPermanentItemCollection(StoreGateSvc* detstore, VP1GraphicsItemCollection *root);
+  void buildEventItemCollection(StoreGateSvc*, VP1GraphicsItemCollection *root);
+  void systemuncreate();
+  QWidget * buildController();
+  QByteArray saveState();
+  void restoreFromState(QByteArray ba);
+
+public slots:
+
+  void updateVetoElements(bool);
+  void updateTriggerElements(bool);
+  void updatePreshowerElements(bool);
+  void updateCalorimeterElements(bool);
+  void updateClockElements(bool);
+  void updateTestElements(bool);
+
+private:
+  class Imp;
+  Imp * m_d;
+};
+
+#endif
diff --git a/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/VTI12WaveformSystems/WaveformSysController.h b/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/VTI12WaveformSystems/WaveformSysController.h
new file mode 100644
index 0000000000000000000000000000000000000000..95db09acdb978546a777e5c9ce8cfc117b62ac97
--- /dev/null
+++ b/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/VTI12WaveformSystems/WaveformSysController.h
@@ -0,0 +1,78 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+////////////////////////////////////////////////////////////////
+//                                                            //
+//  Header file for class WaveformSysController               //
+//                                                            //
+//  Description: Waveform system controller.                  //
+//                                                            //
+//  Author: Dave Casper (dcasper@uci.edu)                     //
+//  Initial version: August 2021                              //
+//                                                            //
+////////////////////////////////////////////////////////////////
+
+#ifndef WAVEFORMSYSCONTROLLER_H
+#define WAVEFORMSYSCONTROLLER_H
+
+#include "VP1Base/VP1Controller.h"
+#include <Inventor/C/errors/debugerror.h>
+#include <Inventor/SbColor4f.h>
+class SoMaterial;
+
+class WaveformSysController : public VP1Controller {
+
+  Q_OBJECT
+
+public:
+
+  WaveformSysController(IVP1System * sys);
+  virtual ~WaveformSysController();
+
+  void actualRestoreSettings(VP1Deserialise&);
+  int currentSettingsVersion() const;
+  void actualSaveSettings(VP1Serialise&) const;
+
+  ///////////////////////////////////
+  //  Access Methods for settings  //
+  ///////////////////////////////////
+
+  //Fixme: SoGroup * drawOptions() const;
+  bool vetoEnabled() const;
+  bool triggerEnabled() const;
+  bool preshowerEnabled() const;
+  bool calorimeterEnabled() const;
+  bool clockEnabled() const;
+  bool testEnabled() const;
+
+
+  ///////////////////////////////////////
+  //  Signals for changes in settings  //
+  ///////////////////////////////////////
+signals:
+  void vetoEnabledChanged(bool);
+  void triggerEnabledChanged(bool);
+  void preshowerEnabledChanged(bool);
+  void calorimeterEnabledChanged(bool);
+  void clockEnabledChanged(bool);
+  void testEnabledChanged(bool);
+
+private:
+
+  class Imp;
+  Imp * m_d;
+
+private slots:
+  void possibleChange_vetoEnabled();
+  void possibleChange_triggerEnabled();
+  void possibleChange_preshowerEnabled();
+  void possibleChange_calorimeterEnabled();
+  void possibleChange_clockEnabled();
+  void possibleChange_testEnabled();
+
+};
+
+
+#endif
diff --git a/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/src/VP1WaveformSystem.cxx b/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/src/VP1WaveformSystem.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..90eb8b57ff201b69bdf41d295667f043b3f5a20b
--- /dev/null
+++ b/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/src/VP1WaveformSystem.cxx
@@ -0,0 +1,521 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+/////////////////////////////////////////////////////////////////////////
+//                                                                     //
+//  Implementation of class VP1WaveformSystem                          //
+//                                                                     //
+//  Author: Dave Casper <dcasper@uci.edu>                              //
+//                                                                     //
+//  Initial version: August 2021                                       //
+//                                                                     //
+/////////////////////////////////////////////////////////////////////////
+
+#include "VTI12WaveformSystems/VP1WaveformSystem.h"
+#include "VTI12WaveformSystems/WaveformSysController.h"
+// #include "VTI12GuideLineSystems/ProjectionSurfacesHelper.h"
+// #include "VTI12GuideLineSystems/VP1CoordinateAxes.h"
+// #include "VTI12GuideLineSystems/VP1Floor.h"
+// #include "VTI12GuideLineSystems/VP1Letters.h"
+// #include "VTI12GuideLineSystems/VP1EtaCone.h"
+// #include "VTI12GuideLineSystems/VP1CartesianGrid.h"
+// #include "VTI12GuideLineSystems/VP1CylindricalGrid.h"
+// #include "VTI12GuideLineSystems/VP1TrackingVolumes.h"
+// #include "VTI12GuideLineSystems/VP1Lines.h"
+
+#include "VP1Base/VP1GraphicsItemCollection.h"
+#include "VP1Base/VP1Serialise.h"
+#include "VP1Base/VP1Deserialise.h"
+#include "VP1Base/VP1Msg.h"
+
+#include "StoreGate/StoreGateSvc.h"
+
+#include "ScintRawEvent/ScintWaveformContainer.h"
+
+#include <Inventor/nodes/SoSeparator.h>
+#include <Inventor/nodes/SoPickStyle.h>
+#include <Inventor/nodes/SoComplexity.h>
+#include <Inventor/SbVec3f.h>
+
+#include <QtCharts>
+#include <QtWidgets>
+#include <QGraphicsEllipseItem>
+
+using namespace QtCharts;
+
+#include <map>
+
+class VP1WaveformSystem::Imp {
+public:
+  Imp(VP1WaveformSystem*tc) : theclass(tc),
+			       controller(0) {}
+			    //    coordinateaxes(0),
+			    //    floor(0),
+			    //    cartesiangrid(0),
+			    //    cylindricalgrid(0),
+			    //    letters(0),
+			    //    etacone1(0),
+			    //    etacone2(0),
+			    //    etacone3(0),
+			    //    trackingVolumes(0),
+			    //    projsurfhelper_pixel(0),
+			    //    projsurfhelper_sct(0),
+			    //    projsurfhelper_trt(0),
+			    //    lastemit_pixel(InDetProjFlags::NoProjections),
+			    //    lastemit_sct(InDetProjFlags::NoProjections),
+			    //    lastemit_trt(InDetProjFlags::NoProjections) {}
+  VP1WaveformSystem *theclass;
+  WaveformSysController * controller;
+  int nCharts {0};
+  std::vector<QChart*> vetoCharts;
+  std::vector<QChart*> triggerCharts;
+  std::vector<QChart*> preshowerCharts;
+  std::vector<QChart*> calorimeterCharts;
+  std::vector<QChart*> clockCharts;
+  std::vector<QChart*> testCharts;
+  QChart* createChart(const std::vector<unsigned int>& data, QGraphicsItem* parent = nullptr, const QString& title = "Default title");
+  void createCharts(StoreGateSvc* sg, VP1GraphicsItemCollection* items, bool visible, std::vector<QChart*>& list, const std::string& collectionName);
+//   VP1CoordinateAxes * coordinateaxes;
+//   VP1Floor * floor;
+//   VP1CartesianGrid * cartesiangrid;
+//   VP1CylindricalGrid * cylindricalgrid;
+//   VP1Letters * letters;
+//   VP1EtaCone * etacone1;
+//   VP1EtaCone * etacone2;
+//   VP1EtaCone * etacone3;
+//   VP1TrackingVolumes * trackingVolumes;
+//   VP1Lines * lines;
+
+//   ProjectionSurfacesHelper * projsurfhelper_pixel;
+//   ProjectionSurfacesHelper * projsurfhelper_sct;
+//   ProjectionSurfacesHelper * projsurfhelper_trt;
+//   InDetProjFlags::InDetProjPartsFlags lastemit_pixel;
+//   InDetProjFlags::InDetProjPartsFlags lastemit_sct;
+//   InDetProjFlags::InDetProjPartsFlags lastemit_trt;
+
+  //For knowing which ID parts are used by data systems:
+//   std::map<QObject*,InDetProjFlags::DetTypeFlags> sender2iddettypeswithprojs;
+};
+
+//_____________________________________________________________________________________
+VP1WaveformSystem::VP1WaveformSystem()
+  : IVP12DSystemSimple("Waveforms",
+		       "System displaying waveform data",
+		       "dcasper@uci.edu"), m_d(new Imp(this))
+{
+}
+
+
+//_____________________________________________________________________________________
+VP1WaveformSystem::~VP1WaveformSystem()
+{
+  delete m_d;
+}
+
+//_____________________________________________________________________________________
+QWidget * VP1WaveformSystem::buildController()
+{
+  m_d->controller = new WaveformSysController(this);
+
+  connect(m_d->controller,SIGNAL(vetoEnabledChanged(bool)),this,SLOT(updateVetoElements(bool)));
+  connect(m_d->controller,SIGNAL(triggerEnabledChanged(bool)),this,SLOT(updateTriggerElements(bool)));
+  connect(m_d->controller,SIGNAL(preshowerEnabledChanged(bool)),this,SLOT(updatePreshowerElements(bool)));
+  connect(m_d->controller,SIGNAL(calorimeterEnabledChanged(bool)),this,SLOT(updateCalorimeterElements(bool)));
+  connect(m_d->controller,SIGNAL(clockEnabledChanged(bool)),this,SLOT(updateClockElements(bool)));
+  connect(m_d->controller,SIGNAL(testEnabledChanged(bool)),this,SLOT(updateTestElements(bool)));
+
+  return m_d->controller;
+}
+
+//_____________________________________________________________________________________
+void VP1WaveformSystem::buildEventItemCollection(StoreGateSvc* sg, VP1GraphicsItemCollection* root)
+{
+  if(VP1Msg::verbose() || true){
+    messageVerbose("buildEventItemCollection");
+  }
+
+  m_d->vetoCharts.clear();
+  m_d->triggerCharts.clear();
+  m_d->preshowerCharts.clear();
+  m_d->calorimeterCharts.clear();
+  m_d->clockCharts.clear();
+  m_d->testCharts.clear();
+  m_d->nCharts = 0;
+
+  m_d->createCharts(sg, root, m_d->controller->vetoEnabled(), m_d->vetoCharts, "VetoWaveforms");
+  m_d->createCharts(sg, root, m_d->controller->triggerEnabled(), m_d->triggerCharts, "TriggerWaveforms");
+  m_d->createCharts(sg, root, m_d->controller->preshowerEnabled(), m_d->preshowerCharts, "PreshowerWaveforms");
+  m_d->createCharts(sg, root, m_d->controller->calorimeterEnabled(), m_d->calorimeterCharts, "CaloWaveforms");
+  m_d->createCharts(sg, root, m_d->controller->clockEnabled(), m_d->clockCharts, "ClockWaveforms");
+  m_d->createCharts(sg, root, m_d->controller->testEnabled(), m_d->testCharts, "TestWaveforms");
+  
+}
+
+void VP1WaveformSystem::Imp::createCharts(StoreGateSvc* sg, 
+                                          VP1GraphicsItemCollection* items, 
+                                          bool visible, 
+                                          std::vector<QChart*>& list, 
+                                          const std::string& collectionName)
+{
+    typedef DataVector<ScintWaveform>::const_iterator ScintWaveformConstIterator;
+
+    const ScintWaveformContainer* p_container {nullptr};
+    if(sg->retrieve(p_container, collectionName)==StatusCode::SUCCESS)
+    {
+      for(ScintWaveformConstIterator i_wf=p_container->begin(); i_wf!=p_container->end(); ++i_wf)
+      {
+        if ((*i_wf)->n_samples() > 0)
+        {
+          QString title { collectionName.c_str() };
+          title.append(" ").append(QString::number((*i_wf)->channel()));
+          QChart* chart = createChart((*i_wf)->adc_counts(), nullptr, title);
+          chart->setVisible(visible);
+          list.push_back(chart);
+          items->addItem(chart, true, true);
+        }
+      }
+    }
+    else
+    {
+      QString errorMsg {"Unable to retrieve "};
+      theclass->message(errorMsg.append(collectionName.c_str()));
+    }
+}
+
+QChart* VP1WaveformSystem::Imp::createChart(const std::vector<unsigned int>& data, QGraphicsItem* parent, const QString& title) 
+{
+  
+  QChart* chart = new QChart(parent);
+  QLineSeries *series = new QLineSeries();
+//   *series << QPointF(0, 6) << QPointF(9, 4) << QPointF(15, 20) << QPointF(25, 12) << QPointF(29, 26);
+  unsigned int maxEntry = 0;
+  for (size_t i = 0; i < data.size(); i++)
+  {
+      maxEntry = std::max(maxEntry, data[i]);
+      series->append(i, data[i]);
+  }
+
+  QPen pen(QRgb(0xfdb157));
+  pen.setWidth(1);
+  series->setPen(pen);
+  chart->legend()->hide();
+  chart->addSeries(series);
+
+  QFont font;
+  font.setPixelSize(24);
+  chart->setTitleFont(font);
+  chart->setTitleBrush(QBrush(Qt::blue));
+  chart->setTitle(title);
+  QValueAxis* axisX = new QValueAxis();
+  QFont labelsFont;
+  labelsFont.setPixelSize(8);
+  QPen axisPen(QRgb(0xd18952));
+  axisPen.setWidth(2);
+  axisX->setRange(0, data.size()-1);
+  axisX->setTickCount(10);
+  axisX->setLabelsFont(labelsFont);
+  axisX->setLinePen(axisPen);
+  chart->addAxis(axisX, Qt::AlignBottom);
+  QValueAxis* axisY = new QValueAxis();
+  axisY->setRange(0, maxEntry);
+  axisY->setTickCount(8);
+  axisY->setLabelsFont(labelsFont);
+  axisY->setLinePen(axisPen);
+  chart->addAxis(axisY, Qt::AlignLeft);
+//   chart->resize(500,500);
+
+  qreal x = (nCharts%5) * 550;
+  qreal y = (nCharts/5) * 550;
+
+  chart->setGeometry(x, y, 500, 500);
+  nCharts++;
+  return chart;
+}
+
+//_____________________________________________________________________________________
+void VP1WaveformSystem::buildPermanentItemCollection(StoreGateSvc* /*detstore*/, VP1GraphicsItemCollection* /*root*/)
+{
+  if(VP1Msg::verbose() || true){
+    messageVerbose("buildPermanentItemCollection");
+  }
+//   //No guidelines are pickable:
+//   SoPickStyle *pickStyle = new SoPickStyle;
+//   pickStyle->style=SoPickStyle::UNPICKABLE;
+//   root->addChild(pickStyle);
+
+//   //High complexity val for eta cones:
+//   SoComplexity * complexity = new SoComplexity;
+//   complexity->value.setValue(2.0f);
+//   root->addChild(complexity);
+
+//   //Floor:
+//   m_d->floor = new VP1Floor(root,this);
+//   connect(m_d->controller,SIGNAL(floorExtentChanged(const double&)),m_d->floor,SLOT(setExtent(const double&)));
+//   m_d->floor->setExtent(m_d->controller->floorExtent());
+//   connect(m_d->controller,SIGNAL(floorSpacingChanged(const double&)),m_d->floor,SLOT(setSpacing(const double&)));
+//   m_d->floor->setSpacing(m_d->controller->floorSpacing());
+//   connect(m_d->controller,SIGNAL(floorHeightChanged(const double&)),m_d->floor,SLOT(setVerticalPosition(const double&)));
+//   m_d->floor->setVerticalPosition(m_d->controller->floorHeight());
+//   connect(m_d->controller,SIGNAL(floorColourAndTranspChanged( const SbColor4f&)),m_d->floor,SLOT(setColourAndTransp(const SbColor4f&)));
+//   m_d->floor->setColourAndTransp(m_d->controller->floorColourAndTransp());
+//   connect(m_d->controller,SIGNAL(showFloorChanged(bool)),m_d->floor,SLOT(setShown(bool)));
+//   m_d->floor->setShown(m_d->controller->showFloor());
+
+//   //CartesianGrid:
+//   m_d->cartesiangrid = new VP1CartesianGrid(root,this);
+//   connect(m_d->controller,SIGNAL(gridExtentChanged(const double&)),m_d->cartesiangrid,SLOT(setExtent(const double&)));
+//   m_d->cartesiangrid->setExtent(m_d->controller->gridExtent());
+//   connect(m_d->controller,SIGNAL(gridSpacingChanged(const double&)),m_d->cartesiangrid,SLOT(setSpacing(const double&)));
+//   m_d->cartesiangrid->setSpacing(m_d->controller->gridSpacing());
+//   connect(m_d->controller,SIGNAL(gridColourAndTranspChanged( const SbColor4f&)),m_d->cartesiangrid,SLOT(setColourAndTransp(const SbColor4f&)));
+//   m_d->cartesiangrid->setColourAndTransp(m_d->controller->gridColourAndTransp());
+//   connect(m_d->controller,SIGNAL(showCartesianGridChanged(bool)),m_d->cartesiangrid,SLOT(setShown(bool)));
+//   m_d->cartesiangrid->setShown(m_d->controller->showCartesianGrid());
+
+//   //CylindricalGrid:
+//   m_d->cylindricalgrid = new VP1CylindricalGrid(root,this);
+//   connect(m_d->controller,SIGNAL(gridExtentChanged(const double&)),m_d->cylindricalgrid,SLOT(setExtent(const double&)));
+//   m_d->cylindricalgrid->setExtent(m_d->controller->gridExtent());
+//   connect(m_d->controller,SIGNAL(gridSpacingChanged(const double&)),m_d->cylindricalgrid,SLOT(setSpacing(const double&)));
+//   m_d->cylindricalgrid->setSpacing(m_d->controller->gridSpacing());
+//   connect(m_d->controller,SIGNAL(gridColourAndTranspChanged( const SbColor4f&)),m_d->cylindricalgrid,SLOT(setColourAndTransp(const SbColor4f&)));
+//   m_d->cylindricalgrid->setColourAndTransp(m_d->controller->gridColourAndTransp());
+//   connect(m_d->controller,SIGNAL(showCylindricalGridChanged(bool)),m_d->cylindricalgrid,SLOT(setShown(bool)));
+//   m_d->cylindricalgrid->setShown(m_d->controller->showCylindricalGrid());
+
+//   //Letters:
+//   m_d->letters = new VP1Letters(m_d->controller->lettersMaterial(),root,this);
+//   connect(m_d->controller,SIGNAL(lettersZPosChanged(const double&)),m_d->letters,SLOT(setZPos(const double&)));
+//   m_d->letters->setZPos(m_d->controller->lettersZPos());
+//   connect(m_d->controller,SIGNAL(lettersVerticalPosChanged(const double&)),m_d->letters,SLOT(setVerticalPosition(const double&)));
+//   m_d->letters->setVerticalPosition(m_d->controller->lettersVerticalPos());
+//   connect(m_d->controller,SIGNAL(showLettersChanged(bool)),m_d->letters,SLOT(setShown(bool)));
+//   m_d->letters->setShown(m_d->controller->showLetters());
+
+//   //Coordinate axes:
+//   m_d->coordinateaxes = new VP1CoordinateAxes(m_d->controller->xAxisMaterial(),
+// 					    m_d->controller->yAxisMaterial(),
+// 					    m_d->controller->zAxisMaterial(),
+// 					    root,this);
+//   connect(m_d->controller,SIGNAL(axesLengthChanged(const double&)),m_d->coordinateaxes,SLOT(setLength(const double&)));
+//   m_d->coordinateaxes->setLength(m_d->controller->axesLength());
+//   connect(m_d->controller,SIGNAL(axesPositionChanged(const SbVec3f&)),m_d->coordinateaxes,SLOT(setPosition(const SbVec3f&)));
+//   m_d->coordinateaxes->setPosition(m_d->controller->axesPosition());
+//   connect(m_d->controller,SIGNAL(relAxesThicknessChanged(const double&)),m_d->coordinateaxes,SLOT(setRelativeAxisThickness(const double&)));
+//   m_d->coordinateaxes->setRelativeAxisThickness(m_d->controller->relAxesThickness());
+//   connect(m_d->controller,SIGNAL(showAxesChanged(bool)),m_d->coordinateaxes,SLOT(setShown(bool)));
+//   m_d->coordinateaxes->setShown(m_d->controller->showAxes());
+
+//   //Eta cones:
+//   m_d->etacone1 = new VP1EtaCone(m_d->controller->etaCone1Material(),root,this);
+//   connect(m_d->controller,SIGNAL(etaExtentChanged(const double&)),m_d->etacone1,SLOT(setExtent(const double&)));
+//   m_d->etacone1->setExtent(m_d->controller->etaExtent());
+//   connect(m_d->controller,SIGNAL(etaConeValue1Changed(const double&)),m_d->etacone1,SLOT(setEtaValue(const double&)));
+//   m_d->etacone1->setEtaValue(m_d->controller->etaConeValue1());
+//   connect(m_d->controller,SIGNAL(showEtaCone1Changed(bool)),m_d->etacone1,SLOT(setShown(bool)));
+//   m_d->etacone1->setShown(m_d->controller->showEtaCone1());
+
+//   m_d->etacone2 = new VP1EtaCone(m_d->controller->etaCone2Material(),root,this);
+//   connect(m_d->controller,SIGNAL(etaExtentChanged(const double&)),m_d->etacone2,SLOT(setExtent(const double&)));
+//   m_d->etacone2->setExtent(m_d->controller->etaExtent());
+//   connect(m_d->controller,SIGNAL(etaConeValue2Changed(const double&)),m_d->etacone2,SLOT(setEtaValue(const double&)));
+//   m_d->etacone2->setEtaValue(m_d->controller->etaConeValue2());
+//   connect(m_d->controller,SIGNAL(showEtaCone2Changed(bool)),m_d->etacone2,SLOT(setShown(bool)));
+//   m_d->etacone2->setShown(m_d->controller->showEtaCone2());
+
+//   m_d->etacone3 = new VP1EtaCone(m_d->controller->etaCone3Material(),root,this);
+//   connect(m_d->controller,SIGNAL(etaExtentChanged(const double&)),m_d->etacone3,SLOT(setExtent(const double&)));
+//   m_d->etacone3->setExtent(m_d->controller->etaExtent());
+//   connect(m_d->controller,SIGNAL(etaConeValue3Changed(const double&)),m_d->etacone3,SLOT(setEtaValue(const double&)));
+//   m_d->etacone3->setEtaValue(m_d->controller->etaConeValue3());
+//   connect(m_d->controller,SIGNAL(showEtaCone3Changed(bool)),m_d->etacone3,SLOT(setShown(bool)));
+//   m_d->etacone3->setShown(m_d->controller->showEtaCone3());
+
+// 	//Tracking Volumes:
+// 	m_d->trackingVolumes = new VP1TrackingVolumes(m_d->controller->idTrkVolumesMaterial(),
+//                                               m_d->controller->caloTrkVolumesMaterial(),
+//                                               m_d->controller->msTrkVolumesMaterial(),
+//                                               m_d->controller->showInnerDetector(),
+//                                               m_d->controller->showCalorimeters(),
+//                                               m_d->controller->showMuonSpectrometer(),
+//                                               root,this);
+// 	connect(m_d->controller,SIGNAL(showTrackingVolumesChanged(bool)),m_d->trackingVolumes,SLOT(setShown(bool)));
+// 	connect(m_d->controller,SIGNAL(showInnerDetectorChanged(bool)),m_d->trackingVolumes,SLOT(setShownID(bool)));
+// 	connect(m_d->controller,SIGNAL(showCalorimetersChanged(bool)),m_d->trackingVolumes,SLOT(setShownCalo(bool)));
+// 	connect(m_d->controller,SIGNAL(showMuonSpectrometerChanged(bool)),m_d->trackingVolumes,SLOT(setShownMS(bool)));
+// 	m_d->trackingVolumes->setShown(m_d->controller->showTrackingVolumes());	
+  
+//   //Lines
+//   m_d->lines = new VP1Lines(root, this);
+//   connect(m_d->controller,SIGNAL(showLinesChanged(bool)),m_d->lines,SLOT(setShown(bool)));
+// 	m_d->lines->setShown(m_d->controller->showLines());	
+//   connect(m_d->controller,SIGNAL(lineDirectionChanged(const SbVec3f&)),m_d->lines,SLOT(setDirection(const SbVec3f&)));
+//   m_d->lines->setDirection(m_d->controller->lineDirection());  
+  
+//   SoSeparator * projsep = new SoSeparator;
+//   root->addChild(projsep);
+
+//   m_d->projsurfhelper_pixel = ProjectionSurfacesHelper::createPixelHelper(m_d->controller->pixelProjSurfMaterial(),projsep,this,this);
+//   m_d->projsurfhelper_sct = ProjectionSurfacesHelper::createSCTHelper(m_d->controller->sctProjSurfMaterial(),projsep,this,this);
+//   m_d->projsurfhelper_trt = ProjectionSurfacesHelper::createTRTHelper(m_d->controller->trtProjSurfMaterial(),projsep,this,this);
+
+//   connect(m_d->controller,SIGNAL(shownPixelProjSurfacesChanged(InDetProjFlags::InDetProjPartsFlags)),
+// 	  m_d->projsurfhelper_pixel,SLOT(setSurfaces(InDetProjFlags::InDetProjPartsFlags)));
+//   m_d->projsurfhelper_pixel->setSurfaces(m_d->controller->shownPixelProjSurfaces());
+
+//   connect(m_d->controller,SIGNAL(shownSCTProjSurfacesChanged(InDetProjFlags::InDetProjPartsFlags)),
+// 	  m_d->projsurfhelper_sct,SLOT(setSurfaces(InDetProjFlags::InDetProjPartsFlags)));
+//   m_d->projsurfhelper_sct->setSurfaces(m_d->controller->shownSCTProjSurfaces());
+
+//   connect(m_d->controller,SIGNAL(shownTRTProjSurfacesChanged(InDetProjFlags::InDetProjPartsFlags)),
+// 	  m_d->projsurfhelper_trt,SLOT(setSurfaces(InDetProjFlags::InDetProjPartsFlags)));
+//   m_d->projsurfhelper_trt->setSurfaces(m_d->controller->shownTRTProjSurfaces());
+
+//   connect(m_d->controller,SIGNAL(applicablePixelProjPartsChanged(InDetProjFlags::InDetProjPartsFlags)),this,SLOT(possiblyEmit_ApplicableProjectionsChanged()));
+//   connect(m_d->controller,SIGNAL(applicableSCTProjPartsChanged(InDetProjFlags::InDetProjPartsFlags)),this,SLOT(possiblyEmit_ApplicableProjectionsChanged()));
+//   connect(m_d->controller,SIGNAL(applicableTRTProjPartsChanged(InDetProjFlags::InDetProjPartsFlags)),this,SLOT(possiblyEmit_ApplicableProjectionsChanged()));
+
+//   possiblyEmit_ApplicableProjectionsChanged();//fixme; late enough??? Problem with new delayed init: until guides are enabled, proper projections won't be known!!
+//   //Thus, the channel should call this slot explicitly after making all connections!!!
+}
+
+//_____________________________________________________________________________________
+void VP1WaveformSystem::systemuncreate()
+{
+//   delete m_d->coordinateaxes; m_d->coordinateaxes = 0;
+//   delete m_d->floor; m_d->floor = 0;
+//   delete m_d->cartesiangrid; m_d->cartesiangrid = 0;
+//   delete m_d->cylindricalgrid; m_d->cylindricalgrid = 0;
+//   delete m_d->letters; m_d->letters = 0;
+//   delete m_d->etacone1; m_d->etacone1 = 0;
+//   delete m_d->etacone2; m_d->etacone2 = 0;
+//   delete m_d->etacone3; m_d->etacone3 = 0;
+//   delete m_d->projsurfhelper_pixel; m_d->projsurfhelper_pixel = 0;
+//   delete m_d->projsurfhelper_sct; m_d->projsurfhelper_sct = 0;
+//   delete m_d->projsurfhelper_trt; m_d->projsurfhelper_trt = 0;
+//   delete m_d->trackingVolumes; m_d->trackingVolumes = 0;
+
+  m_d->controller=0;
+}
+
+
+//_____________________________________________________________________________________
+QByteArray VP1WaveformSystem::saveState() {
+
+  if (m_d->controller == nullptr) buildController();
+
+  VP1Serialise serialise(0/*version*/,this);
+  serialise.save(IVP12DSystemSimple::saveState());
+  serialise.save(m_d->controller->saveSettings());
+  serialise.disableUnsavedChecks();//We do the testing in the controller
+  return serialise.result();
+}
+
+//_____________________________________________________________________________________
+void VP1WaveformSystem::restoreFromState(QByteArray ba) {
+
+  VP1Deserialise state(ba,this);
+  if (state.version() != 0) {
+    message("Warning: State data in .vp1 file is in wrong format - ignoring!");
+    state.disableUnrestoredChecks();//We do the testing in the controller
+    return;
+  }
+//   if (state.version() > 0 &&state.version()<=3) {
+//     message("Warning: State data in .vp1 file is in obsolete format - ignoring!");
+//     state.disableUnrestoredChecks();//We do the testing in the controller
+//     return;
+//   }
+  if (m_d->controller == nullptr) buildController();
+
+  IVP12DSystemSimple::restoreFromState(state.restoreByteArray());
+  m_d->controller->restoreSettings(state.restoreByteArray());
+  state.disableUnrestoredChecks();//We do the testing in the controller
+}
+
+void VP1WaveformSystem::updateVetoElements(bool enabled)
+{
+    for (QChart* c : m_d->vetoCharts)
+    {
+        c->setVisible(enabled);
+    }
+}
+
+void VP1WaveformSystem::updateTriggerElements(bool enabled)
+{
+    for (QChart* c : m_d->triggerCharts)
+    {
+        c->setVisible(enabled);
+    }
+}
+
+void VP1WaveformSystem::updatePreshowerElements(bool enabled)
+{
+    for (QChart* c : m_d->preshowerCharts)
+    {
+        c->setVisible(enabled);
+    }
+}
+
+void VP1WaveformSystem::updateCalorimeterElements(bool enabled)
+{
+    for (QChart* c : m_d->calorimeterCharts)
+    {
+        c->setVisible(enabled);
+    }
+}
+
+void VP1WaveformSystem::updateClockElements(bool enabled)
+{
+    for (QChart* c : m_d->clockCharts)
+    {
+        c->setVisible(enabled);
+    }
+}
+
+void VP1WaveformSystem::updateTestElements(bool enabled)
+{
+    for (QChart* c : m_d->testCharts)
+    {
+        c->setVisible(enabled);
+    }
+}
+
+//_____________________________________________________________________________________
+// void VP1GuideLineSystem::setIDDetTypesUsingProjections( InDetProjFlags::DetTypeFlags f )
+// {
+//   ensureBuildController();
+//   if (!m_d->controller)
+//     return;//if receiving signals after uncreate
+//   if(VP1Msg::verbose()){
+//     messageVerbose("Signal received in setIDDetTypesUsingProjections("+str(f)+") slot (from "
+//   		 +QString(sender()?sender()->objectName():"NULL sender")+")");
+//   }
+//   m_d->sender2iddettypeswithprojs[sender()] = f;
+//   InDetProjFlags::DetTypeFlags used(InDetProjFlags::NoDet);
+//   std::map<QObject*,InDetProjFlags::DetTypeFlags>::iterator it, itE = m_d->sender2iddettypeswithprojs.end();
+//   for (it=m_d->sender2iddettypeswithprojs.begin();it!=itE;++it)
+//     used |= it->second;
+//   m_d->controller->setInDetDetTypesUsingProjections(used);
+// }
+
+// //_____________________________________________________________________________________
+// void VP1GuideLineSystem::possiblyEmit_ApplicableProjectionsChanged()
+// {
+//   ensureBuildController();
+//   if (!m_d->controller)
+//     return;//if receiving signals after uncreate
+//   InDetProjFlags::InDetProjPartsFlags new_pixel = m_d->controller->applicablePixelProjParts();
+//   InDetProjFlags::InDetProjPartsFlags new_sct = m_d->controller->applicableSCTProjParts();
+//   InDetProjFlags::InDetProjPartsFlags new_trt = m_d->controller->applicableTRTProjParts();
+//   if (m_d->lastemit_pixel==new_pixel&&m_d->lastemit_sct==new_sct&&m_d->lastemit_trt==new_trt)
+//     return;
+//   m_d->lastemit_pixel=new_pixel;
+//   m_d->lastemit_sct=new_sct;
+//   m_d->lastemit_trt=new_trt;
+//   if(VP1Msg::verbose()){
+//     messageVerbose("Emitting applicableProjectionsChanged("+str(m_d->lastemit_pixel)+", "+str(m_d->lastemit_sct)+", "+str(m_d->lastemit_trt)+")");
+//   }
+//   emit applicableProjectionsChanged( m_d->lastemit_pixel,m_d->lastemit_sct,m_d->lastemit_trt );
+// }
diff --git a/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/src/WaveformSysController.cxx b/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/src/WaveformSysController.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..17702c4ed548b83326b1223c83e30d70e1d403cc
--- /dev/null
+++ b/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/src/WaveformSysController.cxx
@@ -0,0 +1,1130 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+////////////////////////////////////////////////////////////////
+//                                                            //
+//  Implementation of class WaveformSysController             //
+//                                                            //
+//  Author: Dave Casper (dcasper@uci.edu)                     //
+//  Initial version: August 2021                              //
+//                                                            //
+////////////////////////////////////////////////////////////////
+
+#define VP1IMPVARNAME m_d
+
+#include "VTI12WaveformSystems/WaveformSysController.h"
+#include "ui_waveformcontrollerform.h"
+// #include "ui_guidelinescontrollerform.h"
+// #include "ui_guides_settings_coordinateaxes_form.h"
+// #include "ui_guides_settings_etacones_form.h"
+// #include "ui_guides_settings_floorandletters_form.h"
+// #include "ui_guides_settings_grid_form.h"
+// #include "ui_guides_settings_idprojsurfs_form.h"
+// #include "ui_guides_settings_trkvolumes_form.h"
+// #include "ui_guides_settings_lines_form.h"
+#include "VP1Base/VP1Serialise.h"
+#include "VP1Base/VP1Deserialise.h"
+
+// System of units
+#ifdef BUILDVP1LIGHT
+	#include "GeoModelKernel/Units.h"
+	#define SYSTEM_OF_UNITS GeoModelKernelUnits // --> 'GeoModelKernelUnits::cm'
+#else
+  #include "GaudiKernel/SystemOfUnits.h"
+  #define SYSTEM_OF_UNITS Gaudi::Units // --> 'Gaudi::Units::cm'
+#endif
+
+#include <cmath>
+
+//____________________________________________________________________
+class WaveformSysController::Imp {
+public:
+  WaveformSysController * theclass;
+  Ui::VP1WaveformControllerForm ui;
+
+  // Ui::VP1GuidesControllerForm ui;
+  // Ui::VP1GuidesSysSettingsCoordinateAxesForm ui_axes;
+  // Ui::VP1GuidesSysSettingsEtaConeForm ui_etacones;
+  // Ui::VP1GuidesSysSettingsFloorAndLettersForm ui_floorandletters;
+  // Ui::VP1GuidesSysSettingsGridForm ui_grid;
+  // Ui::VP1GuidesSysSettingsIDProjSurfsForm ui_idprojsurfs;
+  // Ui::VP1TrackingVolumesForm ui_trkvolumes;
+  // Ui::VP1LinesForm ui_lines;
+
+  static SbColor4f color4f(const QColor& col, int transp_int) {
+    return SbColor4f(std::max<float>(0.0f,std::min<float>(1.0f,col.redF())),
+		     std::max<float>(0.0f,std::min<float>(1.0f,col.greenF())),
+		     std::max<float>(0.0f,std::min<float>(1.0f,col.blueF())),
+		     std::max<float>(0.0f,std::min<float>(1.0f,1.0-transp_int/100.0)));
+  }
+
+  bool last_vetoEnabled;
+  bool last_triggerEnabled;
+  bool last_preshowerEnabled;
+  bool last_calorimeterEnabled;
+  bool last_clockEnabled;
+  bool last_testEnabled;
+  // bool last_showFloor;
+  // SbColor4f last_floorColourAndTransp;
+  // double last_floorExtent;
+  // double last_floorSpacing;
+  // double last_floorHeight;
+  // bool last_showLetters;
+  // double last_lettersZPos;
+  // double last_lettersVerticalPos;
+  // bool last_showAxes;
+  // double last_axesLength;
+  // SbVec3f last_axesPosition;
+  // double last_relAxesThickness;
+  // bool last_showCartesianGrid;
+  // bool last_showCylindricalGrid;
+  // SbColor4f last_gridColourAndTransp;
+  // double last_gridSpacing;
+  // double last_gridExtent;
+  // bool last_showEtaCone1;
+  // bool last_showEtaCone2;
+  // bool last_showEtaCone3;
+  // double last_etaConeValue1;
+  // double last_etaConeValue2;
+  // double last_etaConeValue3;
+  // double last_etaExtent;
+  // bool last_showTrackingVolumes;
+  // bool last_showInnerDetector;
+  // bool last_showCalorimeters;
+  // bool last_showMuonSpectrometer;
+  // bool last_showLines;
+  // SbVec3f last_lineDirection;
+  // double last_line_eta; // This is needed to update the display in possibleChange_lineDirection
+
+};
+
+//____________________________________________________________________
+WaveformSysController::WaveformSysController(IVP1System * sys)
+  : VP1Controller(sys,"WaveformSysController"), m_d(new Imp)
+{
+  m_d->theclass = this;
+  m_d->ui.setupUi(this);
+
+  // initDialog(m_d->ui_axes, m_d->ui.pushButton_settings_coordinateAxes,m_d->ui.checkBox_coordinateAxes);
+  // initDialog(m_d->ui_etacones, m_d->ui.pushButton_settings_etaCones,m_d->ui.checkBox_etaCones);
+  // initDialog(m_d->ui_floorandletters, m_d->ui.pushButton_settings_floorAndLetters,m_d->ui.checkBox_floorAndLetters);
+  // initDialog(m_d->ui_grid, m_d->ui.pushButton_settings_grid,m_d->ui.checkBox_grid);
+  // initDialog(m_d->ui_idprojsurfs, m_d->ui.pushButton_settings_inDetProjSurfs,m_d->ui.checkBox_inDetProjSurfs);
+  // initDialog(m_d->ui_trkvolumes, m_d->ui.pushButton_settings_trkVolumes,m_d->ui.checkBox_trkVolumes);
+  // initDialog(m_d->ui_lines, m_d->ui.pushButton_settings_lines,m_d->ui.checkBox_lines);
+
+  //Hide SCT/Pixel projection surface controls for now:
+  // m_d->ui_idprojsurfs.groupBox_pixelproj->setVisible(false);
+  // m_d->ui_idprojsurfs.groupBox_sctproj->setVisible(false);
+
+  //Since we have different logical groups of radio buttons inside
+  //same groupboxes, we make sure they are coordinated correctly:
+
+  // QButtonGroup * pixelproj_barrel_radiogroup = defineRadioButtonGroup(m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_inner,
+	// 							      m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_outer,
+	// 							      m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_both);
+  // m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_inner->setChecked(true);
+  // QButtonGroup * pixelproj_endcap_radiogroup = defineRadioButtonGroup(m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_inner,
+	// 							      m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_outer,
+	// 							      m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_both);
+  // m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_inner->setChecked(true);
+
+
+  // QButtonGroup * sctproj_barrel_radiogroup = defineRadioButtonGroup(m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_inner,
+	// 							    m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_outer,
+	// 							    m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_both);
+  // m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_inner->setChecked(true);
+  // QButtonGroup * sctproj_endcap_radiogroup = defineRadioButtonGroup(m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_inner,
+	// 							    m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_outer,
+	// 							    m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_both);
+  // m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_inner->setChecked(true);
+
+
+  // QButtonGroup * trtproj_barrel_radiogroup = defineRadioButtonGroup(m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_inner,
+	// 							    m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_outer,
+	// 							    m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_both);
+  // m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_inner->setChecked(true);
+  // QButtonGroup * trtproj_endcap_radiogroup = defineRadioButtonGroup(m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_inner,
+	// 							    m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_outer,
+	// 							    m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_both);
+  // m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_inner->setChecked(true);
+
+  //Setup material buttons:
+  // m_d->ui_floorandletters.colorButton_floor->setColor(QColor::fromRgbF(0.5,0.5,0.5));
+  // m_d->ui_grid.colorButton_grid->setColor(QColor::fromRgbF(1.0,1.0,1.0));
+  // m_d->ui_floorandletters.matButton_letters->setMaterial(VP1MaterialButton::createMaterial(0.5,0.5,0.5,0.1));
+  // m_d->ui_axes.matButton_axes_x->setMaterial(VP1MaterialButton::createMaterial(1,0,0,0.15));
+  // m_d->ui_axes.matButton_axes_y->setMaterial(VP1MaterialButton::createMaterial(0,1,0,0.15));
+  // m_d->ui_axes.matButton_axes_z->setMaterial(VP1MaterialButton::createMaterial(0,0,2,0.15));
+  // m_d->ui_etacones.matButton_etaCone1->setMaterial(VP1MaterialButton::createMaterial(1,1,0,0.2,0.5));
+  // m_d->ui_etacones.matButton_etaCone2->setMaterial(VP1MaterialButton::createMaterial(1,0.56471,0.20784,0.2,0.5));
+  // m_d->ui_etacones.matButton_etaCone3->setMaterial(VP1MaterialButton::createMaterial(1,0.15686,0.08235,0.2,0.5));
+  // m_d->ui_idprojsurfs.pushButton_projsurfmaterial_pixel->setMaterial(VP1MaterialButton::createMaterial(126/255.0, 194/255.0, 204/255.0,0.05,0.35));
+  // m_d->ui_idprojsurfs.pushButton_projsurfmaterial_sct->setMaterial(VP1MaterialButton::createMaterial(126/255.0, 194/255.0, 204/255.0,0.05,0.35));
+  // m_d->ui_idprojsurfs.pushButton_projsurfmaterial_trt->setMaterial(VP1MaterialButton::createMaterial(126/255.0, 194/255.0, 204/255.0,0.05,0.35));
+  // m_d->ui_trkvolumes.matButton_ID->setMaterial(VP1MaterialButton::createMaterial(1,0,0,0.15));
+  // m_d->ui_trkvolumes.matButton_Calo->setMaterial(VP1MaterialButton::createMaterial(0,1,0,0.15));
+  // m_d->ui_trkvolumes.matButton_MS->setMaterial(VP1MaterialButton::createMaterial(0,0,2,0.15));
+	
+  /////////////////////////////////////////////////////////////////////////////////////////////////////////////
+  //  Setup connections which monitor changes in the controller so that we may emit signals as appropriate:  //
+  /////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+  // addUpdateSlot(SLOT(possibleChange_showFloor()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_floorAndLetters);
+  // connectToLastUpdateSlot(m_d->ui_floorandletters.checkBox_floorenabled);
+
+  // addUpdateSlot(SLOT(possibleChange_floorColourAndTransp()));
+  // connectToLastUpdateSlot(m_d->ui_floorandletters.colorButton_floor);
+  // connectToLastUpdateSlot(m_d->ui_floorandletters.spinBox_floortransp);
+
+  // addUpdateSlot(SLOT(possibleChange_floorExtent()));
+  // connectToLastUpdateSlot(m_d->ui_floorandletters.doubleSpinBox_floorextent);
+
+  // addUpdateSlot(SLOT(possibleChange_floorSpacing()));
+  // connectToLastUpdateSlot(m_d->ui_floorandletters.doubleSpinBox_floorspacing);
+
+  // addUpdateSlot(SLOT(possibleChange_floorHeight()));
+  // connectToLastUpdateSlot(m_d->ui_floorandletters.doubleSpinBox_floorheight);
+
+  // addUpdateSlot(SLOT(possibleChange_showLetters()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_floorAndLetters);
+  // connectToLastUpdateSlot(m_d->ui_floorandletters.checkBox_acdesignations);
+
+  // addUpdateSlot(SLOT(possibleChange_lettersZPos()));
+  // connectToLastUpdateSlot(this,SIGNAL(floorExtentChanged(const double&)));
+  // connectToLastUpdateSlot(this,SIGNAL(floorSpacingChanged(const double&)));
+
+  // addUpdateSlot(SLOT(possibleChange_lettersVerticalPos()));
+  // connectToLastUpdateSlot(this,SIGNAL(floorHeightChanged(const double&)));
+
+  // addUpdateSlot(SLOT(possibleChange_showAxes()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_coordinateAxes);
+
+  // addUpdateSlot(SLOT(possibleChange_axesLength()));
+  // connectToLastUpdateSlot(m_d->ui_axes.checkBox_axes_shownegativeparts);
+  // connectToLastUpdateSlot(m_d->ui_axes.doubleSpinBox_axes_lengths_m);
+
+  // addUpdateSlot(SLOT(possibleChange_axesPosition()));
+  // connectToLastUpdateSlot(m_d->ui_axes.doubleSpinBox_axes_xpos_m);
+  // connectToLastUpdateSlot(m_d->ui_axes.doubleSpinBox_axes_ypos_m);
+  // connectToLastUpdateSlot(m_d->ui_axes.doubleSpinBox_axes_zpos_m);
+
+  // addUpdateSlot(SLOT(possibleChange_relAxesThickness()));
+  // connectToLastUpdateSlot(m_d->ui_axes.doubleSpinBox_axes_relthickness);
+
+  // addUpdateSlot(SLOT(possibleChange_showCartesianGrid()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_grid);
+  // connectToLastUpdateSlot(m_d->ui_grid.radioButton_grid_cartesian);
+
+  // addUpdateSlot(SLOT(possibleChange_showCylindricalGrid()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_grid);
+  // connectToLastUpdateSlot(m_d->ui_grid.radioButton_grid_cylindrical);
+
+  // addUpdateSlot(SLOT(possibleChange_gridColourAndTransp()));
+  // connectToLastUpdateSlot(m_d->ui_grid.colorButton_grid);
+  // connectToLastUpdateSlot(m_d->ui_grid.spinBox_gridtransp);
+
+  // addUpdateSlot(SLOT(possibleChange_gridSpacing()));
+  // connectToLastUpdateSlot(m_d->ui_grid.doubleSpinBox_gridspacing);
+
+  // addUpdateSlot(SLOT(possibleChange_gridExtent()));
+  // connectToLastUpdateSlot(m_d->ui_grid.doubleSpinBox_gridextent);
+
+  // addUpdateSlot(SLOT(possibleChange_showEtaCone1()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_etaCones);
+  // connectToLastUpdateSlot(m_d->ui_etacones.checkBox_etacone1);
+
+  // addUpdateSlot(SLOT(possibleChange_showEtaCone2()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_etaCones);
+  // connectToLastUpdateSlot(m_d->ui_etacones.checkBox_etacone2);
+
+  // addUpdateSlot(SLOT(possibleChange_showEtaCone3()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_etaCones);
+  // connectToLastUpdateSlot(m_d->ui_etacones.checkBox_etacone3);
+
+  // addUpdateSlot(SLOT(possibleChange_etaConeValue1()));
+  // connectToLastUpdateSlot(m_d->ui_etacones.doubleSpinBox_etaval1);
+
+  // addUpdateSlot(SLOT(possibleChange_etaConeValue2()));
+  // connectToLastUpdateSlot(m_d->ui_etacones.doubleSpinBox_etaval2);
+
+  // addUpdateSlot(SLOT(possibleChange_etaConeValue3()));
+  // connectToLastUpdateSlot(m_d->ui_etacones.doubleSpinBox_etaval3);
+
+  // addUpdateSlot(SLOT(possibleChange_etaExtent()));
+  // connectToLastUpdateSlot(m_d->ui_etacones.doubleSpinBox_etaconeextent);
+  // connectToLastUpdateSlot(m_d->ui_etacones.radioButton_etaconeextentisr);
+
+  // addUpdateSlot(SLOT(possibleChange_applicablePixelProjParts()));
+  // connectToLastUpdateSlot(pixelproj_barrel_radiogroup);
+  // connectToLastUpdateSlot(pixelproj_endcap_radiogroup);
+
+  // addUpdateSlot(SLOT(possibleChange_applicableSCTProjParts()));
+  // connectToLastUpdateSlot(sctproj_barrel_radiogroup);
+  // connectToLastUpdateSlot(sctproj_endcap_radiogroup);
+
+  // addUpdateSlot(SLOT(possibleChange_applicableTRTProjParts()));
+  // connectToLastUpdateSlot(trtproj_barrel_radiogroup);
+  // connectToLastUpdateSlot(trtproj_endcap_radiogroup);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_trtprojsurf_z2r);
+
+  // addUpdateSlot(SLOT(possibleChange_shownPixelProjSurfaces()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_inDetProjSurfs);
+  // connectToLastUpdateSlot(this,SIGNAL(applicablePixelProjPartsChanged(InDetProjFlags::InDetProjPartsFlags)));
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.groupBox_pixelproj);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_asneeded);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_barrelA);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_barrelC);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_endcapA);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_endcapC);
+
+  // addUpdateSlot(SLOT(possibleChange_shownSCTProjSurfaces()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_inDetProjSurfs);
+  // connectToLastUpdateSlot(this,SIGNAL(applicableSCTProjPartsChanged(InDetProjFlags::InDetProjPartsFlags)));
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.groupBox_sctproj);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_asneeded);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_barrelA);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_barrelC);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_endcapA);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_endcapC);
+
+  // addUpdateSlot(SLOT(possibleChange_shownTRTProjSurfaces()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_inDetProjSurfs);
+  // connectToLastUpdateSlot(this,SIGNAL(applicableTRTProjPartsChanged(InDetProjFlags::InDetProjPartsFlags)));
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.groupBox_trtproj);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_asneeded);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_barrelA);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_barrelC);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_endcapA);
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_endcapC);
+
+  // addUpdateSlot(SLOT(updateProjPartsCheckboxStates_Pixel()));
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_asneeded);
+
+  // addUpdateSlot(SLOT(updateProjPartsCheckboxStates_SCT()));
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_asneeded);
+
+  // addUpdateSlot(SLOT(updateProjPartsCheckboxStates_TRT()));
+  // connectToLastUpdateSlot(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_asneeded);
+
+  // addUpdateSlot(SLOT(possibleChange_showTrackingVolumes()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_trkVolumes);
+  
+  // addUpdateSlot(SLOT(possibleChange_showInnerDetector()));
+	// connectToLastUpdateSlot(m_d->ui_trkvolumes.checkBox_ID);
+  // addUpdateSlot(SLOT(possibleChange_showCalorimeters()));
+	// connectToLastUpdateSlot(m_d->ui_trkvolumes.checkBox_Calo);
+  // addUpdateSlot(SLOT(possibleChange_showMuonSpectrometer()));
+	// connectToLastUpdateSlot(m_d->ui_trkvolumes.checkBox_MS);
+
+  // addUpdateSlot(SLOT(possibleChange_showLines()));
+  // connectToLastUpdateSlot(m_d->ui.checkBox_lines);
+  
+  // addUpdateSlot(SLOT(possibleChange_lineDirection()));
+  // connectToLastUpdateSlot(m_d->ui_lines.doubleSpinBox_phi);
+  // connectToLastUpdateSlot(m_d->ui_lines.doubleSpinBox_theta);
+  // connectToLastUpdateSlot(m_d->ui_lines.doubleSpinBox_eta);
+  // connectToLastUpdateSlot(m_d->ui_lines.doubleSpinBox_length);
+  
+  addUpdateSlot(SLOT(possibleChange_vetoEnabled()));
+  connectToLastUpdateSlot(m_d->ui.checkBox_vetoEnabled);
+
+  addUpdateSlot(SLOT(possibleChange_triggerEnabled()));
+  connectToLastUpdateSlot(m_d->ui.checkBox_triggerEnabled);
+
+  addUpdateSlot(SLOT(possibleChange_preshowerEnabled()));
+  connectToLastUpdateSlot(m_d->ui.checkBox_preshowerEnabled);
+
+  addUpdateSlot(SLOT(possibleChange_calorimeterEnabled()));
+  connectToLastUpdateSlot(m_d->ui.checkBox_calorimeterEnabled);
+
+  addUpdateSlot(SLOT(possibleChange_clockEnabled()));
+  connectToLastUpdateSlot(m_d->ui.checkBox_clockEnabled);
+
+  addUpdateSlot(SLOT(possibleChange_testEnabled()));
+  connectToLastUpdateSlot(m_d->ui.checkBox_testEnabled);
+
+  initLastVars();
+}
+
+//____________________________________________________________________
+WaveformSysController::~WaveformSysController()
+{
+  delete m_d;
+}
+
+//____________________________________________________________________
+//Material access methods:
+// SoMaterial * GuideSysController::lettersMaterial() const { return m_d->ui_floorandletters.matButton_letters->handledMaterials().at(0); }
+// SoMaterial * GuideSysController::xAxisMaterial() const { return m_d->ui_axes.matButton_axes_x->handledMaterials().at(0); }
+// SoMaterial * GuideSysController::yAxisMaterial() const { return m_d->ui_axes.matButton_axes_y->handledMaterials().at(0); }
+// SoMaterial * GuideSysController::zAxisMaterial() const { return m_d->ui_axes.matButton_axes_z->handledMaterials().at(0); }
+// SoMaterial * GuideSysController::etaCone1Material() const { return m_d->ui_etacones.matButton_etaCone1->handledMaterials().at(0); }
+// SoMaterial * GuideSysController::etaCone2Material() const { return m_d->ui_etacones.matButton_etaCone2->handledMaterials().at(0); }
+// SoMaterial * GuideSysController::etaCone3Material() const { return m_d->ui_etacones.matButton_etaCone3->handledMaterials().at(0); }
+// SoMaterial * GuideSysController::pixelProjSurfMaterial() const { return m_d->ui_idprojsurfs.pushButton_projsurfmaterial_pixel->handledMaterials().at(0); }
+// SoMaterial * GuideSysController::sctProjSurfMaterial() const { return m_d->ui_idprojsurfs.pushButton_projsurfmaterial_sct->handledMaterials().at(0); }
+// SoMaterial * GuideSysController::trtProjSurfMaterial() const { return m_d->ui_idprojsurfs.pushButton_projsurfmaterial_trt->handledMaterials().at(0); }
+// SoMaterial * GuideSysController::idTrkVolumesMaterial() const { return m_d->ui_trkvolumes.matButton_ID->handledMaterials().at(0); }
+// SoMaterial * GuideSysController::caloTrkVolumesMaterial() const { return m_d->ui_trkvolumes.matButton_Calo->handledMaterials().at(0); }
+// SoMaterial * GuideSysController::msTrkVolumesMaterial() const { return m_d->ui_trkvolumes.matButton_MS->handledMaterials().at(0); }
+
+//____________________________________________________________________
+bool WaveformSysController::vetoEnabled() const
+{
+  return m_d->ui.checkBox_vetoEnabled->isChecked();
+}
+
+bool WaveformSysController::triggerEnabled() const
+{
+  return m_d->ui.checkBox_triggerEnabled->isChecked();
+}
+
+bool WaveformSysController::preshowerEnabled() const
+{
+  return m_d->ui.checkBox_preshowerEnabled->isChecked();
+}
+
+bool WaveformSysController::calorimeterEnabled() const
+{
+  return m_d->ui.checkBox_calorimeterEnabled->isChecked();
+}
+
+bool WaveformSysController::clockEnabled() const
+{
+  return m_d->ui.checkBox_clockEnabled->isChecked();
+}
+
+bool WaveformSysController::testEnabled() const
+{
+  return m_d->ui.checkBox_testEnabled->isChecked();
+}
+
+// bool GuideSysController::showFloor() const
+// {
+//   return m_d->ui.checkBox_floorAndLetters->isChecked() &&
+//     m_d->ui_floorandletters.checkBox_floorenabled->isChecked();
+// }
+
+// //____________________________________________________________________
+// SbColor4f GuideSysController::floorColourAndTransp() const
+// {
+//   return Imp::color4f(m_d->ui_floorandletters.colorButton_floor->color(),m_d->ui_floorandletters.spinBox_floortransp->value());
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::floorExtent() const
+// {
+//   return m_d->ui_floorandletters.doubleSpinBox_floorextent->value()*SYSTEM_OF_UNITS::m;
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::floorSpacing() const
+// {
+//   return m_d->ui_floorandletters.doubleSpinBox_floorspacing->value()*SYSTEM_OF_UNITS::m;
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::floorHeight() const
+// {
+//   return m_d->ui_floorandletters.doubleSpinBox_floorheight->value()*SYSTEM_OF_UNITS::m;
+// }
+
+// //____________________________________________________________________
+// bool GuideSysController::showLetters() const
+// {
+//   return m_d->ui.checkBox_floorAndLetters->isChecked() &&
+//     m_d->ui_floorandletters.checkBox_acdesignations->isChecked();
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::lettersZPos() const
+// {
+
+//   int nmax; double distmax;
+//   if (!VP1Floor::calcParsFromExtentAndSpacing( (VP1HelperClassBase*)this, floorExtent(), floorSpacing(), VP1Floor::nMax(), nmax, distmax )) {
+//     nmax = 10;
+//     distmax = 10*SYSTEM_OF_UNITS::m;
+//     message("lettersZPos  ERROR: Problems calculating floor nmax/distmax.");
+//   }
+//   return distmax*1.1;
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::lettersVerticalPos() const
+// {
+//   return floorHeight()+1.5*SYSTEM_OF_UNITS::m;
+// }
+
+// //____________________________________________________________________
+// bool GuideSysController::showAxes() const
+// {
+//   return m_d->ui.checkBox_coordinateAxes->isChecked();
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::axesLength() const
+// {
+//   return m_d->ui_axes.doubleSpinBox_axes_lengths_m->value()*SYSTEM_OF_UNITS::m *
+//     (m_d->ui_axes.checkBox_axes_shownegativeparts->isChecked()?-1.0:1.0);
+// }
+
+// //____________________________________________________________________
+// SbVec3f GuideSysController::axesPosition() const
+// {
+//   return SbVec3f(m_d->ui_axes.doubleSpinBox_axes_xpos_m->value()*SYSTEM_OF_UNITS::m,
+//          m_d->ui_axes.doubleSpinBox_axes_ypos_m->value()*SYSTEM_OF_UNITS::m,
+//          m_d->ui_axes.doubleSpinBox_axes_zpos_m->value()*SYSTEM_OF_UNITS::m);
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::relAxesThickness() const
+// {
+//   return m_d->ui_axes.doubleSpinBox_axes_relthickness->value();
+// }
+
+// //____________________________________________________________________
+// bool GuideSysController::showCartesianGrid() const
+// {
+//   return m_d->ui.checkBox_grid->isChecked() &&
+//     m_d->ui_grid.radioButton_grid_cartesian->isChecked();
+// }
+
+// //____________________________________________________________________
+// bool GuideSysController::showCylindricalGrid() const
+// {
+//   return m_d->ui.checkBox_grid->isChecked() &&
+//     m_d->ui_grid.radioButton_grid_cylindrical->isChecked();
+// }
+
+// //____________________________________________________________________
+// SbColor4f GuideSysController::gridColourAndTransp() const
+// {
+//   return Imp::color4f(m_d->ui_grid.colorButton_grid->color(),m_d->ui_grid.spinBox_gridtransp->value());
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::gridSpacing() const
+// {
+//   return m_d->ui_grid.doubleSpinBox_gridspacing->value()*SYSTEM_OF_UNITS::m;
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::gridExtent() const
+// {
+//   return m_d->ui_grid.doubleSpinBox_gridextent->value()*SYSTEM_OF_UNITS::m;
+// }
+
+// //____________________________________________________________________
+// bool GuideSysController::showEtaCone1() const
+// {
+//   return m_d->ui.checkBox_etaCones->isChecked() &&
+//     m_d->ui_etacones.checkBox_etacone1->isChecked();
+// }
+
+// //____________________________________________________________________
+// bool GuideSysController::showEtaCone2() const
+// {
+//   return m_d->ui.checkBox_etaCones->isChecked() &&
+//     m_d->ui_etacones.checkBox_etacone2->isChecked();
+// }
+
+// //____________________________________________________________________
+// bool GuideSysController::showEtaCone3() const
+// {
+//   return m_d->ui.checkBox_etaCones->isChecked() &&
+//     m_d->ui_etacones.checkBox_etacone3->isChecked();
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::etaConeValue1() const
+// {
+//   return std::max(1.0e-5,m_d->ui_etacones.doubleSpinBox_etaval1->value());
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::etaConeValue2() const
+// {
+//   return std::max(1.0e-5,m_d->ui_etacones.doubleSpinBox_etaval2->value());
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::etaConeValue3() const
+// {
+//   return std::max(1.0e-5,m_d->ui_etacones.doubleSpinBox_etaval3->value());
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::etaExtent() const
+// {
+//   return m_d->ui_etacones.doubleSpinBox_etaconeextent->value() * SYSTEM_OF_UNITS::m
+//     * (m_d->ui_etacones.radioButton_etaconeextentisr->isChecked() ? 1.0 : -1.0);
+// }
+
+// //____________________________________________________________________
+// bool GuideSysController::showLines() const
+// {
+//   return m_d->ui.checkBox_lines->isChecked();
+// }
+
+
+// //____________________________________________________________________
+// SbVec3f GuideSysController::lineDirection() const
+// {
+//   double r = lineLength();
+//   double phi = m_d->ui_lines.doubleSpinBox_phi->value();
+//   double theta = m_d->ui_lines.doubleSpinBox_theta->value();
+//   SbVec3f direction(r*sin(theta)*cos(phi),r*sin(theta)*sin(phi), r*cos(theta));
+//   return direction;
+// }
+
+// //____________________________________________________________________
+// double GuideSysController::lineLength() const
+// {
+//   return m_d->ui_lines.doubleSpinBox_length->value() * SYSTEM_OF_UNITS::m;
+// }
+
+// //_____________________________________________________________________________________
+// InDetProjFlags::InDetProjPartsFlags GuideSysController::Imp::projPartsFlag( bool barrelinner, bool barrelouter,
+// 									    bool endcapinner, bool endcapouter,
+// 									    bool endcap_hidenormalcyls_when_zasr,
+// 									    bool endcap_zasr )
+// {
+//   InDetProjFlags::InDetProjPartsFlags parts(InDetProjFlags::NoProjections);
+//   //Given the general parts needed, what specific surfaces do we need:
+//   if ( barrelinner )
+//     parts |= InDetProjFlags::BarrelCentral;
+//   if ( barrelouter ) {
+//     parts |= InDetProjFlags::BarrelPositive;
+//     parts |= InDetProjFlags::BarrelNegative;
+//   }
+
+//   if ( !( endcap_zasr && endcap_hidenormalcyls_when_zasr ) ) {
+//     if ( endcapinner ) {
+//       //Inner:
+//       parts |= InDetProjFlags::EndCapInnerPositive;
+//       parts |= InDetProjFlags::EndCapInnerNegative;
+//     }
+//     if ( endcapouter ) {
+//       //Outer:
+//       parts |= InDetProjFlags::EndCapOuterPositive;
+//       parts |= InDetProjFlags::EndCapOuterNegative;
+//     }
+//   }
+//   //Special ZasR surfaces for the endcaps, placed in the barrel positions:
+//   if (endcap_zasr) {
+//     if ( barrelinner )
+//       parts |= InDetProjFlags::TRT_EndCapZToRCentral;
+//     if ( barrelouter ) {
+//       parts |= InDetProjFlags::TRT_EndCapZToRPositive;
+//       parts |= InDetProjFlags::TRT_EndCapZToRNegative;
+//     }
+//   }
+//   return parts;
+// }
+
+// //____________________________________________________________________
+// InDetProjFlags::InDetProjPartsFlags GuideSysController::applicablePixelProjParts() const
+// {
+//   return Imp::projPartsFlag( m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_inner->isChecked() || m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_both->isChecked(),
+// 			     m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_outer->isChecked() || m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_both->isChecked(),
+// 			     m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_inner->isChecked() || m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_both->isChecked(),
+// 			     m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_outer->isChecked() || m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_both->isChecked() );
+// }
+
+// //____________________________________________________________________
+// InDetProjFlags::InDetProjPartsFlags GuideSysController::applicableSCTProjParts() const
+// {
+//   return Imp::projPartsFlag( m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_inner->isChecked() || m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_both->isChecked(),
+// 			     m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_outer->isChecked() || m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_both->isChecked(),
+// 			     m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_inner->isChecked() || m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_both->isChecked(),
+// 			     m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_outer->isChecked() || m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_both->isChecked() );
+// }
+
+// //____________________________________________________________________
+// InDetProjFlags::InDetProjPartsFlags GuideSysController::applicableTRTProjParts() const
+// {
+//   return Imp::projPartsFlag( m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_inner->isChecked() || m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_both->isChecked(),
+// 			     m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_outer->isChecked() || m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_both->isChecked(),
+// 			     m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_inner->isChecked() || m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_both->isChecked(),
+// 			     m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_outer->isChecked() || m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_both->isChecked(),
+// 			     true, m_d->ui_idprojsurfs.checkBox_trtprojsurf_z2r->isChecked() );
+// }
+
+// //_____________________________________________________________________________________
+// InDetProjFlags::DetTypeFlags GuideSysController::Imp::trtPartsEnabledByGUIOrDataUsage() const
+// {
+//   InDetProjFlags::DetTypeFlags  f(InDetProjFlags::NoDet);
+//   if (ui_idprojsurfs.groupBox_trtproj->isChecked()) {
+//     if (ui_idprojsurfs.checkBox_trtprojsurf_parts_asneeded->isChecked()) {
+//       f |= (inDetDetTypesUsingProjections&InDetProjFlags::TRT_all);
+//     } else {
+//       if (ui_idprojsurfs.checkBox_trtprojsurf_parts_barrelA->isChecked()) f |= InDetProjFlags::TRT_brlpos;
+//       if (ui_idprojsurfs.checkBox_trtprojsurf_parts_barrelC->isChecked()) f |= InDetProjFlags::TRT_brlneg;
+//       if (ui_idprojsurfs.checkBox_trtprojsurf_parts_endcapA->isChecked()) f |= InDetProjFlags::TRT_ecpos;
+//       if (ui_idprojsurfs.checkBox_trtprojsurf_parts_endcapC->isChecked()) f |= InDetProjFlags::TRT_ecneg;
+//     }
+//   }
+//   return f;
+// }
+
+// //_____________________________________________________________________________________
+// InDetProjFlags::DetTypeFlags GuideSysController::Imp::sctPartsEnabledByGUIOrDataUsage() const
+// {
+//   InDetProjFlags::DetTypeFlags  f(InDetProjFlags::NoDet);
+//   if (ui_idprojsurfs.groupBox_sctproj->isChecked()) {
+//     if (ui_idprojsurfs.checkBox_sctprojsurf_parts_asneeded->isChecked()) {
+//       f |= (inDetDetTypesUsingProjections&InDetProjFlags::SCT_all);
+//     } else {
+//       if (ui_idprojsurfs.checkBox_sctprojsurf_parts_barrelA->isChecked()) f |= InDetProjFlags::SCT_brlpos;
+//       if (ui_idprojsurfs.checkBox_sctprojsurf_parts_barrelC->isChecked()) f |= InDetProjFlags::SCT_brlneg;
+//       if (ui_idprojsurfs.checkBox_sctprojsurf_parts_endcapA->isChecked()) f |= InDetProjFlags::SCT_ecpos;
+//       if (ui_idprojsurfs.checkBox_sctprojsurf_parts_endcapC->isChecked()) f |= InDetProjFlags::SCT_ecneg;
+//     }
+//   }
+//   return f;
+// }
+
+// //_____________________________________________________________________________________
+// InDetProjFlags::DetTypeFlags GuideSysController::Imp::pixelPartsEnabledByGUIOrDataUsage() const
+// {
+//   InDetProjFlags::DetTypeFlags  f(InDetProjFlags::NoDet);
+//   if (ui_idprojsurfs.groupBox_pixelproj->isChecked()) {
+//     if (ui_idprojsurfs.checkBox_pixelprojsurf_parts_asneeded->isChecked()) {
+//       f |= (inDetDetTypesUsingProjections&InDetProjFlags::Pixel_all);
+//     } else {
+//       if (ui_idprojsurfs.checkBox_pixelprojsurf_parts_barrelA->isChecked()) f |= InDetProjFlags::Pixel_brlpos;
+//       if (ui_idprojsurfs.checkBox_pixelprojsurf_parts_barrelC->isChecked()) f |= InDetProjFlags::Pixel_brlneg;
+//       if (ui_idprojsurfs.checkBox_pixelprojsurf_parts_endcapA->isChecked()) f |= InDetProjFlags::Pixel_ecpos;
+//       if (ui_idprojsurfs.checkBox_pixelprojsurf_parts_endcapC->isChecked()) f |= InDetProjFlags::Pixel_ecneg;
+//     }
+//   }
+//   return f;
+// }
+
+// //____________________________________________________________________
+// InDetProjFlags::InDetProjPartsFlags GuideSysController::shownPixelProjSurfaces() const
+// {
+//   InDetProjFlags::DetTypeFlags enabledDetRegions = m_d->pixelPartsEnabledByGUIOrDataUsage();
+//   if (!(InDetProjFlags::Pixel_all&enabledDetRegions)||!m_d->ui.checkBox_inDetProjSurfs->isChecked())
+//     return InDetProjFlags::NoProjections;
+//   InDetProjFlags::InDetProjPartsFlags pixelProjParts(applicablePixelProjParts());
+//   if (pixelProjParts==InDetProjFlags::NoProjections)
+//     return InDetProjFlags::NoProjections;
+//   InDetProjFlags::InDetProjPartsFlags dummy_sct(InDetProjFlags::NoProjections), dummy_trt(InDetProjFlags::NoProjections);
+//   InDetProjFlags::projectionPartsGivenUsedDetectors( pixelProjParts, dummy_sct, dummy_trt, enabledDetRegions );
+//   return pixelProjParts;
+// }
+
+// //____________________________________________________________________
+// InDetProjFlags::InDetProjPartsFlags GuideSysController::shownSCTProjSurfaces() const
+// {
+//   InDetProjFlags::DetTypeFlags enabledDetRegions = m_d->sctPartsEnabledByGUIOrDataUsage();
+//   if (!(InDetProjFlags::SCT_all&enabledDetRegions)||!m_d->ui.checkBox_inDetProjSurfs->isChecked())
+//     return InDetProjFlags::NoProjections;
+//   InDetProjFlags::InDetProjPartsFlags sctProjParts(applicableSCTProjParts());
+//   if (sctProjParts==InDetProjFlags::NoProjections)
+//     return InDetProjFlags::NoProjections;
+//   InDetProjFlags::InDetProjPartsFlags dummy_pixel(InDetProjFlags::NoProjections), dummy_trt(InDetProjFlags::NoProjections);
+//   InDetProjFlags::projectionPartsGivenUsedDetectors( dummy_pixel, sctProjParts, dummy_trt, enabledDetRegions );
+//   return sctProjParts;
+// }
+
+// //____________________________________________________________________
+// InDetProjFlags::InDetProjPartsFlags GuideSysController::shownTRTProjSurfaces() const
+// {
+//   InDetProjFlags::DetTypeFlags enabledDetRegions = m_d->trtPartsEnabledByGUIOrDataUsage();
+//   if (!(InDetProjFlags::TRT_all&enabledDetRegions)||!m_d->ui.checkBox_inDetProjSurfs->isChecked())
+//     return InDetProjFlags::NoProjections;
+//   InDetProjFlags::InDetProjPartsFlags trtProjParts(applicableTRTProjParts());
+//   if (trtProjParts==InDetProjFlags::NoProjections)
+//     return InDetProjFlags::NoProjections;
+//   InDetProjFlags::InDetProjPartsFlags dummy_pixel(InDetProjFlags::NoProjections), dummy_sct(InDetProjFlags::NoProjections);
+//   InDetProjFlags::projectionPartsGivenUsedDetectors( dummy_pixel, dummy_sct, trtProjParts,enabledDetRegions );
+//   return trtProjParts;
+// }
+
+// //____________________________________________________________________
+// void GuideSysController::setInDetDetTypesUsingProjections(InDetProjFlags::DetTypeFlags f)
+// {
+//   if (m_d->inDetDetTypesUsingProjections==f)
+//     return;
+//   m_d->inDetDetTypesUsingProjections=f;
+//   possibleChange_shownPixelProjSurfaces();
+//   possibleChange_shownSCTProjSurfaces();
+//   possibleChange_shownTRTProjSurfaces();
+// }
+
+// //____________________________________________________________________
+// void GuideSysController::updateProjPartsCheckboxStates_Pixel()
+// {
+//   const bool e(!m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_asneeded->isChecked());
+//   m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_barrelA->setEnabled(e);
+//   m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_barrelC->setEnabled(e);
+//   m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_endcapA->setEnabled(e);
+//   m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_endcapC->setEnabled(e);
+// }
+
+// //____________________________________________________________________
+// void GuideSysController::updateProjPartsCheckboxStates_SCT()
+// {
+//   const bool e(!m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_asneeded->isChecked());
+//   m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_barrelA->setEnabled(e);
+//   m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_barrelC->setEnabled(e);
+//   m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_endcapA->setEnabled(e);
+//   m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_endcapC->setEnabled(e);
+// }
+
+// //____________________________________________________________________
+// void GuideSysController::updateProjPartsCheckboxStates_TRT()
+// {
+//   const bool e(!m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_asneeded->isChecked());
+//   m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_barrelA->setEnabled(e);
+//   m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_barrelC->setEnabled(e);
+//   m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_endcapA->setEnabled(e);
+//   m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_endcapC->setEnabled(e);
+// }
+
+// bool GuideSysController::showTrackingVolumes() const
+// {
+// 	return m_d->ui.checkBox_trkVolumes->isChecked();
+// }
+
+// bool GuideSysController::showInnerDetector() const
+// {
+// 	return m_d->ui_trkvolumes.checkBox_ID->isChecked();
+// }
+
+// bool GuideSysController::showCalorimeters() const
+// {
+// 	return m_d->ui_trkvolumes.checkBox_Calo->isChecked();
+// }
+
+// bool GuideSysController::showMuonSpectrometer() const
+// {
+// 	return m_d->ui_trkvolumes.checkBox_MS->isChecked();
+// }
+
+//____________________________________________________________________
+int WaveformSysController::currentSettingsVersion() const
+{
+  return 0;
+}
+
+//____________________________________________________________________
+void WaveformSysController::actualSaveSettings(VP1Serialise&s) const
+{
+
+  s.save(m_d->ui.checkBox_vetoEnabled);
+  s.save(m_d->ui.checkBox_triggerEnabled);
+  s.save(m_d->ui.checkBox_preshowerEnabled);
+  s.save(m_d->ui.checkBox_calorimeterEnabled);
+  s.save(m_d->ui.checkBox_clockEnabled);
+  s.save(m_d->ui.checkBox_testEnabled);
+
+  //Materials
+  // s.save(m_d->ui_floorandletters.matButton_letters);
+  // s.save(m_d->ui_axes.matButton_axes_x);
+  // s.save(m_d->ui_axes.matButton_axes_y);
+  // s.save(m_d->ui_axes.matButton_axes_z);
+  // s.save(m_d->ui_etacones.matButton_etaCone1);
+  // s.save(m_d->ui_etacones.matButton_etaCone2);
+  // s.save(m_d->ui_etacones.matButton_etaCone3);
+  // s.save(m_d->ui_idprojsurfs.pushButton_projsurfmaterial_pixel);
+  // s.save(m_d->ui_idprojsurfs.pushButton_projsurfmaterial_sct);
+  // s.save(m_d->ui_idprojsurfs.pushButton_projsurfmaterial_trt);
+  
+  // //Everything apart from projection surfaces:
+  // s.save(m_d->ui_grid.colorButton_grid);
+  // s.save(m_d->ui_grid.spinBox_gridtransp);
+  // s.save(m_d->ui_floorandletters.colorButton_floor);
+  // s.save(m_d->ui_floorandletters.spinBox_floortransp);
+  // s.save(m_d->ui_floorandletters.doubleSpinBox_floorheight);
+  // s.save(m_d->ui_floorandletters.checkBox_floorenabled);
+  // s.save(m_d->ui_floorandletters.doubleSpinBox_floorspacing);
+  // s.save(m_d->ui_floorandletters.doubleSpinBox_floorextent);
+  // s.save(m_d->ui_floorandletters.checkBox_acdesignations);
+  // //Version 0 output bool here
+  // s.save(m_d->ui_axes.checkBox_axes_shownegativeparts);
+  // s.save(m_d->ui_axes.doubleSpinBox_axes_lengths_m);
+  // s.save(m_d->ui_axes.doubleSpinBox_axes_relthickness);
+  // s.save(m_d->ui_axes.doubleSpinBox_axes_xpos_m);
+  // s.save(m_d->ui_axes.doubleSpinBox_axes_ypos_m);
+  // s.save(m_d->ui_axes.doubleSpinBox_axes_zpos_m);
+  // s.save(0/*backwards compat*/,m_d->ui_grid.radioButton_grid_cartesian,m_d->ui_grid.radioButton_grid_cylindrical);
+  // s.save(m_d->ui_grid.doubleSpinBox_gridspacing);
+  // s.save(m_d->ui_grid.doubleSpinBox_gridextent);
+  // s.save(m_d->ui_etacones.checkBox_etacone1);
+  // s.save(m_d->ui_etacones.doubleSpinBox_etaval1);
+  // s.save(m_d->ui_etacones.checkBox_etacone2);
+  // s.save(m_d->ui_etacones.doubleSpinBox_etaval2);
+  // s.save(m_d->ui_etacones.checkBox_etacone3);
+  // s.save(m_d->ui_etacones.doubleSpinBox_etaval3);
+  // s.save(m_d->ui_etacones.doubleSpinBox_etaconeextent);
+  // s.save(m_d->ui_etacones.radioButton_etaconeextentisr,m_d->ui_etacones.radioButton_etaconeextentisz);
+
+  // //Projection surfaces:
+
+  // s.save(m_d->ui_idprojsurfs.groupBox_pixelproj);
+  // s.save(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_asneeded);
+  // s.save(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_barrelA);
+  // s.save(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_barrelC);
+  // s.save(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_endcapA);
+  // s.save(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_endcapC);
+  // s.save(m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_inner,
+	// 	 m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_outer,
+	// 	 m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_both);
+  // s.save(m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_inner,
+	// 	 m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_outer,
+	// 	 m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_both);
+  // s.save(m_d->ui_idprojsurfs.groupBox_sctproj);
+  // s.save(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_asneeded);
+  // s.save(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_barrelA);
+  // s.save(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_barrelC);
+  // s.save(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_endcapA);
+  // s.save(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_endcapC);
+  // s.save(m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_inner,
+	// 	 m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_outer,
+	// 	 m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_both);
+  // s.save(m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_inner,
+	// 	 m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_outer,
+	// 	 m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_both);
+  // s.save(m_d->ui_idprojsurfs.groupBox_trtproj);
+  // s.save(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_asneeded);
+  // s.save(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_barrelA);
+  // s.save(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_barrelC);
+  // s.save(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_endcapA);
+  // s.save(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_endcapC);
+  // s.save(m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_inner,
+	// 	 m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_outer,
+	// 	 m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_both);
+  // s.save(m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_inner,
+	// 	 m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_outer,
+	// 	 m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_both);
+  // s.save(m_d->ui_idprojsurfs.checkBox_trtprojsurf_z2r);
+
+  // s.save(m_d->ui.checkBox_coordinateAxes);//version 1+
+  // s.save(m_d->ui.checkBox_etaCones);
+  // s.save(m_d->ui.checkBox_floorAndLetters);//version 1+
+  // s.save(m_d->ui.checkBox_grid);//version 1+
+  // s.save(m_d->ui.checkBox_inDetProjSurfs);//version 1+
+  
+  // //Tracking volumes:
+  // // All version 2+
+  // s.save(m_d->ui.checkBox_trkVolumes);
+
+  // //material
+  // s.save(m_d->ui_trkvolumes.matButton_ID); 
+  // s.save(m_d->ui_trkvolumes.matButton_Calo);
+  // s.save(m_d->ui_trkvolumes.matButton_MS);
+  // s.save(m_d->ui_trkvolumes.checkBox_ID);
+  // s.save(m_d->ui_trkvolumes.checkBox_Calo);
+  // s.save(m_d->ui_trkvolumes.checkBox_MS);
+  
+  // // Line from origin
+  // s.save(m_d->ui.checkBox_lines);
+  // s.save(m_d->ui_lines.doubleSpinBox_phi); 
+  // s.save(m_d->ui_lines.doubleSpinBox_phi);
+  // s.save(m_d->ui_lines.doubleSpinBox_eta);
+  // s.save(m_d->ui_lines.doubleSpinBox_length);
+}
+
+//____________________________________________________________________
+void WaveformSysController::actualRestoreSettings(VP1Deserialise& s)
+{
+  if (s.version() != 0) {
+    message("Warning: State data in .vp1 file has unsupported version ("+str(s.version())+")");
+    return;
+  }
+
+  s.restore(m_d->ui.checkBox_vetoEnabled);
+  s.restore(m_d->ui.checkBox_triggerEnabled);
+  s.restore(m_d->ui.checkBox_preshowerEnabled);
+  s.restore(m_d->ui.checkBox_calorimeterEnabled);
+  s.restore(m_d->ui.checkBox_clockEnabled);
+  s.restore(m_d->ui.checkBox_testEnabled);
+
+  // if (s.version()==0)
+  //   s.ignoreInt();
+
+  // //Materials
+  // s.restore(m_d->ui_floorandletters.matButton_letters);
+  // s.restore(m_d->ui_axes.matButton_axes_x);
+  // s.restore(m_d->ui_axes.matButton_axes_y);
+  // s.restore(m_d->ui_axes.matButton_axes_z);
+  // s.restore(m_d->ui_etacones.matButton_etaCone1);
+  // s.restore(m_d->ui_etacones.matButton_etaCone2);
+  // s.restore(m_d->ui_etacones.matButton_etaCone3);
+  // s.restore(m_d->ui_idprojsurfs.pushButton_projsurfmaterial_pixel);
+  // s.restore(m_d->ui_idprojsurfs.pushButton_projsurfmaterial_sct);
+  // s.restore(m_d->ui_idprojsurfs.pushButton_projsurfmaterial_trt);
+
+  
+  // //Everything apart from projection surfaces:
+  // s.restore(m_d->ui_grid.colorButton_grid);
+  // s.restore(m_d->ui_grid.spinBox_gridtransp);
+  // s.restore(m_d->ui_floorandletters.colorButton_floor);
+  // s.restore(m_d->ui_floorandletters.spinBox_floortransp);
+  // s.restore(m_d->ui_floorandletters.doubleSpinBox_floorheight);
+  // s.restore(m_d->ui_floorandletters.checkBox_floorenabled);
+  // s.restore(m_d->ui_floorandletters.doubleSpinBox_floorspacing);
+  // s.restore(m_d->ui_floorandletters.doubleSpinBox_floorextent);
+  // s.restore(m_d->ui_floorandletters.checkBox_acdesignations);
+  // if (s.version()==0)
+  //   s.ignoreBool();
+  // s.restore(m_d->ui_axes.checkBox_axes_shownegativeparts);
+  // s.restore(m_d->ui_axes.doubleSpinBox_axes_lengths_m);
+  // s.restore(m_d->ui_axes.doubleSpinBox_axes_relthickness);
+  // s.restore(m_d->ui_axes.doubleSpinBox_axes_xpos_m);
+  // s.restore(m_d->ui_axes.doubleSpinBox_axes_ypos_m);
+  // s.restore(m_d->ui_axes.doubleSpinBox_axes_zpos_m);
+  // s.restore(0/*backwards compat*/,m_d->ui_grid.radioButton_grid_cartesian,m_d->ui_grid.radioButton_grid_cylindrical);
+  // s.restore(m_d->ui_grid.doubleSpinBox_gridspacing);
+  // s.restore(m_d->ui_grid.doubleSpinBox_gridextent);
+  // s.restore(m_d->ui_etacones.checkBox_etacone1);
+  // s.restore(m_d->ui_etacones.doubleSpinBox_etaval1);
+  // s.restore(m_d->ui_etacones.checkBox_etacone2);
+  // s.restore(m_d->ui_etacones.doubleSpinBox_etaval2);
+  // s.restore(m_d->ui_etacones.checkBox_etacone3);
+  // s.restore(m_d->ui_etacones.doubleSpinBox_etaval3);
+  // s.restore(m_d->ui_etacones.doubleSpinBox_etaconeextent);
+  // s.restore(m_d->ui_etacones.radioButton_etaconeextentisr,m_d->ui_etacones.radioButton_etaconeextentisz);
+
+  // //Projection surfaces:
+
+  // s.restore(m_d->ui_idprojsurfs.groupBox_pixelproj);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_asneeded);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_barrelA);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_barrelC);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_endcapA);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_pixelprojsurf_parts_endcapC);
+  // s.restore(m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_inner,
+	// 	m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_outer,
+	// 	m_d->ui_idprojsurfs.radioButton_pixelprojsurf_barrel_both);
+  // s.restore(m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_inner,
+	// 	m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_outer,
+	// 	m_d->ui_idprojsurfs.radioButton_pixelprojsurf_endcap_both);
+  // s.restore(m_d->ui_idprojsurfs.groupBox_sctproj);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_asneeded);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_barrelA);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_barrelC);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_endcapA);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_sctprojsurf_parts_endcapC);
+  // s.restore(m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_inner,
+	// 	m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_outer,
+	// 	m_d->ui_idprojsurfs.radioButton_sctprojsurf_barrel_both);
+  // s.restore(m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_inner,
+	// 	m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_outer,
+	// 	m_d->ui_idprojsurfs.radioButton_sctprojsurf_endcap_both);
+  // s.restore(m_d->ui_idprojsurfs.groupBox_trtproj);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_asneeded);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_barrelA);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_barrelC);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_endcapA);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_trtprojsurf_parts_endcapC);
+  // s.restore(m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_inner,
+	// 	m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_outer,
+	// 	m_d->ui_idprojsurfs.radioButton_trtprojsurf_barrel_both);
+  // s.restore(m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_inner,
+	// 	m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_outer,
+	// 	m_d->ui_idprojsurfs.radioButton_trtprojsurf_endcap_both);
+  // s.restore(m_d->ui_idprojsurfs.checkBox_trtprojsurf_z2r);
+  
+  // if (s.version()>=1) {
+  //   s.restore(m_d->ui.checkBox_coordinateAxes);
+  //   s.restore(m_d->ui.checkBox_etaCones);
+  //   s.restore(m_d->ui.checkBox_floorAndLetters);
+  //   s.restore(m_d->ui.checkBox_grid);
+  //   s.restore(m_d->ui.checkBox_inDetProjSurfs);
+  // }
+  
+  // if (s.version()>=2) {
+  //   s.restore(m_d->ui.checkBox_trkVolumes);
+  //   s.restore(m_d->ui_trkvolumes.matButton_ID); 
+  //   s.restore(m_d->ui_trkvolumes.matButton_Calo);
+  //   s.restore(m_d->ui_trkvolumes.matButton_MS);  
+  //   s.restore(m_d->ui_trkvolumes.checkBox_ID);
+  //   s.restore(m_d->ui_trkvolumes.checkBox_Calo);
+  //   s.restore(m_d->ui_trkvolumes.checkBox_MS);
+  // } 
+  // if (s.version()>=3) {
+  //   s.restore(m_d->ui.checkBox_lines);
+  //   s.restore(m_d->ui_lines.doubleSpinBox_phi); 
+  //   s.restore(m_d->ui_lines.doubleSpinBox_phi);
+  //   s.restore(m_d->ui_lines.doubleSpinBox_eta);
+  //   s.restore(m_d->ui_lines.doubleSpinBox_length);
+  // } 
+}
+
+// void GuideSysController::possibleChange_lineDirection() {	
+//   // Bit of a hack possibly to do this here, but I want to be able to update the direction by changing either theta or eta
+//   double eta = m_d->ui_lines.doubleSpinBox_eta->value();
+//   double theta = m_d->ui_lines.doubleSpinBox_theta->value();
+  
+//   if (m_d->last_line_eta != eta){
+//     // eta has changed, so update theta in the UI
+//     theta = 2*std::atan(std::exp(-1.0 * eta));
+//     m_d->ui_lines.doubleSpinBox_theta->setValue(theta);
+//   } else if ( theta!= std::acos(m_d->last_lineDirection[2] / lineLength() ) ){
+//     eta = -1.0 * std::log(std::tan(theta/2.0));
+//     m_d->ui_lines.doubleSpinBox_eta->setValue(eta);  
+//   }
+//   m_d->last_line_eta = m_d->ui_lines.doubleSpinBox_eta->value();
+//   if (changed( m_d->last_lineDirection , lineDirection() ) ) { 
+//     if (verbose()&&!initVarsMode()) messageVerbose("Emitting "+QString()+"( lineDirectionChanged"+toString(m_d->last_lineDirection)+" )"); 
+//     emit lineDirectionChanged(m_d->last_lineDirection); 
+//   }  
+// }
+
+
+///////////////////////////////////////////////////////////////////////////
+// Test for possible changes in values and emit signals as appropriate:
+// (possibleChange_XXX() slots code provided by macros)
+#define VP1CONTROLLERCLASSNAME WaveformSysController
+#include "VP1Base/VP1ControllerMacros.h"
+POSSIBLECHANGE_IMP(vetoEnabled)
+POSSIBLECHANGE_IMP(triggerEnabled)
+POSSIBLECHANGE_IMP(preshowerEnabled)
+POSSIBLECHANGE_IMP(calorimeterEnabled)
+POSSIBLECHANGE_IMP(clockEnabled)
+POSSIBLECHANGE_IMP(testEnabled)
+
+// POSSIBLECHANGE_IMP(showFloor)
+// POSSIBLECHANGE_IMP(floorColourAndTransp)
+// POSSIBLECHANGE_IMP(floorExtent)
+// POSSIBLECHANGE_IMP(floorSpacing)
+// POSSIBLECHANGE_IMP(floorHeight)
+// POSSIBLECHANGE_IMP(showLetters)
+// POSSIBLECHANGE_IMP(lettersZPos)
+// POSSIBLECHANGE_IMP(lettersVerticalPos)
+// POSSIBLECHANGE_IMP(showAxes)
+// POSSIBLECHANGE_IMP(axesLength)
+// POSSIBLECHANGE_IMP(axesPosition)
+// POSSIBLECHANGE_IMP(relAxesThickness)
+// POSSIBLECHANGE_IMP(showCartesianGrid)
+// POSSIBLECHANGE_IMP(showCylindricalGrid)
+// POSSIBLECHANGE_IMP(gridColourAndTransp)
+// POSSIBLECHANGE_IMP(gridSpacing)
+// POSSIBLECHANGE_IMP(gridExtent)
+// POSSIBLECHANGE_IMP(showEtaCone1)
+// POSSIBLECHANGE_IMP(showEtaCone2)
+// POSSIBLECHANGE_IMP(showEtaCone3)
+// POSSIBLECHANGE_IMP(etaConeValue1)
+// POSSIBLECHANGE_IMP(etaConeValue2)
+// POSSIBLECHANGE_IMP(etaConeValue3)
+// POSSIBLECHANGE_IMP(etaExtent)
+// POSSIBLECHANGE_IMP(applicablePixelProjParts)
+// POSSIBLECHANGE_IMP(applicableSCTProjParts)
+// POSSIBLECHANGE_IMP(applicableTRTProjParts)
+// POSSIBLECHANGE_IMP(shownPixelProjSurfaces)
+// POSSIBLECHANGE_IMP(shownSCTProjSurfaces)
+// POSSIBLECHANGE_IMP(shownTRTProjSurfaces)
+// POSSIBLECHANGE_IMP(showTrackingVolumes)
+// POSSIBLECHANGE_IMP(showInnerDetector)
+// POSSIBLECHANGE_IMP(showCalorimeters)
+// POSSIBLECHANGE_IMP(showMuonSpectrometer)
+// POSSIBLECHANGE_IMP(showLines)  
+//POSSIBLECHANGE_IMP(lineDirection) Implemented this manually so we can update eta/theta
diff --git a/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/src/waveformcontrollerform.ui b/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/src/waveformcontrollerform.ui
new file mode 100644
index 0000000000000000000000000000000000000000..75fddd8e6b0f311a5ab39a0ca5163152c385f712
--- /dev/null
+++ b/graphics/VTI12/VTI12Systems/VTI12WaveformSystems/src/waveformcontrollerform.ui
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>VP1WaveformControllerForm</class>
+ <widget class="QWidget" name="VP1WaveformControllerForm">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>267</width>
+    <height>182</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QGridLayout">
+   <property name="rightMargin">
+    <number>1</number>
+   </property>
+   <property name="bottomMargin">
+    <number>1</number>
+   </property>
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <item row="0" column="0">
+    <layout class="QGridLayout">
+     <property name="horizontalSpacing">
+      <number>2</number>
+     </property>
+     <property name="verticalSpacing">
+      <number>0</number>
+     </property>
+     <item row="0" column="0">
+      <widget class="QCheckBox" name="checkBox_vetoEnabled">
+       <property name="text">
+        <string>Veto</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0">
+      <widget class="QCheckBox" name="checkBox_triggerEnabled">
+       <property name="text">
+        <string>Trigger</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="0">
+      <widget class="QCheckBox" name="checkBox_preshowerEnabled">
+       <property name="text">
+        <string>Preshower</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="3" column="0">
+      <widget class="QCheckBox" name="checkBox_calorimeterEnabled">
+       <property name="text">
+        <string>Calorimeter</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="0">
+      <widget class="QCheckBox" name="checkBox_clockEnabled">
+       <property name="text">
+        <string>Clock</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="5" column="0">
+      <widget class="QCheckBox" name="checkBox_testEnabled">
+       <property name="text">
+        <string>Test</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <!--
+     <item row="0" column="1">
+      <widget class="QPushButton" name="pushButton_settings_floorAndLetters">
+       <property name="text">
+        <string>Configure</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0">
+      <widget class="QCheckBox" name="checkBox_coordinateAxes">
+       <property name="text">
+        <string>Coordinate axes</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="1">
+      <widget class="QPushButton" name="pushButton_settings_coordinateAxes">
+       <property name="text">
+        <string>Configure</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="0">
+      <widget class="QCheckBox" name="checkBox_grid">
+       <property name="text">
+        <string>Grid</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="1">
+      <widget class="QPushButton" name="pushButton_settings_grid">
+       <property name="text">
+        <string>Configure</string>
+       </property>
+      </widget>
+     </item>
+     <item row="3" column="0">
+      <widget class="QCheckBox" name="checkBox_etaCones">
+       <property name="text">
+        <string>Eta Cones</string>
+       </property>
+      </widget>
+     </item>
+     <item row="3" column="1">
+      <widget class="QPushButton" name="pushButton_settings_etaCones">
+       <property name="text">
+        <string>Configure</string>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="0">
+      <widget class="QCheckBox" name="checkBox_inDetProjSurfs">
+       <property name="text">
+        <string>ID projection surfaces</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="1">
+      <widget class="QPushButton" name="pushButton_settings_inDetProjSurfs">
+       <property name="text">
+        <string>Configure</string>
+       </property>
+      </widget>
+     </item>
+     <item row="5" column="1">
+      <widget class="QPushButton" name="pushButton_settings_trkVolumes">
+       <property name="text">
+        <string>Configure</string>
+       </property>
+      </widget>
+     </item>
+     <item row="5" column="0">
+      <widget class="QCheckBox" name="checkBox_trkVolumes">
+       <property name="text">
+        <string>Tracking Volumes</string>
+       </property>
+       <property name="checked">
+        <bool>false</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="7" column="0">
+      <widget class="QCheckBox" name="checkBox_lines">
+       <property name="text">
+        <string>Line from origin</string>
+       </property>
+       <property name="checked">
+        <bool>false</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="7" column="1">
+      <widget class="QPushButton" name="pushButton_settings_lines">
+       <property name="text">
+        <string>Configure</string>
+       </property>
+      </widget>
+     </item>
+     -->
+    </layout>
+   </item>
+   <item row="0" column="1">
+    <spacer>
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>1</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="1" column="0">
+    <spacer>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>1</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>