diff --git a/toonz/sources/include/tools/assistant.h b/toonz/sources/include/tools/assistant.h
index 14931aa..5be247d 100644
--- a/toonz/sources/include/tools/assistant.h
+++ b/toonz/sources/include/tools/assistant.h
@@ -39,6 +39,7 @@
 class TProperty;
 class TPropertyGroup;
 
+class TTool;
 class TToolViewer;
 class TAssistant;
 class TAssistantPoint;
@@ -340,6 +341,17 @@ public:
     double &outK,
     double &outMin,
     double &outMax );
+  
+  static bool scanAssistants(
+    TTool *tool,
+    const TPointD *positions,
+    int positionsCount,
+    TGuidelineList *outGuidelines,
+    bool draw,
+    bool enabledOnly,
+    bool markEnabled,
+    bool drawGuidelines,
+    TImage *skipImage );
 };
 
 
diff --git a/toonz/sources/include/tools/modifiers/modifierassistants.h b/toonz/sources/include/tools/modifiers/modifierassistants.h
index a040a8c..35a286a 100644
--- a/toonz/sources/include/tools/modifiers/modifierassistants.h
+++ b/toonz/sources/include/tools/modifiers/modifierassistants.h
@@ -44,7 +44,8 @@ private:
     int positionsCount,
     TGuidelineList *outGuidelines,
     bool draw,
-    bool enabledOnly ) const;
+    bool enabledOnly,
+    bool drawGuidelines ) const;
 
 public:
   double magnetism;
diff --git a/toonz/sources/include/tools/tool.h b/toonz/sources/include/tools/tool.h
index fde613e..2be17c8 100644
--- a/toonz/sources/include/tools/tool.h
+++ b/toonz/sources/include/tools/tool.h
@@ -300,6 +300,17 @@ public:
     AllTargets = 0xffffffff,
   };
 
+  enum ToolHints  //!  Misc flags related with tool
+  { HintNone              = 0,
+    HintAssistants        = 1 << 0, //!< Draw asistants when tool active
+    HintGuidelines        = 1 << 1, //!< Draw asistant guidelines
+    HintAssistantsEnabled = 1 << 2, //!< Tool will use assisnats
+    
+    HintAssistantsAll     = HintAssistants
+                          | HintGuidelines
+                          | HintAssistantsEnabled,
+  };
+
 public:
   static TTool *getTool(std::string toolName, ToolTargetType targetType);
 
@@ -346,6 +357,7 @@ public:
 
   virtual ToolType getToolType() const = 0;
   ToolTargetType getTargetType() const { return (ToolTargetType)m_targetType; }
+  virtual unsigned int getToolHints() const;
 
   std::string getName() const { return m_name; }
 
diff --git a/toonz/sources/tnztools/assistant.cpp b/toonz/sources/tnztools/assistant.cpp
index 826ab4e..d43d4c8 100644
--- a/toonz/sources/tnztools/assistant.cpp
+++ b/toonz/sources/tnztools/assistant.cpp
@@ -1,12 +1,24 @@
 
 #include <tools/assistant.h>
 
+#include <tools/tool.h>
+
+#include <toonz/tapplication.h>
+#include <toonz/txsheet.h>
+#include <toonz/txsheethandle.h>
+#include <toonz/txshlevelhandle.h>
+#include <toonz/tframehandle.h>
+#include <toonz/tobjecthandle.h>
+#include <toonz/dpiscale.h>
+
 #include <tgl.h>
 #include <tproperty.h>
 
 #include <limits>
 #include <cassert>
 
+
+
 #ifdef MACOSX
 const double line_width_scale = 1.5;
 #else
@@ -594,3 +606,83 @@ TAssistant::calcPerspectiveStep(
   outMax = (dx1 > 0.0 ? maxX : minX) - x0;
   return true;
 }
+
+
+bool
+TAssistant::scanAssistants(
+  TTool *tool,
+  const TPointD *positions,
+  int positionsCount,
+  TGuidelineList *outGuidelines,
+  bool draw,
+  bool enabledOnly,
+  bool markEnabled,
+  bool drawGuidelines,
+  TImage *skipImage )
+{
+  TGuidelineList guidelines;
+  if (drawGuidelines && !outGuidelines)
+    outGuidelines = &guidelines;
+
+  bool found = false;
+  bool findGuidelines = (positions && positionsCount > 0 && outGuidelines);
+  if (!findGuidelines) drawGuidelines = false;
+  bool doSomething = findGuidelines || draw;
+  
+  if (tool)
+  if (TToolViewer *viewer = tool->getViewer())
+  if (TApplication *application = tool->getApplication())
+  if (TXshLevelHandle *levelHandle = application->getCurrentLevel())
+  if (TXshLevel *level = levelHandle->getLevel())
+  if (TXshSimpleLevel *simpleLevel = level->getSimpleLevel())
+  if (TFrameHandle *frameHandle = application->getCurrentFrame())
+  if (TXsheetHandle *XsheetHandle = application->getCurrentXsheet())
+  if (TXsheet *Xsheet = XsheetHandle->getXsheet())
+  {
+    TPointD dpiScale = getCurrentDpiScale(simpleLevel, tool->getCurrentFid());
+    int frame = frameHandle->getFrame();
+    int count = Xsheet->getColumnCount();
+    TAffine worldToTrack;
+    if ( tool->getToolType() & TTool::LevelTool
+      && !application->getCurrentObject()->isSpline() )
+    {
+      worldToTrack.a11 /= dpiScale.x;
+      worldToTrack.a22 /= dpiScale.y;
+    }
+
+    for(int i = 0; i < count; ++i)
+      if (TXshColumn *column = Xsheet->getColumn(i))
+      if (column->isCamstandVisible())
+      if (column->isPreviewVisible())
+      if (TImageP image = Xsheet->getCell(frame, i).getImage(false))
+      if (image != skipImage)
+      if (image->getType() == TImage::META)
+      if (TMetaImage *metaImage = dynamic_cast<TMetaImage*>(image.getPointer()))
+      {
+        TAffine imageToTrack = worldToTrack * tool->getColumnMatrix(i);
+        if (draw) { glPushMatrix(); tglMultMatrix(imageToTrack); }
+
+        TMetaImage::Reader reader(*metaImage);
+        for(TMetaObjectListCW::iterator i = reader->begin(); i != reader->end(); ++i)
+          if (*i)
+          if (const TAssistant *assistant = (*i)->getHandler<TAssistant>())
+          if (!enabledOnly || assistant->getEnabled())
+          {
+            found = true;
+            if (findGuidelines)
+              for(int i = 0; i < positionsCount; ++i)
+                assistant->getGuidelines(positions[i], imageToTrack, *outGuidelines);
+            if (draw) assistant->draw(viewer, assistant->getEnabled() && markEnabled);
+            if (!doSomething) return true;
+          }
+
+        if (draw) glPopMatrix();
+      }
+  }
+  
+  if (drawGuidelines)
+    for(TGuidelineList::const_iterator i = outGuidelines->begin(); i != outGuidelines->end(); ++i)
+      (*i)->draw();
+  
+  return found;
+}
diff --git a/toonz/sources/tnztools/editassistantstool.cpp b/toonz/sources/tnztools/editassistantstool.cpp
index 25299d9..ed217b9 100644
--- a/toonz/sources/tnztools/editassistantstool.cpp
+++ b/toonz/sources/tnztools/editassistantstool.cpp
@@ -200,6 +200,8 @@ public:
 
   ToolType getToolType() const override
     { return TTool::LevelWriteTool; }
+  unsigned int getToolHints() const override
+    { return TTool::getToolHints() & ~HintAssistantsAll; }
   int getCursorId() const override
     { return ToolCursor::StrokeSelectCursor; }
   void onImageChanged() override {
@@ -599,56 +601,21 @@ public:
       {
         assistant->drawEdit(getViewer());
         assistant->getGuidelines(
-          m_currentPosition + m_currentPointOffset,
+          position,
           TAffine(),
           m_currentGuidelines );
       }
     
-    // draw assistans from other layers
-    TImage *currentImage = getImage(false);
-    if (TToolViewer *viewer = getViewer())
-    if (TApplication *application = getApplication())
-    if (TXshLevelHandle *levelHandle = application->getCurrentLevel())
-    if (TXshLevel *level = levelHandle->getLevel())
-    if (TXshSimpleLevel *simpleLevel = level->getSimpleLevel())
-    if (TFrameHandle *frameHandle = application->getCurrentFrame())
-    if (TXsheetHandle *XsheetHandle = application->getCurrentXsheet())
-    if (TXsheet *Xsheet = XsheetHandle->getXsheet())
-    {
-      TPointD dpiScale = getCurrentDpiScale(simpleLevel, getCurrentFid());
-      int frame = frameHandle->getFrame();
-      int count = Xsheet->getColumnCount();
-      TAffine worldToTrack;
-      worldToTrack.a11 /= dpiScale.x;
-      worldToTrack.a22 /= dpiScale.y;
-
-      for(int i = 0; i < count; ++i)
-      if (TXshColumn *column = Xsheet->getColumn(i))
-      if (column->isCamstandVisible())
-      if (column->isPreviewVisible())
-      if (TImageP image = Xsheet->getCell(frame, i).getImage(false))
-      if (image->getType() == TImage::META)
-      if (image != currentImage)
-      if (TMetaImage *metaImage = dynamic_cast<TMetaImage*>(image.getPointer()))
-      {
-        TAffine imageToTrack = worldToTrack * getColumnMatrix(i);
-        glPushMatrix(); tglMultMatrix(imageToTrack);
-
-        TMetaImage::Reader reader(*metaImage);
-        for(TMetaObjectListCW::iterator i = reader->begin(); i != reader->end(); ++i)
-        if (*i)
-        if (const TAssistant *assistant = (*i)->getHandler<TAssistant>()) {
-          assistant->getGuidelines(position, imageToTrack, m_currentGuidelines);
-          assistant->draw(viewer, false);
-        }
-          
-        glPopMatrix();
-      }
-    }
-
-    // draw guidelines
-    for(TGuidelineList::const_iterator i = m_currentGuidelines.begin(); i != m_currentGuidelines.end(); ++i)
-      (*i)->draw();
+    // draw assistans and guidelines from other layers
+    TAssistant::scanAssistants(
+      this,          // tool
+      &position, 1,  // pointer positions
+      nullptr,       // out guidelines
+      true,          // draw
+      false,         // enabled only
+      false,         // mark enabled
+      true,          // draw guidelines
+      nullptr );     // skip image
   }
 };
 
diff --git a/toonz/sources/tnztools/fullcolorbrushtool.h b/toonz/sources/tnztools/fullcolorbrushtool.h
index 903ccbd..dd9b831 100644
--- a/toonz/sources/tnztools/fullcolorbrushtool.h
+++ b/toonz/sources/tnztools/fullcolorbrushtool.h
@@ -59,7 +59,10 @@ private:
 public:
   FullColorBrushTool(std::string name);
 
-  ToolType getToolType() const override { return TTool::LevelWriteTool; }
+  ToolType getToolType() const override
+    { return TTool::LevelWriteTool; }
+  unsigned int getToolHints() const override
+    { return TTool::getToolHints() & ~HintAssistantsAll; }
 
   ToolOptionsBox *createOptionsBox() override;
 
diff --git a/toonz/sources/tnztools/modifiers/modifierassistants.cpp b/toonz/sources/tnztools/modifiers/modifierassistants.cpp
index c6fec6f..3613446 100644
--- a/toonz/sources/tnztools/modifiers/modifierassistants.cpp
+++ b/toonz/sources/tnztools/modifiers/modifierassistants.cpp
@@ -48,60 +48,22 @@ TModifierAssistants::scanAssistants(
   int positionsCount,
   TGuidelineList *outGuidelines,
   bool draw,
-  bool enabledOnly ) const
+  bool enabledOnly,
+  bool drawGuidelines ) const
 {
-  bool found = false;
   if (TInputManager *manager = getManager())
   if (TInputHandler *handler = manager->getHandler())
-  if (TTool *tool = handler->inputGetTool())
-  if (TToolViewer *viewer = tool->getViewer())
-  if (TApplication *application = tool->getApplication())
-  if (TXshLevelHandle *levelHandle = application->getCurrentLevel())
-  if (TXshLevel *level = levelHandle->getLevel())
-  if (TXshSimpleLevel *simpleLevel = level->getSimpleLevel())
-  if (TFrameHandle *frameHandle = application->getCurrentFrame())
-  if (TXsheetHandle *XsheetHandle = application->getCurrentXsheet())
-  if (TXsheet *Xsheet = XsheetHandle->getXsheet())
-  {
-    TPointD dpiScale = getCurrentDpiScale(simpleLevel, tool->getCurrentFid());
-    bool findGuidelines = (positions && positionsCount > 0 && outGuidelines);
-    bool doSomething = findGuidelines || draw;
-
-    int frame = frameHandle->getFrame();
-    int count = Xsheet->getColumnCount();
-    TAffine worldToTrack;
-    worldToTrack.a11 /= dpiScale.x;
-    worldToTrack.a22 /= dpiScale.y;
-
-    for(int i = 0; i < count; ++i)
-      if (TXshColumn *column = Xsheet->getColumn(i))
-      if (column->isCamstandVisible())
-      if (column->isPreviewVisible())
-      if (TImageP image = Xsheet->getCell(frame, i).getImage(false))
-      if (image->getType() == TImage::META)
-      if (TMetaImage *metaImage = dynamic_cast<TMetaImage*>(image.getPointer()))
-      {
-        TAffine imageToTrack = worldToTrack * tool->getColumnMatrix(i);
-        if (draw) { glPushMatrix(); tglMultMatrix(imageToTrack); }
-
-        TMetaImage::Reader reader(*metaImage);
-        for(TMetaObjectListCW::iterator i = reader->begin(); i != reader->end(); ++i)
-          if (*i)
-          if (const TAssistant *assistant = (*i)->getHandler<TAssistant>())
-          if (!enabledOnly || assistant->getEnabled())
-          {
-            found = true;
-            if (findGuidelines)
-              for(int i = 0; i < positionsCount; ++i)
-                assistant->getGuidelines(positions[i], imageToTrack, *outGuidelines);
-            if (draw) assistant->draw(viewer, magnetism > 0);
-            if (!doSomething) return true;
-          }
-
-        if (draw) glPopMatrix();
-      }
-  }
-  return found;
+    return TAssistant::scanAssistants(
+      handler->inputGetTool(),
+      positions,
+      positionsCount,          
+      outGuidelines,
+      draw,
+      enabledOnly,
+      magnetism > 0,
+      drawGuidelines,
+      nullptr );
+  return false;
 }
 
 
@@ -136,7 +98,7 @@ TModifierAssistants::modifyTrack(
 
   if (intr->magnetism && start <= 0) {
     intr->guidelines.clear();
-    scanAssistants(&track[0].position, 1, &intr->guidelines, false, true);
+    scanAssistants(&track[0].position, 1, &intr->guidelines, false, true, false);
   }
   
   bool fixed = subTrack.fixedSize() || intr->guidelines.size() <= 1;
@@ -178,7 +140,7 @@ TModifierAssistants::modifyTrack(
 
 TRectD
 TModifierAssistants::calcDrawBounds(const TTrackList&, const THoverList&) {
-  if (scanAssistants(NULL, 0, NULL, false, false))
+  if (scanAssistants(NULL, 0, NULL, false, false, false))
     return TConsts::infiniteRectD;
   return TRectD();
 }
@@ -213,18 +175,14 @@ TModifierAssistants::draw(const TTrackList &tracks, const THoverList &hovers) {
     if (Handler *handler = dynamic_cast<Handler*>((*i)->handler.getPointer()))
       allHovers.push_back( handler->track->back().position );
   
-  // draw assistants
-  TGuidelineList guidelines;
+  // draw assistants and guidelines
   scanAssistants(
     allHovers.empty() ? NULL : &allHovers.front(),
     (int)allHovers.size(),
-    &guidelines,
+    nullptr,
     true,
-    false );
-
-  // draw guidelines
-  for(TGuidelineList::const_iterator i = guidelines.begin(); i != guidelines.end(); ++i)
-    (*i)->draw(false, magnetism > 0);
+    false,
+    true );
 
   // draw tracks
   TInputModifier::drawTracks(tracks);
diff --git a/toonz/sources/tnztools/tool.cpp b/toonz/sources/tnztools/tool.cpp
index 38434c5..0f730fe 100644
--- a/toonz/sources/tnztools/tool.cpp
+++ b/toonz/sources/tnztools/tool.cpp
@@ -179,6 +179,11 @@ TTool::TTool(std::string name)
 
 //-------------------------------------------------------------------
 
+unsigned int TTool::getToolHints() const
+  { return HintAssistants | HintGuidelines; }
+
+//-------------------------------------------------------------------
+
 TTool *TTool::getTool(std::string toolName, ToolTargetType targetType) {
   if (!toolTable) return 0;
 
diff --git a/toonz/sources/tnztools/toonzrasterbrushtool.h b/toonz/sources/tnztools/toonzrasterbrushtool.h
index 7bbe6b5..65bc306 100644
--- a/toonz/sources/tnztools/toonzrasterbrushtool.h
+++ b/toonz/sources/tnztools/toonzrasterbrushtool.h
@@ -106,8 +106,11 @@ class ToonzRasterBrushTool final : public TTool,
 public:
   ToonzRasterBrushTool(std::string name, int targetType);
 
-  ToolType getToolType() const override { return TTool::LevelWriteTool; }
-
+  ToolType getToolType() const override
+    { return TTool::LevelWriteTool; }
+  unsigned int getToolHints() const override
+    { return TTool::getToolHints() & ~HintAssistantsAll; }
+  
   ToolOptionsBox *createOptionsBox() override;
 
   void updateTranslation() override;
diff --git a/toonz/sources/tnztools/toonzvectorbrushtool.h b/toonz/sources/tnztools/toonzvectorbrushtool.h
index 579894a..2aff0b4 100644
--- a/toonz/sources/tnztools/toonzvectorbrushtool.h
+++ b/toonz/sources/tnztools/toonzvectorbrushtool.h
@@ -97,7 +97,10 @@ class ToonzVectorBrushTool final : public TTool,
 public:
   ToonzVectorBrushTool(std::string name, int targetType);
 
-  ToolType getToolType() const override { return TTool::LevelWriteTool; }
+  ToolType getToolType() const override
+    { return TTool::LevelWriteTool; }
+  unsigned int getToolHints() const override
+    { return TTool::getToolHints() & ~HintAssistantsAll; }
 
   ToolOptionsBox *createOptionsBox() override;
 
diff --git a/toonz/sources/toonz/sceneviewer.cpp b/toonz/sources/toonz/sceneviewer.cpp
index a7cfaa1..7b8dab6 100644
--- a/toonz/sources/toonz/sceneviewer.cpp
+++ b/toonz/sources/toonz/sceneviewer.cpp
@@ -23,6 +23,7 @@
 #include "tools/toolhandle.h"
 #include "tools/toolcommandids.h"
 #include "tools/toolutils.h"
+#include "tools/assistant.h"
 
 // TnzQt includes
 #include "toonzqt/icongenerator.h"
@@ -1831,7 +1832,25 @@ void SceneViewer::drawOverlay() {
         !app->getCurrentObject()->isSpline())
       glScaled(m_dpiScale.x, m_dpiScale.y, 1);
     m_pixelSize = sqrt(tglGetPixelSize2()) * getDevPixRatio();
+    
+    // draw assistans and guidelines
+    m_toolHasAssistants = false;
+    unsigned int hints = tool->getToolHints();
+    if (hints & TTool::HintAssistantsAll) {
+      m_toolHasAssistants = TAssistant::scanAssistants(
+        tool,                                 // tool
+        &m_toolPos, 1,                        // pointer positions
+        nullptr,                              // out guidelines
+        true,                                 // draw
+        false,                                // enabled only
+        hints & TTool::HintAssistantsEnabled, // mark enabled
+        true,                                 // draw guidelines
+        nullptr );                            // skip image
+    }
+    
+    // draw tool
     tool->draw();
+    
     glPopMatrix();
     // Used (only in the T_RGBPicker tool) to notify and set the currentColor
     // outside the draw() methods:
@@ -3307,6 +3326,7 @@ TAffine SceneViewer::getNormalZoomScale() {
 //-----------------------------------------------------------------------------
 
 void SceneViewer::invalidateToolStatus() {
+  m_toolHasAssistants = false;
   TTool *tool = TApp::instance()->getCurrentTool()->getTool();
   if (tool) {
     m_toolDisableReason = tool->updateEnabled();
diff --git a/toonz/sources/toonz/sceneviewer.h b/toonz/sources/toonz/sceneviewer.h
index e93cfd3..dcb22d7 100644
--- a/toonz/sources/toonz/sceneviewer.h
+++ b/toonz/sources/toonz/sceneviewer.h
@@ -71,6 +71,8 @@ class SceneViewer final : public GLWidgetForHighDpi,
   double m_pressure;
   QPointF m_lastMousePos;
   QPointF m_pos;
+  TPointD m_toolPos;
+  bool m_toolHasAssistants = false;
   Qt::MouseButton m_mouseButton;
   bool m_foregroundDrawing;
   bool m_tabletEvent, m_tabletMove;
diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp
index fd8d085..d0a46dd 100644
--- a/toonz/sources/toonz/sceneviewerevents.cpp
+++ b/toonz/sources/toonz/sceneviewerevents.cpp
@@ -656,6 +656,12 @@ void SceneViewer::onMove(const TMouseEvent &event) {
     }
     if (!cursorSet) setToolCursor(this, tool->getCursorId());
 
+    if ( m_toolHasAssistants
+      && (tool->getToolHints() & TTool::HintGuidelines)
+      && !areAlmostEqual(m_toolPos, pos) )
+        invalidateAll();
+    m_toolPos = pos;
+    
 #ifdef WITH_CANON
     if (StopMotion::instance()->m_canon->m_pickLiveViewZoom)
       setToolCursor(this, ToolCursor::ZoomCursor);