diff --git a/toonz/sources/tnztools/toonzrasterbrushtool.cpp b/toonz/sources/tnztools/toonzrasterbrushtool.cpp
index b10005b..b10a4ef 100644
--- a/toonz/sources/tnztools/toonzrasterbrushtool.cpp
+++ b/toonz/sources/tnztools/toonzrasterbrushtool.cpp
@@ -1360,25 +1360,28 @@ void ToonzRasterBrushTool::leftButtonDown(const TPointD &pos,
       invalidateRect +=
           TRectD(m_brushPos - thickOffset, m_brushPos + thickOffset);
     } else if (m_hardness.getValue() == 100 || m_pencil.getValue()) {
+      m_painting.pencil.realPencil = m_pencil.getValue();
+      
       /*-- Pencilモードでなく、Hardness=100 の場合のブラシサイズを1段階下げる
        * --*/
-      if (!m_pencil.getValue() && !m_painting.straight.isStraight) thickness -= 1.0;
+      if (!m_painting.pencil.realPencil && !m_painting.straight.isStraight) thickness -= 1.0;
 
       TThickPoint thickPoint(centeredPos + convert(ras->getCenter()),
                              thickness);
-      m_painting.pencil.rasterTrack = new RasterStrokeGenerator(
+      m_painting.pencil.brush = new RasterStrokeGenerator(
           ras, BRUSH, NONE, m_painting.styleId, thickPoint, drawOrder != OverAll, 0,
-          m_modifierLockAlpha.getValue(), !m_pencil.getValue(),
+          m_modifierLockAlpha.getValue(), !m_painting.pencil.realPencil,
           drawOrder == PaletteOrder);
 
       if (drawOrder == PaletteOrder)
-        m_painting.pencil.rasterTrack->setAboveStyleIds(aboveStyleIds);
+        m_painting.pencil.brush->setAboveStyleIds(aboveStyleIds);
 
-      m_painting.tileSaver->save( m_painting.pencil.rasterTrack->getLastRect() );
+      m_painting.tileSaver->save( m_painting.pencil.brush->getLastRect() );
       if (!m_painting.straight.isStraight)
-        m_painting.pencil.rasterTrack->generateLastPieceOfStroke( m_pencil.getValue() );
+        m_painting.pencil.brush->generateLastPieceOfStroke( m_painting.pencil.realPencil );
 
-      if (m_smooth.getValue()) {
+      m_painting.smooth = m_smooth.getValue() > 0;
+      if (m_painting.smooth) {
         std::vector<TThickPoint> pts;
         m_painting.smoothStroke.beginStroke(m_smooth.getValue());
         m_painting.smoothStroke.addPoint(thickPoint);
@@ -1388,22 +1391,23 @@ void ToonzRasterBrushTool::leftButtonDown(const TPointD &pos,
       m_painting.blured.points.clear();
       TThickPoint point(centeredPos + rasCenter, thickness);
       m_painting.blured.points.push_back(point);
-      m_painting.blured.bluredBrush = new BluredBrush(m_workRas, maxThick, m_brushPad, false);
+      m_painting.blured.brush = new BluredBrush(m_workRas, maxThick, m_brushPad, false);
 
       if (drawOrder == PaletteOrder)
-        m_painting.blured.bluredBrush->setAboveStyleIds(aboveStyleIds);
+        m_painting.blured.brush->setAboveStyleIds(aboveStyleIds);
 
-      TRect strokeRect = m_painting.blured.bluredBrush->getBoundFromPoints( m_painting.blured.points );
+      TRect strokeRect = m_painting.blured.brush->getBoundFromPoints( m_painting.blured.points );
       updateWorkAndBackupRasters(strokeRect);
       m_painting.tileSaver->save(strokeRect);
-      m_painting.blured.bluredBrush->addPoint(point, 1);
+      m_painting.blured.brush->addPoint(point, 1);
       if (!m_painting.straight.isStraight)
-        m_painting.blured.bluredBrush->updateDrawing( ri->getRaster(), m_backupRas, strokeRect,
-                                                      m_painting.styleId, drawOrder,
-                                                      m_modifierLockAlpha.getValue() );
+        m_painting.blured.brush->updateDrawing( ri->getRaster(), m_backupRas, strokeRect,
+                                                m_painting.styleId, drawOrder,
+                                                m_modifierLockAlpha.getValue() );
       m_painting.lastRect = strokeRect;
 
-      if (m_smooth.getValue()) {
+      m_painting.smooth = m_smooth.getValue() > 0;
+      if (m_painting.smooth) {
         std::vector<TThickPoint> pts;
         m_painting.smoothStroke.beginStroke(m_smooth.getValue());
         m_painting.smoothStroke.addPoint(point);
@@ -1488,7 +1492,7 @@ void ToonzRasterBrushTool::leftButtonDrag(const TPointD &pos,
     return;
   }
 
-  if (m_isMyPaintStyleSelected) {
+  if (m_painting.myPaint.brush) {
     TRasterP ras = ti->getRaster();
     TPointD point(centeredPos + rasCenter);
 
@@ -1507,15 +1511,15 @@ void ToonzRasterBrushTool::leftButtonDrag(const TPointD &pos,
         TRectD(centeredPos - thickOffset, centeredPos + thickOffset);
     invalidateRect +=
         TRectD(m_brushPos - thickOffset, m_brushPos + thickOffset);
-  } else if (m_painting.pencil.rasterTrack &&
-             (m_hardness.getValue() == 100 || m_pencil.getValue())) {
+  } else
+  if (m_painting.pencil.brush) {
     /*-- Pencilモードでなく、Hardness=100 の場合のブラシサイズを1段階下げる
      * --*/
-    if (!m_pencil.getValue()) thickness -= 1.0;
+    if (!m_painting.pencil.realPencil) thickness -= 1.0;
 
     TThickPoint thickPoint(centeredPos + rasCenter, thickness);
     std::vector<TThickPoint> pts;
-    if (m_smooth.getValue() == 0) {
+    if (m_painting.smooth) {
       pts.push_back(thickPoint);
     } else {
       m_painting.smoothStroke.addPoint(thickPoint);
@@ -1523,10 +1527,10 @@ void ToonzRasterBrushTool::leftButtonDrag(const TPointD &pos,
     }
     for (size_t i = 0; i < pts.size(); ++i) {
       const TThickPoint &thickPoint = pts[i];
-      m_painting.pencil.rasterTrack->add( thickPoint);
-      m_painting.tileSaver->save( m_painting.pencil.rasterTrack->getLastRect() );
-      m_painting.pencil.rasterTrack->generateLastPieceOfStroke( m_pencil.getValue() );
-      std::vector<TThickPoint> brushPoints = m_painting.pencil.rasterTrack->getPointsSequence();
+      m_painting.pencil.brush->add( thickPoint);
+      m_painting.tileSaver->save( m_painting.pencil.brush->getLastRect() );
+      m_painting.pencil.brush->generateLastPieceOfStroke( m_painting.pencil.realPencil );
+      std::vector<TThickPoint> brushPoints = m_painting.pencil.brush->getPointsSequence();
       int m                                = (int)brushPoints.size();
       std::vector<TThickPoint> points;
       if (m == 3) {
@@ -1541,10 +1545,11 @@ void ToonzRasterBrushTool::leftButtonDrag(const TPointD &pos,
     }
   } else {
     // antialiased brush
+    assert(m_painting.blured.brush);
     assert(m_workRas.getPointer() && m_backupRas.getPointer());
     TThickPoint thickPoint(centeredPos + rasCenter, thickness);
     std::vector<TThickPoint> pts;
-    if (m_smooth.getValue() == 0) {
+    if (m_painting.smooth) {
       pts.push_back(thickPoint);
     } else {
       m_painting.smoothStroke.addPoint(thickPoint);
@@ -1566,31 +1571,31 @@ void ToonzRasterBrushTool::leftButtonDrag(const TPointD &pos,
         TThickPoint pa = m_painting.blured.points.front();
         points.push_back(pa);
         points.push_back(mid);
-        bbox = m_painting.blured.bluredBrush->getBoundFromPoints(points);
+        bbox = m_painting.blured.brush->getBoundFromPoints(points);
         updateWorkAndBackupRasters(bbox + m_painting.lastRect);
         m_painting.tileSaver->save(bbox);
-        m_painting.blured.bluredBrush->addArc(pa, (mid + pa) * 0.5, mid, 1, 1);
+        m_painting.blured.brush->addArc(pa, (mid + pa) * 0.5, mid, 1, 1);
         m_painting.lastRect += bbox;
       } else {
         points.push_back(m_painting.blured.points[m - 4]);
         points.push_back(old);
         points.push_back(mid);
-        bbox = m_painting.blured.bluredBrush->getBoundFromPoints(points);
+        bbox = m_painting.blured.brush->getBoundFromPoints(points);
         updateWorkAndBackupRasters(bbox + m_painting.lastRect);
         m_painting.tileSaver->save(bbox);
-        m_painting.blured.bluredBrush->addArc( m_painting.blured.points[m - 4], old, mid, 1, 1 );
+        m_painting.blured.brush->addArc( m_painting.blured.points[m - 4], old, mid, 1, 1 );
         m_painting.lastRect += bbox;
       }
       invalidateRect += ToolUtils::getBounds(points, maxThickness) - rasCenter;
 
-      m_painting.blured.bluredBrush->updateDrawing( ti->getRaster(), m_backupRas, bbox,
+      m_painting.blured.brush->updateDrawing( ti->getRaster(), m_backupRas, bbox,
                                                     m_painting.styleId, m_drawOrder.getIndex(),
                                                     m_modifierLockAlpha.getValue() );
     }
   }
 
   // clear & draw brush tip when drawing smooth stroke
-  if (m_smooth.getValue() != 0) {
+  if (m_painting.smooth) {
     TPointD halfThick(m_maxThick * 0.5, m_maxThick * 0.5);
     invalidateRect += TRectD(m_brushPos - halfThick, m_brushPos + halfThick);
     invalidateRect += TRectD(centeredPos - halfThick, centeredPos + halfThick);
@@ -1655,7 +1660,7 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos,
    * --*/
   TFrameId frameId =
       m_workingFrameId.isEmptyFrame() ? getCurrentFid() : m_workingFrameId;
-  if (m_isMyPaintStyleSelected) {
+  if (m_painting.myPaint.brush) {
     TRasterCM32P ras = ti->getRaster();
     TPointD point(pos + rasCenter);
     double pressure = m_pressure.getValue() ? pressureVal : 0.5;
@@ -1687,8 +1692,8 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos,
           m_isLevelCreated, subras, m_painting.myPaint.strokeRect.getP00()));
     }
 
-  } else if (m_painting.pencil.rasterTrack &&
-             (m_hardness.getValue() == 100 || m_pencil.getValue())) {
+  } else
+  if (m_painting.pencil.brush) {
     double thickness = m_pressure.getValue()
                            ? computeThickness(pressureVal, m_rasThickness) * 2
                            : m_rasThickness.getValue().second;
@@ -1699,13 +1704,13 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos,
         thickness = m_rasThickness.getValue().first;
 
       // Pencilモードでなく、Hardness=100 の場合のブラシサイズを1段階下げる
-      if (!m_pencil.getValue()) thickness -= 1.0;
+      if (!m_painting.pencil.realPencil) thickness -= 1.0;
     }
 
     TRectD invalidateRect;
     TThickPoint thickPoint(pos + rasCenter, thickness);
     std::vector<TThickPoint> pts;
-    if (m_smooth.getValue() == 0 || m_painting.straight.isStraight) {
+    if (m_painting.smooth || m_painting.straight.isStraight) {
       pts.push_back(thickPoint);
     } else {
       m_painting.smoothStroke.addPoint(thickPoint);
@@ -1714,12 +1719,12 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos,
     }
     for (size_t i = 0; i < pts.size(); ++i) {
       const TThickPoint &thickPoint = pts[i];
-      m_painting.pencil.rasterTrack->add( thickPoint );
-      m_painting.tileSaver->save( m_painting.pencil.rasterTrack->getLastRect( m_painting.straight.isStraight) );
-      m_painting.pencil.rasterTrack->generateLastPieceOfStroke(m_pencil.getValue(), true,
-                                               m_painting.straight.isStraight);
+      m_painting.pencil.brush->add( thickPoint );
+      m_painting.tileSaver->save( m_painting.pencil.brush->getLastRect( m_painting.straight.isStraight) );
+      m_painting.pencil.brush->generateLastPieceOfStroke(
+        m_painting.pencil.realPencil, true, m_painting.straight.isStraight);
 
-      std::vector<TThickPoint> brushPoints = m_painting.pencil.rasterTrack->getPointsSequence();
+      std::vector<TThickPoint> brushPoints = m_painting.pencil.brush->getPointsSequence();
       int m                                = (int)brushPoints.size();
       std::vector<TThickPoint> points;
       if (m_painting.straight.isStraight) {
@@ -1740,15 +1745,16 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos,
 
     if (m_painting.tileSet->getTileCount() > 0) {
       TUndoManager::manager()->add(new RasterBrushUndo(
-          m_painting.tileSet, m_painting.pencil.rasterTrack->getPointsSequence(),
-          m_painting.pencil.rasterTrack->getStyleId(), m_painting.pencil.rasterTrack->isSelective(),
-          simLevel.getPointer(), frameId, m_pencil.getValue(), m_isFrameCreated,
-          m_isLevelCreated, m_painting.pencil.rasterTrack->isPaletteOrder(),
-          m_painting.pencil.rasterTrack->isAlphaLocked(), m_painting.straight.isStraight));
+          m_painting.tileSet, m_painting.pencil.brush->getPointsSequence(),
+          m_painting.pencil.brush->getStyleId(), m_painting.pencil.brush->isSelective(),
+          simLevel.getPointer(), frameId, m_painting.pencil.realPencil, m_isFrameCreated,
+          m_isLevelCreated, m_painting.pencil.brush->isPaletteOrder(),
+          m_painting.pencil.brush->isAlphaLocked(), m_painting.straight.isStraight));
     }
-    delete m_painting.pencil.rasterTrack;
-    m_painting.pencil.rasterTrack = nullptr;
+    delete m_painting.pencil.brush;
+    m_painting.pencil.brush = nullptr;
   } else {
+    assert(m_painting.blured.brush);
     double maxThickness = m_rasThickness.getValue().second;
     double thickness    = (m_pressure.getValue())
                               ? computeThickness(pressureVal, m_rasThickness) * 2
@@ -1757,7 +1763,7 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos,
     TRectD invalidateRect;
     TThickPoint thickPoint(pos + rasCenter, thickness);
     std::vector<TThickPoint> pts;
-    if (m_smooth.getValue() == 0 || m_painting.straight.isStraight) {
+    if (m_painting.smooth || m_painting.straight.isStraight) {
       pts.push_back(thickPoint);
     } else {
       m_painting.smoothStroke.addPoint(thickPoint);
@@ -1784,26 +1790,26 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos,
           TThickPoint pa = m_painting.blured.points.front();
           points.push_back(pa);
           points.push_back(mid);
-          bbox = m_painting.blured.bluredBrush->getBoundFromPoints(points);
+          bbox = m_painting.blured.brush->getBoundFromPoints(points);
           updateWorkAndBackupRasters(bbox + m_painting.lastRect);
           m_painting.tileSaver->save(bbox);
-          m_painting.blured.bluredBrush->addArc(pa, (mid + pa) * 0.5, mid, 1, 1);
+          m_painting.blured.brush->addArc(pa, (mid + pa) * 0.5, mid, 1, 1);
           m_painting.lastRect += bbox;
         } else {
           points.push_back(m_painting.blured.points[m - 4]);
           points.push_back(old);
           points.push_back(mid);
-          bbox = m_painting.blured.bluredBrush->getBoundFromPoints(points);
+          bbox = m_painting.blured.brush->getBoundFromPoints(points);
           updateWorkAndBackupRasters(bbox + m_painting.lastRect);
           m_painting.tileSaver->save(bbox);
-          m_painting.blured.bluredBrush->addArc(m_painting.blured.points[m - 4], old, mid, 1, 1);
+          m_painting.blured.brush->addArc(m_painting.blured.points[m - 4], old, mid, 1, 1);
           m_painting.lastRect += bbox;
         }
 
         invalidateRect +=
             ToolUtils::getBounds(points, maxThickness) - rasCenter;
 
-        m_painting.blured.bluredBrush->updateDrawing( ti->getRaster(), m_backupRas, bbox,
+        m_painting.blured.brush->updateDrawing( ti->getRaster(), m_backupRas, bbox,
                                                       m_painting.styleId, m_drawOrder.getIndex(),
                                                       m_modifierLockAlpha.getValue() );
       }
@@ -1827,11 +1833,11 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos,
         points.push_back( m_painting.blured.points[1] );
         points.push_back( m_painting.blured.points[2] );
       }
-      TRect bbox = m_painting.blured.bluredBrush->getBoundFromPoints(points);
+      TRect bbox = m_painting.blured.brush->getBoundFromPoints(points);
       updateWorkAndBackupRasters(bbox);
       m_painting.tileSaver->save(bbox);
-      m_painting.blured.bluredBrush->addArc( points[0], points[1], points[2], 1, 1 );
-      m_painting.blured.bluredBrush->updateDrawing( ti->getRaster(), m_backupRas, bbox,
+      m_painting.blured.brush->addArc( points[0], points[1], points[2], 1, 1 );
+      m_painting.blured.brush->updateDrawing( ti->getRaster(), m_backupRas, bbox,
                                                     m_painting.styleId, m_drawOrder.getIndex(),
                                                     m_modifierLockAlpha.getValue() );
 
@@ -1842,8 +1848,8 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos,
     if (!invalidateRect.isEmpty()) invalidate(invalidateRect.enlarge(2));
     m_painting.lastRect.empty();
 
-    delete m_painting.blured.bluredBrush;
-    m_painting.blured.bluredBrush = nullptr;
+    delete m_painting.blured.brush;
+    m_painting.blured.brush = nullptr;
 
     if (m_painting.tileSet->getTileCount() > 0) {
       TUndoManager::manager()->add(new RasterBluredBrushUndo(
@@ -1854,7 +1860,7 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos,
     }
   }
   delete m_painting.tileSaver;
-  m_painting.tileSaver = 0;
+  m_painting.tileSaver = nullptr;
 
   /*-- FIdを指定して、描画中にフレームが動いても、
     描画開始時のFidのサムネイルが更新されるようにする。--*/
diff --git a/toonz/sources/tnztools/toonzrasterbrushtool.h b/toonz/sources/tnztools/toonzrasterbrushtool.h
index 7d688e5..2b9875c 100644
--- a/toonz/sources/tnztools/toonzrasterbrushtool.h
+++ b/toonz/sources/tnztools/toonzrasterbrushtool.h
@@ -180,6 +180,7 @@ protected:
     // initial painting input
     bool active = false;
     int styleId = 0;
+    bool smooth;
     
     // common variables
     TTileSetCM32 *tileSet = nullptr;
@@ -188,12 +189,13 @@ protected:
     SmoothStroke smoothStroke;
     
     struct Pencil {
-      RasterStrokeGenerator *rasterTrack = nullptr;
+      RasterStrokeGenerator *brush = nullptr;
+      bool realPencil = false;
     } pencil;
     
     struct Blured {
+      BluredBrush *brush = nullptr;
       std::vector<TThickPoint> points;
-      BluredBrush *bluredBrush;
     } blured;
     
     struct MyPaint {