Bug 539653 - Viewmodel generation does not handle non-ascii chars

Enforce UTF-8 encoding in EMF Forms and ECP.
Most importantly this means:
* View models are saved as UTF-8 when they are generated or edited
* Files edited in the Generic Editor and derived editors (e.g. the Ecore
Editor and the View Template Editor) are saved in UTF-8

Change-Id: I6a9f5c961a1d1c6164a45cd64073a6801adc11bf
Signed-off-by: Lucas Koehler <lkoehler@eclipsesource.com>
diff --git a/bundles/org.eclipse.emf.ecp.ide.editor.view/.classpath b/bundles/org.eclipse.emf.ecp.ide.editor.view/.classpath
index ad32c83..4f83b23 100644
--- a/bundles/org.eclipse.emf.ecp.ide.editor.view/.classpath
+++ b/bundles/org.eclipse.emf.ecp.ide.editor.view/.classpath
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/bundles/org.eclipse.emf.ecp.ide.editor.view/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.emf.ecp.ide.editor.view/.settings/org.eclipse.jdt.core.prefs
index 26d14e4..23a98ed 100644
--- a/bundles/org.eclipse.emf.ecp.ide.editor.view/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.emf.ecp.ide.editor.view/.settings/org.eclipse.jdt.core.prefs
@@ -25,9 +25,9 @@
 org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable

 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled

 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled

-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6

+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8

 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve

-org.eclipse.jdt.core.compiler.compliance=1.6

+org.eclipse.jdt.core.compiler.compliance=1.8

 org.eclipse.jdt.core.compiler.debug.lineNumber=generate

 org.eclipse.jdt.core.compiler.debug.localVariable=generate

 org.eclipse.jdt.core.compiler.debug.sourceFile=generate

@@ -130,7 +130,7 @@
 org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore

 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning

 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning

-org.eclipse.jdt.core.compiler.source=1.6

+org.eclipse.jdt.core.compiler.source=1.8

 org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled

 org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,HIGH,LOW,LOW,LOW,LOW,LOW,NORMAL

 org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,PERF,MEM,POLISH,@generated NOT,@ADDED,APITODO

diff --git a/bundles/org.eclipse.emf.ecp.ide.editor.view/META-INF/MANIFEST.MF b/bundles/org.eclipse.emf.ecp.ide.editor.view/META-INF/MANIFEST.MF
index 6527955..bfe7764 100644
--- a/bundles/org.eclipse.emf.ecp.ide.editor.view/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.emf.ecp.ide.editor.view/META-INF/MANIFEST.MF
@@ -22,7 +22,7 @@
   org.eclipse.emf.ecp.view.migrator;bundle-version="[1.19.0,1.20.0)",
   org.eclipse.emfforms.core.services;bundle-version="[1.19.0,1.20.0)",
   org.eclipse.emf.edit.ui;bundle-version="[2.7.0,3.0.0)"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Import-Package: org.eclipse.emfforms.spi.common.report;version="[1.19.0,1.20.0)"
 Automatic-Module-Name: org.eclipse.emf.ecp.ide.editor.view
diff --git a/bundles/org.eclipse.emf.ecp.ide.editor.view/src/org/eclipse/emf/ecp/ide/editor/view/ViewEditorPart.java b/bundles/org.eclipse.emf.ecp.ide.editor.view/src/org/eclipse/emf/ecp/ide/editor/view/ViewEditorPart.java
index 36fd24d..71926d9 100644
--- a/bundles/org.eclipse.emf.ecp.ide.editor.view/src/org/eclipse/emf/ecp/ide/editor/view/ViewEditorPart.java
+++ b/bundles/org.eclipse.emf.ecp.ide.editor.view/src/org/eclipse/emf/ecp/ide/editor/view/ViewEditorPart.java
@@ -16,8 +16,10 @@
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.EventObject;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
@@ -123,7 +125,7 @@
 			@Override
 			public void execute(IProgressMonitor monitor) {
 				try {
-					resource.save(null);
+					resource.save(getSaveOptions());
 				} catch (final IOException e) {
 					Activator.getDefault().getLog()
 						.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e));
@@ -144,6 +146,17 @@
 
 	}
 
+	/**
+	 * Get the save options used when saving the view model.
+	 *
+	 * @return The save options
+	 */
+	protected Map<Object, Object> getSaveOptions() {
+		final Map<Object, Object> options = new HashMap<>();
+		options.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
+		return options;
+	}
+
 	@Override
 	public void doSaveAs() {
 		// unsupported
@@ -559,7 +572,7 @@
 
 	private void saveChangedView(VView view) {
 		try {
-			view.eResource().save(null);
+			view.eResource().save(getSaveOptions());
 		} catch (final IOException e) {
 			Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e));
 		}
diff --git a/bundles/org.eclipse.emf.ecp.ide.util/src/org/eclipse/emf/ecp/ide/spi/util/ViewModelHelper.java b/bundles/org.eclipse.emf.ecp.ide.util/src/org/eclipse/emf/ecp/ide/spi/util/ViewModelHelper.java
index 02776b2..bb1874a 100644
--- a/bundles/org.eclipse.emf.ecp.ide.util/src/org/eclipse/emf/ecp/ide/spi/util/ViewModelHelper.java
+++ b/bundles/org.eclipse.emf.ecp.ide.util/src/org/eclipse/emf/ecp/ide/spi/util/ViewModelHelper.java
@@ -16,9 +16,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.ResourcesPlugin;
@@ -36,6 +34,7 @@
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.FeatureMap;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecore.xml.type.AnyType;
 import org.eclipse.emf.ecp.view.spi.model.VView;
 import org.eclipse.emf.ecp.view.spi.model.VViewPackage;
@@ -122,8 +121,7 @@
 		}
 
 		// Save the contents of the resource to the file system.
-		final Map<Object, Object> options = new HashMap<Object, Object>();
-		resource.save(options);
+		resource.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 
 		return view;
 	}
diff --git a/bundles/org.eclipse.emf.ecp.ui.view.editor.controls/src/org/eclipse/emf/ecp/view/internal/editor/handler/ControlGenerator.java b/bundles/org.eclipse.emf.ecp.ui.view.editor.controls/src/org/eclipse/emf/ecp/view/internal/editor/handler/ControlGenerator.java
index e357290..d2dc9da 100644
--- a/bundles/org.eclipse.emf.ecp.ui.view.editor.controls/src/org/eclipse/emf/ecp/view/internal/editor/handler/ControlGenerator.java
+++ b/bundles/org.eclipse.emf.ecp.ui.view.editor.controls/src/org/eclipse/emf/ecp/view/internal/editor/handler/ControlGenerator.java
@@ -13,6 +13,7 @@
 package org.eclipse.emf.ecp.view.internal.editor.handler;
 
 import java.io.IOException;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
@@ -28,6 +29,7 @@
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
 import org.eclipse.emf.ecp.core.ECPProject;
 import org.eclipse.emf.ecp.view.internal.editor.controls.Activator;
@@ -130,11 +132,11 @@
 		final VView vview = (VView) resource.getContents().get(0);
 
 		final EClass rootEClass = vview.getRootEClass();
-		final Set<EStructuralFeature> mySet = new
-			LinkedHashSet<EStructuralFeature>(rootEClass.getEAllStructuralFeatures());
+		final Set<EStructuralFeature> mySet = new LinkedHashSet<EStructuralFeature>(
+			rootEClass.getEAllStructuralFeatures());
 		addControls(rootEClass, (VView) resource.getContents().get(0), mySet);
 		try {
-			resource.save(null);
+			resource.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 		} catch (final IOException e) {
 			Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e));
 		}
diff --git a/bundles/org.eclipse.emf.ecp.ui/src/org/eclipse/emf/ecp/internal/ui/util/ECPExportHandlerHelper.java b/bundles/org.eclipse.emf.ecp.ui/src/org/eclipse/emf/ecp/internal/ui/util/ECPExportHandlerHelper.java
index edcd342..cb5ef29 100644
--- a/bundles/org.eclipse.emf.ecp.ui/src/org/eclipse/emf/ecp/internal/ui/util/ECPExportHandlerHelper.java
+++ b/bundles/org.eclipse.emf.ecp.ui/src/org/eclipse/emf/ecp/internal/ui/util/ECPExportHandlerHelper.java
@@ -14,6 +14,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.emf.common.notify.AdapterFactory;
@@ -23,6 +24,7 @@
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecp.internal.ui.Activator;
 import org.eclipse.emf.ecp.internal.ui.PreferenceHelper;
 import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
@@ -168,7 +170,7 @@
 		}
 
 		contents.addAll(eObjects);
-		resource.save(null);
+		resource.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 	}
 
 }
diff --git a/bundles/org.eclipse.emf.ecp.ui/src/org/eclipse/emf/ecp/spi/ui/DefaultUIProvider.java b/bundles/org.eclipse.emf.ecp.ui/src/org/eclipse/emf/ecp/spi/ui/DefaultUIProvider.java
index c35c61b..b4076a7 100644
--- a/bundles/org.eclipse.emf.ecp.ui/src/org/eclipse/emf/ecp/spi/ui/DefaultUIProvider.java
+++ b/bundles/org.eclipse.emf.ecp.ui/src/org/eclipse/emf/ecp/spi/ui/DefaultUIProvider.java
@@ -31,6 +31,7 @@
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecp.common.spi.ChildrenDescriptorCollector;
 import org.eclipse.emf.ecp.core.ECPProject;
 import org.eclipse.emf.ecp.core.ECPRepository;
@@ -415,7 +416,7 @@
 						resource.getContents().add(object);
 
 						try {
-							resource.save(null);
+							resource.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 						} catch (final IOException ex) {
 							Activator.log(ex);
 						}
diff --git a/bundles/org.eclipse.emf.ecp.view.edapt/src/org/eclipse/emf/ecp/view/edapt/EdaptViewModelMigrator.java b/bundles/org.eclipse.emf.ecp.view.edapt/src/org/eclipse/emf/ecp/view/edapt/EdaptViewModelMigrator.java
index 63e90f5..45189ca 100644
--- a/bundles/org.eclipse.emf.ecp.view.edapt/src/org/eclipse/emf/ecp/view/edapt/EdaptViewModelMigrator.java
+++ b/bundles/org.eclipse.emf.ecp.view.edapt/src/org/eclipse/emf/ecp/view/edapt/EdaptViewModelMigrator.java
@@ -41,6 +41,7 @@
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecp.spi.view.migrator.NameSpaceHandler;
 import org.eclipse.emf.ecp.spi.view.migrator.SAXUtil;
 import org.eclipse.emf.ecp.spi.view.migrator.string.StringViewModelMigrator;
@@ -217,7 +218,7 @@
 		final URI uri = URI.createFileURI(historyFile.getAbsolutePath());
 		final Resource resource = new ResourceSetImpl().createResource(uri);
 		resource.getContents().add(history);
-		resource.save(null);
+		resource.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 		return uri;
 	}
 
diff --git a/bundles/org.eclipse.emf.ecp.view.model.preview.e3/src/org/eclipse/emf/ecp/view/model/internal/preview/e3/views/PreviewView.java b/bundles/org.eclipse.emf.ecp.view.model.preview.e3/src/org/eclipse/emf/ecp/view/model/internal/preview/e3/views/PreviewView.java
index e0a92b7..cb3a380 100644
--- a/bundles/org.eclipse.emf.ecp.view.model.preview.e3/src/org/eclipse/emf/ecp/view/model/internal/preview/e3/views/PreviewView.java
+++ b/bundles/org.eclipse.emf.ecp.view.model.preview.e3/src/org/eclipse/emf/ecp/view/model/internal/preview/e3/views/PreviewView.java
@@ -17,6 +17,7 @@
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -36,6 +37,7 @@
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecp.ide.editor.view.ViewEditorPart;
 import org.eclipse.emf.ecp.view.model.common.edit.provider.CustomReflectiveItemProviderAdapterFactory;
 import org.eclipse.emf.ecp.view.model.internal.preview.Activator;
@@ -601,7 +603,7 @@
 		final Resource resource = rs.createResource(URI.createFileURI(result));
 		resource.getContents().add(sampleData);
 		try {
-			resource.save(null);
+			resource.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 		} catch (final IOException e) {
 
 			final StringWriter sw = new StringWriter();
diff --git a/bundles/org.eclipse.emf.ecp.view.table.ui.swt.persistedstate/src/org/eclipse/emf/ecp/internal/view/table/ui/swt/persistedstate/PersistTableStateServiceImpl.java b/bundles/org.eclipse.emf.ecp.view.table.ui.swt.persistedstate/src/org/eclipse/emf/ecp/internal/view/table/ui/swt/persistedstate/PersistTableStateServiceImpl.java
index 0889cb4..4314826 100644
--- a/bundles/org.eclipse.emf.ecp.view.table.ui.swt.persistedstate/src/org/eclipse/emf/ecp/internal/view/table/ui/swt/persistedstate/PersistTableStateServiceImpl.java
+++ b/bundles/org.eclipse.emf.ecp.view.table.ui.swt.persistedstate/src/org/eclipse/emf/ecp/internal/view/table/ui/swt/persistedstate/PersistTableStateServiceImpl.java
@@ -12,6 +12,7 @@
 package org.eclipse.emf.ecp.internal.view.table.ui.swt.persistedstate;
 
 import java.io.IOException;
+import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
@@ -27,6 +28,7 @@
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecp.spi.view.table.ui.swt.persistedstate.PersistTableStateService;
 import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
 import org.eclipse.emf.ecp.view.spi.context.ViewModelContextDisposeListener;
@@ -208,7 +210,7 @@
 			}
 		}
 		try {
-			resource.save(null);
+			resource.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 		} catch (final IOException ex) {
 			reportService.report(new AbstractReport(ex));
 		}
diff --git a/bundles/org.eclipse.emf.ecp.view.template.tooling/src/org/eclipse/emf/ecp/view/template/tooling/wizards/EMFFormsTemplateWizard.java b/bundles/org.eclipse.emf.ecp.view.template.tooling/src/org/eclipse/emf/ecp/view/template/tooling/wizards/EMFFormsTemplateWizard.java
index b846931..ac03b11 100644
--- a/bundles/org.eclipse.emf.ecp.view.template.tooling/src/org/eclipse/emf/ecp/view/template/tooling/wizards/EMFFormsTemplateWizard.java
+++ b/bundles/org.eclipse.emf.ecp.view.template.tooling/src/org/eclipse/emf/ecp/view/template/tooling/wizards/EMFFormsTemplateWizard.java
@@ -15,6 +15,7 @@
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -48,6 +49,7 @@
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecp.view.spi.model.VControl;
 import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
 import org.eclipse.emf.ecp.view.spi.model.VElement;
@@ -417,7 +419,7 @@
 			final ResourceSet rs = new ResourceSetImpl();
 			final Resource templateResource = rs.createResource(URI.createURI(file.getLocationURI().toString()));
 			templateResource.getContents().add(template);
-			templateResource.save(null);
+			templateResource.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 			container.refreshLocal(IResource.DEPTH_ONE, monitor);
 		} catch (final IOException e) {
 
diff --git a/bundles/org.eclipse.emf.ecp.workspace.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.emf.ecp.workspace.core/META-INF/MANIFEST.MF
index a513d0f..0e42393 100644
--- a/bundles/org.eclipse.emf.ecp.workspace.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.emf.ecp.workspace.core/META-INF/MANIFEST.MF
@@ -7,9 +7,10 @@
 Bundle-Vendor: Eclipse Modeling Project
 Export-Package: org.eclipse.emf.ecp.workspace.internal.core;version="1.19.0";x-friends:="org.eclipse.emf.ecp.workspace.ui,org.eclipse.emf.ecp.ui.view.editor.controls"
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
-  org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
-  org.eclipse.emf.ecp.core;bundle-version="[1.19.0,1.20.0)",
-  org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)"
+ org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.emf.ecp.core;bundle-version="[1.19.0,1.20.0)",
+ org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.11.0,3.0.0)"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Automatic-Module-Name: org.eclipse.emf.ecp.workspace.core
 Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.emf.ecp.workspace.core/src/org/eclipse/emf/ecp/workspace/internal/core/WorkspaceProvider.java b/bundles/org.eclipse.emf.ecp.workspace.core/src/org/eclipse/emf/ecp/workspace/internal/core/WorkspaceProvider.java
index 22e5bae..d1e43ae 100644
--- a/bundles/org.eclipse.emf.ecp.workspace.core/src/org/eclipse/emf/ecp/workspace/internal/core/WorkspaceProvider.java
+++ b/bundles/org.eclipse.emf.ecp.workspace.core/src/org/eclipse/emf/ecp/workspace/internal/core/WorkspaceProvider.java
@@ -42,6 +42,7 @@
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.util.EContentAdapter;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecp.core.ECPProject;
 import org.eclipse.emf.ecp.core.ECPRepository;
 import org.eclipse.emf.ecp.core.util.ECPContainer;
@@ -243,6 +244,7 @@
 		try {
 			final Map<Object, Object> saveOptions = new HashMap<Object, Object>();
 			saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
+			saveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
 			final List<Resource> resources = project.getEditingDomain().getResourceSet().getResources();
 			for (final Resource resource : resources) {
 				resource.save(saveOptions);
diff --git a/bundles/org.eclipse.emf.ecp.workspace.ui.rap/META-INF/MANIFEST.MF b/bundles/org.eclipse.emf.ecp.workspace.ui.rap/META-INF/MANIFEST.MF
index c501a92..2a9a67f 100644
--- a/bundles/org.eclipse.emf.ecp.workspace.ui.rap/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.emf.ecp.workspace.ui.rap/META-INF/MANIFEST.MF
@@ -7,14 +7,15 @@
 Bundle-Vendor: Eclipse Modeling Project
 Export-Package: org.eclipse.emf.ecp.workspace.internal.ui;version="1.19.0";x-internal:=true
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
-  org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
-  org.eclipse.emf.ecp.workspace.core;bundle-version="[1.19.0,1.20.0)",
-  org.eclipse.emf.ecp.ui;bundle-version="[1.19.0,1.20.0)",
-  org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)",
-  org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)",
-  org.eclipse.emf.ecp.common.ui;bundle-version="[1.19.0,1.20.0)",
-  org.eclipse.rap.filedialog;bundle-version="[3.1.2,4.0.0)",
-  org.eclipse.rap.rwt;bundle-version="[3.1.2,4.0.0)"
+ org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.emf.ecp.workspace.core;bundle-version="[1.19.0,1.20.0)",
+ org.eclipse.emf.ecp.ui;bundle-version="[1.19.0,1.20.0)",
+ org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.emf.ecp.common.ui;bundle-version="[1.19.0,1.20.0)",
+ org.eclipse.rap.filedialog;bundle-version="[3.1.2,4.0.0)",
+ org.eclipse.rap.rwt;bundle-version="[3.1.2,4.0.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.11.0,3.0.0)"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy
 Import-Package: org.eclipse.core.commands;version="0.0.0",
diff --git a/bundles/org.eclipse.emf.ecp.workspace.ui.rap/src/org/eclipse/emf/ecp/workspace/internal/ui/NewWorkspaceProjectComposite.java b/bundles/org.eclipse.emf.ecp.workspace.ui.rap/src/org/eclipse/emf/ecp/workspace/internal/ui/NewWorkspaceProjectComposite.java
index 984417b..d49d828 100644
--- a/bundles/org.eclipse.emf.ecp.workspace.ui.rap/src/org/eclipse/emf/ecp/workspace/internal/ui/NewWorkspaceProjectComposite.java
+++ b/bundles/org.eclipse.emf.ecp.workspace.ui.rap/src/org/eclipse/emf/ecp/workspace/internal/ui/NewWorkspaceProjectComposite.java
@@ -12,6 +12,7 @@
 package org.eclipse.emf.ecp.workspace.internal.ui;
 
 import java.io.IOException;
+import java.util.Collections;
 
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EClass;
@@ -20,6 +21,7 @@
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecp.core.util.ECPProperties;
 import org.eclipse.emf.ecp.spi.ui.CompositeStateObserver;
 import org.eclipse.emf.ecp.workspace.internal.core.WorkspaceProvider;
@@ -195,7 +197,7 @@
 
 			resource.getContents().add(root);
 			try {
-				resource.save(null);
+				resource.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 			} catch (final IOException ex) {
 				// TODO Auto-generated catch block
 				ex.printStackTrace();
diff --git a/bundles/org.eclipse.emf.ecp.workspace.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.emf.ecp.workspace.ui/META-INF/MANIFEST.MF
index 153e8eb..ec820cd 100644
--- a/bundles/org.eclipse.emf.ecp.workspace.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.emf.ecp.workspace.ui/META-INF/MANIFEST.MF
@@ -7,12 +7,13 @@
 Bundle-Vendor: Eclipse Modeling Project
 Export-Package: org.eclipse.emf.ecp.workspace.internal.ui;version="1.19.0";x-internal:=true
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
-  org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
-  org.eclipse.emf.ecp.workspace.core;bundle-version="[1.19.0,1.20.0)",
-  org.eclipse.emf.ecp.ui;bundle-version="[1.19.0,1.20.0)",
-  org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)",
-  org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)",
-  org.eclipse.emf.ecp.common.ui;bundle-version="[1.19.0,1.20.0)"
+ org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.emf.ecp.workspace.core;bundle-version="[1.19.0,1.20.0)",
+ org.eclipse.emf.ecp.ui;bundle-version="[1.19.0,1.20.0)",
+ org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.emf.ecp.common.ui;bundle-version="[1.19.0,1.20.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.11.0,3.0.0)"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy
 Import-Package: org.eclipse.core.commands;version="0.0.0",
diff --git a/bundles/org.eclipse.emf.ecp.workspace.ui/src/org/eclipse/emf/ecp/workspace/internal/ui/NewWorkspaceProjectComposite.java b/bundles/org.eclipse.emf.ecp.workspace.ui/src/org/eclipse/emf/ecp/workspace/internal/ui/NewWorkspaceProjectComposite.java
index f9462dd..318ce00 100644
--- a/bundles/org.eclipse.emf.ecp.workspace.ui/src/org/eclipse/emf/ecp/workspace/internal/ui/NewWorkspaceProjectComposite.java
+++ b/bundles/org.eclipse.emf.ecp.workspace.ui/src/org/eclipse/emf/ecp/workspace/internal/ui/NewWorkspaceProjectComposite.java
@@ -12,6 +12,7 @@
 package org.eclipse.emf.ecp.workspace.internal.ui;
 
 import java.io.IOException;
+import java.util.Collections;
 import java.util.HashSet;
 
 import org.eclipse.core.resources.IFile;
@@ -27,6 +28,7 @@
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecp.core.util.ECPProperties;
 import org.eclipse.emf.ecp.core.util.ECPUtil;
 import org.eclipse.emf.ecp.spi.common.ui.CompositeFactory;
@@ -413,7 +415,7 @@
 
 			resource.getContents().add(root);
 			try {
-				resource.save(null);
+				resource.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 			} catch (final IOException ex) {
 				// TODO Auto-generated catch block
 				ex.printStackTrace();
diff --git a/bundles/org.eclipse.emfforms.editor.genmodel.util/META-INF/MANIFEST.MF b/bundles/org.eclipse.emfforms.editor.genmodel.util/META-INF/MANIFEST.MF
index 12c37fb..ba331ab 100644
--- a/bundles/org.eclipse.emfforms.editor.genmodel.util/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.emfforms.editor.genmodel.util/META-INF/MANIFEST.MF
@@ -12,6 +12,7 @@
  org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.resources;bundle-version="[3.7.0,4.0.0)",
  org.eclipse.emf.ecore;bundle-version="[2.5.0,3.0.0)",
- org.eclipse.emf.codegen.ecore;bundle-version="[2.5.0,3.0.0)"
+ org.eclipse.emf.codegen.ecore;bundle-version="[2.5.0,3.0.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.11.0,3.0.0)"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Automatic-Module-Name: org.eclipse.emfforms.editor.genmodel.util
diff --git a/bundles/org.eclipse.emfforms.editor.genmodel.util/src/org/eclipse/emfforms/internal/editor/genmodel/util/handler/AddDescriptionTagHandler.java b/bundles/org.eclipse.emfforms.editor.genmodel.util/src/org/eclipse/emfforms/internal/editor/genmodel/util/handler/AddDescriptionTagHandler.java
index 29f1ad1..0ee18bd 100644
--- a/bundles/org.eclipse.emfforms.editor.genmodel.util/src/org/eclipse/emfforms/internal/editor/genmodel/util/handler/AddDescriptionTagHandler.java
+++ b/bundles/org.eclipse.emfforms.editor.genmodel.util/src/org/eclipse/emfforms/internal/editor/genmodel/util/handler/AddDescriptionTagHandler.java
@@ -13,6 +13,7 @@
 
 import java.io.IOException;
 import java.text.MessageFormat;
+import java.util.Collections;
 
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
@@ -24,6 +25,7 @@
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emfforms.editor.genmodel.util.GenModelUtil;
 import org.eclipse.emfforms.internal.editor.genmodel.util.Activator;
 import org.eclipse.jface.viewers.ISelection;
@@ -71,7 +73,7 @@
 			GenModelUtil.addDescriptionTags(genModel, DESCRIPTION_PLACEHOLDER);
 			for (final Resource r : resourceSet.getResources()) {
 				try {
-					r.save(null);
+					r.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 				} catch (final IOException ex) {
 					Activator.log(MessageFormat.format("Could not save resource with URI {0}.", resource.getURI()), ex); //$NON-NLS-1$
 				}
diff --git a/bundles/org.eclipse.emfforms.editor/src/org/eclipse/emfforms/spi/editor/GenericEditor.java b/bundles/org.eclipse.emfforms.editor/src/org/eclipse/emfforms/spi/editor/GenericEditor.java
index aed004c..fd1c755 100644
--- a/bundles/org.eclipse.emfforms.editor/src/org/eclipse/emfforms/spi/editor/GenericEditor.java
+++ b/bundles/org.eclipse.emfforms.editor/src/org/eclipse/emfforms/spi/editor/GenericEditor.java
@@ -17,7 +17,6 @@
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.EventObject;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -559,7 +558,9 @@
 	 * @since 1.19
 	 */
 	protected Map<Object, Object> getResourceSaveOptions() {
-		return Collections.emptyMap();
+		final Map<Object, Object> saveOptions = new HashMap<Object, Object>();
+		saveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
+		return saveOptions;
 	}
 
 	@Override
diff --git a/bundles/org.eclipse.emfforms.editor/src/org/eclipse/emfforms/spi/editor/helpers/ResourceSetHelpers.java b/bundles/org.eclipse.emfforms.editor/src/org/eclipse/emfforms/spi/editor/helpers/ResourceSetHelpers.java
index 75475a5..cf04de6 100644
--- a/bundles/org.eclipse.emfforms.editor/src/org/eclipse/emfforms/spi/editor/helpers/ResourceSetHelpers.java
+++ b/bundles/org.eclipse.emfforms.editor/src/org/eclipse/emfforms/spi/editor/helpers/ResourceSetHelpers.java
@@ -13,6 +13,7 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -55,7 +56,7 @@
 	 */
 	@Deprecated
 	public static boolean save(ResourceSet resourceSet) {
-		return save(resourceSet, null);
+		return save(resourceSet, Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 	}
 
 	/**
diff --git a/bundles/org.eclipse.emfforms.rulerepository.tooling/src/org/eclipse/emfforms/internal/rulerepository/tooling/merge/MergeWithViewHandler.java b/bundles/org.eclipse.emfforms.rulerepository.tooling/src/org/eclipse/emfforms/internal/rulerepository/tooling/merge/MergeWithViewHandler.java
index d4700a9..b69018f 100644
--- a/bundles/org.eclipse.emfforms.rulerepository.tooling/src/org/eclipse/emfforms/internal/rulerepository/tooling/merge/MergeWithViewHandler.java
+++ b/bundles/org.eclipse.emfforms.rulerepository.tooling/src/org/eclipse/emfforms/internal/rulerepository/tooling/merge/MergeWithViewHandler.java
@@ -13,6 +13,7 @@
 
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
 
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
@@ -31,6 +32,7 @@
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecp.view.spi.model.VView;
 import org.eclipse.emfforms.spi.editor.helpers.ResourceSetHelpers;
 import org.eclipse.emfforms.spi.rulerepository.model.VRuleRepository;
@@ -260,10 +262,8 @@
 				resource.getContents().add(mergedView);
 
 				// Save the contents of the resource to the file system.
-				// final Map<Object, Object> options = new HashMap<Object, Object>();
-				// options.put(XMLResource.OPTION_ENCODING, "UTF-8");
 				try {
-					resource.save(null);
+					resource.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
 				} catch (final IOException ex) {
 					ErrorDialog.openError(activeShell, "Error", //$NON-NLS-1$
 						ex.getMessage(),