diff --git a/Trigger/TrigT1/TrigT1Interfaces/CMakeLists.txt b/Trigger/TrigT1/TrigT1Interfaces/CMakeLists.txt
index bae7f42f98d3e9f0299f8394ef6970021ae3362d..ee3aa5e7f115734299cda9c9a66be039b8e0128a 100644
--- a/Trigger/TrigT1/TrigT1Interfaces/CMakeLists.txt
+++ b/Trigger/TrigT1/TrigT1Interfaces/CMakeLists.txt
@@ -12,7 +12,8 @@ atlas_depends_on_subdirs( PUBLIC
                           Control/AthContainers
                           GaudiKernel
                           PRIVATE
-                          Trigger/TrigConfiguration/TrigConfL1Data )
+                          Trigger/TrigConfiguration/TrigConfL1Data
+                          AtlasTest/TestTools )
 
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
@@ -33,3 +34,12 @@ atlas_add_dictionary( TrigT1InterfacesDict
                       INCLUDE_DIRS ${XERCESC_INCLUDE_DIRS} ${TDAQ-COMMON_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS}
                       LINK_LIBRARIES ${XERCESC_LIBRARIES} ${TDAQ-COMMON_LIBRARIES} ${ROOT_LIBRARIES} AthenaBaseComps AthContainers AthenaKernel GaudiKernel TrigConfL1Data TrigT1Interfaces )
 
+
+atlas_add_test( CPRoIDecoder_test
+                SOURCES test/CPRoIDecoder_test.cxx
+                LINK_LIBRARIES TrigT1Interfaces )
+
+
+atlas_add_test( JEPRoIDecoder_test
+                SOURCES test/JEPRoIDecoder_test.cxx
+                LINK_LIBRARIES TrigT1Interfaces )
diff --git a/Trigger/TrigT1/TrigT1Interfaces/share/CPRoIDecoder_test.ref b/Trigger/TrigT1/TrigT1Interfaces/share/CPRoIDecoder_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..867e87fc7efd1bb6daf89905f5482ec4fad3ba8f
--- /dev/null
+++ b/Trigger/TrigT1/TrigT1Interfaces/share/CPRoIDecoder_test.ref
@@ -0,0 +1,2 @@
+CPRoIDecoder_test
+test1
diff --git a/Trigger/TrigT1/TrigT1Interfaces/share/JEPRoIDecoder_test.ref b/Trigger/TrigT1/TrigT1Interfaces/share/JEPRoIDecoder_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..78e83dbbf873b5acd9e960b6b327bcbdac6ab3d5
--- /dev/null
+++ b/Trigger/TrigT1/TrigT1Interfaces/share/JEPRoIDecoder_test.ref
@@ -0,0 +1,2 @@
+JEPRoIDecoder_test
+test1
diff --git a/Trigger/TrigT1/TrigT1Interfaces/src/JEPRoIDecoder.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/JEPRoIDecoder.cxx
index 3db7a968c2a22378e0a5c0eabd751fed96594a0f..630f3ba0f19f69d46d42e52dcb0913474a61d1e3 100644
--- a/Trigger/TrigT1/TrigT1Interfaces/src/JEPRoIDecoder.cxx
+++ b/Trigger/TrigT1/TrigT1Interfaces/src/JEPRoIDecoder.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 /***************************************************************************
                          JEPRoIDecoder.cxx  -  description
@@ -320,7 +320,7 @@ unsigned int LVL1::JEPRoIDecoder::jetRoIVersion( unsigned int word ) const {
       }
     } //endfor
 
-    return m_sumEtThreshPassedVec;
+    return m_mEtSigThreshPassedVec;
   }
 
   /** returns a vector containing the numbers of threshold passed i.e. if the vector contains 1,3,5 it
diff --git a/Trigger/TrigT1/TrigT1Interfaces/test/CPRoIDecoder_test.cxx b/Trigger/TrigT1/TrigT1Interfaces/test/CPRoIDecoder_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..748f350f526e1ba549e4d595350f682086636652
--- /dev/null
+++ b/Trigger/TrigT1/TrigT1Interfaces/test/CPRoIDecoder_test.cxx
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+ */
+/**
+ * @file TrigT1Interfaces/test/CPRoIDecoder_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Mar, 2019
+ * @brief Unit tests for CPRoIDecoder.
+ */
+
+
+#undef NDEBUG
+#include "TrigT1Interfaces/CPRoIDecoder.h"
+#include "TestTools/FLOATassert.h"
+#include <iostream>
+#include <cassert>
+
+
+void test1()
+{
+  std::cout << "test1\n";
+
+  const double cratePhiSize = M_PI / 2.0;
+  const double fpgaPhiSize = M_PI / 16.0;
+  const double localCoordPhiSize = M_PI / 32.0;
+  const double cpmEtaSize = 0.4;
+  const double localCoordEtaSize = 0.1;
+
+  LVL1::CPRoIDecoder d;
+  assert (d.roiType(0x22345678) == LVL1::TrigT1CaloDefs::CpRoIWordType);
+  assert (d.roiType(0xa2345678) == LVL1::TrigT1CaloDefs::EMRoIWordType);
+  assert (d.roiType(0xb2345678) == LVL1::TrigT1CaloDefs::TauRoIWordType);
+  assert (d.roiType(0xc2345678) == LVL1::TrigT1CaloDefs::RoIWordTypeError);
+
+  // EMRoI, crate=2, module=11, chip=5, localcoord=3, et=0x48, isol=0x12
+  unsigned int word1 = 0xaaeb1248;
+  assert (d.roiType(word1) == LVL1::TrigT1CaloDefs::EMRoIWordType);
+  assert (d.crate(word1) == 2);
+  assert (d.module(word1) == 11);
+  assert (d.chip(word1) == 5);
+  assert (d.localcoord(word1) == 3);
+  assert (d.thresholdsPassed(word1) == (std::vector<unsigned>{}));
+  assert (d.et(word1) == 0x48);
+  assert (d.isolationWord(word1) == 0x12);
+  LVL1::CoordinateRange cr1 = d.coordinate (word1);
+  double phi1 = 2*cratePhiSize + 5*fpgaPhiSize + 2*localCoordPhiSize;
+  double eta1 = 3*cpmEtaSize + 2*localCoordEtaSize;
+  FLOAT_EQassert (cr1.phi(), phi1);
+  FLOAT_EQassert (cr1.phiRange().min(), phi1-localCoordPhiSize);
+  FLOAT_EQassert (cr1.phiRange().max(), phi1+localCoordPhiSize);
+  FLOAT_EQassert (cr1.eta(), eta1);
+  FLOAT_EQassert (cr1.etaRange().min(), eta1-localCoordEtaSize);
+  FLOAT_EQassert (cr1.etaRange().max(), eta1+localCoordEtaSize);
+
+  // CpRoI, crate=1, module=7, chip=2, localcoord=5, tp=4,7,10,13
+  unsigned int word2 = 0x17541248;
+  assert (d.roiType(word2) == LVL1::TrigT1CaloDefs::CpRoIWordType);
+  assert (d.crate(word2) == 1);
+  assert (d.module(word2) == 7);
+  assert (d.chip(word2) == 2);
+  assert (d.localcoord(word2) == 5);
+  assert (d.thresholdsPassed(word2) == (std::vector<unsigned>{4,7,10,13}));
+  assert (d.et(word2) == 0);
+  assert (d.isolationWord(word2) == 0);
+  LVL1::CoordinateRange cr2 = d.coordinate (word2);
+  double phi2 = 1*cratePhiSize + 2*fpgaPhiSize + localCoordPhiSize;
+  double eta2 = (-1)*cpmEtaSize + 4*localCoordEtaSize;
+  FLOAT_EQassert (cr2.phi(), phi2);
+  FLOAT_EQassert (cr2.phiRange().min(), phi2-localCoordPhiSize);
+  FLOAT_EQassert (cr2.phiRange().max(), phi2+localCoordPhiSize);
+  FLOAT_EQassert (cr2.eta(), eta2);
+  FLOAT_EQassert (cr2.etaRange().min(), eta2-localCoordEtaSize);
+  FLOAT_EQassert (cr2.etaRange().max(), eta2+localCoordEtaSize);
+}
+
+
+int main()
+{
+  std::cout << "CPRoIDecoder_test\n";
+  test1();
+  return 0;
+}
diff --git a/Trigger/TrigT1/TrigT1Interfaces/test/JEPRoIDecoder_test.cxx b/Trigger/TrigT1/TrigT1Interfaces/test/JEPRoIDecoder_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..f55b08dae9308d8197a94e35a5a66f1e67372513
--- /dev/null
+++ b/Trigger/TrigT1/TrigT1Interfaces/test/JEPRoIDecoder_test.cxx
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+ */
+/**
+ * @file TrigT1Interfaces/test/JEPRoIDecoder_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Mar, 2019
+ * @brief Unit tests for JEPRoIDecoder.
+ */
+
+
+#undef NDEBUG
+#include "TrigT1Interfaces/JEPRoIDecoder.h"
+#include "TestTools/FLOATassert.h"
+#include <iostream>
+#include <cassert>
+
+
+void test1()
+{
+  std::cout << "test1\n";
+
+  const double jemPhiSize = M_PI / 2;
+  const double jePhiSize = M_PI / 16;
+  const double JEMEtaSize = 0.8;
+  const double jeEtaSize = 0.2;
+
+    LVL1::JEPRoIDecoder d;
+  assert (d.roiType(0x82345678) == LVL1::TrigT1CaloDefs::JetRoIWordType);
+  assert (d.roiType(0x02345678) == LVL1::TrigT1CaloDefs::JetRoIWordType);
+  assert (d.roiType(0xa2345678) == LVL1::TrigT1CaloDefs::JetEtRoIWordType);
+  assert (d.roiType(0x42345678) == LVL1::TrigT1CaloDefs::EnergyRoIWordType0);
+  assert (d.roiType(0x52345678) == LVL1::TrigT1CaloDefs::EnergyRoIWordType2);
+  assert (d.roiType(0x62345678) == LVL1::TrigT1CaloDefs::EnergyRoIWordType1);
+
+  assert (d.jetRoIVersion(0x82345678) == 1);
+  assert (d.jetRoIVersion(0x02345678) == 2);
+  assert (d.jetRoIVersion(0x32345678) == 999);
+
+  // run1; crate=0; jem=13; col=2, row=5 [frame=6 rl=2]; th=4,7; fth=2
+  unsigned int word1 = 0x8dd01248;
+  assert (d.crate(word1) == 0);
+  assert (d.module(word1) == 13);
+  assert (d.column(word1) == 2);
+  assert (d.row(word1) == 5);
+  assert (d.thresholdsPassed(word1)    == (std::vector<unsigned>{4,7}));
+  assert (d.fwdThresholdsPassed(word1) == (std::vector<unsigned>{2}));
+  assert (d.etLarge(word1) == 0);
+  assert (d.etSmall(word1) == 0);
+  const double phi1 = 2*jemPhiSize + 6*jePhiSize;
+  const double eta1 = JEMEtaSize + 3*jeEtaSize;
+  LVL1::CoordinateRange cr1 = d.coordinate(word1);
+  FLOAT_EQassert (cr1.phi(), phi1);
+  FLOAT_EQassert (cr1.phiRange().min(), phi1-jePhiSize);
+  FLOAT_EQassert (cr1.phiRange().max(), phi1+jePhiSize);
+  FLOAT_EQassert (cr1.eta(), eta1);
+  FLOAT_EQassert (cr1.etaRange().min(), eta1-jeEtaSize);
+  FLOAT_EQassert (cr1.etaRange().max(), eta1+jeEtaSize);
+
+  // run2; crate=1; jem=7; col=1, row=6 [frame=3 rl=1]; etLarge=0x0x248; etSmall=0x40
+  unsigned int word2 = 0x17681248;
+  assert (d.crate(word2) == 1);
+  assert (d.module(word2) == 7);
+  assert (d.column(word2) == 1);
+  assert (d.row(word2) == 6);
+  assert (d.thresholdsPassed(word2)    == (std::vector<unsigned>{}));
+  assert (d.fwdThresholdsPassed(word2) == (std::vector<unsigned>{}));
+  assert (d.etLarge(word2) == 0x248);
+  assert (d.etSmall(word2) == 0x04);
+  LVL1::CoordinateRange cr2 = d.coordinate(word2);
+  const double phi2 = jemPhiSize + 7*jePhiSize;
+  FLOAT_EQassert (cr2.phi(), phi2);
+  FLOAT_EQassert (cr2.phiRange().min(), phi2-jePhiSize);
+  FLOAT_EQassert (cr2.phiRange().max(), phi2+jePhiSize);
+  FLOAT_EQassert (cr2.etaRange().min(), 2.7);
+  FLOAT_EQassert (cr2.etaRange().max(), 3.2);
+  FLOAT_EQassert (cr2.eta(), 2.95);
+
+  // run2; crate=1; jem=8; col=0, row=3 [frame=1 rl=2]; etLarge=0x0x321; etSmall=0x10
+  unsigned int word3 = 0x18304321;
+  assert (d.crate(word3) == 1);
+  assert (d.module(word3) == 8);
+  assert (d.column(word3) == 0);
+  assert (d.row(word3) == 3);
+  assert (d.thresholdsPassed(word3)    == (std::vector<unsigned>{}));
+  assert (d.fwdThresholdsPassed(word3) == (std::vector<unsigned>{}));
+  assert (d.etLarge(word3) == 0x321);
+  assert (d.etSmall(word3) == 0x10);
+  LVL1::CoordinateRange cr3 = d.coordinate(word3);
+  const double phi3 = 3*jemPhiSize + 4*jePhiSize;
+  FLOAT_EQassert (cr3.phi(), phi3);
+  FLOAT_EQassert (cr3.phiRange().min(), phi3-jePhiSize);
+  FLOAT_EQassert (cr3.phiRange().max(), phi3+jePhiSize);
+  FLOAT_EQassert (cr3.etaRange().min(), -4.9);
+  FLOAT_EQassert (cr3.etaRange().max(), -2.9);
+  FLOAT_EQassert (cr3.eta(), -3.9);
+
+  unsigned int word10 = 0x40241234;
+  assert (d.energyX(word10) == 0x1234);
+  assert (d.energyY(word10) == 0);
+  assert (d.energyT(word10) == 0);
+  assert (d.energyOverflow(word10) == false);
+  assert (d.mEtSigThresholdsPassed(word10) == (std::vector<unsigned>{3,6}));
+  assert (d.mEtSigThresholdPassed(word10, 2) == true);
+  assert (d.mEtSigThresholdPassed(word10, 5) == true);
+  assert (d.mEtSigThresholdPassed(word10, 4) == false);
+
+  unsigned int word11 = 0x6013d234;
+  assert (d.energyX(word11) == 0);
+  assert (d.energyY(word11) == -11724);
+  assert (d.energyT(word11) == 0);
+  assert (d.energyOverflow(word11) == true);
+  assert (d.etSumThresholdsPassed(word11) == (std::vector<unsigned>{1,2,5}));
+  assert (d.sumEtThresholdPassed(word11, 1) == true);
+  assert (d.sumEtThresholdPassed(word11, 2) == false);
+
+  unsigned int word12 = 0x50c2a856;
+  assert (d.energyX(word12) == 0);
+  assert (d.energyY(word12) == 0);
+  assert (d.energyT(word12) == 0x2856);
+  assert (d.energyOverflow(word12) == true);
+  assert (d.etMissThresholdsPassed(word12) == (std::vector<unsigned>{2,7,8}));
+  assert (d.etMissThresholdPassed(word12, 5) == false);
+  assert (d.etMissThresholdPassed(word12, 6) == true);
+}
+
+
+int main()
+{
+  std::cout << "JEPRoIDecoder_test\n";
+  test1();
+  return 0;
+}