Index: /CMT/v1r20b1/source/cmt_parser.cxx
===================================================================
--- /CMT/v1r20b1/source/cmt_parser.cxx	(revision 330)
+++ /CMT/v1r20b1/source/cmt_parser.cxx	(revision 331)
@@ -1364,4 +1364,5 @@
                   
           if (use->discarded) continue;
+          if (use->m_hidden) continue;
 
           if (!use->located ())
Index: /CMT/v1r20b1/source/cmt_project.cxx
===================================================================
--- /CMT/v1r20b1/source/cmt_project.cxx	(revision 330)
+++ /CMT/v1r20b1/source/cmt_project.cxx	(revision 331)
@@ -582,5 +582,6 @@
                                       project->get_release (), "", "");                                                         
       project_use->done      = true; //false;
-      project_use->discarded = false;
+      project_use->discarded = false;//true; //false;
+      project_use->m_hidden  = true;
       project_use->selected  = true;
       project_use->m_located = true;
Index: /CMT/v1r20b1/source/cmt_use.cxx
===================================================================
--- /CMT/v1r20b1/source/cmt_use.cxx	(revision 330)
+++ /CMT/v1r20b1/source/cmt_use.cxx	(revision 331)
@@ -1335,4 +1335,5 @@
   discarded = false;
   selected  = false;
+  m_hidden  = false;
   auto_imports = Unspecified;
 
@@ -1424,5 +1425,5 @@
 
 //----------------------------------------------------------
-int Use::reach_package (const cmt_string& from_path)
+int Use::reach_package (const cmt_string& from_path, const cmt_string& n_version)
 {
   if (Cmt::get_debug ())
@@ -1431,5 +1432,5 @@
 	   << version << ")from " << from_path << endl;
     }
-
+    
   //
   // We try to reach a package/version starting from from_path
@@ -1511,5 +1512,5 @@
   if (Cmt::get_debug ())
     {
-      cout << "Use::reach_package-5>" << endl;
+        cout << "Use::reach_package-5>" << endl;
     }
 
@@ -1526,5 +1527,5 @@
 
   if (CmtSystem::test_file ("cmt/requirements"))
-    {
+  {
       CmtSystem::cd ("cmt");
 
@@ -1532,48 +1533,47 @@
 
       if (CmtSystem::test_file ("version.cmt"))
-	{
-	  cmt_string v;
-
-	  v.read ("version.cmt");
-	  int pos;
-	  pos = v.find ('\n');
-	  if (pos != cmt_string::npos) v.erase (pos);
-	  pos = v.find ('\r');
-	  if (pos != cmt_string::npos) v.erase (pos);
-
-	  CompareStatus s = compare_versions (version, v);
-
-	  if (Cmt::get_debug ())
-	    {
-	      cout << "Use::reach_package-6.1> version=" << version << " v=" << v << " s=" << s << endl;
-	    }
-
-	  switch (s)
-	    {
-	    case IdenticalIds:
-	    case ExplicitOldMajorIdWinsAgainstWildarded:
-	    case ExplicitOldMinorIdWinsAgainstWildarded:
-	    case ExplicitOldPatchIdWinsAgainstWildarded:
-	      break;
-	    case ExplicitNewMajorIdWinsAgainstWildarded:
-	    case ExplicitNewMinorIdWinsAgainstWildarded:
-	    case NewMinorIdGreaterThanOld:
-	    case ExplicitNewPatchIdWinsAgainstWildarded:
-	    case NewPatchIdGreaterThanOld:
-	      break;
-	    case OldMajorIdGreaterThanNew:
-	    case NewMajorIdGreaterThanOld:
-	      break;
-	    case IncompatibleMajorIds:
-	      return (0);
-	    }
-	  version = v;
-	}
-      else if (version == "")
-	{
-	  version = "v0";
-	}
-
-      return (1);
+	  {
+	       cmt_string v;
+
+	       v.read ("version.cmt");
+	       int pos;
+	       pos = v.find ('\n');
+	       if (pos != cmt_string::npos) v.erase (pos);
+	       pos = v.find ('\r');
+	       if (pos != cmt_string::npos) v.erase (pos);
+
+	       CompareStatus s = compare_versions (version, v);
+
+	       if (Cmt::get_debug ())
+	       {
+	           cout << "Use::reach_package-6.1> version=" << version << " v=" << v << " s=" << s << endl;
+	        }
+
+	       switch (s)
+	       {
+	           case IdenticalIds:
+	           case ExplicitOldMajorIdWinsAgainstWildarded:
+	           case ExplicitOldMinorIdWinsAgainstWildarded:
+	           case ExplicitOldPatchIdWinsAgainstWildarded:
+	               break;
+	           case ExplicitNewMajorIdWinsAgainstWildarded:
+	           case ExplicitNewMinorIdWinsAgainstWildarded:
+	           case NewMinorIdGreaterThanOld:
+	           case ExplicitNewPatchIdWinsAgainstWildarded:
+	           case NewPatchIdGreaterThanOld:
+	               break;
+	           case OldMajorIdGreaterThanNew:
+	           case NewMajorIdGreaterThanOld:
+	               break;
+	           case IncompatibleMajorIds:
+	           return (0);
+	       }
+	       version = v;
+	   }
+       else if (version == "")
+	   {
+	       version = "v0";
+	   }
+        return (1);
     }
   else if (!CmtSystem::cd (version))
@@ -1595,4 +1595,40 @@
 
           CmtSystem::scan_dir (name, versions);
+          if (n_version != "")
+          {
+              static CmtSystem::cmt_string_vector native_versions;           
+              for (int i = 0; i < versions.size (); i++)
+              {
+                  cmt_string path;
+                  if (CmtSystem::test_directory (versions[i]))
+                  {
+                      path  = versions[i];
+                      path += CmtSystem::file_separator ();
+                      path += "cmt";
+                  }
+                  else
+                  {
+                      path = "cmt";
+                  }
+                  path += CmtSystem::file_separator ();
+                  path += "native_version.cmt";        
+                                  
+                  if (CmtSystem::test_file (path))
+	              {
+	                  cmt_string nv;
+	                  nv.read (path);
+	                  int pos = nv.find ('\n');
+	                  if (pos != cmt_string::npos) nv.erase (pos);
+	                  pos = nv.find ('\r');
+	                  if (pos != cmt_string::npos) nv.erase (pos);
+	                  if (nv == n_version)
+	                  {
+	                       cmt_string& name_entry = native_versions.add ();
+	                       name_entry += versions[i];
+	                  }
+	              }                   
+              }
+              versions = native_versions;
+          }
           
           int i;
@@ -1711,5 +1747,6 @@
 {
 public:
-  UseProjectAction (Use* use) : m_use (use), m_found (false)
+  UseProjectAction (Use* use, cmt_string n_version="") : m_use (use), m_found (false), native_version(n_version)
+  
   {
   }
@@ -1727,5 +1764,5 @@
     m_use->alternate_paths.clear ();
 
-    if (m_use->reach_package (path))
+    if (m_use->reach_package (path, this->native_version))
       {
 	if (Cmt::get_debug ())
@@ -1761,8 +1798,9 @@
   Use* m_use;
   bool m_found;
+  cmt_string native_version;
 };
 
 //----------------------------------------------------------
-bool Use::move_to ()
+bool Use::move_to (const cmt_string& native_version)
 {
   if (m_located)
@@ -1778,5 +1816,5 @@
         }
 
-      reach_package (real_path);
+      reach_package (real_path, native_version);
 
       return (true);
@@ -1790,5 +1828,5 @@
   if (expanded_path == "")
     {
-      if (reach_package (""))
+      if (reach_package ("", native_version))
         {
           if (Cmt::get_debug ())
@@ -1821,5 +1859,5 @@
   if (CmtSystem::absolute_path (expanded_path))
     {
-      if (reach_package (expanded_path))
+      if (reach_package (expanded_path,  native_version))
         {
           if (Cmt::get_debug ())
@@ -1839,6 +1877,6 @@
                 {
                   cout << "move_to5> " << real_path << endl;
-                }
-              
+                }              
+
               return (true);
             }
@@ -1850,5 +1888,5 @@
   //
       
-  UseProjectAction pa (this);
+  UseProjectAction pa (this, native_version);
 
   Project::broadcast (pa);
@@ -2321,5 +2359,5 @@
 
   do_need_new = need_new (path, package_name, version, &old_use, context_use);
-  // cout <<"native_version: "<<native_version<<" "<<version<<endl;
+  //cout <<"native_version: "<<native_version<<" "<<version<<endl;
     
 
@@ -2412,5 +2450,5 @@
    *         we have created a new Use (which has to be validated)
    */
-  bool found = use->move_to ();
+  bool found = use->move_to (native_version);
 
   if (Cmt::get_debug ())
@@ -2480,5 +2518,5 @@
           if (use != 0) use->discard ();
           use = old_use;
-          found = use->move_to ();
+          found = use->move_to (native_version);
         }
       else
@@ -2512,5 +2550,5 @@
            *   current directory is moved to the selected one
            */
-          found = use->move_to ();
+          found = use->move_to (native_version);
         }
     }
Index: /CMT/v1r20b1/source/cmt_use.h
===================================================================
--- /CMT/v1r20b1/source/cmt_use.h	(revision 330)
+++ /CMT/v1r20b1/source/cmt_use.h	(revision 331)
@@ -88,5 +88,5 @@
   void author_action (const CmtSystem::cmt_string_vector& words);
   void manager_action (const CmtSystem::cmt_string_vector& words);
-  bool move_to ();
+  bool move_to (const cmt_string& native_version="");
   void discard ();
   void undiscard ();
@@ -155,4 +155,5 @@
   bool selected;                 /* used for recursive access       */
   bool m_located;
+  bool m_hidden;
   ScopeType initial_scope;
 
@@ -174,5 +175,5 @@
 private:
   void clear ();
-  int reach_package (const cmt_string& current_path);
+  int reach_package (const cmt_string& current_path, const cmt_string& n_version="");
   void select ();
   void unselect ();
