diff --git a/Event/xAOD/xAODTrigger/Root/jFexSRJetRoI_v1.cxx b/Event/xAOD/xAODTrigger/Root/jFexSRJetRoI_v1.cxx
index 942e9767b7df7bc9e8eda893220887ce2ee0ea1d..3653194bb29d51b101252a5de3099049ad940069 100644
--- a/Event/xAOD/xAODTrigger/Root/jFexSRJetRoI_v1.cxx
+++ b/Event/xAOD/xAODTrigger/Root/jFexSRJetRoI_v1.cxx
@@ -18,7 +18,28 @@ namespace xAOD {
   const float jFexSRJetRoI_v1::s_towerEtaWidth = 0.1;
   const float jFexSRJetRoI_v1::s_towerPhiWidth = 0.1; 
   const float jFexSRJetRoI_v1::s_minEta = -4.9;   
-   
+
+
+  // globalEta/Phi calculation in the FCAL varies depending on position in eta space due to TT granularity change.
+  //| Region          |      eta region     | TT (eta x phi)
+  //---------------------------------------------------------
+  // Region 1  EMB    |      |eta| <  25    | (1 x 1)
+  // Region 2  EMIE   | 25 < |eta|< 31      | (2 x 2)
+  // Region 3  TRANS  | 31 < |eta| < 32     | (1 x 2)
+  // Region 4  FCAL   |      |eta| > 32     | (2 x 4)                 
+ 
+  //eta position in array for jfex module 0
+  const std::vector<int> jFexSRJetRoI_v1::s_EtaPosition_C_Side = {28, 36,   //Region 1 
+                                                                  25, 27,   //Region 2
+                                                                      24,   //Region 3
+                                                                  13, 23};  //Region 4
+  //eta position in array for jfex module 5
+  const std::vector<int> jFexSRJetRoI_v1::s_EtaPosition_A_Side = { 8, 16,   //Region 1 
+                                                                  17, 19,   //Region 2
+                                                                      20,   //Region 3
+                                                                  21, 31};  //Region 4
+
+
   jFexSRJetRoI_v1::jFexSRJetRoI_v1()
       : SG::AuxElement() {
    }
@@ -118,12 +139,37 @@ namespace xAOD {
   int jFexSRJetRoI_v1::unpackGlobalEta() const{
       
     int globalEta = 0;
+    
     if(jFexNumber()==0){
-        globalEta = -25+tobLocalEta(); //-25 is the minimum eta for the most granular part of module 0 - needs to be modified for the EMEC/HEC and FCAL
+      //Region 2 
+      if((s_EtaPosition_C_Side[2] <= tobLocalEta()) && (tobLocalEta() <=s_EtaPosition_C_Side[3])){
+	globalEta = 25 + (2*(tobLocalEta() -16));
+      }
+      //Region 3
+      if(s_EtaPosition_C_Side[5] == tobLocalEta()){
+	globalEta = 32;
+      }
+      //Region 4
+      if((s_EtaPosition_C_Side[6] <= tobLocalEta()) && (tobLocalEta() <=s_EtaPosition_C_Side[7])){
+	globalEta = 32 + (tobLocalEta()-20);
+      }
     }
-    else if(jFexNumber()==5){
-        globalEta = 16+tobLocalEta(); //16 is the minimum eta for the most granular part of module 5 - needs to be modified for the EMEC/HEC and FCAL
+
+    if(jFexNumber()==5){
+      //Region 2
+      if((s_EtaPosition_A_Side[2] <= tobLocalEta()) && (tobLocalEta() <=s_EtaPosition_A_Side[3])){
+        globalEta = -25 - (2*(tobLocalEta() -16));
+      }
+      //Region 3
+      if(s_EtaPosition_A_Side[5] == tobLocalEta()){
+        globalEta = -32;
+      }
+      //Region 4
+      if((s_EtaPosition_A_Side[6] <= tobLocalEta()) && (tobLocalEta() <=s_EtaPosition_A_Side[7])){
+        globalEta = -32 - (tobLocalEta()-20);
+      }
     }
+    //Region 1
     else{
         globalEta = tobLocalEta()+(8*(jFexNumber() - 3)) ;  // for module 1 to 4 
     }
@@ -131,8 +177,25 @@ namespace xAOD {
   }
 
   uint jFexSRJetRoI_v1::unpackGlobalPhi() const{
-     uint globalPhi = tobLocalPhi() + (fpgaNumber() * 16); 
-     return globalPhi; 
+    uint globalPhi = 0;
+    //16 is the phi height of an FPGA
+    if(jFexNumber()==0 || jFexNumber()==5){
+      //Region 2
+      if((s_EtaPosition_A_Side[2] <= tobLocalEta()) && (tobLocalEta() <=s_EtaPosition_A_Side[3])){
+        globalPhi = 16*fpgaNumber() + (2*(tobLocalPhi()-4));
+      }
+      //Region 3
+      if(s_EtaPosition_A_Side[5] == tobLocalEta()){
+        globalPhi = 16*fpgaNumber() + (2*(tobLocalPhi()-4));
+      }
+      //Region 4
+      if((s_EtaPosition_A_Side[6] <= tobLocalEta()) && (tobLocalEta() <=s_EtaPosition_A_Side[7])){
+        globalPhi = (16*fpgaNumber()) + (4*(tobLocalPhi() -2));
+      }
+    }
+    //Region 1
+    else{  globalPhi = tobLocalPhi() + (fpgaNumber() * 16);}
+    return globalPhi; 
   
   }
 } // namespace xAOD
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/jFexSRJetRoI_v1.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/jFexSRJetRoI_v1.h
index 7932c848d2c83abd5e9b008da38c0695d0a344c9..1b58531a1c2d5cce454d3d4c0062238d355df615 100644
--- a/Event/xAOD/xAODTrigger/xAODTrigger/versions/jFexSRJetRoI_v1.h
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/jFexSRJetRoI_v1.h
@@ -78,6 +78,8 @@ namespace xAOD {
       static const float s_towerEtaWidth;
       static const float s_towerPhiWidth;
       static const float s_minEta;
+      static const std::vector<int> s_EtaPosition_C_Side;
+      static const std::vector<int> s_EtaPosition_A_Side; 
 
 
       // Data locations within word 
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/FEXAlgoSpaceDefs.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/FEXAlgoSpaceDefs.h
index b34ccaeff5bb34379a1a234bce186f8ccfabdd06..c50e1cecac28fc1cac29347e1a5039f1ef05e064 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/FEXAlgoSpaceDefs.h
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/FEXAlgoSpaceDefs.h
@@ -25,7 +25,44 @@ namespace LVL1 {
 
     constexpr static int jFEX_wide_algoSpace_width = 45;
     constexpr static int jFEX_thin_algoSpace_width = 24;
-    constexpr static int jFEX_algoSpace_height = 32;
+    constexpr static int jFEX_algoSpace_height = 32; 
+ 
+//Array breakdown of jFEX_wide_algoSpace_width matric to indicate different eta and phi regions
+
+//A side (jFEX Module 5):
+
+    //Eta space for core area 
+    constexpr static int jFEX_algoSpace_A_EMB_eta = 8;
+    constexpr static int jFEX_algoSpace_A_EMIE_eta = 17;
+    constexpr static int jFEX_algoSpace_A_FCAL_start_eta = 21; 
+    constexpr static int jFEX_algoSpace_A_FCAL_end_eta = 33;
+ 
+    //Eta space for core and overlaps, EM only
+    constexpr static int jFEX_algoSpace_A_lowerEM_eta = 0;
+    constexpr static int jFEX_algoSpace_A_upperEM_eta = 32;
+
+//C side (jFEX module 0):
+//there are more values on the C side as the matrix cannot be flipped in the bitwise framework.
+
+   //Eta space for core area 
+    constexpr static int jFEX_algoSpace_C_EMB_start_eta = 28;
+    constexpr static int jFEX_algoSpace_C_EMB_end_eta = 37;
+    constexpr static int jFEX_algoSpace_C_EMIE_start_eta = 24;
+    constexpr static int jFEX_algoSpace_C_EMIE_end_eta = 28;
+    constexpr static int jFEX_algoSpace_C_FCAL_start_eta = 12;
+    constexpr static int jFEX_algoSpace_C_FCAL_end_eta = 24;
+ 
+   //Eta space for core and overlaps, EM only
+    constexpr static int jFEX_algoSpace_C_lowerEM_eta = 13;
+    constexpr static int jFEX_algoSpace_C_upperEM_eta = 45;
+
+//Phi space breakdown
+    constexpr static int jFEX_algoSpace_EMB_start_phi =  8;    
+    constexpr static int jFEX_algoSpace_EMB_end_phi  = 24; 
+    constexpr static int jFEX_algoSpace_EMIE_start_phi =  4;  
+    constexpr static int jFEX_algoSpace_EMIE_end_phi =  12;
+    constexpr static int jFEX_algoSpace_FCAL_start_phi =  2;
+    constexpr static int jFEX_algoSpace_FCAL_end_phi =  6;
   
   };
 
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXFPGA.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXFPGA.h
index 130cc10db9acb40221d9a00ae19cd02a168b6ed8..8848686d06dcaf6c3c8f2e7768c4551685a6fc41 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXFPGA.h
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXFPGA.h
@@ -23,11 +23,14 @@
 #include "L1CaloFEXToolInterfaces/IjFEXtauAlgo.h"
 #include "L1CaloFEXToolInterfaces/IjFEXsumETAlgo.h"
 #include "L1CaloFEXToolInterfaces/IjFEXmetAlgo.h"
+#include "L1CaloFEXToolInterfaces/IjFEXForwardJetsAlgo.h"
 #include "CaloEvent/CaloCellContainer.h"
 #include "CaloIdentifier/CaloIdManager.h"
 #include "CaloIdentifier/CaloCell_SuperCell_ID.h"
 #include "L1CaloFEXSim/jFEXOutputCollection.h"
 #include "L1CaloFEXSim/FEXAlgoSpaceDefs.h"
+#include "StoreGate/WriteHandle.h"
+#include "StoreGate/ReadHandle.h"
 
 namespace LVL1 {
   
@@ -99,24 +102,23 @@ namespace LVL1 {
     int m_jTowersIDs      [FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_thin_algoSpace_width] = {{0}};
     std::map<int,jTower> m_jTowersColl;
 
+    std::map<int, jFEXForwardJetsInfo> m_FCALJets; 
+
     CaloCellContainer m_sCellsCollection;
 
     SG::ReadHandleKey<LVL1::jTowerContainer> m_jFEXFPGA_jTowerContainerKey {this, "MyETowers", "jTowerContainer", "Input container for jTowers"};
 
-    SG::ReadHandleKey<jFEXOutputCollection> m_jFEXFPGA_jFEXOutputCollectionKey {this, "MyOutputs", "jFEXOutputCollection", "Input container for jFEXOutputCollection"};
+    SG::WriteHandleKey<LVL1::jFEXOutputCollection> m_jFEXFPGA_jFEXOutputCollectionKey {this, "jFEXOutputCollection", "jFEXOutputCollection", "Input container for jFEXOutputCollection"};
 
     ToolHandle<IjFEXSmallRJetAlgo> m_jFEXSmallRJetAlgoTool {this, "jFEXSmallRJetAlgoTool", "LVL1::jFEXSmallRJetAlgo", "Tool that runs the jFEX Small R Jet algorithm"};
     ToolHandle<IjFEXLargeRJetAlgo> m_jFEXLargeRJetAlgoTool {this, "jFEXLargeRJetAlgoTool", "LVL1::jFEXLargeRJetAlgo", "Tool that runs the jFEX Large R Jet algorithm"};
     ToolHandle<IjFEXtauAlgo> m_jFEXtauAlgoTool             {this, "jFEXtauAlgoTool"      , "LVL1::jFEXtauAlgo"      , "Tool that runs the jFEX tau algorithm"};
     ToolHandle<IjFEXsumETAlgo> m_jFEXsumETAlgoTool         {this, "jFEXsumETAlgoTool"    , "LVL1::jFEXsumETAlgo"    , "Tool that runs the jFEX sumET algorithm"};
     ToolHandle<IjFEXmetAlgo> m_jFEXmetAlgoTool             {this, "jFEXmetAlgoTool"      , "LVL1::jFEXmetAlgo"      , "Tool that runs the jFEX met algorithm"};
-    //ToolHandle<IjFEXegAlgo> m_jFEXegAlgoTool {this, "jFEXegAlgoTool", "LVL1::jFEXegAlgo", "Tool that runs the jFEX e/gamma algorithm"};
+    ToolHandle<IjFEXForwardJetsAlgo> m_jFEXForwardJetsAlgoTool {this, "jFEXForwardJetsAlgoTool"      , "LVL1::jFEXForwardJetsAlgo"      , "Tool that runs the jFEX FCAL Jets algorithm"};
     
   };
   
 } // end of namespace
 
-//CLASS_DEF( LVL1::jFEXFPGA , 136060357 , 1 )
-
-
 #endif
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXForwardJetsAlgo.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXForwardJetsAlgo.h
new file mode 100644
index 0000000000000000000000000000000000000000..1f2495f40f728bc8449d5c9008064ec1760e6436
--- /dev/null
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXForwardJetsAlgo.h
@@ -0,0 +1,63 @@
+/*
+ Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+//***************************************************************************
+//              jFEXForwardJetsAlgo - Algorithm for small R jet Algorithm in jFEX
+//                              -------------------
+//     begin                : 07 06 2021
+//     email                : varsiha.sothilingam@cern.ch
+//***************************************************************************
+
+#ifndef jFEXForwardJetsAlgo_H
+#define jFEXForwardJetsAlgo_H
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "L1CaloFEXToolInterfaces/IjFEXForwardJetsAlgo.h"
+#include "AthenaKernel/CLASS_DEF.h"
+//#include "L1CaloFEXSim/jFEXSmallRJetTOB.h"
+#include "L1CaloFEXSim/jTowerContainer.h"
+#include "L1CaloFEXSim/jFEXForwardJetsInfo.h"
+#include "L1CaloFEXSim/FEXAlgoSpaceDefs.h"
+#include "CaloEvent/CaloCellContainer.h"
+#include "CaloIdentifier/CaloIdManager.h" 
+#include "CaloIdentifier/CaloCell_SuperCell_ID.h"
+#include "AthenaBaseComps/AthAlgorithm.h" 
+#include "StoreGate/StoreGateSvc.h" 
+
+
+namespace LVL1 {
+
+  class jFEXForwardJetsAlgo : public AthAlgTool, virtual public IjFEXForwardJetsAlgo {
+
+  public:
+    /** Constructors */
+    jFEXForwardJetsAlgo(const std::string& type, const std::string& name, const IInterface* parent);
+   
+    /** standard Athena-Algorithm method */
+    virtual StatusCode initialize() override;
+
+    /** Destructor */
+    virtual ~jFEXForwardJetsAlgo();
+
+    virtual StatusCode safetyTest() override;
+
+    virtual void setup(int inputTable[FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width]) override;
+    //virtual int realValue(int ID, int eta) override;
+    virtual float globalPhi(int nphi, int neta) override;
+    virtual float globalEta(int nphi, int neta) override;   
+    virtual unsigned int localPhi(int nphi, int neta) override;
+    virtual unsigned int localEta(int nphi, int neta) override;
+    virtual unsigned int getTTowerET(int nphi, int neta) override; 
+
+    virtual std::map<int, jFEXForwardJetsInfo> FcalJetsTowerIDLists();
+    virtual std::map<int, jFEXForwardJetsInfo> isSeedLocalMaxima();    
+    virtual std::map<int, jFEXForwardJetsInfo> calculateJetETs();
+  protected:
+
+  private:
+        SG::ReadHandleKey<LVL1::jTowerContainer> m_jFEXForwardJetsAlgo_jTowerContainerKey {this, "MyjTowers", "jTowerContainer", "Input container for jTowers"};
+        int m_jFEXalgoTowerID[FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width];
+        bool m_storeEnergyRingTTIDs; 
+  };
+}//end of namespace
+#endif
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXForwardJetsInfo.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXForwardJetsInfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..5b3d0e2a25800d6ce8e3032ec9189227315d5d6b
--- /dev/null
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXForwardJetsInfo.h
@@ -0,0 +1,80 @@
+/*
+ Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+//***************************************************************************
+//              jFEXForwardJetsInfo - Class to store information about trigger towers
+//                                    in the fcal and associated jet information.
+//                              -------------------
+//     begin                : 07 07 2021
+//     email                : varsiha.sothilingam@cern.ch
+//***************************************************************************
+#ifndef jFEXForwardJetsInfo_H
+#define jFEXForwardJetsInfo_H
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "AthenaKernel/CLASS_DEF.h"
+#include "L1CaloFEXSim/jTowerContainer.h"
+#include "L1CaloFEXSim/FEXAlgoSpaceDefs.h"
+#include "CaloEvent/CaloCellContainer.h"
+#include "CaloIdentifier/CaloIdManager.h"
+#include "CaloIdentifier/CaloCell_SuperCell_ID.h"
+#include "AthenaBaseComps/AthAlgorithm.h"
+#include "StoreGate/StoreGateSvc.h"
+
+namespace LVL1 {
+  class jFEXForwardJetsInfo{
+
+  public:
+    void setCentreTTID(int TT_ID);
+    int getCentreTTID();
+
+    void setCentreTTEta(float centreTTEta);
+    float getCentreTTEta();
+
+    void setCentreTTPhi(float centreTTPhi);
+    float getCentreTTPhi();
+
+    void  setCentreLocalTTEta(float centreLocalTTEta);
+    float getCentreLocalTTEta();
+    void  setCentreLocalTTPhi(float centreLocalTTPhi);
+    float getCentreLocalTTPhi();
+
+    void  includeTTinSeed(int TT_ID);
+    std::vector<int> getTTinSeed();
+
+    void addToSeedET(int seed_ET);
+    int getSeedET();
+
+    void addToFirstEnergyRingET(int firstER_ET);
+    int getFirstEnergyRingET();   
+
+    void includeTTIDinFirstER(int firstER_TTID);
+    std::vector<int> getTTIDinFirstER();
+
+    void addToSecondEnergyRingET(int secondER_ET);
+    int getSecondEnergyRingET();  
+
+    void includeTTIDinSecondER(int secondER_TTID);
+    std::vector<int> getTTIDinSecondER();
+  
+  private:
+    int m_centre_TTID;
+    float m_centreTTPhi;
+    float m_centreTTEta;
+
+    int m_centreLocalTTPhi;
+    int m_centreLocalTTEta;
+
+    int m_seed_ET =0;
+    int m_firstEnergyRing_ET =0;
+    int m_secondEnergyRing_ET =0;
+    std::vector<int> m_TTsInSeed ={};
+    std::vector<int> m_firstEnergyRing_TTIDs = {};
+    std::vector<int> m_secondEnergyRing_TTIDs = {};
+
+  };
+
+
+
+}//end of namespace
+#endif
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXNtupleWriter.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXNtupleWriter.h
index 97e20718f98885297a9ea3d26200a14abdbecae4..3d8375a5551239d5c75ac939f0a775361e0ec804 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXNtupleWriter.h
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXNtupleWriter.h
@@ -47,7 +47,10 @@ private:
   std::vector<int> m_smallRJetTOB_phi;
   std::vector<int> m_smallRJetTOB_ET;
   std::vector<int> m_smallRJetTOB_sat;
-  
+  std::vector<int> m_smallRJetTOB_word;
+  std::vector<int> m_smallRJetTOB_jfexID;
+  std::vector<int> m_smallRJetTOB_fpgaID;
+
   std::vector<int> m_largeRJet_eta;
   std::vector<int> m_largeRJet_phi;  
   std::vector<int> m_largeRJet_ET;
@@ -57,6 +60,9 @@ private:
   std::vector<int> m_largeRJetTOB_eta;
   std::vector<int> m_largeRJetTOB_phi;
   std::vector<int> m_largeRJetTOB_sat;
+  std::vector<int> m_largeRJetTOB_word;
+  std::vector<int> m_largeRJetTOB_jfexID;
+  std::vector<int> m_largeRJetTOB_fpgaID;
 
   std::vector<int> m_tau_isLocalMax;
   std::vector<int> m_tau_TT_ID;
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXOutputCollection.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXOutputCollection.h
index ece6322512b43eb90acae6d5822deaa6353ac309..2ec6acfd23f02d046a3a4ea8143f76b9dd00cee4 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXOutputCollection.h
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXOutputCollection.h
@@ -14,6 +14,7 @@
 #define JFEX_OUTPUT_COLLECTION_H
 
 #include "AthenaKernel/CLASS_DEF.h"
+#include "StoreGate/StoreGateSvc.h"
 #include <map>
 #include <iostream>
 #include <vector>
@@ -26,24 +27,24 @@ namespace LVL1 {
     jFEXOutputCollection() {};
     ~jFEXOutputCollection();
     void clear();
-    void addValue_smallRJet(std::string, float);
+    void addValue_smallRJet(std::string, int);
     void fill_smallRJet();
-    void addValue_largeRJet(std::string, float);
+    void addValue_largeRJet(std::string, int);
     void fill_largeRJet();
     void addValue_tau(std::string, int);
     void fill_tau();
     int SRsize();
     int LRsize();
     int tausize();
-    std::map<std::string, float>* get_smallRJet(int);
-    std::map<std::string, float>* get_largeRJet(int);
+    std::map<std::string, int>* get_smallRJet(int);
+    std::map<std::string, int>* get_largeRJet(int);
     std::map<std::string, int>* get_tau(int);
 
   private:
-    std::map<std::string, float> m_values_tem_smallRJet;
-    std::vector<std::map<std::string, float>*> m_allvalues_smallRJet;
-    std::map<std::string, float> m_values_tem_largeRJet;
-    std::vector<std::map<std::string, float>*> m_allvalues_largeRJet;
+    std::map<std::string, int> m_values_tem_smallRJet;
+    std::vector<std::map<std::string, int>*> m_allvalues_smallRJet;
+    std::map<std::string, int> m_values_tem_largeRJet;
+    std::vector<std::map<std::string, int>*> m_allvalues_largeRJet;
     std::map<std::string, int> m_values_tem_tau;
     std::vector<std::map<std::string, int>*> m_allvalues_tau;
   };
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXSmallRJetAlgo.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXSmallRJetAlgo.h
index 97636895b9894d969c2c5af4efad46f8164185c6..22af33267db2b50918f146dee0d64d3f191c16c4 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXSmallRJetAlgo.h
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXSmallRJetAlgo.h
@@ -39,7 +39,7 @@ namespace LVL1 {
     virtual ~jFEXSmallRJetAlgo();
 
     virtual StatusCode safetyTest() override;
-    virtual void setup(int inputTable[7][7], bool barrel_region) override;
+    virtual void setup(int inputTable[7][7]) override;
     virtual int realValue(int ID, int eta) override;
     virtual unsigned int getRealPhi() override;
     virtual int getRealEta() override;   
@@ -48,6 +48,7 @@ namespace LVL1 {
     virtual bool isSeedLocalMaxima() override; 
     virtual unsigned int getSmallClusterET() override;
     virtual unsigned int getSmallETRing() override;
+    virtual bool checkDisplacedLM() override;
     virtual std::unique_ptr<jFEXSmallRJetTOB> getSmallRJetTOBs() override;
   //  virtual jFEXSmallRJetTOB* getSmallRJetTOBs() override;
 //LVL1::jFEXSmallRJetAlgoTOB * LVL1::jFEXSmallRJetAlgo::getSmallRJetTOB()
@@ -59,7 +60,7 @@ protected:
         int m_jFEXalgoTowerID[7][7];
         int m_jFEXalgoSearchWindowSeedET[5][5];
 	bool m_seedSet;
-        bool m_barrel_region;
+        bool m_LMDisplaced;
   };
 
 
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jTower.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jTower.h
index e1814c2a5bc1e1492caae00fcfd30f248fad4b35..b6196d0aba84bf86e2afa4459c9aa0b7eecf21cb 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jTower.h
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jTower.h
@@ -43,7 +43,7 @@ namespace LVL1 {
     
     /** Constructors */
     jTower();
-    jTower(float eta, float phi, int eta_modifier_input, int id_modifier, int posneg, float centre_eta = 0.0, float centre_phi = 0.0, int fcal_layer = -1);
+    jTower(float eta, float phi, int eta_modifier_input, int id_modifier, int posneg, float centre_eta = -1.0, float centre_phi = -1.0, int fcal_layer = -1);
     
     /** Destructor */
     virtual ~jTower() = default;
@@ -136,8 +136,8 @@ namespace LVL1 {
     float m_phi;
     int m_tower_id;
     int m_posneg = 0;
-    float m_centre_eta;
-    float m_centre_phi;
+    float m_centre_eta =0;
+    float m_centre_phi =0;
     std::vector<Identifier> m_EM_scID;
     std::vector<Identifier> m_HAD_scID;
     std::vector<int> m_et;    
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jTowerBuilder.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jTowerBuilder.h
index 0fdc5fa7f5302346b622644e1d9ba9c0bcfd33d8..74573bb1dc7b67790c4f6bc147d378ddfd41e7be 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jTowerBuilder.h
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jTowerBuilder.h
@@ -32,7 +32,6 @@ class jTowerBuilder: public AthAlgTool, virtual public IjTowerBuilder {
   virtual void reset() override ;
 
  private:
-
   virtual void BuildEMBjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const override ;
   virtual void BuildTRANSjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const override ;
   virtual void BuildEMEjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const override ;
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/jFEXDriverJobOptions.py b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/jFEXDriverJobOptions.py
index af02440e3050a29493e0e24f3d7467d1b5107eaa..1d93f7c0696fff2fa8e7df82a7d16b064ed5c91a 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/jFEXDriverJobOptions.py
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/jFEXDriverJobOptions.py
@@ -65,11 +65,10 @@ xaodStream.AddItem( ["xAOD::jFexSumETRoIAuxContainer"] )
 xaodStream.AddItem( ["xAOD::jFexMETRoIContainer"] )
 xaodStream.AddItem( ["xAOD::jFexMETRoIAuxContainer"] )
 
-
 #######################################################
 log.info("==========================================================")
 log.info("Scheduling jFEXDriver")
 athAlgSeq += CfgMgr.LVL1__jFEXDriver('MyjFEXDriver')
-athAlgSeq += CfgMgr.LVL1__jFEXNtupleWriter('MyjFEXNtupleWriter')
+#athAlgSeq += CfgMgr.LVL1__jFEXNtupleWriter('MyjFEXNtupleWriter')
 log.info("==========================================================")
 #######################################################
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx
index 27e2f9a8a3685c99c6b75357f115c188c75987d6..10810af1385ceeb533c405b0a8a3ce7550c37fbb 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx
@@ -20,6 +20,7 @@
 #include "L1CaloFEXSim/jFEXsumETAlgo.h"
 #include "L1CaloFEXSim/jFEXmetAlgo.h"
 #include "L1CaloFEXSim/jFEXLargeRJetAlgo.h"
+#include "L1CaloFEXSim/jFEXForwardJetsAlgo.h"
 #include "L1CaloFEXSim/jFEXNtupleWriter.h"
 #include "L1CaloFEXSim/eFEXFPGATowerIdProvider.h"
 #include "L1CaloFEXSim/eFEXSuperCellTowerIdProvider.h"
@@ -55,4 +56,5 @@ DECLARE_COMPONENT(jFEXtauAlgo)
 DECLARE_COMPONENT(jFEXsumETAlgo)
 DECLARE_COMPONENT(jFEXmetAlgo)
 DECLARE_COMPONENT(jFEXLargeRJetAlgo)
+DECLARE_COMPONENT(jFEXForwardJetsAlgo)
 DECLARE_COMPONENT(jFEXNtupleWriter)
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXFPGA.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXFPGA.cxx
index 87cefd7d6fbfd703b906a9155040ac507297a2e4..b420cf33c7f1c07c87fcb6c1f413f86b76fe05bb 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXFPGA.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXFPGA.cxx
@@ -23,6 +23,8 @@
 #include "L1CaloFEXSim/jFEXsumETTOB.h"  
 #include "L1CaloFEXSim/jFEXmetAlgo.h" 
 #include "L1CaloFEXSim/jFEXmetTOB.h"  
+#include "L1CaloFEXSim/jFEXForwardJetsAlgo.h"
+#include "L1CaloFEXSim/jFEXForwardJetsInfo.h"
 #include "CaloEvent/CaloCellContainer.h"
 #include "CaloIdentifier/CaloIdManager.h"
 #include "CaloIdentifier/CaloCell_SuperCell_ID.h"
@@ -47,7 +49,6 @@ jFEXFPGA::jFEXFPGA(const std::string& type,const std::string& name,const IInterf
   declareInterface<IjFEXFPGA>(this);
 }
 
-
 /** Destructor */
 jFEXFPGA::~jFEXFPGA()
 {
@@ -59,11 +60,10 @@ StatusCode jFEXFPGA::initialize()
 {
 
   ATH_CHECK(m_jFEXFPGA_jTowerContainerKey.initialize());
-  //ATH_CHECK(m_jFEXFPGA_jFEXOutputCollectionKey.initialize());
+  ATH_CHECK(m_jFEXFPGA_jFEXOutputCollectionKey.initialize());
   return StatusCode::SUCCESS;
 }
 
-
 StatusCode jFEXFPGA::init(int id, int jfexid)
 {
   m_id = id;
@@ -92,8 +92,7 @@ StatusCode jFEXFPGA::execute() {
     ATH_MSG_FATAL("Could not retrieve jk_jFEXFPGA_jTowerContainer " << m_jFEXFPGA_jTowerContainerKey.key() );
     return StatusCode::FAILURE;
   }
-  
-    
+   
     //std::cout<< "******************************************** "<<m_jfexid<<std::endl;
     if(m_id==0 || m_id==2){
         if(m_jfexid > 0 && m_jfexid < 5){
@@ -154,8 +153,9 @@ StatusCode jFEXFPGA::execute() {
     }
   
 
-  //-----------jFEXSmallRJetAlgo-----------------
+  //-----------jFEXSmallRJet & Large R Jet Algo-----------------
   ATH_MSG_DEBUG("==== jFEXSmallRJetAlgo ========");
+
   jFEXOutputCollection* jFEXOutputs;
   StatusCode sc_tobs = evtStore()->retrieve(jFEXOutputs, "jFEXOutputCollection");
 
@@ -163,29 +163,16 @@ StatusCode jFEXFPGA::execute() {
     ATH_MSG_DEBUG("\n==== jFEXSmallRJetAlgo ======== Failed to find jFEXOutputCollection in jFEXFPGA");
   }
 
-  int Jets_eta_limit = -99;
-  bool barrel_region = false;
- 
-  if(m_jfexid > 0 && m_jfexid < 5){
-    Jets_eta_limit = FEXAlgoSpaceDefs::jFEX_thin_algoSpace_width -8;
-    barrel_region = true;
-    //return StatusCode::SUCCESS;
-  }
-
-  if(m_jfexid == 0 || m_jfexid == 5){
-    Jets_eta_limit = FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width -8;
-    return StatusCode::SUCCESS;
-  }
+ //Central region algorithms
+ if(m_jfexid > 0 && m_jfexid < 5){ 
+  for(int mphi = 8; mphi < FEXAlgoSpaceDefs::jFEX_algoSpace_height -8; mphi++) {   
+    for(int meta = 8; meta < FEXAlgoSpaceDefs::jFEX_thin_algoSpace_width -8; meta++) {
   
-  for(int mphi = 8; mphi < 24; mphi++) {   
-    for(int meta = 8; meta < Jets_eta_limit; meta++) {
-
     //create search window including towerIDs required for seeding.
     int SRJet_SearchWindow[7][7] = {{0}};
     for(int i = -3 ; i <4; i++){
       for(int j = -3; j <4; j++){
-        if(barrel_region){SRJet_SearchWindow[3 + i][3 + j] = m_jTowersIDs_Thin[mphi + i][meta +j];}
-        else{SRJet_SearchWindow[3 + i][3 + j] = m_jTowersIDs_Wide[mphi + i][meta +j];}
+        SRJet_SearchWindow[3 + i][3 + j] = m_jTowersIDs_Thin[mphi + i][meta +j];
       }
     }
       int largeRCluster_IDs[15][15]= {{0}};
@@ -194,6 +181,7 @@ StatusCode jFEXFPGA::execute() {
           largeRCluster_IDs[7 +i][7 +j] = m_jTowersIDs_Thin[mphi + i][meta +j];
         }
       }
+
       //remove corners from large ET ring
       for(int i =4; i <8; i++) {
         if( i != 7) {
@@ -222,64 +210,175 @@ StatusCode jFEXFPGA::execute() {
         }
       }
 
-      m_jFEXSmallRJetAlgoTool->setup(SRJet_SearchWindow, barrel_region);
+      m_jFEXSmallRJetAlgoTool->setup(SRJet_SearchWindow);
       m_jFEXLargeRJetAlgoTool->setupCluster(largeRCluster_IDs);
       m_jFEXSmallRJetAlgoTool->buildSeeds();
-      bool SRJet_LM = m_jFEXSmallRJetAlgoTool->isSeedLocalMaxima();
+      bool SRJet_LM = m_jFEXSmallRJetAlgoTool->isSeedLocalMaxima(); 
+
       jFEXOutputs->addValue_smallRJet("smallRJet_isCentralTowerSeed", SRJet_LM);
-      if(!SRJet_LM){continue;}
-      int smallClusterET = m_jFEXSmallRJetAlgoTool->getSmallClusterET();
-      
+     
+      int smallClusterET = m_jFEXSmallRJetAlgoTool->getSmallClusterET();      
       //These are plots of the central TT for each 5x5 search window.
       jFEXOutputs->addValue_smallRJet("smallRJet_ET", m_jFEXSmallRJetAlgoTool->getTTowerET());
-      jFEXOutputs->addValue_smallRJet("smallRJet_phi",m_jFEXSmallRJetAlgoTool->getRealPhi()/10.);
-      jFEXOutputs->addValue_smallRJet("smallRJet_eta",m_jFEXSmallRJetAlgoTool->getRealEta()/10.);
+      jFEXOutputs->addValue_smallRJet("smallRJet_phi",m_jFEXSmallRJetAlgoTool->getRealPhi());
+      jFEXOutputs->addValue_smallRJet("smallRJet_eta",m_jFEXSmallRJetAlgoTool->getRealEta());
       jFEXOutputs->addValue_smallRJet("smallRJet_clusterET", smallClusterET);
+  
+    
+      if(!SRJet_LM){continue;}
       std::unique_ptr<jFEXSmallRJetTOB> tmp_SRJet_tob = m_jFEXSmallRJetAlgoTool->getSmallRJetTOBs();
-        
-      bool SR_TOB_saturated = false;
-          
-      // for plotting variables in TOBS- internal check:
 
-      jFEXOutputs->addValue_smallRJet("smallRJetTOB_eta", tmp_SRJet_tob->setEta(meta));
-      jFEXOutputs->addValue_smallRJet("smallRJetTOB_phi", tmp_SRJet_tob->setPhi(mphi));
-      jFEXOutputs->addValue_smallRJet("smallRJetTOB_ET", tmp_SRJet_tob->setET(smallClusterET));    
-      jFEXOutputs->addValue_smallRJet("smallRJetTOB_sat", tmp_SRJet_tob->setSat(SR_TOB_saturated));  
+      bool check = m_jFEXSmallRJetAlgoTool->checkDisplacedLM();
+      //to check if Local Maxima is displaced.        
+      int meta_LM = meta;
+      int mphi_LM = mphi;
+      if(check  && SRJet_LM){
+          meta_LM = meta -1;
+          mphi_LM = mphi -1;
+      
+      } 
 
- 
-      uint32_t SRJet_tobword = formSmallRJetTOB(mphi, meta);
+      bool SR_TOB_saturated = false;
+      if (smallClusterET/200. > 0x7ff) SR_TOB_saturated = true;
 
-      if ( SRJet_tobword != 0 ) m_SRJet_tobwords.push_back(SRJet_tobword);
-          
+      // for plotting variables in TOBS- internal check:
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_eta", tmp_SRJet_tob->setEta(meta_LM)-8);
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_phi", tmp_SRJet_tob->setPhi(mphi_LM)-8);
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_ET", tmp_SRJet_tob->setET(smallClusterET/200));    
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_sat", tmp_SRJet_tob->setSat(SR_TOB_saturated));  
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_jfexID", m_jfexid);
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_fpgaID", m_id);
+
+      uint32_t SRJet_tobword = formSmallRJetTOB(mphi_LM, meta_LM);
+      m_SRJet_tobwords.push_back(SRJet_tobword);
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_word",SRJet_tobword); 
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_jfexID", m_jfexid);
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_fpgaID", m_id);	
+     
       jFEXOutputs->fill_smallRJet();  
 
       ATH_MSG_DEBUG("==== jFEXLargeRJetAlgo ========"); 
       //LargeRJetAlgo is here as SmallRJetlocalMaxima is a requirement
       unsigned int largeClusterET = m_jFEXLargeRJetAlgoTool->getLargeClusterET(m_jFEXSmallRJetAlgoTool->getSmallClusterET(),m_jFEXLargeRJetAlgoTool->getRingET());
-      ATH_MSG_DEBUG("jFEXFPGA: large RJet algo, check large cluster ET: "<< largeClusterET); 
-      jFEXOutputs->addValue_largeRJet("largeRJet_ET", largeClusterET);
-
       std::unique_ptr<jFEXLargeRJetTOB> tmp_LRJet_tob = m_jFEXLargeRJetAlgoTool->getLargeRJetTOBs();
       unsigned int LR_TOB_saturated = 0;
-      if (largeClusterET/200. > 13) LR_TOB_saturated = 1;
+      if (largeClusterET/200. >  0x1fff) LR_TOB_saturated = 1;
  
       jFEXOutputs->addValue_largeRJet("largeRJet_ET", largeClusterET);
       jFEXOutputs->addValue_largeRJet("largeRJet_phi", m_jFEXSmallRJetAlgoTool->getRealPhi());
       jFEXOutputs->addValue_largeRJet("largeRJet_eta", m_jFEXSmallRJetAlgoTool->getRealEta());
 
-      jFEXOutputs->addValue_largeRJet("largeRJetTOB_ET",tmp_LRJet_tob->setET(largeClusterET)); 
-      jFEXOutputs->addValue_largeRJet("largeRJetTOB_eta",tmp_LRJet_tob->setEta(meta));
-      jFEXOutputs->addValue_largeRJet("largeRJetTOB_phi",tmp_LRJet_tob->setPhi(mphi));
+      jFEXOutputs->addValue_largeRJet("largeRJetTOB_ET",tmp_LRJet_tob->setET(largeClusterET/200)); 
+      jFEXOutputs->addValue_largeRJet("largeRJetTOB_eta",tmp_SRJet_tob->setEta(meta));
+      jFEXOutputs->addValue_largeRJet("largeRJetTOB_phi",tmp_SRJet_tob->setPhi(mphi));
       jFEXOutputs->addValue_largeRJet("largeRJetTOB_sat",tmp_LRJet_tob->setSat(LR_TOB_saturated));
-
-      jFEXOutputs->fill_largeRJet();
-
+      jFEXOutputs->fill_largeRJet(); 
       uint32_t LRJet_tobword = formLargeRJetTOB(mphi, meta);
       if ( LRJet_tobword != 0 ) m_LRJet_tobwords.push_back(LRJet_tobword);
-
+      m_SRJet_tobwords.push_back(SRJet_tobword);
+      jFEXOutputs->addValue_largeRJet("largeRJetTOB_word", LRJet_tobword);
+      jFEXOutputs->addValue_largeRJet("largeRJetTOB_jfexID", m_jfexid);
+      jFEXOutputs->addValue_largeRJet("largeRJetTOB_fpgaID", m_id);
       }
   }
+} //end of if statement for checking if in central jfex modules
+
+jFEXOutputs->fill_smallRJet();
+jFEXOutputs->fill_largeRJet();
+
+//**********Forward Jets***********************
+
+//FCAL region algorithm 
+if(m_jfexid ==0 || m_jfexid ==5){
+//This is currently masked due to on going debugging in this FCAL Jets Algorithm
+  return StatusCode::SUCCESS;
+
+  m_jFEXForwardJetsAlgoTool->setup(m_jTowersIDs_Wide);
+  m_FCALJets =  m_jFEXForwardJetsAlgoTool->calculateJetETs();
+
+  for(std::map<int, jFEXForwardJetsInfo>::iterator it = m_FCALJets.begin(); it!=(m_FCALJets.end()); ++it){
+   
+    jFEXForwardJetsInfo FCALJets = it->second;
+    int iphi = FCALJets.getCentreLocalTTPhi();
+    int ieta = FCALJets.getCentreLocalTTEta();
+     
+    uint32_t SRFCAL_Jet_tobword = formSmallRJetTOB(iphi, ieta);
+    if ( SRFCAL_Jet_tobword != 0 ) m_SRJet_tobwords.push_back(SRFCAL_Jet_tobword);
 
+    uint32_t LRFCAL_Jet_tobword = formLargeRJetTOB(iphi, ieta);
+    if ( LRFCAL_Jet_tobword != 0 ) m_LRJet_tobwords.push_back(LRFCAL_Jet_tobword);
+  
+    float centre_eta = std::round(FCALJets.getCentreTTEta()*10);
+    float centre_phi = std::round(FCALJets.getCentreTTPhi()*10);
+    int output_centre_eta = static_cast<int> (centre_eta);
+    int output_centre_phi = static_cast<int> (centre_phi);
+    int SRJetET = FCALJets.getSeedET() + FCALJets.getFirstEnergyRingET();
+    int LRJetET = SRJetET + FCALJets.getSecondEnergyRingET();
+
+    int SRFCAL_TOB_saturated = 0;
+    if (SRJetET/200. > 0x7ff) SRFCAL_TOB_saturated = 1;
+
+    unsigned int LRFCAL_TOB_saturated = 0;
+    if (LRJetET/200. >  0x1fff) LRFCAL_TOB_saturated = 1;
+   
+    //Output Collection for Small R Jet 
+    jFEXOutputs->addValue_smallRJet("smallRJet_phi", output_centre_phi);
+    jFEXOutputs->addValue_smallRJet("smallRJet_eta", output_centre_eta);
+    jFEXOutputs->addValue_smallRJet("smallRJet_clusterET", SRJetET);
+    jFEXOutputs->addValue_smallRJet("smallRJet_sat", SRFCAL_TOB_saturated);
+    jFEXOutputs->addValue_smallRJet("smallRJet_isCentralTowerSeed",true);
+
+    if(m_jfexid == 0){
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_eta", 37-ieta);
+      jFEXOutputs->addValue_largeRJet("largeRJetTOB_eta", 37-ieta);
+    }
+
+    if(m_jfexid == 5){     
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_eta", ieta-8);
+      jFEXOutputs->addValue_largeRJet("largeRJetTOB_eta", ieta-8);
+    }
+ 
+    if(iphi >=FEXAlgoSpaceDefs::jFEX_algoSpace_EMB_start_phi && iphi< FEXAlgoSpaceDefs::jFEX_algoSpace_EMB_end_phi){
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_phi", iphi-8);
+      jFEXOutputs->addValue_largeRJet("largeRJetTOB_phi", iphi-8);
+    }
+
+    if(iphi >=FEXAlgoSpaceDefs::jFEX_algoSpace_EMIE_start_phi && iphi< FEXAlgoSpaceDefs::jFEX_algoSpace_EMIE_end_phi){
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_phi", iphi-4);
+      jFEXOutputs->addValue_largeRJet("largeRJetTOB_phi", iphi-4);
+    }
+
+    if(iphi >=FEXAlgoSpaceDefs::jFEX_algoSpace_FCAL_start_phi && iphi< FEXAlgoSpaceDefs::jFEX_algoSpace_FCAL_end_phi){
+      jFEXOutputs->addValue_smallRJet("smallRJetTOB_phi", iphi-2);
+      jFEXOutputs->addValue_largeRJet("largeRJetTOB_phi", iphi-2);
+    }
+
+    jFEXOutputs->addValue_smallRJet("smallRJetTOB_ET", SRJetET/200);
+    jFEXOutputs->addValue_smallRJet("smallRJetTOB_sat", SRFCAL_TOB_saturated);
+ 
+    jFEXOutputs->addValue_smallRJet("smallRJetTOB_word", SRFCAL_Jet_tobword);
+    jFEXOutputs->addValue_smallRJet("smallRJetTOB_jfexID", m_jfexid);
+    jFEXOutputs->addValue_smallRJet("smallRJetTOB_fpgaID", m_id);
+
+    jFEXOutputs->fill_smallRJet();
+
+    //Output Collection for Large R Jet
+    jFEXOutputs->addValue_largeRJet("largeRJet_ET", LRJetET);
+    jFEXOutputs->addValue_largeRJet("largeRJet_phi", output_centre_phi);
+    jFEXOutputs->addValue_largeRJet("largeRJet_eta", output_centre_eta);
+    jFEXOutputs->addValue_largeRJet("largeRJet_sat", LRFCAL_TOB_saturated);
+
+    jFEXOutputs->addValue_largeRJet("largeRJetTOB_ET", LRJetET/200);
+    jFEXOutputs->addValue_largeRJet("largeRJetTOB_sat",LRFCAL_TOB_saturated);
+
+    jFEXOutputs->addValue_largeRJet("largeRJetTOB_word", LRFCAL_Jet_tobword);
+    jFEXOutputs->addValue_largeRJet("largeRJetTOB_jfexID", m_jfexid);
+    jFEXOutputs->addValue_largeRJet("largeRJetTOB_fpgaID", m_id);
+
+    jFEXOutputs->fill_largeRJet();
+
+  }
+}
 
 //******************************** TAU **********************************************
 
@@ -315,8 +414,7 @@ StatusCode jFEXFPGA::execute() {
   ATH_MSG_DEBUG("============================ jFEXtauAlgo ============================");
   for(int mphi = 8; mphi < 24; mphi++) {   
     for(int meta = 8; meta < max_meta; meta++) {
-        
-
+    
       int TT_seed_ID[3][3]={{0}};
       int TT_searchWindow_ID[5][5]={{0}};
       int TT_First_ETring[36]={0};
@@ -338,17 +436,14 @@ StatusCode jFEXFPGA::execute() {
               } 
           }
       }
-
       
       ATH_CHECK( m_jFEXtauAlgoTool.retrieve());
       ATH_CHECK( m_jFEXtauAlgoTool->safetyTest());
       m_jFEXtauAlgoTool->setup(TT_searchWindow_ID,TT_seed_ID);
       m_jFEXtauAlgoTool->buildSeeds();
       bool is_tau_LocalMax = m_jFEXtauAlgoTool->isSeedLocalMaxima();
-      //m_jFEXtauAlgoTool->isSeedLocalMaxima();
       m_jFEXtauAlgoTool->setFirstEtRing(TT_First_ETring);
 
-
       jFEXOutputs->addValue_tau("tau_ET", m_jFEXtauAlgoTool->getTTowerET());
       jFEXOutputs->addValue_tau("tau_clusterET", m_jFEXtauAlgoTool->getClusterEt());
       jFEXOutputs->addValue_tau("tau_eta",abs(m_jFEXtauAlgoTool->getRealEta())) ;
@@ -377,6 +472,8 @@ StatusCode jFEXFPGA::execute() {
       jFEXOutputs->fill_tau();
     }
   }
+
+
   return StatusCode::SUCCESS;
 } //end of the execute function
 
@@ -407,10 +504,7 @@ void jFEXFPGA::SetTowersAndCells_SG(int tmp_jTowersIDs_subset[][FEXAlgoSpaceDefs
   
   //this prints out the jTower IDs that each FPGA is responsible for
   ATH_MSG_DEBUG("\n==== jFEXFPGA ========= FPGA (" << m_id << ") [on jFEX " << m_jfexid << "] IS RESPONSIBLE FOR jTOWERS :");
-  
-  //comment below due to mapping bug 12.01.21 
-  
-  
+   
   for (int thisRow=rows-1; thisRow>=0; thisRow--){
     for (int thisCol=0; thisCol<cols; thisCol++){
       if(thisCol != cols-1){ ATH_MSG_DEBUG("|  " << m_jTowersIDs_Thin[thisRow][thisCol] << "  "); }
@@ -446,25 +540,37 @@ std::vector <uint32_t> jFEXFPGA::getLargeRJetTOBs()
   
 }
 
-
-
-uint32_t jFEXFPGA::formSmallRJetTOB(int & iphi, int &ieta )  
+uint32_t jFEXFPGA::formSmallRJetTOB(int &iphi, int &ieta)  
 {
   uint32_t tobWord = 0;
   const unsigned int jFEXETResolution = 200; //LSB is 200MeV
+  int eta = 0;
+  int phi = 0;
+  unsigned int et = 0;
+  unsigned int jFEXSmallRJetTOBEt = 0;
+  int Res = 0; // 11 bits reserved
+  int Sat = 0; //  1 bit for saturation. Set to 1 when jet energy is saturated
 
-  unsigned int et = m_jFEXSmallRJetAlgoTool->getSmallClusterET();   
-  unsigned int jFEXSmallRJetTOBEt = et/jFEXETResolution;
+  if(m_jfexid > 0 && m_jfexid < 5){
+  et = m_jFEXSmallRJetAlgoTool->getSmallClusterET();
+  jFEXSmallRJetTOBEt = et/jFEXETResolution;
+  eta = ieta -8;
+  phi = iphi -8;
+  }
 
-  int eta = ieta -8;
-  int phi = iphi -8;
-  int Res = 0; //11 bits reserved
-  int Sat = 0; //1 bit for saturation. Set to 1 if saturated.
-  
+  if(m_jfexid ==0 || m_jfexid ==5){
+    for(std::map<int, jFEXForwardJetsInfo>::iterator it = m_FCALJets.begin(); it!=(m_FCALJets.end()); ++it){
+      jFEXForwardJetsInfo FCALJetInfo = it->second;
+      eta = ieta -8;
+      phi = iphi -8;
+      et = FCALJetInfo.getSeedET() + FCALJetInfo.getFirstEnergyRingET();
+      jFEXSmallRJetTOBEt = et/jFEXETResolution;
+    }  
+  }
 
   if (jFEXSmallRJetTOBEt > 0x7ff){ 
-    jFEXSmallRJetTOBEt = 0x7ff;//0x7ff is 11 bits 
-    Sat = 1;
+      jFEXSmallRJetTOBEt = 0x7ff; 
+      Sat = 1;
   }
 
   //create basic tobword with 32 bits  
@@ -477,18 +583,34 @@ uint32_t jFEXFPGA::formSmallRJetTOB(int & iphi, int &ieta )
   else return tobWord;
 }
 
-uint32_t jFEXFPGA::formLargeRJetTOB(int & iphi, int &ieta )
+uint32_t jFEXFPGA::formLargeRJetTOB(int & iphi, int &ieta)
 {
   uint32_t tobWord = 0;
   const unsigned int jFEXETResolution = 200; //LSB is 200MeV
+  int eta = 0;
+  int phi = 0;
+  unsigned int et = 0;
+  unsigned int jFEXLargeRJetTOBEt = 0;
+  int Res = 0; // 9 bits reserved
+  int Sat = 0; //  1 bit for saturation. Set to 1 when jet energy is saturated
 
-  unsigned int et = m_jFEXLargeRJetAlgoTool->getLargeClusterET(m_jFEXSmallRJetAlgoTool->getSmallClusterET(),m_jFEXLargeRJetAlgoTool->getRingET());
-  unsigned int jFEXLargeRJetTOBEt = et/jFEXETResolution;
+  if(m_jfexid > 0 && m_jfexid < 5){
+    et = m_jFEXLargeRJetAlgoTool->getLargeClusterET(m_jFEXSmallRJetAlgoTool->getSmallClusterET(),m_jFEXLargeRJetAlgoTool->getRingET());
+    jFEXLargeRJetTOBEt = et/jFEXETResolution;
+    eta = ieta -8;
+    phi = iphi -8;
+  }
+
+  if(m_jfexid ==0 || m_jfexid ==5){
+    for(std::map<int, jFEXForwardJetsInfo>::iterator it = m_FCALJets.begin(); it!=(m_FCALJets.end()); ++it){
+      jFEXForwardJetsInfo FCALJetInfo = it->second;
+      eta = ieta -8;
+      phi = iphi -8;
+      et = FCALJetInfo.getSeedET() + FCALJetInfo.getFirstEnergyRingET() + FCALJetInfo.getSecondEnergyRingET();
+      jFEXLargeRJetTOBEt = et/jFEXETResolution;
+    }
+  }
 
-  int eta = ieta -8;
-  int phi = iphi -8;
-  int Res = 0; //9 bits reserved
-  int Sat = 1; //1 bit for saturation flag, not coded yet
   if (jFEXLargeRJetTOBEt > 0x1fff){
     jFEXLargeRJetTOBEt = 0x1fff;  //0x1fff is 13 bits
     Sat = 1;
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXForwardJetsAlgo.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXForwardJetsAlgo.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..a7c3ceb60cae7739c55d799477e494f3c075a20b
--- /dev/null
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXForwardJetsAlgo.cxx
@@ -0,0 +1,278 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration  
+*/
+//***************************************************************************  
+//		jFEXForwardJetsAlgo - Algorithm for forward Jets in jFEX
+//                              -------------------
+//     begin                : 07 06 2021
+//     email                : varsiha.sothilingam@cern.ch
+//***************************************************************************  
+#include <iostream>
+#include <vector>
+#include <string>
+#include <map>
+#include "L1CaloFEXSim/jFEXForwardJetsAlgo.h"
+#include "L1CaloFEXSim/jTower.h"
+#include "L1CaloFEXSim/jTowerContainer.h"
+#include "L1CaloFEXSim/jFEXForwardJetsInfo.h"
+#include "L1CaloFEXSim/FEXAlgoSpaceDefs.h"
+#include "CaloEvent/CaloCellContainer.h"
+#include "CaloIdentifier/CaloIdManager.h"
+#include "CaloIdentifier/CaloCell_SuperCell_ID.h"
+#include "AthenaBaseComps/AthAlgorithm.h"
+#include "StoreGate/StoreGateSvc.h"
+
+namespace LVL1{
+
+//Default Constructor
+LVL1::jFEXForwardJetsAlgo::jFEXForwardJetsAlgo(const std::string& type, const std::string& name, const IInterface* parent):
+   AthAlgTool(type, name, parent)   
+  {
+  declareInterface<IjFEXForwardJetsAlgo>(this);
+  }
+
+/** Destructor */
+LVL1::jFEXForwardJetsAlgo::~jFEXForwardJetsAlgo()
+{
+}
+StatusCode LVL1::jFEXForwardJetsAlgo::initialize()
+{
+   ATH_CHECK(m_jFEXForwardJetsAlgo_jTowerContainerKey.initialize());
+   return StatusCode::SUCCESS;
+
+}
+
+//calls container for TT
+StatusCode LVL1::jFEXForwardJetsAlgo::safetyTest(){
+
+  SG::ReadHandle<jTowerContainer> jk_jFEXForwardJetsAlgo_jTowerContainer(m_jFEXForwardJetsAlgo_jTowerContainerKey);
+
+  if(! jk_jFEXForwardJetsAlgo_jTowerContainer.isValid()){
+    ATH_MSG_FATAL("Could not retrieve  jk_jFEXForwardJetsAlgo_jTowerContainer " << m_jFEXForwardJetsAlgo_jTowerContainerKey.key());
+
+    return StatusCode::FAILURE;
+  }
+  
+  return StatusCode::SUCCESS;
+}
+
+void LVL1::jFEXForwardJetsAlgo::setup(int inputTable[FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width]) {
+  std::copy(&inputTable[0][0], &inputTable[0][0] + (FEXAlgoSpaceDefs::jFEX_algoSpace_height*FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width), &m_jFEXalgoTowerID[0][0]);
+}
+
+//Gets geometric global centre Phi coord of the TT
+float LVL1::jFEXForwardJetsAlgo::globalPhi(int nphi, int neta) {
+
+  SG::ReadHandle<jTowerContainer> jk_jFEXForwardJetsAlgo_jTowerContainer(m_jFEXForwardJetsAlgo_jTowerContainerKey/*,ctx*/);
+  float phi = jk_jFEXForwardJetsAlgo_jTowerContainer->findTower(m_jFEXalgoTowerID[nphi][neta])->centrePhi();
+  return phi;
+}
+
+//Gets geometric global centre Eta coord of the TT
+float LVL1::jFEXForwardJetsAlgo::globalEta(int nphi, int neta) {
+
+  SG::ReadHandle<jTowerContainer> jk_jFEXForwardJetsAlgo_jTowerContainer(m_jFEXForwardJetsAlgo_jTowerContainerKey/*,ctx*/);
+  float eta = jk_jFEXForwardJetsAlgo_jTowerContainer->findTower(m_jFEXalgoTowerID[nphi][neta])->centreEta();
+  return eta;
+
+}
+
+//Gets Phi of the TT
+unsigned int LVL1::jFEXForwardJetsAlgo::localPhi(int nphi, int neta) {
+
+ SG::ReadHandle<jTowerContainer> jk_jFEXForwardJetsAlgo_jTowerContainer(m_jFEXForwardJetsAlgo_jTowerContainerKey/*,ctx*/);
+ unsigned int phi = jk_jFEXForwardJetsAlgo_jTowerContainer->findTower(m_jFEXalgoTowerID[nphi][neta])->phi();
+ return phi;
+}
+//Gets Eta of the TT
+unsigned int LVL1::jFEXForwardJetsAlgo::localEta(int nphi, int neta) {
+
+ SG::ReadHandle<jTowerContainer> jk_jFEXForwardJetsAlgo_jTowerContainer(m_jFEXForwardJetsAlgo_jTowerContainerKey/*,ctx*/);
+ unsigned int eta  = jk_jFEXForwardJetsAlgo_jTowerContainer->findTower(m_jFEXalgoTowerID[nphi][neta])->eta();
+ return eta;
+}
+
+//Return ET of TT. Should be FCAL 0 + 1 + 2 //maybe check this 
+unsigned int LVL1::jFEXForwardJetsAlgo::getTTowerET(int nphi, int neta){
+
+ SG::ReadHandle<jTowerContainer> jk_jFEXForwardJetsAlgo_jTowerContainer(m_jFEXForwardJetsAlgo_jTowerContainerKey/*,ctx*/);
+ const LVL1::jTower * tmpTower = jk_jFEXForwardJetsAlgo_jTowerContainer->findTower(m_jFEXalgoTowerID[nphi][neta]);
+ unsigned int et = tmpTower->getTotalET();
+ return et;
+}
+
+std::map<int, jFEXForwardJetsInfo> LVL1::jFEXForwardJetsAlgo::FcalJetsTowerIDLists(){
+ 
+  std::map<int, jFEXForwardJetsInfo> FCALJetTowerIDLists; 
+  static constexpr float TT_Size = M_PI/32;
+
+  //This flag determines if the TT ID which are in the first and second energy rings are stored 
+  //in the jFEXForwardJetsInfo class. It is set to false to reduce quantity data stored in class
+  m_storeEnergyRingTTIDs = false;
+
+  std::vector<int> lower_centre_neta;  
+  std::vector<int> upper_centre_neta;  
+  int lowerEM_eta = 0;
+  int upperEM_eta = 0;
+
+  //STEP 1: check if we are in module 0 or 5 and assign corrrect eta FEXAlgoSpace parameters
+  if(m_jFEXalgoTowerID[31][0] == 0){
+    //Module 0
+    lower_centre_neta.assign({FEXAlgoSpaceDefs::jFEX_algoSpace_C_EMB_start_eta, FEXAlgoSpaceDefs::jFEX_algoSpace_C_EMIE_start_eta, FEXAlgoSpaceDefs::jFEX_algoSpace_C_FCAL_start_eta});
+    upper_centre_neta.assign({FEXAlgoSpaceDefs::jFEX_algoSpace_C_EMB_end_eta, FEXAlgoSpaceDefs::jFEX_algoSpace_C_EMIE_end_eta,FEXAlgoSpaceDefs::jFEX_algoSpace_C_FCAL_end_eta });
+
+    lowerEM_eta = FEXAlgoSpaceDefs::jFEX_algoSpace_C_lowerEM_eta;
+    upperEM_eta = FEXAlgoSpaceDefs::jFEX_algoSpace_C_upperEM_eta;
+  }
+
+  else{
+    //Module 5 
+    lower_centre_neta.assign({FEXAlgoSpaceDefs::jFEX_algoSpace_A_EMB_eta, FEXAlgoSpaceDefs::jFEX_algoSpace_A_EMIE_eta, FEXAlgoSpaceDefs::jFEX_algoSpace_A_FCAL_start_eta});
+    upper_centre_neta.assign({FEXAlgoSpaceDefs::jFEX_algoSpace_A_EMIE_eta, FEXAlgoSpaceDefs::jFEX_algoSpace_A_FCAL_start_eta, FEXAlgoSpaceDefs::jFEX_algoSpace_A_FCAL_end_eta});
+
+    lowerEM_eta = FEXAlgoSpaceDefs::jFEX_algoSpace_A_lowerEM_eta;
+    upperEM_eta = FEXAlgoSpaceDefs::jFEX_algoSpace_A_upperEM_eta;
+  } 
+  
+  //STEP 2: define phi FEXAlgoSpace parameters
+  std::vector<int> lower_centre_nphi{FEXAlgoSpaceDefs::jFEX_algoSpace_EMB_start_phi, FEXAlgoSpaceDefs::jFEX_algoSpace_EMIE_start_phi,  FEXAlgoSpaceDefs::jFEX_algoSpace_FCAL_start_phi}; 
+  std::vector<int> upper_centre_nphi{FEXAlgoSpaceDefs::jFEX_algoSpace_EMB_end_phi, FEXAlgoSpaceDefs::jFEX_algoSpace_EMIE_end_phi,  FEXAlgoSpaceDefs::jFEX_algoSpace_FCAL_end_phi};
+
+
+  //STEP 3: loop over different EM/FCAL0 eta phi core fpga regions. These are potential central trigger towers for jets
+  for(int myCounter = 0; myCounter<3; myCounter++){
+    for(int centre_nphi = lower_centre_nphi[myCounter]; centre_nphi < upper_centre_nphi[myCounter]; centre_nphi++) {
+      for(int centre_neta = lower_centre_neta[myCounter]; centre_neta < upper_centre_neta[myCounter]; centre_neta++) {
+
+        //STEP 4: define TTID which will be the key for class in map
+        int myTTIDKey = m_jFEXalgoTowerID[centre_nphi][centre_neta];
+
+        //STEP 5: ignore when tower ID is zero. 
+        if(myTTIDKey == 0){continue;}
+
+        //STEP 6: define class
+        jFEXForwardJetsInfo TriggerTowerInformation;
+
+        //STEP 7: fill local eta phi coords
+        TriggerTowerInformation.setCentreLocalTTPhi(centre_nphi);
+        TriggerTowerInformation.setCentreLocalTTEta(centre_neta);
+        
+        float centreTT_phi = globalPhi(centre_nphi, centre_neta);
+        float centreTT_eta = globalEta(centre_nphi, centre_neta);
+        TriggerTowerInformation.setCentreTTPhi(centreTT_phi);
+        TriggerTowerInformation.setCentreTTEta(centreTT_eta);
+
+        //STEP 8: loop over all FCAL0 TTIDs and fill TT IDs for seed and calculate seed energy     
+        for(int nphi = 0; nphi < 32; nphi++) {   
+          for(int neta = lowerEM_eta; neta < upperEM_eta; neta++) {
+            if(((nphi == centre_nphi) && (neta == centre_neta)) ||(m_jFEXalgoTowerID[nphi][neta])==0 ){continue;}
+            float TT_phi = globalPhi(nphi, neta);
+            float TT_eta = globalEta(nphi, neta);
+            float R = sqrt(pow((centreTT_eta - TT_eta),2) + pow((centreTT_phi - TT_phi),2));
+            if((R > 0) && (R <( 2 * TT_Size))){
+	      //STEP 9: fill TTID in seed
+              TriggerTowerInformation.includeTTinSeed(m_jFEXalgoTowerID[nphi][neta]);           
+              //STEP 10: add ET value to seed 
+	      TriggerTowerInformation.addToSeedET(getTTowerET(nphi, neta));   
+            }                        
+          }
+        }
+        //STEP 11: Store filled class into map, with central TT ID as Key     
+        FCALJetTowerIDLists[myTTIDKey] = TriggerTowerInformation;     
+     }//end of centre_nphi loop 
+   }//end of centre_mphi loop
+ }//end of myCounter loop
+ return FCALJetTowerIDLists;      
+}
+
+
+
+std::map<int, jFEXForwardJetsInfo> LVL1::jFEXForwardJetsAlgo::isSeedLocalMaxima(){
+  std::vector<int> localMaximas;
+  std::map<int, jFEXForwardJetsInfo> localMaximaLists = FcalJetsTowerIDLists();
+  size_t isLocalMaxima = 0;
+  int totalLM = 0;
+  for(std::map<int, jFEXForwardJetsInfo>::iterator it = localMaximaLists.begin(); it != (localMaximaLists.end()); ++it)
+  {
+    isLocalMaxima = 0;
+    int myTTKey = it->first;
+    jFEXForwardJetsInfo myFCALJetInfoClass = it ->second;
+    //Local maxima check takes place here
+    SG::ReadHandle<jTowerContainer> jk_jFEXForwardJetsAlgo_jTowerContainer(m_jFEXForwardJetsAlgo_jTowerContainerKey/*,ctx*/);
+    float centre_phi = myFCALJetInfoClass.getCentreTTPhi();
+    float centre_eta = myFCALJetInfoClass.getCentreTTPhi();
+    float centre_energy = myFCALJetInfoClass.getSeedET();
+    std::vector<int> TTinSeed = myFCALJetInfoClass.getTTinSeed();
+    for (std::size_t i = 0, max = TTinSeed.size(); i != max; ++i){
+      float seed_phi = jk_jFEXForwardJetsAlgo_jTowerContainer->findTower(TTinSeed[i])->centrePhi();
+      float seed_eta = jk_jFEXForwardJetsAlgo_jTowerContainer->findTower(TTinSeed[i])->centreEta();
+
+      float delta_phi = seed_phi - centre_phi;
+      float delta_eta = seed_eta - centre_eta;
+      float seed_energy = localMaximaLists[TTinSeed[i]].getSeedET(); 
+       
+      if( ((delta_eta + delta_phi) < 0) || ((delta_eta + delta_phi == 0) && (delta_eta < 0)) )
+      {
+        if(centre_energy >= seed_energy){isLocalMaxima++;}
+      }
+      else
+      {
+        if(centre_energy > seed_energy){isLocalMaxima++;}
+      }
+     }     
+    //if it is a local maxima, here we save the TT ID
+    if((isLocalMaxima == TTinSeed.size()) &&(isLocalMaxima !=0)){localMaximas.push_back(myTTKey); totalLM++;}  
+  }
+  
+  //now with a list of localmaxima centre TT IDs, we can remove all the other not LM keys and jfexforward jet classes from the map
+  for(std::map<int, jFEXForwardJetsInfo>::iterator it = localMaximaLists.begin(); it !=localMaximaLists.end(); ++it)
+  {
+    std::vector<int>::iterator itr;
+    itr = std::find(localMaximas.begin(), localMaximas.end(), it->first);
+    if(itr !=localMaximas.end())
+    {continue;}
+    else{
+      localMaximaLists.erase(it->first);
+    }
+  }
+
+ return localMaximaLists;
+}
+
+std::map<int, jFEXForwardJetsInfo> LVL1::jFEXForwardJetsAlgo::calculateJetETs(){
+  std::map<int, jFEXForwardJetsInfo> localMaximas = isSeedLocalMaxima();
+  static constexpr float TT_Size = M_PI/32;
+
+  //here we loop over all trigger towers, fcal 0 1 2 and calculate energy of TT which lays in the 0.4
+  //and 0.8 radius to be stored. 
+  for(std::map<int, jFEXForwardJetsInfo>::iterator it = localMaximas.begin(); it !=localMaximas.end(); ++it){
+    int key = it->first;
+    float centreTT_phi = localMaximas[key].getCentreTTPhi();
+    float centreTT_eta = localMaximas[key].getCentreTTEta();
+    
+    for(int nphi = 0; nphi < FEXAlgoSpaceDefs::jFEX_algoSpace_height; nphi++) {
+      for(int neta = 0; neta < FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width; neta++) {
+
+        if((m_jFEXalgoTowerID[nphi][neta] == (it->first))){continue;}
+        float TT_phi = globalPhi(nphi, neta);
+        float TT_eta = globalEta(nphi, neta);
+        float R = sqrt(pow((centreTT_eta - TT_eta),2) + pow((centreTT_phi - TT_phi),2));
+
+        if((R> (2 * TT_Size)) && (R< (4 * TT_Size))){ 
+          localMaximas[it->first].addToFirstEnergyRingET(getTTowerET(nphi, neta));
+          if(m_storeEnergyRingTTIDs){localMaximas[it->first].includeTTIDinFirstER(m_jFEXalgoTowerID[nphi][neta]);}
+        }
+ 
+        if((R> (4 * TT_Size)) && (R< (8 * TT_Size))){
+          localMaximas[it->first].addToSecondEnergyRingET(getTTowerET(nphi, neta));
+          if(m_storeEnergyRingTTIDs){localMaximas[it->first].includeTTIDinSecondER(m_jFEXalgoTowerID[nphi][neta]);}
+        }
+ 
+      }
+    }
+  }
+  return localMaximas;
+}
+
+}// end of namespace LVL1
+
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXForwardJetsInfo.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXForwardJetsInfo.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..0fd940abd46081fb2e3040618d9f71d04d53538e
--- /dev/null
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXForwardJetsInfo.cxx
@@ -0,0 +1,122 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration  
+*/
+//***************************************************************************  
+//              jFEXForwardJetsInfo - 
+//                              -------------------
+//     begin                : 07 07 2021
+//     email                : varsiha.sothilingam@cern.ch
+//***************************************************************************  
+#include <iostream>
+#include <vector>
+#include <string>
+#include <map>
+//#include "L1CaloFEXSim/jFEXForwardJetsAlgo.h"
+#include "L1CaloFEXSim/jTower.h"
+#include "L1CaloFEXSim/jTowerContainer.h"
+#include "L1CaloFEXSim/jFEXForwardJetsInfo.h"
+#include "L1CaloFEXSim/FEXAlgoSpaceDefs.h"
+#include "CaloEvent/CaloCellContainer.h"
+#include "CaloIdentifier/CaloIdManager.h"
+#include "CaloIdentifier/CaloCell_SuperCell_ID.h"
+#include "AthenaBaseComps/AthAlgorithm.h"
+#include "StoreGate/StoreGateSvc.h"
+
+void  LVL1::jFEXForwardJetsInfo::setCentreTTEta(float centreTTEta)
+{
+  m_centreTTEta = centreTTEta;
+}
+
+float LVL1::jFEXForwardJetsInfo::getCentreTTEta()
+{
+  return m_centreTTEta;
+}
+
+void  LVL1::jFEXForwardJetsInfo::setCentreTTPhi(float centreTTPhi)
+{
+  m_centreTTPhi = centreTTPhi;
+}
+  
+float LVL1::jFEXForwardJetsInfo::getCentreTTPhi()
+{
+  return m_centreTTPhi;
+}
+void  LVL1::jFEXForwardJetsInfo::setCentreLocalTTEta(float centreLocalTTEta)
+{
+  m_centreLocalTTEta = centreLocalTTEta;
+}
+
+float LVL1::jFEXForwardJetsInfo::getCentreLocalTTEta()
+{
+  return m_centreLocalTTEta;
+}
+
+void  LVL1::jFEXForwardJetsInfo::setCentreLocalTTPhi(float centreLocalTTPhi)
+{
+  m_centreLocalTTPhi = centreLocalTTPhi;
+}
+
+float LVL1::jFEXForwardJetsInfo::getCentreLocalTTPhi()
+{
+  return m_centreLocalTTPhi;
+}
+
+void LVL1::jFEXForwardJetsInfo::includeTTinSeed(int TT_ID)
+{
+  m_TTsInSeed.push_back(TT_ID);
+}
+
+std::vector<int> LVL1::jFEXForwardJetsInfo::getTTinSeed()
+{
+  return m_TTsInSeed;
+}
+
+void LVL1::jFEXForwardJetsInfo::addToSeedET(int seed_ET)
+{
+  m_seed_ET += seed_ET;
+}
+
+int LVL1::jFEXForwardJetsInfo::getSeedET()
+{
+  return m_seed_ET;
+}
+
+void LVL1::jFEXForwardJetsInfo::addToFirstEnergyRingET(int firstER_ET)
+{
+  m_firstEnergyRing_ET  = firstER_ET;
+}
+int LVL1::jFEXForwardJetsInfo::getFirstEnergyRingET()
+{
+  return m_firstEnergyRing_ET;
+}
+
+void LVL1::jFEXForwardJetsInfo::includeTTIDinFirstER(int firstER_TTID)
+{
+  m_firstEnergyRing_TTIDs.push_back(firstER_TTID);
+}
+std::vector<int> LVL1::jFEXForwardJetsInfo::getTTIDinFirstER()
+{
+  return m_firstEnergyRing_TTIDs;
+}
+
+
+void LVL1::jFEXForwardJetsInfo::includeTTIDinSecondER(int secondER_TTID)
+{
+  m_secondEnergyRing_TTIDs.push_back(secondER_TTID);
+}
+std::vector<int> LVL1::jFEXForwardJetsInfo::getTTIDinSecondER()
+{
+  return m_secondEnergyRing_TTIDs;
+}
+
+void LVL1::jFEXForwardJetsInfo::addToSecondEnergyRingET(int secondER_ET)
+{
+  m_secondEnergyRing_ET  = secondER_ET;
+}
+
+int LVL1::jFEXForwardJetsInfo::getSecondEnergyRingET()
+{
+  return m_secondEnergyRing_ET;
+}
+
+
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXNtupleWriter.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXNtupleWriter.cxx
index 53a722a0f4965e7fa7e8a6b3ab2abfaed2fd8ef1..2e333a91d9a8d44ffda6f1352f826b63624f867a 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXNtupleWriter.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXNtupleWriter.cxx
@@ -67,6 +67,10 @@ StatusCode LVL1::jFEXNtupleWriter::initialize () {
   m_myTree->Branch ("smallRJetTOB_phi", &m_smallRJetTOB_phi);
   m_myTree->Branch ("smallRJetTOB_ET", &m_smallRJetTOB_ET);
   m_myTree->Branch ("smallRJetTOB_sat", &m_smallRJetTOB_sat);
+  m_myTree->Branch ("smallRJetTOB_word", &m_smallRJetTOB_word);
+  m_myTree->Branch ("smallRJetTOB_jfexID", &m_smallRJetTOB_jfexID);
+  m_myTree->Branch ("smallRJetTOB_fpgaID", &m_smallRJetTOB_fpgaID);
+
 
   m_myTree->Branch ("largeRJet_eta", &m_largeRJet_eta);
   m_myTree->Branch ("largeRJet_phi", &m_largeRJet_phi); 
@@ -78,6 +82,10 @@ StatusCode LVL1::jFEXNtupleWriter::initialize () {
   m_myTree->Branch ("largeRJetTOB_phi", &m_largeRJetTOB_phi);
   m_myTree->Branch ("largeRJetTOB_sat", &m_largeRJetTOB_sat);
 
+  m_myTree->Branch ("largeRJetTOB_word",   &m_largeRJetTOB_word);
+  m_myTree->Branch ("largeRJetTOB_jfexID", &m_largeRJetTOB_jfexID);
+  m_myTree->Branch ("largeRJetTOB_fpgaID", &m_largeRJetTOB_fpgaID);
+
   m_myTree->Branch ("tau_TT_ID" ,  &m_tau_TT_ID);
   m_myTree->Branch ("tau_isLocalMax" ,  &m_tau_isLocalMax);
   m_myTree->Branch ("tau_ET" ,  &m_tau_ET);
@@ -132,6 +140,10 @@ StatusCode LVL1::jFEXNtupleWriter::loadsmallRJetAlgoVariables() {
   m_smallRJetTOB_phi.clear();
   m_smallRJetTOB_ET.clear();
   m_smallRJetTOB_sat.clear();
+  m_smallRJetTOB_word.clear();
+  m_smallRJetTOB_jfexID.clear();  
+  m_smallRJetTOB_fpgaID.clear();
+
   for (int i = 0; i < m_jFEXOutputCollection->SRsize(); i++)
   {
     m_smallRJet_isCentralTowerSeed.push_back((*(m_jFEXOutputCollection->get_smallRJet(i)))["smallRJet_isCentralTowerSeed"]);
@@ -143,6 +155,9 @@ StatusCode LVL1::jFEXNtupleWriter::loadsmallRJetAlgoVariables() {
     m_smallRJetTOB_phi.push_back((*(m_jFEXOutputCollection->get_smallRJet(i)))["smallRJetTOB_phi"]);
     m_smallRJetTOB_ET.push_back((*(m_jFEXOutputCollection->get_smallRJet(i)))["smallRJetTOB_ET"]);
     m_smallRJetTOB_sat.push_back((*(m_jFEXOutputCollection->get_smallRJet(i)))["smallRJetTOB_sat"]);
+    m_smallRJetTOB_word.push_back((*(m_jFEXOutputCollection->get_smallRJet(i)))["smallRJetTOB_word"]);
+    m_smallRJetTOB_jfexID.push_back((*(m_jFEXOutputCollection->get_smallRJet(i)))["smallRJetTOB_jfexID"]);
+    m_smallRJetTOB_fpgaID.push_back((*(m_jFEXOutputCollection->get_smallRJet(i)))["smallRJetTOB_fpgaID"]);
   }
   return StatusCode::SUCCESS;
 }
@@ -153,6 +168,12 @@ StatusCode LVL1::jFEXNtupleWriter::loadlargeRJetAlgoVariables() {
   m_largeRJet_eta.clear();
   m_largeRJet_phi.clear();
   m_largeRJetTOB_ET.clear();
+  m_largeRJetTOB_eta.clear();
+  m_largeRJetTOB_phi.clear();
+  m_largeRJetTOB_sat.clear();
+  m_largeRJetTOB_word.clear();
+  m_largeRJetTOB_fpgaID.clear();
+  m_largeRJetTOB_jfexID.clear();
 
   for (int i = 0; i < m_jFEXOutputCollection->LRsize(); i++)
   {
@@ -161,6 +182,12 @@ StatusCode LVL1::jFEXNtupleWriter::loadlargeRJetAlgoVariables() {
     m_largeRJet_eta.push_back((*(m_jFEXOutputCollection->get_largeRJet(i)))["largeRJet_eta"]);
     m_largeRJet_phi.push_back((*(m_jFEXOutputCollection->get_largeRJet(i)))["largeRJet_phi"]);
     m_largeRJetTOB_ET.push_back((*(m_jFEXOutputCollection->get_largeRJet(i)))["largeRJetTOB_ET"]);
+    m_largeRJetTOB_eta.push_back((*(m_jFEXOutputCollection->get_largeRJet(i)))["largeRJetTOB_eta"]);
+    m_largeRJetTOB_phi.push_back((*(m_jFEXOutputCollection->get_largeRJet(i)))["largeRJetTOB_phi"]);
+    m_largeRJetTOB_sat.push_back((*(m_jFEXOutputCollection->get_largeRJet(i)))["largeRJetTOB_sat"]);
+    m_largeRJetTOB_word.push_back((*(m_jFEXOutputCollection->get_largeRJet(i)))["largeRJetTOB_word"]);
+    m_largeRJetTOB_fpgaID.push_back((*(m_jFEXOutputCollection->get_largeRJet(i)))["largeRJetTOB_fpgaID"]);
+    m_largeRJetTOB_jfexID.push_back((*(m_jFEXOutputCollection->get_largeRJet(i)))["largeRJetTOB_jfexID"]);
 
   }
   return StatusCode::SUCCESS;
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXOutputCollection.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXOutputCollection.cxx
index 28646725595e66eb1d21780ce64c9ed6afcc289a..67f6d5fe8c9d1e1a17d800d74e51adcc1de8b50d 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXOutputCollection.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXOutputCollection.cxx
@@ -40,12 +40,12 @@ void LVL1::jFEXOutputCollection::clear()
   }
 }
 
-void LVL1::jFEXOutputCollection::addValue_smallRJet(std::string key, float value)
+void LVL1::jFEXOutputCollection::addValue_smallRJet(std::string key, int value)
 {
  m_values_tem_smallRJet.insert(std::make_pair(key, value));
 }
 
-void LVL1::jFEXOutputCollection::addValue_largeRJet(std::string key, float value)
+void LVL1::jFEXOutputCollection::addValue_largeRJet(std::string key, int value)
 {
  m_values_tem_largeRJet.insert(std::make_pair(key, value));
 }
@@ -57,14 +57,14 @@ void LVL1::jFEXOutputCollection::addValue_tau(std::string key, int value)
 
 void LVL1::jFEXOutputCollection::fill_smallRJet()
 {
-  std::map<std::string, float>* values_local = new std::map<std::string, float>(m_values_tem_smallRJet);
+  std::map<std::string, int>* values_local = new std::map<std::string, int>(m_values_tem_smallRJet);
   m_allvalues_smallRJet.push_back(values_local);
   m_values_tem_smallRJet.clear();
 
 }
 void LVL1::jFEXOutputCollection::fill_largeRJet()
 {
-  std::map<std::string, float>* values_local = new std::map<std::string, float>(m_values_tem_largeRJet);
+  std::map<std::string, int>* values_local = new std::map<std::string, int>(m_values_tem_largeRJet);
   m_allvalues_largeRJet.push_back(values_local);
   m_values_tem_largeRJet.clear();
 
@@ -92,11 +92,11 @@ int LVL1::jFEXOutputCollection::tausize()
   return m_allvalues_tau.size();
 }
 
-std::map<std::string, float>* LVL1::jFEXOutputCollection::get_smallRJet(int location)
+std::map<std::string, int>* LVL1::jFEXOutputCollection::get_smallRJet(int location)
 {
   return m_allvalues_smallRJet[location];
 }
-std::map<std::string, float>* LVL1::jFEXOutputCollection::get_largeRJet(int location)
+std::map<std::string, int>* LVL1::jFEXOutputCollection::get_largeRJet(int location)
 {
   return m_allvalues_largeRJet[location];
 }
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXSmallRJetAlgo.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXSmallRJetAlgo.cxx
index 82567784d4ae2a121d56bf4f75acd8babf72e69f..420ef18c3fc60364f910b40fcb77a2f609f3bc9a 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXSmallRJetAlgo.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXSmallRJetAlgo.cxx
@@ -54,11 +54,9 @@ StatusCode LVL1::jFEXSmallRJetAlgo::safetyTest(){
   return StatusCode::SUCCESS;
 }
 
-void LVL1::jFEXSmallRJetAlgo::setup(int inputTable[7][7], bool barrel_region) {
+void LVL1::jFEXSmallRJetAlgo::setup(int inputTable[7][7]) {
 
   std::copy(&inputTable[0][0], &inputTable[0][0] + 49, &m_jFEXalgoTowerID[0][0]);
-  m_barrel_region = barrel_region;
-
 }
 
 
@@ -99,6 +97,7 @@ void LVL1::jFEXSmallRJetAlgo::buildSeeds()
 {
 
   m_seedSet = false;
+  m_LMDisplaced = false;
   SG::ReadHandle<jTowerContainer> jk_jFEXSmallRJetAlgo_jTowerContainer(m_jFEXSmallRJetAlgo_jTowerContainerKey);
 
   for(int mphi = 1; mphi < 6; mphi++){
@@ -110,15 +109,19 @@ void LVL1::jFEXSmallRJetAlgo::buildSeeds()
           const LVL1::jTower * tmpTower = jk_jFEXSmallRJetAlgo_jTowerContainer->findTower(m_jFEXalgoTowerID[meta + ieta][mphi + iphi]);
           //for that TT, build the seed
           //here we sum TT ET to calculate seed	    	
-	        et_tmp = tmpTower->getTotalET();  //in the fcal it already only considers the EM layer as the hcal layer 1 and 2 are considered seperate jTower Objects
+          et_tmp = tmpTower->getTotalET();
           seedTotalET += et_tmp;
        	  }
     	}
    	m_jFEXalgoSearchWindowSeedET[meta -1][mphi -1] = seedTotalET;
       	}
 
-     }    
-
+     }
+  
+  int centralTT_ET = getTTowerET();    
+  if(centralTT_ET==m_jFEXalgoSearchWindowSeedET[3][3]){
+    m_LMDisplaced = true;
+  }
     m_seedSet = true;
 }
 
@@ -127,11 +130,10 @@ void LVL1::jFEXSmallRJetAlgo::buildSeeds()
 bool LVL1::jFEXSmallRJetAlgo::isSeedLocalMaxima()
 {
     if(m_seedSet == false) {
-        //ATH_MSG_DEBUG("Local Maxima not checked due to seed not calculated.");
+        ATH_MSG_DEBUG("Local Maxima not checked due to seed not calculated.");
     }
     if(m_seedSet == true) {
 
-        //ATH_MSG_DEBUG("Local Maxima checking begins.");
         //here put the 24 conditions to determine if the [2][2] TT seed is a local maxima.
 
         int central_seed = m_jFEXalgoSearchWindowSeedET[2][2];
@@ -160,6 +162,11 @@ bool LVL1::jFEXSmallRJetAlgo::isSeedLocalMaxima()
     return true;
 
 }
+bool LVL1::jFEXSmallRJetAlgo::checkDisplacedLM()
+{
+   return m_LMDisplaced;
+}
+
 
 //in this clustering func, the central TT in jet is the parameters
 unsigned int LVL1::jFEXSmallRJetAlgo::getSmallClusterET(){
@@ -203,9 +210,7 @@ std::unique_ptr<jFEXSmallRJetTOB> LVL1::jFEXSmallRJetAlgo::getSmallRJetTOBs(){
   std::unique_ptr<jFEXSmallRJetTOB> tob = std::make_unique<jFEXSmallRJetTOB>();
 
   unsigned int et = getSmallClusterET();
- // unsigned int phi = getRealPhi(phi);
- // unsigned int eta = getRealEta(eta);
-  
+
   tob->setET(et); 
   tob->setPhi(getRealPhi());
   tob->setEta(getRealEta());
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jSuperCellTowerMapper.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jSuperCellTowerMapper.cxx
index 16ba2ad6a5bd96c6dd6313ecba87a4ac77b127f7..26010c51782c8a90e9485e349b22ae4962c86e06 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jSuperCellTowerMapper.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jSuperCellTowerMapper.cxx
@@ -86,10 +86,10 @@ StatusCode jSuperCellTowerMapper::AssignTriggerTowerMapper(std::unique_ptr<jTowe
       int towerid = FindTowerIDForSuperCell(i_eta, i_phi) + towerID_Modifier;
       LVL1::jTower * targetTower; 
       if((targetTower = my_jTowerContainerRaw->findTower(towerid))) {
-        if (targetTower->getET_float(4, 0) > 0) {
+        if (targetTower->getET_float(1, 0) > 0) {
           ATH_MSG_WARNING("\n==== jSuperCellTowerMapper ============ Hadronic layer energy filled more than once - it will be ignored. (Needs investigation).  Please report this!");
         }
-        targetTower->setET(10, int(eachTower->cpET()) * 500., 4); // cf 0.5 * 1000.0
+        targetTower->setET(1, int(eachTower->cpET()) * 500., 4); // cf 0.5 * 1000.0
       } else {
         ATH_MSG_WARNING("\n==== jSuperCellTowerMapper ============ Tower ID is officially unknown - it will be ignored. (Needs investigation).  Please report this!");
       }
@@ -843,16 +843,19 @@ void jSuperCellTowerMapper::ConnectSuperCellToTower(std::unique_ptr<jTowerContai
     case CaloSampling::FCAL0: { 
       if(pos_neg < 0){ towerID_Modifier = 700000; }
       else if(pos_neg > 0){ towerID_Modifier = 800000; }
+      iCell = 0;
       break; 
     }
     case CaloSampling::FCAL1: {
       if(pos_neg < 0){ towerID_Modifier = 900000; }
       else if(pos_neg > 0){ towerID_Modifier = 1000000; }
+      iCell = 1;
       break;
     }
     case CaloSampling::FCAL2: { 
       if(pos_neg < 0){ towerID_Modifier = 1100000; }
       else if(pos_neg > 0){ towerID_Modifier = 1200000;  }
+      iCell = 1;
       break;
     }
     default: {
@@ -860,7 +863,7 @@ void jSuperCellTowerMapper::ConnectSuperCellToTower(std::unique_ptr<jTowerContai
     }
     }
 
-    iCell = 0;
+    //iCell = 0;
     layer = 0;
     towereta = eta_index;
     towerphi = phi_index;
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jTowerBuilder.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jTowerBuilder.cxx
index b6bda0ad5cf1edb98329eae1b37b817de2202535..2197ebcfab022af159fe17c5f2b40a4bc22488c1 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jTowerBuilder.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jTowerBuilder.cxx
@@ -101,8 +101,8 @@ void jTowerBuilder::BuildTRANSjTowers(std::unique_ptr<jTowerContainer> & jTowerC
 
 void jTowerBuilder::BuildEMEjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const
 {
-static constexpr float TT_Size = M_PI/32;
-    // Region 1
+  static constexpr float TT_Size = M_PI/32;
+  // Region 1
   int EME_MODIFIER = 15;
   int tmpVal = EME_MODIFIER;
 
@@ -162,7 +162,7 @@ static constexpr float TT_Size = M_PI/32;
   // EMIE = Electromagnetic Inner ECAL - i.e. the forward ECAL region at high eta
   void jTowerBuilder::BuildEMIEjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const
   {
-static constexpr float TT_Size = M_PI/32;
+    static constexpr float TT_Size = M_PI/32;
     int EMIE_MODIFIER = 25;
     int tmpVal = EMIE_MODIFIER;
     int cellCountEta = 0;
@@ -195,7 +195,7 @@ static constexpr float TT_Size = M_PI/32;
 
   void jTowerBuilder::BuildFCALjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const
   {
-static constexpr float TT_Size = M_PI/32;
+    static constexpr float TT_Size = M_PI/32;
     int FCAL_MODIFIER = 29; // there's 0.1 overlap with EMIE here in eta, but in counting we pretend it's the next one along.
     int tmpVal = FCAL_MODIFIER;
 
@@ -272,7 +272,6 @@ static constexpr float TT_Size = M_PI/32;
 
   void jTowerBuilder::BuildHECjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const
 {
-
   // Region 0
   int HEC_MODIFIER = 29;
   int tmpVal = HEC_MODIFIER;
@@ -315,7 +314,7 @@ static constexpr float TT_Size = M_PI/32;
 
 void jTowerBuilder::BuildAllTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const
 {
-  BuildSingleTower(jTowerContainerRaw, 0.0, 0.0, 0, -1.0, 0, 0.0, 0.0, 0);
+//  BuildSingleTower(jTowerContainerRaw, 0.0, 0.0, 0, -1.0, 0, 0.0, 0.0, 0);
   BuildEMBjTowers(jTowerContainerRaw);
   BuildTRANSjTowers(jTowerContainerRaw);
   BuildEMEjTowers(jTowerContainerRaw);
diff --git a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IjFEXForwardJetsAlgo.h b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IjFEXForwardJetsAlgo.h
new file mode 100644
index 0000000000000000000000000000000000000000..6a5b7bbcb7b1eaabf47a2e736d8aced1c106d297
--- /dev/null
+++ b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IjFEXForwardJetsAlgo.h
@@ -0,0 +1,51 @@
+/*
+ Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+//***************************************************************************
+//             Interface for jFEXForwardJetsAlgo - Algorithm for forward Jets in jFEX
+//                              -------------------
+//     begin                : 07 06 2021
+//     email                : varsiha.sothilingam@cern.ch
+//***************************************************************************
+
+#ifndef IjFEXFORWARDJETSALGO_H
+#define IjFEXFORWARDJETSALGO_H
+
+#include "GaudiKernel/IAlgTool.h"
+//#include "L1CaloFEXSim/jFEXForwardJetsAlgo.h"
+#include "L1CaloFEXSim/jFEXForwardJetsInfo.h"
+#include "L1CaloFEXSim/jTowerContainer.h"
+#include "L1CaloFEXSim/FEXAlgoSpaceDefs.h"
+
+namespace LVL1{
+
+    static const InterfaceID IID_IjFEXForwardJetsAlgo("LVL1::IjFEXForwardJetsAlgo",1, 0);
+     
+    class IjFEXForwardJetsAlgo : virtual public IAlgTool{
+    public:
+      static const InterfaceID& interfaceID ( ) ;
+      virtual StatusCode safetyTest() = 0;
+      virtual void setup(int inputTable[FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width])  = 0;    
+//      virtual float testfakePhi() =0;
+
+      virtual float globalPhi(int , int ) =0;
+      virtual float globalEta(int , int ) =0;
+      virtual unsigned int localPhi(int , int ) =0;
+      virtual unsigned int localEta(int , int ) =0;
+      virtual unsigned int getTTowerET(int, int) =0;
+
+      virtual std::map<int, jFEXForwardJetsInfo> FcalJetsTowerIDLists() =0;
+      virtual std::map<int, jFEXForwardJetsInfo> isSeedLocalMaxima() =0;
+      virtual std::map<int, jFEXForwardJetsInfo> calculateJetETs() =0;
+
+   private:
+
+    }; 
+
+    inline const InterfaceID& LVL1::IjFEXForwardJetsAlgo::interfaceID()
+    {
+      return IID_IjFEXForwardJetsAlgo;
+    }
+}
+#endif
+
diff --git a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IjFEXSmallRJetAlgo.h b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IjFEXSmallRJetAlgo.h
index fcb7db7d6d4e66b93309d638f54a189a586424f1..c928ee5d18e0a1bcd3c8846b0836d9d034840bb3 100644
--- a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IjFEXSmallRJetAlgo.h
+++ b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IjFEXSmallRJetAlgo.h
@@ -23,7 +23,7 @@ namespace LVL1{
     public:
       static const InterfaceID& interfaceID ( ) ;
       virtual StatusCode safetyTest() = 0;
-      virtual void setup(int inputTable[7][7], bool barrel_region) = 0;
+      virtual void setup(int inputTable[7][7]) = 0;
       virtual int realValue(int ID, int eta) =0;
       virtual bool isSeedLocalMaxima() = 0;
       virtual void buildSeeds() = 0;
@@ -32,6 +32,7 @@ namespace LVL1{
       virtual unsigned int getTTowerET() = 0;
       virtual unsigned int getSmallClusterET() =0;
       virtual unsigned int getSmallETRing() =0;
+      virtual bool checkDisplacedLM() = 0;
       virtual std::unique_ptr<jFEXSmallRJetTOB> getSmallRJetTOBs() = 0; 
 
    private: