diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/coordinator/Coordinator.java b/cluster/src/main/java/org/apache/iotdb/cluster/coordinator/Coordinator.java
index b46273a..aedb080 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/coordinator/Coordinator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/coordinator/Coordinator.java
@@ -52,7 +52,7 @@
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertRowsPlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertTabletPlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateAlignedTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateMultiTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
@@ -205,10 +205,10 @@
 
   public void createSchemaIfNecessary(PhysicalPlan plan)
       throws MetadataException, CheckConsistencyException {
-    if (plan instanceof SetDeviceTemplatePlan) {
+    if (plan instanceof SetSchemaTemplatePlan) {
       try {
         IoTDB.metaManager.getStorageGroupPath(
-            new PartialPath(((SetDeviceTemplatePlan) plan).getPrefixPath()));
+            new PartialPath(((SetSchemaTemplatePlan) plan).getPrefixPath()));
       } catch (IllegalPathException e) {
         // the plan has been checked
       } catch (StorageGroupNotSetException e) {
@@ -314,7 +314,7 @@
             status);
       }
       if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()
-          && !(plan instanceof SetDeviceTemplatePlan
+          && !(plan instanceof SetSchemaTemplatePlan
               && status.getCode() == TSStatusCode.DUPLICATED_TEMPLATE.getStatusCode())
           && !(plan instanceof DeleteTimeSeriesPlan
               && status.getCode() == TSStatusCode.TIMESERIES_NOT_EXIST.getStatusCode())) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
index a88ab25..1b10399 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
@@ -57,7 +57,7 @@
 import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertRowsPlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertTabletPlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateAlignedTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateMultiTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
@@ -572,11 +572,11 @@
       storageGroups.addAll(
           getStorageGroups(
               Collections.singletonList(((CreateAlignedTimeSeriesPlan) plan).getPrefixPath())));
-    } else if (plan instanceof SetDeviceTemplatePlan) {
+    } else if (plan instanceof SetSchemaTemplatePlan) {
       storageGroups.addAll(
           getStorageGroups(
               Collections.singletonList(
-                  new PartialPath(((SetDeviceTemplatePlan) plan).getPrefixPath()))));
+                  new PartialPath(((SetSchemaTemplatePlan) plan).getPrefixPath()))));
     } else {
       storageGroups.addAll(getStorageGroups(plan.getPaths()));
     }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/PartitionUtils.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/PartitionUtils.java
index 69e60da..f1bf3ef 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/PartitionUtils.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/PartitionUtils.java
@@ -26,7 +26,7 @@
 import org.apache.iotdb.db.qp.physical.crud.CreateTemplatePlan;
 import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertTabletPlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
 import org.apache.iotdb.db.qp.physical.sys.ClearCachePlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateFunctionPlan;
@@ -110,7 +110,7 @@
         || plan instanceof DeleteTimeSeriesPlan
         || plan instanceof MergePlan
         || plan instanceof FlushPlan
-        || plan instanceof SetDeviceTemplatePlan
+        || plan instanceof SetSchemaTemplatePlan
         || plan instanceof ClearCachePlan;
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
index 472c347..a435829 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
@@ -46,7 +46,7 @@
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertTabletPlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.AutoCreateDeviceMNodePlan;
 import org.apache.iotdb.db.qp.physical.sys.ChangeAliasPlan;
 import org.apache.iotdb.db.qp.physical.sys.ChangeTagOffsetPlan;
@@ -58,7 +58,7 @@
 import org.apache.iotdb.db.qp.physical.sys.DropContinuousQueryPlan;
 import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan;
 import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan;
-import org.apache.iotdb.db.qp.physical.sys.SetUsingDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.sys.SetUsingSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowDevicesPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowTimeSeriesPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
@@ -384,15 +384,15 @@
         break;
       case CREATE_TEMPLATE:
         CreateTemplatePlan createTemplatePlan = (CreateTemplatePlan) plan;
-        createDeviceTemplate(createTemplatePlan);
+        createSchemaTemplate(createTemplatePlan);
         break;
       case SET_DEVICE_TEMPLATE:
-        SetDeviceTemplatePlan setDeviceTemplatePlan = (SetDeviceTemplatePlan) plan;
-        setDeviceTemplate(setDeviceTemplatePlan);
+        SetSchemaTemplatePlan setSchemaTemplatePlan = (SetSchemaTemplatePlan) plan;
+        setSchemaTemplate(setSchemaTemplatePlan);
         break;
       case SET_USING_DEVICE_TEMPLATE:
-        SetUsingDeviceTemplatePlan setUsingDeviceTemplatePlan = (SetUsingDeviceTemplatePlan) plan;
-        setUsingDeviceTemplate(setUsingDeviceTemplatePlan);
+        SetUsingSchemaTemplatePlan setUsingSchemaTemplatePlan = (SetUsingSchemaTemplatePlan) plan;
+        setUsingSchemaTemplate(setUsingSchemaTemplatePlan);
         break;
       case AUTO_CREATE_DEVICE_MNODE:
         AutoCreateDeviceMNodePlan autoCreateDeviceMNodePlan = (AutoCreateDeviceMNodePlan) plan;
@@ -1279,8 +1279,8 @@
     Set<IMeasurementSchema> res = new HashSet<>();
     try {
       Pair<IMNode, Template> mNodeTemplatePair = mNodeCache.get(path);
-      if (mNodeTemplatePair.left.getDeviceTemplate() != null) {
-        mNodeTemplatePair.right = mNodeTemplatePair.left.getDeviceTemplate();
+      if (mNodeTemplatePair.left.getSchemaTemplate() != null) {
+        mNodeTemplatePair.right = mNodeTemplatePair.left.getSchemaTemplate();
       }
 
       for (IMNode IMNode : mNodeTemplatePair.left.getChildren().values()) {
@@ -1709,8 +1709,8 @@
 
     // 1. get device node
     Pair<IMNode, Template> deviceMNode = getDeviceNodeWithAutoCreate(deviceId);
-    if (!(deviceMNode.left.isMeasurement()) && deviceMNode.left.getDeviceTemplate() != null) {
-      deviceMNode.right = deviceMNode.left.getDeviceTemplate();
+    if (!(deviceMNode.left.isMeasurement()) && deviceMNode.left.getSchemaTemplate() != null) {
+      deviceMNode.right = deviceMNode.left.getSchemaTemplate();
     }
 
     // check insert non-aligned InsertPlan for aligned timeseries
@@ -1885,9 +1885,9 @@
       String schemaName = vectorId != null ? vectorId : measurement;
       IMeasurementSchema schema = curTemplateMap.get(schemaName);
       if (!deviceMNode.left.isUseTemplate()) {
-        deviceMNode.left = setUsingDeviceTemplate(deviceMNode.left);
+        deviceMNode.left = setUsingSchemaTemplate(deviceMNode.left);
         try {
-          logWriter.setUsingDeviceTemplate(deviceMNode.left.getPartialPath());
+          logWriter.setUsingSchemaTemplate(deviceMNode.left.getPartialPath());
         } catch (IOException e) {
           throw new MetadataException(e);
         }
@@ -1942,19 +1942,19 @@
     boolean satisfy(String storageGroup);
   }
 
-  public void createDeviceTemplate(CreateTemplatePlan plan) throws MetadataException {
+  public void createSchemaTemplate(CreateTemplatePlan plan) throws MetadataException {
     try {
-      templateManager.createDeviceTemplate(plan);
+      templateManager.createSchemaTemplate(plan);
       // write wal
       if (!isRecovering) {
-        logWriter.createDeviceTemplate(plan);
+        logWriter.createSchemaTemplate(plan);
       }
     } catch (IOException e) {
       throw new MetadataException(e);
     }
   }
 
-  public void setDeviceTemplate(SetDeviceTemplatePlan plan) throws MetadataException {
+  public void setSchemaTemplate(SetSchemaTemplatePlan plan) throws MetadataException {
     try {
       Template template = templateManager.getTemplate(plan.getTemplateName());
 
@@ -1962,12 +1962,12 @@
       synchronized (this) {
         Pair<IMNode, Template> node =
             getDeviceNodeWithAutoCreate(new PartialPath(plan.getPrefixPath()));
-        templateManager.setDeviceTemplate(template, node);
+        templateManager.setSchemaTemplate(template, node);
       }
 
       // write wal
       if (!isRecovering) {
-        logWriter.setDeviceTemplate(plan);
+        logWriter.setSchemaTemplate(plan);
       }
     } catch (IOException e) {
       throw new MetadataException(e);
@@ -1982,19 +1982,19 @@
     mtree.getDeviceNodeWithAutoCreating(plan.getPath(), config.getDefaultStorageGroupLevel());
   }
 
-  private void setUsingDeviceTemplate(SetUsingDeviceTemplatePlan plan) throws MetadataException {
+  private void setUsingSchemaTemplate(SetUsingSchemaTemplatePlan plan) throws MetadataException {
     try {
-      setUsingDeviceTemplate(getDeviceNode(plan.getPrefixPath()));
+      setUsingSchemaTemplate(getDeviceNode(plan.getPrefixPath()));
     } catch (PathNotExistException e) {
-      // the order of SetUsingDeviceTemplatePlan and AutoCreateDeviceMNodePlan cannot be guaranteed
+      // the order of SetUsingSchemaTemplatePlan and AutoCreateDeviceMNodePlan cannot be guaranteed
       // when writing concurrently, so we need a auto-create mechanism here
       mtree.getDeviceNodeWithAutoCreating(
           plan.getPrefixPath(), config.getDefaultStorageGroupLevel());
-      setUsingDeviceTemplate(getDeviceNode(plan.getPrefixPath()));
+      setUsingSchemaTemplate(getDeviceNode(plan.getPrefixPath()));
     }
   }
 
-  IEntityMNode setUsingDeviceTemplate(IMNode node) {
+  IEntityMNode setUsingSchemaTemplate(IMNode node) {
     // this operation may change mtree structure and node type
     // invoke mnode.setUseTemplate is invalid
     IEntityMNode entityMNode = mtree.setToEntity(node);
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
index d70a4eb..27ec0e6 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
@@ -288,7 +288,7 @@
     checkTimeseries(path.getFullPath());
     IMNode cur = root;
     boolean hasSetStorageGroup = false;
-    Template upperTemplate = cur.getDeviceTemplate();
+    Template upperTemplate = cur.getSchemaTemplate();
     // e.g, path = root.sg.d1.s1,  create internal nodes and set cur to d1 node
     for (int i = 1; i < nodeNames.length - 1; i++) {
       if (cur.isMeasurement()) {
@@ -310,8 +310,8 @@
       }
       cur = cur.getChild(childName);
 
-      if (cur.getDeviceTemplate() != null) {
-        upperTemplate = cur.getDeviceTemplate();
+      if (cur.getSchemaTemplate() != null) {
+        upperTemplate = cur.getSchemaTemplate();
       }
     }
 
@@ -499,7 +499,7 @@
       throw new IllegalPathException(deviceId.getFullPath());
     }
     IMNode cur = root;
-    Template upperTemplate = cur.getDeviceTemplate();
+    Template upperTemplate = cur.getSchemaTemplate();
     for (int i = 1; i < nodeNames.length; i++) {
       if (!cur.hasChild(nodeNames[i])) {
         if (cur.isUseTemplate() && upperTemplate.hasSchema(nodeNames[i])) {
@@ -517,7 +517,7 @@
       }
       cur = cur.getChild(nodeNames[i]);
       // update upper template
-      upperTemplate = cur.getDeviceTemplate() == null ? upperTemplate : cur.getDeviceTemplate();
+      upperTemplate = cur.getSchemaTemplate() == null ? upperTemplate : cur.getSchemaTemplate();
     }
 
     return new Pair<>(cur, upperTemplate);
@@ -534,7 +534,7 @@
     if (!nodeNames[0].equals(root.getName())) {
       return false;
     }
-    Template upperTemplate = cur.getDeviceTemplate();
+    Template upperTemplate = cur.getSchemaTemplate();
     for (int i = 1; i < nodeNames.length; i++) {
       if (!cur.hasChild(nodeNames[i])) {
         return cur.isUseTemplate() && upperTemplate.hasSchema(nodeNames[i]);
@@ -551,7 +551,7 @@
           return false;
         }
       }
-      upperTemplate = cur.getDeviceTemplate() == null ? upperTemplate : cur.getDeviceTemplate();
+      upperTemplate = cur.getSchemaTemplate() == null ? upperTemplate : cur.getSchemaTemplate();
     }
     return true;
   }
@@ -568,7 +568,7 @@
       throw new IllegalPathException(path.getFullPath());
     }
     IMNode cur = root;
-    Template upperTemplate = cur.getDeviceTemplate();
+    Template upperTemplate = cur.getSchemaTemplate();
     int i = 1;
     // e.g., path = root.a.b.sg, create internal nodes for a, b
     while (i < nodeNames.length - 1) {
@@ -584,7 +584,7 @@
         throw new StorageGroupAlreadySetException(temp.getFullPath());
       }
       cur = cur.getChild(nodeNames[i]);
-      upperTemplate = cur.getDeviceTemplate() == null ? upperTemplate : cur.getDeviceTemplate();
+      upperTemplate = cur.getSchemaTemplate() == null ? upperTemplate : cur.getSchemaTemplate();
       i++;
     }
 
@@ -743,7 +743,7 @@
     Template upperTemplate = null;
 
     for (int i = 1; i < nodes.length; i++) {
-      upperTemplate = cur.getDeviceTemplate() == null ? upperTemplate : cur.getDeviceTemplate();
+      upperTemplate = cur.getSchemaTemplate() == null ? upperTemplate : cur.getSchemaTemplate();
       cur = cur.getChild(nodes[i]);
       if (cur == null) {
         // not find
@@ -813,7 +813,7 @@
       throw new IllegalPathException(path.getFullPath());
     }
     IMNode cur = root;
-    Template upperTemplate = cur.getDeviceTemplate();
+    Template upperTemplate = cur.getSchemaTemplate();
 
     for (int i = 1; i < nodes.length; i++) {
       if (cur.isMeasurement()) {
@@ -824,8 +824,8 @@
           throw new PathNotExistException(path.getFullPath(), true);
         }
       }
-      if (cur.getDeviceTemplate() != null) {
-        upperTemplate = cur.getDeviceTemplate();
+      if (cur.getSchemaTemplate() != null) {
+        upperTemplate = cur.getSchemaTemplate();
       }
       IMNode next = cur.getChild(nodes[i]);
       if (next == null) {
@@ -1380,8 +1380,8 @@
     }
 
     String nodeReg = MetaUtils.getNodeRegByIdx(idx, nodes);
-    if (node.getDeviceTemplate() != null) {
-      upperTemplate = node.getDeviceTemplate();
+    if (node.getSchemaTemplate() != null) {
+      upperTemplate = node.getSchemaTemplate();
     }
 
     // we should use template when all child is measurement or this node has no child
@@ -1741,7 +1741,7 @@
       Set<PartialPath> res,
       boolean hasLimit,
       Template upperTemplate) {
-    upperTemplate = node.getDeviceTemplate() == null ? upperTemplate : node.getDeviceTemplate();
+    upperTemplate = node.getSchemaTemplate() == null ? upperTemplate : node.getSchemaTemplate();
     String nodeReg = MetaUtils.getNodeRegByIdx(idx, nodes);
     // the node path doesn't contains '*'
     if (!nodeReg.contains(PATH_WILDCARD)) {
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/logfile/MLogTxtWriter.java b/server/src/main/java/org/apache/iotdb/db/metadata/logfile/MLogTxtWriter.java
index 5b401eb..044b3ea 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/logfile/MLogTxtWriter.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/logfile/MLogTxtWriter.java
@@ -22,14 +22,14 @@
 import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.db.metadata.MetadataOperationType;
 import org.apache.iotdb.db.qp.physical.crud.CreateTemplatePlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateAlignedTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateContinuousQueryPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.DropContinuousQueryPlan;
 import org.apache.iotdb.db.qp.physical.sys.MNodePlan;
 import org.apache.iotdb.db.qp.physical.sys.MeasurementMNodePlan;
-import org.apache.iotdb.db.qp.physical.sys.SetUsingDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.sys.SetUsingSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.StorageGroupMNodePlan;
 import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -319,7 +319,7 @@
     lineNumber.incrementAndGet();
   }
 
-  public void setTemplate(SetDeviceTemplatePlan plan) throws IOException {
+  public void setTemplate(SetSchemaTemplatePlan plan) throws IOException {
     StringBuilder buf = new StringBuilder(String.valueOf(MetadataOperationType.SET_TEMPLATE));
     buf.append(",");
     buf.append(plan.getTemplateName());
@@ -331,7 +331,7 @@
     lineNumber.incrementAndGet();
   }
 
-  public void setUsingTemplate(SetUsingDeviceTemplatePlan plan) throws IOException {
+  public void setUsingTemplate(SetUsingSchemaTemplatePlan plan) throws IOException {
     StringBuilder buf = new StringBuilder(String.valueOf(MetadataOperationType.SET_USING_TEMPLATE));
     buf.append(",");
     buf.append(plan.getPrefixPath());
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/logfile/MLogWriter.java b/server/src/main/java/org/apache/iotdb/db/metadata/logfile/MLogWriter.java
index b0de7cf..320872c 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/logfile/MLogWriter.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/logfile/MLogWriter.java
@@ -29,7 +29,7 @@
 import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.CreateTemplatePlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.AutoCreateDeviceMNodePlan;
 import org.apache.iotdb.db.qp.physical.sys.ChangeAliasPlan;
 import org.apache.iotdb.db.qp.physical.sys.ChangeTagOffsetPlan;
@@ -43,7 +43,7 @@
 import org.apache.iotdb.db.qp.physical.sys.MeasurementMNodePlan;
 import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan;
 import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan;
-import org.apache.iotdb.db.qp.physical.sys.SetUsingDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.sys.SetUsingSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.StorageGroupMNodePlan;
 import org.apache.iotdb.db.writelog.io.LogWriter;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
@@ -173,11 +173,11 @@
     putLog(plan);
   }
 
-  public void createDeviceTemplate(CreateTemplatePlan plan) throws IOException {
+  public void createSchemaTemplate(CreateTemplatePlan plan) throws IOException {
     putLog(plan);
   }
 
-  public void setDeviceTemplate(SetDeviceTemplatePlan plan) throws IOException {
+  public void setSchemaTemplate(SetSchemaTemplatePlan plan) throws IOException {
     putLog(plan);
   }
 
@@ -215,8 +215,8 @@
     putLog(plan);
   }
 
-  public void setUsingDeviceTemplate(PartialPath path) throws IOException {
-    SetUsingDeviceTemplatePlan plan = new SetUsingDeviceTemplatePlan(path);
+  public void setUsingSchemaTemplate(PartialPath path) throws IOException {
+    SetUsingSchemaTemplatePlan plan = new SetUsingSchemaTemplatePlan(path);
     putLog(plan);
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
index 181a83c..e6c5660 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
@@ -66,9 +66,9 @@
 
   Template getUpperTemplate();
 
-  Template getDeviceTemplate();
+  Template getSchemaTemplate();
 
-  void setDeviceTemplate(Template deviceTemplate);
+  void setSchemaTemplate(Template schemaTemplate);
 
   int getMeasurementMNodeCount();
 
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
index 479e5bd..72493a1 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
@@ -50,8 +50,8 @@
   @SuppressWarnings("squid:S3077")
   protected transient volatile Map<String, IMNode> children = null;
 
-  // device template
-  protected Template deviceTemplate = null;
+  // schema template
+  protected Template schemaTemplate = null;
 
   /** Constructor of MNode. */
   public InternalMNode(IMNode parent, String name) {
@@ -168,7 +168,7 @@
       ((IEntityMNode) newChildNode).setUseTemplate(oldChildNode.isUseTemplate());
     }
 
-    newChildNode.setDeviceTemplate(oldChildNode.getDeviceTemplate());
+    newChildNode.setSchemaTemplate(oldChildNode.getSchemaTemplate());
 
     newChildNode.setParent(this);
 
@@ -217,8 +217,8 @@
   public Template getUpperTemplate() {
     IMNode cur = this;
     while (cur != null) {
-      if (cur.getDeviceTemplate() != null) {
-        return cur.getDeviceTemplate();
+      if (cur.getSchemaTemplate() != null) {
+        return cur.getSchemaTemplate();
       }
       cur = cur.getParent();
     }
@@ -227,13 +227,13 @@
   }
 
   @Override
-  public Template getDeviceTemplate() {
-    return deviceTemplate;
+  public Template getSchemaTemplate() {
+    return schemaTemplate;
   }
 
   @Override
-  public void setDeviceTemplate(Template deviceTemplate) {
-    this.deviceTemplate = deviceTemplate;
+  public void setSchemaTemplate(Template schemaTemplate) {
+    this.schemaTemplate = schemaTemplate;
   }
 
   /** get the count of all MeasurementMNode whose ancestor is current node */
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
index 4d2f49c..27480e8 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
@@ -291,14 +291,14 @@
   }
 
   @Override
-  public Template getDeviceTemplate() {
+  public Template getSchemaTemplate() {
     logger.warn("current node {} is a MeasurementMNode, can not get Device Template", name);
     throw new RuntimeException(
         String.format("current node %s is a MeasurementMNode, can not get Device Template", name));
   }
 
   @Override
-  public void setDeviceTemplate(Template deviceTemplate) {}
+  public void setSchemaTemplate(Template schemaTemplate) {}
 
   @Override
   public boolean isMeasurement() {
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/template/TemplateManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/template/TemplateManager.java
index d119c39..bf4779d 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/template/TemplateManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/template/TemplateManager.java
@@ -57,7 +57,7 @@
 
   private TemplateManager() {}
 
-  public void createDeviceTemplate(CreateTemplatePlan plan) throws MetadataException {
+  public void createSchemaTemplate(CreateTemplatePlan plan) throws MetadataException {
     Template template = new Template(plan);
     if (templateMap.putIfAbsent(plan.getName(), template) != null) {
       // already have template
@@ -73,11 +73,11 @@
     return template;
   }
 
-  public void setDeviceTemplate(Template template, Pair<IMNode, Template> node)
+  public void setSchemaTemplate(Template template, Pair<IMNode, Template> node)
       throws MetadataException {
 
-    if (node.left.getDeviceTemplate() != null) {
-      if (node.left.getDeviceTemplate().equals(template)) {
+    if (node.left.getSchemaTemplate() != null) {
+      if (node.left.getSchemaTemplate().equals(template)) {
         throw new DuplicatedTemplateException(template.getName());
       } else {
         throw new MetadataException("Specified node already has template");
@@ -90,7 +90,7 @@
 
     checkIsTemplateAndMNodeCompatible(template, node.left);
 
-    node.left.setDeviceTemplate(template);
+    node.left.setSchemaTemplate(template);
   }
 
   public boolean isTemplateCompatible(Template upper, Template current) {
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index df47b6c..b092469 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -78,7 +78,7 @@
 import org.apache.iotdb.db.qp.physical.crud.QueryIndexPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.qp.physical.crud.RawDataQueryPlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.db.qp.physical.sys.AlterTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
@@ -360,9 +360,9 @@
         }
         return true;
       case CREATE_TEMPLATE:
-        return createDeviceTemplate((CreateTemplatePlan) plan);
+        return createSchemaTemplate((CreateTemplatePlan) plan);
       case SET_DEVICE_TEMPLATE:
-        return setDeviceTemplate((SetDeviceTemplatePlan) plan);
+        return setSchemaTemplate((SetSchemaTemplatePlan) plan);
       case CREATE_CONTINUOUS_QUERY:
         return operateCreateContinuousQuery((CreateContinuousQueryPlan) plan);
       case DROP_CONTINUOUS_QUERY:
@@ -373,20 +373,20 @@
     }
   }
 
-  private boolean createDeviceTemplate(CreateTemplatePlan createTemplatePlan)
+  private boolean createSchemaTemplate(CreateTemplatePlan createTemplatePlan)
       throws QueryProcessException {
     try {
-      IoTDB.metaManager.createDeviceTemplate(createTemplatePlan);
+      IoTDB.metaManager.createSchemaTemplate(createTemplatePlan);
     } catch (MetadataException e) {
       throw new QueryProcessException(e);
     }
     return true;
   }
 
-  private boolean setDeviceTemplate(SetDeviceTemplatePlan setDeviceTemplatePlan)
+  private boolean setSchemaTemplate(SetSchemaTemplatePlan setSchemaTemplatePlan)
       throws QueryProcessException {
     try {
-      IoTDB.metaManager.setDeviceTemplate(setDeviceTemplatePlan);
+      IoTDB.metaManager.setSchemaTemplate(setSchemaTemplatePlan);
     } catch (MetadataException e) {
       throw new QueryProcessException(e);
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
index a018f1c..13546d7 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
@@ -30,7 +30,7 @@
 import org.apache.iotdb.db.qp.physical.crud.InsertRowsPlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertTabletPlan;
 import org.apache.iotdb.db.qp.physical.crud.SelectIntoPlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.AlterTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
 import org.apache.iotdb.db.qp.physical.sys.AutoCreateDeviceMNodePlan;
@@ -60,7 +60,7 @@
 import org.apache.iotdb.db.qp.physical.sys.MergePlan;
 import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan;
 import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan;
-import org.apache.iotdb.db.qp.physical.sys.SetUsingDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.sys.SetUsingSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowDevicesPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.StartTriggerPlan;
@@ -378,10 +378,10 @@
           plan = new CreateTemplatePlan();
           break;
         case SET_DEVICE_TEMPLATE:
-          plan = new SetDeviceTemplatePlan();
+          plan = new SetSchemaTemplatePlan();
           break;
         case SET_USING_DEVICE_TEMPLATE:
-          plan = new SetUsingDeviceTemplatePlan();
+          plan = new SetUsingSchemaTemplatePlan();
           break;
         case AUTO_CREATE_DEVICE_MNODE:
           plan = new AutoCreateDeviceMNodePlan();
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SetDeviceTemplatePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SetSchemaTemplatePlan.java
similarity index 94%
rename from server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SetDeviceTemplatePlan.java
rename to server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SetSchemaTemplatePlan.java
index b76703a..23949f7 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SetDeviceTemplatePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SetSchemaTemplatePlan.java
@@ -29,15 +29,15 @@
 import java.nio.ByteBuffer;
 import java.util.List;
 
-public class SetDeviceTemplatePlan extends PhysicalPlan {
+public class SetSchemaTemplatePlan extends PhysicalPlan {
   String templateName;
   String prefixPath;
 
-  public SetDeviceTemplatePlan() {
+  public SetSchemaTemplatePlan() {
     super(false, OperatorType.SET_DEVICE_TEMPLATE);
   }
 
-  public SetDeviceTemplatePlan(String templateName, String prefixPath) {
+  public SetSchemaTemplatePlan(String templateName, String prefixPath) {
     super(false, OperatorType.SET_DEVICE_TEMPLATE);
     this.templateName = templateName;
     this.prefixPath = prefixPath;
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetUsingDeviceTemplatePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetUsingSchemaTemplatePlan.java
similarity index 92%
rename from server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetUsingDeviceTemplatePlan.java
rename to server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetUsingSchemaTemplatePlan.java
index 6d20145..107a1fe 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetUsingDeviceTemplatePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetUsingSchemaTemplatePlan.java
@@ -33,16 +33,16 @@
 import java.nio.ByteBuffer;
 import java.util.List;
 
-public class SetUsingDeviceTemplatePlan extends PhysicalPlan {
+public class SetUsingSchemaTemplatePlan extends PhysicalPlan {
 
-  private static final Logger logger = LoggerFactory.getLogger(SetUsingDeviceTemplatePlan.class);
+  private static final Logger logger = LoggerFactory.getLogger(SetUsingSchemaTemplatePlan.class);
   PartialPath prefixPath;
 
-  public SetUsingDeviceTemplatePlan() {
+  public SetUsingSchemaTemplatePlan() {
     super(false, OperatorType.SET_USING_DEVICE_TEMPLATE);
   }
 
-  public SetUsingDeviceTemplatePlan(PartialPath prefixPath) {
+  public SetUsingSchemaTemplatePlan(PartialPath prefixPath) {
     super(false, OperatorType.SET_USING_DEVICE_TEMPLATE);
     this.prefixPath = prefixPath;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 9f79c99..4c45e09 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -59,7 +59,7 @@
 import org.apache.iotdb.db.qp.physical.crud.MeasurementInfo;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.qp.physical.crud.SelectIntoPlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.crud.UDFPlan;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
@@ -1985,7 +1985,7 @@
           req.getPrefixPath());
     }
 
-    SetDeviceTemplatePlan plan = new SetDeviceTemplatePlan(req.templateName, req.prefixPath);
+    SetSchemaTemplatePlan plan = new SetSchemaTemplatePlan(req.templateName, req.prefixPath);
 
     TSStatus status = checkAuthority(plan, req.getSessionId());
     return status != null ? status : executeNonQueryPlan(plan);
diff --git a/server/src/main/java/org/apache/iotdb/db/tools/mlog/MLogParser.java b/server/src/main/java/org/apache/iotdb/db/tools/mlog/MLogParser.java
index c91c845..53a7d05 100644
--- a/server/src/main/java/org/apache/iotdb/db/tools/mlog/MLogParser.java
+++ b/server/src/main/java/org/apache/iotdb/db/tools/mlog/MLogParser.java
@@ -23,7 +23,7 @@
 import org.apache.iotdb.db.metadata.logfile.MLogTxtWriter;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.CreateTemplatePlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.AutoCreateDeviceMNodePlan;
 import org.apache.iotdb.db.qp.physical.sys.ChangeAliasPlan;
 import org.apache.iotdb.db.qp.physical.sys.ChangeTagOffsetPlan;
@@ -35,7 +35,7 @@
 import org.apache.iotdb.db.qp.physical.sys.MeasurementMNodePlan;
 import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan;
 import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan;
-import org.apache.iotdb.db.qp.physical.sys.SetUsingDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.sys.SetUsingSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.StorageGroupMNodePlan;
 
 import org.apache.commons.cli.CommandLine;
@@ -218,10 +218,10 @@
             mLogTxtWriter.createTemplate((CreateTemplatePlan) plan);
             break;
           case SET_DEVICE_TEMPLATE:
-            mLogTxtWriter.setTemplate((SetDeviceTemplatePlan) plan);
+            mLogTxtWriter.setTemplate((SetSchemaTemplatePlan) plan);
             break;
           case SET_USING_DEVICE_TEMPLATE:
-            mLogTxtWriter.setUsingTemplate((SetUsingDeviceTemplatePlan) plan);
+            mLogTxtWriter.setUsingTemplate((SetUsingSchemaTemplatePlan) plan);
             break;
           case AUTO_CREATE_DEVICE_MNODE:
             mLogTxtWriter.autoCreateDeviceNode(
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
index 543840e..5c7c652 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
@@ -28,7 +28,7 @@
 import org.apache.iotdb.db.metadata.template.Template;
 import org.apache.iotdb.db.qp.physical.crud.CreateTemplatePlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowTimeSeriesPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
@@ -853,24 +853,24 @@
     CreateTemplatePlan plan = getCreateTemplatePlan();
 
     MManager manager = IoTDB.metaManager;
-    manager.createDeviceTemplate(plan);
+    manager.createSchemaTemplate(plan);
 
     // set device template
-    SetDeviceTemplatePlan setDeviceTemplatePlan =
-        new SetDeviceTemplatePlan("template1", "root.sg1.d1");
+    SetSchemaTemplatePlan setSchemaTemplatePlan =
+        new SetSchemaTemplatePlan("template1", "root.sg1.d1");
 
-    manager.setDeviceTemplate(setDeviceTemplatePlan);
+    manager.setSchemaTemplate(setSchemaTemplatePlan);
 
     IMNode node = manager.getDeviceNode(new PartialPath("root.sg1.d1"));
-    node = manager.setUsingDeviceTemplate(node);
+    node = manager.setUsingSchemaTemplate(node);
 
     MeasurementSchema s11 =
         new MeasurementSchema("s11", TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY);
-    assertNotNull(node.getDeviceTemplate());
-    assertEquals(node.getDeviceTemplate().getSchemaMap().get("s11"), s11);
+    assertNotNull(node.getSchemaTemplate());
+    assertEquals(node.getSchemaTemplate().getSchemaMap().get("s11"), s11);
 
     Set<IMeasurementSchema> allSchema =
-        new HashSet<>(node.getDeviceTemplate().getSchemaMap().values());
+        new HashSet<>(node.getSchemaTemplate().getSchemaMap().values());
     for (IMeasurementSchema schema :
         manager.getAllMeasurementByDevicePath(new PartialPath("root.sg1.d1"))) {
       allSchema.remove(schema);
@@ -1028,32 +1028,32 @@
     assertFalse(manager.isTemplateCompatible(new Template(plan1), new Template(plan4)));
 
     // test manager
-    manager.createDeviceTemplate(plan1);
-    manager.createDeviceTemplate(plan2);
-    manager.createDeviceTemplate(plan4);
+    manager.createSchemaTemplate(plan1);
+    manager.createSchemaTemplate(plan2);
+    manager.createSchemaTemplate(plan4);
 
-    manager.setDeviceTemplate(new SetDeviceTemplatePlan("template1", "root.sg1.d1"));
+    manager.setSchemaTemplate(new SetSchemaTemplatePlan("template1", "root.sg1.d1"));
     try {
-      manager.setDeviceTemplate(new SetDeviceTemplatePlan("template4", "root.sg1.d1.d2"));
+      manager.setSchemaTemplate(new SetSchemaTemplatePlan("template4", "root.sg1.d1.d2"));
       fail("These two templates are incompatible");
     } catch (MetadataException e) {
       assertEquals("Incompatible template", e.getMessage());
     }
 
-    manager.setDeviceTemplate(new SetDeviceTemplatePlan("template2", "root.sg1.d1.d2"));
+    manager.setSchemaTemplate(new SetSchemaTemplatePlan("template2", "root.sg1.d1.d2"));
   }
 
   @Test
   public void testTemplateAndTimeSeriesCompatibility() throws MetadataException {
     CreateTemplatePlan plan = getCreateTemplatePlan();
     MManager manager = IoTDB.metaManager;
-    manager.createDeviceTemplate(plan);
+    manager.createSchemaTemplate(plan);
 
     // set device template
-    SetDeviceTemplatePlan setDeviceTemplatePlan =
-        new SetDeviceTemplatePlan("template1", "root.sg1.d1");
+    SetSchemaTemplatePlan setSchemaTemplatePlan =
+        new SetSchemaTemplatePlan("template1", "root.sg1.d1");
 
-    manager.setDeviceTemplate(setDeviceTemplatePlan);
+    manager.setSchemaTemplate(setSchemaTemplatePlan);
 
     CreateTimeSeriesPlan createTimeSeriesPlan =
         new CreateTimeSeriesPlan(
@@ -1093,11 +1093,11 @@
   public void testTemplateAndNodePathCompatibility() throws MetadataException {
     MManager manager = IoTDB.metaManager;
     CreateTemplatePlan plan = getCreateTemplatePlan();
-    manager.createDeviceTemplate(plan);
+    manager.createSchemaTemplate(plan);
 
     // set device template
-    SetDeviceTemplatePlan setDeviceTemplatePlan =
-        new SetDeviceTemplatePlan("template1", "root.sg1.d1");
+    SetSchemaTemplatePlan setSchemaTemplatePlan =
+        new SetSchemaTemplatePlan("template1", "root.sg1.d1");
 
     CreateTimeSeriesPlan createTimeSeriesPlan =
         new CreateTimeSeriesPlan(
@@ -1113,7 +1113,7 @@
     manager.createTimeseries(createTimeSeriesPlan);
 
     try {
-      manager.setDeviceTemplate(setDeviceTemplatePlan);
+      manager.setSchemaTemplate(setSchemaTemplatePlan);
       fail();
     } catch (PathAlreadyExistException e) {
       assertEquals("Path [root.sg1.d1.s11] already exist", e.getMessage());
@@ -1134,7 +1134,7 @@
     manager.createTimeseries(createTimeSeriesPlan2);
 
     try {
-      manager.setDeviceTemplate(setDeviceTemplatePlan);
+      manager.setSchemaTemplate(setSchemaTemplatePlan);
       fail();
     } catch (PathAlreadyExistException e) {
       assertEquals("Path [root.sg1.d1.vector] already exist", e.getMessage());
@@ -1258,13 +1258,13 @@
             compressionTypes);
     MManager manager = IoTDB.metaManager;
     try {
-      manager.createDeviceTemplate(plan);
+      manager.createSchemaTemplate(plan);
 
       // set device template
-      SetDeviceTemplatePlan setDeviceTemplatePlan =
-          new SetDeviceTemplatePlan("template1", "root.laptop.d1");
-      manager.setDeviceTemplate(setDeviceTemplatePlan);
-      manager.setUsingDeviceTemplate(manager.getDeviceNode(new PartialPath("root.laptop.d1")));
+      SetSchemaTemplatePlan setSchemaTemplatePlan =
+          new SetSchemaTemplatePlan("template1", "root.laptop.d1");
+      manager.setSchemaTemplate(setSchemaTemplatePlan);
+      manager.setUsingSchemaTemplate(manager.getDeviceNode(new PartialPath("root.laptop.d1")));
 
       // show timeseries root.laptop.d1.s0
       ShowTimeSeriesPlan showTimeSeriesPlan =
@@ -1351,13 +1351,13 @@
             compressionTypes);
     MManager manager = IoTDB.metaManager;
     try {
-      manager.createDeviceTemplate(plan);
+      manager.createSchemaTemplate(plan);
 
       // set device template
-      SetDeviceTemplatePlan setDeviceTemplatePlan =
-          new SetDeviceTemplatePlan("template1", "root.laptop.d1");
-      manager.setDeviceTemplate(setDeviceTemplatePlan);
-      manager.setUsingDeviceTemplate(manager.getDeviceNode(new PartialPath("root.laptop.d1")));
+      SetSchemaTemplatePlan setSchemaTemplatePlan =
+          new SetSchemaTemplatePlan("template1", "root.laptop.d1");
+      manager.setSchemaTemplate(setSchemaTemplatePlan);
+      manager.setUsingSchemaTemplate(manager.getDeviceNode(new PartialPath("root.laptop.d1")));
 
       manager.createTimeseries(
           new PartialPath("root.computer.d1.s2"),
@@ -1366,9 +1366,9 @@
           CompressionType.GZIP,
           null);
 
-      setDeviceTemplatePlan = new SetDeviceTemplatePlan("template1", "root.computer");
-      manager.setDeviceTemplate(setDeviceTemplatePlan);
-      manager.setUsingDeviceTemplate(manager.getDeviceNode(new PartialPath("root.computer.d1")));
+      setSchemaTemplatePlan = new SetSchemaTemplatePlan("template1", "root.computer");
+      manager.setSchemaTemplate(setSchemaTemplatePlan);
+      manager.setUsingSchemaTemplate(manager.getDeviceNode(new PartialPath("root.computer.d1")));
 
       Assert.assertEquals(2, manager.getAllTimeseriesCount(new PartialPath("root.laptop.d1")));
       Assert.assertEquals(1, manager.getAllTimeseriesCount(new PartialPath("root.laptop.d1.s1")));
@@ -1418,12 +1418,12 @@
     MManager manager = IoTDB.metaManager;
 
     try {
-      manager.createDeviceTemplate(plan);
+      manager.createSchemaTemplate(plan);
       // set device template
-      SetDeviceTemplatePlan setDeviceTemplatePlan =
-          new SetDeviceTemplatePlan("template1", "root.laptop.d1");
-      manager.setDeviceTemplate(setDeviceTemplatePlan);
-      manager.setUsingDeviceTemplate(manager.getDeviceNode(new PartialPath("root.laptop.d1")));
+      SetSchemaTemplatePlan setSchemaTemplatePlan =
+          new SetSchemaTemplatePlan("template1", "root.laptop.d1");
+      manager.setSchemaTemplate(setSchemaTemplatePlan);
+      manager.setUsingSchemaTemplate(manager.getDeviceNode(new PartialPath("root.laptop.d1")));
 
       manager.createTimeseries(
           new PartialPath("root.laptop.d2.s1"),
diff --git a/server/src/test/java/org/apache/iotdb/db/qp/physical/InsertRowPlanTest.java b/server/src/test/java/org/apache/iotdb/db/qp/physical/InsertRowPlanTest.java
index 56cb484..c5833f6 100644
--- a/server/src/test/java/org/apache/iotdb/db/qp/physical/InsertRowPlanTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/qp/physical/InsertRowPlanTest.java
@@ -30,7 +30,7 @@
 import org.apache.iotdb.db.qp.physical.crud.CreateTemplatePlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
@@ -133,7 +133,7 @@
   }
 
   @Test
-  public void testInsertRowPlanWithDeviceTemplate()
+  public void testInsertRowPlanWithSchemaTemplate()
       throws QueryProcessException, MetadataException, InterruptedException,
           QueryFilterOptimizationException, StorageEngineException, IOException {
     List<List<String>> measurementList = new ArrayList<>();
@@ -191,8 +191,8 @@
             encodingList,
             compressionTypes);
 
-    IoTDB.metaManager.createDeviceTemplate(plan);
-    IoTDB.metaManager.setDeviceTemplate(new SetDeviceTemplatePlan("template1", "root.isp.d1"));
+    IoTDB.metaManager.createSchemaTemplate(plan);
+    IoTDB.metaManager.setSchemaTemplate(new SetSchemaTemplatePlan("template1", "root.isp.d1"));
 
     IoTDBDescriptor.getInstance().getConfig().setAutoCreateSchemaEnabled(false);
 
diff --git a/server/src/test/java/org/apache/iotdb/db/qp/physical/InsertTabletPlanTest.java b/server/src/test/java/org/apache/iotdb/db/qp/physical/InsertTabletPlanTest.java
index 2efaa68..e663d96 100644
--- a/server/src/test/java/org/apache/iotdb/db/qp/physical/InsertTabletPlanTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/qp/physical/InsertTabletPlanTest.java
@@ -30,7 +30,7 @@
 import org.apache.iotdb.db.qp.physical.crud.CreateTemplatePlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertTabletPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
@@ -170,13 +170,13 @@
   }
 
   @Test
-  public void testInsertTabletPlanWithDeviceTemplate()
+  public void testInsertTabletPlanWithSchemaTemplate()
       throws QueryProcessException, MetadataException, InterruptedException,
           QueryFilterOptimizationException, StorageEngineException, IOException {
     CreateTemplatePlan plan = getCreateTemplatePlan();
 
-    IoTDB.metaManager.createDeviceTemplate(plan);
-    IoTDB.metaManager.setDeviceTemplate(new SetDeviceTemplatePlan("template1", "root.isp"));
+    IoTDB.metaManager.createSchemaTemplate(plan);
+    IoTDB.metaManager.setSchemaTemplate(new SetSchemaTemplatePlan("template1", "root.isp"));
 
     InsertTabletPlan tabletPlan = getInsertTabletPlan();
 
@@ -250,13 +250,13 @@
   }
 
   @Test
-  public void testInsertTabletPlanWithDeviceTemplateAndAutoCreateSchema()
+  public void testInsertTabletPlanWithSchemaTemplateAndAutoCreateSchema()
       throws QueryProcessException, MetadataException, InterruptedException,
           QueryFilterOptimizationException, StorageEngineException, IOException {
     CreateTemplatePlan plan = getCreateTemplatePlan();
 
-    IoTDB.metaManager.createDeviceTemplate(plan);
-    IoTDB.metaManager.setDeviceTemplate(new SetDeviceTemplatePlan("template1", "root.isp"));
+    IoTDB.metaManager.createSchemaTemplate(plan);
+    IoTDB.metaManager.setSchemaTemplate(new SetSchemaTemplatePlan("template1", "root.isp"));
     InsertTabletPlan tabletPlan = getInsertTabletPlan();
 
     PlanExecutor executor = new PlanExecutor();
diff --git a/server/src/test/java/org/apache/iotdb/db/query/reader/series/SeriesReaderTestUtil.java b/server/src/test/java/org/apache/iotdb/db/query/reader/series/SeriesReaderTestUtil.java
index 2a9d808..3ced025 100644
--- a/server/src/test/java/org/apache/iotdb/db/query/reader/series/SeriesReaderTestUtil.java
+++ b/server/src/test/java/org/apache/iotdb/db/query/reader/series/SeriesReaderTestUtil.java
@@ -172,7 +172,7 @@
     for (MeasurementSchema measurementSchema : measurementSchemas) {
       template.put(measurementSchema.getMeasurementId(), measurementSchema);
     }
-    fileWriter.registerDeviceTemplate("template0", template);
+    fileWriter.registerSchemaTemplate("template0", template);
     for (String deviceId : deviceIds) {
       fileWriter.registerDevice(deviceId, "template0");
     }
diff --git a/server/src/test/java/org/apache/iotdb/db/tools/MLogParserTest.java b/server/src/test/java/org/apache/iotdb/db/tools/MLogParserTest.java
index 0a033fa..751efc0 100644
--- a/server/src/test/java/org/apache/iotdb/db/tools/MLogParserTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/tools/MLogParserTest.java
@@ -24,7 +24,7 @@
 import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.physical.crud.CreateTemplatePlan;
-import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.SetSchemaTemplatePlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.tools.mlog.MLogParser;
@@ -101,10 +101,10 @@
 
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath("root.sg"));
-      IoTDB.metaManager.createDeviceTemplate(genCreateTemplatePlan());
-      SetDeviceTemplatePlan setDeviceTemplatePlan =
-          new SetDeviceTemplatePlan("template1", "root.sg");
-      IoTDB.metaManager.setDeviceTemplate(setDeviceTemplatePlan);
+      IoTDB.metaManager.createSchemaTemplate(genCreateTemplatePlan());
+      SetSchemaTemplatePlan setSchemaTemplatePlan =
+          new SetSchemaTemplatePlan("template1", "root.sg");
+      IoTDB.metaManager.setSchemaTemplate(setSchemaTemplatePlan);
       IoTDB.metaManager.getDeviceNodeWithAutoCreate(new PartialPath("root.sg.d1"), true, true, 1);
     } catch (MetadataException | IOException e) {
       e.printStackTrace();
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
index f24f023..c27be17 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
@@ -119,7 +119,7 @@
       template.put(
           "sensor" + i, new MeasurementSchema("sensor" + i, TSDataType.INT64, TSEncoding.PLAIN));
     }
-    schema.registerDeviceTemplate("template1", template);
+    schema.registerSchemaTemplate("template1", template);
     for (int i = 0; i < 10; i++) {
       schema.registerDevice("root.sg.device" + i, "template1");
     }
diff --git a/session/src/test/java/org/apache/iotdb/session/SessionTest.java b/session/src/test/java/org/apache/iotdb/session/SessionTest.java
index f9dae22..ad06d3d 100644
--- a/session/src/test/java/org/apache/iotdb/session/SessionTest.java
+++ b/session/src/test/java/org/apache/iotdb/session/SessionTest.java
@@ -206,7 +206,7 @@
   }
 
   @Test
-  public void createDeviceTemplate() throws IoTDBConnectionException, StatementExecutionException {
+  public void createSchemaTemplate() throws IoTDBConnectionException, StatementExecutionException {
     session = new Session("127.0.0.1", 6667, "root", "root", ZoneId.of("+05:00"));
     session.open();
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/TsFileWriter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/TsFileWriter.java
index 490783d..09b8b66 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/TsFileWriter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/TsFileWriter.java
@@ -150,9 +150,9 @@
     }
   }
 
-  public void registerDeviceTemplate(
+  public void registerSchemaTemplate(
       String templateName, Map<String, IMeasurementSchema> template) {
-    schema.registerDeviceTemplate(templateName, template);
+    schema.registerSchemaTemplate(templateName, template);
   }
 
   public void registerDevice(String deviceId, String templateName) {
@@ -189,10 +189,10 @@
       Path path = new Path(record.deviceId, measurementId);
       if (schema.containsTimeseries(path)) {
         groupWriter.tryToAddSeriesWriter(schema.getSeriesSchema(path), pageSize);
-      } else if (schema.getDeviceTemplates() != null && schema.getDeviceTemplates().size() == 1) {
+      } else if (schema.getSchemaTemplates() != null && schema.getSchemaTemplates().size() == 1) {
         // use the default template without needing to register device
         Map<String, IMeasurementSchema> template =
-            schema.getDeviceTemplates().entrySet().iterator().next().getValue();
+            schema.getSchemaTemplates().entrySet().iterator().next().getValue();
         if (template.containsKey(path.getMeasurement())) {
           groupWriter.tryToAddSeriesWriter(template.get(path.getMeasurement()), pageSize);
         }
@@ -226,10 +226,10 @@
       Path path = new Path(deviceId, measurementId);
       if (schema.containsTimeseries(path)) {
         groupWriter.tryToAddSeriesWriter(schema.getSeriesSchema(path), pageSize);
-      } else if (schema.getDeviceTemplates() != null && schema.getDeviceTemplates().size() == 1) {
+      } else if (schema.getSchemaTemplates() != null && schema.getSchemaTemplates().size() == 1) {
         // use the default template without needing to register device
         Map<String, IMeasurementSchema> template =
-            schema.getDeviceTemplates().entrySet().iterator().next().getValue();
+            schema.getSchemaTemplates().entrySet().iterator().next().getValue();
         if (template.containsKey(path.getMeasurement())) {
           groupWriter.tryToAddSeriesWriter(template.get(path.getMeasurement()), pageSize);
         }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/Schema.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/Schema.java
index cf45286..b13d984 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/Schema.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/Schema.java
@@ -27,7 +27,7 @@
 import java.util.Map;
 
 /**
- * The schema of timeseries that exist in this file. The deviceTemplates is a simplified manner to
+ * The schema of timeseries that exist in this file. The schemaTemplates is a simplified manner to
  * batch create schema of timeseries.
  */
 public class Schema implements Serializable {
@@ -39,7 +39,7 @@
   private Map<Path, IMeasurementSchema> registeredTimeseries;
 
   /** template name -> (measurement -> MeasurementSchema) */
-  private Map<String, Map<String, IMeasurementSchema>> deviceTemplates;
+  private Map<String, Map<String, IMeasurementSchema>> schemaTemplates;
 
   public Schema() {
     this.registeredTimeseries = new LinkedHashMap<>();
@@ -53,29 +53,29 @@
     this.registeredTimeseries.put(path, descriptor);
   }
 
-  public void registerDeviceTemplate(
+  public void registerSchemaTemplate(
       String templateName, Map<String, IMeasurementSchema> template) {
-    if (deviceTemplates == null) {
-      deviceTemplates = new HashMap<>();
+    if (schemaTemplates == null) {
+      schemaTemplates = new HashMap<>();
     }
-    this.deviceTemplates.put(templateName, template);
+    this.schemaTemplates.put(templateName, template);
   }
 
   public void extendTemplate(String templateName, IMeasurementSchema descriptor) {
-    if (deviceTemplates == null) {
-      deviceTemplates = new HashMap<>();
+    if (schemaTemplates == null) {
+      schemaTemplates = new HashMap<>();
     }
     Map<String, IMeasurementSchema> template =
-        this.deviceTemplates.getOrDefault(templateName, new HashMap<>());
+        this.schemaTemplates.getOrDefault(templateName, new HashMap<>());
     template.put(descriptor.getMeasurementId(), descriptor);
-    this.deviceTemplates.put(templateName, template);
+    this.schemaTemplates.put(templateName, template);
   }
 
   public void registerDevice(String deviceId, String templateName) {
-    if (!deviceTemplates.containsKey(templateName)) {
+    if (!schemaTemplates.containsKey(templateName)) {
       return;
     }
-    Map<String, IMeasurementSchema> template = deviceTemplates.get(templateName);
+    Map<String, IMeasurementSchema> template = schemaTemplates.get(templateName);
     for (Map.Entry<String, IMeasurementSchema> entry : template.entrySet()) {
       Path path = new Path(deviceId, entry.getKey());
       registerTimeseries(path, entry.getValue());
@@ -93,8 +93,8 @@
     return registeredTimeseries.get(path).getType();
   }
 
-  public Map<String, Map<String, IMeasurementSchema>> getDeviceTemplates() {
-    return deviceTemplates;
+  public Map<String, Map<String, IMeasurementSchema>> getSchemaTemplates() {
+    return schemaTemplates;
   }
 
   /** check if this schema contains a measurement named measurementId. */
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/DefaultDeviceTemplateTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/DefaultSchemaTemplateTest.java
similarity index 93%
rename from tsfile/src/test/java/org/apache/iotdb/tsfile/write/DefaultDeviceTemplateTest.java
rename to tsfile/src/test/java/org/apache/iotdb/tsfile/write/DefaultSchemaTemplateTest.java
index 82f7df8..a304fdd 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/DefaultDeviceTemplateTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/DefaultSchemaTemplateTest.java
@@ -41,11 +41,11 @@
 import java.util.List;
 import java.util.Map;
 
-public class DefaultDeviceTemplateTest {
+public class DefaultSchemaTemplateTest {
 
   @Test
-  public void testUsingDefaultDeviceTemplate() throws IOException, WriteProcessException {
-    File file = new File("target/defaultDeviceTemplate.tsfile");
+  public void testUsingDefaultSchemaTemplate() throws IOException, WriteProcessException {
+    File file = new File("target/defaultSchemaTemplate.tsfile");
     try (TsFileWriter writer = new TsFileWriter(file)) {
       MeasurementSchema s1 = new MeasurementSchema("s1", TSDataType.INT64, TSEncoding.PLAIN);
       MeasurementSchema s2 = new MeasurementSchema("s2", TSDataType.INT64, TSEncoding.PLAIN);
@@ -58,7 +58,7 @@
       schema.put("s1", s1);
       schema.put("s2", s2);
 
-      writer.registerDeviceTemplate("defaultTemplate", schema);
+      writer.registerSchemaTemplate("defaultTemplate", schema);
 
       Tablet tablet = new Tablet("d1", schemaList);
       long[] timestamps = tablet.timestamps;
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/schema/converter/SchemaBuilderTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/schema/converter/SchemaBuilderTest.java
index a8c0638..b8c993f 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/schema/converter/SchemaBuilderTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/schema/converter/SchemaBuilderTest.java
@@ -77,7 +77,7 @@
         "s5",
         new MeasurementSchema(
             "s5", TSDataType.INT32, TSEncoding.TS_2DIFF, CompressionType.UNCOMPRESSED, null));
-    schema.registerDeviceTemplate("template1", template);
+    schema.registerSchemaTemplate("template1", template);
     schema.registerDevice("d1", "template1");
 
     Collection<IMeasurementSchema> timeseries = schema.getRegisteredTimeseriesMap().values();
@@ -105,7 +105,7 @@
         "s5",
         new MeasurementSchema(
             "s5", TSDataType.INT32, TSEncoding.TS_2DIFF, CompressionType.UNCOMPRESSED, null));
-    schema.registerDeviceTemplate("template1", template);
+    schema.registerSchemaTemplate("template1", template);
 
     schema.extendTemplate(
         "template1",
