diff --git a/Makefile b/Makefile
index cf31b3fd50fd64efddf5bebca6e0f11ac90d68b6..848ddaa915bf6a5f00fe22a4716851109779c85e 100644
--- a/Makefile
+++ b/Makefile
@@ -32,9 +32,10 @@ SRC  =  src/THcInterface.cxx src/THcParmList.cxx src/THcAnalyzer.cxx \
 	src/THcRasterRawHit.cxx \
 	src/THcScalerEvtHandler.cxx \
 	src/THcHodoEff.cxx \
-	src/THcTrigApp.cxx src/THcTrigDet.cxx src/THcTrigRawHit.cxx
+	src/THcTrigApp.cxx src/THcTrigDet.cxx src/THcTrigRawHit.cxx \
+	src/THcDummySpectrometer.cxx
 
-# Name of your package. 
+# Name of your package.
 # The shared library that will be built will get the name lib$(PACKAGE).so
 PACKAGE = HallC
 
@@ -101,8 +102,8 @@ INCLUDES      = $(ROOTCFLAGS) $(addprefix -I, $(INCDIRS) )
 USERLIB       = lib$(PACKAGE).so
 USERDICT      = $(PACKAGE)Dict
 
-LIBS          = 
-GLIBS         = 
+LIBS          =
+GLIBS         =
 
 ifeq ($(ARCH),solarisCC5)
 # Solaris CC 5.0
@@ -148,8 +149,8 @@ ifdef WITH_DEBUG
 CXXFLAGS     += -DWITH_DEBUG
 endif
 
-CCDBLIBS = 
-CCDBFLAGS = 
+CCDBLIBS =
+CCDBFLAGS =
 ifdef CCDB_HOME
 CCDBLIBS     += -L$(CCDB_HOME)/lib -lccdb
 CCDBFLAGS  += -I$(CCDB_HOME)/include -DWITH_CCDB
@@ -171,7 +172,7 @@ DISTFILE      = $(PKG).tar.gz
 #------------------------------------------------------------------------------
 OBJ           = $(SRC:.cxx=.o)
 RCHDR	      = $(SRC:.cxx=.h) src/THcGlobals.h
-HDR           = $(SRC:.cxx=.h) 
+HDR           = $(SRC:.cxx=.h)
 DEP           = $(SRC:.cxx=.d) src/main.d
 OBJS          = $(OBJ) $(USERDICT).o
 HDR_COMPILEDATA = $(ANALYZER)/src/ha_compiledata.h
@@ -193,7 +194,7 @@ endif
 
 src/THcInterface.d:  $(HDR_COMPILEDATA)
 
-hcana:		src/main.o $(LIBDC) $(LIBHALLA) $(USERLIB) 
+hcana:		src/main.o $(LIBDC) $(LIBHALLA) $(USERLIB)
 		$(LD) $(LDFLAGS) $< -lHallC $(HALLALIBS) $(EVIOLIB) -L. $(CCDBLIBS) \
 		$(GLIBS) -o $@
 
@@ -202,7 +203,7 @@ $(USERLIB):	$(HDR) $(OBJS)
 		@echo "$@ done"
 
 $(HDR_COMPILEDATA) $(LIBHALLA) $(LIBDC): $(ANALYZER)/Makefile
-		@echo "Building Podd"		
+		@echo "Building Podd"
 		@cd $(ANALYZER) ; export PODD_EXTRA_DEFINES=-DHALLC_MODS ; make
 
 $(USERDICT).cxx: $(RCHDR) $(HDR) $(LINKDEF)
diff --git a/SConscript.py b/SConscript.py
index fc1f30932bc7a53dc21b3cd882f9625c53986400..fdc3df87ed982e08e64fde383fc78a85857e624e 100644
--- a/SConscript.py
+++ b/SConscript.py
@@ -11,20 +11,21 @@ Import ('pbaseenv')
 roothcdict = pbaseenv.subst('$HC_DIR')+'/HallCDict.C'
 roothcobj = pbaseenv.subst('$HC_SRC')+'/HallCDict.so'
 hcheaders = Split("""
-	src/THcInterface.h src/THcParmList.h src/THcAnalyzer.h src/THcHallCSpectrometer.h
-	src/THcDetectorMap.h src/THcRawHit.h src/THcHitList.h src/THcSignalHit.h src/THcHodoscope.h
-	src/THcScintillatorPlane.h src/THcRawHodoHit.h src/THcHodoHit.h
-        src/THcDC.h src/THcDriftChamberPlane.h
-	src/THcDriftChamber.h src/THcRawDCHit.h src/THcDCHit.h src/THcDCWire.h src/THcSpacePoint.h
-	src/THcDCLookupTTDConv.h src/THcDCTimeToDistConv.h src/THcShower.h src/THcShowerPlane.h
-        src/THcShowerArray.h src/THcShowerHit.h
-	src/THcRawShowerHit.h src/THcAerogel.h src/THcAerogelHit.h src/THcCherenkov.h src/THcCherenkovHit.h
-        src/THcGlobals.h src/THcDCTrack.h src/THcFormula.h
-        src/THcRaster.h src/THcRasteredBeam.h src/THcRasterRawHit.h src/THcScalerEvtHandler.h
-        src/THcHodoEff.h
-	src/THcTrigApp.h src/THcTrigDet.h src/THcTrigRawHit.h
-	src/HallC_LinkDef.h
-	""")
+src/THcInterface.h src/THcParmList.h src/THcAnalyzer.h src/THcHallCSpectrometer.h
+src/THcDetectorMap.h src/THcRawHit.h src/THcHitList.h src/THcSignalHit.h src/THcHodoscope.h
+src/THcScintillatorPlane.h src/THcRawHodoHit.h src/THcHodoHit.h
+src/THcDC.h src/THcDriftChamberPlane.h
+src/THcDriftChamber.h src/THcRawDCHit.h src/THcDCHit.h src/THcDCWire.h src/THcSpacePoint.h
+src/THcDCLookupTTDConv.h src/THcDCTimeToDistConv.h src/THcShower.h src/THcShowerPlane.h
+src/THcShowerArray.h src/THcShowerHit.h
+src/THcRawShowerHit.h src/THcAerogel.h src/THcAerogelHit.h src/THcCherenkov.h src/THcCherenkovHit.h
+src/THcGlobals.h src/THcDCTrack.h src/THcFormula.h
+src/THcRaster.h src/THcRasteredBeam.h src/THcRasterRawHit.h src/THcScalerEvtHandler.h
+src/THcHodoEff.h
+src/THcTrigApp.h src/THcTrigDet.h src/THcTrigRawHit.h
+src/THcDummySpectrometer.h
+src/HallC_LinkDef.h
+""")
 pbaseenv.RootCint(roothcdict,hcheaders)
 pbaseenv.SharedObject(target = roothcobj, source = roothcdict)
 
diff --git a/src/HallC_LinkDef.h b/src/HallC_LinkDef.h
index 682a69e6d9590d6b433dcb5ea79dfde027d123d6..0eedcdaf90a173f7c0fb7b3c07b58ab079a1a1ef 100644
--- a/src/HallC_LinkDef.h
+++ b/src/HallC_LinkDef.h
@@ -57,9 +57,9 @@
 #pragma link C++ class THcRasterRawHit+;
 #pragma link C++ class THcScalerEvtHandler+;
 #pragma link C++ class THcHodoEff+;
-
 #pragma link C++ class THcTrigApp+;
 #pragma link C++ class THcTrigDet+;
 #pragma link C++ class THcTrigRawHit+;
+#pragma link C++ class THcDummySpectrometer+;
 
 #endif
diff --git a/src/SConscript.py b/src/SConscript.py
index 121b711c47203f1456fddb0d88c204e834e101a3..91acb0403c82766d6f3b9c21308d59053adb0337 100644
--- a/src/SConscript.py
+++ b/src/SConscript.py
@@ -7,27 +7,28 @@ import SCons.Util
 Import('pbaseenv')
 
 list = Split("""
-THcInterface.cxx THcParmList.cxx THcAnalyzer.cxx \
-THcHallCSpectrometer.cxx \
-THcDetectorMap.cxx \
-THcRawHit.cxx THcHitList.cxx \
-THcSignalHit.cxx \
-THcHodoscope.cxx THcScintillatorPlane.cxx \
-THcRawHodoHit.cxx THcHodoHit.cxx \
-THcDC.cxx THcDriftChamberPlane.cxx \
-THcDriftChamber.cxx \
-THcRawDCHit.cxx THcDCHit.cxx \
-THcDCWire.cxx \
-THcSpacePoint.cxx THcDCTrack.cxx \
-THcDCLookupTTDConv.cxx THcDCTimeToDistConv.cxx \
-THcShower.cxx THcShowerPlane.cxx THcShowerArray.cxx \
+THcInterface.cxx THcParmList.cxx THcAnalyzer.cxx
+THcHallCSpectrometer.cxx
+THcDetectorMap.cxx
+THcRawHit.cxx THcHitList.cxx
+THcSignalHit.cxx
+THcHodoscope.cxx THcScintillatorPlane.cxx
+THcRawHodoHit.cxx THcHodoHit.cxx
+THcDC.cxx THcDriftChamberPlane.cxx
+THcDriftChamber.cxx
+THcRawDCHit.cxx THcDCHit.cxx
+THcDCWire.cxx
+THcSpacePoint.cxx THcDCTrack.cxx
+THcDCLookupTTDConv.cxx THcDCTimeToDistConv.cxx
+THcShower.cxx THcShowerPlane.cxx THcShowerArray.cxx
 THcRawShowerHit.cxx THcShowerHit.cxx
-THcAerogel.cxx THcAerogelHit.cxx \
-THcCherenkov.cxx THcCherenkovHit.cxx \
-THcFormula.cxx \
-THcRaster.cxx THcRasteredBeam.cxx THcRasterRawHit.cxx \
-THcScalerEvtHandler.cxx \
+THcAerogel.cxx THcAerogelHit.cxx
+THcCherenkov.cxx THcCherenkovHit.cxx
+THcFormula.cxx
+THcRaster.cxx THcRasteredBeam.cxx THcRasterRawHit.cxx
+THcScalerEvtHandler.cxx
 THcTrigApp.cxx THcTrigDet.cxx THcTrigRawHit.cxx
+THcDummySpectrometer.cxx
 THcHodoEff.cxx
 """)
 
diff --git a/src/THcDummySpectrometer.cxx b/src/THcDummySpectrometer.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..58edf3fab4fe03e8d864cdc1e16e1b9332984b33
--- /dev/null
+++ b/src/THcDummySpectrometer.cxx
@@ -0,0 +1,106 @@
+/**
+\class THcDummySpectrometer
+\ingroup Base
+
+\brief A dummy spectrometer used for testing detectors.
+
+This class behaves as a spectrometer apparatus in that it holds detector
+classes, but it does no reconstruction. It is intended to provide an elegant
+way to setup a teststand for a detector or a set of detectors, without
+requiring some "needed" detectors or parameters.
+*/
+
+/**
+\fn THcDummySpectrometer::THcDummySpectrometer(const char* name, const char* description)
+
+\brief A constructor.
+
+\param[in] name Name of the apparatus. Is typically "H", "P" or "S" for
+HMS, SHMS and SOS, respectively.
+\param[in] description Description of the apparatus.
+*/
+
+/**
+\fn virtual THcDummySpectrometer::~THcDummySpectrometer()
+
+\brief A destructor.
+*/
+
+/**
+\fn Int_t THcDummySpectrometer::Reconstruct()
+
+\brief Does nothing and returns 0.
+
+This function is usually responsible for reconstructing the event from the
+detectors in the spectrometer. Since this is a dummy apparatus, we have a dummy
+reconstruction.
+*/
+
+/**
+\fn std::string THcDummySpectrometer::GetKwPrefix()
+
+\brief Returns prefix used for parameters in `param` files.
+
+All the parameters read by this apparatus are prefixed with the returned string.
+*/
+
+#include "THcDummySpectrometer.h"
+
+#include "TDatime.h"
+
+#include "THcGlobals.h"
+#include "THcParmList.h"
+
+
+THcDummySpectrometer::THcDummySpectrometer(
+  const char* name, const char* description
+) :
+  THaApparatus(name, description),
+  fKwPrefix("")
+{
+  // Construct the kwPrefix here. Better place would be in `Setup` method.
+  TString kwPrefix = name;
+  kwPrefix.ToUpper();
+  fKwPrefix = kwPrefix;
+}
+
+
+THcDummySpectrometer::~THcDummySpectrometer() {}
+
+
+Int_t THcDummySpectrometer::Reconstruct() {
+  // Don't need reconstruction here.
+  return 0;
+}
+
+
+TString THcDummySpectrometer::GetKwPrefix() {
+  return fKwPrefix;
+}
+
+
+Int_t THcDummySpectrometer::ReadRunDatabase(const TDatime& date) {
+  return kOK;
+}
+
+
+Int_t THcDummySpectrometer::ReadDatabase(const TDatime& date) {
+  return kOK;
+}
+
+
+Int_t THcDummySpectrometer::DefineVariables(THaAnalysisObject::EMode mode) {
+  if (mode == kDefine && fIsSetup) return kOK;
+  fIsSetup = (mode == kDefine);
+
+  std::vector<RVarDef> vars;
+  vars.push_back({0});
+
+  return DefineVarsFromList(vars.data(), mode);
+}
+
+
+THcDummySpectrometer::THcDummySpectrometer() {}
+
+
+ClassImp(THcDummySpectrometer)
diff --git a/src/THcDummySpectrometer.h b/src/THcDummySpectrometer.h
new file mode 100644
index 0000000000000000000000000000000000000000..6de56eb91923e1084256d8b6ae9f0cac780b83c1
--- /dev/null
+++ b/src/THcDummySpectrometer.h
@@ -0,0 +1,35 @@
+#ifndef ROOT_THcDummySpectrometer
+#define ROOT_THcDummySpectrometer
+
+#include "TString.h"
+
+#include "THaAnalysisObject.h"
+#include "THaApparatus.h"
+
+
+class TDatime;
+
+
+class THcDummySpectrometer : public THaApparatus {
+  public:
+    THcDummySpectrometer(const char* name, const char* description);
+    virtual ~THcDummySpectrometer();
+
+    virtual Int_t Reconstruct();
+
+    TString GetKwPrefix();
+
+  protected:
+    virtual Int_t ReadRunDatabase(const TDatime& date);
+    virtual Int_t ReadDatabase(const TDatime& date);
+    virtual Int_t DefineVariables(EMode mode=kDefine);
+
+    TString fKwPrefix;
+
+  private:
+    THcDummySpectrometer();
+    ClassDef(THcDummySpectrometer, 0);
+};
+
+
+#endif  // ROOT_THcDummySpectrometer