diff --git a/src/docs/part3/simulating_detectors.md b/src/docs/part3/simulating_detectors.md
index a6e8da300f5563ddaf68e083c87b8c3d86c0514b..68440738c7131bd6dc977d9a1d1be0c22ca12dd5 100644
--- a/src/docs/part3/simulating_detectors.md
+++ b/src/docs/part3/simulating_detectors.md
@@ -29,10 +29,137 @@ benefits.
 This part of the tutorial will use the python interface but converting to C++ 
 or XML should be straightforward.
 
+## Simulation setup 
 
-## 
+### Setup using Python/C++
 
+To be completed.
+
+```python
+#!/usr/bin/env python
+from __future__ import absolute_import, unicode_literals
+import os
+import time
+import logging
+import DDG4
+from DDG4 import OutputLevel as Output
+from g4units import keV, GeV, mm, ns, MeV
+
+def run():
+  os.environ['G4UI_USE_TCSH'] = "1"
+  kernel = DDG4.Kernel()
+  description = kernel.detectorDescription()
+  kernel.loadGeometry(str("file:" + "solid_sidis.xml"))
+  DDG4.importConstants(description)
+
+  geant4 = DDG4.Geant4(kernel)
+
+  geant4.setupUI('tcsh',vis=False,macro='macro/gps.mac')
+
+  geant4.setupTrackingField(stepper='ClassicalRK4', equation='Mag_UsualEqRhs')
+
+  rndm = DDG4.Action(kernel, 'Geant4Random/Random')
+  rndm.Seed = 854321
+  rndm.initialize()
+  rndm.showStatus()
+
+  run1 = DDG4.RunAction(kernel, 'Geant4TestRunAction/RunInit')
+  run1.Property_int = 12345
+  run1.Property_double = -5e15 * keV
+  run1.Property_string = 'Startrun: Hello_2'
+  run1.enableUI()
+  kernel.registerGlobalAction(run1)
+  kernel.runAction().adopt(run1)
+
+  prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
+  prt.OutputLevel = Output.INFO
+  prt.OutputType = 3  # Print both: table and tree
+  kernel.eventAction().adopt(prt)
+
+  geant4.setupROOTOutput('RootOutput', 'derp_' + time.strftime('%Y-%m-%d_%H-%M'))
+
+  gen = DDG4.GeneratorAction(kernel, "Geant4GeneratorActionInit/GenerationInit")
+  kernel.generatorAction().adopt(gen)
+  gen.enableUI()
+
+  gen = DDG4.GeneratorAction(kernel, "Geant4GeneratorWrapper/GPS")
+  gen.Uses = 'G4GeneralParticleSource'
+  #gen.OutputLevel = Output.WARNING
+  #gen.Mask = 1
+  gen.enableUI()
+  kernel.generatorAction().adopt(gen)
+
+  gen = DDG4.GeneratorAction(kernel, "Geant4InteractionMerger/InteractionMerger")
+  gen.OutputLevel = 0  # generator_output_level
+  gen.enableUI()
+  kernel.generatorAction().adopt(gen)
+
+  gen = DDG4.GeneratorAction(kernel, "Geant4PrimaryHandler/PrimaryHandler")
+  #gen.OutputLevel = 0  # generator_output_level
+  gen.enableUI()
+  kernel.generatorAction().adopt(gen)
+
+  part = DDG4.GeneratorAction(kernel, "Geant4ParticleHandler/ParticleHandler")
+  kernel.generatorAction().adopt(part)
+  part.MinimalKineticEnergy = 100000 * GeV
+  #part.OutputLevel = 5  # generator_output_level
+  part.enableUI()
 
+  f2 = DDG4.Filter(kernel, 'ParticleRejectFilter/OpticalPhotonRejector')
+  f2.particle = 'opticalphoton'
+
+  f3 = DDG4.Filter(kernel, 'ParticleSelectFilter/OpticalPhotonSelector')
+  f3.particle = 'opticalphoton'
+
+  kernel.registerGlobalFilter(f2)
+  kernel.registerGlobalFilter(f3)
+
+  seq, act = geant4.setupDetector('LightGasCherenkov','PhotoMultiplierSDAction')
+  act.adopt(f3)
+  seq, act = geant4.setupDetector('HeavyGasCherenkov','PhotoMultiplierSDAction')
+  act.adopt(f3)
+
+  seq, act = geant4.setupTracker('GEMTracker_SIDIS')
+  seq, act = geant4.setupCalorimeter('FAECPreShower')
+  seq, act = geant4.setupCalorimeter('FAECShower')
+  seq, act = geant4.setupCalorimeter('LAECPreShower')
+  seq, act = geant4.setupCalorimeter('LAECShower')
+
+  phys = geant4.setupPhysics('QGSP_BERT')
+  geant4.addPhysics(str('Geant4PhysicsList/Myphysics'))
+
+  ph = DDG4.PhysicsList(kernel, 'Geant4OpticalPhotonPhysics/OpticalPhotonPhys')
+  ph.VerboseLevel = 0
+  ph.enableUI()
+  phys.adopt(ph)
+
+  ph = DDG4.PhysicsList(kernel, 'Geant4CerenkovPhysics/CerenkovPhys')
+  ph.MaxNumPhotonsPerStep = 10
+  ph.MaxBetaChangePerStep = 10.0
+  ph.TrackSecondariesFirst = True
+  ph.VerboseLevel = 0
+  ph.enableUI()
+  phys.adopt(ph)
+
+  # Add global range cut
+  rg = geant4.addPhysics('Geant4DefaultRangeCut/GlobalRangeCut')
+  rg.RangeCut = 0.7 * mm
+
+  phys.dump()
+
+  kernel.configure()
+  kernel.initialize()
+
+  kernel.run()
+  kernel.terminate()
+
+if __name__ == "__main__":
+  run()
+```
+
+### Setup using XML
 
 To be completed.
 
+
+