diff --git a/toonz/sources/include/toonzqt/treemodel.h b/toonz/sources/include/toonzqt/treemodel.h
index 1193124..864747c 100644
--- a/toonz/sources/include/toonzqt/treemodel.h
+++ b/toonz/sources/include/toonzqt/treemodel.h
@@ -130,6 +130,7 @@ public slots:
 
 protected:
   void setRootItem(Item *rootItem);
+  void setRootItem_NoFree(Item *rootItem);
   Item *getRootItem() const { return m_rootItem; }
 
 private:
diff --git a/toonz/sources/toonzqt/functiontreeviewer.cpp b/toonz/sources/toonzqt/functiontreeviewer.cpp
index 58be7a8..0cd2875 100644
--- a/toonz/sources/toonzqt/functiontreeviewer.cpp
+++ b/toonz/sources/toonzqt/functiontreeviewer.cpp
@@ -1215,7 +1215,10 @@ void FunctionTreeModel::resetAll() {
   beginResetModel();
 #endif
   m_activeChannels.clear();
-  setRootItem(0);
+
+  TreeModel::Item *root_item = getRootItem();
+  setRootItem_NoFree(NULL);
+
   m_stageObjects = 0;
   m_fxs          = 0;
 #if QT_VERSION < 0x050000
@@ -1226,6 +1229,10 @@ void FunctionTreeModel::resetAll() {
   refreshActiveChannels();
   endRefresh();
 
+  // postpone until after refresh,
+  // since its members are used for reference.
+  delete root_item;
+
   m_currentChannel = 0;
 
 #if QT_VERSION >= 0x050000
diff --git a/toonz/sources/toonzqt/treemodel.cpp b/toonz/sources/toonzqt/treemodel.cpp
index 0dea327..49404fc 100644
--- a/toonz/sources/toonzqt/treemodel.cpp
+++ b/toonz/sources/toonzqt/treemodel.cpp
@@ -310,6 +310,13 @@ void TreeModel::setRootItem(Item *rootItem) {
   if (m_rootItem) m_rootItem->setModel(this);
 }
 
+// postpone freeing, so existing items can be referenced while refreshing.
+void TreeModel::setRootItem_NoFree(Item *rootItem) {
+  if (rootItem == m_rootItem) return;
+  m_rootItem = rootItem;
+  if (m_rootItem) m_rootItem->setModel(this);
+}
+
 //---------------------------------------------------------------------------------------------------------------
 
 void TreeModel::setRowHidden(int row, const QModelIndex &parent, bool hide) {