diff --git a/GeoModelVisualization/CMakeLists.txt b/GeoModelVisualization/CMakeLists.txt
index e6bd991911363be34b2b803e562a5f2e309b143f..6ba88d17672db6eec6601833693492f8018e0839 100644
--- a/GeoModelVisualization/CMakeLists.txt
+++ b/GeoModelVisualization/CMakeLists.txt
@@ -67,6 +67,7 @@ add_subdirectory(VP1Base)
 add_subdirectory(VP1HEPVis)
 add_subdirectory(VP1GuideLineSystems)
 add_subdirectory(GXHitDisplaySystems)
+add_subdirectory(GXTrackDisplaySystems)
 
 # Create and install the version description of the project.
 include( WriteBasicConfigVersionFile )
diff --git a/GeoModelVisualization/GXTrackDisplaySystems/.DS_Store b/GeoModelVisualization/GXTrackDisplaySystems/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..1d1227246812d83e733cc2dc14c54663b883c7d8
Binary files /dev/null and b/GeoModelVisualization/GXTrackDisplaySystems/.DS_Store differ
diff --git a/GeoModelVisualization/GXTrackDisplaySystems/CMakeLists.txt b/GeoModelVisualization/GXTrackDisplaySystems/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..475be0827a58bae7633a2681c79b5c20aba6b463
--- /dev/null
+++ b/GeoModelVisualization/GXTrackDisplaySystems/CMakeLists.txt
@@ -0,0 +1,39 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+# Find the header and source files.
+file( GLOB SOURCES src/*.cxx )
+file( GLOB HEADERS GXTrackDisplaySystems/*.h )
+file( GLOB UIS src/*.ui )
+
+# Add the library.
+add_library( GXTrackDisplaySystems SHARED ${SOURCES} ${HEADERS} ${UIS} )
+target_link_libraries( GXTrackDisplaySystems
+   PUBLIC Coin::Coin GXBase 
+   PRIVATE Qt5::Core Qt5::Widgets ${HDF5_LIBRARIES} )
+target_include_directories( GXTrackDisplaySystems PUBLIC
+   ${HDF5_CXX_INCLUDE_DIRS} 
+   $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+   $<INSTALL_INTERFACE:include> )
+source_group( "GXTrackDisplaySystems" FILES ${HEADERS} )
+source_group( "src" FILES ${SOURCES} ${UIS} ${RCS} )
+set_target_properties( GXTrackDisplaySystems PROPERTIES
+   VERSION ${PROJECT_VERSION}
+   SOVERSION ${PROJECT_VERSION_MAJOR} )
+if( GEOMODEL_USE_BUILTIN_COIN3D )
+   add_dependencies( GXTrackDisplaySystems Coin3DBuiltIn )
+endif()
+
+# Set up an alias with the same name that you would get by "finding" a pre-built
+# version of the library.
+add_library( GeoModelVisualization::GXTrackDisplaySystems ALIAS
+   GXTrackDisplaySystems )
+
+# Install the library.
+install( TARGETS GXTrackDisplaySystems
+   EXPORT ${PROJECT_NAME}-export
+   LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+   COMPONENT Runtime
+   NAMELINK_COMPONENT Development )
+install( FILES ${HEADERS}
+   DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GXClashPointSystems
+   COMPONENT Development )
diff --git a/GeoModelVisualization/GXTrackDisplaySystems/GXTrackDisplaySystems/GXTrackDisplaySystem.h b/GeoModelVisualization/GXTrackDisplaySystems/GXTrackDisplaySystems/GXTrackDisplaySystem.h
new file mode 100644
index 0000000000000000000000000000000000000000..49e728a0099b23f5da6f9bc44e47800dc3142cdb
--- /dev/null
+++ b/GeoModelVisualization/GXTrackDisplaySystems/GXTrackDisplaySystems/GXTrackDisplaySystem.h
@@ -0,0 +1,57 @@
+/*
+  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GXTRACKDISPLAYSYSTEM_H
+#define GXTRACKDISPLAYSYSTEM_H
+
+/////////////////////////////////////////////////////////////////////////
+//                                                                     //
+//  Header file for class GXTrackDisplaySystem                         //
+//                                                                     //
+//  Based on GXHitDisplaySystem                                        //
+//                                                                     //
+/////////////////////////////////////////////////////////////////////////
+
+#include "VP1Base/IVP13DSystemSimple.h"
+
+class GXTrackDisplaySystem : public IVP13DSystemSimple {
+
+  Q_OBJECT
+
+public:
+
+  ///////////////////
+  //  Constructor  //
+  ///////////////////
+
+  GXTrackDisplaySystem();
+
+  //////////////////////////////////////////
+  //  Reimplementations from base class:  //
+  //////////////////////////////////////////
+
+  virtual ~GXTrackDisplaySystem();
+  void buildPermanentSceneGraph(StoreGateSvc* detstore, SoSeparator *root);
+  void buildEventSceneGraph(StoreGateSvc*, SoSeparator *);
+  void systemuncreate();
+  QWidget * buildController();
+  QByteArray saveState();
+  void restoreFromState(QByteArray ba);
+
+public slots:
+
+  void selectInputFile();
+  void showTrackDisplay1(bool);
+  void setLineWidth(int);
+  void nextEvent();
+  
+signals:
+  void updateTransparencyType(unsigned type);
+  
+public:
+  class Imp;
+  Imp * m_d;
+};
+
+#endif
diff --git a/GeoModelVisualization/GXTrackDisplaySystems/GXTrackDisplaySystems/TrackDisplaySysController.h b/GeoModelVisualization/GXTrackDisplaySystems/GXTrackDisplaySystems/TrackDisplaySysController.h
new file mode 100644
index 0000000000000000000000000000000000000000..6ebc4ede990442fcc32e8f3bed8f117d73fa5d67
--- /dev/null
+++ b/GeoModelVisualization/GXTrackDisplaySystems/GXTrackDisplaySystems/TrackDisplaySysController.h
@@ -0,0 +1,58 @@
+/*
+  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+
+////////////////////////////////////////////////////////////////
+//                                                            //
+//  Implementation of class TrackDisplaySysController         //
+//                                                            //
+//  Based on class HitDisplaySysController                    //
+//                                                            //
+////////////////////////////////////////////////////////////////
+
+
+#ifndef TRACKDISPLAYSYSCONTROLLER_H
+#define TRACKDISPLAYSYSCONTROLLER_H
+
+#include "VP1Base/VP1Controller.h"
+#include <Inventor/C/errors/debugerror.h>
+
+class TrackDisplaySysController : public VP1Controller {
+
+  Q_OBJECT
+
+public:
+
+  TrackDisplaySysController(IVP1System * sys);
+  virtual ~TrackDisplaySysController();
+
+  void actualRestoreSettings(VP1Deserialise&);
+  int currentSettingsVersion() const;
+  void actualSaveSettings(VP1Serialise&) const;
+
+  //TrackDisplays:
+  bool showTrackDisplays1() const;
+  int  setLineWidth() const;
+  
+signals:
+  
+  void showTrackDisplays1Changed(bool);
+  void setLineWidthChanged(int);
+  void inputFileChanged();
+  void nextEvent();
+  
+private:
+
+  class Imp;
+  Imp * m_d;
+
+private slots:
+  void possibleChange_showTrackDisplays1();
+  void possibleChange_setLineWidth();
+  
+};
+
+
+#endif
diff --git a/GeoModelVisualization/GXTrackDisplaySystems/src/GXTrackDisplaySystem.cxx b/GeoModelVisualization/GXTrackDisplaySystems/src/GXTrackDisplaySystem.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..22c0a75e5f2d3c6c2f4ced610f233b579472fdb6
--- /dev/null
+++ b/GeoModelVisualization/GXTrackDisplaySystems/src/GXTrackDisplaySystem.cxx
@@ -0,0 +1,343 @@
+/*
+  Copyright (C) 2002-2012 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+/////////////////////////////////////////////////////////////////////////
+//                                                                     //
+//  Implementation of class GXTrackDisplaySystem                       //
+//                                                                     //
+//  Based on implementation of class GXHitDisplaySystem                //
+//                                                                     //
+/////////////////////////////////////////////////////////////////////////
+
+#include "GXTrackDisplaySystems/GXTrackDisplaySystem.h"
+#include "GXTrackDisplaySystems/TrackDisplaySysController.h"
+#include "H5Cpp.h"
+#include "VP1Base/VP1Serialise.h"
+#include "VP1Base/VP1Deserialise.h"
+#include "VP1Base/VP1Msg.h"
+
+#include <Inventor/nodes/SoSeparator.h>
+#include <Inventor/nodes/SoSwitch.h>
+#include <Inventor/nodes/SoPointSet.h>
+#include <Inventor/nodes/SoLineSet.h>
+#include <Inventor/nodes/SoCoordinate3.h>
+#include <Inventor/nodes/SoDrawStyle.h>
+#include <Inventor/nodes/SoLightModel.h>
+#include <Inventor/nodes/SoPickStyle.h>
+#include <Inventor/nodes/SoBaseColor.h>
+
+#include <QFileDialog>
+#include <QMessageBox>
+#include <map>
+#include <iostream>
+#include <fstream>
+#include <unistd.h>
+
+using namespace H5;
+using namespace std;
+
+struct stepData
+{
+  float x;
+  float y;
+  float z;
+};
+
+class GXTrackDisplaySystem::Imp
+{
+public:
+  Imp(GXTrackDisplaySystem *tc) : theclass(tc) {}
+
+  GXTrackDisplaySystem *theclass{nullptr};
+  TrackDisplaySysController *controller{nullptr};
+  SoSwitch *switch0{nullptr};
+  SoDrawStyle *drawStyle{nullptr};
+  SoCoordinate3 *coords{nullptr};
+  SoPointSet *pointSet{nullptr};
+  SoLineSet *lineSet{nullptr};
+
+  vector<int> trackNums;
+
+  CompType datatype{sizeof(stepData)};
+  H5File *file{nullptr};
+
+  vector<int> pdgs;
+  vector<vector<stepData>> trksStepsVec;
+
+  vector<SoSeparator*> tracksSoSwitches;
+
+  void readEventTracks(int);
+};
+
+void GXTrackDisplaySystem::Imp::readEventTracks(int eventNum)
+{
+  pdgs.clear();
+  trksStepsVec.clear();
+
+  std::string pdgDataSetName = "event" + std::to_string(eventNum) + "PDGs";
+
+  DataSet *pdgDataSet = new DataSet(file->openDataSet(pdgDataSetName));
+  size_t buffSize = pdgDataSet->getStorageSize() / sizeof(int);
+  pdgs.resize(buffSize);
+  pdgDataSet->read(pdgs.data(), PredType::NATIVE_INT);
+
+  trksStepsVec.resize(buffSize);
+
+  for (int trkNum = 0; trkNum < trackNums[eventNum]; ++trkNum)
+  {
+    vector<stepData> &steps = trksStepsVec[trkNum];
+
+    std::string dataSetName = "event" + std::to_string(eventNum) +
+                              "-trk" + std::to_string(trkNum+1);
+
+    DataSet *datasetE1T1 = new DataSet(file->openDataSet(dataSetName));
+    /*size_t*/ buffSize = datasetE1T1->getStorageSize() / sizeof(stepData);
+    steps.resize(buffSize);
+    datasetE1T1->read(steps.data(),  datatype);
+
+    delete datasetE1T1;
+  }
+
+  delete pdgDataSet;
+
+}
+
+//_____________________________________________________________________________________
+GXTrackDisplaySystem::GXTrackDisplaySystem()
+    : IVP13DSystemSimple("Track Display",
+                         "System providing visualizaton of tracks",
+                         "denys.klekots@cern.ch, denys.klekots@gmail.com"),
+      m_d(new Imp(this))
+{
+  m_d->datatype.insertMember("x", HOFFSET(stepData, x), PredType::NATIVE_FLOAT);
+  m_d->datatype.insertMember("y", HOFFSET(stepData, y), PredType::NATIVE_FLOAT);
+  m_d->datatype.insertMember("z", HOFFSET(stepData, z), PredType::NATIVE_FLOAT);
+}
+
+//_____________________________________________________________________________________
+GXTrackDisplaySystem::~GXTrackDisplaySystem()
+{
+  delete m_d->file;
+  delete m_d;
+}
+
+//_____________________________________________________________________________________
+QWidget *GXTrackDisplaySystem::buildController()
+{
+  m_d->controller = new TrackDisplaySysController(this);
+  connect(m_d->controller,
+          SIGNAL(inputFileChanged()),
+          this,
+          SLOT(selectInputFile()));
+
+  return m_d->controller;
+}
+
+//_____________________________________________________________________________________
+void GXTrackDisplaySystem::buildEventSceneGraph(StoreGateSvc *, SoSeparator *)
+{
+}
+
+//_____________________________________________________________________________________
+void GXTrackDisplaySystem::buildPermanentSceneGraph(StoreGateSvc * /*detstore*/, SoSeparator *root)
+{
+  // No guidelines are pickable:
+  SoPickStyle *pickStyle = new SoPickStyle;
+  pickStyle->style = SoPickStyle::UNPICKABLE;
+  root->addChild(pickStyle);
+
+  m_d->drawStyle = new SoDrawStyle;
+
+  m_d->drawStyle->lineWidth.setValue(3);
+  root->addChild(m_d->drawStyle);
+
+  SoSeparator *s0 = new SoSeparator;
+
+  root->addChild(s0);
+
+  m_d->switch0 = new SoSwitch;
+
+  m_d->switch0->whichChild = SO_SWITCH_ALL;
+
+  s0->addChild(m_d->switch0);
+
+  connect(m_d->controller, SIGNAL(showTrackDisplays1Changed(bool)), this, SLOT(showTrackDisplay1(bool)));
+  connect(m_d->controller, SIGNAL(setLineWidthChanged(int)), this, SLOT(setLineWidth(int)));
+  connect(m_d->controller, SIGNAL(nextEvent()), this, SLOT(nextEvent()));
+}
+
+//_____________________________________________________________________________________
+void GXTrackDisplaySystem::systemuncreate()
+{
+
+  m_d->controller = 0;
+}
+
+//_____________________________________________________________________________________
+QByteArray GXTrackDisplaySystem::saveState()
+{
+
+  ensureBuildController();
+
+  VP1Serialise serialise(1 /*version*/, this);
+  serialise.save(IVP13DSystemSimple::saveState());
+  serialise.save(m_d->controller->saveSettings());
+  serialise.disableUnsavedChecks(); // We do the testing in the controller
+  return serialise.result();
+}
+
+//_____________________________________________________________________________________
+void GXTrackDisplaySystem::restoreFromState(QByteArray ba)
+{
+
+  VP1Deserialise state(ba, this);
+  ensureBuildController();
+
+  IVP13DSystemSimple::restoreFromState(state.restoreByteArray());
+  m_d->controller->restoreSettings(state.restoreByteArray());
+  state.disableUnrestoredChecks(); // We do the testing in the controller
+}
+
+void GXTrackDisplaySystem::selectInputFile()
+{
+
+  QString path;
+  char buffer[1024];
+  char *wd = getcwd(buffer, 1024);
+  path = QFileDialog::getOpenFileName(nullptr, tr("Open Input File"), wd,
+                            tr("Hit input files (*.h5)"), 0, QFileDialog::DontUseNativeDialog);
+
+  if (path != "")
+  {
+    m_d->switch0->removeAllChildren();
+
+    delete m_d->file;
+    m_d->file = new H5File(path.toStdString(), H5F_ACC_RDONLY);
+
+    DataSet *eventNumsDataset = new DataSet(m_d->file->openDataSet("eventNums"));
+    size_t buffSize = eventNumsDataset->getStorageSize() / sizeof(int);
+    m_d->trackNums.resize(buffSize);
+    eventNumsDataset->read(m_d->trackNums.data(), PredType::NATIVE_INT);
+
+    nextEvent();
+
+    delete eventNumsDataset;
+  }
+}
+
+void GXTrackDisplaySystem::setLineWidth(int size)
+{
+  m_d->drawStyle->lineWidth.setValue(size);
+}
+
+void GXTrackDisplaySystem::showTrackDisplay1(bool flag)
+{
+  m_d->switch0->whichChild = flag ? SO_SWITCH_ALL : SO_SWITCH_NONE;
+}
+
+SoBaseColor* getColor(int pdg)
+{
+  SoBaseColor *returnColor = new SoBaseColor;
+
+  switch (pdg)
+  {
+  case 2212: // proton
+    returnColor->rgb.setValue(1,0,0); //red
+    break;
+  case 2112: // neutron
+    returnColor->rgb.setValue(0.75,0.75,0.75); //gray
+    break;
+  case 11: // electron
+    returnColor->rgb.setValue(1,1,0); //blue
+    break;
+  case -11: // positron
+    returnColor->rgb.setValue(0.54,0.17,1); //violet
+    break;
+  case 22: // gamma
+    returnColor->rgb.setValue(0,1,0); //green
+    break;
+  case -22: // optical photon
+    returnColor->rgb.setValue(0,1,0); //green
+    break;
+  case 211: // charget pions
+    returnColor->rgb.setValue(1,0,1); //magenta
+    break;
+  case -211: // charget pions
+    returnColor->rgb.setValue(1,0,1); //magenta
+    break;
+  case 111: // neutral pions
+    returnColor->rgb.setValue(1,0,1); //magenta
+    break;
+  case 13: // muon
+    returnColor->rgb.setValue(1,1,0); //yellow
+    break;
+  case -13: // muon
+    returnColor->rgb.setValue(1,1,0); //yellow
+    break;
+  case 321: // kaon+
+    returnColor->rgb.setValue(0,1,1); //cyan
+    break;
+  case -321: // kaon+
+    returnColor->rgb.setValue(0,1,1); //cyan
+    break;
+  default:
+    returnColor->rgb.setValue(0,0,0); //black
+  }
+
+  return returnColor;
+}
+
+void GXTrackDisplaySystem::nextEvent()
+{
+
+  for(SoSeparator* el: m_d->tracksSoSwitches)
+  {
+    // el->removeAllChildren();
+    m_d->switch0->removeChild(el);
+  }
+
+  static hsize_t count = 0;
+  if (count == m_d->trackNums.size())
+  {
+    QMessageBox msgBox;
+    msgBox.setText("Last event reached.  Reset stream to beginning.");
+    msgBox.exec();
+    count = 0;
+  }
+  m_d->readEventTracks(count++);
+
+
+  m_d->tracksSoSwitches.resize(m_d->trksStepsVec.size());
+
+  for (int trkNum = 0; trkNum < m_d->trksStepsVec.size(); ++trkNum)
+  {
+    SoCoordinate3 *tmpCoords = new SoCoordinate3;
+    SoPointSet *tmpPointSet = new SoPointSet;
+    SoLineSet *lineSet = new SoLineSet;
+
+    m_d->tracksSoSwitches[trkNum] = new SoSeparator;
+
+    m_d->tracksSoSwitches[trkNum]->addChild(tmpCoords);
+    m_d->tracksSoSwitches[trkNum]->addChild(tmpPointSet);
+    m_d->tracksSoSwitches[trkNum]->addChild(lineSet);
+
+    m_d->switch0->addChild(getColor(m_d->pdgs[trkNum]));
+
+    for(int stepNum = 0; stepNum < m_d->trksStepsVec[trkNum].size(); ++stepNum)
+    {
+      float &x = m_d->trksStepsVec[trkNum][stepNum].x;
+      float &y = m_d->trksStepsVec[trkNum][stepNum].y;
+      float &z = m_d->trksStepsVec[trkNum][stepNum].z;
+
+      tmpCoords->point.set1Value(stepNum, x, y, z);
+    }
+
+    tmpPointSet->numPoints = m_d->trksStepsVec[trkNum].size();
+    lineSet->numVertices = m_d->trksStepsVec[trkNum].size();
+
+    m_d->switch0->addChild(m_d->tracksSoSwitches[trkNum]);
+  }
+
+}
\ No newline at end of file
diff --git a/GeoModelVisualization/GXTrackDisplaySystems/src/TrackDisplaySysController.cxx b/GeoModelVisualization/GXTrackDisplaySystems/src/TrackDisplaySysController.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..9418c8bf7d00d75d3d89b73ce215a7e448804f5b
--- /dev/null
+++ b/GeoModelVisualization/GXTrackDisplaySystems/src/TrackDisplaySysController.cxx
@@ -0,0 +1,111 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+////////////////////////////////////////////////////////////////
+//                                                            //
+//  Implementation of class HitDisplaySysController           //
+//                                                            //
+//  Author:  Joseph F. Boudreau (boudreau@pitt.edu)           //
+//  Initial version: March 2020                               //
+//                                                            //
+////////////////////////////////////////////////////////////////
+
+#define VP1IMPVARNAME m_d
+
+#include "GXTrackDisplaySystems/TrackDisplaySysController.h"
+#include "ui_trackdisplaycontrollerform.h"
+#include "VP1Base/VP1Serialise.h"
+#include "VP1Base/VP1Deserialise.h"
+#include <cmath>
+
+//____________________________________________________________________
+class TrackDisplaySysController::Imp {
+public:
+  TrackDisplaySysController * theclass;
+  Ui::GXTrackDisplayControllerForm ui;
+
+  bool last_showTrackDisplays1;
+  int  last_setLineWidth;  
+};
+#include <iostream>
+//____________________________________________________________________
+TrackDisplaySysController::TrackDisplaySysController(IVP1System * sys)
+  : VP1Controller(sys,"TrackDisplaySysController"), m_d(new Imp)
+{
+
+  m_d->theclass = this;
+  m_d->ui.setupUi(this);
+
+
+	
+  /////////////////////////////////////////////////////////////////////////////////////////////////////////////
+  //  Setup connections which monitor changes in the controller so that we may emit signals as appropriate:  //
+  /////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+  addUpdateSlot(SLOT(possibleChange_showTrackDisplays1()));
+  connectToLastUpdateSlot(m_d->ui.trackDisplayCheckBox);
+
+  addUpdateSlot(SLOT(possibleChange_setLineWidth()));
+  connectToLastUpdateSlot(m_d->ui.lineWidthSpinBox);
+  
+  connect(m_d->ui.pushButton_selectInput, SIGNAL(clicked()),
+	  this, SIGNAL(inputFileChanged()));
+
+  connect (m_d->ui.nextEventButton, SIGNAL(clicked()),
+	   this, SIGNAL(nextEvent()));
+  
+  initLastVars();
+}
+
+//____________________________________________________________________
+TrackDisplaySysController::~TrackDisplaySysController()
+{
+  delete m_d;
+}
+
+
+//____________________________________________________________________
+bool TrackDisplaySysController::showTrackDisplays1() const
+{
+  return m_d->ui.trackDisplayCheckBox->isChecked();
+}
+
+int TrackDisplaySysController::setLineWidth() const {
+  return m_d->ui.lineWidthSpinBox->value();
+}
+
+//____________________________________________________________________
+int TrackDisplaySysController::currentSettingsVersion() const
+{
+  return 2;
+}
+
+//____________________________________________________________________
+void TrackDisplaySysController::actualSaveSettings(VP1Serialise&s) const
+{
+
+  s.save(m_d->ui.trackDisplayCheckBox);//version 1+
+  s.save(m_d->ui.lineWidthSpinBox);      //version 2+
+}
+
+//____________________________________________________________________
+void TrackDisplaySysController::actualRestoreSettings(VP1Deserialise& s)
+{
+  
+  s.restore(m_d->ui.trackDisplayCheckBox);
+  s.restore(m_d->ui.lineWidthSpinBox);
+
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// Test for possible changes in values and emit signals as appropriate:
+// (possibleChange_XXX() slots code provided by macros)
+#define VP1CONTROLLERCLASSNAME TrackDisplaySysController
+#include "VP1Base/VP1ControllerMacros.h" 
+POSSIBLECHANGE_IMP(showTrackDisplays1)
+POSSIBLECHANGE_IMP(setLineWidth)
+
+
diff --git a/GeoModelVisualization/GXTrackDisplaySystems/src/trackdisplaycontrollerform.ui b/GeoModelVisualization/GXTrackDisplaySystems/src/trackdisplaycontrollerform.ui
new file mode 100644
index 0000000000000000000000000000000000000000..6e63be9c6ae13d2f41bba57c5140504310c30853
--- /dev/null
+++ b/GeoModelVisualization/GXTrackDisplaySystems/src/trackdisplaycontrollerform.ui
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>GXTrackDisplayControllerForm</class>
+ <widget class="QWidget" name="GXTrackDisplayControllerForm">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>268</width>
+    <height>243</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="1" column="1">
+    <widget class="QSpinBox" name="lineWidthSpinBox">
+     <property name="minimum">
+      <number>1</number>
+     </property>
+     <property name="maximum">
+      <number>10</number>
+     </property>
+     <property name="value">
+      <number>3</number>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="1">
+    <widget class="QPushButton" name="pushButton_selectInput">
+     <property name="text">
+      <string>Open Input</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="2">
+    <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">
+    <widget class="QLabel" name="pointSizeLabel">
+     <property name="text">
+      <string>Line size</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <widget class="QCheckBox" name="trackDisplayCheckBox">
+       <property name="text">
+        <string>Tracks</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="5" column="1">
+    <widget class="QCommandLinkButton" name="nextEventButton">
+     <property name="text">
+      <string>Next Event</string>
+     </property>
+    </widget>
+   </item>
+   <item row="4" column="1">
+    <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>
+   <item row="6" column="1">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/GeoModelVisualization/VP1GeometryPlugin/CMakeLists.txt b/GeoModelVisualization/VP1GeometryPlugin/CMakeLists.txt
index 9e19b1807fddd7cf7c186c22069aa6aba8746c86..4f4889e36606dc321efec033e86e9ebc295dec5f 100644
--- a/GeoModelVisualization/VP1GeometryPlugin/CMakeLists.txt
+++ b/GeoModelVisualization/VP1GeometryPlugin/CMakeLists.txt
@@ -8,7 +8,7 @@ file( GLOB HEADERS VP1GeometryPlugin/*.h )
 add_library( GXGeometryPlugin MODULE ${SOURCES} ${HEADERS} )
 target_link_libraries( GXGeometryPlugin
    PUBLIC Qt5::Core GXBase
-   PRIVATE GXGeometrySystems GXGuideLineSystems GXClashPointSystems GXHitDisplaySystems )
+   PRIVATE GXGeometrySystems GXGuideLineSystems GXClashPointSystems GXHitDisplaySystems GXTrackDisplaySystems)
 target_include_directories( GXGeometryPlugin PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
    $<INSTALL_INTERFACE:include> )
diff --git a/GeoModelVisualization/VP1GeometryPlugin/src/VP1GeometryChannel.cxx b/GeoModelVisualization/VP1GeometryPlugin/src/VP1GeometryChannel.cxx
index d4c8299caef10c73a7ed570108a102d31a3ebe8b..2d51342980874e8f1bdf8241ea6bc5d4cd4bf075 100644
--- a/GeoModelVisualization/VP1GeometryPlugin/src/VP1GeometryChannel.cxx
+++ b/GeoModelVisualization/VP1GeometryPlugin/src/VP1GeometryChannel.cxx
@@ -17,6 +17,7 @@
 #include "VP1GuideLineSystems/VP1GuideLineSystem.h"
 #include "GXClashPointSystems/GXClashPointSystem.h"
 #include "GXHitDisplaySystems/GXHitDisplaySystem.h"
+#include "GXTrackDisplaySystems/GXTrackDisplaySystem.h"
 #include "VP1Base/VP1QtUtils.h"
 
 VP1GeometryChannel::VP1GeometryChannel()
@@ -34,4 +35,5 @@ void VP1GeometryChannel::init()
   addSystem(new VP1GuideLineSystem, IVP13DStandardChannelWidget::StartDisabled);
   addSystem(new GXClashPointSystem,  IVP13DStandardChannelWidget::StartDisabled);
   addSystem(new GXHitDisplaySystem,  IVP13DStandardChannelWidget::StartDisabled);
+  addSystem(new GXTrackDisplaySystem,  IVP13DStandardChannelWidget::StartDisabled);
 }