diff --git a/compact/ci_ecal_scfi.xml b/compact/ci_ecal_scfi.xml
index 9662825c6bbc0b73028c4b909bcdc493375c4d2e..2ae955c219fd71145493c191357df85b3ea8f774 100644
--- a/compact/ci_ecal_scfi.xml
+++ b/compact/ci_ecal_scfi.xml
@@ -34,7 +34,7 @@
       readout="EcalEndcapPHits">
       <position x="0" y="0" z="EcalEndcapP_zmin + EcalEndcapP_length/2."/>
       <dimensions rmin="EcalEndcapP_rmin" rmax="EcalEndcapP_rmax" length="EcalEndcapP_length"/>
-      <module sizex="25*mm" sizey="25*mm" sizez="170*mm" material="TungstenDens24" vis="EcalEndcapLayerVis">
+      <module sizex="25*mm" sizey="25*mm" sizez="170*mm" material="TungstenDens24" vis="EcalEndcapBlockVis">
         <fiber material="Polystyrene"
           radius="EcalEndcapP_FiberRadius"
           offset="EcalEndcapP_FiberOffset"
diff --git a/compact/display.xml b/compact/display.xml
index 8c5edf5dbbfc6fa5b15b0617de7dedb3e86251e6..a335591c4b9eb337c3a5b8eacf210b7f14852298 100644
--- a/compact/display.xml
+++ b/compact/display.xml
@@ -33,8 +33,9 @@
     <vis name="EcalBarrelSliceVis"      ref="AnlGray"   showDaughters="false" visible="true"/>
     <vis name="EcalBarrelFiberLayerVis" ref="AnlGold"   showDaughters="false" visible="true" />
 
-    <vis name="EcalEndcapVis"           ref="AnlGold"   showDaughters="false" visible="true"/>
+    <vis name="EcalEndcapVis"           ref="AnlGold"   showDaughters="true" visible="false"/>
     <vis name="EcalEndcapLayerVis"      ref="AnlGold"   showDaughters="false" visible="true"/>
+    <vis name="EcalEndcapBlockVis"      ref="AnlGold"   showDaughters="false" visible="true"/>
 
     <vis name="EcalEndcapNModuleVis"    ref="AnlGold"   showDaughters="false" visible="true"/>
 
diff --git a/compact/display_geoviewer.xml b/compact/display_geoviewer.xml
index 60a5ea60f53ba661b9dee9a486ce2b8add8ce3e9..e5db890e4be47694e936e25c48782ec7b4d87367 100644
--- a/compact/display_geoviewer.xml
+++ b/compact/display_geoviewer.xml
@@ -35,6 +35,7 @@
     <vis name="EcalVis"                 ref="AnlGold"   showDaughters="true"  visible="false"/>
     <vis name="EcalEndcapVis"           ref="AnlGold"   showDaughters="false" visible="true"/>
     <vis name="EcalEndcapLayerVis"      ref="AnlGold"   showDaughters="false" visible="true"/>
+    <vis name="EcalEndcapBlockVis"      ref="AnlGold"   showDaughters="false" visible="true"/>
 
     <vis name="EcalEndcapNModuleVis"    ref="AnlGold"   showDaughters="false" visible="true"/>
 
diff --git a/src/ScFiCalorimeter_geo.cpp b/src/ScFiCalorimeter_geo.cpp
index 5b170a00776dfa4de978770620f944134c5be5ae..d16e87cbd842332e27914d45ad9c21c0de320fc1 100644
--- a/src/ScFiCalorimeter_geo.cpp
+++ b/src/ScFiCalorimeter_geo.cpp
@@ -53,15 +53,17 @@ static Ref_t create_detector(Detector& desc, xml::Handle_t handle, SensitiveDete
     Volume env(detName + "_envelope", envShape, desc.material("Air"));
     env.setVisAttributes(desc.visAttributes(detElem.visStr()));
 
-    // build shashlik module
+    // build module
     auto [modVol, modSize] = build_module(desc, detElem.child(_Unicode(module)), sens);
     double modSizeR = std::sqrt(modSize.x() * modSize.x() + modSize.y() * modSize.y());
     double assembly_rwidth = modSizeR*2.;
     int nas = int((rmax - rmin) / assembly_rwidth) + 1;
     std::vector<Assembly> assemblies;
+    // calorimeter block z-offsets (as blocks are shorter than the volume length)
+    const double block_offset = -0.5*(length - modSize.z());
     for (int i = 0; i < nas; ++i) {
         Assembly assembly(detName + Form("_ring%d", i + 1));
-        auto assemblyPV = env.placeVolume(assembly, Position{0., 0., 0.});
+        auto assemblyPV = env.placeVolume(assembly, Position{0., 0., block_offset});
         assemblyPV.addPhysVolID("ring", i + 1);
         assemblies.emplace_back(std::move(assembly));
     }