diff --git a/CMakeLists.txt b/CMakeLists.txt
index ff44340d207064b54bbee4366c350ad9a597089d..b818dfbd3d784c2cb939314ed2cae7242de593e7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,10 +6,11 @@ project( "GeoModelG4" VERSION 1.0.0 LANGUAGES CXX )
 
 # Add sub-packages.
 add_subdirectory(GeoMaterial2G4)
-add_subdirectory(GeoModel2G4)
 add_subdirectory(GeoSpecialShapes)
+add_subdirectory(GeoModel2G4)
+
 
 install(EXPORT GeoMaterial2G4-export FILE GeoModelG4-GeoMaterial2G4.cmake DESTINATION lib/GeoModelG4)
-install(EXPORT GeoModel2G4-export FILE GeoModelG4-GeoModel2G4.cmake DESTINATION lib/GeoModelG4)
 install(EXPORT GeoSpecialShapes-export FILE GeoModelG4-GeoSpecialShapes.cmake DESTINATION lib/GeoModelG4)
+install(EXPORT GeoModel2G4-export FILE GeoModelG4-GeoModel2G4.cmake DESTINATION lib/GeoModelG4)
 install(FILES cmake/GeoModelG4Config.cmake DESTINATION lib/GeoModelG4)
diff --git a/GeoModel2G4/CMakeLists.txt b/GeoModel2G4/CMakeLists.txt
index 94144bb75c951cbd26cd1eb9edfce08399097858..6360ac6475fe194fc2104a0b0cf25bf4fe05a6ad 100644
--- a/GeoModel2G4/CMakeLists.txt
+++ b/GeoModel2G4/CMakeLists.txt
@@ -44,7 +44,7 @@ include(${Geant4_USE_FILE})
 add_library( GeoModel2G4 SHARED ${HEADERS} ${SOURCES} )
 target_link_libraries( GeoModel2G4
   PUBLIC  ${GEANT4_LIBRARIES}
-  PRIVATE ${CLHEP_LIBRARIES} GeoMaterial2G4 )
+  PRIVATE ${CLHEP_LIBRARIES} GeoMaterial2G4 GeoSpecialShapes)
 target_include_directories( GeoModel2G4 SYSTEM PUBLIC ${GEANT4_INCLUDE_DIRS} PRIVATE ${CLHEP_INCLUDE_DIRS} ${GeoModelCore_INCLUDE_DIRS} )
 target_include_directories( GeoModel2G4 PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
diff --git a/GeoModel2G4/GeoModel2G4/Geo2G4SolidFactory.h b/GeoModel2G4/GeoModel2G4/Geo2G4SolidFactory.h
index 23e0e8fb2b872b39bf4b1e565a6ef91d1e2aa8fb..ca1789bcb2d4efe9cddae4750ad72bf3c7565736 100644
--- a/GeoModel2G4/GeoModel2G4/Geo2G4SolidFactory.h
+++ b/GeoModel2G4/GeoModel2G4/Geo2G4SolidFactory.h
@@ -8,7 +8,7 @@
 #include <map>
 #include <string>
 
-//#include "LArWheelSolid_type.h"
+#include "LArWheelSolid_type.h"
 
 class G4VSolid;
 class GeoShape;
@@ -18,8 +18,8 @@ class Geo2G4SolidFactory
 public:
     
   	//typedef ServiceHandle<StoreGateSvc> StoreGateSvc_t;
-  	//typedef std::pair<LArWheelSolid_t, int> LArWheelSolidDef_t;
-  	//typedef std::map<std::string,  LArWheelSolidDef_t> LArWheelSolid_typemap;
+  	typedef std::pair<LArWheelSolid_t, int> LArWheelSolidDef_t;
+  	typedef std::map<std::string,  LArWheelSolidDef_t> LArWheelSolid_typemap;
 
   Geo2G4SolidFactory();
   G4VSolid* Build(const GeoShape*, std::string name=std::string("")) const;
@@ -29,9 +29,9 @@ public:
     */
    //StoreGateSvc_t& detStore() const;
 private:
-  //G4VSolid* createLArWheelSolid(const std::string& name, const LArWheelSolidDef_t & lwsdef) const;
+  G4VSolid* createLArWheelSolid(const std::string& name, const LArWheelSolidDef_t & lwsdef) const;
 
-  //static const LArWheelSolid_typemap s_lwsTypes;
+  static const LArWheelSolid_typemap s_lwsTypes;
 
 };
 
diff --git a/GeoModel2G4/src/Geo2G4SolidFactory.cxx b/GeoModel2G4/src/Geo2G4SolidFactory.cxx
index e8b25dcba9c7cd236473b9174bc658ed00864f4c..5b8a7b063e140834dab0c21ea18d775791f6baa5 100644
--- a/GeoModel2G4/src/Geo2G4SolidFactory.cxx
+++ b/GeoModel2G4/src/Geo2G4SolidFactory.cxx
@@ -3,9 +3,9 @@
 */
 
 #include "GeoModel2G4/Geo2G4SolidFactory.h"
-//TODO #include "LArWheelSolid.h"
-//TODO #include "LArWheelSolidDDProxy.h"
-//TODO #include "GeoSpecialShapes/LArCustomShape.h"
+#include "GeoModel2G4/LArWheelSolid.h"
+#include "GeoModel2G4/LArWheelSolidDDProxy.h"
+#include "GeoSpecialShapes/LArCustomShape.h"
 
 #include "GeoModelKernel/GeoShape.h"
 #include "GeoModelKernel/GeoBox.h"
@@ -57,55 +57,54 @@
 typedef std::map<const GeoShape*, G4VSolid*, std::less<const GeoShape*> > shapesMap;
 typedef std::map<std::string, G4VSolid*,std::less<std::string> > customSolidMap;
 
-//TODO const Geo2G4SolidFactory::LArWheelSolid_typemap Geo2G4SolidFactory::s_lwsTypes = {
-//        { "LAr::EMEC::InnerWheel::Absorber",         {InnerAbsorberWheel, 1} },
-//        { "LAr::EMEC::Pos::InnerWheel::Absorber",    {InnerAbsorberWheel, 1} },
-//
-//        { "LAr::EMEC::OuterWheel::Absorber",         {OuterAbsorberWheel, 1} },
-//        { "LAr::EMEC::Pos::OuterWheel::Absorber",    {OuterAbsorberWheel, 1} },
-//
-//        { "LAr::EMEC::InnerWheel::Electrode",        {InnerElectrodWheel, 1} },
-//        { "LAr::EMEC::Pos::InnerWheel::Electrode",   {InnerElectrodWheel, 1} },
-//
-//        { "LAr::EMEC::OuterWheel::Electrode",        {OuterElectrodWheel, 1} },
-//        { "LAr::EMEC::Pos::OuterWheel::Electrode",   {OuterElectrodWheel, 1} },
-//
-//        { "LAr::EMEC::Neg::InnerWheel::Absorber",    {InnerAbsorberWheel, -1} },
-//
-//        { "LAr::EMEC::Neg::OuterWheel::Absorber",    {OuterAbsorberWheel, -1} },
-//
-//        { "LAr::EMEC::Neg::InnerWheel::Electrode",   {InnerElectrodWheel, -1} },
-//
-//        { "LAr::EMEC::Neg::OuterWheel::Electrode",   {OuterElectrodWheel, -1} },
-//
-//        { "LAr::EMEC::InnerModule::Absorber",        {InnerAbsorberModule, 1} },
-//
-//        { "LAr::EMEC::OuterModule::Absorber",        {OuterAbsorberModule, 1} },
-//
-//        { "LAr::EMEC::InnerModule::Electrode",       {InnerElectrodModule, 1} },
-//
-//        { "LAr::EMEC::OuterModule::Electrode",       {OuterElectrodModule, 1} },
-//
-//        { "LAr::EMEC::InnerWheel::Glue",             {InnerGlueWheel, 1} },
-//        { "LAr::EMEC::Pos::InnerWheel::Glue",        {InnerGlueWheel, 1} },
-//
-//        { "LAr::EMEC::InnerWheel::Lead",             {InnerLeadWheel, 1} },
-//        { "LAr::EMEC::Pos::InnerWheel::Lead",        {InnerLeadWheel, 1} },
-//
-//        { "LAr::EMEC::OuterWheel::Glue",             {OuterGlueWheel, 1} },
-//        { "LAr::EMEC::Pos::OuterWheel::Glue",        {OuterGlueWheel, 1} },
-//
-//        { "LAr::EMEC::OuterWheel::Lead",             {OuterLeadWheel, 1} },
-//        { "LAr::EMEC::Pos::OuterWheel::Lead",        {OuterLeadWheel, 1} },
-//
-//        { "LAr::EMEC::Neg::InnerWheel::Glue",        {InnerGlueWheel, -1} },
-//
-//        { "LAr::EMEC::Neg::OuterWheel::Glue",        {OuterGlueWheel, -1} },
-//
-//        { "LAr::EMEC::Neg::InnerWheel::Lead",        {InnerLeadWheel, -1} },
-//
-//        { "LAr::EMEC::Neg::OuterWheel::Lead",        {OuterLeadWheel, -1} }
-//};
+const Geo2G4SolidFactory::LArWheelSolid_typemap Geo2G4SolidFactory::s_lwsTypes = {
+        { "LAr::EMEC::InnerWheel::Absorber",         {InnerAbsorberWheel, 1} },
+        { "LAr::EMEC::Pos::InnerWheel::Absorber",    {InnerAbsorberWheel, 1} },
+
+        { "LAr::EMEC::OuterWheel::Absorber",         {OuterAbsorberWheel, 1} },
+        { "LAr::EMEC::Pos::OuterWheel::Absorber",    {OuterAbsorberWheel, 1} },
+
+        { "LAr::EMEC::InnerWheel::Electrode",        {InnerElectrodWheel, 1} },
+        { "LAr::EMEC::Pos::InnerWheel::Electrode",   {InnerElectrodWheel, 1} },
+
+        { "LAr::EMEC::OuterWheel::Electrode",        {OuterElectrodWheel, 1} },
+        { "LAr::EMEC::Pos::OuterWheel::Electrode",   {OuterElectrodWheel, 1} },
+
+        { "LAr::EMEC::Neg::InnerWheel::Absorber",    {InnerAbsorberWheel, -1} },
+
+        { "LAr::EMEC::Neg::OuterWheel::Absorber",    {OuterAbsorberWheel, -1} },
+        { "LAr::EMEC::Neg::InnerWheel::Electrode",   {InnerElectrodWheel, -1} },
+
+       { "LAr::EMEC::Neg::OuterWheel::Electrode",   {OuterElectrodWheel, -1} },
+
+       { "LAr::EMEC::InnerModule::Absorber",        {InnerAbsorberModule, 1} },
+
+        { "LAr::EMEC::OuterModule::Absorber",        {OuterAbsorberModule, 1} },
+
+        { "LAr::EMEC::InnerModule::Electrode",       {InnerElectrodModule, 1} },
+
+        { "LAr::EMEC::OuterModule::Electrode",       {OuterElectrodModule, 1} },
+
+        { "LAr::EMEC::InnerWheel::Glue",             {InnerGlueWheel, 1} },
+        { "LAr::EMEC::Pos::InnerWheel::Glue",        {InnerGlueWheel, 1} },
+
+        { "LAr::EMEC::InnerWheel::Lead",             {InnerLeadWheel, 1} },
+        { "LAr::EMEC::Pos::InnerWheel::Lead",        {InnerLeadWheel, 1} },
+
+        { "LAr::EMEC::OuterWheel::Glue",             {OuterGlueWheel, 1} },
+        { "LAr::EMEC::Pos::OuterWheel::Glue",        {OuterGlueWheel, 1} },
+
+        { "LAr::EMEC::OuterWheel::Lead",             {OuterLeadWheel, 1} },
+        { "LAr::EMEC::Pos::OuterWheel::Lead",        {OuterLeadWheel, 1} },
+
+        { "LAr::EMEC::Neg::InnerWheel::Glue",        {InnerGlueWheel, -1} },
+
+        { "LAr::EMEC::Neg::OuterWheel::Glue",        {OuterGlueWheel, -1} },
+
+        { "LAr::EMEC::Neg::InnerWheel::Lead",        {InnerLeadWheel, -1} },
+
+        { "LAr::EMEC::Neg::OuterWheel::Lead",        {OuterLeadWheel, -1} }
+};
 
 Geo2G4SolidFactory::Geo2G4SolidFactory()
 {
@@ -497,69 +496,69 @@ G4VSolid *Geo2G4SolidFactory::Build(const GeoShape* geoShape, std::string name)
   //
   // Custom Shapes (presently LAr shapes only)
   //
-//TODO: LAr custom shape
-//  else if(geoShape->typeID() == LArCustomShape::getClassTypeID())
-//    {
-//      const LArCustomShape* customShape = dynamic_cast<const LArCustomShape*> (geoShape);
-//      if (nullptr==customShape) throw std::runtime_error("TypeID did not match cast for custom shape");
-//      std::string customName = customShape->name();
-//      customSolidMap::const_iterator it = customSolids.find(customName);
-//      if(it!=customSolids.end())
-//        theSolid = it->second;
-//      else
-//        {
-//          theSolid = nullptr;
-//          if(customName == "LAr::EMEC::InnerWheel::Absorber" || customName == "LAr::EMEC::Pos::InnerWheel::Absorber"){
-//           theSolid = new LArWheelSolid(customName, InnerAbsorberWheel, 1);
-//         } else if(customName == "LAr::EMEC::OuterWheel::Absorber" ||  customName == "LAr::EMEC::Pos::OuterWheel::Absorber"){
-//            theSolid = new LArWheelSolid(customName, OuterAbsorberWheel, 1);
-//          } else if(customName == "LAr::EMEC::InnerWheel::Electrode" || customName == "LAr::EMEC::Pos::InnerWheel::Electrode"){
-//            theSolid = new LArWheelSolid(customName, InnerElectrodWheel, 1);
-//          } else if(customName == "LAr::EMEC::OuterWheel::Electrode" || customName == "LAr::EMEC::Pos::OuterWheel::Electrode"){
-//            theSolid = new LArWheelSolid(customName, OuterElectrodWheel, 1);
-//          } else if(customName == "LAr::EMEC::Neg::InnerWheel::Absorber"){
-//            theSolid = new LArWheelSolid(customName, InnerAbsorberWheel, -1);
-//          } else if(customName == "LAr::EMEC::Neg::OuterWheel::Absorber"){
-//            theSolid = new LArWheelSolid(customName, OuterAbsorberWheel, -1);
-//          } else if(customName == "LAr::EMEC::Neg::InnerWheel::Electrode"){
-//            theSolid = new LArWheelSolid(customName, InnerElectrodWheel, -1);
-//          } else if(customName == "LAr::EMEC::Neg::OuterWheel::Electrode"){
-//            theSolid = new LArWheelSolid(customName, OuterElectrodWheel, -1);
-//          } else if(customName == "LAr::EMEC::InnerModule::Absorber"){
-//            theSolid = new LArWheelSolid(customName, InnerAbsorberModule, 1);
-//          } else if(customName == "LAr::EMEC::OuterModule::Absorber"){
-//            theSolid = new LArWheelSolid(customName, OuterAbsorberModule, 1);
-//          } else if(customName == "LAr::EMEC::InnerModule::Electrode"){
-//            theSolid = new LArWheelSolid(customName, InnerElectrodModule, 1);
-//          } else if(customName == "LAr::EMEC::OuterModule::Electrode"){
-//            theSolid = new LArWheelSolid(customName, OuterElectrodModule, 1);
-//          } else if(customName == "LAr::EMEC::InnerWheel::Glue" ||  customName == "LAr::EMEC::Pos::InnerWheel::Glue"){
-//            theSolid = new LArWheelSolid(customName, InnerGlueWheel, 1);
-//          } else if(customName == "LAr::EMEC::InnerWheel::Lead" ||  customName == "LAr::EMEC::Pos::InnerWheel::Lead"){
-//            theSolid = new LArWheelSolid(customName, InnerLeadWheel, 1);
-//          } else if(customName == "LAr::EMEC::OuterWheel::Glue" ||  customName == "LAr::EMEC::Pos::OuterWheel::Glue"){
-//            theSolid = new LArWheelSolid(customName, OuterGlueWheel, 1);
-//          } else if(customName == "LAr::EMEC::OuterWheel::Lead" ||  customName == "LAr::EMEC::Pos::OuterWheel::Lead"){
-//            theSolid = new LArWheelSolid(customName, OuterLeadWheel, 1);
-//          } else if(customName == "LAr::EMEC::Neg::InnerWheel::Glue"){
-//            theSolid = new LArWheelSolid(customName, InnerGlueWheel, -1);
-//          } else if(customName == "LAr::EMEC::Neg::InnerWheel::Lead"){
-//            theSolid = new LArWheelSolid(customName, InnerLeadWheel, -1);
-//          } else if(customName == "LAr::EMEC::Neg::OuterWheel::Glue"){
-//            theSolid = new LArWheelSolid(customName, OuterGlueWheel, -1);
-//          } else if(customName == "LAr::EMEC::Neg::OuterWheel::Lead"){
-//            theSolid = new LArWheelSolid(customName, OuterLeadWheel, -1);
-//          }
-//
-//        theSolid = createLArWheelSolid(customName, s_lwsTypes.at(customName) ); // map.at throws std::out_of_range exception on unknown shape name
-//        if ( nullptr == theSolid ) {
-//                std::string error = std::string("Can't create LArWheelSolid for name ") + customName + " in Geo2G4SolidFactory::Build";
-//                throw std::runtime_error(error);
-//        }
-//
-//          if(theSolid != nullptr) customSolids[customName] = theSolid;
-//        }
-//    }
+//LAr custom shape
+  else if(geoShape->typeID() == LArCustomShape::getClassTypeID())
+    {
+      const LArCustomShape* customShape = dynamic_cast<const LArCustomShape*> (geoShape);
+      if (nullptr==customShape) throw std::runtime_error("TypeID did not match cast for custom shape");
+      std::string customName = customShape->name();
+      customSolidMap::const_iterator it = customSolids.find(customName);
+      if(it!=customSolids.end())
+        theSolid = it->second;
+      else
+        {
+          theSolid = nullptr;
+          if(customName == "LAr::EMEC::InnerWheel::Absorber" || customName == "LAr::EMEC::Pos::InnerWheel::Absorber"){
+           theSolid = new LArWheelSolid(customName, InnerAbsorberWheel, 1);
+         } else if(customName == "LAr::EMEC::OuterWheel::Absorber" ||  customName == "LAr::EMEC::Pos::OuterWheel::Absorber"){
+            theSolid = new LArWheelSolid(customName, OuterAbsorberWheel, 1);
+          } else if(customName == "LAr::EMEC::InnerWheel::Electrode" || customName == "LAr::EMEC::Pos::InnerWheel::Electrode"){
+            theSolid = new LArWheelSolid(customName, InnerElectrodWheel, 1);
+          } else if(customName == "LAr::EMEC::OuterWheel::Electrode" || customName == "LAr::EMEC::Pos::OuterWheel::Electrode"){
+            theSolid = new LArWheelSolid(customName, OuterElectrodWheel, 1);
+          } else if(customName == "LAr::EMEC::Neg::InnerWheel::Absorber"){
+            theSolid = new LArWheelSolid(customName, InnerAbsorberWheel, -1);
+          } else if(customName == "LAr::EMEC::Neg::OuterWheel::Absorber"){
+            theSolid = new LArWheelSolid(customName, OuterAbsorberWheel, -1);
+          } else if(customName == "LAr::EMEC::Neg::InnerWheel::Electrode"){
+            theSolid = new LArWheelSolid(customName, InnerElectrodWheel, -1);
+          } else if(customName == "LAr::EMEC::Neg::OuterWheel::Electrode"){
+            theSolid = new LArWheelSolid(customName, OuterElectrodWheel, -1);
+          } else if(customName == "LAr::EMEC::InnerModule::Absorber"){
+            theSolid = new LArWheelSolid(customName, InnerAbsorberModule, 1);
+          } else if(customName == "LAr::EMEC::OuterModule::Absorber"){
+            theSolid = new LArWheelSolid(customName, OuterAbsorberModule, 1);
+          } else if(customName == "LAr::EMEC::InnerModule::Electrode"){
+            theSolid = new LArWheelSolid(customName, InnerElectrodModule, 1);
+          } else if(customName == "LAr::EMEC::OuterModule::Electrode"){
+            theSolid = new LArWheelSolid(customName, OuterElectrodModule, 1);
+          } else if(customName == "LAr::EMEC::InnerWheel::Glue" ||  customName == "LAr::EMEC::Pos::InnerWheel::Glue"){
+            theSolid = new LArWheelSolid(customName, InnerGlueWheel, 1);
+          } else if(customName == "LAr::EMEC::InnerWheel::Lead" ||  customName == "LAr::EMEC::Pos::InnerWheel::Lead"){
+            theSolid = new LArWheelSolid(customName, InnerLeadWheel, 1);
+          } else if(customName == "LAr::EMEC::OuterWheel::Glue" ||  customName == "LAr::EMEC::Pos::OuterWheel::Glue"){
+            theSolid = new LArWheelSolid(customName, OuterGlueWheel, 1);
+          } else if(customName == "LAr::EMEC::OuterWheel::Lead" ||  customName == "LAr::EMEC::Pos::OuterWheel::Lead"){
+            theSolid = new LArWheelSolid(customName, OuterLeadWheel, 1);
+          } else if(customName == "LAr::EMEC::Neg::InnerWheel::Glue"){
+            theSolid = new LArWheelSolid(customName, InnerGlueWheel, -1);
+          } else if(customName == "LAr::EMEC::Neg::InnerWheel::Lead"){
+            theSolid = new LArWheelSolid(customName, InnerLeadWheel, -1);
+          } else if(customName == "LAr::EMEC::Neg::OuterWheel::Glue"){
+            theSolid = new LArWheelSolid(customName, OuterGlueWheel, -1);
+          } else if(customName == "LAr::EMEC::Neg::OuterWheel::Lead"){
+            theSolid = new LArWheelSolid(customName, OuterLeadWheel, -1);
+          }
+
+        theSolid = createLArWheelSolid(customName, s_lwsTypes.at(customName) ); // map.at throws std::out_of_range exception on unknown shape name
+        if ( nullptr == theSolid ) {
+                std::string error = std::string("Can't create LArWheelSolid for name ") + customName + " in Geo2G4SolidFactory::Build";
+                throw std::runtime_error(error);
+        }
+
+          if(theSolid != nullptr) customSolids[customName] = theSolid;
+        }
+    }
   //
   // Catch All
   //
@@ -575,17 +574,17 @@ G4VSolid *Geo2G4SolidFactory::Build(const GeoShape* geoShape, std::string name)
   return theSolid;
 }
 //TODO createLArWheelSolid
-//G4VSolid* Geo2G4SolidFactory::createLArWheelSolid(const std::string& name, const LArWheelSolidDef_t & lwsdef) const { // LArWheelSolid_t wheelType, int zside
-//        LArWheelSolid_t wheelType = lwsdef.first;
-//        int zside = lwsdef.second;
-//
-//        LArWheelSolid * theLWS = new LArWheelSolid(name, wheelType, zside);
-//
-//        LArWheelSolidDDProxy * theLWS_p = new LArWheelSolidDDProxy(theLWS);
-//        // ownership is passed to detStore
-//        if ( detStore()->record(theLWS_p,  name).isFailure() ) {
-//          std::cout<<"Can't store proxy for LArWheelSolid to the DetectorStore"<<std::endl;
-//                delete theLWS_p;
-//        }
-//        return theLWS;
-//}
+G4VSolid* Geo2G4SolidFactory::createLArWheelSolid(const std::string& name, const LArWheelSolidDef_t & lwsdef) const { // LArWheelSolid_t wheelType, int zside
+        LArWheelSolid_t wheelType = lwsdef.first;
+        int zside = lwsdef.second;
+
+        LArWheelSolid * theLWS = new LArWheelSolid(name, wheelType, zside);
+
+        LArWheelSolidDDProxy * theLWS_p = new LArWheelSolidDDProxy(theLWS);
+        // ownership is passed to detStore
+        //if ( detStore()->record(theLWS_p,  name).isFailure() ) {
+        //  std::cout<<"Can't store proxy for LArWheelSolid to the DetectorStore"<<std::endl;
+       //         delete theLWS_p;
+       //}
+        return theLWS;
+}