Salome HOME
0023538: EDF 16777 - ASTERSTUDY: Suppression of meshes when AsterStudy is activated
[modules/smesh.git] / src / SMESHGUI / SMESHGUI.cxx
index 1dca53b610cd8301da79b4cdb207d874c476244b..5c2c18a7cf93eeed5f9fc17e82082a5e0fdc9ca0 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -44,6 +44,7 @@
 #include "SMESHGUI_DuplicateNodesDlg.h"
 #include "SMESHGUI_ExtrusionAlongPathDlg.h"
 #include "SMESHGUI_ExtrusionDlg.h"
+#include "SMESHGUI_FieldSelectorWdg.h"
 #include "SMESHGUI_FileInfoDlg.h"
 #include "SMESHGUI_FileValidator.h"
 #include "SMESHGUI_FilterDlg.h"
@@ -63,6 +64,7 @@
 #include "SMESHGUI_MeshPatternDlg.h"
 #include "SMESHGUI_MultiEditDlg.h"
 #include "SMESHGUI_NodesDlg.h"
+#include "SMESHGUI_Operations.h"
 #include "SMESHGUI_Preferences_ScalarBarDlg.h"
 #include "SMESHGUI_PropertiesDlg.h"
 #include "SMESHGUI_RemoveElementsDlg.h"
 #include "SMESHGUI_SymmetryDlg.h"
 #include "SMESHGUI_TranslationDlg.h"
 #include "SMESHGUI_TransparencyDlg.h"
+#include "SMESHGUI_DisplayEntitiesDlg.h"
+#include "SMESHGUI_SplitBiQuad.h"
 
 #include "SMESHGUI_FilterUtils.h"
+#include "SMESHGUI_GEOMGenUtils.h"
 #include "SMESHGUI_GroupUtils.h"
 #include "SMESHGUI_HypothesesUtils.h"
 #include "SMESHGUI_MeshUtils.h"
 #include "SMESHGUI_Utils.h"
 #include "SMESHGUI_VTKUtils.h"
 
-#include <SMESH_version.h>
+#include "SMESH_version.h"
 
 #include "SMESH_ControlsDef.hxx"
-#include <SMESH_Actor.h>
-#include <SMESH_ActorUtils.h>
-#include <SMESH_Client.hxx>
-#include <SMESH_ScalarBarActor.h>
-#include <SMESH_TypeFilter.hxx>
+#include "SMESH_Actor.h"
+#include "SMESH_ActorUtils.h"
+#include "SMESH_Client.hxx"
+#include "SMESH_ScalarBarActor.h"
+#include "SMESH_TypeFilter.hxx"
 
 // SALOME GUI includes
 #include <SalomeApp_Application.h>
 
 #include <VTKViewer_Algorithm.h>
 
-#include <PyInterp_Interp.h>
-
 #include <SUIT_Desktop.h>
 #include <SUIT_FileDlg.h>
 #include <SUIT_MessageBox.h>
 #include <QtxFontEdit.h>
 
 #include <SALOME_ListIO.hxx>
-#include <SALOME_ListIteratorOfListIO.hxx>
 
 #ifndef DISABLE_PLOT2DVIEWER
 #include <SPlot2d_ViewModel.h>
 #include <QApplication>
 #include <QMenu>
 #include <QTextStream>
+#include <QListView>
+#include <QTreeView>
+#include <QCheckBox>
+#include <QLayout>
+#include <QDialogButtonBox>
 
 // BOOST includes
 #include <boost/shared_ptr.hpp>
 #include <SALOMEDSClient_StudyBuilder.hxx>
 #include <SALOMEDS_Study.hxx>
 #include <SALOMEDS_SObject.hxx>
+#include "utilities.h"
 
 // OCCT includes
 #include <Standard_ErrorHandler.hxx>
 #include <NCollection_DataMap.hxx>
+#include <NCollection_DoubleMap.hxx>
 
 #include <Basics_Utils.hxx>
 
-//To disable automatic genericobj management, the following line should be commented.
-//Otherwise, it should be uncommented.
-//Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx
-#define WITHGENERICOBJ
-
 // Below macro, when uncommented, switches on simplified (more performant) algorithm
 // of auto-color picking up
 #define SIMPLE_AUTOCOLOR
 
-//namespace{
+namespace
+{
   // Declarations
   //=============================================================
   void ImportMeshesFromFile(SMESH::SMESH_Gen_ptr theComponentMesh,
-                            int theCommandID);
+                            int                  theCommandID);
 
   void ExportMeshToFile(int theCommandID);
 
 
   void SetDisplayEntity(int theCommandID);
 
-  void Control( int theCommandID );
+  int  ActionToControl( int theID, bool theReversed = false );
 
+  void Control( int theCommandID );
 
   // Definitions
-  //=============================================================
+  //================================================================================
+  /*!
+   * \brief Reads meshes from file
+   */
+  //================================================================================
+
   void ImportMeshesFromFile( SMESH::SMESH_Gen_ptr theComponentMesh,
-                             int theCommandID )
+                             int                  theCommandID )
   {
     QStringList filter;
     std::string myExtension;
 
-    if ( theCommandID == 113 ) {
+    if ( theCommandID == SMESHOp::OpImportMED ||
+         theCommandID == SMESHOp::OpPopupImportMED ) {
       filter.append( QObject::tr( "MED_FILES_FILTER" ) + " (*.*med)" );
       filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" );
     }
-    else if ( theCommandID == 112 ) {
+    else if ( theCommandID == SMESHOp::OpImportUNV ||
+              theCommandID == SMESHOp::OpPopupImportUNV ) {
       filter.append( QObject::tr( "IDEAS_FILES_FILTER" ) + " (*.unv)" );
     }
-    else if ( theCommandID == 111 ) {
+    else if ( theCommandID == SMESHOp::OpImportDAT ||
+              theCommandID == SMESHOp::OpPopupImportDAT ) {
       filter.append( QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)" );
     }
-    else if ( theCommandID == 115 ) {
+    else if ( theCommandID == SMESHOp::OpImportSTL ||
+              theCommandID == SMESHOp::OpPopupImportSTL ) {
       filter.append( QObject::tr( "STL_FILES_FILTER" ) + " (*.stl)" );
     }
-    else if ( theCommandID == 116 ) {
+    else if ( theCommandID == SMESHOp::OpImportCGNS ||
+              theCommandID == SMESHOp::OpPopupImportCGNS ) {
       filter.append( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" );
     }
-    else if ( theCommandID == 117 ) {
+    else if ( theCommandID == SMESHOp::OpImportSAUV ||
+              theCommandID == SMESHOp::OpPopupImportSAUV ) {
       filter.append( QObject::tr( "SAUV files (*.sauv*)" ) );
       filter.append( QObject::tr( "All files (*)" ) );
     }
-    else if ( theCommandID == 118 ) {
+    else if ( theCommandID == SMESHOp::OpImportGMF ||
+              theCommandID == SMESHOp::OpPopupImportGMF ) {
       filter.append( QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)"  );
       filter.append( QObject::tr( "GMF_BINARY_FILES_FILTER") + " (*.meshb)" );
     }
     QStringList filenames;
     bool toCreateGroups = true;
 
-    // if ( theCommandID == 118 ) { // GMF
+    // if ( theCommandID == SMESHOp::OpImportGMF ) { // GMF
     //   SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg
     //     ( SMESHGUI::desktop(), true, QObject::tr("SMESH_REQUIRED_GROUPS"), true, true );
     //   fd->setWindowTitle( QObject::tr( "SMESH_IMPORT_MESH" ) );
                                                   filter,
                                                   QObject::tr( "SMESH_IMPORT_MESH" ) );
     }
-    if ( filenames.count() > 0 ) {
+    if ( filenames.count() > 0 )
+    {
       SUIT_OverrideCursor wc;
       _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
 
       QStringList errors;
       QStringList anEntryList;
       bool isEmpty = false;
-      for ( QStringList::ConstIterator it = filenames.begin(); it != filenames.end(); ++it ) {
+      for ( QStringList::ConstIterator it = filenames.begin(); it != filenames.end(); ++it )
+      {
         QString filename = *it;
         SMESH::mesh_array_var aMeshes = new SMESH::mesh_array;
         try {
           switch ( theCommandID ) {
-          case 111:
+          case SMESHOp::OpImportDAT:
+          case SMESHOp::OpPopupImportDAT:
             {
               // DAT format (currently unsupported)
               errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
                              arg( QObject::tr( "SMESH_ERR_NOT_SUPPORTED_FORMAT" ) ) );
               break;
             }
-          case 112:
+          case SMESHOp::OpImportUNV:
+          case SMESHOp::OpPopupImportUNV:
             {
               // UNV format
               aMeshes->length( 1 );
                                arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) );
               break;
             }
-          case 113:
+          case SMESHOp::OpImportMED:
+          case SMESHOp::OpPopupImportMED:
             {
               // MED format
               SMESH::DriverMED_ReadStatus res;
               }
               break;
             }
-          case 115:
+          case SMESHOp::OpImportSTL:
+          case SMESHOp::OpPopupImportSTL:
             {
               // STL format
               aMeshes->length( 1 );
               }
               break;
             }
-          case 116:
+          case SMESHOp::OpImportCGNS:
+          case SMESHOp::OpPopupImportCGNS:
             {
               // CGNS format
               SMESH::DriverMED_ReadStatus res;
               }
               break;
             }
-          case 117:
+          case SMESHOp::OpImportSAUV:
+          case SMESHOp::OpPopupImportSAUV:
             {
               // SAUV format
               SMESH::DriverMED_ReadStatus res;
               }
               break;
             }
-          case 118:
+          case SMESHOp::OpImportGMF:
+          case SMESHOp::OpPopupImportGMF:
             {
               // GMF format
               SMESH::ComputeError_var res;
                          arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) );
         }
 
-        for ( int i = 0, iEnd = aMeshes->length(); i < iEnd; i++ ) {
+        for ( int i = 0, iEnd = aMeshes->length(); i < iEnd; i++ )
+        {
           _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshes[i] );
           if ( aMeshSO ) {
             _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
             _PTR(AttributePixMap) aPixmap = aBuilder->FindOrCreateAttribute( aMeshSO, "AttributePixMap" );
             aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_IMPORTED" );
-            if ( theCommandID == 112 ) // mesh names aren't taken from the file for UNV import
+            if ( theCommandID == SMESHOp::OpImportUNV ) // mesh names aren't taken from the file for UNV import
               SMESH::SetName( aMeshSO, QFileInfo(filename).fileName() );
 
             anEntryList.append( aMeshSO->GetID().c_str() );
     if( aSel )
       aSel->selectedObjects( selected );
 
-    const bool isMED = ( theCommandID == 122 || theCommandID == 125 );
-    const bool isDAT = ( theCommandID == 121 || theCommandID == 124 );
-    const bool isUNV = ( theCommandID == 123 || theCommandID == 126 );
-    const bool isSTL = ( theCommandID == 140 || theCommandID == 141 );
-    const bool isCGNS= ( theCommandID == 142 || theCommandID == 143 );
-    const bool isSAUV= ( theCommandID == 144 || theCommandID == 145 );
-    const bool isGMF = ( theCommandID == 146 || theCommandID == 147 );
-
-    // actually, the following condition can't be met (added for insurance)
-    if( selected.Extent() == 0 ||
-        ( selected.Extent() > 1 && !isMED && !isSTL ))
+    const bool isDAT = ( theCommandID == SMESHOp::OpExportDAT ||
+                         theCommandID == SMESHOp::OpPopupExportDAT );
+    const bool isMED = ( theCommandID == SMESHOp::OpExportMED ||
+                         theCommandID == SMESHOp::OpPopupExportMED );
+    const bool isUNV = ( theCommandID == SMESHOp::OpExportUNV ||
+                         theCommandID == SMESHOp::OpPopupExportUNV );
+    const bool isSTL = ( theCommandID == SMESHOp::OpExportSTL ||
+                         theCommandID == SMESHOp::OpPopupExportSTL );
+    const bool isCGNS= ( theCommandID == SMESHOp::OpExportCGNS ||
+                         theCommandID == SMESHOp::OpPopupExportCGNS );
+    const bool isSAUV= ( theCommandID == SMESHOp::OpExportSAUV ||
+                         theCommandID == SMESHOp::OpPopupExportSAUV );
+    const bool isGMF = ( theCommandID == SMESHOp::OpExportGMF ||
+                         theCommandID == SMESHOp::OpPopupExportGMF );
+
+    const bool multiMeshSupported = ( isMED || isCGNS ); // file can hold several meshes
+    if ( selected.Extent() == 0 || ( selected.Extent() > 1 && !multiMeshSupported ))
       return;
-
+    SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+    bool aCheckWarn = true;
+    if ( resMgr )
+      aCheckWarn = resMgr->booleanValue( "SMESH", "show_warning", false );
     // get mesh object from selection and check duplication of their names
     bool hasDuplicatedMeshNames = false;
-    QList< QPair< SMESH::SMESH_IDSource_var, QString > > aMeshList;
+    QList< QPair< SMESH::SMESH_IDSource_var, QString > >           aMeshList;
     QList< QPair< SMESH::SMESH_IDSource_var, QString > >::iterator aMeshIter;
     SALOME_ListIteratorOfListIO It( selected );
     for( ; It.More(); It.Next() )
     {
       Handle(SALOME_InteractiveObject) anIObject = It.Value();
-      SMESH::SMESH_IDSource_var aMeshItem = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(anIObject);
+      SMESH::SMESH_IDSource_var aMeshItem =
+        SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(anIObject);
       if ( aMeshItem->_is_nil() ) {
         SUIT_MessageBox::warning( SMESHGUI::desktop(),
                                   QObject::tr( "SMESH_WRN_WARNING" ),
                                   QObject::tr( "SMESH_BAD_MESH_SELECTION" ));
         return;
       }
+      SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( aMeshItem );
+      if ( aCheckWarn && !aGroup->_is_nil() )
+      {
+        QMessageBox msgBox(SUIT_MessageBox::Warning,
+                           QObject::tr("SMESH_WRN_WARNING"),
+                           QObject::tr("SMESH_EXPORT_ONLY_GPOUP"),
+                           QMessageBox::StandardButton::NoButton,
+                           SMESHGUI::desktop());
+        QCheckBox dontShowCheckBox(QObject::tr("SMESH_WRN_SHOW_DLG_CHECKBOX"));
+        msgBox.addButton(QMessageBox::Ok);
+        msgBox.addButton(QMessageBox::Cancel);
+        msgBox.setDefaultButton(QMessageBox::Cancel);
+        QGridLayout* lt = qobject_cast<QGridLayout*>(msgBox.layout());
+        QDialogButtonBox* btnbox = msgBox.findChild<QDialogButtonBox*>();
+        lt->addWidget(&dontShowCheckBox, lt->rowCount(), lt->columnCount()-1, lt->rowCount(), lt->columnCount());
+        lt->addWidget(btnbox, lt->rowCount(), 0, lt->rowCount(), lt->columnCount());
+        if(msgBox.exec() == QMessageBox::Ok)
+        {
+          if(dontShowCheckBox.checkState() == Qt::Checked)
+          {
+            if ( resMgr )
+              resMgr->setValue( "SMESH", "show_warning", false);
+          }
+          aCheckWarn = false;
+        }
+        else
+          return;
+      }
 
       QString aMeshName = anIObject->getName();
 
     {
       format = "CGNS";
       notSupportedElemTypes.push_back( SMESH::Entity_Ball );
-      notSupportedElemTypes.push_back( SMESH::Entity_BiQuad_Triangle );
     }
     else if ( isSAUV )
     {
       notSupportedElemTypes.push_back( SMESH::Entity_TriQuad_Hexa );
       notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism );
       notSupportedElemTypes.push_back( SMESH::Entity_Polygon );
+      notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polygon );
       notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra );
     }
     else if ( isGMF )
     if ( !presentNotSupported.empty() )
     {
       QString typeNames;
-      const char* typeMsg[SMESH::Entity_Last] = {
+      const char* typeMsg[] = {
         "SMESH_NODES", "SMESH_ELEMS0D","SMESH_EDGES","SMESH_QUADRATIC_EDGES",
         "SMESH_TRIANGLES", "SMESH_QUADRATIC_TRIANGLES", "SMESH_BIQUADRATIC_TRIANGLES",
         "SMESH_QUADRANGLES","SMESH_QUADRATIC_QUADRANGLES", "SMESH_BIQUADRATIC_QUADRANGLES",
         "SMESH_TRIQUADRATIC_HEXAHEDRONS","SMESH_PENTAHEDRA","SMESH_QUADRATIC_PENTAHEDRONS",
         "SMESH_OCTAHEDRA","SMESH_POLYEDRONS","SMESH_QUADRATIC_POLYEDRONS","SMESH_BALLS"
       };
+      // is typeMsg complete? (compilation failure mains that enum SMDSAbs_EntityType changed)
+      const int nbTypes = sizeof( typeMsg ) / sizeof( const char* );
+      int _assert[( nbTypes == SMESH::Entity_Last ) ? 2 : -1 ]; _assert[0]=_assert[1];
+
       QString andStr = " " + QObject::tr("SMESH_AND") + " ", comma(", ");
       for ( size_t iType = 0; iType < presentNotSupported.size(); ++iType ) {
         typeNames += QObject::tr( typeMsg[ presentNotSupported[ iType ]]);
     // Get parameters of export operation
 
     QString            aFilename;
-    SMESH::MED_VERSION aFormat;
+    SMESH::MED_VERSION aFormat = SMESH::MED_V2_2;
     // Init the parameters with the default values
     bool aIsASCII_STL   = true;
     bool toCreateGroups = false;
-    SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
     if ( resMgr )
       toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false );
-    bool toOverwrite = true;
+    bool toOverwrite  = true;
     bool toFindOutDim = true;
 
     QString aFilter, aTitle = QObject::tr("SMESH_EXPORT_MESH");
     if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
       anInitialPath = QDir::currentPath();
 
+    QList< QPair< GEOM::ListOfFields_var, QString > > aFieldList;
+
     // Get a file name to write in and additional otions
     if ( isUNV || isDAT || isGMF ) // Export w/o options
     {
       QStringList checkBoxes;
       checkBoxes << QObject::tr("SMESH_AUTO_GROUPS") << QObject::tr("SMESH_AUTO_DIM");
 
+      SMESHGUI_FieldSelectorWdg* fieldSelWdg = new SMESHGUI_FieldSelectorWdg();
+      QList< QWidget* > wdgList;
+      if ( fieldSelWdg->GetAllFeilds( aMeshList, aFieldList ))
+        wdgList.append( fieldSelWdg );
+
       SalomeApp_CheckFileDlg* fd =
-        new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true );
+        new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true, wdgList );
       fd->setWindowTitle( aTitle );
       fd->setNameFilters( filters );
       fd->selectNameFilter( aDefaultFilter );
       if ( !anInitialPath.isEmpty() )
         fd->setDirectory( anInitialPath );
       fd->selectFile(aMeshName);
+      
+      
+      QListView *lview = fd->findChild<QListView*>("listView");
+      if( lview ) {
+        lview->setMinimumHeight(200);
+      }
+      QTreeView *tview = fd->findChild<QTreeView*>("treeView");
+      if( tview ) {
+        tview->setMinimumHeight(200);
+      }
 
       SMESHGUI_FileValidator* fv = new SMESHGUI_FileValidator( fd );
       fd->setValidator( fv );
       }
       toCreateGroups = fd->IsChecked(0);
       toFindOutDim   = fd->IsChecked(1);
+      fieldSelWdg->GetSelectedFeilds();
+      if ( !fieldSelWdg->parent() )
+        delete fieldSelWdg;
       delete fd;
     }
     else
           {
             SMESH::SMESH_IDSource_var aMeshOrGroup = (*aMeshIter).first;
             SMESH::SMESH_Mesh_var        aMeshItem = aMeshOrGroup->GetMesh();
-            if ( aMeshOrGroup->_is_equivalent( aMeshItem ))
+            const GEOM::ListOfFields&       fields = aFieldList[ aMeshIndex ].first.in();
+            const QString&            geoAssFields = aFieldList[ aMeshIndex ].second;
+            const bool                   hasFields = ( fields.length() || !geoAssFields.isEmpty() );
+            if ( !hasFields && aMeshOrGroup->_is_equivalent( aMeshItem ))
               aMeshItem->ExportToMEDX( aFilename.toUtf8().data(), toCreateGroups,
                                        aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim );
             else
               aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toUtf8().data(), toCreateGroups,
-                                          aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim );
+                                          aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim,
+                                          fields, geoAssFields.toLatin1().data() );
           }
         }
         else if ( isSAUV )
   }
 
   inline void InverseEntityMode(unsigned int& theOutputMode,
-                                unsigned int theMode)
+                                unsigned int  theMode)
   {
     bool anIsNotPresent = ~theOutputMode & theMode;
     if(anIsNotPresent)
       theOutputMode &= ~theMode;
   }
 
-  void SetDisplayEntity(int theCommandID){
+  void SetDisplayEntity(int theCommandID)
+  {
     LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
     SALOME_ListIO selected;
-    if( aSel )
+    if ( aSel )
       aSel->selectedObjects( selected );
 
-    if(selected.Extent() >= 1){
+    if ( selected.Extent() >= 1 ) {
+      SUIT_OverrideCursor wc;
       SALOME_ListIteratorOfListIO It( selected );
       for( ; It.More(); It.Next()){
         Handle(SALOME_InteractiveObject) IObject = It.Value();
           if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
             unsigned int aMode = anActor->GetEntityMode();
             switch(theCommandID){
-            case 222:
-              InverseEntityMode(aMode,SMESH_Actor::eBallElem);
-              break;
-            case 216:
-              InverseEntityMode(aMode,SMESH_Actor::e0DElements);
-              break;
-            case 217:
-              InverseEntityMode(aMode,SMESH_Actor::eEdges);
-              break;
-            case 218:
-              InverseEntityMode(aMode,SMESH_Actor::eFaces);
-              break;
-            case 219:
-              InverseEntityMode(aMode,SMESH_Actor::eVolumes);
-              break;
-            case 220:
-              aMode = SMESH_Actor::eAllEntity;
-              break;
+            case SMESHOp::OpDE0DElements: InverseEntityMode(aMode,SMESH_Actor::e0DElements); break;
+            case SMESHOp::OpDEEdges:      InverseEntityMode(aMode,SMESH_Actor::eEdges); break;
+            case SMESHOp::OpDEFaces:      InverseEntityMode(aMode,SMESH_Actor::eFaces); break;
+            case SMESHOp::OpDEVolumes:    InverseEntityMode(aMode,SMESH_Actor::eVolumes); break;
+            case SMESHOp::OpDEBalls:      InverseEntityMode(aMode,SMESH_Actor::eBallElem); break;
+            case SMESHOp::OpDEAllEntity:  aMode = SMESH_Actor::eAllEntity; break;
             }
             if(aMode)
               anActor->SetEntityMode(aMode);
 
   void AutoColor()
   {
-    SALOME_ListIO selected;
-    SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
-    if( !app )
+    SalomeApp_Application* app =
+      dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+    if ( !app )
       return;
 
     LightApp_SelectionMgr* aSel = app->selectionMgr();
     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
-    if( !aSel || !appStudy )
+    if ( !aSel || !appStudy )
       return;
 
+    SALOME_ListIO selected;
     aSel->selectedObjects( selected );
-    if( selected.IsEmpty() )
+    if ( selected.IsEmpty() )
       return;
 
     Handle(SALOME_InteractiveObject) anIObject = selected.First();
 
-    _PTR(Study) aStudy = appStudy->studyDS();
-    _PTR(SObject) aMainSObject( aStudy->FindObjectID( anIObject->getEntry() ) );
+    _PTR(Study)         aStudy = appStudy->studyDS();
+    _PTR(SObject) aMainSObject = aStudy->FindObjectID( anIObject->getEntry() );
     SMESH::SMESH_Mesh_var aMainObject = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
-    if( aMainObject->_is_nil() )
+    if ( aMainObject->_is_nil() )
       return;
 
     SUIT_OverrideCursor wc;
     QList<SALOMEDS::Color> aReservedColors;
 
     SMESH::ListOfGroups aListOfGroups = *aMainObject->GetGroups();
-    for( int i = 0, n = aListOfGroups.length(); i < n; i++ )
+    for ( int i = 0, n = aListOfGroups.length(); i < n; i++ )
     {
       SMESH::SMESH_GroupBase_var aGroupObject = aListOfGroups[i];
-      //SALOMEDS::Color aColor = aGroupObject->GetColor();
 
 #ifdef SIMPLE_AUTOCOLOR   // simplified algorithm for auto-colors
       SALOMEDS::Color aColor = SMESHGUI::getPredefinedUniqueColor();
       aGroupObject->SetColor( aColor );
 
       _PTR(SObject) aGroupSObject = SMESH::FindSObject(aGroupObject);
-      if (aGroupSObject) {
+      if ( aGroupSObject ) {
         QColor c;
         int delta;
-        if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) {
+        if ( SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) {
           switch ( aGroupObject->GetType ()) {
           case SMESH::NODE:
             anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break;
     SMESH::RepaintCurrentView();
   }
 
-  void OverallMeshQuality() {
+  void OverallMeshQuality()
+  {
     SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
     LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
     SALOME_ListIO selected;
       type = QObject::tr( "EQUAL_FACE" );
     else if ( dynamic_cast< SMESH::Controls::CoincidentElements3D* >( f.get() ) )
       type = QObject::tr( "EQUAL_VOLUME" );
+    else if ( dynamic_cast< SMESH::Controls::NodeConnectivityNumber* >( f.get() ) )
+      type = QObject::tr( "NODE_CONNECTIVITY_NB" );
     return type;
   }
 
       Handle(SALOME_InteractiveObject) anIO = selected.First();
       if ( anIO->hasEntry() ) {
         SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
-        if ( anActor && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) {
+        if ( anActor &&
+             anActor->GetScalarBarActor() &&
+             anActor->GetControlMode() != SMESH_Actor::eNone )
+        {
           SMESH_ScalarBarActor* aScalarBarActor = anActor->GetScalarBarActor();
           SMESH::Controls::FunctorPtr aFunctor = anActor->GetFunctor();
           if ( aScalarBarActor && aFunctor ) {
-            SMESH::Controls::NumericalFunctor* aNumFun = dynamic_cast<SMESH::Controls::NumericalFunctor*>( aFunctor.get() );
+            SMESH::Controls::NumericalFunctor* aNumFun =
+              dynamic_cast<SMESH::Controls::NumericalFunctor*>( aFunctor.get() );
             if ( aNumFun ) {
               std::vector<int> elements;
               SMESH::SMESH_Mesh_var mesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIO);
               bool isLogarithmic = lookupTable->GetScale() == VTK_SCALE_LOG10;
               std::vector<int>    nbEvents;
               std::vector<double> funValues;
-              aNumFun->GetHistogram( nbIntervals, nbEvents, funValues, elements, minmax, isLogarithmic );
+              aNumFun->GetHistogram( nbIntervals, nbEvents, funValues,
+                                     elements, minmax, isLogarithmic );
               QString anInitialPath = "";
               if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
                 anInitialPath = QDir::currentPath();
               QStringList filter;
               filter.append( QObject::tr( "TEXT_FILES_FILTER" ) + " (*.txt)" );
               filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" );
-              QString aFilename = anInitialPath + "/" + aMeshName + "_" + 
+              QString aFilename = anInitialPath + "/" + aMeshName + "_" +
                 functorToString( aFunctor ).toLower().simplified().replace( QRegExp( " |-" ), "_" ) + ".txt";
               aFilename = SUIT_FileDlg::getFileName( SMESHGUI::desktop(),
                                                      aFilename,
                   out << "# Control: " << functorToString( aFunctor ) << endl;
                   out << "#" << endl;
                   out.setFieldWidth( 10 );
-                  for ( int i = 0; i < qMin( nbEvents.size(), funValues.size()-1 ); i++ )
+                  for ( int i = 0; i < (int)qMin( nbEvents.size(), funValues.size()-1 ); i++ )
                     out << funValues[i] << "\t" << funValues[i+1] << "\t" << nbEvents[i] << endl;
                   f.close();
                 }
     }
   }
 
-  void ShowDistribution() {
+  void ShowElement( int theCommandID )
+  {
     LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
     SALOME_ListIO selected;
     if ( aSel )
       aSel->selectedObjects( selected );
-    
+
     if ( selected.Extent() == 1 ) {
       Handle(SALOME_InteractiveObject) anIO = selected.First();
       if ( anIO->hasEntry() ) {
         SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
-        if ( anActor && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) {
+        if ( anActor &&
+             anActor->GetScalarBarActor() &&
+             anActor->GetControlMode() != SMESH_Actor::eNone )
+        {
           SMESH_ScalarBarActor *aScalarBarActor = anActor->GetScalarBarActor();
-          aScalarBarActor->SetDistributionVisibility(!aScalarBarActor->GetDistributionVisibility());
+          if ( theCommandID == SMESHOp::OpShowDistribution ) {
+            aScalarBarActor->SetDistributionVisibility(!aScalarBarActor->GetDistributionVisibility());
+          }
+          else if ( theCommandID == SMESHOp::OpShowScalarBar ) {
+            aScalarBarActor->SetVisibility( !aScalarBarActor->GetVisibility());
+          }
         }
       }
     }
   }
 
 #ifndef DISABLE_PLOT2DVIEWER
- void PlotDistribution() {
-   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
-   if( !app )
-     return;
-
-   LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
-   SALOME_ListIO selected;
-   if ( aSel )
-     aSel->selectedObjects( selected );
-    
-   if ( selected.Extent() == 1 ) {
-     Handle(SALOME_InteractiveObject) anIO = selected.First();
-     if ( anIO->hasEntry() ) {
-       //Find Actor by entry before getting Plot2d viewer,
-       //because after call getViewManager( Plot2d_Viewer::Type(), true ) active window is Plot2d Viewer
-       SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
-
-       SUIT_ViewManager* aViewManager = app->getViewManager( Plot2d_Viewer::Type(), true ); // create if necessary
-
-       if( !aViewManager )
-         return;
-       
-       SPlot2d_Viewer* aView = dynamic_cast<SPlot2d_Viewer*>(aViewManager->getViewModel());
-       if ( !aView )
-         return;
-
-       Plot2d_ViewFrame* aPlot = aView->getActiveViewFrame();
-       if ( !aPlot )
-         return;
-
-       if ( anActor && anActor->GetControlMode() != SMESH_Actor::eNone ) {
-         SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
-         QString functorName = functorToString( anActor->GetFunctor());
-         QString aHistogramName("%1 : %2");
-         aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName);
-         aHistogram->setName(aHistogramName);
-         aHistogram->setHorTitle(functorName);
-         aHistogram->setVerTitle(QObject::tr("DISTRIBUTION_NB_ENT"));
-         aPlot->displayObject(aHistogram, true);
-       }
-     }
-   }
- }
+  void PlotDistribution()
+  {
+    SalomeApp_Application* app =
+      dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+    if( !app )
+      return;
+
+    LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
+    SALOME_ListIO selected;
+    if ( aSel )
+      aSel->selectedObjects( selected );
+
+    if ( selected.Extent() == 1 ) {
+      Handle(SALOME_InteractiveObject) anIO = selected.First();
+      if ( anIO->hasEntry() ) {
+        //Find Actor by entry before getting Plot2d viewer,
+        //because after call getViewManager( Plot2d_Viewer::Type(), true ) active window is Plot2d Viewer
+        SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
+
+        SUIT_ViewManager* aViewManager =
+          app->getViewManager( Plot2d_Viewer::Type(), true ); // create if necessary
+        if( !aViewManager )
+          return;
+
+        SPlot2d_Viewer* aView = dynamic_cast<SPlot2d_Viewer*>(aViewManager->getViewModel());
+        if ( !aView )
+          return;
+
+        Plot2d_ViewFrame* aPlot = aView->getActiveViewFrame();
+        if ( !aPlot )
+          return;
+
+        if ( anActor && anActor->GetControlMode() != SMESH_Actor::eNone )
+        {
+          SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
+          QString functorName = functorToString( anActor->GetFunctor());
+          QString aHistogramName("%1 : %2");
+          aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName);
+          aHistogram->setName(aHistogramName);
+          aHistogram->setHorTitle(functorName);
+          aHistogram->setVerTitle(QObject::tr("DISTRIBUTION_NB_ENT"));
+          aPlot->displayObject(aHistogram, true);
+        }
+      }
+    }
+  }
 #endif //DISABLE_PLOT2DVIEWER
 
-  void DisableAutoColor(){
+  void DisableAutoColor()
+  {
     LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
     SALOME_ListIO selected;
-    if( aSel )
+    if ( aSel )
       aSel->selectedObjects( selected );
 
-    if(selected.Extent()){
+    if ( selected.Extent() ) {
       Handle(SALOME_InteractiveObject) anIObject = selected.First();
       SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
       if ( !aMesh->_is_nil() ) {
     }
   }
 
-  void sortChildren(){
+  void sortChildren()
+  {
     LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
     SALOME_ListIO selected;
-    if( aSel ) {
+    if ( aSel ) {
       aSel->selectedObjects( selected );
-
-      if(selected.Extent()){
+      if ( selected.Extent() )
+      {
         Handle(SALOME_InteractiveObject) anIObject = selected.First();
         _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
         _PTR(SObject) aSObj = aStudy->FindObjectID(anIObject->getEntry());
   void SetDisplayMode(int theCommandID, SMESHGUI_StudyId2MarkerMap& theMarkerMap)
   {
     SALOME_ListIO selected;
-    SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
-    if( !app )
+    SalomeApp_Application* app =
+      dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+    if ( !app )
       return;
 
     LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
-    SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
-    if( !aSel || !appStudy )
+    SalomeApp_Study*   appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
+    if ( !aSel || !appStudy )
       return;
 
-    if( theCommandID == 1134 ) { // Clipping dialog can be activated without selection
-      if( SMESHGUI* aModule = SMESHGUI::GetSMESHGUI() ) {
+    if ( theCommandID == SMESHOp::OpClipping ) { // Clipping dialog can be activated without selection
+      if ( SMESHGUI* aModule = SMESHGUI::GetSMESHGUI() ) {
         aModule->EmitSignalDeactivateDialog();
         if( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( aModule ) )
           (new SMESHGUI_ClippingDlg( aModule, aViewWindow ))->show();
 
     aSel->selectedObjects( selected );
 
-    if(selected.Extent() >= 1){
-      switch(theCommandID){
-      case 1133:{
+    if ( selected.Extent() >= 1 )
+    {
+      switch ( theCommandID ) {
+      case SMESHOp::OpTransparency:
+      {
         SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
         (new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI() ))->show();
         return;
       }
-      case 1132: {
+      case SMESHOp::OpProperties:
+      {
         double color[3];
         QColor faceColor, edgeColor, nodeColor, elem0dColor, ballColor;
         QColor orientationColor, outlineColor, volumeColor;
         int deltaF = 0, deltaV = 0;
         int elem0dSize   = 1;
-        int ballSize     = 1;
+        //int ballSize     = 1;
+        double ballScale = 1.0;
         int edgeWidth    = 1;
         int outlineWidth = 1;
         double shrinkCoef = 0.0;
             // balls: color, size
             anActor->GetBallColor( color[0], color[1], color[2] );
             ballColor.setRgbF( color[0], color[1], color[2] );
-            ballSize = qMax( (int)anActor->GetBallSize(), 1 ); // minimum allowed size is 1
+            //ballSize = qMax( (int)anActor->GetBallSize(), 1 ); // minimum allowed size is 1
+            ballScale = qMax( (double)anActor->GetBallScale(), 1e-2 ); // minimum allowed scale is 1e-2
             // outlines: color
             anActor->GetOutlineColor( color[0], color[1], color[2] );
             outlineColor.setRgbF( color[0], color[1], color[2] );
         dlg.setElem0dSize( elem0dSize );
         // balls: color, size
         dlg.setBallColor( ballColor );
-        dlg.setBallSize( ballSize );
+        //dlg.setBallSize( ballSize );
+        dlg.setBallScale( ballScale );
         // orientation: color, scale, 3d flag
         dlg.setOrientationColor( orientationColor );
         dlg.setOrientationSize( int( orientationScale * 100. ) );
           elem0dColor      = dlg.elem0dColor();
           elem0dSize       = dlg.elem0dSize();
           ballColor        = dlg.ballColor();
-          ballSize         = dlg.ballSize();
+         // ballSize         = dlg.ballSize();
+          ballScale        = dlg.ballScale();
           orientationColor = dlg.orientationColor();
           orientationScale = dlg.orientationSize() / 100.;
           orientation3d    = dlg.orientation3d();
             anActor->Set0DSize( elem0dSize );
             // balls: color, size
             anActor->SetBallColor( ballColor.redF(), ballColor.greenF(), ballColor.blueF() );
-            anActor->SetBallSize( ballSize );
+            // anActor->SetBallSize( ballSize );
+            anActor->SetBallScale( ballScale );
             // orientation: color, scale, 3d flag
             anActor->SetFacesOrientationColor( orientationColor.redF(), orientationColor.greenF(), orientationColor.blueF() );
             anActor->SetFacesOrientationScale( orientationScale );
           SMESH::RepaintCurrentView();
         } // if ( dlg.exec() )
         return;
-      } // case 1132:
+      } // case SMESHOp::OpProperties:
       } // switch(theCommandID)
+      SUIT_OverrideCursor wc;
       SALOME_ListIteratorOfListIO It( selected );
       for( ; It.More(); It.Next()){
         Handle(SALOME_InteractiveObject) IObject = It.Value();
         if(IObject->hasEntry()){
           if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
             switch(theCommandID){
-            case 211:
+            case SMESHOp::OpDMWireframe:
               anActor->SetRepresentation(SMESH_Actor::eEdge);
               break;
-            case 212:
+            case SMESHOp::OpDMShading:
               anActor->SetRepresentation(SMESH_Actor::eSurface);
               break;
-            case 213:
+            case SMESHOp::OpDMShrink:
               if(anActor->IsShrunk())
                 anActor->UnShrink();
               else
                 anActor->SetShrink();
               break;
-            case 215:
+            case SMESHOp::OpDMNodes:
               anActor->SetRepresentation(SMESH_Actor::ePoint);
               break;
-            case 231:
+            case SMESHOp::OpRepresentationLines:
               if(anActor->GetQuadratic2DRepresentation() != SMESH_Actor::eLines)
                 anActor->SetQuadratic2DRepresentation(SMESH_Actor::eLines);
               break;
-            case 232:
+            case SMESHOp::OpRepresentationArcs:
               if(anActor->GetQuadratic2DRepresentation() != SMESH_Actor::eArcs)
                 anActor->SetQuadratic2DRepresentation(SMESH_Actor::eArcs);
               break;
     }
   }
 
+  int ActionToControl( int theID, bool theReversed )
+  {
+    NCollection_DoubleMap<int,int> ActionControl;
+    ActionControl.Bind( 0,                                SMESH_Actor::eNone );
+    ActionControl.Bind( SMESHOp::OpFreeNode,              SMESH_Actor::eFreeNodes );
+    ActionControl.Bind( SMESHOp::OpEqualNode,             SMESH_Actor::eCoincidentNodes );
+    ActionControl.Bind( SMESHOp::OpNodeConnectivityNb,    SMESH_Actor::eNodeConnectivityNb );
+    ActionControl.Bind( SMESHOp::OpFreeEdge,              SMESH_Actor::eFreeEdges );
+    ActionControl.Bind( SMESHOp::OpFreeBorder,            SMESH_Actor::eFreeBorders );
+    ActionControl.Bind( SMESHOp::OpLength,                SMESH_Actor::eLength );
+    ActionControl.Bind( SMESHOp::OpConnection,            SMESH_Actor::eMultiConnection );
+    ActionControl.Bind( SMESHOp::OpEqualEdge,             SMESH_Actor::eCoincidentElems1D );
+    ActionControl.Bind( SMESHOp::OpFreeFace,              SMESH_Actor::eFreeFaces );
+    ActionControl.Bind( SMESHOp::OpBareBorderFace,        SMESH_Actor::eBareBorderFace );
+    ActionControl.Bind( SMESHOp::OpOverConstrainedFace,   SMESH_Actor::eOverConstrainedFace );
+    ActionControl.Bind( SMESHOp::OpLength2D,              SMESH_Actor::eLength2D );
+    ActionControl.Bind( SMESHOp::OpConnection2D,          SMESH_Actor::eMultiConnection2D );
+    ActionControl.Bind( SMESHOp::OpArea,                  SMESH_Actor::eArea );
+    ActionControl.Bind( SMESHOp::OpTaper,                 SMESH_Actor::eTaper );
+    ActionControl.Bind( SMESHOp::OpAspectRatio,           SMESH_Actor::eAspectRatio );
+    ActionControl.Bind( SMESHOp::OpMinimumAngle,          SMESH_Actor::eMinimumAngle );
+    ActionControl.Bind( SMESHOp::OpWarpingAngle,          SMESH_Actor::eWarping );
+    ActionControl.Bind( SMESHOp::OpSkew,                  SMESH_Actor::eSkew );
+    ActionControl.Bind( SMESHOp::OpMaxElementLength2D,    SMESH_Actor::eMaxElementLength2D );
+    ActionControl.Bind( SMESHOp::OpEqualFace,             SMESH_Actor::eCoincidentElems2D );
+    ActionControl.Bind( SMESHOp::OpAspectRatio3D,         SMESH_Actor::eAspectRatio3D );
+    ActionControl.Bind( SMESHOp::OpVolume,                SMESH_Actor::eVolume3D );
+    ActionControl.Bind( SMESHOp::OpMaxElementLength3D,    SMESH_Actor::eMaxElementLength3D );
+    ActionControl.Bind( SMESHOp::OpBareBorderVolume,      SMESH_Actor::eBareBorderVolume );
+    ActionControl.Bind( SMESHOp::OpOverConstrainedVolume, SMESH_Actor::eOverConstrainedVolume );
+    ActionControl.Bind( SMESHOp::OpEqualVolume,           SMESH_Actor::eCoincidentElems3D );
+
+    return theReversed ? ActionControl.Find2( theID ) : ActionControl.Find1( theID );
+  }
+
   void Control( int theCommandID )
   {
-    LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
+    SMESH_Actor::eControl aControl = SMESH_Actor::eControl( ActionToControl( theCommandID ));
+    _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
+
     SALOME_ListIO selected;
-    if( aSel )
+    if ( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
       aSel->selectedObjects( selected );
 
-    if( !selected.IsEmpty() ){
-      Handle(SALOME_InteractiveObject) anIO = selected.First();
-      if(!anIO.IsNull()){
-        SMESH_Actor::eControl aControl = SMESH_Actor::eNone;
-        if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIO->getEntry())) {
-          switch ( theCommandID ){
-          case 6001:
-            aControl = SMESH_Actor::eLength;
-            break;
-          case 6018:
-            aControl = SMESH_Actor::eLength2D;
-            break;
-          case 6002:
-            aControl = SMESH_Actor::eFreeEdges;
-            break;
-          case 6003:
-            aControl = SMESH_Actor::eFreeBorders;
-            break;
-          case 6004:
-            aControl = SMESH_Actor::eMultiConnection;
-            break;
-          case 6005:
-            aControl = SMESH_Actor::eFreeNodes;
-            break;
-          case 6019:
-            aControl = SMESH_Actor::eMultiConnection2D;
-            break;
-          case 6011:
-            aControl = SMESH_Actor::eArea;
-            break;
-          case 6012:
-            aControl = SMESH_Actor::eTaper;
-            break;
-          case 6013:
-            aControl = SMESH_Actor::eAspectRatio;
-            break;
-          case 6017:
-            aControl = SMESH_Actor::eAspectRatio3D;
-            break;
-          case 6014:
-            aControl = SMESH_Actor::eMinimumAngle;
-            break;
-          case 6015:
-            aControl = SMESH_Actor::eWarping;
-            break;
-          case 6016:
-            aControl = SMESH_Actor::eSkew;
-            break;
-          case 6009:
-            aControl = SMESH_Actor::eVolume3D;
-            break;
-          case 6021:
-            aControl = SMESH_Actor::eFreeFaces;
-            break;
-          case 6022:
-            aControl = SMESH_Actor::eMaxElementLength2D;
-            break;
-          case 6023:
-            aControl = SMESH_Actor::eMaxElementLength3D;
-            break;
-          case 6024:
-            aControl = SMESH_Actor::eBareBorderVolume;
-            break;
-          case 6025:
-            aControl = SMESH_Actor::eBareBorderFace;
-            break;
-          case 6026:
-            aControl = SMESH_Actor::eOverConstrainedVolume;
-            break;
-          case 6027:
-            aControl = SMESH_Actor::eOverConstrainedFace;
-            break;
-          case 6028:
-            aControl = SMESH_Actor::eCoincidentNodes;
-            break;
-          case 6029:
-            aControl = SMESH_Actor::eCoincidentElems1D;
-            break;
-          case 6030:
-            aControl = SMESH_Actor:: eCoincidentElems2D;
-            break;
-          case 6031:
-            aControl = SMESH_Actor::eCoincidentElems3D;
-            break;
-          }
-
-          anActor->SetControlMode(aControl);
-          anActor->GetScalarBarActor()->SetTitle( functorToString( anActor->GetFunctor() ).toLatin1().constData() );
-          SMESH::RepaintCurrentView();
+    if ( !selected.IsEmpty() ) {
+      SALOME_ListIteratorOfListIO It(selected);
+      for ( ; It.More(); It.Next())
+      {
+        Handle(SALOME_InteractiveObject) anIO = It.Value();
+        if ( !anIO.IsNull() ) {
+          _PTR(SObject) SO = aStudy->FindObjectID( It.Value()->getEntry() );
+          if ( SO ) {
+            CORBA::Object_var         aObject = SMESH::SObjectToObject( SO );
+            SMESH::SMESH_IDSource_var anIDSrc = SMESH::SMESH_IDSource::_narrow( aObject );
+            if ( !anIDSrc->_is_nil() ) {
+              SMESH_Actor *anActor = SMESH::FindActorByEntry( anIO->getEntry());
+              if (( !anActor && selected.Extent() == 1 ) &&
+                  ( anActor = SMESH::CreateActor( aStudy, anIO->getEntry() )))
+              {
+                anActor->SetControlMode( aControl );
+                SMESH::DisplayActor( SMESH::GetCurrentVtkView(), anActor );
+                SMESH::UpdateView  ( SMESH::eDisplay, anIO->getEntry() );
+              }
+              if ( anActor )
+              {
+                if ( anActor->GetControlMode() != aControl )
+                  anActor->SetControlMode( aControl );
+                QString functorName = functorToString( anActor->GetFunctor() );
+                int anEntitiesCount = anActor->GetNumberControlEntities();
+                if (anEntitiesCount >= 0)
+                  functorName = functorName + ": " + QString::number(anEntitiesCount);
+                anActor->GetScalarBarActor()->SetTitle( functorName.toLatin1().constData() );
+                SMESH::RepaintCurrentView();
 #ifndef DISABLE_PLOT2DVIEWER
-          if(anActor->GetPlot2Histogram()) {
-            SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
-            QString functorName = functorToString( anActor->GetFunctor());
-            QString aHistogramName("%1 : %2");
-            aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName);
-            aHistogram->setName(aHistogramName);
-            aHistogram->setHorTitle(functorName);
-            SMESH::ProcessIn2DViewers(anActor);
-          }
+                if ( anActor->GetPlot2Histogram() ) {
+                  SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
+                  QString aHistogramName("%1 : %2");
+                  aHistogramName = aHistogramName.arg( anIO->getName() ).arg( functorName );
+                  aHistogram->setName( aHistogramName );
+                  aHistogram->setHorTitle( functorName );
+                  SMESH::ProcessIn2DViewers( anActor );
+                }
 #endif
+              }
+            }
+          }
         }
       }
     }
 
 
   bool CheckOIType(const Handle(SALOME_InteractiveObject) & theIO,
-                   SMESH::MeshObjectType                           theType,
+                   SMESH::MeshObjectType                    theType,
                    const QString                            theInTypeName,
                    QString &                                theOutTypeName)
   {
     SMESH_TypeFilter aTypeFilter( theType );
     QString entry;
-    if( !theIO.IsNull() )
+    if ( !theIO.IsNull() )
     {
       entry = theIO->getEntry();
       LightApp_DataOwner owner( entry );
 
   QString CheckTypeObject(const Handle(SALOME_InteractiveObject) & theIO)
   {
-    _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
+    _PTR(Study)  aStudy = SMESH::GetActiveStudyDocument();
     _PTR(SObject) aSObj = aStudy->FindObjectID(theIO->getEntry());
     if (aSObj) {
       _PTR(SComponent) aSComp = aSObj->GetFatherComponent();
-      CORBA::String_var anID = aSComp->GetID().c_str();
-      if (!strcmp(anID.in(),theIO->getEntry()))
+      CORBA::String_var  anID = aSComp->GetID().c_str();
+      if ( !strcmp(anID.in(),theIO->getEntry()) )
         return "Component";
     }
 
   }
 
 
-  QString CheckHomogeneousSelection()
-  {
-    //SUIT_Study* aStudy = SMESH::GetActiveStudy();
-    LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
-    SALOME_ListIO selected;
-    if( aSel )
-      aSel->selectedObjects( selected );
+  // QString CheckHomogeneousSelection()
+  // {
+  //   LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
+  //   SALOME_ListIO selected;
+  //   if ( aSel )
+  //     aSel->selectedObjects( selected );
 
-    QString RefType = CheckTypeObject(selected.First());
-    SALOME_ListIteratorOfListIO It(selected);
-    for ( ; It.More(); It.Next())
-      {
-        Handle(SALOME_InteractiveObject) IObject = It.Value();
-        QString Type = CheckTypeObject(IObject);
-        if (Type.compare(RefType) != 0)
-          return "Heterogeneous Selection";
-      }
+  //   QString RefType = CheckTypeObject(selected.First());
+  //   SALOME_ListIteratorOfListIO It(selected);
+  //   for ( ; It.More(); It.Next())
+  //   {
+  //     Handle(SALOME_InteractiveObject) IObject = It.Value();
+  //     QString Type = CheckTypeObject(IObject);
+  //     if ( Type.compare(RefType) != 0 )
+  //       return "Heterogeneous Selection";
+  //   }
 
-    return RefType;
+  //   return RefType;
+  // }
+
+  uint randomize( uint size )
+  {
+    static bool initialized = false;
+    if ( !initialized ) {
+      qsrand( QDateTime::currentDateTime().toTime_t() );
+      initialized = true;
+    }
+    uint v = qrand();
+    v = uint( (double)( v ) / RAND_MAX * size );
+    v = qMax( uint(0), qMin ( v, size-1 ) );
+    return v;
   }
+  
+} //namespace
 
+void SMESHGUI::OnEditDelete()
+{
+  // VSR 17/11/04: check if all objects selected belong to SMESH component --> start
+  LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
+  SALOME_ListIO selected; aSel->selectedObjects( selected, QString::null, false );
 
-  void SMESHGUI::OnEditDelete()
-  {
-    // VSR 17/11/04: check if all objects selected belong to SMESH component --> start
-    LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
-    SALOME_ListIO selected; aSel->selectedObjects( selected, QString::null, false );
+  _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
+  _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder();
+  _PTR(GenericAttribute) anAttr;
+  _PTR(AttributeIOR) anIOR;
 
-    _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
-    _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder();
-    _PTR(GenericAttribute) anAttr;
-    _PTR(AttributeIOR) anIOR;
-
-    int objectCount = 0;
-    QString aNameList;
-    QString aParentComponent = QString::null;
-    Handle(SALOME_InteractiveObject) anIO;
-    for( SALOME_ListIteratorOfListIO anIt( selected ); anIt.More(); anIt.Next() )
-    {
-      anIO = anIt.Value();
-      QString cur = anIO->getComponentDataType();
-      _PTR(SObject) aSO = aStudy->FindObjectID(anIO->getEntry());
-      if (aSO) {
-        // check if object is reference
-        _PTR(SObject) aRefSObj;
-        aNameList.append("\n    - ");
-        if ( aSO->ReferencedObject( aRefSObj ) ) {
-          QString aRefName = QString::fromStdString ( aRefSObj->GetName() );
-          aNameList.append( aRefName );
-          cur = QString::fromStdString ( aRefSObj->GetFatherComponent()->ComponentDataType() );
-        }
-        else
-          aNameList.append(anIO->getName());
-        objectCount++;
+  int objectCount = 0;
+  QString aNameList;
+  QString aParentComponent = QString::null;
+  
+  for( SALOME_ListIteratorOfListIO anIt( selected ); anIt.More(); anIt.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anIO = anIt.Value();
+    if ( anIO.IsNull() ) continue;
+    
+    QString father = "unknown";
+
+    _PTR(SObject) aSO = aStudy->FindObjectID( anIO->getEntry() );
+    if (aSO) {
+      father = QString::fromStdString( aSO->GetFatherComponent()->ComponentDataType() );
+      // check if object is reference
+      _PTR(SObject) aRefSObj;
+      aNameList.append("\n    - ");
+      if ( aSO->ReferencedObject( aRefSObj ) ) {
+        QString aRefName = QString::fromStdString ( aRefSObj->GetName() );
+        aNameList.append( aRefName );
+        father = QString::fromStdString ( aRefSObj->GetFatherComponent()->ComponentDataType() );
       }
-
-      if( aParentComponent.isNull() )
-        aParentComponent = cur;
-      else if( !aParentComponent.isEmpty() && aParentComponent!=cur )
-        aParentComponent = "";
+      else
+        aNameList.append(anIO->getName());
+      objectCount++;
     }
 
-    if ( objectCount == 0 )
-      return; // No Valid Objects Selected
+    if( aParentComponent.isNull() )
+      aParentComponent = father;
+    else if( !aParentComponent.isEmpty() && aParentComponent!=father )
+      aParentComponent = "";
+  }
 
-    if ( aParentComponent != SMESHGUI::GetSMESHGUI()->name() )  {
-      SUIT_MessageBox::warning( SMESHGUI::desktop(),
-                                QObject::tr("ERR_ERROR"),
-                                QObject::tr("NON_SMESH_OBJECTS_SELECTED").arg( SMESHGUI::GetSMESHGUI()->moduleName() ) );
-      return;
-    }
-    // VSR 17/11/04: check if all objects selected belong to SMESH component <-- finish
-    if (SUIT_MessageBox::warning
-        (SMESHGUI::desktop(),
-         QObject::tr("SMESH_WRN_WARNING"),
-         QObject::tr("SMESH_REALLY_DELETE").arg( objectCount ).arg( aNameList ),
-         SUIT_MessageBox::Yes | SUIT_MessageBox::No,
-         SUIT_MessageBox::Yes) != SUIT_MessageBox::Yes)
-      return;
+  if ( objectCount == 0 )
+    return; // No Valid Objects Selected
 
-    SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
+  if ( aParentComponent != SMESHGUI::GetSMESHGUI()->name() )  {
+    SUIT_MessageBox::warning( SMESHGUI::desktop(),
+                              QObject::tr("ERR_ERROR"),
+                              QObject::tr("NON_SMESH_OBJECTS_SELECTED").arg( SMESHGUI::GetSMESHGUI()->moduleName() ) );
+    return;
+  }
+  // VSR 17/11/04: check if all objects selected belong to SMESH component <-- finish
+  if (SUIT_MessageBox::warning
+      (SMESHGUI::desktop(),
+       QObject::tr("SMESH_WRN_WARNING"),
+       QObject::tr("SMESH_REALLY_DELETE").arg( objectCount ).arg( aNameList ),
+       SUIT_MessageBox::Yes | SUIT_MessageBox::No,
+       SUIT_MessageBox::Yes) != SUIT_MessageBox::Yes)
+    return;
 
-    // Put the whole hierarchy of sub-objects of the selected SO's into a list and
-    // then treat them all starting from the deepest objects (at list back)
-    std::list< _PTR(SObject) > listSO;
-    SALOME_ListIteratorOfListIO It(selected);
-    for( ; It.More(); It.Next()) // loop on selected IO's
-    {
-      Handle(SALOME_InteractiveObject) IObject = It.Value();
-      if(IObject->hasEntry()) {
-        _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry());
-
-        // disable removal of "SMESH" component object
-        if(aSO->FindAttribute(anAttr, "AttributeIOR")){
-          anIOR = anAttr;
-          if ( engineIOR() == anIOR->Value().c_str() )
-            continue;
-        }
-        //Check the referenced object
-        _PTR(SObject) aRefSObject;
-        if ( aSO && aSO->ReferencedObject( aRefSObject ) )
-          aSO = aRefSObject; // Delete main Object instead of reference
-
-        listSO.push_back( aSO );
-        std::list< _PTR(SObject) >::iterator itSO = --listSO.end();
-        for ( ; itSO != listSO.end(); ++itSO ) {
-          _PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO );
-          for (it->InitEx(false); it->More(); it->Next())
-            listSO.push_back( it->Value() );
-        }
+  SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
+
+  // Put the whole hierarchy of sub-objects of the selected SO's into a list and
+  // then treat them all starting from the deepest objects (at list back)
+  std::list< _PTR(SObject) > listSO;
+  SALOME_ListIteratorOfListIO It(selected);
+  for( ; It.More(); It.Next()) // loop on selected IO's
+  {
+    Handle(SALOME_InteractiveObject) IObject = It.Value();
+    if(IObject->hasEntry()) {
+      _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry());
+
+      // disable removal of "SMESH" component object
+      if(aSO->FindAttribute(anAttr, "AttributeIOR")){
+        anIOR = anAttr;
+        if ( engineIOR() == anIOR->Value().c_str() )
+          continue;
+      }
+      //Check the referenced object
+      _PTR(SObject) aRefSObject;
+      if ( aSO && aSO->ReferencedObject( aRefSObject ) )
+        aSO = aRefSObject; // Delete main Object instead of reference
+
+      listSO.push_back( aSO );
+      std::list< _PTR(SObject) >::iterator itSO = --listSO.end();
+      for ( ; itSO != listSO.end(); ++itSO ) {
+        _PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO );
+        for (it->InitEx(false); it->More(); it->Next())
+          listSO.push_back( it->Value() );
       }
     }
-    // Check if none of objects to delete is referred from outside
-    std::list< _PTR(SObject) >::reverse_iterator ritSO;
-    for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO )
-    {
-      _PTR(SObject) SO = *ritSO;
-      if ( !SO ) continue;
-      std::vector<_PTR(SObject)> aReferences = aStudy->FindDependances( *ritSO  );
-      for (size_t i = 0; i < aReferences.size(); i++) {
-        _PTR(SComponent) aComponent = aReferences[i]->GetFatherComponent();
-        std::string type = aComponent->ComponentDataType();
-        if ( type != "SMESH" )
-        {
-          SUIT_MessageBox::warning( anApp->desktop(),
-                                    QObject::tr("WRN_WARNING"),
-                                    QObject::tr("DEP_OBJECT") );
-          return; // outside SMESH, there is an object depending on a SMESH object 
-        }
+  }
+  // Check if none of objects to delete is referred from outside
+  std::list< _PTR(SObject) >::reverse_iterator ritSO;
+  for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO )
+  {
+    _PTR(SObject) SO = *ritSO;
+    if ( !SO ) continue;
+    std::vector<_PTR(SObject)> aReferences = aStudy->FindDependances( *ritSO  );
+    for (size_t i = 0; i < aReferences.size(); i++) {
+      _PTR(SComponent) aComponent = aReferences[i]->GetFatherComponent();
+      std::string type = aComponent->ComponentDataType();
+      if ( type != "SMESH" )
+      {
+        SUIT_MessageBox::warning( anApp->desktop(),
+                                  QObject::tr("WRN_WARNING"),
+                                  QObject::tr("DEP_OBJECT") );
+        return; // outside SMESH, there is an object depending on a SMESH object
       }
     }
+  }
 
-    // Call mesh->Clear() to prevent loading mesh from file caused by hypotheses removal
-    for( It.Initialize( selected ); It.More(); It.Next()) // loop on selected IO's
-    {
-      Handle(SALOME_InteractiveObject) IObject = It.Value();
-      SMESH::SMESH_Mesh_var mesh = SMESH::IObjectToInterface< SMESH::SMESH_Mesh >( IObject );
-      if ( !mesh->_is_nil() )
-        mesh->Clear();
-    }
+  // Call mesh->Clear() to prevent loading mesh from file caused by hypotheses removal
+  for( It.Initialize( selected ); It.More(); It.Next()) // loop on selected IO's
+  {
+    Handle(SALOME_InteractiveObject) IObject = It.Value();
+    SMESH::SMESH_Mesh_var mesh = SMESH::IObjectToInterface< SMESH::SMESH_Mesh >( IObject );
+    if ( !mesh->_is_nil() )
+      mesh->Clear();
+  }
 
-    // Treat SO's in the list starting from the back
-    aStudyBuilder->NewCommand();  // There is a transaction
-    for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO )
-    {
-      _PTR(SObject) SO = *ritSO;
-      if ( !SO ) continue;
-      std::string anEntry = SO->GetID();
+  // Treat SO's in the list starting from the back
+  aStudyBuilder->NewCommand();  // There is a transaction
+  for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO )
+  {
+    _PTR(SObject) SO = *ritSO;
+    if ( !SO ) continue;
+    std::string anEntry = SO->GetID();
 
-      /** Erase graphical object and remove all its data **/
-      if(SO->FindAttribute(anAttr, "AttributeIOR")) {
-        SMESH::RemoveVisualObjectWithActors( anEntry.c_str(), true);
-      }
-      /** Remove an object from data structures **/
-      SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO ));
-      SMESH::SMESH_subMesh_var   aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO ));
-      if ( !aGroup->_is_nil() ) {                          // DELETE GROUP
-        SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh();
-        aMesh->RemoveGroup( aGroup );
-      }
-      else if ( !aSubMesh->_is_nil() ) {                   // DELETE SUBMESH
-        SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
-        aMesh->RemoveSubMesh( aSubMesh );
+    /** Erase graphical object and remove all its data **/
+    if(SO->FindAttribute(anAttr, "AttributeIOR")) {
+      SMESH::RemoveVisualObjectWithActors( anEntry.c_str(), true);
+    }
+    /** Remove an object from data structures **/
+    SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO ));
+    SMESH::SMESH_subMesh_var   aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO ));
+    if ( !aGroup->_is_nil() ) {                          // DELETE GROUP
+      SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh();
+      aMesh->RemoveGroup( aGroup );
+    }
+    else if ( !aSubMesh->_is_nil() ) {                   // DELETE SUBMESH
+      SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
+      aMesh->RemoveSubMesh( aSubMesh );
 
-        _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh);
-        if (aMeshSO)
-          SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0);
+      _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh);
+      if (aMeshSO)
+        SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0);
+    }
+    else {
+      Handle(SALOME_InteractiveObject) IObject = new SALOME_InteractiveObject
+        ( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() );
+      QString objType = CheckTypeObject(IObject);
+      if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS
+        SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
+        aStudyBuilder->RemoveObjectWithChildren( SO );
       }
-      else {
-        Handle(SALOME_InteractiveObject) IObject = new SALOME_InteractiveObject
-          ( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() );
-        QString objType = CheckTypeObject(IObject);
-        if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS
-          SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
-          aStudyBuilder->RemoveObjectWithChildren( SO );
-        }
-        else {// default action: remove SObject from the study
-              // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH
-              //SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy);
-              //op->start();
-          aStudyBuilder->RemoveObjectWithChildren( SO );
-          //op->finish();
-        }
+      else {// default action: remove SObject from the study
+        // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH
+        //SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy);
+        //op->start();
+        aStudyBuilder->RemoveObjectWithChildren( SO );
+        //op->finish();
       }
-    } /* listSO back loop */
+    }
+  } /* listSO back loop */
 
-    aStudyBuilder->CommitCommand();
+  aStudyBuilder->CommitCommand();
 
-    /* Clear any previous selection */
-    SALOME_ListIO l1;
-    aSel->setSelectedObjects( l1 );
+  /* Clear any previous selection */
+  SALOME_ListIO l1;
+  aSel->setSelectedObjects( l1 );
 
-    SMESHGUI::GetSMESHGUI()->updateObjBrowser();
-  }
-//} namespace
+  SMESHGUI::GetSMESHGUI()->updateObjBrowser();
+}
 
 extern "C" {
   SMESHGUI_EXPORT CAM_Module* createModule()
@@ -1908,7 +2018,7 @@ SalomeApp_Module( "SMESH" )
   {
     CORBA::Boolean anIsEmbeddedMode;
     myComponentSMESH = SMESH_Client::GetSMESHGen(getApp()->orb(),anIsEmbeddedMode);
-    MESSAGE("-------------------------------> anIsEmbeddedMode=" << anIsEmbeddedMode);
+    //MESSAGE("-------------------------------> anIsEmbeddedMode=" << anIsEmbeddedMode);
 
     //  0019923: EDF 765 SMESH : default values of hypothesis
     SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
@@ -1917,7 +2027,7 @@ SalomeApp_Module( "SMESH" )
     nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
     myComponentSMESH->SetDefaultNbSegments( nbSeg );
 
-    const char* options[] = { "historical_python_dump", "forget_mesh_on_hyp_modif" };
+    const char* options[] = { "historical_python_dump", "forget_mesh_on_hyp_modif", "default_grp_color" };
     for ( size_t i = 0; i < sizeof(options)/sizeof(char*); ++i )
       if ( aResourceMgr->hasValue( "SMESH", options[i] ))
       {
@@ -1987,8 +2097,8 @@ bool SMESHGUI::automaticUpdate(unsigned int requestedSize, bool* limitExceeded)
  *
  */
 //=============================================================================
-bool SMESHGUI::automaticUpdate( SMESH::SMESH_Mesh_ptr theMesh,
-                                int* entities, bool* limitExceeded, int* hidden )
+bool SMESHGUI::automaticUpdate( SMESH::SMESH_IDSource_ptr theMesh,
+                                int* entities, bool* limitExceeded, int* hidden, long* nbElements )
 {
   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
   if ( !resMgr )
@@ -1998,8 +2108,23 @@ bool SMESHGUI::automaticUpdate( SMESH::SMESH_Mesh_ptr theMesh,
   long updateLimit = resMgr->integerValue( "SMESH", "update_limit", 500000 );
   bool incrementalLimit = resMgr->booleanValue( "SMESH", "incremental_limit", false );
 
-  long requestedSize = theMesh->NbElements();
-
+  SMESH::long_array_var info = theMesh->GetMeshInfo();
+  long nbOdElems = info[SMDSEntity_0D];
+  long nbEdges   = info[SMDSEntity_Edge] + info[SMDSEntity_Quad_Edge];
+  long nbFaces   = info[SMDSEntity_Triangle]   + info[SMDSEntity_Quad_Triangle]   + info[SMDSEntity_BiQuad_Triangle] + 
+                   info[SMDSEntity_Quadrangle] + info[SMDSEntity_Quad_Quadrangle] + info[SMDSEntity_BiQuad_Quadrangle] + 
+                   info[SMDSEntity_Polygon] + info[SMDSEntity_Quad_Polygon];
+  long nbVolumes = info[SMDSEntity_Tetra]   + info[SMDSEntity_Quad_Tetra] + 
+                   info[SMDSEntity_Hexa]    + info[SMDSEntity_Quad_Hexa] + info[SMDSEntity_TriQuad_Hexa] + 
+                   info[SMDSEntity_Pyramid] + info[SMDSEntity_Quad_Pyramid] + 
+                   info[SMDSEntity_Penta]   + info[SMDSEntity_Quad_Penta] + 
+                   info[SMDSEntity_Polyhedra] + 
+                   info[SMDSEntity_Hexagonal_Prism];
+  long nbBalls   = info[SMDSEntity_Ball];
+
+  long requestedSize = nbOdElems + nbBalls + nbEdges + nbFaces + nbVolumes;
+  *nbElements = requestedSize;
+  
   *entities = SMESH_Actor::eAllEntity;
   *hidden   = 0;
 
@@ -2008,11 +2133,6 @@ bool SMESHGUI::automaticUpdate( SMESH::SMESH_Mesh_ptr theMesh,
   if ( limitExceeded ) *limitExceeded = autoUpdate && exceeded;
 
   if ( incrementalLimit ) {
-    long nbOdElems = theMesh->Nb0DElements();
-    long nbEdges   = theMesh->NbEdges();
-    long nbFaces   = theMesh->NbFaces();
-    long nbVolumes = theMesh->NbVolumes();
-    long nbBalls   = theMesh->NbBalls();
     long total     = 0;
 
     if ( nbOdElems > 0 ) {
@@ -2176,6 +2296,26 @@ void SMESHGUI::EmitSignalVisibilityChanged()
   emit SignalVisibilityChanged();
 }
 
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+void SMESHGUI::EmitSignalCloseView()
+{
+  emit SignalCloseView();
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+void SMESHGUI::EmitSignalActivatedViewManager()
+{
+  emit SignalActivatedViewManager();
+}
+
 //=============================================================================
 /*!
  *
@@ -2313,25 +2453,31 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
   //QAction* act = action( theCommandID );
 
   switch (theCommandID) {
-  case 33:                                      // DELETE
+  case SMESHOp::OpDelete:
     if(checkLock(aStudy)) break;
     OnEditDelete();
     break;
-
-  case 116:
-  case 115:
-  case 117:
-  case 118:
-  case 113:
-  case 112:
-  case 111:                                     // IMPORT
+  case SMESHOp::OpImportDAT:
+  case SMESHOp::OpImportUNV:
+  case SMESHOp::OpImportMED:
+  case SMESHOp::OpImportSTL:
+  case SMESHOp::OpImportCGNS:
+  case SMESHOp::OpImportSAUV:
+  case SMESHOp::OpImportGMF:
+  case SMESHOp::OpPopupImportDAT:
+  case SMESHOp::OpPopupImportUNV:
+  case SMESHOp::OpPopupImportMED:
+  case SMESHOp::OpPopupImportSTL:
+  case SMESHOp::OpPopupImportCGNS:
+  case SMESHOp::OpPopupImportSAUV:
+  case SMESHOp::OpPopupImportGMF:
     {
       if(checkLock(aStudy)) break;
       ::ImportMeshesFromFile(GetSMESHGen(),theCommandID);
       break;
     }
 
-  case 150:    //MED FILE INFORMATION
+  case SMESHOp::OpFileInformation:
     {
       SALOME_ListIO selected;
       LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
@@ -2349,35 +2495,35 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-
-  case 122:                                     // EXPORT MED
-  case 121:
-  case 123:
-  case 124:
-  case 125:
-  case 126:
-  case 140:
-  case 141:
-  case 142:
-  case 143:
-  case 144:
-  case 145:
-  case 146:
-  case 147:
+  case SMESHOp::OpExportDAT:
+  case SMESHOp::OpExportMED:
+  case SMESHOp::OpExportUNV:
+  case SMESHOp::OpExportSTL:
+  case SMESHOp::OpExportCGNS:
+  case SMESHOp::OpExportSAUV:
+  case SMESHOp::OpExportGMF:
+  case SMESHOp::OpPopupExportDAT:
+  case SMESHOp::OpPopupExportMED:
+  case SMESHOp::OpPopupExportUNV:
+  case SMESHOp::OpPopupExportSTL:
+  case SMESHOp::OpPopupExportCGNS:
+  case SMESHOp::OpPopupExportSAUV:
+  case SMESHOp::OpPopupExportGMF:
     {
       ::ExportMeshToFile(theCommandID);
       break;
     }
 
-  case 200:                                     // SCALAR BAR
+  case SMESHOp::OpReset:                      // SCALAR BAR
     {
       LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
       SALOME_ListIO selected;
       if( aSel )
         aSel->selectedObjects( selected );
 
-      if( selected.Extent() ) {
-        Handle(SALOME_InteractiveObject) anIO = selected.First();
+      SALOME_ListIteratorOfListIO it(selected);
+      for( ; it.More(); it.Next()) {
+        Handle(SALOME_InteractiveObject) anIO = it.Value();
         if( anIO->hasEntry() ) {
           if( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) {
             anActor->SetControlMode( SMESH_Actor::eNone );
@@ -2387,29 +2533,36 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
           }
         }
       }
+      SMESH::UpdateView();
       break;
     }
-  case 201:
+  case SMESHOp::OpScalarBarProperties:
     {
       SMESHGUI_Preferences_ScalarBarDlg::ScalarBarProperties( this );
       break;
     }
-  case 2021:
+  case SMESHOp::OpShowScalarBar:
+    {
+      // show/hide scalar bar
+      ::ShowElement(theCommandID);
+      break;
+    }
+  case SMESHOp::OpSaveDistribution:
     {
       // dump control distribution data to the text file
       ::SaveDistribution();
       break;
     }
 
-  case 2022:
+  case SMESHOp::OpShowDistribution:
     {
-      // show/ distribution
-      ::ShowDistribution();
+      // show/hide distribution
+      ::ShowElement(theCommandID);
       break;
     }
 
 #ifndef DISABLE_PLOT2DVIEWER
-  case 2023:
+  case SMESHOp::OpPlotDistribution:
     {
       // plot distribution
       ::PlotDistribution();
@@ -2418,44 +2571,52 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
 #endif
 
     // Auto-color
-  case 1136:
+  case SMESHOp::OpAutoColor:
     ::AutoColor();
   break;
 
-  case 1137:
+  case SMESHOp::OpDisableAutoColor:
     ::DisableAutoColor();
   break;
 
-  case 1134: // Clipping
-  case 1133: // Tranparency
-  case 1132: // Display preferences (colors, shrink size, line width, ...)
+  case SMESHOp::OpClipping:
+  case SMESHOp::OpTransparency:
+  case SMESHOp::OpProperties: // Display preferences (colors, shrink size, line width, ...)
 
     // Display Mode
-  case 215: // Nodes
-  case 213: // Nodes
-  case 212: // Nodes
-  case 211: // Nodes
+  case SMESHOp::OpDMWireframe:
+  case SMESHOp::OpDMShading:
+  case SMESHOp::OpDMNodes:
+  case SMESHOp::OpDMShrink:
     ::SetDisplayMode(theCommandID, myMarkerMap);
   break;
 
   //2D quadratic representation
-  case 231:
-  case 232:
+  case SMESHOp::OpRepresentationLines:
+  case SMESHOp::OpRepresentationArcs:
     ::SetDisplayMode(theCommandID, myMarkerMap);
   break;
 
   // Display Entity
-  case 216: // 0D elements
-  case 217: // Edges
-  case 218: // Faces
-  case 219: // Volumes
-  case 220: // All Entity
-  case 222: // Balls
+  case SMESHOp::OpDE0DElements:
+  case SMESHOp::OpDEEdges:
+  case SMESHOp::OpDEFaces:
+  case SMESHOp::OpDEVolumes:
+  case SMESHOp::OpDEBalls:
+  case SMESHOp::OpDEAllEntity:
     ::SetDisplayEntity(theCommandID);
   break;
 
-  case 221: // Orientation of faces
+  // Choose entities to be displayed
+  case SMESHOp::OpDEChoose:
+    {
+      ( new SMESHGUI_DisplayEntitiesDlg( SMESHGUI::desktop() ) )->exec();
+      break;
+    }
+
+  case SMESHOp::OpOrientationOnFaces:
     {
+      SUIT_OverrideCursor wc;
       LightApp_SelectionMgr* mgr = selectionMgr();
       SALOME_ListIO selected; mgr->selectedObjects( selected );
 
@@ -2471,7 +2632,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 214:                                     // UPDATE
+  case SMESHOp::OpUpdate:
     {
       if(checkLock(aStudy)) break;
       SUIT_OverrideCursor wc;
@@ -2495,15 +2656,16 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 300:                                     // ERASE
-  case 301:                                     // DISPLAY
-  case 302:                                     // DISPLAY ONLY
+  case SMESHOp::OpHide:
+  case SMESHOp::OpShow:
+  case SMESHOp::OpShowOnly:
     {
+      SUIT_OverrideCursor wc;
       SMESH::EDisplaing anAction;
       switch (theCommandID) {
-      case 300: anAction = SMESH::eErase; break;
-      case 301: anAction = SMESH::eDisplay; break;
-      case 302: anAction = SMESH::eDisplayOnly; break;
+      case SMESHOp::OpHide:     anAction = SMESH::eErase; break;
+      case SMESHOp::OpShow:     anAction = SMESH::eDisplay; break;
+      case SMESHOp::OpShowOnly: anAction = SMESH::eDisplayOnly; break;
       }
 
       LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
@@ -2511,41 +2673,35 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       if (aSel)
         aSel->selectedObjects( sel_objects );
 
-      if( theCommandID==302 )
+      if ( theCommandID==SMESHOp::OpShowOnly )
       {
-        MESSAGE("anAction = SMESH::eDisplayOnly");
+        //MESSAGE("anAction = SMESH::eDisplayOnly");
         startOperation( myEraseAll );
       }
 
       extractContainers( sel_objects, to_process );
 
       try {
-#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
         OCC_CATCH_SIGNALS;
-#endif
         if (vtkwnd) {
           SALOME_ListIteratorOfListIO It( to_process );
-          for ( ; It.More(); It.Next()) {
-            MESSAGE("---");
+          for ( ; It.More(); It.Next())
+          {
             Handle(SALOME_InteractiveObject) IOS = It.Value();
-            if (IOS->hasEntry()) {
-              MESSAGE("---");
-              if (!SMESH::UpdateView(anAction, IOS->getEntry())) {
+            if ( IOS->hasEntry() )
+            {
+              if ( !SMESH::UpdateView( anAction, IOS->getEntry() )) {
                 SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged();
                 break; // PAL16774 (Crash after display of many groups)
               }
               if (anAction == SMESH::eDisplayOnly)
-              {
-                MESSAGE("anAction = SMESH::eDisplayOnly");
                 anAction = SMESH::eDisplay;
-              }
             }
           }
         }
 
         // PAL13338 + PAL15161 -->
-        if ( ( theCommandID==301 || theCommandID==302 ) && !checkLock(aStudy)) {
-          MESSAGE("anAction = SMESH::eDisplayOnly");
+        if ( ( theCommandID==SMESHOp::OpShow || theCommandID==SMESHOp::OpShowOnly ) && !checkLock(aStudy)) {
           SMESH::UpdateView();
           SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged();
         }
@@ -2556,7 +2712,6 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
 
       if (anAction == SMESH::eErase) {
-        MESSAGE("anAction == SMESH::eErase");
         SALOME_ListIO l1;
         aSel->setSelectedObjects( l1 );
       }
@@ -2566,7 +2721,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 4000:                                    // NODES
+  case SMESHOp::OpNode:
     {
       if(checkLock(aStudy)) break;
 
@@ -2576,40 +2731,31 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         ( new SMESHGUI_NodesDlg( this ) )->show();
       }
       else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"),
-                                 tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"),tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
 
-  case 2151:  // FILTER
-  {
-    if ( vtkwnd )
-    {
-      EmitSignalDeactivateDialog();
-      ( new SMESHGUI_FilterDlg( this, SMESH::EDGE ) )->show();
-    }
-    break;
-  }
-
-  case 701: // COMPUTE MESH
-  case 711: // PRECOMPUTE MESH
-  case 712: // EVALUATE MESH
-  case 713: // MESH ORDER
-  case 702: // Create mesh
-  case 703: // Create sub-mesh
-  case 704: // Edit mesh/sub-mesh
+  case SMESHOp::OpCreateMesh:
+  case SMESHOp::OpCreateSubMesh:
+  case SMESHOp::OpEditMeshOrSubMesh:
+  case SMESHOp::OpEditMesh:
+  case SMESHOp::OpEditSubMesh:
+  case SMESHOp::OpCompute:
+  case SMESHOp::OpComputeSubMesh:
+  case SMESHOp::OpPreCompute:
+  case SMESHOp::OpEvaluate:
+  case SMESHOp::OpMeshOrder:
     startOperation( theCommandID );
     break;
-  case 705: // copy mesh
+  case SMESHOp::OpCopyMesh:
     {
       if (checkLock(aStudy)) break;
       EmitSignalDeactivateDialog();
       ( new SMESHGUI_CopyMeshDlg( this ) )->show();
     }
     break;
-  case 710: // Build compound mesh
+  case SMESHOp::OpBuildCompoundMesh:
     {
       if (checkLock(aStudy)) break;
       EmitSignalDeactivateDialog();
@@ -2617,13 +2763,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     }
     break;
 
-  case 407: // DIAGONAL INVERSION
-  case 408: // Delete diagonal
+  case SMESHOp::OpDiagonalInversion:
+  case SMESHOp::OpUnionOfTwoTriangle:
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -2640,21 +2785,20 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       */
       EmitSignalDeactivateDialog();
-      if ( theCommandID == 407 )
+      if ( theCommandID == SMESHOp::OpDiagonalInversion )
         ( new SMESHGUI_TrianglesInversionDlg( this ) )->show();
       else
         ( new SMESHGUI_UnionOfTwoTrianglesDlg( this ) )->show();
       break;
     }
-  case 409: // Change orientation
-  case 410: // Union of triangles
-  case 411: // Cutting of quadrangles
-  case 419: // Splitting volumes into tetrahedra
+  case SMESHOp::OpOrientation:
+  case SMESHOp::OpUnionOfTriangles:
+  case SMESHOp::OpCuttingOfQuadrangles:
+  case SMESHOp::OpSplitVolumes:
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -2663,11 +2807,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
 
       EmitSignalDeactivateDialog();
       SMESHGUI_MultiEditDlg* aDlg = NULL;
-      if ( theCommandID == 409 )
+      if ( theCommandID == SMESHOp::OpOrientation )
         aDlg = new SMESHGUI_ChangeOrientationDlg(this);
-      else if ( theCommandID == 410 )
+      else if ( theCommandID == SMESHOp::OpUnionOfTriangles )
         aDlg = new SMESHGUI_UnionOfTrianglesDlg(this);
-      else if ( theCommandID == 419 )
+      else if ( theCommandID == SMESHOp::OpSplitVolumes )
         aDlg = new SMESHGUI_SplitVolumesDlg(this);
       else
         aDlg = new SMESHGUI_CuttingOfQuadsDlg(this);
@@ -2675,7 +2819,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       aDlg->show();
       break;
     }
-  case 412: // Smoothing
+  case SMESHOp::OpSmoothing:
     {
       if(checkLock(aStudy)) break;
       if( vtkwnd ) {
@@ -2683,24 +2827,33 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         ( new SMESHGUI_SmoothingDlg( this ) )->show();
       }
       else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(), tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
-  case 413: // Extrusion
+  case SMESHOp::OpExtrusion:
     {
       if (checkLock(aStudy)) break;
       if (vtkwnd) {
         EmitSignalDeactivateDialog();
         ( new SMESHGUI_ExtrusionDlg ( this ) )->show();
       } else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+      }
+      break;
+    }
+  case SMESHOp::OpExtrusionAlongAPath:
+    {
+      if (checkLock(aStudy)) break;
+      if (vtkwnd) {
+        EmitSignalDeactivateDialog();
+        ( new SMESHGUI_ExtrusionAlongPathDlg( this ) )->show();
+      } else {
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
-  case 414: // Revolution
+  case SMESHOp::OpRevolution:
     {
       if(checkLock(aStudy)) break;
       if( vtkwnd ) {
@@ -2708,12 +2861,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         ( new SMESHGUI_RevolutionDlg( this ) )->show();
       }
       else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
-  case 415: // Pattern mapping
+  case SMESHOp::OpPatternMapping:
     {
       if ( checkLock( aStudy ) )
         break;
@@ -2723,37 +2875,24 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         ( new SMESHGUI_MeshPatternDlg( this ) )->show();
       }
       else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
-      }
-      break;
-    }
-  case 416: // Extrusion along a path
-    {
-      if (checkLock(aStudy)) break;
-      if (vtkwnd) {
-        EmitSignalDeactivateDialog();
-        ( new SMESHGUI_ExtrusionAlongPathDlg( this ) )->show();
-      } else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
-  case 417: // Convert mesh to quadratic
-  case 418: // create 2D mesh from 3D
-  case 420: // Reorient faces
-  case 806: // CREATE GEO GROUP
+  case SMESHOp::OpSplitBiQuadratic:
+  case SMESHOp::OpConvertMeshToQuadratic:
+  case SMESHOp::OpCreateBoundaryElements: // create 2D mesh from 3D
+  case SMESHOp::OpReorientFaces:
+  case SMESHOp::OpCreateGeometryGroup:
     {
       startOperation( theCommandID );
       break;
     }
-  case 801:                                     // CREATE GROUP
+  case SMESHOp::OpCreateGroup:
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -2776,12 +2915,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 802:                                     // CONSTRUCT GROUP
+  case SMESHOp::OpConstructGroup:
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -2854,12 +2992,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 803:                                     // EDIT GROUP
+  case SMESHOp::OpEditGroup:
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -2891,7 +3028,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 804:                                     // Add elements to group
+  case SMESHOp::OpAddElemGroupPopup:     // Add elements to group
     {
       if(checkLock(aStudy)) break;
       if (myState == 800) {
@@ -2901,7 +3038,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 805:                                     // Remove elements from group
+  case SMESHOp::OpRemoveElemGroupPopup:  // Remove elements from group
     {
       if(checkLock(aStudy)) break;
       if (myState == 800) {
@@ -2911,12 +3048,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 815:                                     // Edit GEOM GROUP as standalone
+  case SMESHOp::OpEditGeomGroupAsGroup:
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -2950,14 +3086,13 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-    case 810: // Union Groups
-    case 811: // Intersect groups
-    case 812: // Cut groups
+    case SMESHOp::OpUnionGroups:
+    case SMESHOp::OpIntersectGroups:
+    case SMESHOp::OpCutGroups:
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -2967,9 +3102,9 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       EmitSignalDeactivateDialog();
 
       SMESHGUI_GroupOpDlg* aDlg = 0;
-      if ( theCommandID == 810 )
+      if ( theCommandID == SMESHOp::OpUnionGroups )
         aDlg = new SMESHGUI_UnionGroupsDlg( this );
-      else if ( theCommandID == 811 )
+      else if ( theCommandID == SMESHOp::OpIntersectGroups )
         aDlg = new SMESHGUI_IntersectGroupsDlg( this );
       else
         aDlg = new SMESHGUI_CutGroupsDlg( this );
@@ -2979,7 +3114,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-    case 814: // Create groups of entities from existing groups of superior dimensions
+    case SMESHOp::OpGroupUnderlyingElem: // Create groups of entities from existing groups of superior dimensions
     {
       if ( checkLock( aStudy ) )
         break;
@@ -2991,12 +3126,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-    case 813: // Delete groups with their contents
+    case SMESHOp::OpDeleteGroup: // Delete groups with their contents
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -3009,10 +3143,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 900:                                     // MESH INFOS
-  case 903:                                     // WHAT IS
+  case SMESHOp::OpMeshInformation:
+  case SMESHOp::OpWhatIs:
     {
-      int page = theCommandID == 900 ? SMESHGUI_MeshInfoDlg::BaseInfo : SMESHGUI_MeshInfoDlg::ElemInfo;
+      int page = theCommandID == SMESHOp::OpMeshInformation ? SMESHGUI_MeshInfoDlg::BaseInfo : SMESHGUI_MeshInfoDlg::ElemInfo;
       EmitSignalDeactivateDialog();
       LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
       SALOME_ListIO selected;
@@ -3034,13 +3168,13 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 904:                                     // FIND ELEM
+  case SMESHOp::OpFindElementByPoint:
     {
       startOperation( theCommandID );
       break;
     }
 
-  case 1100:                                    // EDIT HYPOTHESIS
+  case SMESHOp::OpEditHypothesis:
     {
       if(checkLock(aStudy)) break;
 
@@ -3055,15 +3189,26 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         Handle(SALOME_InteractiveObject) anIObject = selected.First();
         SMESH::SMESH_Hypothesis_var aHypothesis = SMESH::IObjectToInterface<SMESH::SMESH_Hypothesis>(anIObject);
 
-        /* Look for all mesh objects that have this hypothesis affected in order to flag as ModifiedMesh */
-        /* At end below '...->updateObjBrowser(true)' will change icon of mesh objects                   */
-        /* Warning : however by internal mechanism all subMeshes icons are changed !                     */
         if ( !aHypothesis->_is_nil() )
         {
-          // BUG 0020378
-          //SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHypothesis->GetName());
-          SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHypothesis->GetName());
-          if (aCreator) {
+          SMESHGUI_GenericHypothesisCreator* aCreator =
+            SMESH::GetHypothesisCreator( SMESH::toQStr( aHypothesis->GetName() ));
+          if (aCreator)
+          {
+            // set geometry of mesh and sub-mesh to aCreator
+            aSel->selectedObjects( selected, "",  /*convertReferences=*/false);
+            if ( selected.Extent() == 1 )
+            {
+              QString subGeomID, meshGeomID;
+              Handle(SALOME_InteractiveObject) hypIO = selected.First();
+              if ( SMESH::GetGeomEntries( hypIO, subGeomID, meshGeomID ))
+              {
+                if ( subGeomID.isEmpty() ) subGeomID = meshGeomID;
+                aCreator->setShapeEntry( subGeomID );
+                aCreator->setMainShapeEntry( meshGeomID );
+              }
+            }
+
             aCreator->edit( aHypothesis.in(), anIObject->getName(), desktop(), this, SLOT( onHypothesisEdit( int ) ) );
           }
           else
@@ -3074,7 +3219,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-  case 1102:                                    // REMOVE HYPOTHESIS / ALGORITHMS
+  case SMESHOp::OpUnassign:                      // REMOVE HYPOTHESIS / ALGORITHMS
     {
       if(checkLock(aStudy)) break;
       SUIT_OverrideCursor wc;
@@ -3095,44 +3240,43 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 4008:                                    // BALL
-  case 4009:                                    // ELEM0D
-  case 4010:                                    // EDGE
-  case 4021:                                    // TRIANGLE
-  case 4022:                                    // QUAD
-  case 4023:                                    // POLYGON
-  case 4031:                                    // TETRA
-  case 4032:                                    // HEXA
-  case 4133:                                    // PENTA
-  case 4134:                                    // PYRAMID
-  case 4135:                                    // OCTA12
+  case SMESHOp::OpElem0D:
+  case SMESHOp::OpBall:
+  case SMESHOp::OpEdge:
+  case SMESHOp::OpTriangle:
+  case SMESHOp::OpQuadrangle:
+  case SMESHOp::OpPolygon:
+  case SMESHOp::OpTetrahedron:
+  case SMESHOp::OpHexahedron:
+  case SMESHOp::OpPentahedron:
+  case SMESHOp::OpPyramid:
+  case SMESHOp::OpHexagonalPrism:
     {
       if(checkLock(aStudy)) break;
       if ( vtkwnd ) {
         EmitSignalDeactivateDialog();
         SMDSAbs_EntityType type = SMDSEntity_Edge;
         switch (theCommandID) {
-        case 4008: type = SMDSEntity_Ball;            break;
-        case 4009: type = SMDSEntity_0D;              break;
-        case 4021: type = SMDSEntity_Triangle;        break;
-        case 4022: type = SMDSEntity_Quadrangle;      break;
-        case 4031: type = SMDSEntity_Tetra;           break;
-        case 4023: type = SMDSEntity_Polygon;         break;
-        case 4032: type = SMDSEntity_Hexa;            break;
-        case 4133: type = SMDSEntity_Penta;           break;
-        case 4134: type = SMDSEntity_Pyramid;         break;
-        case 4135: type = SMDSEntity_Hexagonal_Prism; break;
+        case SMESHOp::OpElem0D: type = SMDSEntity_0D;                      break;
+        case SMESHOp::OpBall: type = SMDSEntity_Ball;                      break;
+        case SMESHOp::OpTriangle: type = SMDSEntity_Triangle;              break;
+        case SMESHOp::OpQuadrangle: type = SMDSEntity_Quadrangle;          break;
+        case SMESHOp::OpTetrahedron: type = SMDSEntity_Tetra;              break;
+        case SMESHOp::OpPolygon: type = SMDSEntity_Polygon;                break;
+        case SMESHOp::OpHexahedron: type = SMDSEntity_Hexa;                break;
+        case SMESHOp::OpPentahedron: type = SMDSEntity_Penta;              break;
+        case SMESHOp::OpPyramid: type = SMDSEntity_Pyramid;                break;
+        case SMESHOp::OpHexagonalPrism: type = SMDSEntity_Hexagonal_Prism; break;
         default:;
         }
         ( new SMESHGUI_AddMeshElementDlg( this, type ) )->show();
       }
       else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
-  case 4033:                                    // POLYHEDRON
+  case SMESHOp::OpPolyhedron:
     {
       if(checkLock(aStudy)) break;
       if ( vtkwnd ) {
@@ -3140,21 +3284,21 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         ( new SMESHGUI_CreatePolyhedralVolumeDlg( this ) )->show();
       }
       else {
-        SUIT_MessageBox::warning(SMESHGUI::desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
-  case 4034:     // QUADRATIC EDGE
-  case 4035:     // QUADRATIC TRIANGLE
-  case 4036:     // QUADRATIC QUADRANGLE
-  case 4136:     // BIQUADRATIC QUADRANGLE
-  case 4137:     // BIQUADRATIC TRIANGLE
-  case 4037:     // QUADRATIC TETRAHEDRON
-  case 4038:     // QUADRATIC PYRAMID
-  case 4039:     // QUADRATIC PENTAHEDRON
-  case 4040:     // QUADRATIC HEXAHEDRON
-  case 4140:     // TRIQUADRATIC HEXAHEDRON
+  case SMESHOp::OpQuadraticEdge:
+  case SMESHOp::OpQuadraticTriangle:
+  case SMESHOp::OpBiQuadraticTriangle:
+  case SMESHOp::OpQuadraticQuadrangle:
+  case SMESHOp::OpBiQuadraticQuadrangle:
+  case SMESHOp::OpQuadraticPolygon:
+  case SMESHOp::OpQuadraticTetrahedron:
+  case SMESHOp::OpQuadraticPyramid:
+  case SMESHOp::OpQuadraticPentahedron:
+  case SMESHOp::OpQuadraticHexahedron:
+  case SMESHOp::OpTriQuadraticHexahedron:
     {
       if(checkLock(aStudy)) break;
       if ( vtkwnd ) {
@@ -3162,16 +3306,17 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         SMDSAbs_EntityType type = SMDSEntity_Last;
 
         switch (theCommandID) {
-        case 4034: type = SMDSEntity_Quad_Edge; break;
-        case 4035: type = SMDSEntity_Quad_Triangle; break;
-        case 4036: type = SMDSEntity_Quad_Quadrangle; break;
-        case 4136: type = SMDSEntity_BiQuad_Quadrangle; break;
-        case 4137: type = SMDSEntity_BiQuad_Triangle; break;
-        case 4037: type = SMDSEntity_Quad_Tetra; break;
-        case 4038: type = SMDSEntity_Quad_Pyramid; break;
-        case 4039: type = SMDSEntity_Quad_Penta; break;
-        case 4040: type = SMDSEntity_Quad_Hexa; break;
-        case 4140: type = SMDSEntity_TriQuad_Hexa; break;
+        case SMESHOp::OpQuadraticEdge:          type = SMDSEntity_Quad_Edge; break;
+        case SMESHOp::OpQuadraticTriangle:      type = SMDSEntity_Quad_Triangle; break;
+        case SMESHOp::OpBiQuadraticTriangle:    type = SMDSEntity_BiQuad_Triangle; break;
+        case SMESHOp::OpQuadraticQuadrangle:    type = SMDSEntity_Quad_Quadrangle; break;
+        case SMESHOp::OpBiQuadraticQuadrangle:  type = SMDSEntity_BiQuad_Quadrangle; break;
+        case SMESHOp::OpQuadraticPolygon:       type = SMDSEntity_Quad_Polygon; break;
+        case SMESHOp::OpQuadraticTetrahedron:   type = SMDSEntity_Quad_Tetra; break;
+        case SMESHOp::OpQuadraticPyramid:       type = SMDSEntity_Quad_Pyramid; break;
+        case SMESHOp::OpQuadraticPentahedron:   type = SMDSEntity_Quad_Penta; break;
+        case SMESHOp::OpQuadraticHexahedron:    type = SMDSEntity_Quad_Hexa; break;
+        case SMESHOp::OpTriQuadraticHexahedron: type = SMDSEntity_TriQuad_Hexa; break;
         default: break;
         }
         if ( type != SMDSEntity_Last )
@@ -3183,7 +3328,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-  case 4041:                                    // REMOVES NODES
+  case SMESHOp::OpRemoveNodes:
     {
       if(checkLock(aStudy)) break;
       if ( vtkwnd ) {
@@ -3196,7 +3341,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-  case 4042:                                    // REMOVES ELEMENTS
+  case SMESHOp::OpRemoveElements:                                    // REMOVES ELEMENTS
     {
       if(checkLock(aStudy)) break;
       if( vtkwnd ) {
@@ -3210,7 +3355,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         }
       break;
     }
-  case 4043: {                                // CLEAR_MESH
+  case SMESHOp::OpClearMesh: {
 
     if(checkLock(aStudy)) break;
 
@@ -3223,12 +3368,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     for ( ; It.More(); It.Next() )
     {
       Handle(SALOME_InteractiveObject) IOS = It.Value();
-      SMESH::SMESH_Mesh_var aMesh =
-        SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IOS);
+      SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IOS);
       if ( aMesh->_is_nil()) continue;
       try {
-        SMESH::RemoveVisualObjectWithActors(IOS->getEntry(), true);
         aMesh->Clear();
+        if ( aMesh->NbNodes() == 0 ) // imported mesh is not empty
+          SMESH::RemoveVisualObjectWithActors(IOS->getEntry(), true);
         _PTR(SObject) aMeshSObj = SMESH::FindSObject(aMesh);
         SMESH::ModifiedMesh( aMeshSObj, false, true);
         // hide groups and submeshes
@@ -3250,7 +3395,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     updateObjBrowser();
     break;
   }
-  case 4044:                                     // REMOVE ORPHAN NODES
+  case SMESHOp::OpRemoveOrphanNodes:
     {
       if(checkLock(aStudy)) break;
       SALOME_ListIO selected;
@@ -3289,7 +3434,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-  case 4051:                                    // RENUMBERING NODES
+  case SMESHOp::OpRenumberingNodes:
     {
       if(checkLock(aStudy)) break;
       if( vtkwnd ) {
@@ -3303,7 +3448,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         }
       break;
     }
-  case 4052:                                    // RENUMBERING ELEMENTS
+  case SMESHOp::OpRenumberingElements:
     {
       if(checkLock(aStudy)) break;
       if ( vtkwnd ) {
@@ -3317,7 +3462,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         }
       break;
     }
-  case 4061:                                   // TRANSLATION
+  case SMESHOp::OpTranslation:
     {
       if(checkLock(aStudy)) break;
       if ( vtkwnd ) {
@@ -3330,7 +3475,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-  case 4062:                                   // ROTATION
+  case SMESHOp::OpRotation:
     {
       if(checkLock(aStudy)) break;
       if( vtkwnd ) {
@@ -3343,7 +3488,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-  case 4063:                                   // SYMMETRY
+  case SMESHOp::OpSymmetry:
     {
       if(checkLock(aStudy)) break;
       if(vtkwnd) {
@@ -3356,7 +3501,21 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-  case 4064:                                   // SEWING
+  case SMESHOp::OpScale:
+    {
+      if(checkLock(aStudy)) break;
+      if ( vtkwnd ) {
+        EmitSignalDeactivateDialog();
+        ( new SMESHGUI_ScaleDlg( this ) )->show();
+      }
+      else {
+        SUIT_MessageBox::warning(SMESHGUI::desktop(),
+                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+      }
+      break;
+    }
+
+  case SMESHOp::OpSewing:
     {
       if(checkLock(aStudy)) break;
       if(vtkwnd) {
@@ -3369,7 +3528,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-  case 4065:                                   // MERGE NODES
+  case SMESHOp::OpMergeNodes:
     {
       if(checkLock(aStudy)) break;
       if(vtkwnd) {
@@ -3382,7 +3541,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-  case 4066:                                   // MERGE EQUAL ELEMENTS
+  case SMESHOp::OpMergeElements:
     {
       if (checkLock(aStudy)) break;
       if (vtkwnd) {
@@ -3395,25 +3554,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 4067: // MAKE MESH PASS THROUGH POINT
-    startOperation( 4067 );
+  case SMESHOp::OpMoveNode: // MAKE MESH PASS THROUGH POINT
+    startOperation( SMESHOp::OpMoveNode );
     break;
 
-  case 4068: // SCALE
-    {
-      if(checkLock(aStudy)) break;
-      if ( vtkwnd ) {
-        EmitSignalDeactivateDialog();
-        ( new SMESHGUI_ScaleDlg( this ) )->show();
-      }
-      else {
-        SUIT_MessageBox::warning(SMESHGUI::desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
-      }
-      break;
-    }
-
-  case 4069: // DUPLICATE NODES
+  case SMESHOp::OpDuplicateNodes:
     {
       if(checkLock(aStudy)) break;
       if ( vtkwnd ) {
@@ -3427,11 +3572,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
-  case 4070: // 0D_ON_ALL_NODES
-    startOperation( 4070 );
+  case SMESHOp::OpElem0DOnElemNodes: // 0D_ON_ALL_NODES
+    startOperation( SMESHOp::OpElem0DOnElemNodes );
     break;
 
-  case 5105: // Library of selection filters
+  case SMESHOp::OpSelectFiltersLibrary: // Library of selection filters
   {
     static QList<int> aTypes;
     if ( aTypes.isEmpty() )
@@ -3448,51 +3593,43 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     myFilterLibraryDlg->raise();
   }
   break;
-
-  case 6017:                                    // CONTROLS
-  case 6016:
-  case 6015:
-  case 6014:
-  case 6013:
-  case 6012:
-  case 6011:
-  case 6001:
-  case 6018:
-  case 6019:
-  case 6002:
-  case 6003:
-  case 6004:
-  case 6005:
-  case 6009:
-  case 6021:
-  case 6022:
-  case 6023:
-  case 6024:
-  case 6025:
-  case 6026:
-  case 6027:
-  case 6028:
-  case 6029:
-  case 6030:
-  case 6031:
+  // CONTROLS
+  case SMESHOp::OpFreeNode:
+  case SMESHOp::OpEqualNode:
+  case SMESHOp::OpNodeConnectivityNb:
+  case SMESHOp::OpFreeEdge:
+  case SMESHOp::OpFreeBorder:
+  case SMESHOp::OpLength:
+  case SMESHOp::OpConnection:
+  case SMESHOp::OpEqualEdge:
+  case SMESHOp::OpFreeFace:
+  case SMESHOp::OpBareBorderFace:
+  case SMESHOp::OpOverConstrainedFace:
+  case SMESHOp::OpLength2D:
+  case SMESHOp::OpConnection2D:
+  case SMESHOp::OpArea:
+  case SMESHOp::OpTaper:
+  case SMESHOp::OpAspectRatio:
+  case SMESHOp::OpMinimumAngle:
+  case SMESHOp::OpWarpingAngle:
+  case SMESHOp::OpSkew:
+  case SMESHOp::OpMaxElementLength2D:
+  case SMESHOp::OpEqualFace:
+  case SMESHOp::OpAspectRatio3D:
+  case SMESHOp::OpVolume:
+  case SMESHOp::OpMaxElementLength3D:
+  case SMESHOp::OpBareBorderVolume:
+  case SMESHOp::OpOverConstrainedVolume:
+  case SMESHOp::OpEqualVolume:
     if ( vtkwnd ) {
 
       LightApp_SelectionMgr* mgr = selectionMgr();
       SALOME_ListIO selected; mgr->selectedObjects( selected );
 
-      if ( selected.Extent() == 1 && selected.First()->hasEntry() ) {
-        _PTR(SObject) SO = aStudy->FindObjectID( selected.First()->getEntry() );
-        if ( SO ) {
-          CORBA::Object_var aObject = SMESH::SObjectToObject( SO );
-          SMESH::SMESH_Mesh_var      aMesh    = SMESH::SMESH_Mesh::_narrow( aObject );
-          SMESH::SMESH_subMesh_var   aSubMesh = SMESH::SMESH_subMesh::_narrow( aObject );
-          SMESH::SMESH_GroupBase_var aGroup   = SMESH::SMESH_GroupBase::_narrow( aObject );
-          if ( !aMesh->_is_nil() || !aSubMesh->_is_nil() || !aGroup->_is_nil() ) {
-            SUIT_OverrideCursor wc;
-            ::Control( theCommandID );
-            break;
-          }
-        }
+      if( !selected.IsEmpty() ) {
+        SUIT_OverrideCursor wc;
+        ::Control( theCommandID );
+        break;
       }
       SUIT_MessageBox::warning(desktop(),
                                tr( "SMESH_WRN_WARNING" ),
@@ -3505,10 +3642,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
                                tr( "NOT_A_VTK_VIEWER" ) );
     }
     break;
-  case 6032:
+  case SMESHOp::OpOverallMeshQuality:
     OverallMeshQuality();
     break;
-  case 9010:
+  case SMESHOp::OpNumberingNodes:
     {
       SUIT_OverrideCursor wc;
       LightApp_SelectionMgr* mgr = selectionMgr();
@@ -3525,7 +3662,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-  case 9011:
+  case SMESHOp::OpNumberingElements:
     {
       SUIT_OverrideCursor wc;
       LightApp_SelectionMgr* mgr = selectionMgr();
@@ -3541,20 +3678,20 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-  case 501:
-  case 502:
-  case 503:
-  case 504:
-  case 505:
+  case SMESHOp::OpPropertiesLength:
+  case SMESHOp::OpPropertiesArea:
+  case SMESHOp::OpPropertiesVolume:
+  case SMESHOp::OpMinimumDistance:
+  case SMESHOp::OpBoundingBox:
     {
       int page = SMESHGUI_MeasureDlg::MinDistance;
-      if ( theCommandID == 502 )
+      if ( theCommandID == SMESHOp::OpBoundingBox )
         page = SMESHGUI_MeasureDlg::BoundingBox;
-      else if ( theCommandID == 503 )
+      else if ( theCommandID == SMESHOp::OpPropertiesLength )
         page = SMESHGUI_MeasureDlg::Length;
-      else if ( theCommandID == 504 )
+      else if ( theCommandID == SMESHOp::OpPropertiesArea )
         page = SMESHGUI_MeasureDlg::Area;
-      else if ( theCommandID == 505 )
+      else if ( theCommandID == SMESHOp::OpPropertiesVolume )
         page = SMESHGUI_MeasureDlg::Volume;
 
       EmitSignalDeactivateDialog();
@@ -3562,7 +3699,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       dlg->show();
       break;
     }
-  case 41:
+  case SMESHOp::OpSortChild:
     ::sortChildren();
     break;
 
@@ -3690,183 +3827,226 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   // ----- create actions --------------
 
-  //createSMESHAction(  111, "IMPORT_DAT", "", (Qt::CTRL+Qt::Key_B) );
-  createSMESHAction(  112, "IMPORT_UNV", "", (Qt::CTRL+Qt::Key_U) );
-  createSMESHAction(  113, "IMPORT_MED", "", (Qt::CTRL+Qt::Key_M) );
-  createSMESHAction(  114, "NUM" );
-  createSMESHAction(  115, "IMPORT_STL"  );
-  createSMESHAction(  116, "IMPORT_CGNS" );
-  createSMESHAction(  117, "IMPORT_SAUV" );
-  createSMESHAction(  118, "IMPORT_GMF"  );
-  createSMESHAction(  121, "DAT" );
-  createSMESHAction(  122, "MED" );
-  createSMESHAction(  123, "UNV" );
-  createSMESHAction(  140, "STL" );
-  createSMESHAction(  142, "CGNS");
-  createSMESHAction(  144, "SAUV");
-  createSMESHAction(  146, "GMF" );
-  createSMESHAction(  124, "DAT" );
-  createSMESHAction(  125, "MED" );
-  createSMESHAction(  126, "UNV" );
-  createSMESHAction(  141, "STL" );
-  createSMESHAction(  143, "CGNS");
-  createSMESHAction(  145, "SAUV");
-  createSMESHAction(  147, "GMF" );
-  createSMESHAction(  150, "FILE_INFO" );
-  createSMESHAction(   33, "DELETE",          "ICON_DELETE", Qt::Key_Delete );
-  createSMESHAction( 5105, "SEL_FILTER_LIB" );
-  createSMESHAction(  701, "COMPUTE",         "ICON_COMPUTE" );
-  createSMESHAction(  702, "CREATE_MESH",     "ICON_DLG_INIT_MESH" );
-  createSMESHAction(  703, "CREATE_SUBMESH",  "ICON_DLG_ADD_SUBMESH" );
-  createSMESHAction(  704, "EDIT_MESHSUBMESH","ICON_DLG_EDIT_MESH" );
-  createSMESHAction(  705, "COPY_MESH",       "ICON_COPY_MESH" );
-  createSMESHAction(  710, "BUILD_COMPOUND",  "ICON_BUILD_COMPOUND" );
-  createSMESHAction(  711, "PRECOMPUTE",      "ICON_PRECOMPUTE" );
-  createSMESHAction(  712, "EVALUATE",        "ICON_COMPUTE" );
-  createSMESHAction(  713, "MESH_ORDER",      "ICON_COMPUTE" );
-  createSMESHAction(  806, "CREATE_GEO_GROUP","ICON_CREATE_GEO_GROUP" );
-  createSMESHAction(  801, "CREATE_GROUP",    "ICON_CREATE_GROUP" );
-  createSMESHAction(  802, "CONSTRUCT_GROUP", "ICON_CONSTRUCT_GROUP" );
-  createSMESHAction(  803, "EDIT_GROUP",      "ICON_EDIT_GROUP" );
-  createSMESHAction(  815, "EDIT_GEOMGROUP_AS_GROUP", "ICON_EDIT_GROUP" );
-  createSMESHAction(  804, "ADD" );
-  createSMESHAction(  805, "REMOVE" );
-  createSMESHAction(  810, "UN_GROUP",        "ICON_UNION" );
-  createSMESHAction(  811, "INT_GROUP",       "ICON_INTERSECT" );
-  createSMESHAction(  812, "CUT_GROUP",       "ICON_CUT" );
-  createSMESHAction(  814, "UNDERLYING_ELEMS","ICON_UNDERLYING_ELEMS" );
-  createSMESHAction(  813, "DEL_GROUP",       "ICON_DEL_GROUP" );
-  createSMESHAction(  900, "ADV_INFO",        "ICON_ADV_INFO" );
-  //createSMESHAction(  902, "STD_INFO",        "ICON_STD_INFO" );
-  //createSMESHAction(  903, "WHAT_IS",         "ICON_WHAT_IS" ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
-  createSMESHAction(  904, "FIND_ELEM",       "ICON_FIND_ELEM" );
-  createSMESHAction( 6001, "LENGTH",          "ICON_LENGTH",        0, true );
-  createSMESHAction( 6002, "FREE_EDGE",       "ICON_FREE_EDGE",     0, true );
-  createSMESHAction( 6021, "FREE_FACES",      "ICON_FREE_FACES",    0, true );
-  createSMESHAction( 6022, "MAX_ELEMENT_LENGTH_2D",  "ICON_MAX_ELEMENT_LENGTH_2D",   0, true );
-  createSMESHAction( 6023, "MAX_ELEMENT_LENGTH_3D",  "ICON_MAX_ELEMENT_LENGTH_3D",   0, true );
-  createSMESHAction( 6024, "BARE_BORDER_VOLUME",     "ICON_BARE_BORDER_VOLUME",      0, true );
-  createSMESHAction( 6025, "BARE_BORDER_FACE",       "ICON_BARE_BORDER_FACE",        0, true );
-  createSMESHAction( 6026, "OVER_CONSTRAINED_VOLUME","ICON_OVER_CONSTRAINED_VOLUME", 0, true );
-  createSMESHAction( 6027, "OVER_CONSTRAINED_FACE",  "ICON_OVER_CONSTRAINED_FACE",   0, true );
-  createSMESHAction( 6028, "EQUAL_NODE",      "ICON_EQUAL_NODE",    0, true );
-  createSMESHAction( 6029, "EQUAL_EDGE",      "ICON_EQUAL_EDGE",    0, true );
-  createSMESHAction( 6030, "EQUAL_FACE",      "ICON_EQUAL_FACE",    0, true );
-  createSMESHAction( 6031, "EQUAL_VOLUME",    "ICON_EQUAL_VOLUME",  0, true );
-  createSMESHAction( 6032, "OVERALL_MESH_QUALITY" );
-  createSMESHAction( 6003, "FREE_BORDER",     "ICON_FREE_EDGE_2D",  0, true );
-  createSMESHAction( 6004, "CONNECTION",      "ICON_CONNECTION",    0, true );
-  createSMESHAction( 6005, "FREE_NODE",       "ICON_FREE_NODE",     0, true );
-  createSMESHAction( 6011, "AREA",            "ICON_AREA",          0, true );
-  createSMESHAction( 6012, "TAPER",           "ICON_TAPER",         0, true );
-  createSMESHAction( 6013, "ASPECT",          "ICON_ASPECT",        0, true );
-  createSMESHAction( 6014, "MIN_ANG",         "ICON_ANGLE",         0, true );
-  createSMESHAction( 6015, "WARP",            "ICON_WARP",          0, true );
-  createSMESHAction( 6016, "SKEW",            "ICON_SKEW",          0, true );
-  createSMESHAction( 6017, "ASPECT_3D",       "ICON_ASPECT_3D",     0, true );
-  createSMESHAction( 6018, "LENGTH_2D",       "ICON_LENGTH_2D",     0, true );
-  createSMESHAction( 6019, "CONNECTION_2D",   "ICON_CONNECTION_2D", 0, true );
-  createSMESHAction( 6009, "VOLUME_3D",       "ICON_VOLUME_3D",     0, true );
-  createSMESHAction( 4000, "NODE",            "ICON_DLG_NODE" );
-  createSMESHAction( 4009, "ELEM0D",          "ICON_DLG_ELEM0D" );
-  createSMESHAction( 4008, "BALL",            "ICON_DLG_BALL" );
-  createSMESHAction( 4010, "EDGE",            "ICON_DLG_EDGE" );
-  createSMESHAction( 4021, "TRIANGLE",        "ICON_DLG_TRIANGLE" );
-  createSMESHAction( 4022, "QUAD",            "ICON_DLG_QUADRANGLE" );
-  createSMESHAction( 4023, "POLYGON",         "ICON_DLG_POLYGON" );
-  createSMESHAction( 4031, "TETRA",           "ICON_DLG_TETRAS" );
-  createSMESHAction( 4032, "HEXA",            "ICON_DLG_HEXAS" );
-  createSMESHAction( 4133, "PENTA",           "ICON_DLG_PENTA" );
-  createSMESHAction( 4134, "PYRAMID",         "ICON_DLG_PYRAMID" );
-  createSMESHAction( 4135, "OCTA",            "ICON_DLG_OCTA" );
-  createSMESHAction( 4033, "POLYHEDRON",              "ICON_DLG_POLYHEDRON" );
-  createSMESHAction( 4034, "QUADRATIC_EDGE",          "ICON_DLG_QUADRATIC_EDGE" );
-  createSMESHAction( 4035, "QUADRATIC_TRIANGLE",      "ICON_DLG_QUADRATIC_TRIANGLE" );
-  createSMESHAction( 4036, "QUADRATIC_QUADRANGLE",    "ICON_DLG_QUADRATIC_QUADRANGLE" );
-  createSMESHAction( 4136, "BIQUADRATIC_QUADRANGLE",  "ICON_DLG_BIQUADRATIC_QUADRANGLE" );
-  createSMESHAction( 4137, "BIQUADRATIC_TRIANGLE",    "ICON_DLG_BIQUADRATIC_TRIANGLE" );
-  createSMESHAction( 4037, "QUADRATIC_TETRAHEDRON",   "ICON_DLG_QUADRATIC_TETRAHEDRON" );
-  createSMESHAction( 4038, "QUADRATIC_PYRAMID",       "ICON_DLG_QUADRATIC_PYRAMID" );
-  createSMESHAction( 4039, "QUADRATIC_PENTAHEDRON",   "ICON_DLG_QUADRATIC_PENTAHEDRON" );
-  createSMESHAction( 4040, "QUADRATIC_HEXAHEDRON",    "ICON_DLG_QUADRATIC_HEXAHEDRON" );
-  createSMESHAction( 4140, "TRIQUADRATIC_HEXAHEDRON", "ICON_DLG_TRIQUADRATIC_HEXAHEDRON" );
-  createSMESHAction( 4041, "REMOVE_NODES",          "ICON_DLG_REM_NODE" );
-  createSMESHAction( 4042, "REMOVE_ELEMENTS",       "ICON_DLG_REM_ELEMENT" );
-  createSMESHAction( 4044, "REMOVE_ORPHAN_NODES",   "ICON_DLG_REM_ORPHAN_NODES" );
-  createSMESHAction( 4043, "CLEAR_MESH"    ,  "ICON_CLEAR_MESH" );
-  createSMESHAction( 4051, "RENUM_NODES",     "ICON_DLG_RENUMBERING_NODES" );
-  createSMESHAction( 4052, "RENUM_ELEMENTS",  "ICON_DLG_RENUMBERING_ELEMENTS" );
-  createSMESHAction( 4061, "TRANS",           "ICON_SMESH_TRANSLATION_VECTOR" );
-  createSMESHAction( 4062, "ROT",             "ICON_DLG_MESH_ROTATION" );
-  createSMESHAction( 4063, "SYM",             "ICON_SMESH_SYMMETRY_PLANE" );
-  createSMESHAction( 4064, "SEW",             "ICON_SMESH_SEWING_FREEBORDERS" );
-  createSMESHAction( 4065, "MERGE",           "ICON_SMESH_MERGE_NODES" );
-  createSMESHAction( 4066, "MERGE_ELEMENTS",  "ICON_DLG_MERGE_ELEMENTS" );
-  createSMESHAction( 4067, "MESH_THROU_POINT","ICON_DLG_MOVE_NODE" );
-  createSMESHAction( 4068, "SCALE",           "ICON_DLG_MESH_SCALE" );
-  createSMESHAction( 4069, "DUPLICATE_NODES", "ICON_SMESH_DUPLICATE_NODES" );
-  createSMESHAction( 4070, "0D_ON_ALL_NODES", "ICON_0D_ON_ALL_NODES" );
-  createSMESHAction(  407, "INV",             "ICON_DLG_MESH_DIAGONAL" );
-  createSMESHAction(  408, "UNION2",          "ICON_UNION2TRI" );
-  createSMESHAction(  409, "ORIENT",          "ICON_DLG_MESH_ORIENTATION" );
-  createSMESHAction(  410, "UNION",           "ICON_UNIONTRI" );
-  createSMESHAction(  411, "CUT",             "ICON_CUTQUAD" );
-  createSMESHAction(  412, "SMOOTH",          "ICON_DLG_SMOOTHING" );
-  createSMESHAction(  413, "EXTRUSION",       "ICON_EXTRUSION" );
-  createSMESHAction(  414, "REVOLUTION",      "ICON_REVOLUTION" );
-  createSMESHAction(  415, "MAP",             "ICON_MAP" );
-  createSMESHAction(  416, "EXTRUSION_ALONG", "ICON_EXTRUSION_ALONG" );
-  createSMESHAction(  417, "CONV_TO_QUAD",    "ICON_CONV_TO_QUAD" );
-  createSMESHAction(  418, "2D_FROM_3D",      "ICON_2D_FROM_3D" );
-  createSMESHAction(  419, "SPLIT_TO_TETRA",  "ICON_SPLIT_TO_TETRA" );
-  createSMESHAction(  420, "REORIENT_2D",     "ICON_REORIENT_2D" );
-  createSMESHAction(  200, "RESET" );
-  createSMESHAction(  201, "SCALAR_BAR_PROP" );
-  createSMESHAction(  2021, "SAVE_DISTRIBUTION" );
-  createSMESHAction(  2022, "SHOW_DISTRIBUTION","",0, true );
+  //createSMESHAction(  SMESHOp::OpImportDAT, "IMPORT_DAT", "", (Qt::CTRL+Qt::Key_B) );
+  createSMESHAction( SMESHOp::OpImportUNV, "IMPORT_UNV", "", (Qt::CTRL+Qt::Key_I) );
+  createSMESHAction( SMESHOp::OpImportMED, "IMPORT_MED", "", (Qt::CTRL+Qt::Key_M) );
+  createSMESHAction( SMESHOp::OpImportSTL, "IMPORT_STL"  );
+#ifdef WITH_CGNS
+  createSMESHAction( SMESHOp::OpImportCGNS, "IMPORT_CGNS" );
+#endif
+  createSMESHAction( SMESHOp::OpImportSAUV, "IMPORT_SAUV" );
+  createSMESHAction( SMESHOp::OpImportGMF,  "IMPORT_GMF"  );
+  createSMESHAction( SMESHOp::OpPopupImportUNV, "IMPORT_UNV");
+  createSMESHAction( SMESHOp::OpPopupImportMED, "IMPORT_MED");
+  createSMESHAction( SMESHOp::OpPopupImportSTL, "IMPORT_STL"  );
+#ifdef WITH_CGNS
+  createSMESHAction( SMESHOp::OpPopupImportCGNS, "IMPORT_CGNS" );
+#endif
+  createSMESHAction( SMESHOp::OpPopupImportSAUV, "IMPORT_SAUV" );
+  createSMESHAction( SMESHOp::OpPopupImportGMF,  "IMPORT_GMF"  );
+
+  createSMESHAction( SMESHOp::OpExportDAT,  "DAT" );
+  createSMESHAction( SMESHOp::OpExportMED,  "MED" );
+  createSMESHAction( SMESHOp::OpExportUNV,  "UNV" );
+  createSMESHAction( SMESHOp::OpExportSTL,  "STL" );
+#ifdef WITH_CGNS
+  createSMESHAction( SMESHOp::OpExportCGNS, "CGNS");
+#endif
+  createSMESHAction( SMESHOp::OpExportSAUV,     "SAUV");
+  createSMESHAction( SMESHOp::OpExportGMF,      "GMF" );
+  createSMESHAction( SMESHOp::OpPopupExportDAT, "DAT" );
+  createSMESHAction( SMESHOp::OpPopupExportMED, "MED" );
+  createSMESHAction( SMESHOp::OpPopupExportUNV, "UNV" );
+  createSMESHAction( SMESHOp::OpPopupExportSTL, "STL" );
+#ifdef WITH_CGNS
+  createSMESHAction( SMESHOp::OpPopupExportCGNS, "CGNS");
+#endif
+  createSMESHAction( SMESHOp::OpPopupExportSAUV, "SAUV");
+  createSMESHAction( SMESHOp::OpPopupExportGMF,  "GMF" );
+  createSMESHAction( SMESHOp::OpFileInformation, "FILE_INFO" );
+  createSMESHAction( SMESHOp::OpDelete,          "DELETE", "ICON_DELETE", Qt::Key_Delete );
+  createSMESHAction( SMESHOp::OpSelectFiltersLibrary, "SEL_FILTER_LIB" );
+  createSMESHAction( SMESHOp::OpCreateMesh,           "CREATE_MESH",             "ICON_DLG_INIT_MESH" );
+  createSMESHAction( SMESHOp::OpCreateSubMesh,        "CREATE_SUBMESH",          "ICON_DLG_ADD_SUBMESH" );
+  createSMESHAction( SMESHOp::OpEditMeshOrSubMesh,    "EDIT_MESHSUBMESH",        "ICON_DLG_EDIT_MESH" );
+  createSMESHAction( SMESHOp::OpEditMesh,             "EDIT_MESH",               "ICON_DLG_EDIT_MESH" );
+  createSMESHAction( SMESHOp::OpEditSubMesh,          "EDIT_SUBMESH",            "ICON_DLG_EDIT_MESH" );
+  createSMESHAction( SMESHOp::OpBuildCompoundMesh,    "BUILD_COMPOUND",          "ICON_BUILD_COMPOUND" );
+  createSMESHAction( SMESHOp::OpCopyMesh,             "COPY_MESH",               "ICON_COPY_MESH" );
+  createSMESHAction( SMESHOp::OpCompute,              "COMPUTE",                 "ICON_COMPUTE" );
+  createSMESHAction( SMESHOp::OpComputeSubMesh,       "COMPUTE_SUBMESH",         "ICON_COMPUTE" );
+  createSMESHAction( SMESHOp::OpPreCompute,           "PRECOMPUTE",              "ICON_PRECOMPUTE" );
+  createSMESHAction( SMESHOp::OpEvaluate,             "EVALUATE",                "ICON_EVALUATE" );
+  createSMESHAction( SMESHOp::OpMeshOrder,            "MESH_ORDER",              "ICON_MESH_ORDER");
+  createSMESHAction( SMESHOp::OpCreateGroup,          "CREATE_GROUP",            "ICON_CREATE_GROUP" );
+  createSMESHAction( SMESHOp::OpCreateGeometryGroup,  "CREATE_GEO_GROUP",        "ICON_CREATE_GEO_GROUP" );
+  createSMESHAction( SMESHOp::OpConstructGroup,       "CONSTRUCT_GROUP",         "ICON_CONSTRUCT_GROUP" );
+  createSMESHAction( SMESHOp::OpEditGroup,            "EDIT_GROUP",              "ICON_EDIT_GROUP" );
+  createSMESHAction( SMESHOp::OpEditGeomGroupAsGroup, "EDIT_GEOMGROUP_AS_GROUP", "ICON_EDIT_GROUP" );
+  createSMESHAction( SMESHOp::OpUnionGroups,          "UN_GROUP",                "ICON_UNION" );
+  createSMESHAction( SMESHOp::OpIntersectGroups,      "INT_GROUP",               "ICON_INTERSECT" );
+  createSMESHAction( SMESHOp::OpCutGroups,            "CUT_GROUP",               "ICON_CUT" );
+  createSMESHAction( SMESHOp::OpGroupUnderlyingElem,  "UNDERLYING_ELEMS",        "ICON_UNDERLYING_ELEMS" );
+  createSMESHAction( SMESHOp::OpAddElemGroupPopup,    "ADD_TO_GROUP" );
+  createSMESHAction( SMESHOp::OpRemoveElemGroupPopup, "REMOVE_FROM_GROUP" );
+  createSMESHAction( SMESHOp::OpDeleteGroup,          "DEL_GROUP",               "ICON_DEL_GROUP" );
+  createSMESHAction( SMESHOp::OpMeshInformation ,     "ADV_INFO",                "ICON_ADV_INFO" );
+  //createSMESHAction( SMESHOp::OpStdInfo, "STD_INFO",        "ICON_STD_INFO" );
+  //createSMESHAction( SMESHOp::OpWhatIs, "WHAT_IS",         "ICON_WHAT_IS" ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
+  createSMESHAction( SMESHOp::OpFindElementByPoint,   "FIND_ELEM",               "ICON_FIND_ELEM" );
+  //update
+  createSMESHAction( SMESHOp::OpFreeNode,              "FREE_NODE",               "ICON_FREE_NODE",     0, true );
+  createSMESHAction( SMESHOp::OpEqualNode,             "EQUAL_NODE",              "ICON_EQUAL_NODE",    0, true );
+  createSMESHAction( SMESHOp::OpNodeConnectivityNb,    "NODE_CONNECTIVITY_NB",    "ICON_NODE_CONN_NB",    0, true );
+  createSMESHAction( SMESHOp::OpFreeEdge,              "FREE_EDGE",               "ICON_FREE_EDGE",     0, true );
+  createSMESHAction( SMESHOp::OpFreeBorder,            "FREE_BORDER",             "ICON_FREE_EDGE_2D",  0, true );
+  createSMESHAction( SMESHOp::OpLength,                "LENGTH",                  "ICON_LENGTH",        0, true );
+  createSMESHAction( SMESHOp::OpConnection,            "CONNECTION",              "ICON_CONNECTION",    0, true );
+  createSMESHAction( SMESHOp::OpEqualEdge,             "EQUAL_EDGE",              "ICON_EQUAL_EDGE",    0, true );
+  createSMESHAction( SMESHOp::OpFreeFace,              "FREE_FACES",              "ICON_FREE_FACES",    0, true );
+  createSMESHAction( SMESHOp::OpBareBorderFace,        "BARE_BORDER_FACE",        "ICON_BARE_BORDER_FACE",        0, true );
+  createSMESHAction( SMESHOp::OpOverConstrainedFace,   "OVER_CONSTRAINED_FACE",   "ICON_OVER_CONSTRAINED_FACE",   0, true );
+  createSMESHAction( SMESHOp::OpLength2D,              "LENGTH_2D",               "ICON_LENGTH_2D",     0, true );
+  createSMESHAction( SMESHOp::OpConnection2D,          "CONNECTION_2D",           "ICON_CONNECTION_2D", 0, true );
+  createSMESHAction( SMESHOp::OpArea,                  "AREA",                    "ICON_AREA",          0, true );
+  createSMESHAction( SMESHOp::OpTaper,                 "TAPER",                   "ICON_TAPER",         0, true );
+  createSMESHAction( SMESHOp::OpAspectRatio,           "ASPECT",                  "ICON_ASPECT",        0, true );
+  createSMESHAction( SMESHOp::OpMinimumAngle,          "MIN_ANG",                 "ICON_ANGLE",         0, true );
+  createSMESHAction( SMESHOp::OpWarpingAngle,          "WARP",                    "ICON_WARP",          0, true );
+  createSMESHAction( SMESHOp::OpSkew,                  "SKEW",                    "ICON_SKEW",          0, true );
+  createSMESHAction( SMESHOp::OpMaxElementLength2D,    "MAX_ELEMENT_LENGTH_2D",   "ICON_MAX_ELEMENT_LENGTH_2D",   0, true );
+  createSMESHAction( SMESHOp::OpEqualFace,             "EQUAL_FACE",              "ICON_EQUAL_FACE",    0, true );
+  createSMESHAction( SMESHOp::OpAspectRatio3D,         "ASPECT_3D",               "ICON_ASPECT_3D",     0, true );
+  createSMESHAction( SMESHOp::OpVolume,                "VOLUME_3D",               "ICON_VOLUME_3D",     0, true );
+  createSMESHAction( SMESHOp::OpMaxElementLength3D,    "MAX_ELEMENT_LENGTH_3D",   "ICON_MAX_ELEMENT_LENGTH_3D",   0, true );
+  createSMESHAction( SMESHOp::OpBareBorderVolume,      "BARE_BORDER_VOLUME",      "ICON_BARE_BORDER_VOLUME",      0, true );
+  createSMESHAction( SMESHOp::OpOverConstrainedVolume, "OVER_CONSTRAINED_VOLUME", "ICON_OVER_CONSTRAINED_VOLUME", 0, true );
+  createSMESHAction( SMESHOp::OpEqualVolume,           "EQUAL_VOLUME",            "ICON_EQUAL_VOLUME",  0, true );
+  createSMESHAction( SMESHOp::OpOverallMeshQuality,    "OVERALL_MESH_QUALITY",    "ICON_OVL_MESH_QUALITY" );
+
+  createSMESHAction( SMESHOp::OpNode,                   "NODE",            "ICON_DLG_NODE" );
+  createSMESHAction( SMESHOp::OpElem0D,                 "ELEM0D",          "ICON_DLG_ELEM0D" );
+  createSMESHAction( SMESHOp::OpElem0DOnElemNodes,      "0D_ON_ALL_NODES", "ICON_0D_ON_ALL_NODES" );
+  createSMESHAction( SMESHOp::OpBall,                   "BALL",            "ICON_DLG_BALL" );
+  createSMESHAction( SMESHOp::OpEdge,                   "EDGE",            "ICON_DLG_EDGE" );
+  createSMESHAction( SMESHOp::OpTriangle,               "TRIANGLE",        "ICON_DLG_TRIANGLE" );
+  createSMESHAction( SMESHOp::OpQuadrangle,             "QUAD",            "ICON_DLG_QUADRANGLE" );
+  createSMESHAction( SMESHOp::OpPolygon,                "POLYGON",         "ICON_DLG_POLYGON" );
+  createSMESHAction( SMESHOp::OpTetrahedron,            "TETRA",           "ICON_DLG_TETRAS" );
+  createSMESHAction( SMESHOp::OpHexahedron,             "HEXA",            "ICON_DLG_HEXAS" );
+  createSMESHAction( SMESHOp::OpPentahedron,            "PENTA",           "ICON_DLG_PENTA" );
+  createSMESHAction( SMESHOp::OpPyramid ,               "PYRAMID",         "ICON_DLG_PYRAMID" );
+  createSMESHAction( SMESHOp::OpHexagonalPrism,         "OCTA",            "ICON_DLG_OCTA" );
+  createSMESHAction( SMESHOp::OpPolyhedron,             "POLYHEDRON",      "ICON_DLG_POLYHEDRON" );
+  createSMESHAction( SMESHOp::OpQuadraticEdge,          "QUADRATIC_EDGE",          "ICON_DLG_QUADRATIC_EDGE" );
+  createSMESHAction( SMESHOp::OpQuadraticTriangle,      "QUADRATIC_TRIANGLE",      "ICON_DLG_QUADRATIC_TRIANGLE" );
+  createSMESHAction( SMESHOp::OpBiQuadraticTriangle,    "BIQUADRATIC_TRIANGLE",    "ICON_DLG_BIQUADRATIC_TRIANGLE" );
+  createSMESHAction( SMESHOp::OpQuadraticQuadrangle,    "QUADRATIC_QUADRANGLE",    "ICON_DLG_QUADRATIC_QUADRANGLE" );
+  createSMESHAction( SMESHOp::OpBiQuadraticQuadrangle,  "BIQUADRATIC_QUADRANGLE",  "ICON_DLG_BIQUADRATIC_QUADRANGLE" );
+  createSMESHAction( SMESHOp::OpQuadraticPolygon,       "QUADRATIC_POLYGON",       "ICON_DLG_QUADRATIC_POLYGON" );
+  createSMESHAction( SMESHOp::OpQuadraticTetrahedron,   "QUADRATIC_TETRAHEDRON",   "ICON_DLG_QUADRATIC_TETRAHEDRON" );
+  createSMESHAction( SMESHOp::OpQuadraticPyramid,       "QUADRATIC_PYRAMID",       "ICON_DLG_QUADRATIC_PYRAMID" );
+  createSMESHAction( SMESHOp::OpQuadraticPentahedron,   "QUADRATIC_PENTAHEDRON",   "ICON_DLG_QUADRATIC_PENTAHEDRON" );
+  createSMESHAction( SMESHOp::OpQuadraticHexahedron,    "QUADRATIC_HEXAHEDRON",    "ICON_DLG_QUADRATIC_HEXAHEDRON" );
+  createSMESHAction( SMESHOp::OpTriQuadraticHexahedron, "TRIQUADRATIC_HEXAHEDRON", "ICON_DLG_TRIQUADRATIC_HEXAHEDRON" );
+
+  createSMESHAction( SMESHOp::OpRemoveNodes,       "REMOVE_NODES",          "ICON_DLG_REM_NODE" );
+  createSMESHAction( SMESHOp::OpRemoveElements,    "REMOVE_ELEMENTS",       "ICON_DLG_REM_ELEMENT" );
+  createSMESHAction( SMESHOp::OpRemoveOrphanNodes, "REMOVE_ORPHAN_NODES",   "ICON_DLG_REM_ORPHAN_NODES" );
+  createSMESHAction( SMESHOp::OpClearMesh,         "CLEAR_MESH",            "ICON_CLEAR_MESH" );
+
+  //createSMESHAction( SMESHOp::OpRenumberingNodes,    "RENUM_NODES",     "ICON_DLG_RENUMBERING_NODES" );
+  //createSMESHAction( SMESHOp::OpRenumberingElements, "RENUM_ELEMENTS",  "ICON_DLG_RENUMBERING_ELEMENTS" );
+
+  createSMESHAction( SMESHOp::OpTranslation,            "TRANS",           "ICON_SMESH_TRANSLATION_VECTOR" );
+  createSMESHAction( SMESHOp::OpRotation,               "ROT",             "ICON_DLG_MESH_ROTATION" );
+  createSMESHAction( SMESHOp::OpSymmetry,               "SYM",             "ICON_SMESH_SYMMETRY_PLANE" );
+  createSMESHAction( SMESHOp::OpScale,                  "SCALE",           "ICON_DLG_MESH_SCALE" );
+  createSMESHAction( SMESHOp::OpSewing,                 "SEW",             "ICON_SMESH_SEWING_FREEBORDERS" );
+  createSMESHAction( SMESHOp::OpMergeNodes,             "MERGE",           "ICON_SMESH_MERGE_NODES" );
+  createSMESHAction( SMESHOp::OpMergeElements,          "MERGE_ELEMENTS",  "ICON_DLG_MERGE_ELEMENTS" );
+  createSMESHAction( SMESHOp::OpMoveNode,               "MESH_THROU_POINT","ICON_DLG_MOVE_NODE" );
+  createSMESHAction( SMESHOp::OpDuplicateNodes,         "DUPLICATE_NODES", "ICON_SMESH_DUPLICATE_NODES" );
+  createSMESHAction( SMESHOp::OpDiagonalInversion,      "INV",             "ICON_DLG_MESH_DIAGONAL" );
+  createSMESHAction( SMESHOp::OpUnionOfTwoTriangle,     "UNION2",          "ICON_UNION2TRI" );
+  createSMESHAction( SMESHOp::OpOrientation,            "ORIENT",          "ICON_DLG_MESH_ORIENTATION" );
+  createSMESHAction( SMESHOp::OpReorientFaces,          "REORIENT_2D",     "ICON_REORIENT_2D" );
+  createSMESHAction( SMESHOp::OpUnionOfTriangles,       "UNION",           "ICON_UNIONTRI" );
+  createSMESHAction( SMESHOp::OpCuttingOfQuadrangles,   "CUT",             "ICON_CUTQUAD" );
+  createSMESHAction( SMESHOp::OpSplitVolumes,           "SPLIT_TO_TETRA",  "ICON_SPLIT_TO_TETRA" );
+  createSMESHAction( SMESHOp::OpSplitBiQuadratic,       "SPLIT_BIQUAD",    "ICON_SPLIT_BIQUAD" );
+  createSMESHAction( SMESHOp::OpSmoothing,              "SMOOTH",          "ICON_DLG_SMOOTHING" );
+  createSMESHAction( SMESHOp::OpExtrusion,              "EXTRUSION",       "ICON_EXTRUSION" );
+  createSMESHAction( SMESHOp::OpExtrusionAlongAPath,    "EXTRUSION_ALONG", "ICON_EXTRUSION_ALONG" );
+  createSMESHAction( SMESHOp::OpRevolution,             "REVOLUTION",      "ICON_REVOLUTION" );
+  createSMESHAction( SMESHOp::OpPatternMapping,         "MAP",             "ICON_MAP" );
+  createSMESHAction( SMESHOp::OpConvertMeshToQuadratic, "CONV_TO_QUAD",    "ICON_CONV_TO_QUAD" );
+  createSMESHAction( SMESHOp::OpCreateBoundaryElements, "2D_FROM_3D",      "ICON_2D_FROM_3D" );
+
+  createSMESHAction( SMESHOp::OpReset,               "RESET" );
+  createSMESHAction( SMESHOp::OpScalarBarProperties, "SCALAR_BAR_PROP" );
+  createSMESHAction( SMESHOp::OpShowScalarBar,       "SHOW_SCALAR_BAR","",0, true  );
+  createSMESHAction( SMESHOp::OpSaveDistribution,    "SAVE_DISTRIBUTION" );
+  createSMESHAction( SMESHOp::OpShowDistribution,    "SHOW_DISTRIBUTION","",0, true );
 #ifndef DISABLE_PLOT2DVIEWER
-  createSMESHAction(  2023, "PLOT_DISTRIBUTION" );
+  createSMESHAction( SMESHOp::OpPlotDistribution, "PLOT_DISTRIBUTION" );
 #endif
-  createSMESHAction(  211, "WIRE",           "ICON_WIRE", 0, true );
-  createSMESHAction(  212, "SHADE",          "ICON_SHADE", 0, true );
-  createSMESHAction(  213, "SHRINK",         "ICON_SHRINK", 0, true );
-  createSMESHAction(  214, "UPDATE",         "ICON_UPDATE" );
-  createSMESHAction(  215, "NODES",          "ICON_POINTS", 0, true );
-  createSMESHAction(  222, "BALLS",          "ICON_DLG_BALL", 0, true );
-  createSMESHAction(  216, "ELEMS0D",        "ICON_DLG_ELEM0D", 0, true );
-  createSMESHAction(  217, "EDGES",          "ICON_DLG_EDGE", 0, true );
-  createSMESHAction(  218, "FACES",          "ICON_DLG_TRIANGLE", 0, true );
-  createSMESHAction(  219, "VOLUMES",        "ICON_DLG_TETRAS", 0, true );
-  createSMESHAction(  220, "ALL" );
-  createSMESHAction(  221, "FACE_ORIENTATION", "", 0, true );
-
-  createSMESHAction(  231, "LINE_REPRESENTATION", "", 0, true );
-  createSMESHAction(  232, "ARC_REPRESENTATION", "", 0, true );
-
-  createSMESHAction( 1100, "EDIT_HYPO" );
-  createSMESHAction( 1102, "UNASSIGN" );
-  createSMESHAction( 9010, "NUM_NODES", "", 0, true );
-  createSMESHAction( 9011, "NUM_ELEMENTS", "", 0, true );
-  createSMESHAction( 1131, "DISPMODE" );
-  createSMESHAction( 1132, "COLORS" );
-  createSMESHAction( 1133, "TRANSP" );
-  createSMESHAction( 1134, "CLIP" );
-  createSMESHAction( 1135, "DISP_ENT" );
-  createSMESHAction( 1136, "AUTO_COLOR" );
-  createSMESHAction( 1137, "DISABLE_AUTO_COLOR" );
-  createSMESHAction( 2000, "CTRL" );
-
-  createSMESHAction( 501, "MEASURE_MIN_DIST", "ICON_MEASURE_MIN_DIST" );
-  createSMESHAction( 502, "MEASURE_BND_BOX",  "ICON_MEASURE_BND_BOX" );
-  createSMESHAction( 503, "MEASURE_LENGTH",   "ICON_MEASURE_LENGTH" );
-  createSMESHAction( 504, "MEASURE_AREA",     "ICON_MEASURE_AREA" );
-  createSMESHAction( 505, "MEASURE_VOLUME",   "ICON_MEASURE_VOLUME" );
-
-  createSMESHAction( 300, "HIDE" );
-  createSMESHAction( 301, "SHOW" );
-  createSMESHAction( 302, "DISPLAY_ONLY" );
-
-  createSMESHAction( 41, "SORT_CHILD_ITEMS" );
+  createSMESHAction( SMESHOp::OpDMWireframe,  "WIRE",    "ICON_WIRE", 0, true );
+  createSMESHAction( SMESHOp::OpDMShading,    "SHADE",   "ICON_SHADE", 0, true );
+  createSMESHAction( SMESHOp::OpDMNodes,      "NODES",   "ICON_POINTS", 0, true );
+  createSMESHAction( SMESHOp::OpDMShrink,     "SHRINK",  "ICON_SHRINK", 0, true );
+  createSMESHAction( SMESHOp::OpUpdate,       "UPDATE",  "ICON_UPDATE" );
+  createSMESHAction( SMESHOp::OpDE0DElements, "ELEMS0D", "ICON_DLG_ELEM0D", 0, true );
+  createSMESHAction( SMESHOp::OpDEEdges,      "EDGES",   "ICON_DLG_EDGE", 0, true );
+  createSMESHAction( SMESHOp::OpDEFaces,      "FACES",   "ICON_DLG_TRIANGLE", 0, true );
+  createSMESHAction( SMESHOp::OpDEVolumes,    "VOLUMES", "ICON_DLG_TETRAS", 0, true );
+  createSMESHAction( SMESHOp::OpDEBalls,      "BALLS",   "ICON_DLG_BALL", 0, true );
+  createSMESHAction( SMESHOp::OpDEChoose,     "CHOOSE",  "ICON_DLG_CHOOSE", 0, false );
+  createSMESHAction( SMESHOp::OpDEAllEntity,  "ALL",     "ICON_DLG_CHOOSE_ALL", 0, false );
+  createSMESHAction( SMESHOp::OpOrientationOnFaces, "FACE_ORIENTATION", "", 0, true );
+
+  createSMESHAction( SMESHOp::OpRepresentationLines, "LINE_REPRESENTATION", "", 0, true );
+  createSMESHAction( SMESHOp::OpRepresentationArcs,  "ARC_REPRESENTATION", "", 0, true );
+
+  createSMESHAction( SMESHOp::OpEditHypothesis,    "EDIT_HYPO" );
+  createSMESHAction( SMESHOp::OpUnassign,          "UNASSIGN" );
+  createSMESHAction( SMESHOp::OpNumberingNodes,    "NUM_NODES", "", 0, true );
+  createSMESHAction( SMESHOp::OpNumberingElements, "NUM_ELEMENTS", "", 0, true );
+  createSMESHAction( SMESHOp::OpProperties,   "COLORS" );
+  createSMESHAction( SMESHOp::OpTransparency, "TRANSP" );
+  createSMESHAction( SMESHOp::OpClipping,     "CLIP" );
+  createSMESHAction( SMESHOp::OpAutoColor,        "AUTO_COLOR" );
+  createSMESHAction( SMESHOp::OpDisableAutoColor, "DISABLE_AUTO_COLOR" );
+
+  createSMESHAction( SMESHOp::OpMinimumDistance,  "MEASURE_MIN_DIST", "ICON_MEASURE_MIN_DIST" );
+  createSMESHAction( SMESHOp::OpBoundingBox,      "MEASURE_BND_BOX",  "ICON_MEASURE_BND_BOX" );
+  createSMESHAction( SMESHOp::OpPropertiesLength, "MEASURE_LENGTH",   "ICON_MEASURE_LENGTH" );
+  createSMESHAction( SMESHOp::OpPropertiesArea,   "MEASURE_AREA",     "ICON_MEASURE_AREA" );
+  createSMESHAction( SMESHOp::OpPropertiesVolume, "MEASURE_VOLUME",   "ICON_MEASURE_VOLUME" );
+
+  createSMESHAction( SMESHOp::OpHide,     "HIDE", "ICON_HIDE" );
+  createSMESHAction( SMESHOp::OpShow,     "SHOW", "ICON_SHOW" );
+  createSMESHAction( SMESHOp::OpShowOnly, "DISPLAY_ONLY" );
+
+  createSMESHAction( SMESHOp::OpSortChild, "SORT_CHILD_ITEMS" );
+
+  QList<int> aCtrlActions;
+  aCtrlActions << SMESHOp::OpFreeNode << SMESHOp::OpEqualNode
+               << SMESHOp::OpNodeConnectivityNb                                         // node controls
+               << SMESHOp::OpFreeEdge << SMESHOp::OpFreeBorder
+               << SMESHOp::OpLength << SMESHOp::OpConnection << SMESHOp::OpEqualEdge    // edge controls
+               << SMESHOp::OpFreeFace << SMESHOp::OpLength2D << SMESHOp::OpConnection2D
+               << SMESHOp::OpArea << SMESHOp::OpTaper << SMESHOp::OpAspectRatio
+               << SMESHOp::OpMinimumAngle << SMESHOp::OpWarpingAngle << SMESHOp::OpSkew
+               << SMESHOp::OpMaxElementLength2D << SMESHOp::OpBareBorderFace
+               << SMESHOp::OpOverConstrainedFace << SMESHOp::OpEqualFace                // face controls
+               << SMESHOp::OpAspectRatio3D << SMESHOp::OpVolume
+               << SMESHOp::OpMaxElementLength3D << SMESHOp::OpBareBorderVolume
+               << SMESHOp::OpOverConstrainedVolume << SMESHOp::OpEqualVolume;           // volume controls
+  QActionGroup* aCtrlGroup = new QActionGroup( application()->desktop() );
+  aCtrlGroup->setExclusive( true );
+  for( int i = 0; i < aCtrlActions.size(); i++ )
+    aCtrlGroup->addAction( action( aCtrlActions[i] ) );
 
   // ----- create menu --------------
   int fileId    = createMenu( tr( "MEN_FILE" ),    -1,  1 ),
@@ -3880,323 +4060,340 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   createMenu( separator(), fileId );
 
+  QMenu* nodeMenu = new QMenu(); QMenu* edgeMenu = new QMenu();
+  QMenu* faceMenu = new QMenu(); QMenu* volumeMenu = new QMenu();
   int importId = createMenu( tr( "MEN_IMPORT" ), fileId, -1, 10 ),
       exportId = createMenu( tr( "MEN_EXPORT" ), fileId, -1, 10 ),
-      nodeId   = createMenu( tr( "MEN_NODE_CTRL" ), ctrlId, -1, 10 ),
-      edgeId   = createMenu( tr( "MEN_EDGE_CTRL" ), ctrlId, -1, 10 ),
-      faceId   = createMenu( tr( "MEN_FACE_CTRL" ), ctrlId, -1, 10 ),
-      volumeId = createMenu( tr( "MEN_VOLUME_CTRL" ), ctrlId, -1, 10 ),
+      nodeId   = createMenu( tr( "MEN_NODE_CTRL" ), ctrlId, -1, 10, -1, nodeMenu ),
+      edgeId   = createMenu( tr( "MEN_EDGE_CTRL" ), ctrlId, -1, 10, -1, edgeMenu ),
+      faceId   = createMenu( tr( "MEN_FACE_CTRL" ), ctrlId, -1, 10, -1, faceMenu ),
+      volumeId = createMenu( tr( "MEN_VOLUME_CTRL" ), ctrlId, -1, 10, -1, volumeMenu ),
       addId    = createMenu( tr( "MEN_ADD" ),    modifyId, 402 ),
       removeId = createMenu( tr( "MEN_REMOVE" ), modifyId, 403 ),
-      renumId  = createMenu( tr( "MEN_RENUM" ),  modifyId, 404 ),
+    //renumId  = createMenu( tr( "MEN_RENUM" ),  modifyId, 404 ),
       transfId = createMenu( tr( "MEN_TRANSF" ), modifyId, 405 ),
       basicPropId = createMenu( tr( "MEN_BASIC_PROPERTIES" ), measureId, -1, 10 );
 
-  //createMenu( 111, importId, -1 );
-  createMenu( 112, importId, -1 );
-  createMenu( 113, importId, -1 );
-  createMenu( 115, importId, -1 );
+  //createMenu( SMESHOp::OpImportDAT, importId, -1 );
+  createMenu( SMESHOp::OpImportUNV,  importId, -1 );
+  createMenu( SMESHOp::OpImportMED,  importId, -1 );
+  createMenu( SMESHOp::OpImportSTL,  importId, -1 );
 #ifdef WITH_CGNS
-  createMenu( 116, importId, -1 );
+  createMenu( SMESHOp::OpImportCGNS, importId, -1 );
 #endif
-  createMenu( 117, importId, -1 );
-  createMenu( 118, importId, -1 );
-  createMenu( 121, exportId, -1 );
-  createMenu( 122, exportId, -1 );
-  createMenu( 123, exportId, -1 );
-  createMenu( 140, exportId, -1 ); // export to STL
+  createMenu( SMESHOp::OpImportSAUV, importId, -1 );
+  createMenu( SMESHOp::OpImportGMF,  importId, -1 );
+  createMenu( SMESHOp::OpExportDAT,  exportId, -1 );
+  createMenu( SMESHOp::OpExportMED,  exportId, -1 );
+  createMenu( SMESHOp::OpExportUNV,  exportId, -1 );
+  createMenu( SMESHOp::OpExportSTL,  exportId, -1 );
 #ifdef WITH_CGNS
-  createMenu( 142, exportId, -1 ); // export to CGNS
+  createMenu( SMESHOp::OpExportCGNS, exportId, -1 );
 #endif
-  createMenu( 144, exportId, -1 ); // export to SAUV
-  createMenu( 146, exportId, -1 ); // export to GMF
+  createMenu( SMESHOp::OpExportSAUV, exportId, -1 );
+  createMenu( SMESHOp::OpExportGMF,  exportId, -1 );
   createMenu( separator(), fileId, 10 );
 
-  createMenu( 33, editId, -1 );
-
-  createMenu( 5105, toolsId, -1 );
-
-  createMenu( 702, meshId, -1 ); // "Mesh" menu
-  createMenu( 703, meshId, -1 );
-  createMenu( 704, meshId, -1 );
-  createMenu( 710, meshId, -1 );
-  createMenu( 705, meshId, -1 );
-  createMenu( separator(), meshId, -1 );
-  createMenu( 701, meshId, -1 );
-  createMenu( 711, meshId, -1 );
-  createMenu( 712, meshId, -1 );
-  createMenu( 713, meshId, -1 );
-  createMenu( separator(), meshId, -1 );
-  createMenu( 801, meshId, -1 );
-  createMenu( 806, meshId, -1 );
-  createMenu( 802, meshId, -1 );
-  createMenu( 803, meshId, -1 );
-  createMenu( 815, meshId, -1 );
-  createMenu( separator(), meshId, -1 );
-  createMenu( 810, meshId, -1 );
-  createMenu( 811, meshId, -1 );
-  createMenu( 812, meshId, -1 );
-  createMenu( separator(), meshId, -1 );
-  createMenu( 814, meshId, -1 );
-  createMenu( separator(), meshId, -1 );
-  createMenu( 900, meshId, -1 );
-  //createMenu( 902, meshId, -1 );
-  //createMenu( 903, meshId, -1 ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
-  createMenu( 904, meshId, -1 );
-  createMenu( separator(), meshId, -1 );
-
-  createMenu( 6005, nodeId, -1 );
-  createMenu( 6028, nodeId, -1 );
-  createMenu( 6002, edgeId, -1 );
-  createMenu( 6003, edgeId, -1 );
-  createMenu( 6001, edgeId, -1 );
-  createMenu( 6004, edgeId, -1 );
-  createMenu( 6029, edgeId, -1 );
-  createMenu( 6021, faceId, -1 );
-  createMenu( 6025, faceId, -1 );
-  createMenu( 6027, faceId, -1 );
-  createMenu( 6018, faceId, -1 );
-  createMenu( 6019, faceId, -1 );
-  createMenu( 6011, faceId, -1 );
-  createMenu( 6012, faceId, -1 );
-  createMenu( 6013, faceId, -1 );
-  createMenu( 6014, faceId, -1 );
-  createMenu( 6015, faceId, -1 );
-  createMenu( 6016, faceId, -1 );
-  createMenu( 6022, faceId, -1 );
-  createMenu( 6030, faceId, -1 );
-  createMenu( 6017, volumeId, -1 );
-  createMenu( 6009, volumeId, -1 );
-  createMenu( 6023, volumeId, -1 );
-  createMenu( 6024, volumeId, -1 );
-  createMenu( 6026, volumeId, -1 );
-  createMenu( 6031, volumeId, -1 );
-  createMenu( separator(), ctrlId, -1 );
-  createMenu( 6032, ctrlId, -1 );
-
-  createMenu( 4000, addId, -1 );
-  createMenu( 4009, addId, -1 );
-  createMenu( 4070, addId, -1 );
-  createMenu( 4008, addId, -1 );
-  createMenu( 4010, addId, -1 );
-  createMenu( 4021, addId, -1 );
-  createMenu( 4022, addId, -1 );
-  createMenu( 4023, addId, -1 );
-  createMenu( 4031, addId, -1 );
-  createMenu( 4032, addId, -1 );
-  createMenu( 4133, addId, -1 );
-  createMenu( 4134, addId, -1 );
-  createMenu( 4135, addId, -1 );
-  createMenu( 4033, addId, -1 );
-  createMenu( separator(), addId, -1 );
-  createMenu( 4034, addId, -1 );
-  createMenu( 4035, addId, -1 );
-  createMenu( 4137, addId, -1 );
-  createMenu( 4036, addId, -1 );
-  createMenu( 4136, addId, -1 );
-  createMenu( 4037, addId, -1 );
-  createMenu( 4038, addId, -1 );
-  createMenu( 4039, addId, -1 );
-  createMenu( 4040, addId, -1 );
-  createMenu( 4140, addId, -1 );
-
-  createMenu( 4041, removeId, -1 );
-  createMenu( 4042, removeId, -1 );
-  createMenu( 4044, removeId, -1 );
-  createMenu( separator(), removeId, -1 );
-  createMenu( 813, removeId, -1 );
-  createMenu( separator(), removeId, -1 );
-  createMenu( 4043, removeId, -1 );
-
-  createMenu( 4051, renumId, -1 );
-  createMenu( 4052, renumId, -1 );
-
-  createMenu( 4061, transfId, -1 );
-  createMenu( 4062, transfId, -1 );
-  createMenu( 4063, transfId, -1 );
-  createMenu( 4068, transfId, -1 );
-  createMenu( 4064, transfId, -1 );
-  createMenu( 4065, transfId, -1 );
-  createMenu( 4066, transfId, -1 );
-  createMenu( 4069, transfId, -1 );
-
-  createMenu( 4067,modifyId, -1 );
-  createMenu( 407, modifyId, -1 );
-  createMenu( 408, modifyId, -1 );
-  createMenu( 409, modifyId, -1 );
-  createMenu( 420, modifyId, -1 );
-  createMenu( 410, modifyId, -1 );
-  createMenu( 411, modifyId, -1 );
-  createMenu( 419, modifyId, -1 );
-  createMenu( 412, modifyId, -1 );
-  createMenu( 413, modifyId, -1 );
-  createMenu( 416, modifyId, -1 );
-  createMenu( 414, modifyId, -1 );
-  createMenu( 415, modifyId, -1 );
-  createMenu( 417, modifyId, -1 );
-  createMenu( 418, modifyId, -1 );
-
-  createMenu( 501, measureId, -1 );
-  createMenu( 502, measureId, -1 );
-  createMenu( 503, basicPropId, -1 );
-  createMenu( 504, basicPropId, -1 );
-  createMenu( 505, basicPropId, -1 );
-  createMenu( 214, viewId, -1 );
+  createMenu( SMESHOp::OpDelete, editId, -1 );
+
+  createMenu( SMESHOp::OpSelectFiltersLibrary, toolsId, -1 );
+
+  createMenu( SMESHOp::OpCreateMesh,           meshId, -1 ); // "Mesh" menu
+  createMenu( SMESHOp::OpCreateSubMesh,        meshId, -1 );
+  createMenu( SMESHOp::OpEditMeshOrSubMesh,    meshId, -1 );
+  createMenu( SMESHOp::OpBuildCompoundMesh,    meshId, -1 );
+  createMenu( SMESHOp::OpCopyMesh,             meshId, -1 );
+  createMenu( separator(),                     meshId, -1 );
+  createMenu( SMESHOp::OpCompute,              meshId, -1 );
+  createMenu( SMESHOp::OpPreCompute,           meshId, -1 );
+  createMenu( SMESHOp::OpEvaluate,             meshId, -1 );
+  createMenu( SMESHOp::OpMeshOrder,            meshId, -1 );
+  createMenu( separator(),                     meshId, -1 );
+  createMenu( SMESHOp::OpCreateGroup,          meshId, -1 );
+  createMenu( SMESHOp::OpCreateGeometryGroup,  meshId, -1 );
+  createMenu( SMESHOp::OpConstructGroup,       meshId, -1 );
+  createMenu( SMESHOp::OpEditGroup,            meshId, -1 );
+  createMenu( SMESHOp::OpEditGeomGroupAsGroup, meshId, -1 );
+  createMenu( separator(),                     meshId, -1 );
+  createMenu( SMESHOp::OpUnionGroups,          meshId, -1 );
+  createMenu( SMESHOp::OpIntersectGroups,      meshId, -1 );
+  createMenu( SMESHOp::OpCutGroups,            meshId, -1 );
+  createMenu( separator(),                     meshId, -1 );
+  createMenu( SMESHOp::OpGroupUnderlyingElem,  meshId, -1 );
+  createMenu( separator(),                     meshId, -1 );
+  createMenu( SMESHOp::OpMeshInformation,      meshId, -1 );
+  //createMenu( SMESHOp::OpStdInfo, meshId, -1 );
+  //createMenu( SMESHOp::OpWhatIs, meshId, -1 ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
+  createMenu( SMESHOp::OpFindElementByPoint,   meshId, -1 );
+  createMenu( separator(),                     meshId, -1 );
+
+  createMenu( SMESHOp::OpFreeNode,              nodeId,   -1 );
+  createMenu( SMESHOp::OpEqualNode,             nodeId,   -1 );
+  //createMenu( SMESHOp::OpNodeConnectivityNb,    nodeId,   -1 );
+  createMenu( SMESHOp::OpFreeBorder,            edgeId,   -1 );
+  createMenu( SMESHOp::OpLength,                edgeId,   -1 );
+  createMenu( SMESHOp::OpConnection,            edgeId,   -1 );
+  createMenu( SMESHOp::OpEqualEdge,             edgeId,   -1 );
+  createMenu( SMESHOp::OpFreeEdge,              faceId,   -1 );
+  createMenu( SMESHOp::OpFreeFace,              faceId,   -1 );
+  createMenu( SMESHOp::OpBareBorderFace,        faceId,   -1 );
+  createMenu( SMESHOp::OpOverConstrainedFace,   faceId,   -1 );
+  createMenu( SMESHOp::OpLength2D,              faceId,   -1 );
+  createMenu( SMESHOp::OpConnection2D,          faceId,   -1 );
+  createMenu( SMESHOp::OpArea,                  faceId,   -1 );
+  createMenu( SMESHOp::OpTaper,                 faceId,   -1 );
+  createMenu( SMESHOp::OpAspectRatio,           faceId,   -1 );
+  createMenu( SMESHOp::OpMinimumAngle,          faceId,   -1 );
+  createMenu( SMESHOp::OpWarpingAngle,          faceId,   -1 );
+  createMenu( SMESHOp::OpSkew,                  faceId,   -1 );
+  createMenu( SMESHOp::OpMaxElementLength2D,    faceId,   -1 );
+  createMenu( SMESHOp::OpEqualFace,             faceId,   -1 );
+  createMenu( SMESHOp::OpAspectRatio3D,         volumeId, -1 );
+  createMenu( SMESHOp::OpVolume,                volumeId, -1 );
+  createMenu( SMESHOp::OpMaxElementLength3D,    volumeId, -1 );
+  createMenu( SMESHOp::OpBareBorderVolume,      volumeId, -1 );
+  createMenu( SMESHOp::OpOverConstrainedVolume, volumeId, -1 );
+  createMenu( SMESHOp::OpEqualVolume,           volumeId, -1 );
+  createMenu( separator(),                      ctrlId,   -1 );
+  createMenu( SMESHOp::OpReset,                 ctrlId,   -1 );
+  createMenu( separator(),                      ctrlId,   -1 );
+  createMenu( SMESHOp::OpOverallMeshQuality,    ctrlId,   -1 );
+
+  createMenu( SMESHOp::OpNode,                   addId, -1 );
+  createMenu( SMESHOp::OpElem0D,                 addId, -1 );
+  createMenu( SMESHOp::OpElem0DOnElemNodes,      addId, -1 );
+  createMenu( SMESHOp::OpBall,                   addId, -1 );
+  createMenu( SMESHOp::OpEdge,                   addId, -1 );
+  createMenu( SMESHOp::OpTriangle,               addId, -1 );
+  createMenu( SMESHOp::OpQuadrangle,             addId, -1 );
+  createMenu( SMESHOp::OpPolygon,                addId, -1 );
+  createMenu( SMESHOp::OpTetrahedron,            addId, -1 );
+  createMenu( SMESHOp::OpHexahedron,             addId, -1 );
+  createMenu( SMESHOp::OpPentahedron,            addId, -1 );
+  createMenu( SMESHOp::OpPyramid,                addId, -1 );
+  createMenu( SMESHOp::OpHexagonalPrism,         addId, -1 );
+  createMenu( SMESHOp::OpPolyhedron,             addId, -1 );
+  createMenu( separator(),                       addId, -1 );
+  createMenu( SMESHOp::OpQuadraticEdge,          addId, -1 );
+  createMenu( SMESHOp::OpQuadraticTriangle,      addId, -1 );
+  createMenu( SMESHOp::OpBiQuadraticTriangle ,   addId, -1 );
+  createMenu( SMESHOp::OpQuadraticQuadrangle,    addId, -1 );
+  createMenu( SMESHOp::OpBiQuadraticQuadrangle,  addId, -1 );
+  createMenu( SMESHOp::OpQuadraticPolygon,       addId, -1 );
+  createMenu( SMESHOp::OpQuadraticTetrahedron,   addId, -1 );
+  createMenu( SMESHOp::OpQuadraticPyramid,       addId, -1 );
+  createMenu( SMESHOp::OpQuadraticPentahedron,   addId, -1 );
+  createMenu( SMESHOp::OpQuadraticHexahedron,    addId, -1 );
+  createMenu( SMESHOp::OpTriQuadraticHexahedron, addId, -1 );
+
+  createMenu( SMESHOp::OpRemoveNodes,       removeId, -1 );
+  createMenu( SMESHOp::OpRemoveElements,    removeId, -1 );
+  createMenu( SMESHOp::OpRemoveOrphanNodes, removeId, -1 );
+  createMenu( separator(),                  removeId, -1 );
+  createMenu( SMESHOp::OpDeleteGroup,       removeId, -1 );
+  createMenu( separator(),                  removeId, -1 );
+  createMenu( SMESHOp::OpClearMesh,         removeId, -1 );
+
+  //createMenu( SMESHOp::OpRenumberingNodes,    renumId, -1 );
+  //createMenu( SMESHOp::OpRenumberingElements, renumId, -1 );
+
+  createMenu( SMESHOp::OpTranslation,    transfId, -1 );
+  createMenu( SMESHOp::OpRotation,       transfId, -1 );
+  createMenu( SMESHOp::OpSymmetry,       transfId, -1 );
+  createMenu( SMESHOp::OpScale,          transfId, -1 );
+  createMenu( SMESHOp::OpSewing,         transfId, -1 );
+  createMenu( SMESHOp::OpMergeNodes,     transfId, -1 );
+  createMenu( SMESHOp::OpMergeElements,  transfId, -1 );
+  createMenu( SMESHOp::OpDuplicateNodes, transfId, -1 );
+
+  createMenu( SMESHOp::OpMoveNode,               modifyId, -1 );
+  createMenu( SMESHOp::OpDiagonalInversion,      modifyId, -1 );
+  createMenu( SMESHOp::OpUnionOfTwoTriangle,     modifyId, -1 );
+  createMenu( SMESHOp::OpOrientation,            modifyId, -1 );
+  createMenu( SMESHOp::OpReorientFaces,          modifyId, -1 );
+  createMenu( SMESHOp::OpUnionOfTriangles,       modifyId, -1 );
+  createMenu( SMESHOp::OpCuttingOfQuadrangles,   modifyId, -1 );
+  createMenu( SMESHOp::OpSplitVolumes,           modifyId, -1 );
+  createMenu( SMESHOp::OpSplitBiQuadratic,       modifyId, -1 );
+  createMenu( SMESHOp::OpSmoothing,              modifyId, -1 );
+  createMenu( SMESHOp::OpExtrusion,              modifyId, -1 );
+  createMenu( SMESHOp::OpExtrusionAlongAPath ,   modifyId, -1 );
+  createMenu( SMESHOp::OpRevolution,             modifyId, -1 );
+  createMenu( SMESHOp::OpPatternMapping,         modifyId, -1 );
+  createMenu( SMESHOp::OpConvertMeshToQuadratic, modifyId, -1 );
+  createMenu( SMESHOp::OpCreateBoundaryElements, modifyId, -1 );
+
+  createMenu( SMESHOp::OpMinimumDistance,  measureId,   -1 );
+  createMenu( SMESHOp::OpBoundingBox,      measureId,   -1 );
+  createMenu( SMESHOp::OpPropertiesLength, basicPropId, -1 );
+  createMenu( SMESHOp::OpPropertiesArea,   basicPropId, -1 );
+  createMenu( SMESHOp::OpPropertiesVolume, basicPropId, -1 );
+  createMenu( SMESHOp::OpUpdate,           viewId,      -1 );
+
+  connect( nodeMenu,   SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) );
+  connect( edgeMenu,   SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) );
+  connect( faceMenu,   SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) );
+  connect( volumeMenu, SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) );
 
   // ----- create toolbars --------------
-  int meshTb       = createTool( tr( "TB_MESH" ) ),
-      info         = createTool( tr( "TB_INFO" ) ),
-      groupTb      = createTool( tr( "TB_GROUP" ) ),
-      ctrl0dTb     = createTool( tr( "TB_CTRL0D" ) ),
-      ctrl1dTb     = createTool( tr( "TB_CTRL1D" ) ),
-      ctrl2dTb     = createTool( tr( "TB_CTRL2D" ) ),
-      ctrl3dTb     = createTool( tr( "TB_CTRL3D" ) ),
-      addElemTb    = createTool( tr( "TB_ADD" ) ),
-      addNonElemTb = createTool( tr( "TB_ADDNON" ) ),
-      remTb        = createTool( tr( "TB_REM" ) ),
-      renumbTb     = createTool( tr( "TB_RENUMBER" ) ),  
-      transformTb  = createTool( tr( "TB_TRANSFORM" ) ),  
-      modifyTb     = createTool( tr( "TB_MODIFY" ) ),
-      measuremTb     = createTool( tr( "TB_MEASUREM" ) ),
-      dispModeTb   = createTool( tr( "TB_DISP_MODE" ) );
-
-  createTool( 702, meshTb );
-  createTool( 703, meshTb );
-  createTool( 704, meshTb );
-  createTool( 710, meshTb );
-  createTool( 705, meshTb );
-  createTool( separator(), meshTb );
-  createTool( 701, meshTb );
-  createTool( 711, meshTb );
-  createTool( 712, meshTb );
-  createTool( 713, meshTb );
-
-  createTool( 801, groupTb );
-  createTool( 806, groupTb );
-  createTool( 802, groupTb );
-  createTool( 803, groupTb );
-
-  createTool( 900, info );
-  //createTool( 902, meshTb );
-  //createTool( 903, meshTb ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
-  createTool( 904, info );
-
-  createTool( 6005, ctrl0dTb );
-  createTool( 6028, ctrl0dTb );
-
-  createTool( 6002, ctrl1dTb );
-  createTool( 6003, ctrl1dTb );
-  createTool( 6001, ctrl1dTb );
-  createTool( 6004, ctrl1dTb );
-  createTool( 6029, ctrl1dTb );
-
-  createTool( 6021, ctrl2dTb );
-  createTool( 6025, ctrl2dTb );
-  createTool( 6027, ctrl2dTb );
-  createTool( 6018, ctrl2dTb );
-  createTool( 6019, ctrl2dTb );
-  createTool( 6011, ctrl2dTb );
-  createTool( 6012, ctrl2dTb );
-  createTool( 6013, ctrl2dTb );
-  createTool( 6014, ctrl2dTb );
-  createTool( 6015, ctrl2dTb );
-  createTool( 6016, ctrl2dTb );
-  createTool( 6022, ctrl2dTb );
-  createTool( 6030, ctrl2dTb );
-
-  createTool( 6017, ctrl3dTb );
-  createTool( 6009, ctrl3dTb );
-  createTool( 6023, ctrl3dTb );
-  createTool( 6024, ctrl3dTb );
-  createTool( 6026, ctrl3dTb );
-  createTool( 6031, ctrl3dTb );
-
-  createTool( 4000, addElemTb );
-  createTool( 4009, addElemTb );
-  createTool( 4070, addElemTb );
-  createTool( 4008, addElemTb );
-  createTool( 4010, addElemTb );
-  createTool( 4021, addElemTb );
-  createTool( 4022, addElemTb );
-  createTool( 4023, addElemTb );
-  createTool( 4031, addElemTb );
-  createTool( 4032, addElemTb );
-  createTool( 4133, addElemTb );
-  createTool( 4134, addElemTb );
-  createTool( 4135, addElemTb );
-  createTool( 4033, addElemTb );
-
-  createTool( 4034, addNonElemTb );
-  createTool( 4035, addNonElemTb );
-  createTool( 4137, addNonElemTb );
-  createTool( 4036, addNonElemTb );
-  createTool( 4136, addNonElemTb );
-  createTool( 4037, addNonElemTb );
-  createTool( 4038, addNonElemTb );
-  createTool( 4039, addNonElemTb );
-  createTool( 4040, addNonElemTb );
-  createTool( 4140, addNonElemTb );
-
-  createTool( 4041, remTb );
-  createTool( 4042, remTb );
-  createTool( 4044, remTb );
-  createTool( 4043, remTb );
-
-  createTool( 4051, renumbTb );
-  createTool( 4052, renumbTb );
-
-
-  createTool( 4061, transformTb );
-  createTool( 4062, transformTb );
-  createTool( 4063, transformTb );
-  createTool( 4068, transformTb );
-  createTool( 4064, transformTb );
-  createTool( 4065, transformTb );
-  createTool( 4066, transformTb );
-  createTool( 4069, transformTb );
-
-  createTool( 4067,modifyTb );
-  createTool( 407, modifyTb );
-  createTool( 408, modifyTb );
-  createTool( 409, modifyTb );
-  createTool( 420, modifyTb );
-  createTool( 410, modifyTb );
-  createTool( 411, modifyTb );
-  createTool( 419, modifyTb );
-  createTool( 412, modifyTb );
-  createTool( 413, modifyTb );
-  createTool( 416, modifyTb );
-  createTool( 414, modifyTb );
-  createTool( 415, modifyTb );
-  createTool( 417, modifyTb );
-  createTool( 418, modifyTb );
-
-  createTool( 501, measuremTb );  
-
-  createTool( 214, dispModeTb );
+  int meshTb       = createTool( tr( "TB_MESH" ),      QString( "SMESHMeshToolbar" ) ),
+      info         = createTool( tr( "TB_INFO" ),      QString( "SMESHInformationToolbar" ) ),
+      groupTb      = createTool( tr( "TB_GROUP" ),     QString( "SMESHGroupToolbar" ) ),
+      ctrl0dTb     = createTool( tr( "TB_CTRL0D" ),    QString( "SMESHNodeControlsToolbar" ) ),
+      ctrl1dTb     = createTool( tr( "TB_CTRL1D" ),    QString( "SMESHEdgeControlsToolbar" ) ),
+      ctrl2dTb     = createTool( tr( "TB_CTRL2D" ),    QString( "SMESHFaceControlsToolbar" ) ),
+      ctrl3dTb     = createTool( tr( "TB_CTRL3D" ),    QString( "SMESHVolumeControlsToolbar" ) ),
+      addElemTb    = createTool( tr( "TB_ADD" ),       QString( "SMESHAddElementToolbar" ) ),
+      addNonElemTb = createTool( tr( "TB_ADDNON" ),    QString( "SMESHAddElementToolbar" ) ),
+      remTb        = createTool( tr( "TB_REM" ),       QString( "SMESHRemoveToolbar" ) ),
+    //renumbTb     = createTool( tr( "TB_RENUMBER" ),  QString( "SMESHRenumberingToolbar" ) ),  
+      transformTb  = createTool( tr( "TB_TRANSFORM" ), QString( "SMESHTransformationToolbar" ) ),  
+      modifyTb     = createTool( tr( "TB_MODIFY" ),    QString( "SMESHModificationToolbar" ) ),
+      measuremTb   = createTool( tr( "TB_MEASUREM" ),  QString( "SMESHMeasurementsToolbar" ) ),
+      dispModeTb   = createTool( tr( "TB_DISP_MODE" ), QString( "SMESHDisplayModeToolbar" ) );
+
+  createTool( SMESHOp::OpCreateMesh,        meshTb );
+  createTool( SMESHOp::OpCreateSubMesh,     meshTb );
+  createTool( SMESHOp::OpEditMeshOrSubMesh, meshTb );
+  createTool( SMESHOp::OpBuildCompoundMesh, meshTb );
+  createTool( SMESHOp::OpCopyMesh,          meshTb );
+  createTool( separator(),                  meshTb );
+  createTool( SMESHOp::OpCompute,           meshTb );
+  createTool( SMESHOp::OpPreCompute,        meshTb );
+  createTool( SMESHOp::OpEvaluate,          meshTb );
+  createTool( SMESHOp::OpMeshOrder,         meshTb );
+
+  createTool( SMESHOp::OpCreateGroup,         groupTb );
+  createTool( SMESHOp::OpCreateGeometryGroup, groupTb );
+  createTool( SMESHOp::OpConstructGroup,      groupTb );
+  createTool( SMESHOp::OpEditGroup,           groupTb );
+
+  createTool( SMESHOp::OpMeshInformation,    info );
+  //createTool( SMESHOp::OpStdInfo, meshTb );
+  //createTool( SMESHOp::OpWhatIs, meshTb ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
+  createTool( SMESHOp::OpFindElementByPoint, info );
+
+  createTool( SMESHOp::OpFreeNode,  ctrl0dTb );
+  createTool( SMESHOp::OpEqualNode, ctrl0dTb );
+  //createTool( SMESHOp::OpNodeConnectivityNb, ctrl0dTb );
+
+  createTool( SMESHOp::OpFreeBorder, ctrl1dTb );
+  createTool( SMESHOp::OpLength,     ctrl1dTb );
+  createTool( SMESHOp::OpConnection, ctrl1dTb );
+  createTool( SMESHOp::OpEqualEdge,  ctrl1dTb );
+
+  createTool( SMESHOp::OpFreeEdge,            ctrl2dTb );
+  createTool( SMESHOp::OpFreeFace,            ctrl2dTb );
+  createTool( SMESHOp::OpBareBorderFace,      ctrl2dTb );
+  createTool( SMESHOp::OpOverConstrainedFace, ctrl2dTb );
+  createTool( SMESHOp::OpLength2D,            ctrl2dTb );
+  createTool( SMESHOp::OpConnection2D,        ctrl2dTb );
+  createTool( SMESHOp::OpArea,                ctrl2dTb );
+  createTool( SMESHOp::OpTaper,               ctrl2dTb );
+  createTool( SMESHOp::OpAspectRatio,         ctrl2dTb );
+  createTool( SMESHOp::OpMinimumAngle,        ctrl2dTb );
+  createTool( SMESHOp::OpWarpingAngle,        ctrl2dTb );
+  createTool( SMESHOp::OpSkew,                ctrl2dTb );
+  createTool( SMESHOp::OpMaxElementLength2D,  ctrl2dTb );
+  createTool( SMESHOp::OpEqualFace,           ctrl2dTb );
+
+  createTool( SMESHOp::OpAspectRatio3D,         ctrl3dTb );
+  createTool( SMESHOp::OpVolume,                ctrl3dTb );
+  createTool( SMESHOp::OpMaxElementLength3D,    ctrl3dTb );
+  createTool( SMESHOp::OpBareBorderVolume,      ctrl3dTb );
+  createTool( SMESHOp::OpOverConstrainedVolume, ctrl3dTb );
+  createTool( SMESHOp::OpEqualVolume,           ctrl3dTb );
+
+  createTool( SMESHOp::OpNode,              addElemTb );
+  createTool( SMESHOp::OpElem0D,            addElemTb );
+  createTool( SMESHOp::OpElem0DOnElemNodes, addElemTb );
+  createTool( SMESHOp::OpBall,              addElemTb );
+  createTool( SMESHOp::OpEdge,              addElemTb );
+  createTool( SMESHOp::OpTriangle,          addElemTb );
+  createTool( SMESHOp::OpQuadrangle,        addElemTb );
+  createTool( SMESHOp::OpPolygon,           addElemTb );
+  createTool( SMESHOp::OpTetrahedron,       addElemTb );
+  createTool( SMESHOp::OpHexahedron,        addElemTb );
+  createTool( SMESHOp::OpPentahedron,       addElemTb );
+  createTool( SMESHOp::OpPyramid,           addElemTb );
+  createTool( SMESHOp::OpHexagonalPrism,    addElemTb );
+  createTool( SMESHOp::OpPolyhedron,        addElemTb );
+
+  createTool( SMESHOp::OpQuadraticEdge,          addNonElemTb );
+  createTool( SMESHOp::OpQuadraticTriangle,      addNonElemTb );
+  createTool( SMESHOp::OpBiQuadraticTriangle,    addNonElemTb );
+  createTool( SMESHOp::OpQuadraticQuadrangle,    addNonElemTb );
+  createTool( SMESHOp::OpBiQuadraticQuadrangle,  addNonElemTb );
+  createTool( SMESHOp::OpQuadraticPolygon,       addNonElemTb );
+  createTool( SMESHOp::OpQuadraticTetrahedron,   addNonElemTb );
+  createTool( SMESHOp::OpQuadraticPyramid,       addNonElemTb );
+  createTool( SMESHOp::OpQuadraticPentahedron,   addNonElemTb );
+  createTool( SMESHOp::OpQuadraticHexahedron,    addNonElemTb );
+  createTool( SMESHOp::OpTriQuadraticHexahedron, addNonElemTb );
+
+  createTool( SMESHOp::OpRemoveNodes,       remTb );
+  createTool( SMESHOp::OpRemoveElements,    remTb );
+  createTool( SMESHOp::OpRemoveOrphanNodes, remTb );
+  createTool( SMESHOp::OpClearMesh,         remTb );
+
+  //createTool( SMESHOp::OpRenumberingNodes,    renumbTb );
+  //createTool( SMESHOp::OpRenumberingElements, renumbTb );
+
+  createTool( SMESHOp::OpTranslation,    transformTb );
+  createTool( SMESHOp::OpRotation,       transformTb );
+  createTool( SMESHOp::OpSymmetry,       transformTb );
+  createTool( SMESHOp::OpScale,          transformTb );
+  createTool( SMESHOp::OpSewing,         transformTb );
+  createTool( SMESHOp::OpMergeNodes,     transformTb );
+  createTool( SMESHOp::OpMergeElements,  transformTb );
+  createTool( SMESHOp::OpDuplicateNodes, transformTb );
+
+  createTool( SMESHOp::OpMoveNode,               modifyTb );
+  createTool( SMESHOp::OpDiagonalInversion,      modifyTb );
+  createTool( SMESHOp::OpUnionOfTwoTriangle,     modifyTb );
+  createTool( SMESHOp::OpOrientation,            modifyTb );
+  createTool( SMESHOp::OpReorientFaces,          modifyTb );
+  createTool( SMESHOp::OpUnionOfTriangles,       modifyTb );
+  createTool( SMESHOp::OpCuttingOfQuadrangles,   modifyTb );
+  createTool( SMESHOp::OpSplitVolumes,           modifyTb );
+  createTool( SMESHOp::OpSplitBiQuadratic,       modifyTb );
+  createTool( SMESHOp::OpSmoothing,              modifyTb );
+  createTool( SMESHOp::OpExtrusion,              modifyTb );
+  createTool( SMESHOp::OpExtrusionAlongAPath,    modifyTb );
+  createTool( SMESHOp::OpRevolution,             modifyTb );
+  createTool( SMESHOp::OpPatternMapping,         modifyTb );
+  createTool( SMESHOp::OpConvertMeshToQuadratic, modifyTb );
+  createTool( SMESHOp::OpCreateBoundaryElements, modifyTb );
+
+  createTool( SMESHOp::OpMinimumDistance, measuremTb );
+
+  createTool( SMESHOp::OpUpdate, dispModeTb );
 
   QString lc = "$";        // VSR : instead of QtxPopupSelection::defEquality();
   QString dc = "selcount"; // VSR : instead of QtxPopupSelection::defSelCountParam()
 
   myRules.clear();
-  QString OB = "'ObjectBrowser'",
-          View = "'" + SVTK_Viewer::Type() + "'",
-          pat = "'%1'",
-          mesh    = pat.arg( SMESHGUI_Selection::typeName( SMESH::MESH ) ),
-          group   = pat.arg( SMESHGUI_Selection::typeName( SMESH::GROUP ) ),
-          hypo    = pat.arg( SMESHGUI_Selection::typeName( SMESH::HYPOTHESIS ) ),
-          algo    = pat.arg( SMESHGUI_Selection::typeName( SMESH::ALGORITHM ) ),
-          elems   = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ).
-                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_VERTEX ) ).
-                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_EDGE ) ).
-                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_FACE ) ).
-                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_SOLID ) ).
-                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_COMPOUND ) ).
-                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH ) ),
-          subMesh = elems,
-          mesh_part = mesh + " " + subMesh + " " + group,
-          mesh_group = mesh + " " + group,
-          hyp_alg = hypo + " " + algo;
+  QString
+    OB      = "'ObjectBrowser'",
+    View    = "'" + SVTK_Viewer::Type() + "'",
+    pat     = "'%1'",
+    mesh    = pat.arg( SMESHGUI_Selection::typeName( SMESH::MESH ) ),
+    group   = pat.arg( SMESHGUI_Selection::typeName( SMESH::GROUP ) ),
+    hypo    = pat.arg( SMESHGUI_Selection::typeName( SMESH::HYPOTHESIS ) ),
+    algo    = pat.arg( SMESHGUI_Selection::typeName( SMESH::ALGORITHM ) ),
+    smesh   = pat.arg( SMESHGUI_Selection::typeName( SMESH::COMPONENT ) ),
+    elems   = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ).
+    arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_VERTEX ) ).
+    arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_EDGE ) ).
+    arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_FACE ) ).
+    arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_SOLID ) ).
+    arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_COMPOUND ) ).
+    arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH ) ),
+    subMesh      = elems,
+    mesh_part    = mesh + " " + subMesh + " " + group,
+    mesh_group   = mesh + " " + group,
+    mesh_submesh = mesh + " " + subMesh,
+    hyp_alg      = hypo + " " + algo;
 
   // popup for object browser
   QString
@@ -4205,78 +4402,91 @@ void SMESHGUI::initialize( CAM_Application* app )
     isNotEmpty("numberOfNodes <> 0"),
 
     // has nodes, edges, etc in VISIBLE! actor
-    hasNodes("(numberOfNodes > 0 )"),//&& isVisible)"),
+    hasNodes("(numberOfNodes > 0 ) && hasActor"),
     hasElems("(count( elemTypes ) > 0)"),
     hasDifferentElems("(count( elemTypes ) > 1)"),
+    hasDifferentObjElems("(count( objElemTypes ) > 1)"),
     hasBalls("({'BallElem'} in elemTypes)"),
     hasElems0d("({'Elem0d'} in elemTypes)"),
     hasEdges("({'Edge'} in elemTypes)"),
     hasFaces("({'Face'} in elemTypes)"),
-    hasVolumes("({'Volume'} in elemTypes)");
+    hasVolumes("({'Volume'} in elemTypes)"),
+    hasFacesOrVolumes("(({'Face'} in elemTypes) || ({'Volume'} in elemTypes)) ");
 
-  createPopupItem( 150, OB, mesh, "&& selcount=1 && isImported" );      // FILE INFORMATION
-  createPopupItem( 703, OB, mesh, "&& isComputable");      // CREATE_SUBMESH
-  createPopupItem( 704, OB, mesh, "&& isComputable");      // EDIT_MESHSUBMESH
-  createPopupItem( 704, OB, subMesh, "&& isComputable" );  // EDIT_MESHSUBMESH
-  createPopupItem( 803, OB, group );                       // EDIT_GROUP
-  createPopupItem( 815, OB, group, "&& groupType != 'Group'" ); // EDIT AS STANDALONE
+  createPopupItem( SMESHOp::OpFileInformation,   OB, mesh, "&& selcount=1 && isImported" );
+  createPopupItem( SMESHOp::OpCreateSubMesh,     OB, mesh, "&& hasGeomReference");
+  createPopupItem( SMESHOp::OpEditMesh,          OB, mesh, "&& selcount=1" );
+  createPopupItem( SMESHOp::OpEditSubMesh,       OB, subMesh, "&& selcount=1 && hasGeomReference" );
+  createPopupItem( SMESHOp::OpEditGroup,         OB, group );
+  createPopupItem( SMESHOp::OpEditGeomGroupAsGroup, OB, group, "&& groupType != 'Group'" );
 
   popupMgr()->insert( separator(), -1, 0 );
-  createPopupItem( 701, OB, mesh, "&& isComputable" );     // COMPUTE
-  createPopupItem( 711, OB, mesh, "&& isComputable && isPreComputable" ); // PRECOMPUTE
-  createPopupItem( 712, OB, mesh, "&& isComputable" );     // EVALUATE
-  createPopupItem( 713, OB, mesh, "&& isComputable" );     // MESH ORDER
-  createPopupItem( 214, OB, mesh_part );                   // UPDATE
-  createPopupItem( 900, OB, mesh_part );                   // ADV_INFO
-  createPopupItem( 904, OB, mesh_group );                  // FIND_ELEM
-  createPopupItem( 6032, OB, mesh_part );                  // CTRL_INFO
-  popupMgr()->insert( separator(), -1, 0 );
-  createPopupItem( 801, OB, mesh );                        // CREATE_GROUP
-  createPopupItem( 806, OB, mesh );                        // CREATE_GEO_GROUP
-  createPopupItem( 802, OB, subMesh );                     // CONSTRUCT_GROUP
+  createPopupItem( SMESHOp::OpCompute,           OB, mesh, "&& selcount=1 && isComputable" );
+  createPopupItem( SMESHOp::OpComputeSubMesh,    OB, subMesh, "&& selcount=1 && isComputable" );
+  createPopupItem( SMESHOp::OpPreCompute,        OB, mesh, "&& selcount=1 && isPreComputable" );
+  createPopupItem( SMESHOp::OpEvaluate,          OB, mesh, "&& selcount=1 && isComputable" );
+  createPopupItem( SMESHOp::OpMeshOrder,         OB, mesh, "&& selcount=1 && isComputable && hasGeomReference" );
+  createPopupItem( SMESHOp::OpUpdate,            OB, mesh_part );
+  createPopupItem( SMESHOp::OpMeshInformation,   OB, mesh_part );
+  createPopupItem( SMESHOp::OpFindElementByPoint,OB, mesh_group, "&& selcount=1" );
+  createPopupItem( SMESHOp::OpOverallMeshQuality,OB, mesh_part );
   popupMgr()->insert( separator(), -1, 0 );
-  createPopupItem( 1100, OB, hypo);                        // EDIT HYPOTHESIS
-  createPopupItem( 1102, OB, hyp_alg );                    // REMOVE HYPOTHESIS / ALGORITHMS
+  createPopupItem( SMESHOp::OpCreateGroup,       OB, mesh, "&& selcount=1" );
+  createPopupItem( SMESHOp::OpCreateGeometryGroup, OB, mesh, "&& selcount=1 && hasGeomReference" );
+  createPopupItem( SMESHOp::OpConstructGroup,    OB, subMesh );
   popupMgr()->insert( separator(), -1, 0 );
-  createPopupItem( 4043, OB, mesh );                       // CLEAR_MESH
+  createPopupItem( SMESHOp::OpEditHypothesis,    OB, hypo, "&& isEditableHyp");
+  createPopupItem( SMESHOp::OpUnassign,          OB, hyp_alg );
   popupMgr()->insert( separator(), -1, 0 );
-  createPopupItem( 417, OB, mesh + " " + subMesh );        // convert to quadratic
-  createPopupItem( 418, OB, mesh + " " + group,            // create 2D mesh from 3D
-                   "&& dim>=2");
+  createPopupItem( SMESHOp::OpConvertMeshToQuadratic, OB, mesh_submesh );
+  createPopupItem( SMESHOp::OpCreateBoundaryElements, OB, mesh_group, "&& selcount=1 && dim>=2");
   popupMgr()->insert( separator(), -1, 0 );
+  createPopupItem( SMESHOp::OpClearMesh,              OB, mesh );
+  //popupMgr()->insert( separator(), -1, 0 );
 
   QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( dc );
   QString multiple_non_empty = QString( " && %1>0 && numberOfNodes>0" ).arg( dc );
   QString only_one_2D        = only_one_non_empty + " && dim>1";
 
   int anId = popupMgr()->insert( tr( "MEN_EXPORT" ), -1, -1 );        // EXPORT submenu
-  createPopupItem( 125, OB, mesh_group, multiple_non_empty, anId );   // EXPORT_MED
-  createPopupItem( 126, OB, mesh_group, only_one_non_empty, anId );   // EXPORT_UNV
-  createPopupItem( 141, OB, mesh_group, only_one_2D, anId );          // EXPORT_STL
+  createPopupItem( SMESHOp::OpPopupExportMED,  OB, mesh_group, multiple_non_empty, anId );
+  createPopupItem( SMESHOp::OpPopupExportUNV,  OB, mesh_group, only_one_non_empty, anId );
+  createPopupItem( SMESHOp::OpPopupExportSTL,  OB, mesh_group, only_one_2D, anId );
+#ifdef WITH_CGNS
+  createPopupItem( SMESHOp::OpPopupExportCGNS, OB, mesh_group, multiple_non_empty, anId );
+#endif
+  createPopupItem( SMESHOp::OpPopupExportSAUV, OB, mesh_group, only_one_non_empty, anId );
+  createPopupItem( SMESHOp::OpPopupExportGMF,  OB, mesh_group, only_one_non_empty, anId );
+  createPopupItem( SMESHOp::OpPopupExportDAT,  OB, mesh_group, only_one_non_empty, anId );
+  createPopupItem( SMESHOp::OpDelete,          OB, mesh_part + " " + hyp_alg );
+  createPopupItem( SMESHOp::OpDeleteGroup,     OB, group );
+
+  anId = popupMgr()->insert( tr( "MEN_IMPORT" ), -1, -1 );        // IMPORT submenu
+  createPopupItem( SMESHOp::OpPopupImportMED,  OB, smesh, "", anId );
+  createPopupItem( SMESHOp::OpPopupImportUNV,  OB, smesh, "", anId );
+  createPopupItem( SMESHOp::OpPopupImportSTL,  OB, smesh, "", anId );
 #ifdef WITH_CGNS
-  createPopupItem( 143, OB, mesh_group, multiple_non_empty, anId );   // EXPORT_CGNS
+  createPopupItem( SMESHOp::OpPopupImportCGNS, OB, smesh, "", anId );
 #endif
-  createPopupItem( 145, OB, mesh_group, multiple_non_empty, anId );   // EXPORT_SAUV
-  createPopupItem( 147, OB, mesh_group, multiple_non_empty, anId );   // EXPORT_GMF
-  createPopupItem( 124, OB, mesh_group, multiple_non_empty, anId );   // EXPORT_DAT
-  createPopupItem(  33, OB, mesh_part + " " + hyp_alg );        // DELETE
-  createPopupItem( 813, OB, group );                            // DEL_GROUP with contents
+  createPopupItem( SMESHOp::OpPopupImportSAUV, OB, smesh, "", anId );
+  createPopupItem( SMESHOp::OpPopupImportGMF,  OB, smesh, "", anId );
+  createPopupItem( SMESHOp::OpPopupImportDAT,  OB, smesh, "", anId );
   popupMgr()->insert( separator(), -1, 0 );
 
   // popup for viewer
-  createPopupItem( 803, View, group ); // EDIT_GROUP
-  createPopupItem( 804, View, elems ); // ADD
-  createPopupItem( 805, View, elems ); // REMOVE
+  createPopupItem( SMESHOp::OpEditGroup,            View, group );
+  createPopupItem( SMESHOp::OpAddElemGroupPopup,    View, elems, "&& guiState = 800" );
+  createPopupItem( SMESHOp::OpRemoveElemGroupPopup, View, elems, "&& guiState = 800" );
 
   popupMgr()->insert( separator(), -1, 0 );
-  createPopupItem( 214, View, mesh_part );  // UPDATE
-  createPopupItem( 900, View, mesh_part );  // ADV_INFO
-  createPopupItem( 6032,View, mesh_part );  // CTRL_INFO
-  createPopupItem( 904, View, mesh );       // FIND_ELEM
+  createPopupItem( SMESHOp::OpUpdate,             View, mesh_part );
+  createPopupItem( SMESHOp::OpMeshInformation,    View, mesh_part );
+  createPopupItem( SMESHOp::OpOverallMeshQuality, View, mesh_part );
+  createPopupItem( SMESHOp::OpFindElementByPoint, View, mesh );
   popupMgr()->insert( separator(), -1, 0 );
 
-  createPopupItem( 1136, OB + " " + View, mesh, "&& (not isAutoColor)" ); // AUTO_COLOR
-  createPopupItem( 1137, OB + " " + View, mesh, "&& isAutoColor" );       // DISABLE_AUTO_COLOR
+  createPopupItem( SMESHOp::OpAutoColor,        OB + " " + View, mesh, "&& (not isAutoColor)" );
+  createPopupItem( SMESHOp::OpDisableAutoColor, OB + " " + View, mesh, "&& isAutoColor" );
   popupMgr()->insert( separator(), -1, 0 );
 
   QString aClient = QString( "%1client in {%2}" ).arg( lc ).arg( "'VTKViewer'" );
@@ -4293,13 +4503,13 @@ void SMESHGUI::initialize( CAM_Application* app )
   //-------------------------------------------------
   anId = popupMgr()->insert( tr( "MEN_NUM" ), -1, -1 );
 
-  popupMgr()->insert( action( 9010 ), anId, -1 );
-  popupMgr()->setRule( action( 9010 ), aMeshInVTK + "&& isVisible &&" + hasNodes, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 9010 ), "{'Point'} in labeledTypes", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpNumberingNodes ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpNumberingNodes ), aMeshInVTK + "&& isVisible &&" + hasNodes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpNumberingNodes ), "{'Point'} in labeledTypes", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert( action( 9011 ), anId, -1 );
-  popupMgr()->setRule( action( 9011 ), aMeshInVTK + "&& isVisible &&" + hasElems, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 9011 ), "{'Cell'} in labeledTypes", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpNumberingElements ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpNumberingElements ), aMeshInVTK + "&& isVisible &&" + hasElems, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpNumberingElements ), "{'Cell'} in labeledTypes", QtxPopupMgr::ToggleRule );
 
   popupMgr()->insert( separator(), -1, -1 );
 
@@ -4308,23 +4518,23 @@ void SMESHGUI::initialize( CAM_Application* app )
   //-------------------------------------------------
   anId = popupMgr()->insert( tr( "MEN_DISPMODE" ), -1, -1 );
 
-  popupMgr()->insert( action( 211 ), anId, -1 ); // WIRE
-  popupMgr()->setRule( action( 211 ), aMeshInVTK + "&&" + hasElems, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 211 ), "displayMode = 'eEdge'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpDMWireframe ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpDMWireframe ), aMeshInVTK + "&&" + hasElems, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpDMWireframe ), "displayMode = 'eEdge'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert( action( 212 ), anId, -1 ); // SHADE
-  popupMgr()->setRule( action( 212 ),aMeshInVTK+ "&& (" + hasFaces + "||" + hasVolumes + ")", QtxPopupMgr::VisibleRule);
-  popupMgr()->setRule( action( 212 ), "displayMode = 'eSurface'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpDMShading ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpDMShading ),aMeshInVTK+ "&& (" + hasFaces + "||" + hasVolumes + ")", QtxPopupMgr::VisibleRule);
+  popupMgr()->setRule( action( SMESHOp::OpDMShading ), "displayMode = 'eSurface'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert( action( 215 ), anId, -1 ); // POINTS
-  popupMgr()->setRule( action( 215 ), aMeshInVTK + "&&" + hasNodes, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 215 ), "displayMode = 'ePoint'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpDMNodes ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpDMNodes ), aMeshInVTK + "&&" + hasNodes + "&&" + hasElems, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpDMNodes ), "displayMode = 'ePoint'", QtxPopupMgr::ToggleRule );
 
   popupMgr()->insert( separator(), anId, -1 );
 
-  popupMgr()->insert( action( 213 ), anId, -1 ); // SHRINK
-  popupMgr()->setRule( action( 213 ), aMeshInVTK + "&& shrinkMode <> 'IsNotShrinkable' && displayMode <> 'ePoint'", QtxPopupMgr::VisibleRule);
-  popupMgr()->setRule( action( 213 ), "shrinkMode = 'IsShrunk'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpDMShrink ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpDMShrink ), aMeshInVTK + "&& shrinkMode <> 'IsNotShrinkable' && displayMode <> 'ePoint'", QtxPopupMgr::VisibleRule);
+  popupMgr()->setRule( action( SMESHOp::OpDMShrink ), "shrinkMode = 'IsShrunk'", QtxPopupMgr::ToggleRule );
 
   //-------------------------------------------------
   // Display Entity
@@ -4333,238 +4543,250 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   anId = popupMgr()->insert( tr( "MEN_DISP_ENT" ), -1, -1 );
 
-  popupMgr()->insert( action(216), anId, -1 ); // ELEMS 0D
-  popupMgr()->setRule(action(216), aDiffElemsInVTK + "&& isVisible &&" + hasElems0d, QtxPopupMgr::VisibleRule);
-  popupMgr()->setRule(action(216), "{'Elem0d'} in entityMode", QtxPopupMgr::ToggleRule);
+  popupMgr()->insert( action( SMESHOp::OpDE0DElements ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpDE0DElements ), aDiffElemsInVTK + "&& isVisible &&" + hasElems0d, QtxPopupMgr::VisibleRule);
+  popupMgr()->setRule( action( SMESHOp::OpDE0DElements ), "{'Elem0d'} in entityMode", QtxPopupMgr::ToggleRule);
+
+  popupMgr()->insert( action( SMESHOp::OpDEEdges ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpDEEdges ), aDiffElemsInVTK + "&& isVisible &&" + hasEdges, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpDEEdges ), "{'Edge'} in entityMode", QtxPopupMgr::ToggleRule );
+
+  popupMgr()->insert( action( SMESHOp::OpDEFaces ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpDEFaces ), aDiffElemsInVTK + "&& isVisible &&" + hasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpDEFaces ), "{'Face'} in entityMode", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert( action( 217 ), anId, -1 ); // EDGES
-  popupMgr()->setRule( action( 217 ), aDiffElemsInVTK + "&& isVisible &&" + hasEdges, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 217 ), "{'Edge'} in entityMode", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpDEVolumes ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpDEVolumes ), aDiffElemsInVTK + "&& isVisible &&" + hasVolumes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpDEVolumes ), "{'Volume'} in entityMode", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert( action( 218 ), anId, -1 ); // FACES
-  popupMgr()->setRule( action( 218 ), aDiffElemsInVTK + "&& isVisible &&" + hasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 218 ), "{'Face'} in entityMode", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpDEBalls ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpDEBalls ), aDiffElemsInVTK + "&& isVisible &&" + hasBalls, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpDEBalls ), "{'BallElem'} in entityMode", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert( action( 219 ), anId, -1 ); // VOLUMES
-  popupMgr()->setRule( action( 219 ), aDiffElemsInVTK + "&& isVisible &&" + hasVolumes, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 219 ), "{'Volume'} in entityMode", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( separator(), anId, -1 );
 
-  popupMgr()->insert( action( 222 ), anId, -1 ); // BALLS
-  popupMgr()->setRule( action( 222 ), aDiffElemsInVTK + "&& isVisible &&" + hasBalls, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 222 ), "{'BallElem'} in entityMode", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpDEChoose ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpDEChoose ), aClient + "&& $type in {" + mesh + "} &&" + hasDifferentObjElems, QtxPopupMgr::VisibleRule );
 
   popupMgr()->insert( separator(), anId, -1 );
 
-  popupMgr()->insert( action( 220 ), anId, -1 ); // ALL
-  popupMgr()->setRule( action( 220 ), aDiffElemsInVTK + "&& isVisible && not( elemTypes in entityMode )", QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( action( SMESHOp::OpDEAllEntity ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpDEAllEntity ), aDiffElemsInVTK + "&& isVisible && not( elemTypes in entityMode )", QtxPopupMgr::VisibleRule );
 
 
   //-------------------------------------------------
   // Representation of the 2D Quadratic elements
   //-------------------------------------------------
   anId = popupMgr()->insert( tr( "MEN_QUADRATIC_REPRESENT" ), -1, -1 );
-  popupMgr()->insert( action( 231 ), anId, -1 ); // LINE REPRESENTATION
-  popupMgr()->setRule( action( 231 ), aMeshInVTK + "and isVisible",QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 231 ), "quadratic2DMode = 'eLines'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpRepresentationLines ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpRepresentationLines ), aMeshInVTK + "&& isVisible && isQuadratic",QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpRepresentationLines ), "quadratic2DMode = 'eLines'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert( action( 232 ), anId, -1 ); // ARC REPRESENTATION
-  popupMgr()->setRule( action( 232 ), aMeshInVTK + "and isVisible", QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 232 ), "quadratic2DMode = 'eArcs'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpRepresentationArcs ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpRepresentationArcs ), aMeshInVTK + "&& isVisible && isQuadratic", QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpRepresentationArcs ), "quadratic2DMode = 'eArcs'", QtxPopupMgr::ToggleRule );
 
   //-------------------------------------------------
   // Orientation of faces
   //-------------------------------------------------
-  popupMgr()->insert( action( 221 ), -1, -1 );
-  popupMgr()->setRule( action( 221 ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule);
-  popupMgr()->setRule( action( 221 ), "facesOrientationMode = 'IsOriented'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpOrientationOnFaces ), -1, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpOrientationOnFaces ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule);
+  popupMgr()->setRule( action( SMESHOp::OpOrientationOnFaces ), "facesOrientationMode = 'IsOriented'", QtxPopupMgr::ToggleRule );
 
   //-------------------------------------------------
   // Color / Size
   //-------------------------------------------------
-  popupMgr()->insert( action( 1132 ), -1, -1 );
-  popupMgr()->setRule( action( 1132 ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( action( SMESHOp::OpProperties ), -1, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpProperties ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule );
 
   //-------------------------------------------------
   // Transparency
   //-------------------------------------------------
-  popupMgr()->insert( action( 1133 ), -1, -1 );
-  popupMgr()->setRule( action( 1133 ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( action( SMESHOp::OpTransparency ), -1, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpTransparency ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule );
 
   //-------------------------------------------------
   // Controls
   //-------------------------------------------------
   QString
-    aMeshInVtkHasNodes = aMeshInVTK + "&&" + hasNodes,
-    aMeshInVtkHasEdges = aMeshInVTK + "&&" + hasEdges,
-    aMeshInVtkHasFaces = aMeshInVTK + "&&" + hasFaces,
+    aMeshInVtkHasNodes   = aMeshInVTK + "&&" + hasNodes,
+    aMeshInVtkHasEdges   = aMeshInVTK + "&&" + hasEdges,
+    aMeshInVtkHasFaces   = aMeshInVTK + "&&" + hasFaces,
     aMeshInVtkHasVolumes = aMeshInVTK + "&&" + hasVolumes;
 
   anId = popupMgr()->insert( tr( "MEN_CTRL" ), -1, -1 );
 
-  popupMgr()->insert( action( 200 ), anId, -1 ); // RESET
-  popupMgr()->setRule( action( 200 ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( action( SMESHOp::OpReset ), anId, -1 ); // RESET
+  popupMgr()->setRule( action( SMESHOp::OpReset ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
 
   popupMgr()->insert( separator(), anId, -1 );
 
   int aSubId = popupMgr()->insert( tr( "MEN_NODE_CTRL" ), anId, -1 ); // NODE CONTROLS
 
-  popupMgr()->insert( action( 6005 ), aSubId, -1 ); // FREE_NODE
-  popupMgr()->setRule( action( 6005 ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6005 ), "controlMode = 'eFreeNodes'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpFreeNode ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpFreeNode ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpFreeNode ), "controlMode = 'eFreeNodes'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6028 ), aSubId, -1 ); // EQUAL_NODE
-  popupMgr()->setRule( action( 6028 ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6028 ), "controlMode = 'eCoincidentNodes'", QtxPopupMgr::ToggleRule);
+  popupMgr()->insert ( action( SMESHOp::OpEqualNode ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpEqualNode ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpEqualNode ), "controlMode = 'eCoincidentNodes'", QtxPopupMgr::ToggleRule);
 
-  aSubId = popupMgr()->insert( tr( "MEN_EDGE_CTRL" ), anId, -1 ); // EDGE CONTROLS
+  // popupMgr()->insert( action( SMESHOp::OpNodeConnectivityNb ), aSubId, -1 );
+  // popupMgr()->setRule( action( SMESHOp::OpNodeConnectivityNb ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
+  // popupMgr()->setRule( action( SMESHOp::OpNodeConnectivityNb ), "controlMode = 'eNodeConnectivityNb'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert( action( 6002 ), aSubId, -1 ); // FREE_EDGE
-  popupMgr()->setRule( action( 6002 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6002 ), "controlMode = 'eFreeEdges'", QtxPopupMgr::ToggleRule );
+  aSubId = popupMgr()->insert( tr( "MEN_EDGE_CTRL" ), anId, -1 ); // EDGE CONTROLS
 
-  popupMgr()->insert( action( 6003 ), aSubId, -1 ); // FREE_BORDER
-  popupMgr()->setRule( action( 6003 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6003 ), "controlMode = 'eFreeBorders'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpFreeBorder ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpFreeBorder ), aMeshInVTK + "&&" + hasEdges + "&&" + hasFacesOrVolumes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpFreeBorder ), "controlMode = 'eFreeBorders'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert( action( 6001 ), aSubId, -1 ); // LENGTH
-  popupMgr()->setRule( action( 6001 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6001 ), "controlMode = 'eLength'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpLength ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpLength ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpLength ), "controlMode = 'eLength'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert( action( 6004 ), aSubId, -1 ); // CONNECTION
-  popupMgr()->setRule( action( 6004 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6004 ), "controlMode = 'eMultiConnection'", QtxPopupMgr::ToggleRule );
-  popupMgr()->insert ( action( 6029 ), aSubId, -1 ); // EQUAL_EDGE
-  popupMgr()->setRule( action( 6029 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6029 ), "controlMode = 'eCoincidentElems1D'", QtxPopupMgr::ToggleRule);
+  popupMgr()->insert( action( SMESHOp::OpConnection ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpConnection ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpConnection ), "controlMode = 'eMultiConnection'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpEqualEdge ), aSubId, -1 ); // EQUAL_EDGE
+  popupMgr()->setRule( action( SMESHOp::OpEqualEdge ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpEqualEdge ), "controlMode = 'eCoincidentElems1D'", QtxPopupMgr::ToggleRule);
 
   aSubId = popupMgr()->insert( tr( "MEN_FACE_CTRL" ), anId, -1 ); // FACE CONTROLS
 
-  popupMgr()->insert ( action( 6021 ), aSubId, -1 ); // FREE_FACE
-  popupMgr()->setRule( action( 6021 ), aMeshInVtkHasFaces /*aMeshInVtkHasVolumes*/,
+  popupMgr()->insert( action( SMESHOp::OpFreeEdge ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), "controlMode = 'eFreeEdges'", QtxPopupMgr::ToggleRule );
+
+  popupMgr()->insert ( action( SMESHOp::OpFreeFace ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpFreeFace ), aMeshInVtkHasFaces /*aMeshInVtkHasVolumes*/,
                                        QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6021 ), "controlMode = 'eFreeFaces'", QtxPopupMgr::ToggleRule );
+  popupMgr()->setRule( action( SMESHOp::OpFreeFace ), "controlMode = 'eFreeFaces'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6018 ), aSubId, -1 ); // LENGTH_2D
-  popupMgr()->setRule( action( 6018 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6018 ), "controlMode = 'eLength2D'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpLength2D ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpLength2D ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpLength2D ), "controlMode = 'eLength2D'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6019 ), aSubId, -1 ); // CONNECTION_2D
-  popupMgr()->setRule( action( 6019 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6019 ), "controlMode = 'eMultiConnection2D'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpConnection2D ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpConnection2D ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpConnection2D ), "controlMode = 'eMultiConnection2D'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6011 ), aSubId, -1 ); // AREA
-  popupMgr()->setRule( action( 6011 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6011 ), "controlMode = 'eArea'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpArea ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpArea ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpArea ), "controlMode = 'eArea'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6012 ), aSubId, -1 ); // TAPER
-  popupMgr()->setRule( action( 6012 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6012 ), "controlMode = 'eTaper'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpTaper ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpTaper ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpTaper ), "controlMode = 'eTaper'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6013 ), aSubId, -1 ); // ASPECT
-  popupMgr()->setRule( action( 6013 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6013 ), "controlMode = 'eAspectRatio'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpAspectRatio ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpAspectRatio ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpAspectRatio ), "controlMode = 'eAspectRatio'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6014 ), aSubId, -1 ); // MIN_ANG
-  popupMgr()->setRule( action( 6014 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6014 ), "controlMode = 'eMinimumAngle'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpMinimumAngle ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpMinimumAngle ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpMinimumAngle ), "controlMode = 'eMinimumAngle'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6015 ), aSubId, -1 ); // WARP
-  popupMgr()->setRule( action( 6015 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6015 ), "controlMode = 'eWarping'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpWarpingAngle ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpWarpingAngle ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpWarpingAngle ), "controlMode = 'eWarping'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6016 ), aSubId, -1 ); // SKEW
-  popupMgr()->setRule( action( 6016 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6016 ), "controlMode = 'eSkew'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpSkew ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpSkew ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpSkew ), "controlMode = 'eSkew'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6022 ), aSubId, -1 ); // MAX_ELEMENT_LENGTH_2D
-  popupMgr()->setRule( action( 6022 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6022 ), "controlMode = 'eMaxElementLength2D'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpMaxElementLength2D ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpMaxElementLength2D ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpMaxElementLength2D ), "controlMode = 'eMaxElementLength2D'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6025 ), aSubId, -1 ); // BARE_BORDER_FACE
-  popupMgr()->setRule( action( 6025 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6025 ), "controlMode = 'eBareBorderFace'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpBareBorderFace ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpBareBorderFace ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpBareBorderFace ), "controlMode = 'eBareBorderFace'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6027 ), aSubId, -1 ); // OVER_CONSTRAINED_FACE
-  popupMgr()->setRule( action( 6027 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6027 ), "controlMode = 'eOverConstrainedFace'", QtxPopupMgr::ToggleRule );
-  popupMgr()->insert ( action( 6030 ), aSubId, -1 ); // EQUAL_FACE
-  popupMgr()->setRule( action( 6030 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6030 ), "controlMode = 'eCoincidentElems2D'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpOverConstrainedFace ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpOverConstrainedFace ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpOverConstrainedFace ), "controlMode = 'eOverConstrainedFace'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpEqualFace ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpEqualFace ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpEqualFace ), "controlMode = 'eCoincidentElems2D'", QtxPopupMgr::ToggleRule );
 
   aSubId = popupMgr()->insert( tr( "MEN_VOLUME_CTRL" ), anId, -1 ); // VOLUME CONTROLS
 
-  popupMgr()->insert ( action( 6017 ), aSubId, -1 ); // ASPECT_3D
-  popupMgr()->setRule( action( 6017 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6017 ), "controlMode = 'eAspectRatio3D'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpAspectRatio3D  ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpAspectRatio3D ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpAspectRatio3D ), "controlMode = 'eAspectRatio3D'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6009 ), aSubId, -1 ); // VOLUME_3D
-  popupMgr()->setRule( action( 6009 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6009 ), "controlMode = 'eVolume3D'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpVolume ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpVolume ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpVolume ), "controlMode = 'eVolume3D'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6023 ), aSubId, -1 ); // MAX_ELEMENT_LENGTH_3D
-  popupMgr()->setRule( action( 6023 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6023 ), "controlMode = 'eMaxElementLength3D'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpMaxElementLength3D ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpMaxElementLength3D ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpMaxElementLength3D ), "controlMode = 'eMaxElementLength3D'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6024 ), aSubId, -1 ); // BARE_BORDER_VOLUME
-  popupMgr()->setRule( action( 6024 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6024 ), "controlMode = 'eBareBorderVolume'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpBareBorderVolume ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpBareBorderVolume ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpBareBorderVolume ), "controlMode = 'eBareBorderVolume'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6026 ), aSubId, -1 ); // OVER_CONSTRAINED_VOLUME
-  popupMgr()->setRule( action( 6026 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6026 ), "controlMode = 'eOverConstrainedVolume'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpOverConstrainedVolume ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpOverConstrainedVolume ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpOverConstrainedVolume ), "controlMode = 'eOverConstrainedVolume'", QtxPopupMgr::ToggleRule );
 
-  popupMgr()->insert ( action( 6031 ), aSubId, -1 ); // EQUAL_VOLUME
-  popupMgr()->setRule( action( 6031 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 6031 ), "controlMode = 'eCoincidentElems3D'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( SMESHOp::OpEqualVolume  ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpEqualVolume ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpEqualVolume ), "controlMode = 'eCoincidentElems3D'", QtxPopupMgr::ToggleRule );
 
   popupMgr()->insert( separator(), anId, -1 );
 
-  popupMgr()->insert( action( 201 ), anId, -1 ); // SCALAR_BAR_PROP
-  popupMgr()->setRule( action( 201 ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( action( SMESHOp::OpShowScalarBar ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpShowScalarBar ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpShowScalarBar ), aMeshInVTK + "&& controlMode <> 'eNone' && isScalarBarVisible", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert( action( SMESHOp::OpScalarBarProperties ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpScalarBarProperties ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
 
   popupMgr()->insert( separator(), anId, -1 );
 
   aSubId = popupMgr()->insert( tr( "MEN_DISTRIBUTION_CTRL" ), anId, -1 ); // NODE CONTROLS
 
-  popupMgr()->insert( action( 2021 ), aSubId, -1 ); // SAVE_DISTRIBUTION
-  popupMgr()->setRule( action( 2021 ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( action( SMESHOp::OpSaveDistribution ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpSaveDistribution ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
 
-  popupMgr()->insert( action( 2022 ), aSubId, -1 ); // SHOW_DISTRIBUTION
-  popupMgr()->setRule( action( 2022 ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( 2022 ), aMeshInVTK + "&& isNumFunctor && isDistributionVisible", QtxPopupMgr::ToggleRule);
+  popupMgr()->insert( action( SMESHOp::OpShowDistribution ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpShowDistribution ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpShowDistribution ), aMeshInVTK + "&& isNumFunctor && isScalarBarVisible && isDistributionVisible", QtxPopupMgr::ToggleRule);
 
 #ifndef DISABLE_PLOT2DVIEWER
-  popupMgr()->insert( action( 2023 ), aSubId, -1 ); // PLOT_DISTRIBUTION
-  popupMgr()->setRule( action( 2023 ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( action( SMESHOp::OpPlotDistribution ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpPlotDistribution ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
 #endif
 
   //-------------------------------------------------
-  // Display / Erase
+  // Show / Hide
   //-------------------------------------------------
   popupMgr()->insert( separator(), -1, -1 );
   QString aRule = "$component={'SMESH'} and ( type='Component' or (" + aClient + " and " +
     aType + " and " + aSelCount + " and " + anActiveVTK + " and " + isNotEmpty + " %1 ) )";
-  popupMgr()->insert( action( 301 ), -1, -1 ); // DISPLAY
-  popupMgr()->setRule( action( 301 ), aRule.arg( "and (not isVisible)" ), QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( action( SMESHOp::OpShow ), -1, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpShow ), aRule.arg( "and (not isVisible)" ), QtxPopupMgr::VisibleRule );
 
-  popupMgr()->insert( action( 300 ), -1, -1 ); // ERASE
-  popupMgr()->setRule( action( 300 ), aRule.arg( "and isVisible" ), QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( action( SMESHOp::OpHide ), -1, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpHide ), aRule.arg( "and isVisible" ), QtxPopupMgr::VisibleRule );
 
-  popupMgr()->insert( action( 302 ), -1, -1 ); // DISPLAY_ONLY
-  popupMgr()->setRule( action( 302 ), aRule.arg( "" ), QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( action( SMESHOp::OpShowOnly ), -1, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpShowOnly ), aRule.arg( "" ), QtxPopupMgr::VisibleRule );
 
   popupMgr()->insert( separator(), -1, -1 );
 
   //-------------------------------------------------
   // Clipping
   //-------------------------------------------------
-  popupMgr()->insert( action( 1134 ), -1, -1 );
-  popupMgr()->setRule( action( 1134 ), "client='VTKViewer'", QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( action( SMESHOp::OpClipping ), -1, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpClipping ), "client='VTKViewer'", QtxPopupMgr::VisibleRule );
 
   popupMgr()->insert( separator(), -1, -1 );
 
-  popupMgr()->insert( action( 41 ), -1, -1 );
-  popupMgr()->setRule( action( 41 ), "$component={'SMESH'} and client='ObjectBrowser' and isContainer and nbChildren>1", QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( action( SMESHOp::OpSortChild ), -1, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpSortChild ), "$component={'SMESH'} and client='ObjectBrowser' and isContainer and nbChildren>1", QtxPopupMgr::VisibleRule );
   popupMgr()->insert( separator(), -1, -1 );
 
   connect( application(), SIGNAL( viewManagerActivated( SUIT_ViewManager* ) ),
@@ -4602,7 +4824,7 @@ bool SMESHGUI::isSelectionCompatible()
 bool SMESHGUI::reusableOperation( const int id )
 {
   // compute, evaluate and precompute are not reusable operations
-  return ( id == 701 || id == 711 || id == 712 ) ? false : SalomeApp_Module::reusableOperation( id );
+  return ( id == SMESHOp::OpCompute || id == SMESHOp::OpPreCompute || id == SMESHOp::OpEvaluate ) ? false : SalomeApp_Module::reusableOperation( id );
 }
 
 bool SMESHGUI::activateModule( SUIT_Study* study )
@@ -4614,32 +4836,28 @@ bool SMESHGUI::activateModule( SUIT_Study* study )
 
   // import Python module that manages SMESH plugins (need to be here because SalomePyQt API uses active module)
   PyGILState_STATE gstate = PyGILState_Ensure();
-  PyObjWrapper pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
+  PyObject* pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
   if ( !pluginsmanager ) {
     PyErr_Print();
   }
   else {
-    PyObjWrapper result = PyObject_CallMethod( pluginsmanager, (char*)"initialize", (char*)"isss",1,"smesh",tr("MEN_MESH").toStdString().c_str(),tr("SMESH_PLUGINS_OTHER").toStdString().c_str());
+    PyObject* result = PyObject_CallMethod( pluginsmanager, (char*)"initialize", (char*)"isss",1,"smesh",tr("MEN_MESH").toUtf8().data(),tr("SMESH_PLUGINS_OTHER").toUtf8().data());
     if ( !result )
       PyErr_Print();
+    Py_XDECREF(result);
   }
   PyGILState_Release(gstate);
   // end of SMESH plugins loading
 
   // Reset actions accelerator keys
-  //action(111)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B)); // Import DAT
-  action(112)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_U)); // Import UNV
-  action(113)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M)); // Import MED
-
-  action(  33)->setEnabled(true); // Delete: Key_Delete
+  action(SMESHOp::OpDelete)->setEnabled(true); // Delete: Key_Delete
 
   //  0020210. Make SMESH_Gen update meshes at switching GEOM->SMESH
   GetSMESHGen()->SetCurrentStudy(SALOMEDS::Study::_nil());
-  if ( SalomeApp_Study* s = dynamic_cast<SalomeApp_Study*>( study ))
-    if ( _PTR(Study) aStudy = s->studyDS()) {
+  if ( SalomeApp_Study* s = dynamic_cast<SalomeApp_Study*>( study )) {
+    if ( _PTR(Study) aStudy = s->studyDS() )
       GetSMESHGen()->SetCurrentStudy( _CAST(Study,aStudy)->GetStudy() );
-      updateObjBrowser(); // objects can be removed
-    }
+  }
 
   // get all view currently opened in the study and connect their signals  to
   // the corresponding slots of the class.
@@ -4651,6 +4869,7 @@ bool SMESHGUI::activateModule( SUIT_Study* study )
       connectView( wnd );
   }
 
+  Py_XDECREF(pluginsmanager);
   return res;
 }
 
@@ -4662,17 +4881,15 @@ bool SMESHGUI::deactivateModule( SUIT_Study* study )
   EmitSignalCloseAllDialogs();
 
   // Unset actions accelerator keys
-  //action(111)->setShortcut(QKeySequence()); // Import DAT
-  action(112)->setShortcut(QKeySequence()); // Import UNV
-  action(113)->setShortcut(QKeySequence()); // Import MED
-
-  action(  33)->setEnabled(false); // Delete: Key_Delete
+  action(SMESHOp::OpDelete)->setEnabled(false); // Delete: Key_Delete
 
   return SalomeApp_Module::deactivateModule( study );
 }
 
 void SMESHGUI::studyClosed( SUIT_Study* s )
 {
+  if( !s )
+    return;
   SMESH::RemoveVisuData( s->id() );
   SalomeApp_Module::studyClosed( s );
 }
@@ -4720,7 +4937,7 @@ void SMESHGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& ti
     _PTR(Study) study = appStudy->studyDS();
     _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
     if ( obj ) {
-      QString aName = QString( obj->GetName().c_str() );
+      QString aName = QString( SMESH::fromUtf8(obj->GetName()) );
       while ( aName.at( aName.length() - 1 ) == ' ' ) // Remove extraspaces in Name of Popup
           aName.remove( (aName.length() - 1), 1 );
       title = aName;
@@ -4736,7 +4953,10 @@ LightApp_Selection* SMESHGUI::createSelection() const
 void SMESHGUI::windows( QMap<int, int>& aMap ) const
 {
   aMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
+  aMap.insert( SalomeApp_Application::WT_NoteBook, Qt::LeftDockWidgetArea );
+#ifndef DISABLE_PYCONSOLE
   aMap.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
+#endif
 }
 
 void SMESHGUI::viewManagers( QStringList& list ) const
@@ -4754,6 +4974,7 @@ void SMESHGUI::onViewManagerActivated( SUIT_ViewManager* mgr )
       SUIT_ViewWindow *sf = aViews[i];
       connectView( sf );
     }
+    EmitSignalActivatedViewManager();
   }
 }
 
@@ -4776,7 +4997,7 @@ void SMESHGUI::ProcessEvents( vtkObject* theObject,
                               void* theCallData )
 {
   if( SMESHGUI* aSMESHGUI = reinterpret_cast<SMESHGUI*>( theClientData ) ) {
-    if( theObject && theEvent == SMESH::DeleteActorEvent ) {
+    if( theObject && (int) theEvent == SMESH::DeleteActorEvent ) {
       if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( theObject ) ) {
         SMESHGUI_ClippingPlaneInfoMap& aClippingPlaneInfoMap = aSMESHGUI->getClippingPlaneInfoMap();
         SMESHGUI_ClippingPlaneInfoMap::iterator anIter1 = aClippingPlaneInfoMap.begin();
@@ -4814,20 +5035,7 @@ void SMESHGUI::createPreferences()
   setPreferenceProperty( lim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
   addPreference( tr( "PREF_INCREMENTAL_LIMIT" ), autoUpdate, LightApp_Preferences::Bool, "SMESH", "incremental_limit" );
 
-  int qaGroup = addPreference( tr( "PREF_GROUP_QUALITY" ), genTab );
-  setPreferenceProperty( qaGroup, "columns", 2 );
-  addPreference( tr( "PREF_DISPLAY_ENTITY" ), qaGroup, LightApp_Preferences::Bool, "SMESH", "display_entity" );
-  addPreference( tr( "PREF_PRECISION_USE" ), qaGroup, LightApp_Preferences::Bool, "SMESH", "use_precision" );
-  int prec = addPreference( tr( "PREF_PRECISION_VALUE" ), qaGroup, LightApp_Preferences::IntSpin, "SMESH", "controls_precision" );
-  setPreferenceProperty( prec, "min", 0 );
-  setPreferenceProperty( prec, "max", 16 );
-  int doubleNodesTol = addPreference( tr( "PREF_EQUAL_NODES_TOL" ), qaGroup, LightApp_Preferences::DblSpin, "SMESH", "equal_nodes_tolerance" );
-  setPreferenceProperty( doubleNodesTol, "precision", 10 );
-  setPreferenceProperty( doubleNodesTol, "min", 0.0000000001 );
-  setPreferenceProperty( doubleNodesTol, "max", 1000000.0 );
-  setPreferenceProperty( doubleNodesTol, "step", 0.0000001 );
-
-  int dispgroup = addPreference( tr( "PREF_DISPLAY_MODE" ), genTab );
+  int dispgroup = addPreference( tr( "PREF_DISPLAY_MODE_GROUP" ), genTab );
   setPreferenceProperty( dispgroup, "columns", 2 );
   int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), dispgroup, LightApp_Preferences::Selector, "SMESH", "display_mode" );
   QStringList modes;
@@ -4843,7 +5051,7 @@ void SMESHGUI::createPreferences()
   setPreferenceProperty( dispmode, "strings", modes );
   setPreferenceProperty( dispmode, "indexes", indices );
 
-  int arcgroup = addPreference( tr( "QUADRATIC_REPRESENT_MODE" ), genTab );
+  int arcgroup = addPreference( tr( "QUADRATIC_REPRESENT_MODE_GROUP" ), genTab );
   setPreferenceProperty( arcgroup, "columns", 2 );
   int quadraticmode = addPreference( tr( "QUADRATIC_REPRESENT_MODE" ), arcgroup, LightApp_Preferences::Selector, "SMESH", "quadratic_mode" );
   QStringList quadraticModes;
@@ -4860,11 +5068,24 @@ void SMESHGUI::createPreferences()
   setPreferenceProperty( maxAngle, "min", 1 );
   setPreferenceProperty( maxAngle, "max", 90 );
 
+  int qaGroup = addPreference( tr( "PREF_GROUP_QUALITY" ), genTab );
+  setPreferenceProperty( qaGroup, "columns", 2 );
+  addPreference( tr( "PREF_DISPLAY_ENTITY" ), qaGroup, LightApp_Preferences::Bool, "SMESH", "display_entity" );
+  addPreference( tr( "PREF_PRECISION_USE" ), qaGroup, LightApp_Preferences::Bool, "SMESH", "use_precision" );
+  int prec = addPreference( tr( "PREF_PRECISION_VALUE" ), qaGroup, LightApp_Preferences::IntSpin, "SMESH", "controls_precision" );
+  setPreferenceProperty( prec, "min", 0 );
+  setPreferenceProperty( prec, "max", 100 );
+  int doubleNodesTol = addPreference( tr( "PREF_EQUAL_NODES_TOL" ), qaGroup, LightApp_Preferences::DblSpin, "SMESH", "equal_nodes_tolerance" );
+  setPreferenceProperty( doubleNodesTol, "precision", 10 );
+  setPreferenceProperty( doubleNodesTol, "min", 0.0000000001 );
+  setPreferenceProperty( doubleNodesTol, "max", 1000000.0 );
+  setPreferenceProperty( doubleNodesTol, "step", 0.0000001 );
 
 
   int exportgroup = addPreference( tr( "PREF_GROUP_EXPORT" ), genTab );
   setPreferenceProperty( exportgroup, "columns", 2 );
   addPreference( tr( "PREF_AUTO_GROUPS" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "auto_groups" );
+  addPreference( tr( "PREF_SHOW_WARN" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "show_warning" );
   //addPreference( tr( "PREF_RENUMBER" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "renumbering" );
 
   int computeGroup = addPreference( tr( "PREF_GROUP_COMPUTE" ), genTab );
@@ -4987,7 +5208,8 @@ void SMESHGUI::createPreferences()
   QStringList     aMarkerScaleValuesList;
   for ( int i = VTK::MS_10; i <= VTK::MS_70; i++ ) {
     aMarkerScaleIndicesList << i;
-    aMarkerScaleValuesList  << QString::number( (i-(int)VTK::MS_10)*0.5 + 1.0 );
+    //aMarkerScaleValuesList  << QString::number( (i-(int)VTK::MS_10)*0.5 + 1.0 );
+    aMarkerScaleValuesList  << QString::number( i );
   }
   setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
   setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
@@ -5014,8 +5236,12 @@ void SMESHGUI::createPreferences()
 
   int size0d = addPreference(tr("PREF_SIZE_0D"), elemGroup,
                              LightApp_Preferences::IntSpin, "SMESH", "elem0d_size");
-  int ballSize = addPreference(tr("PREF_BALL_SIZE"), elemGroup,
-                             LightApp_Preferences::IntSpin, "SMESH", "ball_elem_size");
+  /* int ballSize = addPreference(tr("PREF_BALL_SIZE"), elemGroup,
+                             LightApp_Preferences::IntSpin, "SMESH", "ball_elem_size"); */
+  double ballDiameter = addPreference(tr("PREF_BALL_DIAMETER"), elemGroup,
+                             LightApp_Preferences::DblSpin, "SMESH", "ball_elem_diameter");
+  double ballScale = addPreference(tr("PREF_BALL_SCALE"), elemGroup,
+                             LightApp_Preferences::DblSpin, "SMESH", "ball_elem_scale");
   int elemW  = addPreference(tr("PREF_WIDTH"), elemGroup,
                              LightApp_Preferences::IntSpin, "SMESH", "element_width");
   int outW  = addPreference(tr("PREF_OUTLINE_WIDTH"), elemGroup,
@@ -5026,8 +5252,16 @@ void SMESHGUI::createPreferences()
   setPreferenceProperty( size0d, "min", 1 );
   setPreferenceProperty( size0d, "max", 10 );
 
-  setPreferenceProperty( ballSize, "min", 1 );
-  setPreferenceProperty( ballSize, "max", 10 );
+ // setPreferenceProperty( ballSize, "min", 1 );
+ // setPreferenceProperty( ballSize, "max", 10 );
+
+  setPreferenceProperty( ballDiameter, "min", 1e-7 );
+  setPreferenceProperty( ballDiameter, "max", 1e9 );
+  setPreferenceProperty( ballDiameter, "step", 0.1 );
+
+  setPreferenceProperty( ballScale, "min", 1e-2 );
+  setPreferenceProperty( ballScale, "max", 1e7 );
+  setPreferenceProperty( ballScale, "step", 0.5 );
 
   setPreferenceProperty( elemW, "min", 1 );
   setPreferenceProperty( elemW, "max", 5 );
@@ -5168,79 +5402,92 @@ void SMESHGUI::createPreferences()
 
 void SMESHGUI::preferencesChanged( const QString& sect, const QString& name )
 {
-  if( sect=="SMESH" ) {
-    float sbX1,sbY1,sbW,sbH;
+  if ( sect=="SMESH" ) {
+    float sbX1 = 0.01, sbY1 = 0.01, sbW = 0.08, sbH = 0.08;
     float aTol = 1.00000009999999;
     std::string aWarning;
     SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
-    if( name=="selection_object_color" || name=="selection_element_color" ||
-        name=="highlight_color" ||
-        name=="selection_precision_node" || name=="selection_precision_element" ||
-        name=="selection_precision_object")
+
+    if ( name== "selection_object_color" ||
+         name=="selection_element_color" ||
+         name==        "highlight_color" ||
+         name=="selection_precision_node"    ||
+         name=="selection_precision_element" ||
+         name=="selection_precision_object"   )
+    {
       SMESH::UpdateSelectionProp( this );
-    else if (name == QString("scalar_bar_vertical_x") || name == QString("scalar_bar_vertical_width")){
-      sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_x", sbX1);
-      sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_width", sbW);
-      if(sbX1+sbW > aTol){
+    }
+    else if (name == "scalar_bar_vertical_x" || name == "scalar_bar_vertical_width")
+    {
+      sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_x",     sbX1);
+      sbW  = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_width", sbW);
+      if ( sbX1+sbW > aTol ) {
         aWarning = "Origin and Size Vertical: X+Width > 1\n";
-        sbX1=0.01;
-        sbW=0.08;
-        aResourceMgr->setValue("SMESH", "scalar_bar_vertical_x", sbX1);
+        sbX1 = 0.01;
+        sbW  = 0.08;
+        aResourceMgr->setValue("SMESH", "scalar_bar_vertical_x",     sbX1);
         aResourceMgr->setValue("SMESH", "scalar_bar_vertical_width", sbW);
       }
     }
-    else if(name == QString("scalar_bar_vertical_y") || name == QString("scalar_bar_vertical_height")){
-      sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_y", sbY1);
-      sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_height",sbH);
-      if(sbY1+sbH > aTol){
+    else if (name == "scalar_bar_vertical_y" || name == "scalar_bar_vertical_height" )
+    {
+      sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_y",     sbY1);
+      sbH  = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_height",sbH);
+      if ( sbY1 + sbH > aTol ) {
         aWarning = "Origin and Size Vertical: Y+Height > 1\n";
-        aResourceMgr->setValue("SMESH", "scalar_bar_vertical_y", sbY1);
+        aResourceMgr->setValue("SMESH", "scalar_bar_vertical_y",     sbY1);
         aResourceMgr->setValue("SMESH", "scalar_bar_vertical_height",sbH);
       }
     }
-    else if(name ==  QString("scalar_bar_horizontal_x") || name ==  QString("scalar_bar_horizontal_width")){
-      sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_x", sbX1);
-      sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_width", sbW);
-      if(sbX1+sbW > aTol){
+    else if (name == "scalar_bar_horizontal_x" || name ==  "scalar_bar_horizontal_width")
+    {
+      sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_x",     sbX1);
+      sbW  = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_width", sbW);
+      if ( sbX1 + sbW > aTol ) {
         aWarning = "Origin and Size Horizontal: X+Width > 1\n";
         sbX1=0.1;
-        sbW=0.08;
+        sbW =0.08;
         aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_x", sbX1);
         aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_width", sbW);
       }
     }
-    else if(name ==  QString("scalar_bar_horizontal_y") || name ==  QString("scalar_bar_horizontal_height")){
-      sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_y", sbY1);
-      sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_height",sbH);
-      if(sbY1+sbH > aTol){
+    else if (name == "scalar_bar_horizontal_y" || name ==  "scalar_bar_horizontal_height")
+    {
+      sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_y",     sbY1);
+      sbH  = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_height",sbH);
+      if ( sbY1 + sbH > aTol ) {
         aWarning = "Origin and Size Horizontal: Y+Height > 1\n";
         sbY1=0.01;
-        sbH=0.08;
+        sbH =0.08;
         aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_y", sbY1);
         aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_height",sbH);
       }
     }
-    else if ( name == "segmentation" ) {
+    else if ( name == "segmentation" )
+    {
       int nbSeg = aResourceMgr->integerValue( "SMESH", "segmentation", 10 );
       myComponentSMESH->SetBoundaryBoxSegmentation( nbSeg );
     }
-    else if ( name == "nb_segments_per_edge" ) {
+    else if ( name == "nb_segments_per_edge" )
+    {
       int nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
       myComponentSMESH->SetDefaultNbSegments( nbSeg );
     }
-    else if ( name == "historical_python_dump" ||
-              name == "forget_mesh_on_hyp_modif") {
+    else if ( name == "historical_python_dump" || name == "forget_mesh_on_hyp_modif" || name == "default_grp_color" )
+    {
       QString val = aResourceMgr->stringValue( "SMESH", name );
       myComponentSMESH->SetOption( name.toLatin1().constData(), val.toLatin1().constData() );
     }
-    else if ( name == QString( "numbering_node_color" ) || name == QString( "numbering_node_font" ) ) {
-      SMESH::UpdateFontProp( this );    
+    else if ( name == "numbering_node_color" || name == "numbering_node_font" )
+    {
+      SMESH::UpdateFontProp( this );
     }
-    else if ( name == QString( "numbering_elem_color" ) || name == QString( "numbering_elem_font" ) ) {
+    else if ( name == "numbering_elem_color" || name == "numbering_elem_font" )
+    {
       SMESH::UpdateFontProp( this );
     }
 
-    if(aWarning.size() != 0){
+    if ( aWarning.size() != 0 ) {
       aWarning += "The default values are applied instead.";
       SUIT_MessageBox::warning(SMESHGUI::desktop(),
                                QObject::tr("SMESH_ERR_SCALARBAR_PARAMS"),
@@ -5270,7 +5517,7 @@ void SMESHGUI::update( const int flags )
 /*!
  * \brief Set default selection mode
 *
-* SLOT called when operation commited. Sets default selection mode
+* SLOT called when operation committed. Sets default selection mode
 */
 //================================================================================
 void SMESHGUI::onOperationCommited( SUIT_Operation* )
@@ -5312,46 +5559,52 @@ LightApp_Operation* SMESHGUI::createOperation( const int id ) const
   // to do : create operation here
   switch( id )
   {
-    case 417: //convert to quadratic
+    case SMESHOp::OpSplitBiQuadratic:
+      op = new SMESHGUI_SplitBiQuadOp();
+    break;
+    case SMESHOp::OpConvertMeshToQuadratic:
       op = new SMESHGUI_ConvToQuadOp();
     break;
-    case 418: // create 2D mesh as boundary on 3D
+    case SMESHOp::OpCreateBoundaryElements: // create 2D mesh as boundary on 3D
       op = new SMESHGUI_Make2DFrom3DOp();
     break;
-    case 420: // Reorient faces
+    case SMESHOp::OpReorientFaces:
       op = new SMESHGUI_ReorientFacesOp();
       break;
-    case 701: // Compute mesh
-      op = new SMESHGUI_ComputeOp();
-    break;
-    case 702: // Create mesh
+    case SMESHOp::OpCreateMesh:
       op = new SMESHGUI_MeshOp( true, true );
     break;
-    case 703: // Create sub-mesh
+    case SMESHOp::OpCreateSubMesh:
       op = new SMESHGUI_MeshOp( true, false );
     break;
-    case 704: // Edit mesh/sub-mesh
+    case SMESHOp::OpEditMeshOrSubMesh:
+    case SMESHOp::OpEditMesh:
+    case SMESHOp::OpEditSubMesh:
       op = new SMESHGUI_MeshOp( false );
     break;
-    case 711: // Precompute mesh
+    case SMESHOp::OpCompute:
+    case SMESHOp::OpComputeSubMesh:
+      op = new SMESHGUI_ComputeOp();
+    break;
+    case SMESHOp::OpPreCompute:
       op = new SMESHGUI_PrecomputeOp();
     break;
-    case 712: // Evaluate mesh
+    case SMESHOp::OpEvaluate:
       op = new SMESHGUI_EvaluateOp();
     break;
-    case 713: // Evaluate mesh
+    case SMESHOp::OpMeshOrder:
       op = new SMESHGUI_MeshOrderOp();
     break;
-    case 806: // Create group on geom
+    case SMESHOp::OpCreateGeometryGroup:
       op = new SMESHGUI_GroupOnShapeOp();
       break;
-    case 904: // Find element
+    case SMESHOp::OpFindElementByPoint:
       op = new SMESHGUI_FindElemByPointOp();
       break;
-    case 4067: // Make mesh pass through point
+    case SMESHOp::OpMoveNode: // Make mesh pass through point
       op = new SMESHGUI_MakeNodeAtPointOp();
       break;
-    case 4070: // Create 0D elements on all nodes
+    case SMESHOp::OpElem0DOnElemNodes: // Create 0D elements on all nodes
       op = new SMESHGUI_Add0DElemsOnAllNodesOp();
       break;
     default:
@@ -5586,7 +5839,7 @@ void SMESHGUI::storeVisualParameters (int savePoint)
                 Handle(SALOME_InteractiveObject) io = aSmeshActor->getIO();
                 if (io->hasEntry())
                 {
-                  // entry is "encoded" = it does NOT contain component adress,
+                  // entry is "encoded" = it does NOT contain component address,
                   // since it is a subject to change on next component loading
                   std::string entry = ip->encodeEntry(io->getEntry(), componentName);
 
@@ -5700,7 +5953,9 @@ void SMESHGUI::storeVisualParameters (int savePoint)
                   sizeStr << "elem0d";
                   sizeStr << QString::number((int)aSmeshActor->Get0DSize());
                   sizeStr << "ball";
-                  sizeStr << QString::number((int)aSmeshActor->GetBallSize());
+                  //sizeStr << QString::number((int)aSmeshActor->GetBallSize());
+                  sizeStr << QString::number((double)aSmeshActor->GetBallSize());
+                  sizeStr << QString::number((double)aSmeshActor->GetBallScale());
                   sizeStr << "shrink";
                   sizeStr << QString::number(aSmeshActor->GetShrinkFactor());
                   sizeStr << "orientation";
@@ -5897,6 +6152,12 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
         continue;
 
       TPlaneData aPlaneData;
+      aPlaneData.AbsoluteOrientation = false;
+      aPlaneData.RelativeOrientation = 0;
+      aPlaneData.Distance = aPlaneData.Angle[0] = aPlaneData.Angle[1] = 0;
+      aPlaneData.X = aPlaneData.Y = aPlaneData.Z = 0;
+      aPlaneData.Dx = aPlaneData.Dy = aPlaneData.Dz = 0;
+
       aPlaneData.Id = aClippingPlaneId;
 
       ok = false;
@@ -5979,7 +6240,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
 
   for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
   {
-    // entry is a normal entry - it should be "decoded" (setting base adress of component)
+    // entry is a normal entry - it should be "decoded" (setting base address of component)
     QString entry (ip->decodeEntry(*entIt).c_str());
 
     // Check that the entry corresponds to a real object in the Study
@@ -6050,8 +6311,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
               if (ac->IsA("SMESH_Actor")) {
                 SMESH_Actor* aGeomAc = SMESH_Actor::SafeDownCast(ac);
                 if (aGeomAc->hasIO()) {
-                  Handle(SALOME_InteractiveObject) io =
-                    Handle(SALOME_InteractiveObject)::DownCast(aGeomAc->getIO());
+                  Handle(SALOME_InteractiveObject) io = aGeomAc->getIO();
                   if (io->hasEntry() && strcmp(io->getEntry(), entry.toLatin1().data()) == 0) {
                     isFound = true;
                     vtkActors.Bind(viewIndex, aGeomAc);
@@ -6284,7 +6544,9 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
               int lineWidth = -1;
               int outlineWidth = -1;
               int elem0dSize = -1;
-              int ballSize = -1;
+              //int ballSize = -1;
+              double ballDiameter = -1.0;
+              double ballScale = -1.0;
               double shrinkSize = -1;
               double orientationSize = -1;
               bool orientation3d = false;
@@ -6312,11 +6574,18 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
                   i++;
                 }
                 else if ( type == "ball" ) {
-                  // ball size is given as single integer value
-                  if ( i+1 >= sizes.count() ) break;                    // format error
-                  int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break;  // format error
-                  ballSize = v;
-                  i++;
+                  // balls are specified by two values: size:scale, where
+                  // - size - is a integer value specifying size
+                  // - scale - is a double value specifying scale factor
+                  if ( i+1 >= sizes.count() ) break;                       // format error
+                  //int v1 = sizes[i+1].toInt( &bOk ); if ( !bOk ) break;    // format error
+                  double v1 = sizes[i+1].toInt( &bOk ); if ( !bOk ) break;    // format error
+                  if ( i+2 >= sizes.count() ) break;                       // format error
+                  double v2 = sizes[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
+                  //ballSize = v1;
+                  ballDiameter = v1;
+                  ballScale = v2;
+                  i += 2;
                 }
                 else if ( type == "shrink" ) {
                   // shrink factor is given as single floating point value
@@ -6350,8 +6619,14 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
               if ( elem0dSize > 0 )
                 aSmeshActor->Set0DSize( elem0dSize );
               // ball size
-              if ( ballSize > 0 )
-                aSmeshActor->SetBallSize( ballSize );
+              /*if ( ballSize > 0 )
+                aSmeshActor->SetBallSize( ballSize );*/
+              // ball diameter
+              if ( ballDiameter > 0 )
+                aSmeshActor->SetBallSize( ballDiameter );
+              // ball scale
+              if ( ballScale > 0.0 )
+                aSmeshActor->SetBallScale( ballScale );
               // shrink factor
               if ( shrinkSize > 0 )
                 aSmeshActor->SetShrinkFactor( shrinkSize );
@@ -6655,6 +6930,48 @@ void SMESHGUI::onHypothesisEdit( int result )
   updateObjBrowser( true );
 }
 
+/*!
+  \brief Actions after choosing menu of control modes
+  Updates control mode actions according to current selection
+*/
+void SMESHGUI::onUpdateControlActions()
+{
+  SALOME_ListIO selected;
+  if ( LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr() )
+    aSel->selectedObjects( selected );
+
+  SMESH_Actor::eControl aControl = SMESH_Actor::eNone;
+  if ( selected.Extent() ) {
+    if ( selected.First()->hasEntry() ) {
+      if ( SMESH_Actor* anActor = SMESH::FindActorByEntry( selected.First()->getEntry() )) {
+        aControl = anActor->GetControlMode();
+        SALOME_ListIteratorOfListIO it(selected);
+        for ( it.Next(); it.More(); it.Next() ) {
+          Handle(SALOME_InteractiveObject) anIO = it.Value();
+          if ( anIO->hasEntry() ) {
+            if ( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) {
+              if ( aControl != anActor->GetControlMode() ) {
+                aControl = SMESH_Actor::eNone;
+                break;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  int anAction = ActionToControl( aControl, true );
+  if ( anAction)
+    action( anAction )->setChecked( true );
+  else {
+    QMenu* send = (QMenu*)sender();
+    QList<QAction*> actions = send->actions();
+    for ( int i = 0; i < actions.size(); i++ )
+      actions[i]->setChecked( false );
+  }
+}
+
 
 /*!
   \brief Signal handler closing(SUIT_ViewWindow*) of a view
@@ -6665,6 +6982,7 @@ void SMESHGUI::onViewClosed( SUIT_ViewWindow* pview ) {
   //Crear all Plot2d Viewers if need.
   SMESH::ClearPlot2Viewers(pview);
 #endif
+  EmitSignalCloseView();
 }
 
 void SMESHGUI::message( const QString& msg )
@@ -6683,7 +7001,7 @@ void SMESHGUI::message( const QString& msg )
       _PTR(SObject) obj = study->FindObjectID( entry.toLatin1().constData() );
       QString name;
       if ( obj )
-        name = obj->GetName().c_str();
+        name = SMESH::fromUtf8(obj->GetName());
       if ( name.isEmpty() )
         return;
       
@@ -6826,7 +7144,7 @@ SALOMEDS::Color SMESHGUI::getPredefinedUniqueColor()
       }
     }
   }
-  static int currentColor = 0;
+  static int currentColor = randomize( colors.size() );
 
   SALOMEDS::Color color;
   color.R = (double)colors[currentColor].red()   / 255.0;