diff --git a/InnerDetector/InDetValidation/InDetTrackPerfMon/CMakeLists.txt b/InnerDetector/InDetValidation/InDetTrackPerfMon/CMakeLists.txt
index 893c4ee2895c890b916a9c3dbabeb27d0f6e64d0..e6c3f25e85d70894bb38abf5da8edd49b67fe716 100644
--- a/InnerDetector/InDetValidation/InDetTrackPerfMon/CMakeLists.txt
+++ b/InnerDetector/InDetValidation/InDetTrackPerfMon/CMakeLists.txt
@@ -32,7 +32,7 @@ atlas_add_component( InDetTrackPerfMon
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
-#atlas_install_joboptions( share/*.py share/*.txt )
-#atlas_install_runtime( share/*.xml share/*.xsd)
 atlas_install_data( data/* )
 atlas_install_runtime( scripts/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
+atlas_install_scripts( test/test*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
+atlas_install_scripts( test/test*.sh )
diff --git a/InnerDetector/InDetValidation/InDetTrackPerfMon/data/offlTrkAnaConfig.json b/InnerDetector/InDetValidation/InDetTrackPerfMon/data/offlTrkAnaConfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..db940250da754a09ed1c3e6823561cee72ccc8e3
--- /dev/null
+++ b/InnerDetector/InDetValidation/InDetTrackPerfMon/data/offlTrkAnaConfig.json
@@ -0,0 +1,9 @@
+{
+    "TrkAnaOffl1" : {
+        "enabled" : true,
+        "TestType"  : "Offline",
+        "RefType"   : "Truth", 
+        "MatchingType"  : "TruthMatch", 
+        "SubFolder"  : "TrkAnaOffl1/"
+    }
+}
diff --git a/InnerDetector/InDetValidation/InDetTrackPerfMon/scripts/runIDTPM.py b/InnerDetector/InDetValidation/InDetTrackPerfMon/scripts/runIDTPM.py
index 82b3d7f3dd5171a6e5d5ffdaecdf7e763ca6856a..b747fc720f6e1c13659b011a03aaadd39aa137fc 100755
--- a/InnerDetector/InDetValidation/InDetTrackPerfMon/scripts/runIDTPM.py
+++ b/InnerDetector/InDetValidation/InDetTrackPerfMon/scripts/runIDTPM.py
@@ -10,7 +10,7 @@ def GetCustomAthArgs() :
     IDTPMparser.add_argument( "--maxEvents", help="Limit number of events. Default: all input events", default=-1, type=int )
     IDTPMparser.add_argument( "--debug", help="Enable debugging messages", action="store_true", default=False )
     IDTPMparser.add_argument( "--dirName", help="Main directory name for storing plots", default="InDetTrackPerfMonPlots/" )
-    IDTPMparser.add_argument( "--outputFileName", help='Name of output file', default="myIDTPM_out" )
+    IDTPMparser.add_argument( "--outputFilePrefix", help='Name of output file', default="myIDTPM_out" )
     IDTPMparser.add_argument( "--writeAOD_IDTPM", help="Write output file for reprocessing", action="store_true", default=False )
     IDTPMparser.add_argument( "--trkAnaCfgFile", help='File with track analysis setup (.json format)', default='Default' )
     IDTPMparser.add_argument( "--unpackTrigChains", help="Run each configured trigger chain in a separate track analysis", action="store_true", default=False )
@@ -33,10 +33,10 @@ for path in MyArgs.inputFileNames.split( ',' ):
     flags.Input.Files += glob( path )
 
 ## Outputs
-flags.PhysVal.OutputFileName = MyArgs.outputFileName + '.HIST.root'
+flags.PhysVal.OutputFileName = MyArgs.outputFilePrefix + '.HIST.root'
 flags.addFlag( 'Output.doWriteAOD_IDTPM', MyArgs.writeAOD_IDTPM )
 flags.addFlag( 'Output.AOD_IDTPMFileName',
-               MyArgs.outputFileName + '.AOD_IDTPM.pool.root' )
+               MyArgs.outputFilePrefix + '.AOD_IDTPM.pool.root' )
 
 ## Set output log level
 if MyArgs.debug:
diff --git a/InnerDetector/InDetValidation/InDetTrackPerfMon/test/test_IDTPM_RDOtoOfflTrkAna_build.sh b/InnerDetector/InDetValidation/InDetTrackPerfMon/test/test_IDTPM_RDOtoOfflTrkAna_build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..1f1f7b5db1b720ab212441f1d2811e312199c43c
--- /dev/null
+++ b/InnerDetector/InDetValidation/InDetTrackPerfMon/test/test_IDTPM_RDOtoOfflTrkAna_build.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+# art-description: Test to trasform RDO->AOD and then run IDTPM for an Offline TrackAnalysis
+# art-input: mc21_14TeV.601229.PhPy8EG_A14_ttbar_hdamp258p75_SingleLep.recon.RDO.e8481_s4149_r14700
+# art-type: build
+# art-include: main/Athena
+# art-output: *.root
+
+input_RDO=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/PhaseIIUpgrade/RDO/ATLAS-P2-RUN4-03-00-00/mc21_14TeV.601229.PhPy8EG_A14_ttbar_hdamp258p75_SingleLep.recon.RDO.e8481_s4149_r14700/RDO.33629020._000047.pool.root.1
+
+nEvents=15
+
+run () {
+    name="${1}"
+    cmd="${@:2}"
+    echo "Running ${name}..."
+    time ${cmd}
+    rc=$?
+    echo "art-result: $rc ${name}"
+    if [ $rc != 0 ]; then
+        exit $rc
+    fi
+    return $rc
+}
+
+run "Reconstruction" \
+    Reco_tf.py --CA \
+    --inputRDOFile ${input_RDO} \
+    --outputAODFile AOD.root \
+    --steering doRAWtoALL \
+    --maxEvents ${nEvents} \
+    --preInclude InDetConfig.ConfigurationHelpers.OnlyTrackingPreInclude
+
+run "IDTPM" \
+    runIDTPM.py \
+    --inputFileNames AOD.root \
+    --outputFilePrefix myIDTPM \
+    --trkAnaCfgFile InDetTrackPerfMon/offlTrkAnaConfig.json \
+    --writeAOD_IDTPM \
+    --maxEvents ${nEvents} \
+    --debug
diff --git a/InnerDetector/InDetValidation/InDetTrackPerfMon/test/test_trigAna_IDTPM_RDOtoTrkAna_build.py b/InnerDetector/InDetValidation/InDetTrackPerfMon/test/test_trigAna_IDTPM_RDOtoTrkAna_build.py
new file mode 100755
index 0000000000000000000000000000000000000000..9126bdfdaed8f3d3bdc966afd2ad178a45440e8c
--- /dev/null
+++ b/InnerDetector/InDetValidation/InDetTrackPerfMon/test/test_trigAna_IDTPM_RDOtoTrkAna_build.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+#
+# art-description: Test to trasform RDO->AOD and then run IDTPM for an Offline TrackAnalysis
+# art-type: build
+# art-include: main/Athena
+# art-output: *.root
+
+from TrigValTools.TrigValSteering import Test, ExecStep, CheckSteps
+
+maxEvents = 15
+
+## RDO->AOD
+rdo2aod = ExecStep.ExecStep()
+rdo2aod.type = 'Reco_tf'
+rdo2aod.input = 'ttbar_pu200_Run4' # defined in TrigValTools/share/TrigValInputs.json
+rdo2aod.max_events = maxEvents
+rdo2aod.args = ' --CA'
+rdo2aod.args += ' --outputAODFile AOD.pool.root'
+rdo2aod.args += ' --steering doRAWtoALL'
+rdo2aod.args += ' --preInclude InDetConfig.ConfigurationHelpers.OnlyTrackingPreInclude'
+
+## IDTPM TrkAnalysis
+aod2trkana = ExecStep.ExecStep( 'IDTPM' )
+aod2trkana.type = 'other'
+aod2trkana.input = ''
+aod2trkana.max_events = -1
+aod2trkana.required = True
+aod2trkana.depends_on_previous = True
+aod2trkana.executable = 'runIDTPM.py'
+aod2trkana.args = ' --inputFileNames AOD.pool.root'
+aod2trkana.args += ' --outputFilePrefix myIDTPM'
+aod2trkana.args += ' --trkAnaCfgFile InDetTrackPerfMon/offlTrkAnaConfig.json'
+aod2trkana.args += ' --writeAOD_IDTPM'
+aod2trkana.args += ' --debug'
+
+## Define test
+test = Test.Test()
+test.art_type = 'build'
+test.exec_steps = [ rdo2aod, aod2trkana ]
+test.check_steps = CheckSteps.default_check_steps( test )
+
+import sys
+sys.exit( test.run() )
+