                    grid_divide( gridNSample, 32 ),
                    1 );
 
-        popart::identification::idNearbyPointDispatcher
+        popart::identification::getSignalsAllNearbyPoints
             <<<grid,block,0,_stream>>>
-            ( _meta,
-              tagIndex,
+            ( tagIndex,
               first_iteration,
               _d_plane,
               ellipse,
               mT,
-              mInvT,
+              // mInvT,
               center,
               vCutSize,
               neighSize,
               point_buffer,
               cut_buffer,
               signal_buffer );
+        POP_CHK_CALL_IFSYNC;
+
+        popart::identification::computeResultAllNearbyPoints
+            <<<grid,block,0,_stream>>>
+            ( tagIndex,
+              vCutSize,
+              point_buffer,
+              cut_buffer,
+              signal_buffer );
+        POP_CHK_CALL_IFSYNC;
 
 #if 0
 // #ifdef CPU_GPU_COST_FUNCTION_COMPARE

    /* When this kernel finishes, the best point does not
     * exist or it is stored in point_buffer[0]
     */
    POP_CUDA_MEMCPY_TO_HOST_ASYNC( cctag_pointer_buffer,
                                   point_buffer,
                                   sizeof(popart::NearbyPoint),
                                   _stream );

    cudaStreamSynchronize( _stream );
    if( not cctag_pointer_buffer->readable ) {

        const int gridSquare = gridNSample * gridNSample;

        if( gridSquare < 32 ) {
            POP_CHK_CALL_IFSYNC;
            popart::identification::idBestNearbyPoint31max
                <<<1,32,0,_stream>>>
                  ( point_buffer, gridSquare );
            POP_CHK_CALL_IFSYNC;
        } else {
            POP_CHK_CALL_IFSYNC;
            popart::identification::idBestNearbyPoint32plus
                <<<1,32,0,_stream>>>
                  ( point_buffer, gridSquare );
            POP_CHK_CALL_IFSYNC;
        }

        currentNeighbourSize /= (float)((gridNSample-1)/2) ;
