diff --git a/DDCore/include/DD4hep/BitField64.h b/DDCore/include/DD4hep/BitField64.h
index 36fb91b70d33cb523fb222bc4fd8cc82f76156cc..7eb0d2a7e4ecec9949e65ebd25230049e1153623 100644
--- a/DDCore/include/DD4hep/BitField64.h
+++ b/DDCore/include/DD4hep/BitField64.h
@@ -77,9 +77,9 @@ namespace DD4hep {
      */
     long64 getValue() const { return _value ; }
     
-    /** Set a new 64bit value 
+    /** Set a new 64bit value  - bits not used in description are set to 0.
      */
-    void  setValue(long64 value ) { _value = value ; }
+    void  setValue(long64 value ) { _value = ( _joined & value ) ; }
     
     /** Reset - same as setValue(0) - useful if the same encoder is used for many objects.
      */
diff --git a/DDCore/include/DD4hep/IDDescriptor.h b/DDCore/include/DD4hep/IDDescriptor.h
index c42d281bd8e1b354e3a83a0ddfd329f34745c46b..62692ee8faaf60dac36ef2680a35f27337fcb2cc 100644
--- a/DDCore/include/DD4hep/IDDescriptor.h
+++ b/DDCore/include/DD4hep/IDDescriptor.h
@@ -43,13 +43,13 @@ namespace DD4hep {
 	VolumeID mask;
 	VolumeID encode(int value)  const  {
 	  VolumeID v = value;
-	  //FGxx return  ( (  v  << first )  & mask  ) ;
-	  return mask|((v<<(64-second))>>first);
+	  return  ( (  v  << first )  | mask  ) ;
+	  //xx	  return mask|((v<<(64-second))>>first);
 
 	}
 	int decode(VolumeID value)  const  {
-	  //FGxx return  ( mask & value ) >> first  ;
-	  return (~mask&value)>>(64-second-first);
+	  return  ( ~mask & value ) >> first  ;
+	  //xx return (~mask&value)>>(64-second-first);
 	}
       };
       typedef std::vector<std::pair<std::string,Field> >  FieldMap;
diff --git a/DDCore/src/IDDescriptor.cpp b/DDCore/src/IDDescriptor.cpp
index 0b738b3b601e7c8349dbc1654a1b4ab549c61b54..c0b65afa01aab0d4533dfa4c20ecf482fe5c5b06 100644
--- a/DDCore/src/IDDescriptor.cpp
+++ b/DDCore/src/IDDescriptor.cpp
@@ -51,8 +51,8 @@ namespace {
       field.second = f.size() == 3 ? ::atoi(f[2].c_str()) : ::atoi(f[1].c_str());
       field.second = ::abs(field.second);
 
-      //FG:   field.mask = ( ( 0x0001LL << (field.second) ) - 1 ) << field.first ;
-      field.mask   = ~((~0x0ull<<(64-field.second))>>(64-field.second)<<(64-field.first-field.second));
+      field.mask = ~ ( ( ( 0x0001LL << (field.second) ) - 1 ) << field.first ) ;
+      //field.mask   = ~((~0x0ull<<(64-field.second))>>(64-field.second)<<(64-field.first-field.second));
 
       pos = field.first + ::abs(field.second);
       if ( pos>o->maxBit ) o->maxBit = pos;
diff --git a/DDCore/src/VolumeManager.cpp b/DDCore/src/VolumeManager.cpp
index 9bb187f1ed7902ff4af75251975cda7ee6ac4a53..f6245fd88f8db6a56c9603aa52ae94df5e148f23 100644
--- a/DDCore/src/VolumeManager.cpp
+++ b/DDCore/src/VolumeManager.cpp
@@ -108,6 +108,7 @@ namespace {
     }
     pair<VolumeID,VolumeID> encoding(const IDDescriptor iddesc, const PlacedVolume::VolIDs& ids )  const  {
       VolumeID volume_id = ~0x0ull, mask = 0;
+      //fg: default value 0 for volids does not seem to work (!?):  VolumeID volume_id = 0, mask = 0;
       for(PlacedVolume::VolIDs::const_iterator i=ids.begin(); i!=ids.end(); ++i) {
 	const PlacedVolume::VolID& id = (*i);
 	IDDescriptor::Field f = iddesc.field(id.first);
diff --git a/DDExamples/ILDExSimu/ILDExSimu.cpp b/DDExamples/ILDExSimu/ILDExSimu.cpp
index 17654fce6c88588aa1d74060325c3cc90f0b1616..408539d4385a9b34abc323ed4ababb7d7e5900b0 100644
--- a/DDExamples/ILDExSimu/ILDExSimu.cpp
+++ b/DDExamples/ILDExSimu/ILDExSimu.cpp
@@ -31,8 +31,8 @@
 #include "DD4hep/LCDD.h"
 
 // -- lcio --
-#include <UTIL/BitField64.h>
-#include <UTIL/ILDConf.h>
+// #include <UTIL/BitField64.h>
+// #include <UTIL/ILDConf.h>
 #include "lcio.h"
 #include "IO/LCWriter.h"
 
diff --git a/DDG4/src/Geant4TrackerSD.cpp b/DDG4/src/Geant4TrackerSD.cpp
index cc95dc495e2cb4da3563f6826b934581ed5303ca..87edb610f1a92b5be83879b4b17802724d4a6fa2 100644
--- a/DDG4/src/Geant4TrackerSD.cpp
+++ b/DDG4/src/Geant4TrackerSD.cpp
@@ -62,10 +62,12 @@ namespace DD4hep {  namespace Simulation {
 	  Geometry::Readout           ro     = sd.readout();
 	  Geometry::IDDescriptor      iddesc = ro.idSpec();
 	  
-
 	  //-----  use a BitField64 object to store the cellID in the Linear collider convention
 	  BitField64 bf( iddesc.toString()  ) ; 
 
+#define test_cellID 0
+#if test_cellID  
+	  
 	  for( unsigned i=0, N=bf.size() ;i<N;++i){
 	    
 	    BitFieldValue& v = bf[i] ;
@@ -82,18 +84,27 @@ namespace DD4hep {  namespace Simulation {
 	    //	    b[i] = iddesc.field( b[i].name() ).decode( cell_id )  ; 
 	  }
 	  
-	  // G4cout << "---  IDDescriptor: " << iddesc.toString() 
-	  // 	 << " BitField64 : " <<  bf  
-	  // 	 <<   std::endl ; 
-	  
-	  // Geometry::IDDescriptor::Field modFld = iddesc.field("module");
-	  // int mod_id = modFld.decode( cell_id );
-	  // int layer  = iddesc.field("layer").decode( cell_id )  ;	  
-	  // G4cout << "---  layer " << layer << "  ---- module: " << mod_id << std::endl ;
+	   G4cout << "---  IDDescriptor: " << iddesc.toString() 
+		  <<   std::endl ; 
 	  
 	  
+	  BitField64 testBF( iddesc.toString()  ) ; 
+	  testBF.setValue( cell_id ) ;
+	  G4cout << "---  testing BitField64 testBF \n "  << testBF 
+		 << " \n           bf from IDDescriptor : " << bf << std::endl ;
+	 
+
+	  assert( testBF.getValue() == bf.getValue() ) ;
+
+#else	  
+
+	  bf.setValue( cell_id ) ;   // this sets the unused high bits to 0 !
+#endif
+
+
 	  cellID = bf.lowWord() ;
-	  
+
+
 	} else {
 	  
 	  G4cerr << "**ERROR** Geant4GenericSD<Tracker>::buildHits - called for insensitive volume: "