diff --git a/src/app/nodetool/qgsmaptoolnodetool.cpp b/src/app/nodetool/qgsmaptoolnodetool.cpp
index 8f106b5..a02d3cf 100644
--- a/src/app/nodetool/qgsmaptoolnodetool.cpp
+++ b/src/app/nodetool/qgsmaptoolnodetool.cpp
@@ -257,13 +257,13 @@ void QgsMapToolNodeTool::canvasMoveEvent( QMouseEvent * e )
       QList<QgsSnappingResult> snapResults;
       QgsPoint firstCoords = mCanvas->getCoordinateTransform()->toMapPoint( mLastCoordinates->x(), mLastCoordinates->y() );
       QList<QgsPoint> excludePoints;
-      excludePoints.append( mClosestVertex );
+      excludePoints.append( mSnapResult.snappedVertex );
       mSnapper.snapToBackgroundLayers( e->pos(), snapResults, excludePoints );
       // get correct coordinates to move
       QgsPoint posMapCoord = snapPointFromResults( snapResults, e->pos() );
       if ( snapResults.size() > 0 )
       {
-        firstCoords = toMapCoordinates( vlayer, mClosestVertex );
+        firstCoords = toMapCoordinates( vlayer, mSnapResult.snappedVertex );
       }
 
       // special handling of points
@@ -348,7 +348,7 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e )
   QList<QgsSnappingResult> snapResults;
   if ( !mSelectedFeature )
   {
-    mSelectAnother = false;
+    mSelectAnother = true;
     mSnapper.snapToCurrentLayer( e->pos(), snapResults, QgsSnapper::SnapToVertexAndSegment, -1 );
 
     if ( snapResults.size() < 1 )
@@ -356,8 +356,8 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e )
       displaySnapToleranceWarning();
       return;
     }
-
-    mSelectedFeature = new QgsSelectedFeature( snapResults[0].snappedAtGeometry, vlayer, mCanvas );
+    mAnother=snapResults[0].snappedAtGeometry;
+    mSelectedFeature = new QgsSelectedFeature( mAnother, vlayer, mCanvas );
     connect( mSelectedFeature, SIGNAL( destroyed() ), this, SLOT( selectedFeatureDestroyed() ) );
     mIsPoint = vlayer->geometryType() == QGis::Point;
   }
@@ -367,31 +367,20 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e )
     QgsPoint mapCoordPoint = mCanvas->getCoordinateTransform()->toMapPoint( e->pos().x(), e->pos().y() );
     double tol = QgsTolerance::vertexSearchRadius( vlayer, mCanvas->mapRenderer() );
 
-    // get geometry and find if snapping is near it
-    int atVertex, beforeVertex, afterVertex;
-    double dist;
-    mSelectedFeature->geometry()->closestVertex( toLayerCoordinates( vlayer, mapCoordPoint ), atVertex, beforeVertex, afterVertex, dist );
-    dist = sqrt( dist );
+    mSnapper.snapToCurrentLayer( e->pos(), snapResults, QgsSnapper::SnapToVertexAndSegment, tol );
 
-    mSnapper.snapToCurrentLayer( e->pos(), snapResults, QgsSnapper::SnapToVertex, tol );
-    if ( dist > tol )
+    if ( snapResults.size() > 0 )
     {
-      // for points only selecting another feature
-      // no vertexes found (selecting or inverting selection) if move
-      // or select another feature if clicked there
-      mSnapper.snapToCurrentLayer( e->pos(), snapResults, mIsPoint ? QgsSnapper::SnapToVertex : QgsSnapper::SnapToSegment, tol );
-      if ( snapResults.size() > 0 )
-      {
         // need to check all if there is a point in my selected feature
         mAnother = snapResults.first().snappedAtGeometry;
+        mSnapResult=snapResults[0];
         mSelectAnother = true;
         QList<QgsSnappingResult>::iterator it = snapResults.begin();
-        QgsSnappingResult snapResult;
         for ( ; it != snapResults.end(); ++it )
         {
           if ( it->snappedAtGeometry == mSelectedFeature->featureId() )
           {
-            snapResult = *it;
+            mSnapResult = *it;
             mAnother = 0;
             mSelectAnother = false;
             break;
@@ -401,69 +390,46 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e )
         if ( !mSelectAnother )
         {
           mMoving = true;
-          QgsPoint point = mCanvas->getCoordinateTransform()->toMapPoint( e->pos().x(), e->pos().y() );
-          mClosestVertex = closestVertex( toLayerCoordinates( vlayer, point ) );
 
-          if ( mIsPoint )
+          if ( mSnapResult.snappedVertexNr!=-1 )
           {
-            if ( !mCtrl )
+            if ( !mSelectedFeature->isSelected( mSnapResult.snappedVertexNr ) )
             {
-              mSelectedFeature->deselectAllVertexes();
-              mSelectedFeature->selectVertex( snapResult.snappedVertexNr );
-            }
-            else
-            {
-              mSelectedFeature->invertVertexSelection( snapResult.snappedVertexNr );
+              if ( !mCtrl )
+              {
+                mSelectedFeature->deselectAllVertexes();
+              }
+              mSelectedFeature->selectVertex( mSnapResult.snappedVertexNr );
             }
           }
-          else if ( !mSelectedFeature->isSelected( snapResult.beforeVertexNr ) ||
-                    !mSelectedFeature->isSelected( snapResult.afterVertexNr ) )
+          else
           {
-            if ( !mCtrl )
-            {
-              mSelectedFeature->deselectAllVertexes();
-              mSelectedFeature->selectVertex( snapResult.afterVertexNr );
-              mSelectedFeature->selectVertex( snapResult.beforeVertexNr );
-            }
-            else
+            //Snapped to a segment
+            if( !mSelectedFeature->isSelected( mSnapResult.beforeVertexNr ) ||
+                !mSelectedFeature->isSelected( mSnapResult.afterVertexNr ) )
             {
-              mSelectedFeature->invertVertexSelection( snapResult.afterVertexNr );
-              mSelectedFeature->invertVertexSelection( snapResult.beforeVertexNr );
+              if( !mCtrl )
+              {
+                mSelectedFeature->deselectAllVertexes();
+              }
+              mSelectedFeature->selectVertex( mSnapResult.afterVertexNr );
+              mSelectedFeature->selectVertex( mSnapResult.beforeVertexNr );
             }
           }
         }
-      }
-      else if ( !mCtrl )
-      {
-        mSelectedFeature->deselectAllVertexes();
-      }
-    }
-    else
-    {
-      // some vertex selected
-      mMoving = true;
-      QgsPoint point = mCanvas->getCoordinateTransform()->toMapPoint( e->pos().x(), e->pos().y() );
-      mClosestVertex = closestVertex( toLayerCoordinates( vlayer, point ) );
-      if ( mMoving )
-      {
-        if ( mCtrl )
-        {
-          mSelectedFeature->invertVertexSelection( atVertex );
-        }
+
         else
         {
-          mSelectedFeature->deselectAllVertexes();
-          mSelectedFeature->selectVertex( atVertex );
+          // select another feature
+          mAnother = snapResults.first().snappedAtGeometry;
+          mSelectAnother = true;
         }
       }
-      else
+      else if ( !mCtrl )
       {
-        // select another feature
-        mAnother = snapResults.first().snappedAtGeometry;
-        mSelectAnother = true;
+        mSelectedFeature->deselectAllVertexes();
       }
     }
-  }
   QgsDebugMsg( "Leaving." );
 }
 
@@ -506,6 +472,32 @@ void QgsMapToolNodeTool::canvasReleaseEvent( QMouseEvent * e )
       mIsPoint = vlayer->geometryType() == QGis::Point;
       mSelectAnother = false;
     }
+    else
+    {
+      if( !mCtrl )
+      {
+        if( mSnapResult.snappedVertexNr!=-1 )
+        {
+          bool selected=mSelectedFeature->isSelected( mSnapResult.snappedVertexNr );
+          mSelectedFeature->deselectAllVertexes();
+          if( selected )
+          {
+            mSelectedFeature->selectVertex( mSnapResult.snappedVertexNr );
+          }
+        }
+        else
+        {
+          bool selected=mSelectedFeature->isSelected( mSnapResult.beforeVertexNr ) ||
+            mSelectedFeature->isSelected( mSnapResult.afterVertexNr );
+          mSelectedFeature->deselectAllVertexes();
+          if( selected )
+          {
+            mSelectedFeature->selectVertex( mSnapResult.beforeVertexNr );
+            mSelectedFeature->selectVertex( mSnapResult.afterVertexNr );
+          }
+        }
+      }
+    }
   }
   else
   {
@@ -544,14 +536,14 @@ void QgsMapToolNodeTool::canvasReleaseEvent( QMouseEvent * e )
       QList<QgsSnappingResult> snapResults;
       QgsPoint firstCoords = mCanvas->getCoordinateTransform()->toMapPoint( mLastCoordinates->x(), mLastCoordinates->y() );
       QList<QgsPoint> excludePoints;
-      excludePoints.append( mClosestVertex );
+      excludePoints.append( mSnapResult.snappedVertex );
       mSnapper.snapToBackgroundLayers( e->pos(), snapResults, excludePoints );
       coords = snapPointFromResults( snapResults, e->pos() );
       // coords = mCanvas->getCoordinateTransform()->toMapPoint( e->pos().x(), e->pos().y() );
       int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 );
       if ( snapResults.size() > 0 )
       {
-        firstCoords = toMapCoordinates( vlayer, mClosestVertex );
+        firstCoords = toMapCoordinates( vlayer, mSnapResult.snappedVertex );
         if ( topologicalEditing )
         {
           insertSegmentVerticesForSnap( snapResults, vlayer );
@@ -686,15 +678,6 @@ void QgsMapToolNodeTool::canvasDoubleClickEvent( QMouseEvent * e )
   mCanvas->refresh();
 }
 
-QgsPoint QgsMapToolNodeTool::closestVertex( QgsPoint point )
-{
-  int at;
-  int before;
-  int after;
-  double dist;
-  return mSelectedFeature->geometry()->closestVertex( point, at, before, after, dist );
-}
-
 void QgsMapToolNodeTool::keyPressEvent( QKeyEvent* e )
 {
   if ( e->key() == Qt::Key_Control )
diff --git a/src/app/nodetool/qgsmaptoolnodetool.h b/src/app/nodetool/qgsmaptoolnodetool.h
index 4fddd50..004234a 100644
--- a/src/app/nodetool/qgsmaptoolnodetool.h
+++ b/src/app/nodetool/qgsmaptoolnodetool.h
@@ -52,11 +52,6 @@ class QgsMapToolNodeTool: public QgsMapToolVertexEdit
     //! called when map tool is being deactivated
     void deactivate();
 
-    /**
-     * Returns closest vertex to given point from selected feature
-     */
-    QgsPoint closestVertex( QgsPoint point );
-
   public slots:
     void selectedFeatureDestroyed();
 
@@ -134,9 +129,6 @@ class QgsMapToolNodeTool: public QgsMapToolVertexEdit
     /** stored position of last press down action to count how much vertexes should be moved */
     QgsPoint* mLastCoordinates;
 
-    /** closest vertex to click */
-    QgsPoint mClosestVertex;
-
     /** backup of map coordinates to be able to count change between moves */
     QgsPoint mPosMapCoordBackup;
 
@@ -148,6 +140,10 @@ class QgsMapToolNodeTool: public QgsMapToolVertexEdit
 
     /** flag to tell if edition points */
     bool mIsPoint;
+
+    /** Snap result where user clicked */
+    QgsSnappingResult mSnapResult;
+
 };
 
 #endif
