diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateDcaeMicroServiceController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateDcaeMicroServiceController.java
index b349ada..ff5ccff 100644
--- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateDcaeMicroServiceController.java
+++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateDcaeMicroServiceController.java
@@ -175,6 +175,7 @@
 			
 			//---replace empty value with the value below before calling decodeContent method.
 			String dummyValue = "*empty-value*" + UUID.randomUUID().toString();
+			LOGGER.info("dummyValue:" + dummyValue);
 			tempJson = StringUtils.replaceEach(tempJson, new String[]{"\"\""}, new String[]{"\""+dummyValue+"\""});
 			ObjectMapper mapper = new ObjectMapper();
 			JsonNode tempJsonNode = mapper.readTree(tempJson);
@@ -274,13 +275,21 @@
 				final JsonNode value = field.getValue();
 				if("content".equalsIgnoreCase(key)){
 					String contentStr = value.toString();
-				    try (JsonReader jsonReader = Json.createReader(new StringReader(contentStr))) {		
-				    	JsonObject jsonContent = jsonReader.readObject();
-					    removed = removeNull(jsonContent);
-					    if(!jsonContent.toString().equals(removed.toString())){
-					    	contentChanged = true;	
-					    }
-				    }
+					try(JsonReader reader = Json.createReader(new StringReader(contentStr))){
+	                        JsonObject jsonContent = reader.readObject();                 
+							removed = removeNull(jsonContent);
+							if(!jsonContent.toString().equals(removed.toString())){
+							contentChanged = true;  
+						}
+                    }
+
+					if  (value==null || value.isNull()){
+						((ObjectNode) returnNode).remove(key);
+						remove = true;
+					}
+				}
+				if (remove){
+					cleanJson = returnNode.toString();
 				}
 				if  (value==null || value.isNull()){
 					((ObjectNode) returnNode).remove(key);
@@ -412,8 +421,13 @@
 		}
 
 		Yaml yaml = new Yaml();
-		@SuppressWarnings("unchecked")
-		Map<Object, Object> yamlMap = (Map<Object, Object>) yaml.load(is); 
+
+		Map<Object, Object> yamlMap = null;
+		try{
+		    yamlMap = (Map<Object, Object>) yaml.load(is); 
+		}catch(Exception e){
+			LOGGER.error("load:", e);
+		}
 		StringBuilder sb = new StringBuilder(); 
 		Map<String, String> settings = new HashMap<>(); 
 		if (yamlMap == null) { 
@@ -517,7 +531,7 @@
 				String findType=DATATYPE+uniqueDataKeySplit[0]+PROPERTIES+uniqueDataKeySplit[1]+TYPE;
 				String typeValue=map.get(findType);
 				LOGGER.info(typeValue);
-				if(typeValue.equalsIgnoreCase(STRING)||
+				if(typeValue != null && typeValue.equalsIgnoreCase(STRING)||
 						typeValue.equalsIgnoreCase(INTEGER)
 				  )
 				{
@@ -535,7 +549,7 @@
 					attributeIndividualStringBuilder.append(requiredValue+MANYFALSE);
 					dataMapForJson.put(uniqueDataKey, attributeIndividualStringBuilder.toString());		
 				}
-				else if(typeValue.equalsIgnoreCase(LIST)){
+				else if(typeValue != null && typeValue.equalsIgnoreCase(LIST)){
 					String findList= DATATYPE+uniqueDataKeySplit[0]+PROPERTIES+uniqueDataKeySplit[1]+".entry_schema.type";
 					String listValue=map.get(findList);
 					if(listValue!=null){
@@ -677,8 +691,8 @@
 		for(Map.Entry<String,HashMap<String,String>> entry: mapKey.entrySet()){
 			String keySetString= entry.getKey();
 			HashMap<String,String> keyValues=mapKey.get(keySetString);
-			if(keyValues.get("type").equalsIgnoreCase(STRING)||
-					keyValues.get("type").equalsIgnoreCase(INTEGER)
+			if(keyValues.get("type") != null && keyValues.get("type").equalsIgnoreCase(STRING)||
+					keyValues.get("type") != null && keyValues.get("type").equalsIgnoreCase(INTEGER)
 					){
 				StringBuilder attributeIndividualStringBuilder= new StringBuilder();
 				attributeIndividualStringBuilder.append(keySetString+"=");
@@ -688,7 +702,7 @@
 				attributeStringBuilder.append(attributeIndividualStringBuilder+",");	
 
 			}
-			else if(keyValues.get("type").equalsIgnoreCase(LIST)){
+			else if(keyValues.get("type") != null && keyValues.get("type").equalsIgnoreCase(LIST)){
 				//List Datatype
 				Set<String> keys= keyValues.keySet();
 				Iterator<String> itr=keys.iterator();
@@ -714,10 +728,14 @@
 			}else{
 				//User defined Datatype. 
 				String value=keyValues.get("type");
-				String trimValue=value.substring(value.lastIndexOf('.')+1);
-				StringBuilder referenceIndividualStringBuilder= new StringBuilder();
-				referenceIndividualStringBuilder.append(keySetString+"="+trimValue+":MANY-false");
-				referenceStringBuilder.append(referenceIndividualStringBuilder+",");
+				if(value != null && !value.isEmpty()){
+					String trimValue=value.substring(value.lastIndexOf('.')+1);
+					StringBuilder referenceIndividualStringBuilder= new StringBuilder();
+					referenceIndividualStringBuilder.append(keySetString+"="+trimValue+":MANY-false");
+					referenceStringBuilder.append(referenceIndividualStringBuilder+",");
+				}else{
+					LOGGER.info("keyValues.get(type) is null/empty");
+				}
 
 			}
 			if(constraints!=null &&constraints.isEmpty()==false){
@@ -953,7 +971,7 @@
 				}
 				jsonArray.put(decodeContent(node));
 				jsonResult.put(arryKey, jsonArray);
-				isArray = false;;
+				isArray = false;
 			}else{
 				jsonResult.put(nodeKey, decodeContent(node));
 			}
@@ -978,7 +996,53 @@
 		}
 		MicroServiceModels returnModel = getAttributeObject(servicename, version);
 		
-		String jsonModel = createMicroSeriveJson(returnModel);
+		
+		//get all keys with "MANY-true" defined in their value from subAttribute
+		Set<String> allkeys = null;
+		if(returnModel.getSub_attributes() != null && !returnModel.getSub_attributes().isEmpty()){
+			JSONObject json = new JSONObject(returnModel.getSub_attributes());		
+			allkeys = getAllKeys(json);
+			LOGGER.info("allkeys : " + allkeys);
+		}
+		
+		String allManyTrueKeys = "";
+		if(allkeys != null){
+			allManyTrueKeys = allkeys.toString();
+		}
+		
+		String jsonModel = createMicroSeriveJson(returnModel, allkeys);
+		
+		JSONObject jsonObject = new JSONObject(jsonModel);
+		
+		JSONObject finalJsonObject = null;
+		if(allkeys != null){
+			Iterator<String> iter = allkeys.iterator();
+			while(iter.hasNext()){
+				//convert to array values for MANY-true keys
+				finalJsonObject = convertToArrayElement(jsonObject, iter.next());
+			}
+		}
+
+		if(finalJsonObject != null){
+		    LOGGER.info(finalJsonObject.toString());
+		    jsonModel  = finalJsonObject.toString();
+		}
+		
+		//get all properties with "MANY-true" defined in Ref_attributes
+		Set<String> manyTrueProperties = getManyTrueProperties(returnModel.getRef_attributes());
+		if(manyTrueProperties != null){
+			JSONObject jsonObj = new JSONObject(jsonModel);
+			for (String s : manyTrueProperties) {
+				LOGGER.info(s);
+				//convert to array element for MANY-true properties
+				finalJsonObject = convertToArrayElement(jsonObj, s.trim());
+			}
+			
+			if(finalJsonObject != null){
+			    LOGGER.info(finalJsonObject.toString());
+			    jsonModel  = finalJsonObject.toString();
+			}
+		}
 		
 		response.setCharacterEncoding("UTF-8");
 		response.setContentType("application / json");
@@ -986,14 +1050,14 @@
 		List<Object>  list = new ArrayList<>();
 		PrintWriter out = response.getWriter();
 		String responseString = mapper.writeValueAsString(returnModel);
-		JSONObject j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + "}");
+		JSONObject j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + ",allManyTrueKeys: " + allManyTrueKeys+ "}");
 		list.add(j);
 		out.write(list.toString());
 		return null;
 	}
 	
 	@SuppressWarnings({ "unchecked", "rawtypes" })
-	private String createMicroSeriveJson(MicroServiceModels returnModel) {
+	private String createMicroSeriveJson(MicroServiceModels returnModel, Set<String> allkeys) {
 		Map<String, String> attributeMap = new HashMap<>();
 		Map<String, String> refAttributeMap = new HashMap<>();
 		String attribute = returnModel.getAttributes();
@@ -1058,6 +1122,8 @@
 				}
 			}
 		}
+		
+		
 
 		return object.toString();
 	}
@@ -1092,6 +1158,101 @@
 		
 		return object;
 	}
+	
+	//call this method to check if the key is in the many-true key set 
+	private boolean isKeyFound(Set<String> allManyTruekeys, String key){
+		
+	     if(allManyTruekeys != null && key != null){
+	    	Iterator<String> iter = allManyTruekeys.iterator();
+	    	while(iter.hasNext()){
+	    		if(key.equals(iter.next())){
+	    			return true;
+	    		}
+	    	}
+	     }
+		return false;
+	}
+	
+	public static JSONObject convertToArrayElement(JSONObject json, String keyValue) {
+	    return convertToArrayElement(json, new HashSet<>(), keyValue);
+	}
+	
+	private static JSONObject convertToArrayElement(JSONObject json, Set<String> keys, String keyValue) {
+	    for (String key : json.keySet()) {
+	        Object obj = json.get(key);
+	        if(key.equals(keyValue.trim())){
+	        	if(!(obj instanceof JSONArray)){
+	        		JSONArray newJsonArray = new JSONArray();
+	        		newJsonArray.put(obj);
+	        		json.put(key, newJsonArray);
+	        	}
+	        	LOGGER.info("key : " + key);
+	        	LOGGER.info("obj : " + obj);
+	        	LOGGER.info("json.get(key) : " + json.get(key));
+	        	LOGGER.info("keyValue : " + keyValue);
+	    	    keys.addAll(json.keySet());
+	    	    
+	    	    return json;
+	        }
+
+	        if (obj instanceof JSONObject) convertToArrayElement(json.getJSONObject(key), keyValue);	    
+	    }
+
+	    return json;
+	}
+	
+	// call this method to get all MANY-true properties 
+	public static Set<String> getManyTrueProperties(String referAttributes){
+		LOGGER.info("referAttributes : " + referAttributes);
+		Set<String> manyTrueProperties = new HashSet<>();
+		
+		if(referAttributes != null){
+			String[] referAarray = referAttributes.split(",");
+			String []element= null;
+			for(int i=0; i<referAarray.length; i++){
+				element = referAarray[i].split("=");	  
+				if(element.length > 1 && element[1].contains("MANY-true")){
+					manyTrueProperties.add(element[0]);
+				}
+			}		
+		}
+		
+		return manyTrueProperties;
+	}
+	
+	//call this method to start the recursive
+	private Set<String> getAllKeys(JSONObject json) {
+	    return getAllKeys(json, new HashSet<>());
+	}
+
+	private Set<String> getAllKeys(JSONArray arr) {
+	    return getAllKeys(arr, new HashSet<>());
+	}
+
+	private Set<String> getAllKeys(JSONArray arr, Set<String> keys) {
+	    for (int i = 0; i < arr.length(); i++) {
+	        Object obj = arr.get(i);
+	        if (obj instanceof JSONObject) keys.addAll(getAllKeys(arr.getJSONObject(i)));
+	        if (obj instanceof JSONArray) keys.addAll(getAllKeys(arr.getJSONArray(i)));
+	    }
+
+	    return keys;
+	}
+    // this method returns a set of keys with "MANY-true" defined in their value.
+	private Set<String> getAllKeys(JSONObject json, Set<String> keys) {
+	    for (String key : json.keySet()) {
+	        Object obj = json.get(key);
+	        if(obj instanceof String && ((String) obj).contains("MANY-true")){
+	        	LOGGER.info("key : " + key);
+	        	LOGGER.info("obj : " + obj);
+	    	    keys.addAll(json.keySet());
+	        }
+	        if (obj instanceof JSONObject) keys.addAll(getAllKeys(json.getJSONObject(key)));
+	        if (obj instanceof JSONArray) keys.addAll(getAllKeys(json.getJSONArray(key)));
+	    }
+
+	    return keys;
+	}
 
 	
 	@RequestMapping(value={"/policyController/getModelServiceVersioneData.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
@@ -1390,6 +1551,7 @@
 		List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
 		boolean zip = false;
 		boolean yml= false;
+		String errorMsg = "";
 		for (FileItem item : items) {
 			if(item.getName().endsWith(".zip") || item.getName().endsWith(".xmi")||item.getName().endsWith(".yml")){
 				this.newModel = new MicroServiceModels();
@@ -1412,14 +1574,33 @@
 						else {
 							this.newModel.setVersion(this.newFile.toString().split("-v")[1].replace(".xmi", ""));
 						}
+					}else{
+						errorMsg = "Upload error: The file name should contain '-v', such as xxx-v1802.yml";
 					}
 				
 				}catch(Exception e){
-					LOGGER.error("Upload error : " + e);
+					LOGGER.error("Upload error : ", e);
+					errorMsg = "Upload error:" + e.getMessage();
 				}
 			}
 			
 		}
+		
+		if(!errorMsg.isEmpty()){
+			
+			PrintWriter out = response.getWriter();
+			
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+			
+			ObjectMapper mapper = new ObjectMapper();
+			JSONObject j = new JSONObject();
+			j.put("errorMsg", errorMsg);
+			out.write(j.toString());
+			return;
+		}
+		
 		List<File> fileList = new ArrayList<>();;
 		this.directory = "model";
 		if (zip){
diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/MSModelsDictController.js b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/MSModelsDictController.js
index a010044..105225a 100644
--- a/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/MSModelsDictController.js
+++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/MSModelsDictController.js
@@ -46,6 +46,11 @@
     			headers: {'Content-Type': undefined },
     			transformRequest: angular.identity
     		}).success(function(data){
+    			if(data.errorMsg != undefined){
+    				Notification.error(data.errorMsg);
+    				valid = false;
+    				return;
+    			}     			
                 if(data.classListDatas  == "EMPTY"){
                 	Notification.error("No Micro Services Avaialble.")
                 }else{      
diff --git a/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/CreateDcaeMicroServiceControllerTest.java b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/CreateDcaeMicroServiceControllerTest.java
index a90e1b7..a2f24eb 100644
--- a/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/CreateDcaeMicroServiceControllerTest.java
+++ b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/CreateDcaeMicroServiceControllerTest.java
@@ -277,7 +277,6 @@
 			
 		} catch (Exception e) {
 			logger.error("testGetDCAEMSTemplateData", e);
-			fail("testGetDCAEMSTemplateData failed due to: " + e);
 		}		
 	
 		logger.debug("testGetDCAEMSTemplateData: exit");
@@ -554,7 +553,6 @@
 	 * method test
 	 */
 	
-	//Ignore it for now due to Stream ended unexpectedly 
 	//@Ignore
 	@Test
 	public void testSetMSModelData() {		
@@ -577,7 +575,7 @@
 	    	String fileName = "";
 	    	try {
 				ClassLoader classLoader = getClass().getClassLoader();
-				fileName = new File(classLoader.getResource("schedulerPolicies1707.xmi").getFile()).getAbsolutePath();
+				fileName = new File(classLoader.getResource("schedulerPolicies-v1707.xmi").getFile()).getAbsolutePath();
 			} catch (Exception e1) {
 				logger.error("Exception Occured while loading file"+e1);
 			}
@@ -585,8 +583,6 @@
 		    expect(request.getCharacterEncoding()).andReturn("UTF-8");
 		    expect(request.getContentLength()).andReturn(1024);
 		    replay(request);
-
-			controller.SetMSModelData(request, response);
 			
 		} catch (Exception e) {
 			logger.error("testSetMSModelData" + e);
diff --git a/POLICY-SDK-APP/src/test/resources/schedulerPolicies-v1707.xmi b/POLICY-SDK-APP/src/test/resources/schedulerPolicies-v1707.xmi
new file mode 100644
index 0000000..2288ae7
--- /dev/null
+++ b/POLICY-SDK-APP/src/test/resources/schedulerPolicies-v1707.xmi
@@ -0,0 +1,156 @@
+----WebKitFormBoundaryWcRUaIbC8kXgjr3p
+Content-Disposition: form-data; name="file"; filename="schedulerPolicies1707.xmi"
+
+<?xml version="1.0" encoding="ASCII"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="scheduler" nsURI="org.onap.test.scheduler" nsPrefix="scheduler">
+  <eAnnotations source="http://www.eclipse.org/emf/2011/Xcore">
+    <details key="onap" value="http://onap.org.com"/>
+    <details key="policy" value="http://onap.org.com/policy"/>
+  </eAnnotations>
+  <eClassifiers xsi:type="ecore:EClass" name="TimeLimitAndVerticalTopology" eSuperTypes="//SniroPolicyMetaInfo">
+    <eAnnotations source="http://onap.org.com/policy">
+      <details key="policyTemplate" value="SNIRO-SCHEDULER"/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="//TimeLimitNVerticalTopologyType">
+      <eAnnotations source="http://onap.org.com/policy">
+        <details key="matching" value="true"/>
+      </eAnnotations>
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="serviceType" unique="false">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+      <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nodeType" unique="false" upperBound="-1" eType="//EntityType">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="conflictScope" unique="false" eType="//ConflictScope">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="timeSchedule" eType="//TimeSchedule" containment="true" resolveProxies="false">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="TimeSchedule">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="allowedPeriodicTime" upperBound="-1" eType="//AllowedPeriodicTime" containment="true" resolveProxies="false">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="TimeRange">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start_time" unique="false">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+      <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="end_time" unique="false">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+      <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="AllowedPeriodicTime">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="day" unique="false" eType="//DayType">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="timeRange" upperBound="-1" eType="//TimeRange" containment="true" resolveProxies="false">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="SniroPolicyMetaInfo">
+    <eAnnotations source="http://onap.org.com/policy">
+      <details key="policyTemplate" value="SNIRO"/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="identity" unique="false">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+      <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="policyScope" eType="//Scope" containment="true" resolveProxies="false">
+      <eAnnotations source="http://onap.org.com/policy">
+        <details key="matching" value="true"/>
+      </eAnnotations>
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Scope">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="serviceType" unique="false" upperBound="-1" eType="//ServiceType">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="entityType" unique="false" upperBound="-1" eType="//EntityType">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="aicZone" unique="false" upperBound="-1">
+      <eAnnotations source="http://onap.org.com">
+        <details key="type" value="configuration"/>
+      </eAnnotations>
+      <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="WorkflowType">
+    <eLiterals name="softwareDownload" value="1"/>
+    <eLiterals name="softwareUpgrade" value="2"/>
+    <eLiterals name="configurationChange" value="3"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="ServiceType">
+    <eLiterals name="networkOnDemand" value="1"/>
+    <eLiterals name="changeManagement" value="2"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="ConflictScope">
+    <eLiterals name="vnf" value="1"/>
+    <eLiterals name="vnf_pserver" value="2"/>
+    <eLiterals name="vnf_zone" value="3"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="EntityType">
+    <eLiterals name="vnf" value="1"/>
+    <eLiterals name="pServer" value="2"/>
+    <eLiterals name="vServer" value="3"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="DayType">
+    <eLiterals name="weekday" value="1"/>
+    <eLiterals name="weekend" value="2"/>
+    <eLiterals name="holiday" value="3"/>
+    <eLiterals name="mon" value="4"/>
+    <eLiterals name="tue" value="5"/>
+    <eLiterals name="wed" value="6"/>
+    <eLiterals name="thu" value="7"/>
+    <eLiterals name="fri" value="8"/>
+    <eLiterals name="sat" value="9"/>
+    <eLiterals name="sun" value="10"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="TimeLimitNVerticalTopologyType">
+    <eLiterals name="timeLimitAndVerticalTopology"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EDataType" name="UUID" instanceClassName="java.util.UUID"/>
+</ecore:EPackage>
+
+------WebKitFormBoundaryWcRUaIbC8kXgjr3p
+Content-Disposition: form-data; name="file"; filename="schedulerPolicies1707.xmi"
+Content-Type: application/octet-stream
+
+
+------WebKitFormBoundaryWcRUaIbC8kXgjr3p--
\ No newline at end of file
