diff --git a/toonz/sources/image/tzl/tiio_tzl.cpp b/toonz/sources/image/tzl/tiio_tzl.cpp
index bd69682..c94d9eb 100644
--- a/toonz/sources/image/tzl/tiio_tzl.cpp
+++ b/toonz/sources/image/tzl/tiio_tzl.cpp
@@ -1409,8 +1409,15 @@ void TLevelReaderTzl::readPalette() {
   TPalette *palette = 0;
 
   if (is && fs.doesExist()) {
-    is >> p;
-    palette = dynamic_cast<TPalette *>(p);
+    std::string tagName;
+    if (is.matchTag(tagName) && tagName == "palette") {
+      std::string gname;
+      is.getTagParam("name", gname);
+      palette = new TPalette();
+      palette->loadData(is);
+      palette->setGlobalName(::to_wstring(gname));
+      is.matchEndTag();
+    }
   }
 
   if (!palette) {
diff --git a/toonz/sources/toonzlib/txshpalettelevel.cpp b/toonz/sources/toonzlib/txshpalettelevel.cpp
index 942720c..e24db02 100644
--- a/toonz/sources/toonzlib/txshpalettelevel.cpp
+++ b/toonz/sources/toonzlib/txshpalettelevel.cpp
@@ -77,12 +77,20 @@ void TXshPaletteLevel::load() {
     TFileStatus fs(path);
     TPersist *p = 0;
     TIStream is(path);
+    TPalette *palette = nullptr;
 
     if (is && fs.doesExist()) {
-      is >> p;
-      TPalette *palette = dynamic_cast<TPalette *>(p);
-      palette->setPaletteName(path.getWideName());
-      setPalette(palette);
+      std::string tagName;
+      if (is.matchTag(tagName) && tagName == "palette") {
+        std::string gname;
+        is.getTagParam("name", gname);
+        palette = new TPalette();
+        palette->loadData(is);
+        palette->setGlobalName(::to_wstring(gname));
+        is.matchEndTag();
+        palette->setPaletteName(path.getWideName());
+        setPalette(palette);
+      }
     }
     assert(m_palette);
   }