diff --git a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/PolicyResource.java b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/PolicyResource.java
index ce900fd..3b3dba9 100644
--- a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/PolicyResource.java
+++ b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/PolicyResource.java
@@ -20,6 +20,7 @@
 import com.google.common.base.Preconditions;
 import com.google.inject.Inject;
 import org.apache.eagle.alert.engine.coordinator.PolicyDefinition;
+import org.apache.eagle.alert.engine.coordinator.Publishment;
 import org.apache.eagle.alert.engine.interpreter.PolicyValidationResult;
 import org.apache.eagle.alert.metadata.resource.OpResult;
 import org.apache.eagle.common.rest.RESTResponse;
@@ -60,14 +61,96 @@
     }
 
     @POST
-    @Path("/import")
+    @Path("/create")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    public RESTResponse<PolicyEntity> saveAsPolicyProto(PolicyEntity policyEntity) {
-        Preconditions.checkNotNull(policyEntity, "policyProto should not be null");
-        Preconditions.checkNotNull(policyEntity.getDefinition(), "policyDefinition should not be null");
-        Preconditions.checkNotNull(policyEntity.getAlertPublishmentIds(), "alert publisher list should not be null");
+    public RESTResponse<PolicyEntity> saveAsPolicyProto(PolicyEntity policyEntity,
+                                                        @QueryParam("needPolicyCreated") boolean needPolicyCreated) {
+        return RESTResponse.async(() -> {
+            Preconditions.checkNotNull(policyEntity, "entity should not be null");
+            Preconditions.checkNotNull(policyEntity, "policy definition should not be null");
+            Preconditions.checkNotNull(policyEntity.getAlertPublishmentIds(), "alert publisher list should not be null");
 
+            PolicyDefinition policyDefinition = policyEntity.getDefinition();
+            if (needPolicyCreated) {
+                OpResult result = metadataResource.addPolicy(policyDefinition);
+                if (result.code != 200) {
+                    throw new IllegalArgumentException(result.message);
+                }
+                result = metadataResource.addPublishmentsToPolicy(policyDefinition.getName(), policyEntity.getAlertPublishmentIds());
+                if (result.code != 200) {
+                    throw new IllegalArgumentException(result.message);
+                }
+            }
+            return importPolicyProto(policyEntity);
+        }).get();
+    }
+
+    @POST
+    @Path("/create/{policyId}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public RESTResponse<PolicyEntity> saveAsPolicyProto(@PathParam("policyId") String policyId) {
+        return RESTResponse.async(() -> {
+            Preconditions.checkNotNull(policyId, "policyId should not be null");
+            PolicyDefinition policyDefinition = metadataResource.getPolicyById(policyId);
+
+            if (policyDefinition == null) {
+                throw new IllegalArgumentException("policy does not exist: " + policyId);
+            }
+
+            PolicyEntity policyEntity = new PolicyEntity();
+            policyEntity.setDefinition(policyDefinition);
+
+            List<Publishment> alertPublishments = metadataResource.getPolicyPublishments(policyId);
+            if (alertPublishments != null && !alertPublishments.isEmpty()){
+                List<String> alertPublisherIds = new ArrayList<>();
+                for (Publishment publishment : alertPublishments) {
+                    alertPublisherIds.add(publishment.getName());
+                }
+                policyEntity.setAlertPublishmentIds(alertPublisherIds);
+            }
+            return importPolicyProto(policyEntity);
+        }).get();
+    }
+
+    @POST
+    @Path("/export/{site}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public RESTResponse<Boolean> loadPoliciesByProto(List<PolicyEntity> policyProtoList, @PathParam("site") String site) {
+        return RESTResponse.async(() -> exportPolicyProto(policyProtoList, site)).get();
+    }
+
+    @POST
+    @Path("/exportByName/{site}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public RESTResponse<Boolean> loadPoliciesByName(List<String> policyProtoList, @PathParam("site") String site) {
+        return RESTResponse.async(() -> {
+            if (policyProtoList == null || policyProtoList.isEmpty()) {
+                throw new IllegalArgumentException("policyProtoList is null or empty");
+            }
+            List<PolicyEntity> policyEntities = new ArrayList<PolicyEntity>();
+            for (String name : policyProtoList) {
+                PolicyEntity entity = policyEntityService.getByUUIDorName(null, name);
+                if (entity != null) {
+                    policyEntities.add(entity);
+                }
+            }
+            return exportPolicyProto(policyEntities, site);
+        }).get();
+    }
+
+    @DELETE
+    @Path("/{uuid}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public RESTResponse<Boolean> deletePolicyProto(@PathParam("uuid") String uuid) {
+        return RESTResponse.async(() -> policyEntityService.deletePolicyProtoByUUID(uuid)).get();
+    }
+
+    private PolicyEntity importPolicyProto(PolicyEntity policyEntity) {
         PolicyDefinition policyDefinition = policyEntity.getDefinition();
         List<String> inputStreamType = new ArrayList<>();
         String newDefinition = policyDefinition.getDefinition().getValue();
@@ -81,32 +164,14 @@
         policyDefinition.setName(PolicyIdConversions.parsePolicyId(policyDefinition.getSiteId(), policyDefinition.getName()));
         policyDefinition.setSiteId(null);
         policyEntity.setDefinition(policyDefinition);
-
-        return createOrUpdatePolicyProto(policyEntity);
+        return policyEntityService.createOrUpdatePolicyProto(policyEntity);
     }
 
-    @POST
-    @Path("/export/{site}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public RESTResponse<List<PolicyDefinition>> loadPolicyDefinition(List<PolicyEntity> policyProtoList, @PathParam("site") String site) {
-        return RESTResponse.async(() -> exportPolicyDefinition(policyProtoList, site)).get();
-    }
-
-    @DELETE
-    @Path("/{uuid}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public RESTResponse<Boolean> deletePolicyProto(@PathParam("uuid") String uuid) {
-        return RESTResponse.async(() -> policyEntityService.deletePolicyProtoByUUID(uuid)).get();
-    }
-
-    private List<PolicyDefinition> exportPolicyDefinition(List<PolicyEntity> policyProtoList, String site) {
+    private Boolean exportPolicyProto(List<PolicyEntity> policyProtoList, String site) {
         Preconditions.checkNotNull(site, "site should not be null");
         if (policyProtoList == null || policyProtoList.isEmpty()) {
             throw new IllegalArgumentException("policy prototype list is empty or null");
         }
-        List<PolicyDefinition> policies = new ArrayList<>();
         for (PolicyEntity policyProto : policyProtoList) {
             PolicyDefinition policyDefinition = policyProto.getDefinition();
             List<String> inputStreams = new ArrayList<>();
@@ -134,9 +199,8 @@
                     throw new IllegalArgumentException("fail to create policy publisherments: " + result.message);
                 }
             }
-            policies.add(policyDefinition);
         }
-        return policies;
+        return true;
     }
 
 }
diff --git a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/PolicyEntityService.java b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/PolicyEntityService.java
index 3e03251..3cf6611 100644
--- a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/PolicyEntityService.java
+++ b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/PolicyEntityService.java
@@ -27,7 +27,7 @@
 
     Collection<PolicyEntity> getAllPolicyProto();
 
-    PolicyEntity getPolicyProtoByUUID(String uuid);
+    PolicyEntity getByUUIDorName(String uuid, String name);
 
     boolean deletePolicyProtoByUUID(String uuid);
 
diff --git a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/memory/PolicyEntityServiceMemoryImpl.java b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/memory/PolicyEntityServiceMemoryImpl.java
index 511b648..d4ce85a 100644
--- a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/memory/PolicyEntityServiceMemoryImpl.java
+++ b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/memory/PolicyEntityServiceMemoryImpl.java
@@ -18,6 +18,7 @@
 package org.apache.eagle.metadata.service.memory;
 
 import com.google.common.base.Preconditions;
+import org.apache.eagle.metadata.exceptions.EntityNotFoundException;
 import org.apache.eagle.metadata.model.PolicyEntity;
 import org.apache.eagle.metadata.service.PolicyEntityService;
 
@@ -33,8 +34,14 @@
     }
 
     @Override
-    public PolicyEntity getPolicyProtoByUUID(String uuid) {
-        return policyProtoMap.get(uuid);
+    public PolicyEntity getByUUIDorName(String uuid, String name) {
+        Preconditions.checkArgument(uuid != null || name != null, "Both uuid and name are null");
+        if (uuid != null) {
+            return policyProtoMap.get(uuid);
+        } else {
+            return policyProtoMap.values().stream().filter(o -> o.getName().equals(name)).findAny()
+                    .orElseThrow(() -> new IllegalArgumentException("Policy proto named " + name + " is not found"));
+        }
     }
 
     @Override
diff --git a/eagle-core/eagle-metadata/eagle-metadata-base/src/test/java/org/apache/eagle/metadata/service/TestPolicyEntityServiceMemoryImpl.java b/eagle-core/eagle-metadata/eagle-metadata-base/src/test/java/org/apache/eagle/metadata/service/TestPolicyEntityServiceMemoryImpl.java
index bfcc1cd..0680c5d 100644
--- a/eagle-core/eagle-metadata/eagle-metadata-base/src/test/java/org/apache/eagle/metadata/service/TestPolicyEntityServiceMemoryImpl.java
+++ b/eagle-core/eagle-metadata/eagle-metadata-base/src/test/java/org/apache/eagle/metadata/service/TestPolicyEntityServiceMemoryImpl.java
@@ -45,6 +45,7 @@
         // define publisher list
         List<String> alertPublisherIds = Arrays.asList("slack");
 
+        // create
         PolicyEntity policyEntity = new PolicyEntity();
         policyEntity.setDefinition(policyDefinition);
         policyEntity.setAlertPublishmentIds(alertPublisherIds);
@@ -55,7 +56,10 @@
         Collection<PolicyEntity> policies =  policyEntityService.getAllPolicyProto();
         Assert.assertTrue(policies.size() == 1);
 
-        PolicyEntity entity = policyEntityService.getPolicyProtoByUUID(policies.iterator().next().getUuid());
+        PolicyEntity entity = policyEntityService.getByUUIDorName(policies.iterator().next().getUuid(), null);
+        Assert.assertTrue(entity.equals(policies.iterator().next()));
+
+        entity = policyEntityService.getByUUIDorName(null, "[null]policy1");
         Assert.assertTrue(entity.equals(policies.iterator().next()));
 
         // test update
diff --git a/eagle-core/eagle-metadata/eagle-metadata-jdbc/src/main/java/org/apache/eagle/metadata/store/jdbc/service/PolicyEntityServiceJDBCImpl.java b/eagle-core/eagle-metadata/eagle-metadata-jdbc/src/main/java/org/apache/eagle/metadata/store/jdbc/service/PolicyEntityServiceJDBCImpl.java
index 65e3757..ac6aed8 100644
--- a/eagle-core/eagle-metadata/eagle-metadata-jdbc/src/main/java/org/apache/eagle/metadata/store/jdbc/service/PolicyEntityServiceJDBCImpl.java
+++ b/eagle-core/eagle-metadata/eagle-metadata-jdbc/src/main/java/org/apache/eagle/metadata/store/jdbc/service/PolicyEntityServiceJDBCImpl.java
@@ -42,9 +42,10 @@
     private static final Logger LOGGER = LoggerFactory.getLogger(PolicyEntityServiceJDBCImpl.class);
 
     private static final String selectSql = "SELECT * FROM policy_prototype";
-    private static final String queryByUUID = "SELECT * FROM policy_prototype where uuid = '%s'";
-    private static final String deleteSqlByUUID = "DELETE FROM policy_prototype where uuid = '%s'";
-    private static final String updateSqlByUUID = "UPDATE policy_prototype SET name = ?, definition = ? , alertPublisherIds = ? , createdtime = ? , modifiedtime = ?  where uuid = ?";
+    private static final String queryByUUID = "SELECT * FROM policy_prototype WHERE uuid = '%s'";
+    private static final String queryByUUIDorName = "SELECT * FROM policy_prototype WHERE uuid = ? or name = ?";
+    private static final String deleteSqlByUUID = "DELETE FROM policy_prototype WHERE uuid = '%s'";
+    private static final String updateSqlByUUID = "UPDATE policy_prototype SET name = ?, definition = ? , alertPublisherIds = ? , createdtime = ? , modifiedtime = ?  WHERE uuid = ?";
     private static final String insertSql = "INSERT INTO policy_prototype (name, definition, alertPublisherIds, createdtime, modifiedtime, uuid) VALUES (?, ?, ?, ?, ?, ?)";
 
     private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@@ -62,11 +63,16 @@
     }
 
     @Override
-    public PolicyEntity getPolicyProtoByUUID(String uuid) {
-        Preconditions.checkNotNull(uuid, "uuid should not be null");
+    public PolicyEntity getByUUIDorName(String uuid, String name) {
+        Preconditions.checkArgument(uuid != null || name != null, "Both uuid and name are null");
         try {
-            return queryService.query(String.format(queryByUUID, uuid), policyEntityMapper).stream()
-                    .findAny().orElseThrow(() -> new EntityNotFoundException("policyProto is not found by uuid"));
+            return queryService.queryWithCond(queryByUUIDorName, o -> {
+                o.setString(1, uuid);
+                o.setString(2, name);
+            }, policyEntityMapper)
+                    .stream()
+                    .findAny()
+                    .orElseThrow(() -> new EntityNotFoundException("policyProto is not found by uuid or name"));
         } catch (Exception e) {
             throw new IllegalArgumentException(e.getMessage(), e);
         }
@@ -87,7 +93,7 @@
     public PolicyEntity update(PolicyEntity policyProto) {
         Preconditions.checkNotNull(policyProto, "Entity should not be null");
         Preconditions.checkNotNull(policyProto.getUuid(), "uuid should not be null");
-        PolicyEntity current = getPolicyProtoByUUID(policyProto.getUuid());
+        PolicyEntity current = getByUUIDorName(policyProto.getUuid(), null);
 
         if (policyProto.getName() != null) {
             current.setName(policyProto.getName());
diff --git a/eagle-core/eagle-metadata/eagle-metadata-jdbc/src/test/java/org/apache/eagle/metadata/store/jdbc/PolicyEntityServiceJDBCImplTest.java b/eagle-core/eagle-metadata/eagle-metadata-jdbc/src/test/java/org/apache/eagle/metadata/store/jdbc/PolicyEntityServiceJDBCImplTest.java
index d68635e..0492bb1 100644
--- a/eagle-core/eagle-metadata/eagle-metadata-jdbc/src/test/java/org/apache/eagle/metadata/store/jdbc/PolicyEntityServiceJDBCImplTest.java
+++ b/eagle-core/eagle-metadata/eagle-metadata-jdbc/src/test/java/org/apache/eagle/metadata/store/jdbc/PolicyEntityServiceJDBCImplTest.java
@@ -58,7 +58,9 @@
         Collection<PolicyEntity> policies =  policyEntityService.getAllPolicyProto();
         Assert.assertTrue(policies.size() == 1);
 
-        PolicyEntity entity = policyEntityService.getPolicyProtoByUUID(policies.iterator().next().getUuid());
+        PolicyEntity entity = policyEntityService.getByUUIDorName(policies.iterator().next().getUuid(), null);
+        Assert.assertTrue(entity.equals(policies.iterator().next()));
+        entity = policyEntityService.getByUUIDorName(null, "[null]policy1");
         Assert.assertTrue(entity.equals(policies.iterator().next()));
 
         // test update
