diff --git a/src/Makefile b/src/Makefile
index 6f549977d1de3dd243067acbd4338b8e42194fda..2b875b4e07484320edc6131b580d8aed23492bda 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -27,7 +27,7 @@ CXXFLAGS = -std=c++11 -Wall -Wextra -O0 -g -rdynamic -Wconversion
 #CXXFLAGS = -std=c++11 -Wall -Wextra -g -rdynamic
 
 CFLAGS = $(CXXFLAGS)
-LDFLAGS = -ltbb -ltbbmalloc -lboost_thread -lcurl -pthread
+LDFLAGS = -ltbb -ltbbmalloc -lboost_thread -lboost_chrono -lcurl -pthread
 
 CPPFLAGS = -I. -Iwzdma
 
diff --git a/src/elastico.cc b/src/elastico.cc
index 94349b2b98cd7be7cfc2f09761f1ec9253171ce5..17a7a5e43369d104671ff06b9dad2e7c073b47e5 100644
--- a/src/elastico.cc
+++ b/src/elastico.cc
@@ -98,8 +98,8 @@ void ElasticProcessor::makeCreateIndexRequest(unsigned int run){
 void ElasticProcessor::makeAppendToBulkRequest(std::ostringstream &particle_data, char*c){
   uint32_t *p = (uint32_t*)c;
   uint32_t header = *p++;
-  int mAcount = (header&header_masks::mAcount)>>header_shifts::mAcount;
-  int mBcount = (header&header_masks::mBcount)>>header_shifts::mBcount;
+  int mAcount = (header&packed_format_header_masks::mAcount)>>packed_format_header_shifts::mAcount;
+  int mBcount = (header&packed_format_header_masks::mBcount)>>packed_format_header_shifts::mBcount;
   
   uint32_t bx=*p++;
   uint32_t orbit=*p++;
diff --git a/src/format.h b/src/format.h
index d20001d145f2e4772f02715e71280ce14760a590..daaf622f811a584371a2ca7edf7868e84de4d91e 100644
--- a/src/format.h
+++ b/src/format.h
@@ -13,6 +13,13 @@ struct blockCalo{
   uint32_t calo5[8];
 };
 
+struct block_calo_packed{
+  uint32_t header;
+  uint32_t bx;
+  uint32_t orbit;
+  uint32_t frame[56]; //+8 for extra word containing link number;
+};
+
 struct blockMuon{
   uint32_t orbit[8];
   uint32_t bx[8];
@@ -23,16 +30,113 @@ struct blockMuon{
 };
 
 struct bx_map_frame{
-uint32_t bx_map_l[8];
+  uint32_t bx_map_l[8];
 };
 
 struct orbit_trailer{
-uint32_t beefdead[8];
-uint32_t bx_map[14*8];
-uint32_t trailer1[8];
-uint32_t trailer2[8];
+  uint32_t beefdead[8];
+  uint32_t bx_map[14*8];
+  uint32_t trailer1[8];
+  uint32_t trailer2[8];
+};
+
+struct shiftsCaloTau{
+  static constexpr  uint32_t ET   =  0;
+  static constexpr  uint32_t eta  =  9;
+  static constexpr  uint32_t phi  = 17;
+  static constexpr  uint32_t iso  = 25;
 };
 
+struct masksCaloJet{
+  static constexpr  uint32_t ET   = 0x07ff;
+  static constexpr  uint32_t eta  = 0x00ff;
+  static constexpr  uint32_t phi  = 0x00ff;
+};
+struct shiftsCaloJet{
+  static constexpr  uint32_t ET   =  0;
+  static constexpr  uint32_t eta  = 11;
+  static constexpr  uint32_t phi  = 19;
+};
+struct masksCaloEGamma{
+  static constexpr  uint32_t ET   = 0x01ff;
+  static constexpr  uint32_t eta  = 0x00ff;
+  static constexpr  uint32_t phi  = 0x00ff;
+  static constexpr  uint32_t iso  = 0x0003;
+};
+
+struct shiftsCaloEGamma{
+  static constexpr  uint32_t ET   =  0;
+  static constexpr  uint32_t eta  =  9;
+  static constexpr  uint32_t phi  = 17;
+  static constexpr  uint32_t iso  = 25;
+};
+
+struct masksCaloTau{
+  static constexpr  uint32_t ET   = 0x01ff;
+  static constexpr  uint32_t eta  = 0x00ff;
+  static constexpr  uint32_t phi  = 0x00ff;
+  static constexpr  uint32_t iso  = 0x0003;
+};
+
+struct masksCaloESums{
+  static constexpr  uint32_t ETEt             = 0x0fff;//Et of ET object
+  static constexpr  uint32_t ETEttem          = 0x0fff; 
+  static constexpr  uint32_t ETMinBiasHF      = 0x000f;
+
+  static constexpr  uint32_t HTEt             = 0x0fff;//ET of HT object
+  static constexpr  uint32_t HTtowerCount     = 0x1fff;
+  static constexpr  uint32_t HTMinBiasHF      = 0x0003;
+
+  static constexpr  uint32_t ETmissEt         = 0x0fff;
+  static constexpr  uint32_t ETmissPhi        = 0x00ff;
+  static constexpr  uint32_t ETmissASYMET     = 0x00ff;
+  static constexpr  uint32_t ETmissMinBiasHF  = 0x0003;
+
+  static constexpr  uint32_t HTmissEt         = 0x0fff;
+  static constexpr  uint32_t HTmissPhi        = 0x00ff;
+  static constexpr  uint32_t HTmissASYMHT     = 0x00ff;
+  static constexpr  uint32_t HTmissMinBiasHF  = 0x0003;
+
+  static constexpr  uint32_t ETHFmissEt       = 0x0fff;
+  static constexpr  uint32_t ETHFmissPhi      = 0x00ff;
+  static constexpr  uint32_t ETHFmissASYMETHF = 0x00ff;
+  static constexpr  uint32_t ETHFmissCENT     = 0x0003;
+
+  static constexpr  uint32_t HTHFmissEt       = 0x0fff;
+  static constexpr  uint32_t HTHFmissPhi      = 0x00ff;
+  static constexpr  uint32_t HTHFmissASYMHTHF = 0x00ff;
+  static constexpr  uint32_t HTHFmissCENT     = 0x0003;
+};
+
+struct shiftsCaloESums{
+  static constexpr  uint32_t ETEt             =  0;//Et of ET object
+  static constexpr  uint32_t ETEttem          = 12;
+  static constexpr  uint32_t ETMinBiasHF      = 28;
+
+  static constexpr  uint32_t HTEt             =  0;//ET of HT object
+  static constexpr  uint32_t HTtowerCount     = 12;
+  static constexpr  uint32_t HTMinBiasHF      = 28;
+
+  static constexpr  uint32_t ETmissEt         =  0;
+  static constexpr  uint32_t ETmissPhi        = 12;
+  static constexpr  uint32_t ETmissASYMET     = 20;
+  static constexpr  uint32_t ETmissMinBiasHF  = 28;
+
+  static constexpr  uint32_t HTmissEt         =  0;
+  static constexpr  uint32_t HTmissPhi        = 12;
+  static constexpr  uint32_t HTmissASYMHT     = 20;
+  static constexpr  uint32_t HTmissMinBiasHF  = 28;
+
+  static constexpr  uint32_t ETHFmissEt       =  0;
+  static constexpr  uint32_t ETHFmissPhi      = 12;
+  static constexpr  uint32_t ETHFmissASYMETHF = 20;
+  static constexpr  uint32_t ETHFmissCENT     = 28;
+
+  static constexpr  uint32_t HTHFmissEt       =  0;
+  static constexpr  uint32_t HTHFmissPhi      = 12;
+  static constexpr  uint32_t HTHFmissASYMHTHF = 20;
+  static constexpr  uint32_t HTHFmissCENT     = 28;
+};
 
 struct muon{
   uint32_t f; //first word
@@ -46,30 +150,6 @@ struct block{
   muon mu[16];
 };
 
-//original format
-/*struct masks{
-  //bx word: 16 bits used for actual bx, MS 4 bits are muon type 
-  //(0xf intermediate, 0x0 final, following 4 bits for link id)
-  static constexpr  uint32_t bx      = 0xffff;
-  static constexpr  uint32_t interm  = 0x000f;
-  static constexpr  uint32_t linkid  = 0x000f;
-  //masks for muon 64 bits
-  static constexpr  uint32_t phiext  = 0x03ff;
-  static constexpr  uint32_t pt      = 0x01ff;
-  static constexpr  uint32_t qual    = 0x000f;
-  static constexpr  uint32_t etaext  = 0x01ff;
-  static constexpr  uint32_t etaextv = 0x00ff;
-  static constexpr  uint32_t etaexts = 0x0100;
-  static constexpr  uint32_t iso     = 0x0003;
-  static constexpr  uint32_t chrg    = 0x0001;
-  static constexpr  uint32_t chrgv   = 0x0001;
-  static constexpr  uint32_t index   = 0x007f;
-  static constexpr  uint32_t phi     = 0x03ff;
-  static constexpr  uint32_t eta     = 0x01ff;
-  static constexpr  uint32_t etav    = 0x00ff;
-  static constexpr  uint32_t etas    = 0x0100;
-};*/
-
 //run3 format --tj
 struct masks{
   //bx word: 16 bits used for actual bx, MS 4 bits are muon type 
@@ -98,55 +178,66 @@ struct masks{
 struct shifts{
   //bx word: 16 bits used for actual bx, MS 4 bits are muon type 
   //(0xf intermediate, 0x0 final, following 4 bits for link id)
-  static constexpr  uint32_t bx      = 0;
-  static constexpr  uint32_t interm  = 31; //updated for new run3 format //tj
+  static constexpr  uint32_t bx       =  0;
+  static constexpr  uint32_t interm   = 31; //updated for new run3 format //tj
   //shifts for muon 64 bits
-  static constexpr  uint32_t  phiext =  0;
-  static constexpr  uint32_t  pt     = 10;
-  static constexpr  uint32_t  qual   = 19;
-  static constexpr  uint32_t  etaext = 23;
-  static constexpr  uint32_t  iso    =  0;
-  static constexpr  uint32_t  chrg   =  2;
-  static constexpr  uint32_t  chrgv  =  3;
-  static constexpr  uint32_t  index  =  4;
-  static constexpr  uint32_t  phi    = 11;
-  static constexpr  uint32_t  eta    = 21; 
+  static constexpr  uint32_t  phiext  =  0;
+  static constexpr  uint32_t  pt      = 10;
+  static constexpr  uint32_t  qual    = 19;
+  static constexpr  uint32_t  etaext  = 23;
+  static constexpr  uint32_t  iso     =  0;
+  static constexpr  uint32_t  chrg    =  2;
+  static constexpr  uint32_t  chrgv   =  3;
+  static constexpr  uint32_t  index   =  4;
+  static constexpr  uint32_t  phi     = 11;
+  static constexpr  uint32_t  eta1    = 13; 
+  static constexpr  uint32_t  eta2    = 22; 
   static constexpr  uint32_t  ptuncon = 21;
-  static constexpr  uint32_t  impact = 30;
+  static constexpr  uint32_t  impact  = 30;
 };
 
-struct header_shifts{
+struct packed_format_header_shifts{
   static constexpr uint32_t bxmatch    = 24;
   static constexpr uint32_t mAcount    = 16;
   static constexpr uint32_t orbitmatch =  8;
+  static constexpr uint32_t warningTestEnabled = 8;
   static constexpr uint32_t mBcount    =  0;
 };
 
 
-struct header_masks{
-  static constexpr uint32_t bxmatch    = 0xff << header_shifts::bxmatch;
-  static constexpr uint32_t mAcount    = 0x0f << header_shifts::mAcount;
-  static constexpr uint32_t orbitmatch = 0xff << header_shifts::orbitmatch;
-  static constexpr uint32_t mBcount    = 0x0f << header_shifts::mBcount;
+struct packed_format_header_masks{
+  static constexpr uint32_t bxmatch    = 0x00ff << packed_format_header_shifts::bxmatch;
+  static constexpr uint32_t mAcount    = 0x000f << packed_format_header_shifts::mAcount;
+  static constexpr uint32_t warningTestEnabled = 0x0001<<packed_format_header_shifts::warningTestEnabled;
+  static constexpr uint32_t orbitmatch = 0x00ff << packed_format_header_shifts::orbitmatch;
+  static constexpr uint32_t mBcount    = 0x000f << packed_format_header_shifts::mBcount;
 };
 
 struct gmt_scales{
   static constexpr float pt_scale  = 0.5;
+  static constexpr float ptunconstrained_scale    = 1.0;
   static constexpr float phi_scale = static_cast<float>(2.*M_PI/576.);
   static constexpr float eta_scale = static_cast<float>(0.0870/8.); //9th MS bit is sign
   static constexpr float phi_range = M_PI;
 };
+
+struct calo_scales{
+  static constexpr float phi_scale = static_cast<float>(2.*M_PI/144.);
+  static constexpr float eta_scale = 0.0435;
+  static constexpr float et_scale = 0.5;
+};
+
 struct constants{
-  static constexpr uint32_t deadbeef           = 0xdeadbeef;
-  static constexpr uint32_t beefdead           = 0xbeefdead;
-  static constexpr uint32_t intermediate_marker= 0x0000000f;
-  static constexpr uint32_t orbit_trailer_size = 544;
-  static constexpr uint32_t orbit_header_size = 32;
-  static constexpr uint32_t dma_trailer_size = 32;
+  static constexpr uint32_t deadbeef            = 0xdeadbeef;
+  static constexpr uint32_t beefdead            = 0xbeefdead;
+  static constexpr uint32_t intermediate_marker = 0x0000000f;
+  static constexpr uint32_t orbit_trailer_size  = 544;
+  static constexpr uint32_t orbit_header_size   = 32;
+  static constexpr uint32_t dma_trailer_size    = 32;
   //Note: total number of bytes of overhead per packet is:
   // (orbit_trailer_size+orbit_header_size)*NOrbitsPerDMAPacket + dma_trailer_size
-  static constexpr uint32_t intermediate       = 0x00000001;
-  static constexpr uint32_t final              = 0x00000001;
+  static constexpr uint32_t intermediate        = 0x00000001;
+  static constexpr uint32_t final               = 0x00000001;
 };
 
 
diff --git a/src/scdaq.cc b/src/scdaq.cc
index e0b7d70d4a3dc5c9a0baca37c7623678b12a4678..c18719af4fd042962c5002a7cddd487a6989985a 100644
--- a/src/scdaq.cc
+++ b/src/scdaq.cc
@@ -105,6 +105,7 @@ int run_pipeline( int nbThreads, ctrl& control, config& conf )
 int main( int argc, char* argv[] ) {
   (void)(argc);
   (void)(argv);
+  int retval = 0;
 
 if(argc < 2){
 		LOG(DEBUG) << "no arguments provided to scdaq, try --help";
@@ -132,7 +133,7 @@ if(argc < 2){
   try {
     config conf(argv[2]);
     conf.print();
-    LOG(DEBUG) << "configuration loaded";
+    LOG(DEBUG) << "Configuration loaded";
     ctrl control;
     //    tbb::tick_count mainStartTime = tbb::tick_count::now();
 
@@ -157,15 +158,32 @@ if(argc < 2){
 
     int nbThreads = conf.getNumThreads();
 
-    tbb::task_scheduler_init init( nbThreads );
-    if (!run_pipeline (nbThreads, control, conf))
-      return 1;
+    retval = 0;
+    try {
+      tbb::task_scheduler_init init( nbThreads );
+      if (!run_pipeline (nbThreads, control, conf)) {
+        retval = 1;
+        // Will terminate with errorocde set
+      }
+    } catch(std::exception& e) {
+      LOG(ERROR) << "Error in pipelines. Error text is: \"" << e.what() << "\"";
+      retval = 1;
+      // Will terminate with errorocde set
+    }
+
+    LOG(DEBUG) << "Terminating the internal TCP server.";
+    io_service.stop();
+    if (!t.try_join_for(boost::chrono::milliseconds(2000))) {
+      LOG(ERROR) << "Failed to terminate the internal TCP server, the program may crash on exit.";
+    } else {
+      LOG(DEBUG) << "Internal TCP server is terminated.";
+    }
 
     //    utility::report_elapsed_time((tbb::tick_count::now() - mainStartTime).seconds());
+    return retval;
 
-    return 0;
   } catch(std::exception& e) {
-    LOG(ERROR) << "error occurred. error text is :\"" << e.what() << "\"";
+    LOG(ERROR) << "Error occurred. error text is: \"" << e.what() << "\"";
     return 1;
   }
 }