diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXJwoJAlgo.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXJwoJAlgo.h
new file mode 100644
index 0000000000000000000000000000000000000000..b520dafc181e59261c2c174739d5234671eca7af
--- /dev/null
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXJwoJAlgo.h
@@ -0,0 +1,81 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+//***************************************************************************
+//    gFEXJwoJAlgo - Jets without jets algorithm for gFEX
+//                              -------------------
+//     begin                : 10 08 2021
+//     email                : cecilia.tosciri@cern.ch
+//***************************************************************************
+
+#ifndef gFEXJwoJAlgo_H
+#define gFEXJwoJAlgo_H
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "L1CaloFEXToolInterfaces/IgFEXJwoJAlgo.h"
+#include "AthenaKernel/CLASS_DEF.h"
+#include "L1CaloFEXSim/gFEXJwoJTOB.h"
+#include "L1CaloFEXSim/gTowerContainer.h"
+
+#include "AthenaBaseComps/AthAlgorithm.h"
+#include "StoreGate/StoreGateSvc.h"
+#include "L1CaloFEXSim/FEXAlgoSpaceDefs.h"
+
+
+
+namespace LVL1 {
+
+  class gFEXJwoJAlgo : public AthAlgTool, virtual public IgFEXJwoJAlgo {
+
+  public:
+    /** Constructors */
+    gFEXJwoJAlgo(const std::string& type, const std::string& name, const IInterface* parent);
+
+    /** standard Athena-Algorithm method */
+    virtual StatusCode initialize() override;
+
+
+    virtual void setAlgoConstant(unsigned int aFPGA_A, unsigned int bFPGA_A,
+                                 unsigned int aFPGA_B, unsigned int bFPGA_B,
+                                 int gblockThreshold) override;
+
+    virtual std::vector<std::unique_ptr<gFEXJwoJTOB>> jwojAlgo(gTowersCentral Atwr, gTowersCentral Btwr,
+                                                               std::array<uint32_t, 4> & outTOB) override;
+
+
+
+  private:
+
+    unsigned int m_aFPGA_A;
+    unsigned int m_bFPGA_A;
+    unsigned int m_aFPGA_B;
+    unsigned int m_bFPGA_B;
+    int m_gBlockthreshold;
+
+
+    virtual void gBlockAB(gTowersCentral twrs, gTowersCentral & gBlkSum);
+
+    virtual void metFPGA(gTowersCentral twrs, gTowersCentral & gBlkSum,
+                           unsigned short & MHT_x, unsigned short & MHT_y,
+                           unsigned short & MST_x, unsigned short & MST_y,
+                           unsigned short & MET_x, unsigned short & MET_y);
+
+    virtual void metTotal(unsigned short A_MET_x, unsigned short A_MET_y,
+                          unsigned short B_MET_x, unsigned short B_MET_y,
+                          unsigned short & MET_x, unsigned short & MET_y, unsigned short & MET);
+
+    virtual void sumEtFPGA(gTowersCentral twrs, unsigned int & partial_sumEt);
+
+    virtual void sumEt(unsigned int  A_sumEt, unsigned int  B_sumEt, unsigned int & total_sumEt);
+
+    virtual unsigned short sinLUT(unsigned int phiIDX, unsigned int aw, unsigned int dw);
+
+    virtual unsigned short cosLUT(unsigned int phiIDX, unsigned int aw, unsigned int dw);
+
+
+  };
+
+} // end of namespace
+
+
+#endif
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXJwoJTOB.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXJwoJTOB.h
new file mode 100644
index 0000000000000000000000000000000000000000..f61e3cdcd50f4ca41655c37baf87c83bf148fbc5
--- /dev/null
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXJwoJTOB.h
@@ -0,0 +1,55 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+//***************************************************************************
+//    gFEXJwoJTOB - Forms the JwoJ TOBs for gFEX
+//                              -------------------
+//     begin                : 10 08 2021
+//     email                : cecilia.tosciri@cern.ch
+//***************************************************************************
+
+#pragma once
+#include "AthenaKernel/CLASS_DEF.h"
+
+namespace LVL1 {
+  class gFEXJwoJTOB
+  {
+    //gFEXJwoJTOB class description below:
+    /** The gFEXJwoJTOB.h class stores the energy, the eta, phi coordinate,
+     * the status and the type (gRho, gBlock, gJwoJ) of the gFEX JwoJ TOBs
+     */
+  private:
+    uint32_t     m_word;
+    unsigned int m_quantity1;
+    unsigned int m_quantity2;
+    unsigned int m_st1;
+    unsigned int m_st2;
+    unsigned int m_satur;
+    unsigned int m_tobID;
+
+
+  public:
+    gFEXJwoJTOB();
+    ~gFEXJwoJTOB() {};
+
+    inline uint32_t      getWord() const {return m_word;}
+    inline unsigned  int getQuantity1() const {return m_quantity1;}
+    inline unsigned  int getQuantity2() const {return m_quantity2;}
+    inline unsigned  int getStatus1() const {return m_st1;}
+    inline unsigned  int getStatus2() const {return m_st2;}
+    inline unsigned  int getSaturation() const {return m_satur;}
+    inline unsigned  int getTobID() const {return m_tobID;}
+
+
+    void setWord(uint32_t);
+    void setQuantity1(unsigned int);
+    void setQuantity2(unsigned int);
+    void setStatus1(unsigned int);
+    void setStatus2(unsigned int);
+    void setSaturation(unsigned int);
+    void setTobID(unsigned int);
+  };
+
+} // end of namespace
+
+CLASS_DEF( LVL1::gFEXJwoJTOB, 2352924 , 1 )
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXNtupleWriter.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXNtupleWriter.h
index 028a7319277eddaa86c457aac38563e1446924dc..9d24e718222c993bc133286cea98576b0d1fb11f 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXNtupleWriter.h
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXNtupleWriter.h
@@ -31,11 +31,13 @@ public:
 private:
   gFEXOutputCollection* m_gFEXOutputCollection;
   float m_jet_nTOBs;
+  float m_global_nTOBs;
   bool m_load_truth_jet;
 
   std::vector<float> m_truth_jet_eta;
   std::vector<float> m_truth_jet_phi;
   std::vector<float> m_truth_jet_ET;
+
   std::vector<float> m_jet_TOB;
   std::vector<float> m_jet_TOB_Eta;
   std::vector<float> m_jet_TOB_Phi;
@@ -43,10 +45,20 @@ private:
   std::vector<float> m_jet_TOB_ID;
   std::vector<float> m_jet_TOB_Status;
 
+
+  std::vector<float> m_global_TOB;
+  std::vector<float> m_global_TOB_Quantity1;
+  std::vector<float> m_global_TOB_Quantity2;
+  std::vector<float> m_global_TOB_Saturation;
+  std::vector<float> m_global_TOB_ID;
+  std::vector<float> m_global_TOB_Status1;
+  std::vector<float> m_global_TOB_Status2;
+
   std::string m_jet_container_name = "AntiKt10TruthJets";
   TTree *m_myTree;
 
   StatusCode loadJetAlgoVariables();
+  StatusCode loadGlobalAlgoVariables();
   StatusCode loadTruthElectron();
   StatusCode loadTruthJets();
 
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXOutputCollection.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXOutputCollection.h
index d794848d943f19e4dce471e432052d761066e264..77f0d7815a0d6cbce81f713676e1e5174a037cdc 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXOutputCollection.h
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXOutputCollection.h
@@ -31,7 +31,8 @@ namespace LVL1 {
     ~gFEXOutputCollection();
 
 
-    void clear();
+    void clearJets();
+    void clearGlobals();
 
     /**
      * @brief add a value related to the jet finder algorithm for a TOB
@@ -41,29 +42,38 @@ namespace LVL1 {
      *
      */
     void addValueJet(std::string key, float value);
+    void addValueGlobal(std::string key, float value);
 
     //Save all jet values. Use only after finishing defining all jet values for one TOB.
     void fillJet();
+    void fillGlobal();
 
     //Get total number of TOBs saved
-    int size();
+    int jetsSize();
+    int globalsSize();
 
-    //Get all jeta related values the ith TOB
+    //Get all jets related values
     std::unordered_map<std::string, float> getJet(int) const;
+    std::unordered_map<std::string, float> getGlobal(int) const;
 
     //Add a 32-bit jet TOB word
     void addJetTob(uint32_t);
+    void addGlobalTob(uint32_t);
 
     //Get all jet TOB words of an event
     std::vector<uint32_t> getJetTob() const;
+    std::vector<uint32_t> getGlobalTob() const;
 
   private:
     //vector of TOB words
     std::vector<uint32_t> m_jettob;
+    std::vector<uint32_t> m_globaltob;
     // /// jet related values of a TOB
     std::unordered_map<std::string, float> m_values_gFEXJet;
+    std::unordered_map<std::string, float> m_values_gFEXGlobal;
     /// jet related values of all TOBs in an event
     std::vector<std::unordered_map<std::string, float>> m_allvalues_gFEXjet;
+    std::vector<std::unordered_map<std::string, float>> m_allvalues_gFEXglobal;
 
   };
 }
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSim.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSim.h
index abf5683b0a20f40e578fde1e0283490a85bff51b..8822ebb4698a8128fee3a7683ebd471ec2bfe4c9 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSim.h
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSim.h
@@ -17,6 +17,8 @@
 #include "L1CaloFEXSim/gFEXFPGA.h"
 #include "L1CaloFEXSim/gFEXJetAlgo.h"
 #include "L1CaloFEXSim/gFEXJetTOB.h"
+#include "L1CaloFEXSim/gFEXJwoJAlgo.h"
+#include "L1CaloFEXSim/gFEXJwoJTOB.h"
 #include "L1CaloFEXSim/gFEXOutputCollection.h"
 
 
@@ -39,14 +41,10 @@ namespace LVL1 {
     /** Destructor */
     virtual ~gFEXSim();
 
-    //virtual void init (int id) override ;
-
     virtual void reset () override ;
 
     virtual void execute() override ;
 
-    //virtual int ID() override {return m_id;}
-
     virtual StatusCode executegFEXSim(gTowersIDs tmp) override;
 
     virtual std::vector<uint32_t> getgRhoTOBs() const override;
@@ -55,6 +53,8 @@ namespace LVL1 {
 
     virtual std::vector<uint32_t> getgJetTOBs() const override;
 
+    virtual std::vector<uint32_t> getgGlobalTOBs() const override;
+
     /** Internal data */
   private:
 
@@ -68,15 +68,15 @@ namespace LVL1 {
 
     std::vector<uint32_t>  m_gJetTobWords;
 
-    // std::array<uint32_t>  m_gRhoTobWords;
+    std::vector<uint32_t>  m_gGlobalTobWords;
 
-    // std::array<uint32_t>  m_gBlockTobWords;
 
-    // std::array<uint32_t>  m_gJetTobWords;
 
     ToolHandle<IgFEXFPGA> m_gFEXFPGA_Tool {this, "gFEXFPGATool", "LVL1::gFEXFPGA", "Tool that simulates the FPGA hardware"};
 
     ToolHandle<IgFEXJetAlgo> m_gFEXJetAlgoTool {this, "gFEXJetAlgoTool", "LVL1::gFEXJetAlgo", "Tool that runs the gFEX jet algorithm"};
+
+    ToolHandle<IgFEXJwoJAlgo> m_gFEXJwoJAlgoTool {this, "gFEXJwoJAlgoTool", "LVL1::gFEXJwoJAlgo", "Tool that runs the gFEX Jets without Jets algorithm"};
   };
 
 } // end of namespace
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSysSim.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSysSim.h
index 8a10da2b01413e63bf32a1317441f83eab2b1bf4..4be59907783a4a4523c0d374c85bd1dbc675f32c 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSysSim.h
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSysSim.h
@@ -20,6 +20,10 @@
 #include "xAODTrigger/gFexJetRoIContainer.h"
 #include "xAODTrigger/gFexJetRoIAuxContainer.h"
 
+#include "xAODTrigger/gFexGlobalRoI.h"
+#include "xAODTrigger/gFexGlobalRoIContainer.h"
+#include "xAODTrigger/gFexGlobalRoIAuxContainer.h"
+
 namespace LVL1 {
 
   //Doxygen class description below:
@@ -56,6 +60,8 @@ namespace LVL1 {
 
     virtual StatusCode fillgJetEDM(uint32_t tobWord) override ;
 
+    virtual StatusCode fillgGlobalEDM(uint32_t tobWord) override ;
+
     /** Internal data */
   private:
     std::unique_ptr< xAOD::gFexJetRoIContainer > m_gRhoContainer;
@@ -67,6 +73,10 @@ namespace LVL1 {
     std::unique_ptr< xAOD::gFexJetRoIContainer > m_gJetContainer;
     std::unique_ptr< xAOD::gFexJetRoIAuxContainer > m_gJetAuxContainer;
 
+    std::unique_ptr< xAOD::gFexGlobalRoIContainer > m_gGlobalContainer;
+    std::unique_ptr< xAOD::gFexGlobalRoIAuxContainer > m_gGlobalAuxContainer;
+
+
     std::vector<gFEXSim*> m_gFEXCollection;
 
     ToolHandle<IgFEXSim> m_gFEXSimTool       {this, "gFEXSimTool",    "LVL1::gFEXSim",    "Tool that creates the gFEX Simulation"};
@@ -75,10 +85,12 @@ namespace LVL1 {
     SG::ReadHandleKey<CaloCellContainer> m_scellsCollectionSGKey {this, "SCell", "SCell", "SCell"};
 
     SG::WriteHandleKey< xAOD::gFexJetRoIContainer > m_gFexJetOutKey {this,"Key_gFexJetOutputContainer","L1_gJetRoI","Output gFexJet container"};
+    SG::WriteHandleKey< xAOD::gFexGlobalRoIContainer > m_gFexGlobalOutKey {this,"Key_gFexGlobalOutputContainer","L1_gJetRoI","Output gFexGlobal container"};
 
     std::vector<uint32_t>  m_allgRhoTobs;
     std::vector<uint32_t>  m_allgBlockTobs;
     std::vector<uint32_t>  m_allgJetTobs;
+    std::vector<uint32_t>  m_allgGlobalTobs;
 
   };
 
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/gFEXDriverJobOptions.py b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/gFEXDriverJobOptions.py
index 931b4c1b05301cae687cb8af65bf1f2c7a84bca1..36ac564ea3be0e4694910c447316ea8b4145cdc9 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/gFEXDriverJobOptions.py
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/gFEXDriverJobOptions.py
@@ -40,6 +40,5 @@ svcMgr.THistSvc.Output += ["ANALYSIS DATAFILE='myfile.root' OPT='RECREATE'"]
 log.info("==========================================================")
 log.info("Scheduling gFEXDriver")
 athAlgSeq += CfgMgr.LVL1__gFEXDriver('MygFEXDriver')
-#athAlgSeq += CfgMgr.LVL1__gFEXNtupleWriter('MygFEXNtupleWriter')
 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 c94b2ccb0b9e3fbcce5bc8e238e92690a9f45135..2d053fcc4c039bab6cda775be12ac980fd071ab7 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx
@@ -32,6 +32,7 @@
 #include "L1CaloFEXSim/gFEXSim.h"
 #include "L1CaloFEXSim/gFEXFPGA.h"
 #include "L1CaloFEXSim/gFEXJetAlgo.h"
+#include "L1CaloFEXSim/gFEXJwoJAlgo.h"
 #include "L1CaloFEXSim/gFEXNtupleWriter.h"
 
 
@@ -75,5 +76,6 @@ DECLARE_COMPONENT(gTowerBuilder)
 DECLARE_COMPONENT(gSuperCellTowerMapper)
 DECLARE_COMPONENT(gFEXFPGA)
 DECLARE_COMPONENT(gFEXJetAlgo)
+DECLARE_COMPONENT(gFEXJwoJAlgo)
 DECLARE_COMPONENT(gFEXNtupleWriter)
 
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXDriver.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXDriver.cxx
index e0e745ebcad67751ecd7bae3a5624604541f615f..6a6d1cdb1f6337d0845693d2565b5ef2e99fec63 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXDriver.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXDriver.cxx
@@ -11,6 +11,7 @@
 #include "L1CaloFEXSim/gFEXSim.h"
 #include "L1CaloFEXSim/gFEXOutputCollection.h"
 #include "L1CaloFEXSim/gFEXJetTOB.h"
+#include "L1CaloFEXSim/gFEXJwoJTOB.h"
 
 #include "StoreGate/WriteHandle.h"
 #include "StoreGate/ReadHandle.h"
@@ -83,7 +84,7 @@ StatusCode gFEXDriver::initialize()
   //STEP 1 - Do some monitoring
   gFEXOutputCollection* my_gFEXOutputCollection = new gFEXOutputCollection();
   ATH_CHECK( evtStore()->record(my_gFEXOutputCollection,"gFEXOutputCollection") );
-  
+
   // SG::WriteHandle<LVL1::gFEXOutputCollection> gFEXOutputCollectionSG(m_gFEXOutputCollectionSGKey);
   // ATH_CHECK(gFEXOutputCollectionSG.record(std::move(my_gFEXOutputCollection)));
 
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXJwoJAlgo.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXJwoJAlgo.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..6a2d1baea8fc410dc02a0dea156c34f1ec8197ea
--- /dev/null
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXJwoJAlgo.cxx
@@ -0,0 +1,312 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+//***************************************************************************
+//    gFEXJwoJAlg - Jets without jets algorithm for gFEX
+//                              -------------------
+//     begin                : 10 08 2021
+//     email                : cecilia.tosciri@cern.ch
+//***************************************************************************
+
+#define _USE_MATH_DEFINES
+#include <cmath>
+#include <vector>
+
+#include "L1CaloFEXSim/gFEXJwoJAlgo.h"
+#include "L1CaloFEXSim/gFEXJwoJTOB.h"
+#include "L1CaloFEXSim/gTowerContainer.h"
+#include "L1CaloFEXSim/gTower.h"
+
+namespace LVL1 {
+
+  // default constructor for persistency
+gFEXJwoJAlgo::gFEXJwoJAlgo(const std::string& type, const std::string& name, const IInterface* parent):
+    AthAlgTool(type, name, parent)
+  {
+    declareInterface<IgFEXJwoJAlgo>(this);
+  }
+
+
+StatusCode gFEXJwoJAlgo::initialize(){
+
+  return StatusCode::SUCCESS;
+
+}
+
+
+void gFEXJwoJAlgo::setAlgoConstant(unsigned int aFPGA_A, unsigned int bFPGA_A,
+                                  unsigned int aFPGA_B, unsigned int bFPGA_B,
+                                  int gblockThreshold) {
+  m_aFPGA_A = aFPGA_A;
+  m_bFPGA_A = bFPGA_A;
+  m_aFPGA_B = aFPGA_B;
+  m_bFPGA_B = bFPGA_B;
+  m_gBlockthreshold = gblockThreshold;
+}
+
+
+
+std::vector<std::unique_ptr<gFEXJwoJTOB>> gFEXJwoJAlgo::jwojAlgo(gTowersCentral Atwr, gTowersCentral Btwr,
+                                                                std::array<uint32_t, 4> & outTOB) {
+
+
+  // find gBlocks
+  gTowersCentral gBLKA;
+  gBlockAB(Atwr, gBLKA);
+
+
+  gTowersCentral gBLKB;
+  gBlockAB(Btwr, gBLKB);
+
+  //FPGA A observables
+  unsigned short A_MHT_x = 0x0;
+  unsigned short A_MHT_y = 0x0;
+  unsigned short A_MST_x = 0x0;
+  unsigned short A_MST_y = 0x0;
+  unsigned short A_MET_x = 0x0;
+  unsigned short A_MET_y = 0x0;
+
+  unsigned int A_sumEt = 0x0;
+
+  //FPGA B observables
+  unsigned short B_MHT_x = 0x0;
+  unsigned short B_MHT_y = 0x0;
+  unsigned short B_MST_x = 0x0;
+  unsigned short B_MST_y = 0x0;
+  unsigned short B_MET_x = 0x0;
+  unsigned short B_MET_y = 0x0;
+
+  unsigned int B_sumEt = 0x0;
+
+  //Global observables
+  unsigned short MET_x = 0x0;
+  unsigned short MET_y = 0x0;
+  unsigned short MET = 0x0;
+
+  unsigned int total_sumEt = 0x0;
+  unsigned int MHT_x = 0x0;
+  unsigned int MHT_y = 0x0;
+  unsigned int MST_x = 0x0;
+  unsigned int MST_y = 0x0;
+
+
+  metFPGA(Atwr, gBLKA, A_MHT_x, A_MHT_y, A_MST_x, A_MST_y, A_MET_x, A_MET_y);
+  metFPGA(Btwr, gBLKB, B_MHT_x, B_MHT_y, B_MST_x, B_MST_y, B_MET_x, B_MET_y);
+
+  metTotal(A_MET_x, A_MET_y, B_MET_x, B_MET_y, MET_x, MET_y, MET);
+
+  sumEtFPGA(Atwr, A_sumEt);
+  sumEtFPGA(Btwr, B_sumEt);
+
+  sumEt(A_sumEt, B_sumEt, total_sumEt);
+  sumEt(A_MHT_x, B_MHT_x, MHT_x);
+  sumEt(A_MHT_y, B_MHT_y, MHT_y);
+  sumEt(A_MST_x, B_MST_x, MST_x);
+  sumEt(A_MST_y, B_MST_y, MST_y);
+
+  //Define a vector to be filled with all the TOBs of one event
+  std::vector<std::unique_ptr<gFEXJwoJTOB>> tobs_v;
+  tobs_v.resize(4);
+
+
+  // fill in TOBs
+  // The order of the TOBs is given according to the TOB ID (TODO: check how it's done in fw)
+
+  // First TOB is (MET, SumEt)
+  outTOB[0] = total_sumEt; //set the Quantity2 to the corresponding slot (LSB)
+  outTOB[0] = outTOB[0] | (MET  &  0x00000FFF) << 12;//Quantity 1 (in bit number 12)
+  if (total_sumEt != 0) outTOB[0] = outTOB[0] | 0x00000001 << 24;//Status bit for Quantity 2 (0 if quantity is null)
+  if (MET != 0) outTOB[0] = outTOB[0] | 0x00000001 << 25;//Status bit for Quantity 1 (0 if quantity is null)
+  outTOB[0] = outTOB[0] | (1  &  0x0000001F) << 26;//TOB ID is 1 for scalar values (5 bits starting at 26)
+
+// Second TOB is (MET_x, MET_y)
+  outTOB[1] = MET_y; //set the Quantity2 to the corresponding slot (LSB)
+  outTOB[1] = outTOB[1] | (MET_x  &  0x00000FFF) << 12;//Quantity 1 (in bit number 12)
+  if (MET_y != 0) outTOB[1] = outTOB[1] | 0x00000001 << 24;//Status bit for Quantity 2 (0 if quantity is null)
+  if (MET_x != 0) outTOB[1] = outTOB[1] | 0x00000001 << 25;//Status bit for Quantity 1 (0 if quantity is null)
+  outTOB[1] = outTOB[1] | (2  &  0x0000001F) << 26;//TOB ID is 2 for MET_x, MET_y (5 bits starting at 26)
+
+// Third TOB is hard components (MHT_x, MHT_y)
+  outTOB[2] = MHT_y; //set the Quantity2 to the corresponding slot (LSB)
+  outTOB[2] = outTOB[2] | (MHT_x  &  0x00000FFF) << 12;//Quantity 1 (in bit number 12)
+  if (MHT_y != 0) outTOB[2] = outTOB[2] | 0x00000001 << 24;//Status bit for Quantity 2 (0 if quantity is null)
+  if (MHT_x != 0) outTOB[2] = outTOB[2] | 0x00000001 << 25;//Status bit for Quantity 1 (0 if quantity is null)
+  outTOB[2] = outTOB[2] | (3  &  0x0000001F) << 26;//TOB ID is 3 for hard components (5 bits starting at 26)
+
+  // Fourth TOB is hard components (MHT_x, MHT_y)
+  outTOB[3] = MST_y; //set the Quantity2 to the corresponding slot (LSB)
+  outTOB[3] = outTOB[3] | (MST_x  &  0x00000FFF) << 12;//Quantity 1 (in bit number 12)
+  if (MST_y != 0) outTOB[3] = outTOB[3] | 0x00000001 << 24;//Status bit for Quantity 2 (0 if quantity is null)
+  if (MST_x != 0) outTOB[3] = outTOB[3] | 0x00000001 << 25;//Status bit for Quantity 1 (0 if quantity is null)
+  outTOB[3] = outTOB[3] | (4  &  0x0000001F) << 26;//TOB ID is 4 for soft components (5 bits starting at 26)
+
+
+  tobs_v[0] = std::make_unique<gFEXJwoJTOB>();
+  tobs_v[0]->setWord(outTOB[0]);
+  tobs_v[0]->setQuantity1(MET);
+  tobs_v[0]->setQuantity2(total_sumEt);
+  tobs_v[0]->setSaturation(0); //Always 0 for now, need a threshold?
+  tobs_v[0]->setTobID(1);
+  if( MET != 0 ) tobs_v[0]->setStatus1(1);
+  else tobs_v[0]->setStatus1(0);
+  if(total_sumEt!= 0) tobs_v[0]->setStatus2(1);
+  else tobs_v[0]->setStatus2(0);
+
+  tobs_v[1] = std::make_unique<gFEXJwoJTOB>();
+  tobs_v[1]->setWord(outTOB[1]);
+  tobs_v[1]->setQuantity1(MET_x);
+  tobs_v[1]->setQuantity2(MET_y);
+  tobs_v[1]->setSaturation(0); //Always 0 for now, need a threshold?
+  tobs_v[1]->setTobID(2);
+  if( MET_x != 0 ) tobs_v[1]->setStatus1(1);
+  else tobs_v[1]->setStatus1(0);
+  if(MET_y!= 0) tobs_v[1]->setStatus2(1);
+  else tobs_v[1]->setStatus2(0);
+
+  tobs_v[2] = std::make_unique<gFEXJwoJTOB>();
+  tobs_v[2]->setWord(outTOB[2]);
+  tobs_v[2]->setQuantity1(MHT_x);
+  tobs_v[2]->setQuantity2(MHT_y);
+  tobs_v[2]->setSaturation(0); //Always 0 for now, need a threshold?
+  tobs_v[2]->setTobID(3);
+  if( MHT_x != 0 ) tobs_v[2]->setStatus1(1);
+  else tobs_v[2]->setStatus1(0);
+  if(MHT_y!= 0) tobs_v[2]->setStatus2(1);
+  else tobs_v[2]->setStatus2(0);
+
+  tobs_v[3] = std::make_unique<gFEXJwoJTOB>();
+  tobs_v[3]->setWord(outTOB[3]);
+  tobs_v[3]->setQuantity1(MST_x);
+  tobs_v[3]->setQuantity2(MST_y);
+  tobs_v[3]->setSaturation(0); //Always 0 for now, need a threshold?
+  tobs_v[3]->setTobID(4);
+  if( MST_x != 0 ) tobs_v[3]->setStatus1(1);
+  else tobs_v[2]->setStatus1(0);
+  if(MST_y!= 0) tobs_v[3]->setStatus2(1);
+  else tobs_v[3]->setStatus2(0);
+
+
+  return tobs_v;
+
+}
+
+
+
+void gFEXJwoJAlgo::gBlockAB(gTowersCentral twrs, gTowersCentral & gBlkSum){
+
+  int rows = twrs.size();
+  int cols = twrs[0].size();
+
+  for( int irow = 0; irow < rows; irow++ ){
+    for(int jcolumn = 0; jcolumn<cols; jcolumn++){
+      // zero jet sum here
+      gBlkSum[irow][jcolumn] = 0;
+      int krowUp = (irow + 1)%32;
+      int krowDn = (irow - 1 +32)%32;
+      if( (jcolumn == 0) || (jcolumn == 6) ) {
+        //left edge case
+        gBlkSum[irow][jcolumn] =
+          twrs[irow][jcolumn]   + twrs[krowUp][jcolumn]   + twrs[krowDn][jcolumn]   +
+          twrs[irow][jcolumn+1] + twrs[krowUp][jcolumn+1] + twrs[krowDn][jcolumn+1];
+            } else if( (jcolumn == 5) || (jcolumn == 11)) {
+        //  right edge case
+        gBlkSum[irow][jcolumn] =
+          twrs[irow][jcolumn]   + twrs[krowUp][jcolumn]   + twrs[krowDn][jcolumn]   +
+          twrs[irow][jcolumn-1] + twrs[krowUp][jcolumn-1] + twrs[krowDn][jcolumn-1];
+            } else{
+        // normal case
+        gBlkSum[irow][jcolumn] =
+          twrs[irow][jcolumn]   + twrs[krowUp][jcolumn]   + twrs[krowDn][jcolumn]   +
+          twrs[irow][jcolumn-1] + twrs[krowUp][jcolumn-1] + twrs[krowDn][jcolumn-1] +
+          twrs[irow][jcolumn+1] + twrs[krowUp][jcolumn+1] + twrs[krowDn][jcolumn+1];
+        }
+    }
+  }
+
+}
+
+
+void gFEXJwoJAlgo::metFPGA(gTowersCentral twrs, gTowersCentral & gBlkSum,
+                           unsigned short & MHT_x, unsigned short & MHT_y,
+                           unsigned short & MST_x, unsigned short & MST_y,
+                           unsigned short & MET_x, unsigned short & MET_y){
+
+  int rows = twrs.size();
+  int cols = twrs[0].size();
+
+  for( int irow = 0; irow < rows; irow++ ){
+    for(int jcolumn = 0; jcolumn<cols; jcolumn++){
+      if(gBlkSum[irow][jcolumn] > m_gBlockthreshold){
+        MHT_x += (twrs[irow][jcolumn])*cosLUT(irow, 5, 6);
+        MHT_y += (twrs[irow][jcolumn])*sinLUT(irow, 5, 6);
+      }
+      else{
+       MST_x += (twrs[irow][jcolumn])*cosLUT(irow, 5, 6);
+       MST_y += (twrs[irow][jcolumn])*sinLUT(irow, 5, 6);
+      }
+    }
+  }
+
+  MET_x = m_aFPGA_A * MHT_x + m_bFPGA_A * MST_x;
+  MET_y = m_aFPGA_B * MHT_y + m_bFPGA_B * MST_y;
+
+}
+
+void gFEXJwoJAlgo::metTotal(unsigned short A_MET_x, unsigned short A_MET_y,
+                            unsigned short B_MET_x, unsigned short B_MET_y,
+                            unsigned short & MET_x, unsigned short & MET_y, unsigned short & MET){
+
+  MET_x = A_MET_x + B_MET_x;
+  MET_y = A_MET_y + B_MET_y;
+  MET   = sqrt((MET_x * MET_x) + (MET_y * MET_y));
+
+}
+
+
+void gFEXJwoJAlgo::sumEtFPGA(gTowersCentral twrs, unsigned int & partial_sumEt ){
+
+  int rows = twrs.size();
+  int cols = twrs[0].size();
+
+  for( int irow = 0; irow < rows; irow++ ){
+    for(int jcolumn = 0; jcolumn<cols; jcolumn++){
+      partial_sumEt += twrs[irow][jcolumn];
+    }
+  }
+
+}
+
+void gFEXJwoJAlgo::sumEt(unsigned int  A_sumEt, unsigned int  B_sumEt, unsigned int & total_sumEt ){
+
+  total_sumEt = A_sumEt + B_sumEt;
+
+}
+
+//----------------------------------------------------------------------------------
+// bitwise simulation of sine LUT in firmware
+//----------------------------------------------------------------------------------
+unsigned short gFEXJwoJAlgo::sinLUT(unsigned int phiIDX, unsigned int aw, unsigned int dw)
+{
+  float c = ((float)phiIDX)/pow(2,aw);
+  float rad = 2*M_PI*c;
+  float rsin = sin(rad);
+
+  return static_cast<unsigned short>(round((pow(2.0,dw-1)-1.0)*rsin));
+}
+
+//----------------------------------------------------------------------------------
+// bitwise simulation cosine LUT in firmware
+//----------------------------------------------------------------------------------
+unsigned short gFEXJwoJAlgo::cosLUT(unsigned int phiIDX, unsigned int aw, unsigned int dw)
+{
+  float c = ((float)phiIDX)/pow(2,aw);
+  float rad = 2*M_PI*c;
+  float rcos = cos(rad);
+
+  return static_cast<unsigned short>(round((pow(2.0,dw-1)-1.0)*rcos));
+}
+
+
+
+
+} // namespace LVL1
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXJwoJTOB.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXJwoJTOB.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..4db19172c4f792bb8b10693c0d8ed8013dc1816e
--- /dev/null
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXJwoJTOB.cxx
@@ -0,0 +1,61 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+//***************************************************************************
+//    gFEXJwoJTOB - Forms the Jets without Jets TOBs for gFEX
+//                              -------------------
+//     begin                : 11 08 2021
+//     email                : cecilia.tosciri@cern.ch
+//***************************************************************************
+
+#include "L1CaloFEXSim/gFEXJwoJTOB.h"
+
+
+LVL1::gFEXJwoJTOB::gFEXJwoJTOB():
+  m_word{99999},
+  m_quantity1{99999},
+  m_quantity2{99999},
+  m_st1{99999},
+  m_st2{99999},
+  m_satur{99999},
+  m_tobID{99999}
+{}
+
+ void setWord(uint32_t);
+    void setQuantity1(unsigned int);
+    void setQuantity2(unsigned int);
+    void setStatus1(unsigned int);
+    void setStatus2(unsigned int);
+    void setSaturation(unsigned int);
+    void setTobID(unsigned int);
+
+
+void LVL1::gFEXJwoJTOB::setWord(uint32_t word) {
+  m_word = word;
+}
+
+void LVL1::gFEXJwoJTOB::setQuantity1(unsigned int quantity1) {
+  m_quantity1 = quantity1;
+}
+
+void LVL1::gFEXJwoJTOB::setQuantity2(unsigned int quantity2) {
+  m_quantity2 = quantity2;
+}
+
+void LVL1::gFEXJwoJTOB::setStatus1(unsigned int st1) {
+  m_st1 = st1;
+}
+
+void LVL1::gFEXJwoJTOB::setStatus2(unsigned int st2) {
+  m_st2 = st2;
+}
+
+void LVL1::gFEXJwoJTOB::setSaturation(unsigned int satur) {
+  m_satur = satur;
+}
+
+void LVL1::gFEXJwoJTOB::setTobID(unsigned int tobID) {
+  m_tobID = tobID;
+}
+
+
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXNtupleWriter.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXNtupleWriter.cxx
index 89fbb74ea9cfe1f5aa3a6d33599122e90a4f1099..65bf4216f4cbdf16686e9895a18c3ed7bb58066b 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXNtupleWriter.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXNtupleWriter.cxx
@@ -12,6 +12,8 @@
 #include "StoreGate/StoreGateSvc.h"
 #include "L1CaloFEXSim/gFEXJetTOB.h"
 #include "L1CaloFEXSim/gFEXJetAlgo.h"
+#include "L1CaloFEXSim/gFEXJwoJTOB.h"
+#include "L1CaloFEXSim/gFEXJwoJAlgo.h"
 #include "L1CaloFEXSim/gFEXOutputCollection.h"
 #include <vector>
 #include "TTree.h"
@@ -51,6 +53,15 @@ StatusCode LVL1::gFEXNtupleWriter::initialize () {
   m_myTree->Branch ("jet_TOB_Status",  &m_jet_TOB_Status);
   m_myTree->Branch ("jet_nTOBs",  &m_jet_nTOBs);
 
+  m_myTree->Branch ("global_TOB", &m_global_TOB);
+  m_myTree->Branch ("global_TOB_Quantity1", &m_global_TOB_Quantity1);
+  m_myTree->Branch ("global_TOB_Quantity2", &m_global_TOB_Quantity2);
+  m_myTree->Branch ("global_TOB_Saturation", &m_global_TOB_Saturation);
+  m_myTree->Branch ("global_TOB_ID",  &m_global_TOB_ID);
+  m_myTree->Branch ("global_TOB_Status1",  &m_global_TOB_Status1);
+  m_myTree->Branch ("global_TOB_Status2",  &m_global_TOB_Status2);
+  m_myTree->Branch ("global_nTOBs",  &m_global_nTOBs);
+
   return StatusCode::SUCCESS;
 }
 
@@ -66,6 +77,8 @@ StatusCode LVL1::gFEXNtupleWriter::execute () {
     CHECK(loadTruthJets());
   }
 
+  CHECK(loadGlobalAlgoVariables());
+
   m_myTree->Fill();
   return StatusCode::SUCCESS;
 }
@@ -84,8 +97,8 @@ StatusCode LVL1::gFEXNtupleWriter::loadJetAlgoVariables() {
   m_jet_TOB_Status.clear();
 
 
-  m_jet_nTOBs = m_gFEXOutputCollection->size();
-  for (int i = 0; i < m_gFEXOutputCollection->size(); i++)
+  m_jet_nTOBs = m_gFEXOutputCollection->jetsSize();
+  for (int i = 0; i < m_gFEXOutputCollection->jetsSize(); i++)
   {
     uint32_t TOB = m_gFEXOutputCollection->getJetTob()[i];
     m_jet_TOB.push_back(TOB);
@@ -100,6 +113,30 @@ StatusCode LVL1::gFEXNtupleWriter::loadJetAlgoVariables() {
   return StatusCode::SUCCESS;
 }
 
+StatusCode LVL1::gFEXNtupleWriter::loadGlobalAlgoVariables() {
+  m_global_TOB.clear();
+  m_global_TOB_Quantity1.clear();
+  m_global_TOB_Quantity2.clear();
+  m_global_TOB_Saturation.clear();
+  m_global_TOB_ID.clear();
+  m_global_TOB_Status1.clear();
+  m_global_TOB_Status2.clear();
+
+  m_global_nTOBs = m_gFEXOutputCollection->globalsSize();
+  for (int i = 0; i < m_gFEXOutputCollection->globalsSize(); i++)
+  {
+    uint32_t TOB = m_gFEXOutputCollection->getGlobalTob()[i];
+    m_global_TOB.push_back(TOB);
+    std::unordered_map<std::string, float> gFEXglobalvalue = (m_gFEXOutputCollection->getGlobal(i));
+    m_global_TOB_Quantity1.push_back(gFEXglobalvalue["GlobalQuantity1"]);
+    m_global_TOB_Quantity2.push_back(gFEXglobalvalue["GlobalQuantity2"]);
+    m_global_TOB_Saturation.push_back(gFEXglobalvalue["SaturationGlobal"]);
+    m_global_TOB_ID.push_back(gFEXglobalvalue["TobIDJet"]);
+    m_global_TOB_Status1.push_back(gFEXglobalvalue["GlobalStatus1"]);
+    m_global_TOB_Status2.push_back(gFEXglobalvalue["GlobalStatus2"]);
+  }
+  return StatusCode::SUCCESS;
+}
 
 StatusCode LVL1::gFEXNtupleWriter::loadTruthJets() {
   m_truth_jet_eta.clear();
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXOutputCollection.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXOutputCollection.cxx
index 15d35fb5d3ddaa1bbed509879181f993439b7eb3..54f5c89ec428f32f0bad598dfbcd7451c7dec8d2 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXOutputCollection.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXOutputCollection.cxx
@@ -14,7 +14,7 @@ LVL1::gFEXOutputCollection::~gFEXOutputCollection()
 {
 }
 
-void LVL1::gFEXOutputCollection::clear()
+void LVL1::gFEXOutputCollection::clearJets()
 {
   for (auto iValues : m_allvalues_gFEXjet) {
     iValues.clear();
@@ -22,21 +22,26 @@ void LVL1::gFEXOutputCollection::clear()
   m_jettob.clear();
 }
 
+void LVL1::gFEXOutputCollection::clearGlobals()
+{
+  for (auto iValues : m_allvalues_gFEXglobal) {
+    iValues.clear();
+  }
+  m_globaltob.clear();
+}
 
 void LVL1::gFEXOutputCollection::addValueJet(std::string key, float value)
 {
   m_values_gFEXJet.emplace(std::move(key), value);
 }
 
-
 void LVL1::gFEXOutputCollection::fillJet()
 {
   m_allvalues_gFEXjet.push_back(std::move(m_values_gFEXJet));
   m_values_gFEXJet.clear();
 }
 
-
-int LVL1::gFEXOutputCollection::size()
+int LVL1::gFEXOutputCollection::jetsSize()
 {
   return m_allvalues_gFEXjet.size();
 }
@@ -46,7 +51,6 @@ std::unordered_map<std::string, float> LVL1::gFEXOutputCollection::getJet(int lo
   return m_allvalues_gFEXjet[location];
 }
 
-
 void LVL1::gFEXOutputCollection::addJetTob(uint32_t jettob)
 {
   m_jettob.push_back(jettob);
@@ -56,3 +60,36 @@ std::vector<uint32_t> LVL1::gFEXOutputCollection::getJetTob() const
 {
   return m_jettob;
 }
+
+
+
+void LVL1::gFEXOutputCollection::addValueGlobal(std::string key, float value)
+{
+  m_values_gFEXGlobal.emplace(std::move(key), value);
+}
+
+void LVL1::gFEXOutputCollection::fillGlobal()
+{
+  m_allvalues_gFEXglobal.push_back(std::move(m_values_gFEXGlobal));
+  m_values_gFEXGlobal.clear();
+}
+
+int LVL1::gFEXOutputCollection::globalsSize()
+{
+  return m_allvalues_gFEXglobal.size();
+}
+
+std::unordered_map<std::string, float> LVL1::gFEXOutputCollection::getGlobal(int location) const
+{
+  return m_allvalues_gFEXglobal[location];
+}
+
+void LVL1::gFEXOutputCollection::addGlobalTob(uint32_t globaltob)
+{
+  m_globaltob.push_back(globaltob);
+}
+
+std::vector<uint32_t> LVL1::gFEXOutputCollection::getGlobalTob() const
+{
+  return m_globaltob;
+}
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSim.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSim.cxx
index fc4179692af6f3bf9e9e34497d3b2ed75a029d25..ee6e2ed981236c8d3dc08063358efc4e3d4c6661 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSim.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSim.cxx
@@ -187,6 +187,21 @@ StatusCode gFEXSim::executegFEXSim(gTowersIDs tmp_gTowersIDs_subset){
    m_gJetTobWords[2] = BTOB1_dat[3];//leading gJet in FPGA B, eta bins (0--5)
    m_gJetTobWords[3] = BTOB2_dat[3];//leading gJet in FPGA B, eta bins (6--11)
 
+
+   // Retrieve the gFEXJetAlgoTool
+   ATH_CHECK( m_gFEXJwoJAlgoTool.retrieve() );
+   std::array<uint32_t, 4> outTOB = {0};
+
+   auto global_tobs = m_gFEXJwoJAlgoTool->jwojAlgo(Atwr, Btwr, outTOB);
+
+   m_gGlobalTobWords.resize(4);
+
+//Placing the global TOBs into a dedicated array
+   m_gGlobalTobWords[0] = outTOB[0];//
+   m_gGlobalTobWords[1] = outTOB[1];//
+   m_gGlobalTobWords[2] = outTOB[2];//
+   m_gGlobalTobWords[3] = outTOB[3];//
+
    gFEXOutputCollection* gFEXOutputs;
    ATH_CHECK(evtStore()->retrieve(gFEXOutputs, "gFEXOutputCollection"));
 
@@ -200,12 +215,25 @@ StatusCode gFEXSim::executegFEXSim(gTowersIDs tmp_gTowersIDs_subset){
      gFEXOutputs->addValueJet("TobIDJet", tobs_v[i]->getTobID());
      gFEXOutputs->fillJet();
 
+   }
+
+   for (int i = 0; i <4; i++){
+     gFEXOutputs->addGlobalTob(global_tobs[i]->getWord());
+     gFEXOutputs->addValueGlobal("GlobalQuantity1", global_tobs[i]->getQuantity1());
+     gFEXOutputs->addValueGlobal("GlobalQuantity2", global_tobs[i]->getQuantity2());
+     gFEXOutputs->addValueGlobal("SaturationGlobal", global_tobs[i]->getSaturation());
+     gFEXOutputs->addValueGlobal("TobIDGlobal", global_tobs[i]->getTobID());
+     gFEXOutputs->addValueGlobal("GlobalStatus1", global_tobs[i]->getStatus1());
+     gFEXOutputs->addValueGlobal("GlobalStatus2", global_tobs[i]->getStatus2());
+     gFEXOutputs->fillGlobal();
+
    }
 
     return StatusCode::SUCCESS;
 
 }
 
+
 std::vector<uint32_t> gFEXSim::getgRhoTOBs() const
 {
   return m_gRhoTobWords;
@@ -221,5 +249,10 @@ std::vector<uint32_t> gFEXSim::getgJetTOBs() const
   return m_gJetTobWords;
 }
 
+std::vector<uint32_t> gFEXSim::getgGlobalTOBs() const
+{
+  return m_gGlobalTobWords;
+}
+
 
 } // end of namespace bracket
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSysSim.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSysSim.cxx
index 0f2cf72858c3d80a4cbe002cc39f78a60d9bb9a1..31dcc398e367cdb4f6763a604b5d6d751bf56098 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSysSim.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSysSim.cxx
@@ -75,6 +75,7 @@ namespace LVL1 {
       m_allgRhoTobs.clear();
       m_allgBlockTobs.clear();
       m_allgJetTobs.clear();
+      m_allgGlobalTobs.clear();
 
 
       // int centralNphi = 32;
@@ -229,6 +230,7 @@ namespace LVL1 {
       m_allgRhoTobs = m_gFEXSimTool->getgRhoTOBs();
       m_allgBlockTobs = m_gFEXSimTool->getgBlockTOBs();
       m_allgJetTobs = m_gFEXSimTool->getgJetTOBs();
+      m_allgGlobalTobs = m_gFEXSimTool->getgGlobalTOBs();
       m_gFEXSimTool->reset();
 
 
@@ -244,6 +246,10 @@ namespace LVL1 {
       m_gJetAuxContainer = std::make_unique<xAOD::gFexJetRoIAuxContainer> ();
       m_gJetContainer->setStore(m_gJetAuxContainer.get());
 
+      m_gGlobalContainer = std::make_unique<xAOD::gFexGlobalRoIContainer> ();
+      m_gGlobalAuxContainer = std::make_unique<xAOD::gFexGlobalRoIAuxContainer> ();
+      m_gGlobalContainer->setStore(m_gGlobalAuxContainer.get());
+
       //iterate over all gRho Tobs and fill EDM with them
       for(auto &tob : m_allgRhoTobs){
          ATH_CHECK(fillgRhoEDM(tob));
@@ -257,6 +263,10 @@ namespace LVL1 {
       for(auto &tob : m_allgJetTobs){
          ATH_CHECK(fillgJetEDM(tob));
       }
+      //iterate over all Global Tobs and fill EDM with them
+      for(auto &tob : m_allgGlobalTobs){
+         ATH_CHECK(fillgGlobalEDM(tob));
+      }
 
       SG::WriteHandle<xAOD::gFexJetRoIContainer> outputgFexJetHandle(m_gFexJetOutKey/*, ctx*/);
       ATH_MSG_DEBUG("   write: " << outputgFexJetHandle.key() << " = " << "..." );
@@ -266,36 +276,39 @@ namespace LVL1 {
    }
 
    StatusCode gFEXSysSim::fillgRhoEDM(uint32_t tobWord){
-      xAOD::gFexJetRoI* myEDM = new xAOD::gFexJetRoI();
-      m_gRhoContainer->push_back( myEDM );
-      myEDM->initialize(tobWord);
-      ATH_MSG_DEBUG(" setting gRho : " << myEDM->tobEt()  );
 
-      return StatusCode::SUCCESS;
+      std::unique_ptr<xAOD::gFexJetRoI> myEDM (new xAOD::gFexJetRoI());
+      m_gRhoContainer->push_back(std::move(myEDM));
+      m_gRhoContainer->back()->initialize(tobWord);
 
+      return StatusCode::SUCCESS;
    }
 
    StatusCode gFEXSysSim::fillgBlockEDM(uint32_t tobWord){
-      xAOD::gFexJetRoI* myEDM = new xAOD::gFexJetRoI();
-      m_gBlockContainer->push_back( myEDM );
 
-      myEDM->initialize(tobWord);
-      ATH_MSG_DEBUG(" setting gBlock et: " << myEDM->tobEt() << " eta: " << myEDM->iEta() <<   " phi: " << myEDM->iPhi() );
+      std::unique_ptr<xAOD::gFexJetRoI> myEDM (new xAOD::gFexJetRoI());
+      m_gBlockContainer->push_back(std::move(myEDM));
+      m_gBlockContainer->back()->initialize(tobWord);
 
       return StatusCode::SUCCESS;
-
    }
 
    StatusCode gFEXSysSim::fillgJetEDM(uint32_t tobWord){
 
-      xAOD::gFexJetRoI* myEDM = new xAOD::gFexJetRoI();
-      m_gJetContainer->push_back( myEDM );
-
-      myEDM->initialize(tobWord);
-      ATH_MSG_DEBUG(" setting gJet et: " << myEDM->tobEt() << " eta: " << myEDM->iEta() <<   " phi: " << myEDM->iPhi() );
+      std::unique_ptr<xAOD::gFexJetRoI> myEDM (new xAOD::gFexJetRoI());
+      m_gJetContainer->push_back(std::move(myEDM));
+      m_gJetContainer->back()->initialize(tobWord);
 
       return StatusCode::SUCCESS;
+   }
+
+   StatusCode gFEXSysSim::fillgGlobalEDM(uint32_t tobWord){
 
+      std::unique_ptr<xAOD::gFexGlobalRoI> myEDM (new xAOD::gFexGlobalRoI());
+      m_gGlobalContainer->push_back(std::move(myEDM));
+      m_gGlobalContainer->back()->initialize(tobWord);
+
+      return StatusCode::SUCCESS;
    }
 
 
diff --git a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXJwoJAlgo.h b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXJwoJAlgo.h
new file mode 100644
index 0000000000000000000000000000000000000000..8fb4d469fa7d136cd02f9764b472c33d2660ec16
--- /dev/null
+++ b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXJwoJAlgo.h
@@ -0,0 +1,45 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+#ifndef IgFEXJwoJAlgo_H
+#define IgFEXJwoJAlgo_H
+
+#include "GaudiKernel/IAlgTool.h"
+#include "L1CaloFEXSim/gFEXJwoJTOB.h"
+#include "L1CaloFEXSim/FEXAlgoSpaceDefs.h"
+
+namespace LVL1 {
+
+/*
+Interface definition for gFEXJwoJAlgo
+*/
+
+  static const InterfaceID IID_IgFEXJwoJAlgo("LVL1::IgFEXJwoJAlgo", 1, 0);
+  typedef  std::array<std::array<int, 12>, 32> gTowersCentral;
+  typedef  std::array<std::array<int, 7>, 32> gTowersForward;
+
+  class IgFEXJwoJAlgo : virtual public IAlgTool {
+  public:
+    static const InterfaceID& interfaceID( ) ;
+
+
+    virtual void setAlgoConstant(unsigned int aFPGA_A, unsigned int bFPGA_A,
+                                 unsigned int aFPGA_B, unsigned int bFPGA_B,
+                                 int gblockThreshold) = 0;
+
+    virtual std::vector<std::unique_ptr<gFEXJwoJTOB>> jwojAlgo(gTowersCentral Atwr, gTowersCentral Btwr,
+                                                                            std::array<uint32_t, 4> & outTOB) = 0;
+
+
+  };
+
+  inline const InterfaceID& LVL1::IgFEXJwoJAlgo::interfaceID()
+  {
+    return IID_IgFEXJwoJAlgo;
+  }
+
+} // end of namespace
+
+#endif
diff --git a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSim.h b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSim.h
index 329dfe560afc6a1e1799297a88188e8d610568aa..38c70ed13c279c3a6329806b89131c7a5a7e399a 100644
--- a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSim.h
+++ b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSim.h
@@ -36,6 +36,8 @@ Interface definition for gFEXSim
 
     virtual std::vector<uint32_t> getgJetTOBs() const =0;
 
+    virtual std::vector<uint32_t> getgGlobalTOBs() const =0;
+
   private:
 
   };
diff --git a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSysSim.h b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSysSim.h
index a42656e6be156f459365fd4a662d6239c15bce23..24c9469abd6e0a6a8299240aa2968af921db03fd 100644
--- a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSysSim.h
+++ b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSysSim.h
@@ -33,6 +33,8 @@ Interface definition for gFEXSysSim
 
     virtual StatusCode fillgJetEDM(uint32_t tobWord) = 0;
 
+    virtual StatusCode fillgGlobalEDM(uint32_t tobWord) = 0;
+
   private:
 
   };