diff --git a/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PageStyleConstants.java b/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PageStyleConstants.java
new file mode 100755
index 0000000..6b554ce
--- /dev/null
+++ b/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PageStyleConstants.java
@@ -0,0 +1,74 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *	Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.model2doc.odt.internal.util;
+
+/**
+ * the constants used for manipulating PageStyle
+ */
+public final class PageStyleConstants {
+
+	private PageStyleConstants() {
+		// to prevent instanciation
+	}
+
+	/**
+	 * the qualified name to use to create a PageStyle
+	 */
+	public static final String PAGESTYLE_INSTANCE_NAME = "com.sun.star.style.PageStyle"; //$NON-NLS-1$
+
+	/**
+	 * the container of style sheets for pages
+	 */
+	public static final String PAGESTYLE_FAMILY_NAME = "PageStyles"; //$NON-NLS-1$
+
+	/*
+	 * Here some existing PageStyle names
+	 */
+
+	/**
+	 * This page style is provided by LibreOffice
+	 */
+	public static final String PAGESTYLE_NAME_STANDARD = "Standard"; //$NON-NLS-1$
+
+	/**
+	 * This page style can be created by Papyrus-Model2Doc
+	 */
+	public static final String PAGESTYLE_NAME_CUSTOMLANDSCAPE = "CustomLandscape"; //$NON-NLS-1$
+
+	/*
+	 * Here some useful properties to use to edit a PageStyle
+	 */
+	/**
+	 * the width field name
+	 */
+	public static final String WIDTH = "Width"; //$NON-NLS-1$
+
+	/**
+	 * the height field name
+	 */
+	public static final String HEIGHT = "Height"; //$NON-NLS-1$
+
+	/**
+	 * the size field name
+	 */
+	public static final String SIZE = "Size"; //$NON-NLS-1$
+
+	/**
+	 * the isLandscape field name
+	 */
+	public static final String IS_LANDSCAPE = "IsLandscape"; //$NON-NLS-1$
+
+}
diff --git a/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PageStyleUtil.java b/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PageStyleUtil.java
new file mode 100755
index 0000000..ce4dd36
--- /dev/null
+++ b/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PageStyleUtil.java
@@ -0,0 +1,189 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *	Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.model2doc.odt.internal.util;
+
+import org.eclipse.papyrus.model2doc.odt.Activator;
+
+import com.sun.star.awt.Size;
+import com.sun.star.beans.XPropertySet;
+import com.sun.star.container.ElementExistException;
+import com.sun.star.container.NoSuchElementException;
+import com.sun.star.container.XNameContainer;
+import com.sun.star.lang.IllegalArgumentException;
+import com.sun.star.lang.WrappedTargetException;
+import com.sun.star.lang.XMultiServiceFactory;
+import com.sun.star.text.XTextDocument;
+import com.sun.star.uno.Exception;
+import com.sun.star.uno.UnoRuntime;
+
+/**
+ * the constants used by PageStyle
+ */
+public class PageStyleUtil {
+
+	private PageStyleUtil() {
+		// to prevent instanciation
+	}
+
+	/**
+	 * @param xTextDocument
+	 *            the edited document
+	 * @param xDocMSF
+	 *            the multi service factory
+	 * @param pageStyleName
+	 *            the name of the page style we are looking for
+	 * @return
+	 *         <ul>
+	 *         <li><code>true</code> if the existing page style already exists</li>
+	 *         <li><code>false</code> if not found or in case of exception</li>
+	 *         <ul>
+	 */
+	public static boolean isPageStyleAlreadyDefined(final XTextDocument xTextDocument, final XMultiServiceFactory xDocMSF, final String pageStyleName) {
+		final com.sun.star.container.XNameContainer xPageStyleCollection = getPageStyleCollectionContainer(xTextDocument, xDocMSF);
+		if (xPageStyleCollection != null) {
+			return xPageStyleCollection.hasByName(pageStyleName);
+		}
+		return false;
+	}
+
+
+	/**
+	 * @param xTextDocument
+	 *            the edited document
+	 * @param xDocMSF
+	 *            the multi service factory
+	 * @return the container of the existing PageStyle or <code>null</code> if not found (in case of exception...)
+	 */
+	public static XNameContainer getPageStyleCollectionContainer(final XTextDocument xTextDocument, final XMultiServiceFactory xDocMSF) {
+
+		// create a supplier to get the Style family collection
+		final com.sun.star.style.XStyleFamiliesSupplier xSupplier = UnoRuntime.queryInterface(
+				com.sun.star.style.XStyleFamiliesSupplier.class, xTextDocument);
+
+		// get the NameAccess interface from the Style family collection
+		final com.sun.star.container.XNameAccess xNameAccess = xSupplier.getStyleFamilies();
+
+		// select the Page styles, you get the Page style collection
+		com.sun.star.container.XNameContainer xPageStyleCollection;
+		try {
+			xPageStyleCollection = UnoRuntime.queryInterface(
+					com.sun.star.container.XNameContainer.class,
+					xNameAccess.getByName(PageStyleConstants.PAGESTYLE_FAMILY_NAME));
+			return xPageStyleCollection;
+		} catch (NoSuchElementException e) {
+			Activator.log.error(e);
+		} catch (WrappedTargetException e) {
+			Activator.log.error(e);
+		}
+
+		return null;
+	}
+
+	/**
+	 *
+	 * @param xTextDocument
+	 *            the edited text document
+	 * @param xDocMSF
+	 *            the multi service factory
+	 * @param originalPageStyleName
+	 *            the initial page style name used to create a new one
+	 * @param newPageStyleName
+	 *            the name of the new page style
+	 * @return
+	 *         the new page style or <code>null</code>
+	 */
+	public static final XPropertySet createNewPageStyle(final XTextDocument xTextDocument, final XMultiServiceFactory xDocMSF, final String originalPageStyleName, final String newPageStyleName) {
+		if (isPageStyleAlreadyDefined(xTextDocument, xDocMSF, newPageStyleName)) {
+			return null;
+		}
+		final XNameContainer pageStyleCollection = getPageStyleCollectionContainer(xTextDocument, xDocMSF);
+		final XPropertySet basePropertySet = getExistingPageStyle(xTextDocument, xDocMSF, originalPageStyleName);
+		if (basePropertySet != null) {
+			// create a new page style
+			com.sun.star.uno.XInterface xInterface;
+			try {
+				xInterface = (com.sun.star.uno.XInterface) xDocMSF.createInstance(PageStyleConstants.PAGESTYLE_INSTANCE_NAME);
+			} catch (Exception e1) {
+				Activator.log.error(e1);
+				return null;
+			}
+			// get its property set to edit it
+			com.sun.star.beans.XPropertySet xPropertySet = UnoRuntime.queryInterface(com.sun.star.beans.XPropertySet.class, xInterface);
+			PropertySetUtil.copyPropertySet(basePropertySet, xPropertySet);
+			// register the new property set
+			try {
+				pageStyleCollection.insertByName(newPageStyleName, xPropertySet);
+				return xPropertySet;
+			} catch (IllegalArgumentException | ElementExistException | WrappedTargetException e) {
+				Activator.log.error(e);
+			}
+
+		}
+		return null;
+	}
+
+	/**
+	 *
+	 * @param xTextDocument
+	 *            the edited text document
+	 * @param xDocMSF
+	 *            the multi service factory
+	 * @param wantedPageStyleName
+	 *            the page style name we are looking for
+	 * @return
+	 *         the page style or <code>null</code> if not found
+	 */
+	public static final XPropertySet getExistingPageStyle(final XTextDocument xTextDocument, final XMultiServiceFactory xDocMSF, final String wantedPageStyleName) {
+		final com.sun.star.container.XNameContainer xPageStyleCollection = getPageStyleCollectionContainer(xTextDocument, xDocMSF);
+		if (xPageStyleCollection != null) {
+			Object wantedPageStyle;
+			try {
+				wantedPageStyle = xPageStyleCollection.getByName(wantedPageStyleName);
+
+				final com.sun.star.beans.XPropertySet xPropertySet = UnoRuntime.queryInterface(
+						com.sun.star.beans.XPropertySet.class, wantedPageStyle);
+				return xPropertySet;
+			} catch (NoSuchElementException e) {
+				Activator.log.error(e);
+
+			} catch (WrappedTargetException e) {
+				Activator.log.error(e);
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This method creates a Landscape page style called Custom Landscape
+	 *
+	 * @param xTextDocument
+	 *            the edited text document
+	 * @param xDocMSF
+	 *            the multi service factory
+	 */
+	public static final void createCustomLandscapePageStyle(final XTextDocument xTextDocument, final XMultiServiceFactory xDocMSF) {
+		final XPropertySet landscapePropertySet = createNewPageStyle(xTextDocument, xDocMSF, PageStyleConstants.PAGESTYLE_NAME_STANDARD, PageStyleConstants.PAGESTYLE_NAME_CUSTOMLANDSCAPE);
+		final Integer previousHeight = (Integer) PropertySetUtil.getPropertyValue(landscapePropertySet, PageStyleConstants.HEIGHT);
+		final Integer previousWidth = (Integer) PropertySetUtil.getPropertyValue(landscapePropertySet, PageStyleConstants.WIDTH);
+		PropertySetUtil.setProperty(landscapePropertySet, PageStyleConstants.WIDTH, previousHeight);
+		PropertySetUtil.setProperty(landscapePropertySet, PageStyleConstants.HEIGHT, previousWidth);
+
+		final Size s = new Size(previousHeight.intValue(), previousWidth.intValue());
+		PropertySetUtil.setProperty(landscapePropertySet, PageStyleConstants.SIZE, s);
+
+		PropertySetUtil.setProperty(landscapePropertySet, PageStyleConstants.IS_LANDSCAPE, true);
+	}
+}
diff --git a/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PropertySetUtil.java b/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PropertySetUtil.java
index 9bca903..30825f9 100755
--- a/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PropertySetUtil.java
+++ b/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PropertySetUtil.java
@@ -111,5 +111,26 @@
 		}
 	}
 
+	/**
+	 *
+	 * @param source
+	 *            the source property to copy
+	 * @param target
+	 *            the destination property
+	 */
+	public static final void copyPropertySet(final XPropertySet source, final XPropertySet target) {
+		final XPropertySetInfo pSetInfo = source.getPropertySetInfo();
+		for (Property tmp : pSetInfo.getProperties()) {
+			if (!PropertyUtil.isReadOnly(tmp)) {
+				final String propName = tmp.Name;
+				try {
+					target.setPropertyValue(propName, getPropertyValue(source, propName));
+				} catch (IllegalArgumentException | UnknownPropertyException | PropertyVetoException | WrappedTargetException e) {
+					Activator.log.error(NLS.bind("An error occured during the copy of a propertySet, for the property {0}", propName), e); //$NON-NLS-1$
+				}
+			}
+		}
+	}
+
 
 }
diff --git a/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PropertyUtil.java b/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PropertyUtil.java
new file mode 100755
index 0000000..e79631b
--- /dev/null
+++ b/plugins/odt/org.eclipse.papyrus.model2doc.odt/src/org/eclipse/papyrus/model2doc/odt/internal/util/PropertyUtil.java
@@ -0,0 +1,120 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *	Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.model2doc.odt.internal.util;
+
+import com.sun.star.beans.Property;
+import com.sun.star.beans.PropertyAttribute;
+
+/**
+ * @see https://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1beans_1_1PropertyAttribute.html for documentation
+ */
+public class PropertyUtil {
+
+	/**
+	 *
+	 * @param property
+	 * @return
+	 */
+	public static final boolean isMayBeVoid(final Property property) {
+		return isProperty(property, PropertyAttribute.MAYBEVOID);
+	}
+
+	/**
+	 *
+	 * @param property
+	 * @return
+	 */
+	public static final boolean isBound(final Property property) {
+		return isProperty(property, PropertyAttribute.BOUND);
+	}
+
+	/**
+	 *
+	 * @param property
+	 * @return
+	 */
+	public static final boolean isConstrained(final Property property) {
+		return isProperty(property, PropertyAttribute.CONSTRAINED);
+	}
+
+	/**
+	 *
+	 * @param property
+	 * @return
+	 */
+	public static final boolean isTransient(final Property property) {
+		return isProperty(property, PropertyAttribute.TRANSIENT);
+	}
+
+	/**
+	 *
+	 * @param property
+	 * @return
+	 */
+	public static final boolean isReadOnly(final Property property) {
+		return isProperty(property, PropertyAttribute.READONLY);
+	}
+
+	/**
+	 *
+	 * @param property
+	 * @return
+	 */
+	public static final boolean isMayBeAmbiguous(final Property property) {
+		return isProperty(property, PropertyAttribute.MAYBEAMBIGUOUS);
+	}
+
+	/**
+	 *
+	 * @param property
+	 * @return
+	 */
+	public static final boolean isMayBeDefault(final Property property) {
+		return isProperty(property, PropertyAttribute.MAYBEDEFAULT);
+	}
+
+	/**
+	 *
+	 * @param property
+	 * @return
+	 */
+	public static final boolean isRemovable(final Property property) {
+		return isProperty(property, PropertyAttribute.REMOVABLE);
+	}
+
+	/**
+	 *
+	 * @param property
+	 * @return
+	 */
+	public static final boolean isOptional(final Property property) {
+		return isProperty(property, PropertyAttribute.OPTIONAL);
+	}
+
+
+	/**
+	 *
+	 * @param property
+	 *            a property
+	 * @param tag
+	 *            the property value to test
+	 * @return
+	 *         <code>true</code> if the property matches the tag and <code>false</code> otherwise
+	 */
+	private static final boolean isProperty(final Property property, final short tag) {
+		return tag == (property.Attributes & tag);
+	}
+}
