diff --git a/toonz/sources/include/tools/keyhistory.h b/toonz/sources/include/tools/keyhistory.h
index 5c43db2..98921bb 100644
--- a/toonz/sources/include/tools/keyhistory.h
+++ b/toonz/sources/include/tools/keyhistory.h
@@ -191,7 +191,7 @@ public:
     }
 
     StateHolder get(double time) const {
-      TTimerTicks dticks = (TTimerTicks)ceil(TToolTimer::frequency*(time + m_timeOffset));
+      TTimerTicks dticks = (TTimerTicks)ceil(TToolTimer::frequency*(time + m_timeOffset - TConsts::epsilon));
       StatePointer state = m_history->get(m_ticks + dticks);
       return StateHolder(state, m_ticks, m_timeOffset + time);
     }
diff --git a/toonz/sources/tnztools/editassistantstool.cpp b/toonz/sources/tnztools/editassistantstool.cpp
index 44b1e67..908f806 100644
--- a/toonz/sources/tnztools/editassistantstool.cpp
+++ b/toonz/sources/tnztools/editassistantstool.cpp
@@ -123,6 +123,7 @@ protected:
   TStringId m_newAssisnantType;
 
   bool           m_dragging;
+  bool           m_dragAllPoints;
   TMetaObjectH   m_currentAssistant;
   bool           m_currentAssistantCreated;
   bool           m_currentAssistantChanged;
@@ -148,6 +149,7 @@ public:
     TTool("T_EditAssistants"),
     m_assistantType("AssistantType"),
     m_dragging(),
+    m_dragAllPoints(),
     m_currentAssistantCreated(),
     m_currentAssistantChanged(),
     m_currentAssistantIndex(-1),
@@ -420,9 +422,10 @@ public:
     return true;
   }
 
-  void leftButtonDown(const TPointD &position, const TMouseEvent&) override {
+  void leftButtonDown(const TPointD &position, const TMouseEvent &event) override {
     apply();
     m_dragging = true;
+    m_dragAllPoints = false;
     if (m_newAssisnantType) {
       // create assistant
       resetCurrentPoint(false);
@@ -432,6 +435,7 @@ public:
           assistant->setDefaults();
           assistant->move(position);
           assistant->selectAll();
+          m_dragAllPoints = true;
           m_currentAssistantCreated = true;
           m_currentAssistantChanged = true;
           m_currentAssistantIndex = (int)(*m_writer)->size();
@@ -446,6 +450,12 @@ public:
       m_newAssisnantType.reset();
     } else {
       findCurrentPoint(position);
+      if (event.isShiftPressed())
+        if (Closer closer = read(ModePoint)) {
+          m_currentPointName = m_readAssistant->getBasePoint().name;
+          m_currentPointOffset = m_readAssistant->getBasePoint().position - position;
+          m_dragAllPoints = true;
+        }
     }
 
     m_currentPosition = position;
@@ -453,7 +463,7 @@ public:
   }
 
   void leftButtonDrag(const TPointD &position, const TMouseEvent&) override {
-    if (m_currentAssistantCreated) {
+    if (m_dragAllPoints) {
       if (Closer closer = write(ModeAssistant, true))
         m_writeAssistant->move( position + m_currentPointOffset );
     } else {
@@ -468,8 +478,10 @@ public:
 
   void leftButtonUp(const TPointD &position, const TMouseEvent&) override {
     if (m_currentAssistantCreated) {
-      if (Closer closer = write(ModeAssistant, true))
+      if (Closer closer = write(ModeAssistant, true)) {
+        m_writeAssistant->getBasePoint();
         m_writeAssistant->move( position + m_currentPointOffset );
+      }
     } else {
       if (Closer closer = write(ModePoint, true))
         m_writeAssistant->movePoint(
@@ -483,6 +495,7 @@ public:
     emit getApplication()->getCurrentTool()->toolChanged();
     m_currentPosition = position;
     getViewer()->GLInvalidateAll();
+    m_dragAllPoints = false;
     m_dragging = false;
   }