diff --git a/setup/Setup.cpp b/setup/Setup.cpp
index e2e712a99..e533bfff8 100755
--- a/setup/Setup.cpp
+++ b/setup/Setup.cpp
@@ -101,8 +101,9 @@ protected:
   void InternetUpdate();
   void ClientUpdate();
   void NormalSetup();
-  bool CampoRunning(const wxString& strAppName, const wxString& strMsg) const;
+  bool SystemRunning(const wxString& strAppName, const wxString& strMsg) const;
   bool LurchRunning() const;
+  bool CampoRunning() const;
 
   //metodi di interfaccia con Windows
   bool CreateIcon(unsigned int csidl, const wxFileName& strExeFile, const wxString& strLinkName) const;
@@ -1245,7 +1246,7 @@ void CampoSetup::NormalSetup()
   m_pWizard->Destroy();
 }
 
-bool CampoSetup::CampoRunning(const wxString& strAppName, const wxString& strMsg) const
+bool CampoSetup::SystemRunning(const wxString& strAppName, const wxString& strMsg) const
 {
   wxSingleInstanceChecker sicProgram(strAppName);
 
@@ -1263,11 +1264,11 @@ bool CampoSetup::CampoRunning(const wxString& strAppName, const wxString& strMsg
 bool CampoSetup::LurchRunning() const
 {
   //cerca Lurch che funziona come programma (esecuzione in modalita' avvio automatico)...
-  bool ok = CampoRunning("Lurch", wxEmptyString);
+  bool ok = SystemRunning("Lurch", wxEmptyString);
   if (!ok)
   {
     //...se non lo trova cerca il solo Authoriz sempre come programma...
-    ok = CampoRunning("Authorization", wxEmptyString);
+    ok = SystemRunning("Authorization", wxEmptyString);
     //se non trova nulla cerca Lurch come servizio...
     if (!ok)
     {
@@ -1279,6 +1280,61 @@ bool CampoSetup::LurchRunning() const
   return ok;
 }
 
+
+bool CampoSetup::CampoRunning() const
+{
+  //ricerca di campo.aut per avere la lista dei moduli
+  //prima tenta con aggiornamento da disco...
+  wxString strInstallPath = "../install.ini";
+  //...poi con aggiornamento da CD
+  if (!wxFileName::FileExists(strInstallPath))
+    strInstallPath = "../../campo/install.ini";
+ 
+  //fa un giro sull'install.ini alla ricerca di tutti i moduli (sono i paragrafi lunghi 2) installati (se aggiornamento..
+  //..da disco) o da installare (se sta installando da CD)
+  wxArrayString asModuli;
+  if (wxFileName::FileExists(strInstallPath))
+  {
+    wxString strModulo;
+    long nIndex;
+    CampoIniFile iniInstall(strInstallPath, strModulo);
+    for (bool ok = iniInstall.GetFirstGroup(strModulo, nIndex); ok; ok = iniInstall.GetNextGroup(strModulo, nIndex))
+    {
+      if (strModulo.Len() == 2)
+        asModuli.Add(strModulo);  //aggiunge all'array tutti i moduli che trova in install.ini
+    }
+  }
+  else  //non trova nessun install.ini (non dovrebbe mai accadere) e tenta i moduli pi� importanti
+  {
+    asModuli.Add("ba");
+    asModuli.Add("cg");
+    asModuli.Add("ve");
+    asModuli.Add("mg");
+    asModuli.Add("lv");
+  }
+  
+  //scandisce l'array dei moduli alla ricerca di un eventuale programma di campo ancora running a sua insaputa
+  wxString strAppName;
+  for (size_t i = 0; i < asModuli.GetCount(); i++)
+  {
+    for (size_t j = 0; j <= 9; j++)
+    {
+      strAppName = asModuli[i];
+      strAppName += ('0'+j);
+      wxSingleInstanceChecker sicProgram(strAppName);
+
+      if (sicProgram.IsAnotherRunning())
+      {
+        strAppName << " � in esecuzione! E' necessario terminarlo utilizzando il Task Manager di Windows";
+        ErrorBox(strAppName);
+        return true;
+      }
+
+    }
+  }
+  return false; //campo non sta andando
+}
+
 //metodo principale che sceglie la modalita' di lancio del programma
 void CampoSetup::OnTimer(wxTimerEvent& WXUNUSED(e))
 {
@@ -1288,16 +1344,27 @@ void CampoSetup::OnTimer(wxTimerEvent& WXUNUSED(e))
     if (YesNoBox("Per poter aggiornare/installare il programma CAMPO deve temporaneamente essere disattivato il gestore delle licenze!\nPrima di disattivare il gestore delle licenze accertarsi che tutti gli utenti spengano il programma CAMPO!!\nProseguire con la disattivazione?"))
       const long lStop = StopLurch();
     else
+    {
+      m_pMainFrame->Destroy();
       return;
+    }
   }
 
-  if (CampoRunning("ba0", "Uscire dal programma CAMPO prima di procedere con l'aggiornamento/installazione!") ||
-      CampoRunning("ba1", "Uscire dal programma di manutenzione di CAMPO\n prima di procedere con l'aggiornamento/installazione!"))
+  if (SystemRunning("ba0", "Uscire dal programma CAMPO prima di procedere con l'aggiornamento/installazione!") ||
+      SystemRunning("ba1", "Uscire dal programma di manutenzione di CAMPO\n prima di procedere con l'aggiornamento/installazione!"))
   {
     m_pMainFrame->Destroy();
     return;
   }
 
+  if (CampoRunning())
+  {
+    ErrorBox("Un applicativo di Campo � ancora in esecuzione!\nL'installazione sar� interrotta immediatamente");
+    m_pMainFrame->Destroy();
+    return;
+  }
+
+
   wxFileName strPath(argv[0]);
   strPath.MakeAbsolute();
   strPath.SetCwd();