diff --git a/montecarlo/vmc/inc/TVirtualMC.h b/montecarlo/vmc/inc/TVirtualMC.h
index 7658acb747ec5af29825b8cf66aa8422a852dc58..e7135d8930bc66376f44a859d2b241f2627cbdf0 100644
--- a/montecarlo/vmc/inc/TVirtualMC.h
+++ b/montecarlo/vmc/inc/TVirtualMC.h
@@ -32,6 +32,10 @@
 #include "TString.h"
 #include "TError.h"
 
+#if defined(__linux__) && !defined(__CINT__)
+#include <pthread.h>
+#endif
+
 class TLorentzVector;
 class TGeoHMatrix;
 class TArrayI;
@@ -479,7 +483,7 @@ public:
    virtual Bool_t   DefineParticle(Int_t pdg, const char* name,
                         TMCParticleType mcType, 
                         Double_t mass, Double_t charge, Double_t lifetime) = 0;
-                        
+
    // Set a user defined particle
    // Function is ignored if particle with specified pdg
    // already exists and error report is printed.
@@ -797,7 +801,10 @@ public:
    // Initialize MC
    virtual void Init() = 0;
 
-   // Initialize MC physics
+    // Initialize MC in a multi-threaded application
+   virtual void InitMT(Int_t threadRank);
+
+  // Initialize MC physics
    virtual void BuildPhysics() = 0;
 
    // Process one event
@@ -860,7 +867,11 @@ private:
    TVirtualMC(const TVirtualMC &mc);
    TVirtualMC & operator=(const TVirtualMC &);
 
-   static TVirtualMC*  fgMC;     // Monte Carlo singleton instance
+#if defined(__linux__) && !defined(__CINT__)
+   static __thread TVirtualMC*  fgMC; // Monte Carlo singleton instance
+#else
+   static          TVirtualMC*  fgMC; // Monte Carlo singleton instance
+#endif
 
    TVirtualMCStack*    fStack;   //! Particles stack
    TVirtualMCDecayer*  fDecayer; //! External decayer
@@ -889,7 +900,16 @@ inline Bool_t TVirtualMC::GetMaterial(Int_t /*imat*/, TString& /*name*/,
    return kFALSE;           
 }
 
-R__EXTERN TVirtualMC *gMC;
+inline void TVirtualMC::InitMT(Int_t /*threadRank*/) {
+   // Initialize MC in a multi-threaded application
+   Warning("InitMT(Int_t threadRank)", "New function - not yet implemented.");
+}
+
+#if defined(__linux__) && !defined(__CINT__)
+R__EXTERN __thread TVirtualMC *gMC;
+#else
+R__EXTERN          TVirtualMC *gMC;
+#endif
 
 #endif //ROOT_TVirtualMC
 
diff --git a/montecarlo/vmc/inc/TVirtualMCApplication.h b/montecarlo/vmc/inc/TVirtualMCApplication.h
index 685855a2aaf580b998134153745406a4fb1ba2b5..9d12b5a3cd46befd476c05d51ecacd4e88a90a22 100644
--- a/montecarlo/vmc/inc/TVirtualMCApplication.h
+++ b/montecarlo/vmc/inc/TVirtualMCApplication.h
@@ -25,6 +25,10 @@
 #include "TMath.h"
 #endif
 
+#if defined(__linux__) && !defined(__CINT__)
+#include <pthread.h>
+#endif
+
 class TVirtualMCApplication : public TNamed {
 
 public:
@@ -101,7 +105,11 @@ public:
 
 private:
    // static data members
-   static TVirtualMCApplication* fgInstance; // singleton instance
+#if defined(__linux__) && !defined(__CINT__)
+   static __thread TVirtualMCApplication* fgInstance; // singleton instance
+#else
+   static          TVirtualMCApplication* fgInstance; // singleton instance
+#endif
 
    ClassDef(TVirtualMCApplication,1)  //Interface to MonteCarlo application
 };
diff --git a/montecarlo/vmc/src/TVirtualMC.cxx b/montecarlo/vmc/src/TVirtualMC.cxx
index 04e826936c10b6e17e34643136fd838a2fa79ed1..576ac169438f01addc7e3e796928148f879722a1 100644
--- a/montecarlo/vmc/src/TVirtualMC.cxx
+++ b/montecarlo/vmc/src/TVirtualMC.cxx
@@ -26,8 +26,13 @@
 
 ClassImp(TVirtualMC)
 
+#if defined(__linux__) && !defined(__CINT__)
+__thread TVirtualMC* TVirtualMC::fgMC=0;
+__thread TVirtualMC* gMC;
+#else
 TVirtualMC* TVirtualMC::fgMC=0;
 TVirtualMC* gMC;
+#endif
 
 //_____________________________________________________________________________
 TVirtualMC::TVirtualMC(const char *name, const char *title,
diff --git a/montecarlo/vmc/src/TVirtualMCApplication.cxx b/montecarlo/vmc/src/TVirtualMCApplication.cxx
index dd5c3c4e643fcf40ca3cd6dfda92918431122794..0556c06dd07eb234501d090a7cbaffcca1b8042a 100644
--- a/montecarlo/vmc/src/TVirtualMCApplication.cxx
+++ b/montecarlo/vmc/src/TVirtualMCApplication.cxx
@@ -20,7 +20,11 @@
 
 ClassImp(TVirtualMCApplication)
 
+#if defined(__linux__) && !defined(__CINT__)
+__thread TVirtualMCApplication* TVirtualMCApplication::fgInstance = 0;
+#else
 TVirtualMCApplication* TVirtualMCApplication::fgInstance = 0;
+#endif
 
 //_____________________________________________________________________________
 TVirtualMCApplication::TVirtualMCApplication(const char *name,