diff --git a/compact/ce_ecal_crystal_glass.xml b/compact/ce_ecal_crystal_glass.xml
index cc36383be8b946cbd200512db58a969baa5d4387..19156a0df841163a4bee35a1026641b73f62c195 100644
--- a/compact/ce_ecal_crystal_glass.xml
+++ b/compact/ce_ecal_crystal_glass.xml
@@ -4,13 +4,17 @@
     <constant name="CrystalModule_sy" value="20.0*mm"/>
     <constant name="CrystalModule_sz" value="20.0*cm"/>
     <constant name="CrystalModule_wrap" value="0.5*mm"/>
-    <constant name="CrystalModule_dz" value="-8*cm"/>
     <constant name="GlassModule_sx" value="40.0*mm"/>
     <constant name="GlassModule_sy" value="40.0*mm"/>
     <constant name="GlassModule_sz" value="40.0*cm"/>
-    <constant name="GlassModule_dz" value="0.0*cm"/>
     <constant name="GlassModule_wrap" value="1.0*mm"/>
+    <constant name="CrystalModule_z0" value="10.*cm"/>
+    <constant name="GlassModule_z0" value="0.0*cm"/>
     <constant name="EcalEndcapN_z0" value="-EcalEndcapN_zmin-max(CrystalModule_sz,GlassModule_sz)/2."/>
+    <constant name="CrystalModule_dx" value="CrystalModule_sx + CrystalModule_wrap"/>
+    <constant name="CrystalModule_dy" value="CrystalModule_sy + CrystalModule_wrap"/>
+    <constant name="GlassModule_dx" value="GlassModule_sx + GlassModule_wrap"/>
+    <constant name="GlassModule_dy" value="GlassModule_sy + GlassModule_wrap"/>
   </define>
   <detectors>
     <comment> Backwards Endcap EM Calorimeter, placements generated by script </comment>
@@ -21,59 +25,57 @@
         <lines sector="1" mirrorx="true" mirrory="true">
           <module sizex="CrystalModule_sx" sizey="CrystalModule_sy" sizez="CrystalModule_sz" material="PbWO4" vis="AnlTeal"/>
           <wrapper thickness="CrystalModule_wrap" material="Epoxy" vis="WhiteVis"/>
-          <position z="CrystalModule_dz"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*1/2." begin="7" nmods="17"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*3/2." begin="7" nmods="17"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*5/2." begin="7" nmods="17"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*7/2." begin="6" nmods="18"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*9/2." begin="6" nmods="18"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*11/2." begin="5" nmods="19"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*13/2." begin="3" nmods="19"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*15/2." begin="0" nmods="22"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*17/2." begin="0" nmods="22"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*19/2." begin="0" nmods="22"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*21/2." begin="0" nmods="22"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*23/2." begin="0" nmods="22"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*25/2." begin="0" nmods="20"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*27/2." begin="0" nmods="20"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*29/2." begin="0" nmods="18"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*31/2." begin="0" nmods="18"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*33/2." begin="0" nmods="16"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*35/2." begin="0" nmods="16"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*37/2." begin="0" nmods="14"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*39/2." begin="0" nmods="14"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*41/2." begin="0" nmods="12"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*43/2." begin="0" nmods="12"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*45/2." begin="0" nmods="6"/>
-          <line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*47/2." begin="0" nmods="6"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*1/2." z="CrystalModule_z0" begin="7" nmods="17"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*3/2." z="CrystalModule_z0" begin="7" nmods="17"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*5/2." z="CrystalModule_z0" begin="7" nmods="17"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*7/2." z="CrystalModule_z0" begin="6" nmods="18"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*9/2." z="CrystalModule_z0" begin="6" nmods="18"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*11/2." z="CrystalModule_z0" begin="5" nmods="19"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*13/2." z="CrystalModule_z0" begin="3" nmods="19"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*15/2." z="CrystalModule_z0" begin="0" nmods="22"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*17/2." z="CrystalModule_z0" begin="0" nmods="22"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*19/2." z="CrystalModule_z0" begin="0" nmods="22"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*21/2." z="CrystalModule_z0" begin="0" nmods="22"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*23/2." z="CrystalModule_z0" begin="0" nmods="22"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*25/2." z="CrystalModule_z0" begin="0" nmods="20"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*27/2." z="CrystalModule_z0" begin="0" nmods="20"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*29/2." z="CrystalModule_z0" begin="0" nmods="18"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*31/2." z="CrystalModule_z0" begin="0" nmods="18"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*33/2." z="CrystalModule_z0" begin="0" nmods="16"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*35/2." z="CrystalModule_z0" begin="0" nmods="16"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*37/2." z="CrystalModule_z0" begin="0" nmods="14"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*39/2." z="CrystalModule_z0" begin="0" nmods="14"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*41/2." z="CrystalModule_z0" begin="0" nmods="12"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*43/2." z="CrystalModule_z0" begin="0" nmods="12"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*45/2." z="CrystalModule_z0" begin="0" nmods="6"/>
+          <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*47/2." z="CrystalModule_z0" begin="0" nmods="6"/>
         </lines>
         <lines sector="2" mirrorx="true" mirrory="true">
           <module sizex="GlassModule_sx" sizey="GlassModule_sy" sizez="GlassModule_sz" material="PbGlass" vis="AnlBlue"/>
           <wrapper thickness="GlassModule_wrap" material="Epoxy" vis="WhiteVis"/>
-          <position z="GlassModule_dz"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*1/2." begin="12" nmods="11"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*3/2." begin="12" nmods="11"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*5/2." begin="12" nmods="11"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*7/2." begin="11" nmods="12"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*9/2." begin="11" nmods="12"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*11/2." begin="11" nmods="12"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*13/2." begin="10" nmods="12"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*15/2." begin="9" nmods="13"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*17/2." begin="8" nmods="13"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*19/2." begin="7" nmods="14"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*21/2." begin="6" nmods="14"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*23/2." begin="3" nmods="16"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*25/2." begin="0" nmods="19"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*27/2." begin="0" nmods="18"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*29/2." begin="0" nmods="18"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*31/2." begin="0" nmods="17"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*33/2." begin="0" nmods="17"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*35/2." begin="0" nmods="15"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*37/2." begin="0" nmods="13"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*39/2." begin="0" nmods="11"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*41/2." begin="0" nmods="10"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*43/2." begin="0" nmods="8"/>
-          <line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*45/2." begin="0" nmods="6"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*1/2." z="GlassModule_z0" begin="12" nmods="11"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*3/2." z="GlassModule_z0" begin="12" nmods="11"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*5/2." z="GlassModule_z0" begin="12" nmods="11"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*7/2." z="GlassModule_z0" begin="11" nmods="12"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*9/2." z="GlassModule_z0" begin="11" nmods="12"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*11/2." z="GlassModule_z0" begin="11" nmods="12"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*13/2." z="GlassModule_z0" begin="10" nmods="12"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*15/2." z="GlassModule_z0" begin="9" nmods="13"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*17/2." z="GlassModule_z0" begin="8" nmods="13"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*19/2." z="GlassModule_z0" begin="7" nmods="14"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*21/2." z="GlassModule_z0" begin="6" nmods="14"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*23/2." z="GlassModule_z0" begin="3" nmods="16"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*25/2." z="GlassModule_z0" begin="0" nmods="19"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*27/2." z="GlassModule_z0" begin="0" nmods="18"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*29/2." z="GlassModule_z0" begin="0" nmods="18"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*31/2." z="GlassModule_z0" begin="0" nmods="17"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*33/2." z="GlassModule_z0" begin="0" nmods="17"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*35/2." z="GlassModule_z0" begin="0" nmods="15"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*37/2." z="GlassModule_z0" begin="0" nmods="13"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*39/2." z="GlassModule_z0" begin="0" nmods="11"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*41/2." z="GlassModule_z0" begin="0" nmods="10"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*43/2." z="GlassModule_z0" begin="0" nmods="8"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*45/2." z="GlassModule_z0" begin="0" nmods="6"/>
         </lines>
       </placements>
     </detector>
@@ -82,8 +84,8 @@
     <comment>Effectively no segmentation, the segmentation is used to provide cell dimension info</comment>
     <readout name="EcalEndcapNHits">
       <segmentation type="MultiSegmentation" key="sector">
-        <segmentation name="CrystalSeg" key_value="1" type="CartesianGridXY" grid_size_x="CrystalModule_sx + CrystalModule_wrap" grid_size_y="CrystalModule_sy + CrystalModule_wrap"/>
-        <segmentation name="GlassSeg" key_value="2" type="CartesianGridXY" grid_size_x="GlassModule_sx + GlassModule_wrap" grid_size_y="GlassModule_sy + GlassModule_wrap"/>
+        <segmentation name="CrystalSeg" key_value="1" type="CartesianGridXY" grid_size_x="CrystalModule_dx" grid_size_y="CrystalModule_dy"/>
+        <segmentation name="GlassSeg" key_value="2" type="CartesianGridXY" grid_size_x="GlassModule_dx" grid_size_y="GlassModule_dy"/>
       </segmentation>
       <id>system:8,sector:4,module:20,x:32:-16,y:-16</id>
     </readout>
diff --git a/scripts/ce_ecal_placement.py b/scripts/ce_ecal_placement.py
index 138bc7c43ce70cf1ea018e24359d764dd1b642b4..83c1d20d7b11e354e8b9eab21cd99515ee86fd36 100644
--- a/scripts/ce_ecal_placement.py
+++ b/scripts/ce_ecal_placement.py
@@ -10,65 +10,49 @@ import argparse
 from lxml import etree as ET
 
 
-# start pos, total number of blocks
+# constants: name, value
+CONSTANTS = [
+    ('CrystalModule_sx', '20.0*mm'),
+    ('CrystalModule_sy', '20.0*mm'),
+    ('CrystalModule_sz', '20.0*cm'),
+    ('CrystalModule_wrap', '0.5*mm'),
+    ('GlassModule_sx', '40.0*mm'),
+    ('GlassModule_sy', '40.0*mm'),
+    ('GlassModule_sz', '40.0*cm'),
+    ('GlassModule_wrap', '1.0*mm'),
+    ('CrystalModule_z0', '10.*cm'),
+    ('GlassModule_z0', '0.0*cm'),
+    ('EcalEndcapN_z0', '-EcalEndcapN_zmin-max(CrystalModule_sz,GlassModule_sz)/2.'),
+    ('CrystalModule_dx', 'CrystalModule_sx + CrystalModule_wrap'),
+    ('CrystalModule_dy', 'CrystalModule_sy + CrystalModule_wrap'),
+    ('GlassModule_dx', 'GlassModule_sx + GlassModule_wrap'),
+    ('GlassModule_dy', 'GlassModule_sy + GlassModule_wrap'),
+]
+
+# line-by-line alignment start pos, total number of blocks
 CRYSTAL_ALIGNMENT = [
-    (8, 17),
-    (8, 17),
-    (8, 17),
-    (7, 18),
-    (7, 18),
-    (6, 19),
-    (4, 19),
-    (1, 22),
-    (1, 22),
-    (1, 22),
-    (1, 22),
-    (1, 22),
-    (1, 20),
-    (1, 20),
-    (1, 18),
-    (1, 18),
-    (1, 16),
-    (1, 16),
-    (1, 14),
-    (1, 14),
-    (1, 12),
-    (1, 12),
-    (1, 6),
-    (1, 6),
+    (7, 17), (7, 17), (7, 17), (6, 18),
+    (6, 18), (5, 19), (3, 19), (0, 22),
+    (0, 22), (0, 22), (0, 22), (0, 22),
+    (0, 20), (0, 20), (0, 18), (0, 18),
+    (0, 16), (0, 16), (0, 14), (0, 14),
+    (0, 12), (0, 12), (0, 6),  (0, 6),
 ]
 
 GLASS_ALIGNMENT = [
-    (13, 11),
-    (13, 11),
-    (13, 11),
-    (12, 12),
-    (12, 12),
-    (12, 12),
-    (11, 12),
-    (10, 13),
-    (9, 13),
-    (8, 14),
-    (7, 14),
-    (4, 16),
-    (1, 19),
-    (1, 18),
-    (1, 18),
-    (1, 17),
-    (1, 17),
-    (1, 15),
-    (1, 13),
-    (1, 11),
-    (1, 10),
-    (1, 8),
-    (1, 6),
+    (12, 11), (12, 11), (12, 11), (11, 12),
+    (11, 12), (11, 12), (10, 12), (9, 13),
+    (8, 13),  (7, 14),  (6, 14),  (3, 16),
+    (0, 19),  (0, 18),  (0, 18),  (0, 17),
+    (0, 17),  (0, 15),  (0, 13),  (0, 11),
+    (0, 10),  (0, 8),   (0, 6),
 ]
 
 # calculate positions of modules with a quad-alignment and module size
 def individual_placement(alignment, module_x=20.5, module_y=20.5):
     placements = []
     for row, (start, num) in enumerate(alignment):
-        for col in np.arange(start - 1, start + num - 1):
+        for col in np.arange(start, start + num):
             placements.append(((col + 0.5)*module_y, (row + 0.5)*module_x))
     placements = np.asarray(placements)
     return np.vstack((placements,
@@ -82,27 +66,14 @@ if __name__ == '__main__':
     parser = argparse.ArgumentParser()
     parser.add_argument('-s', '--save', default='compact/ce_ecal_crystal_glass.xml',
             help='path to save compact file.')
+    parser.add_argument('--individual', dest='indiv', action='store_true',
+            help='individual block placements instead of line placements')
     args = parser.parse_args()
 
     data = ET.Element('lccdd')
     defines = ET.SubElement(data, 'define')
 
-    # constants: name, value
-    consts = [
-        ('CrystalModule_sx', '20.0*mm'),
-        ('CrystalModule_sy', '20.0*mm'),
-        ('CrystalModule_sz', '20.0*cm'),
-        ('CrystalModule_wrap', '0.5*mm'),
-        ('CrystalModule_dz', '-8*cm'),
-        ('GlassModule_sx', '40.0*mm'),
-        ('GlassModule_sy', '40.0*mm'),
-        ('GlassModule_sz', '40.0*cm'),
-        ('GlassModule_dz', '0.0*cm'),
-        ('GlassModule_wrap', '1.0*mm'),
-        ('EcalEndcapN_z0', '-EcalEndcapN_zmin-max(CrystalModule_sz,GlassModule_sz)/2.'),
-    ]
-
-    for name, value in consts:
+    for name, value in CONSTANTS:
         constant = ET.SubElement(defines, 'constant')
         constant.set('name', name)
         constant.set('value', value)
@@ -133,10 +104,10 @@ if __name__ == '__main__':
 
     # placements of modules
     plm = ET.SubElement(det, 'placements')
+    pltype = 'individuals' if args.indiv else 'lines'
 
-    # crystals
-    # crystal = ET.SubElement(plm, 'individuals')
-    crystal = ET.SubElement(plm, 'lines')
+    # crystal
+    crystal = ET.SubElement(plm, pltype)
     crystal.set('sector', '1')
     crystal_mod = ET.SubElement(crystal, 'module')
     crystal_mod.set('sizex', 'CrystalModule_sx')
@@ -148,30 +119,30 @@ if __name__ == '__main__':
     crystal_wrap.set('thickness', 'CrystalModule_wrap')
     crystal_wrap.set('material', 'Epoxy')
     crystal_wrap.set('vis', 'WhiteVis')
-    crystal_pos = ET.SubElement(crystal, 'position')
-    crystal_pos.set('z', 'CrystalModule_dz')
     # crystal placements (for individuals)
-    # for m, (x, y) in enumerate(individual_placement(CRYSTAL_ALIGNMENT)):
-    #     module = ET.SubElement(crystal, 'placement')
-    #     module.set('x', '{:.3f}*mm'.format(x))
-    #     module.set('y', '{:.3f}*mm'.format(y))
-    #     module.set('z', '0')
-    #     module.set('id', '{:d}'.format(m))
-
+    if args.indiv:
+        for m, (x, y) in enumerate(individual_placement(CRYSTAL_ALIGNMENT)):
+            module = ET.SubElement(crystal, 'placement')
+            module.set('x', '{:.3f}*mm'.format(x))
+            module.set('y', '{:.3f}*mm'.format(y))
+            module.set('z', 'CrystalModule_z0')
+            module.set('id', '{:d}'.format(m))
     # crystal placements (for lines)
-    crystal.set('mirrorx', 'true')
-    crystal.set('mirrory', 'true')
-    for row, (begin, nmods) in enumerate(CRYSTAL_ALIGNMENT):
-        line = ET.SubElement(crystal, 'line')
-        line.set('x', '(CrystalModule_sx + CrystalModule_wrap)/2.')
-        line.set('y', '(CrystalModule_sy + CrystalModule_wrap)*{:d}/2.'.format(row*2 + 1))
-        line.set('begin', '{:d}'.format(begin - 1))
-        line.set('nmods', '{:d}'.format(nmods))
+    else:
+        crystal.set('mirrorx', 'true')
+        crystal.set('mirrory', 'true')
+        for row, (begin, nmods) in enumerate(CRYSTAL_ALIGNMENT):
+            line = ET.SubElement(crystal, 'line')
+            line.set('axis', 'x')
+            line.set('x', 'CrystalModule_dx/2.')
+            line.set('y', 'CrystalModule_dy*{:d}/2.'.format(row*2 + 1))
+            line.set('z', 'CrystalModule_z0')
+            line.set('begin', '{:d}'.format(begin))
+            line.set('nmods', '{:d}'.format(nmods))
 
 
     # glass
-    # glass = ET.SubElement(plm, 'individuals')
-    glass = ET.SubElement(plm, 'lines')
+    glass = ET.SubElement(plm, pltype)
     glass.set('sector', '2')
     glass_mod = ET.SubElement(glass, 'module')
     glass_mod.set('sizex', 'GlassModule_sx')
@@ -184,25 +155,27 @@ if __name__ == '__main__':
     glass_wrap.set('thickness', 'GlassModule_wrap')
     glass_wrap.set('material', 'Epoxy')
     glass_wrap.set('vis', 'WhiteVis')
-    glass_pos = ET.SubElement(glass, 'position')
-    glass_pos.set('z', 'GlassModule_dz')
     # crystal placements (for individuals)
-    # for m, (x, y) in enumerate(individual_placement(GLASS_ALIGNMENT, 41.0, 41.0)):
-    #     module = ET.SubElement(glass, 'placement')
-    #     module.set('x', '{:.3f}*mm'.format(x))
-    #     module.set('y', '{:.3f}*mm'.format(y))
-    #     module.set('z', '0')
-    #     module.set('id', '{:d}'.format(m))
-
+    if args.indiv:
+        for m, (x, y) in enumerate(individual_placement(GLASS_ALIGNMENT, 41.0, 41.0)):
+            module = ET.SubElement(glass, 'placement')
+            module.set('x', '{:.3f}*mm'.format(x))
+            module.set('y', '{:.3f}*mm'.format(y))
+            module.set('z', 'GlassModule_z0')
+            module.set('id', '{:d}'.format(m))
     # crystal placements (for lines)
-    glass.set('mirrorx', 'true')
-    glass.set('mirrory', 'true')
-    for row, (begin, nmods) in enumerate(GLASS_ALIGNMENT):
-        line = ET.SubElement(glass, 'line')
-        line.set('x', '(GlassModule_sx + GlassModule_wrap)/2.')
-        line.set('y', '(GlassModule_sy + GlassModule_wrap)*{:d}/2.'.format(row*2 + 1))
-        line.set('begin', '{:d}'.format(begin - 1))
-        line.set('nmods', '{:d}'.format(nmods))
+    else:
+        glass.set('mirrorx', 'true')
+        glass.set('mirrory', 'true')
+        for row, (begin, nmods) in enumerate(GLASS_ALIGNMENT):
+            line = ET.SubElement(glass, 'line')
+            line.set('axis', 'x')
+            line.set('x', 'GlassModule_dx/2.')
+            line.set('y', 'GlassModule_dy*{:d}/2.'.format(row*2 + 1))
+            line.set('z', 'GlassModule_z0')
+            line.set('begin', '{:d}'.format(begin))
+            line.set('nmods', '{:d}'.format(nmods))
+
 
     # readout
     readouts = ET.SubElement(data, 'readouts')
@@ -219,14 +192,14 @@ if __name__ == '__main__':
     crystal_seg.set('name', 'CrystalSeg')
     crystal_seg.set('key_value', '1')
     crystal_seg.set('type', 'CartesianGridXY')
-    crystal_seg.set('grid_size_x', 'CrystalModule_sx + CrystalModule_wrap')
-    crystal_seg.set('grid_size_y', 'CrystalModule_sy + CrystalModule_wrap')
+    crystal_seg.set('grid_size_x', 'CrystalModule_dx')
+    crystal_seg.set('grid_size_y', 'CrystalModule_dy')
     glass_seg = ET.SubElement(seg, 'segmentation')
     glass_seg.set('name', 'GlassSeg')
     glass_seg.set('key_value', '2')
     glass_seg.set('type', 'CartesianGridXY')
-    glass_seg.set('grid_size_x', 'GlassModule_sx + GlassModule_wrap')
-    glass_seg.set('grid_size_y', 'GlassModule_sy + GlassModule_wrap')
+    glass_seg.set('grid_size_x', 'GlassModule_dx')
+    glass_seg.set('grid_size_y', 'GlassModule_dy')
     rid = ET.SubElement(readout, 'id')
     rid.text = 'system:8,sector:4,module:20,x:32:-16,y:-16'
 
diff --git a/src/HomogeneousCalorimeter_geo.cpp b/src/HomogeneousCalorimeter_geo.cpp
index 5ed339dc3dddce25f725a1981b45f243eb44ca42..65fb78dddbaab2fd75d41094699b481d78d0d75a 100644
--- a/src/HomogeneousCalorimeter_geo.cpp
+++ b/src/HomogeneousCalorimeter_geo.cpp
@@ -99,9 +99,9 @@ using namespace dd4hep::detail;
  *       <lines sector="1" mirrorx="true" mirrory="true"/>
  *         <module sizex="2.05*cm" sizey="2.05*cm" sizez="20*cm" vis="GreenVis" material="PbWO4"/>
  *         <wrapper thickness="0.015*cm" material="Epoxy" vis="WhiteVis"/>
- *         <line x="10.25*mm" y="10.25*mm" begin="8" nmods="16"/>
- *         <line x="10.25*mm" y="30.75*mm" begin="8" nmods="16"/>
- *         <line x="10.25*mm" y="51.25*mm" begin="8" nmods="16"/>
+ *         <line x="10.25*mm" y="10.25*mm" axis="x" begin="8" nmods="16"/>
+ *         <line x="10.25*mm" y="30.75*mm" axis="y" begin="8" nmods="16"/>
+ *         <line x="10.25*mm" y="51.25*mm" axis="z" begin="8" nmods="16"/>
  *       </individuals>
  *     </placements>
  *   </detector>
@@ -297,6 +297,7 @@ static void add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, Sen
     int id_begin = dd4hep::getAttrOrDefault<int>(plm, _Unicode(id_begin), 1);
     bool mirrorx = dd4hep::getAttrOrDefault<bool>(plm, _Unicode(mirrorx), false);
     bool mirrory = dd4hep::getAttrOrDefault<bool>(plm, _Unicode(mirrory), false);
+    bool mirrorz = dd4hep::getAttrOrDefault<bool>(plm, _Unicode(mirrorz), false);
 
     // line placement
     int mid = 1;
@@ -307,26 +308,50 @@ static void add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, Sen
         Position rot(dd4hep::getAttrOrDefault<double>(pl, _Unicode(rotx), 0.),
                      dd4hep::getAttrOrDefault<double>(pl, _Unicode(roty), 0.),
                      dd4hep::getAttrOrDefault<double>(pl, _Unicode(rotz), 0.));
+        // determine axis
+        std::string axis = dd4hep::getAttrOrDefault(pl, _Unicode(axis), "x");
+        std::transform(axis.begin(), axis.end(), axis.begin(), [](char c) { return std::tolower(c); });
+        if ((axis != "x") && (axis != "y") && (axis != "z")) {
+            std::cerr << "HomogeneousCalorimeter Error: cannot determine axis of line " << axis
+                      << ", abort placement of this line." << std::endl;
+            continue;
+        }
+
         int begin = dd4hep::getAttrOrDefault<int>(pl, _Unicode(begin), 0);
         int nmods = pl.attr<int>(_Unicode(nmods));
 
-        std::vector<std::pair<double, double>> translations;
+        std::vector<Position> trans;
         for (int i = 0; i < nmods; ++i) {
-            translations.push_back(std::pair<double, double>{pos.x() + (begin + i)*modSize.x(), pos.y()});
-            if (mirrorx) {
-                translations.push_back(std::pair<double, double>{-pos.x() - (begin + i)*modSize.x(), pos.y()});
+            Position tran{ (axis == "x") ? pos.x() + (begin + i)*modSize.x() : pos.x(),
+                           (axis == "y") ? pos.y() + (begin + i)*modSize.y() : pos.y(),
+                           (axis == "z") ? pos.z() + (begin + i)*modSize.z() : pos.z() };
+            trans.push_back(tran);
+        }
+
+        // mirror placement
+        if (mirrorx) {
+            int curr_size = trans.size();
+            for (size_t i = 0; i < curr_size; ++i) {
+                trans.push_back(Position{-trans[i].x(), trans[i].y(), trans[i].z()});
             }
-            if (mirrory) {
-                translations.push_back(std::pair<double, double>{pos.x() + (begin + i)*modSize.x(), -pos.y()});
+        }
+        if (mirrory) {
+            int curr_size = trans.size();
+            for (size_t i = 0; i < curr_size; ++i) {
+                trans.push_back(Position{trans[i].x(), -trans[i].y(), trans[i].z()});
             }
-            if (mirrorx && mirrory) {
-                translations.push_back(std::pair<double, double>{-pos.x() - (begin + i)*modSize.x(), -pos.y()});
+        }
+        if (mirrorz) {
+            int curr_size = trans.size();
+            for (size_t i = 0; i < curr_size; ++i) {
+                trans.push_back(Position{trans[i].x(), trans[i].y(), -trans[i].z()});
             }
         }
 
-        for (auto &p : translations) {
+        // place volume
+        for (auto &p : trans) {
             Transform3D tr = RotationZYX(rot.z(), rot.y(), rot.x())
-                           * Translation3D(p.first, p.second, pos.z());
+                           * Translation3D(p.x(), p.y(), p.z());
             auto modPV = env.placeVolume(modVol, tr);
             modPV.addPhysVolID("sector", sector_id).addPhysVolID("module", id_begin + mid++);
         }