diff --git a/toonz/sources/include/tools/inputmanager.h b/toonz/sources/include/tools/inputmanager.h
index 3f6f51a..f3e9548 100644
--- a/toonz/sources/include/tools/inputmanager.h
+++ b/toonz/sources/include/tools/inputmanager.h
@@ -247,8 +247,7 @@ public:
   
   virtual void inputInvalidateRect(const TRectD &bounds) { }
   
-  virtual TAffine toWorld() { return TAffine(); };
-  virtual TTool* getTool() { return nullptr; };
+  virtual TTool* inputGetTool() { return nullptr; };
 };
 
 
diff --git a/toonz/sources/include/tools/modifiers/modifierassistants.h b/toonz/sources/include/tools/modifiers/modifierassistants.h
index e0f8a76..9de8d00 100644
--- a/toonz/sources/include/tools/modifiers/modifierassistants.h
+++ b/toonz/sources/include/tools/modifiers/modifierassistants.h
@@ -36,21 +36,28 @@ public:
     TTrackPoint calcPoint(double originalIndex) override;
   };
 
+private:
+  bool scanAssistants(
+    const TPointD *positions,
+    int positionsCount,
+    TGuidelineList *outGuidelines,
+    bool draw ) const;
+
 public:
+  const bool drawOnly;
   const double sensitiveLength;
 
-  TModifierAssistants();
-
-  void findGuidelines(
-    const TPointD &position,
-    TGuidelineList &outGuidelines ) const;
+  explicit TModifierAssistants(bool drawOnly = false);
 
   void modifyTrack(
     const TTrack &track,
     const TInputSavePoint::Holder &savePoint,
     TTrackList &outTracks ) override;
-  void drawHover(const TPointD &hover) override;
-  void drawTrack(const TTrack &track) override;
+
+  TRectD calcDrawBounds(const TTrackList &tracks, const THoverList &hovers) override;
+
+   void drawTrack(const TTrack &track) override;
+   void draw(const TTrackList &tracks, const THoverList &hovers) override;
 };
 
 
diff --git a/toonz/sources/tnztools/assistant.cpp b/toonz/sources/tnztools/assistant.cpp
index 8e33f1d..f245002 100644
--- a/toonz/sources/tnztools/assistant.cpp
+++ b/toonz/sources/tnztools/assistant.cpp
@@ -42,7 +42,7 @@ TGuideline::calcTrackWeight(const TTrack &track, const TAffine &toScreen, bool &
 
   const double snapLenght = 20.0;
   const double snapScale = 1.0;
-  const double maxLength = 20.0*snapLenght*snapScale;
+  const double maxLength = 2.0*snapLenght*snapScale;
 
   double sumWeight = 0.0;
   double sumLength = 0.0;
@@ -225,7 +225,7 @@ TAssistant::drawSegment(const TPointD &p0, const TPointD &p1, double pixelSize) 
   TPointD d = p1 - p0;
   double k = norm2(d);
   if (k > TConsts::epsilon*TConsts::epsilon) {
-    double k = 0.5*pixelSize/sqrt(k);
+    k = 0.5*pixelSize/sqrt(k);
     d = TPointD(-k*d.y, k*d.x);
     glColor4dv(colorWhite);
     tglDrawSegment(p0 - d, p1 - d);
diff --git a/toonz/sources/tnztools/assistants/guidelineline.cpp b/toonz/sources/tnztools/assistants/guidelineline.cpp
index 55287df..26c2c0d 100644
--- a/toonz/sources/tnztools/assistants/guidelineline.cpp
+++ b/toonz/sources/tnztools/assistants/guidelineline.cpp
@@ -17,7 +17,7 @@ TPointD
 TGuidelineLineBase::calcDirection(const TPointD &p0, const TPointD &p1) {
   TPointD d = p1 - p0;
   double k = norm2(d);
-  return k > TConsts::epsilon ? d*(1.0/k) : TPointD();
+  return k > TConsts::epsilon*TConsts::epsilon ? d*(1.0/sqrt(k)) : TPointD();
 }
 
 void
diff --git a/toonz/sources/tnztools/editassistantstool.cpp b/toonz/sources/tnztools/editassistantstool.cpp
index 4cef33a..68bb9a6 100644
--- a/toonz/sources/tnztools/editassistantstool.cpp
+++ b/toonz/sources/tnztools/editassistantstool.cpp
@@ -119,13 +119,10 @@ public:
     m_currentPointIndex(-1)
   {
     bind(MetaImage);
-    m_prop.add(&m_assistantType);
+    m_prop.bind(m_assistantType);
     updateTranslation();
   }
   
-  ~EditAssistantsTool()
-    { m_prop.clear(); }
-
   ToolType getToolType() const override
     { return TTool::LevelWriteTool; }
   int getCursorId() const override
diff --git a/toonz/sources/tnztools/fullcolorbrushtool.cpp b/toonz/sources/tnztools/fullcolorbrushtool.cpp
index de714ce..ff80a93 100644
--- a/toonz/sources/tnztools/fullcolorbrushtool.cpp
+++ b/toonz/sources/tnztools/fullcolorbrushtool.cpp
@@ -137,7 +137,8 @@ FullColorBrushTool::FullColorBrushTool(std::string name)
   m_inputmanager.setHandler(this);
   m_modifierTest = new TModifierTest();
   m_modifierTangents = new TModifierTangents();
-  m_modifierSegmentation = new TModifierSegmentation();
+  m_modifierAssistants = new TModifierAssistants();
+  m_modifierSegmentation = new TModifierSegmentation(0.25);
   
   m_thickness.setNonLinearSlider();
 
@@ -296,6 +297,7 @@ bool FullColorBrushTool::preLeftButtonDown() {
   m_inputmanager.clearModifiers();
   m_inputmanager.addModifier( TInputModifierP(m_modifierTangents.getPointer()) );
   m_inputmanager.addModifier( TInputModifierP(m_modifierSegmentation.getPointer()) );
+  m_inputmanager.addModifier( TInputModifierP(m_modifierAssistants.getPointer()) );
   m_inputmanager.addModifier( TInputModifierP(m_modifierTest.getPointer()) );
   
   touchImage();
diff --git a/toonz/sources/tnztools/fullcolorbrushtool.h b/toonz/sources/tnztools/fullcolorbrushtool.h
index b3d6b63..67dd22d 100644
--- a/toonz/sources/tnztools/fullcolorbrushtool.h
+++ b/toonz/sources/tnztools/fullcolorbrushtool.h
@@ -8,6 +8,7 @@
 #include <tools/inputmanager.h>
 #include <tools/modifiers/modifiertest.h>
 #include <tools/modifiers/modifiertangents.h>
+#include <tools/modifiers/modifierassistants.h>
 #include <tools/modifiers/modifiersegmentation.h>
 
 #include "toonzrasterbrushtool.h"
@@ -67,6 +68,7 @@ public:
   void inputLeftButtonUp(const TTrackPoint &point, const TTrack &track) override;
   void inputMouseMove(const TPointD &position, const TInputState &state) override;
   void inputInvalidateRect(const TRectD &bounds) override;
+  TTool* inputGetTool() override { return this; };
 
   void draw() override;
 
@@ -102,6 +104,7 @@ protected:
   TInputManager m_inputmanager;
   TSmartPointerT<TModifierTest> m_modifierTest;
   TSmartPointerT<TModifierTangents> m_modifierTangents;
+  TSmartPointerT<TModifierAssistants> m_modifierAssistants;
   TSmartPointerT<TModifierSegmentation> m_modifierSegmentation;
   
   TPropertyGroup m_prop;
diff --git a/toonz/sources/tnztools/inputmanager.cpp b/toonz/sources/tnztools/inputmanager.cpp
index b65a2f5..3930177 100644
--- a/toonz/sources/tnztools/inputmanager.cpp
+++ b/toonz/sources/tnztools/inputmanager.cpp
@@ -330,6 +330,12 @@ TInputManager::paintTracks() {
       newSavePoint.savePoint()->available = false;
       if (allFinished) {
         paintApply((int)m_savePoints.size(), subTracks);
+        // send to tool final
+        if (!subTracks.empty()) {
+          m_handler->inputPaintTracks(subTracks);
+          for(TTrackList::const_iterator i = subTracks.begin(); i != subTracks.end(); ++i)
+            (*i)->resetChanges();
+        }
         for(std::vector<TTrackList>::iterator i = m_tracks.begin(); i != m_tracks.end(); ++i)
           i->clear();
         if (m_handler) m_handler->inputSetBusy(false);
@@ -613,7 +619,12 @@ TInputManager::hoverEvent(const THoverList &hovers) {
     m_hovers[i+1].clear();
     m_modifiers[i]->modifyHovers(m_hovers[i], m_hovers[i+1]);
   }
-  if (m_handler) m_handler->inputHoverEvent(*this);
+  if (m_handler) {
+    TRectD bounds = calcDrawBounds();
+    if (!bounds.isEmpty())
+      m_handler->inputInvalidateRect(bounds);
+    m_handler->inputHoverEvent(*this);
+  }
 }
 
 
@@ -637,7 +648,7 @@ TInputManager::calcDrawBounds() {
   }
 
   if (!bounds.isEmpty())
-    bounds.enlarge(2.0);
+    bounds.enlarge(4.0);
   
   return bounds;
 }
diff --git a/toonz/sources/tnztools/modifiers/modifierassistants.cpp b/toonz/sources/tnztools/modifiers/modifierassistants.cpp
index fb0af74..60001dd 100644
--- a/toonz/sources/tnztools/modifiers/modifierassistants.cpp
+++ b/toonz/sources/tnztools/modifiers/modifierassistants.cpp
@@ -14,6 +14,7 @@
 #include <toonz/tobjecthandle.h>
 
 // TnzCore includes
+#include <tgl.h>
 #include <tmetaimage.h>
 
 
@@ -40,21 +41,31 @@ TModifierAssistants::Modifier::calcPoint(double originalIndex) {
 //*****************************************************************************************
 
 
-TModifierAssistants::TModifierAssistants():
+TModifierAssistants::TModifierAssistants(bool drawOnly):
+  drawOnly(drawOnly),
   sensitiveLength(50.0) { }
 
 
-void
-TModifierAssistants::findGuidelines(const TPointD &position, TGuidelineList &outGuidelines) const {
+bool
+TModifierAssistants::scanAssistants(
+  const TPointD *positions,
+  int positionsCount,
+  TGuidelineList *outGuidelines,
+  bool draw ) const
+{
+  bool found = false;
   if (TInputManager *manager = getManager())
   if (TInputHandler *handler = manager->getHandler())
-  if (TTool *tool = handler->getTool())
+  if (TTool *tool = handler->inputGetTool())
   if (TToolViewer *viewer = tool->getViewer())
   if (TApplication *application = tool->getApplication())
   if (TFrameHandle *frameHandle = application->getCurrentFrame())
   if (TXsheetHandle *XsheetHandle = application->getCurrentXsheet())
   if (TXsheet *Xsheet = XsheetHandle->getXsheet())
   {
+    bool findGuidelines = (positions && positionsCount > 0 && outGuidelines);
+    bool doSomething = findGuidelines || draw;
+
     int frame = frameHandle->getFrame();
     int count = Xsheet->getColumnCount();
     TAffine worldToTrack = viewer->getViewMatrix();
@@ -66,14 +77,25 @@ TModifierAssistants::findGuidelines(const TPointD &position, TGuidelineList &out
       {
         TAffine imageToTrack = tool->getColumnMatrix(i)
                              * worldToTrack;
-        TMetaImage::Reader reader(*metaImage);
+        if (draw) { glPushMatrix(); tglMultMatrix(imageToTrack); }
 
+        TMetaImage::Reader reader(*metaImage);
         for(TMetaObjectRefList::const_iterator i = reader->begin(); i != reader->end(); ++i)
           if (*i)
           if (const TAssistant *assistant = (*i)->getHandler<TAssistant>())
-            assistant->getGuidelines(position, imageToTrack, outGuidelines);
+          {
+            found = true;
+            if (findGuidelines)
+              for(int i = 0; i < positionsCount; ++i)
+                assistant->getGuidelines(positions[i], imageToTrack, *outGuidelines);
+            if (draw) assistant->draw(viewer);
+            if (!doSomething) return true;
+          }
+
+        if (draw) glPopMatrix();
       }
   }
+  return found;
 }
 
 
@@ -86,7 +108,8 @@ TModifierAssistants::modifyTrack(
   if (!track.handler) {
     track.handler = new TTrackHandler(track);
     Modifier *modifier = new Modifier(*track.handler);
-    findGuidelines(track[0].position, modifier->guidelines);
+    if (!drawOnly)
+      scanAssistants(&track[0].position, 1, &modifier->guidelines, false);
 
     track.handler->tracks.push_back(new TTrack(modifier));
 
@@ -110,7 +133,7 @@ TModifierAssistants::modifyTrack(
       bool longEnough = false;
       if (TInputManager *manager = getManager())
       if (TInputHandler *handler = manager->getHandler())
-      if (TTool *tool = handler->getTool())
+      if (TTool *tool = handler->inputGetTool())
       if (TToolViewer *viewer = tool->getViewer()) {
         TAffine trackToScreen = tool->getMatrix();
         if (tool->getToolType() & TTool::LevelTool)
@@ -118,7 +141,6 @@ TModifierAssistants::modifyTrack(
             if (!objHandle->isSpline())
               trackToScreen *= TScale(viewer->getDpiScale().x, viewer->getDpiScale().y);
         trackToScreen *= viewer->get3dViewMatrix().get2d().inv();
-        
         TGuidelineP guideline = TGuideline::findBest(modifier->guidelines, track, trackToScreen, longEnough);
         if (guideline != modifier->guidelines.front())
           for(int i = 1; i < (int)modifier->guidelines.size(); ++i)
@@ -142,12 +164,11 @@ TModifierAssistants::modifyTrack(
 }
 
 
-void
-TModifierAssistants::drawHover(const TPointD &hover) {
-  TGuidelineList guidelines;
-  findGuidelines(hover, guidelines);
-  for(TGuidelineList::const_iterator i = guidelines.begin(); i != guidelines.end(); ++i)
-    (*i)->draw();
+TRectD
+TModifierAssistants::calcDrawBounds(const TTrackList&, const THoverList&) {
+  if (scanAssistants(NULL, 0, NULL, false))
+    return TConsts::infiniteRectD;
+  return TRectD();
 }
 
 
@@ -164,3 +185,29 @@ TModifierAssistants::drawTrack(const TTrack &track) {
     }
   }
 }
+
+
+void
+TModifierAssistants::draw(const TTrackList &tracks, const THoverList &hovers) {
+  THoverList allHovers;
+  allHovers.reserve(hovers.size() + tracks.size());
+  allHovers.insert(allHovers.end(), hovers.begin(), hovers.end());
+  for(TTrackList::const_iterator i = tracks.begin(); i != tracks.end(); ++i)
+    if ((*i)->handler && !(*i)->handler->tracks.empty() && !(*i)->handler->tracks.front()->empty())
+      allHovers.push_back( (*i)->handler->tracks.front()->back().position );
+  
+  // draw assistants
+  TGuidelineList guidelines;
+  scanAssistants(
+    allHovers.empty() ? NULL : &allHovers.front(),
+    (int)allHovers.size(),
+    &guidelines,
+    true );
+
+  // draw guidelines
+  for(TGuidelineList::const_iterator i = guidelines.begin(); i != guidelines.end(); ++i)
+    (*i)->draw();
+
+  // draw tracks
+  TInputModifier::drawTracks(tracks);
+}
diff --git a/toonz/sources/toonz/sceneviewer.cpp b/toonz/sources/toonz/sceneviewer.cpp
index f65e6e7..a7cfaa1 100644
--- a/toonz/sources/toonz/sceneviewer.cpp
+++ b/toonz/sources/toonz/sceneviewer.cpp
@@ -2247,11 +2247,10 @@ TRect SceneViewer::getActualClipRect(const TAffine &aff) {
   else if (m_clipRect.isEmpty())
     clipRect -= TPointD(viewerSize.lx / 2, viewerSize.ly / 2);
   else {
-    TRectD app = aff * (m_clipRect.enlarge(3));
-    clipRect =
-        TRectD(tceil(app.x0), tceil(app.y0), tfloor(app.x1), tfloor(app.y1));
+    clipRect = aff * (m_clipRect.enlarge(3));
   }
 
+  clipRect *= TRectD(viewerSize) - TPointD(viewerSize.lx/2, viewerSize.ly/2);
   return convert(clipRect);
 }