diff --git a/org.eclipse.xwt.ui.workbench/META-INF/MANIFEST.MF b/org.eclipse.xwt.ui.workbench/META-INF/MANIFEST.MF
index dcba6d8..2a7fa35 100644
--- a/org.eclipse.xwt.ui.workbench/META-INF/MANIFEST.MF
+++ b/org.eclipse.xwt.ui.workbench/META-INF/MANIFEST.MF
@@ -19,7 +19,10 @@
  org.eclipse.core.databinding;bundle-version="1.3.0",
  org.eclipse.jface.databinding;bundle-version="1.3.100",
  org.eclipse.e4.ui.workbench;bundle-version="0.9.1",
- org.eclipse.e4.ui.di;bundle-version="0.9.0"
+ org.eclipse.e4.ui.di;bundle-version="0.9.0",
+ org.eclipse.ui.views.properties.tabbed;bundle-version="3.6.0",
+ org.eclipse.emf;bundle-version="2.6.0",
+ org.eclipse.emf.edit;bundle-version="2.10.0"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipse.xwt.ui.workbench,
diff --git a/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/ApplicationPropertySheetPage.java b/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/ApplicationPropertySheetPage.java
new file mode 100644
index 0000000..29e3956
--- /dev/null
+++ b/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/ApplicationPropertySheetPage.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2014 Soyatec (http://www.soyatec.com) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Soyatec - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.xwt.ui.workbench.properties;
+
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+
+public class ApplicationPropertySheetPage extends TabbedPropertySheetPage {
+
+	private EditingDomain editingDomain;
+
+	public ApplicationPropertySheetPage(
+			EditingDomain editingDomain,
+			ITabbedPropertySheetPageContributor tabbedPropertySheetPageContributor) {
+		this(editingDomain, tabbedPropertySheetPageContributor, true);
+	}
+
+	public ApplicationPropertySheetPage(
+			EditingDomain editingDomain,
+			ITabbedPropertySheetPageContributor tabbedPropertySheetPageContributor,
+			boolean showTitleBar) {
+		super(tabbedPropertySheetPageContributor, showTitleBar);
+		this.editingDomain = editingDomain;
+	}
+
+	public EditingDomain getEditingDomain() {
+		return editingDomain;
+	}
+
+}
diff --git a/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/XWTSection.java b/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/XWTSection.java
new file mode 100644
index 0000000..be06ee5
--- /dev/null
+++ b/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/XWTSection.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2014 Soyatec (http://www.soyatec.com) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Soyatec - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.xwt.ui.workbench.properties;
+
+import java.net.URL;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+import org.eclipse.xwt.DefaultLoadingContext;
+import org.eclipse.xwt.ILoadingContext;
+import org.eclipse.xwt.XWT;
+
+public class XWTSection extends AbstractPropertySection {
+	private ILoadingContext loadingContext = new DefaultLoadingContext(
+			getClass().getClassLoader());
+
+	private URL sectionURL;
+
+	private Composite self;
+
+	public XWTSection(URL sectionURL) {
+		this.sectionURL = sectionURL;
+	}
+
+	@Override
+	public void createControls(Composite parent,
+			TabbedPropertySheetPage aTabbedPropertySheetPage) {
+		self = new Composite(parent, SWT.NONE);
+
+		GridLayout layout = new GridLayout(1, false);
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		self.setLayout(layout);
+
+		layout = new GridLayout(1, false);
+		layout.verticalSpacing = 5;
+		layout.marginHeight = 5;
+		layout.marginWidth = 5;
+		parent.setLayout(layout);
+
+		GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+		self.setLayoutData(data);
+
+		self.setBackground(parent.getBackground());
+		self.setBackgroundMode(SWT.INHERIT_DEFAULT);
+	}
+
+	@Override
+	public void refresh() {
+		if (self == null || self.isDisposed()) {
+			dispose();
+			return;
+		}
+		for (Control child : self.getChildren()) {
+			child.dispose();
+		}
+		Object source = getDataObject();
+		if (source == null) {
+			return;
+		}
+		if (sectionURL != null) {
+			createSection(self, sectionURL, source);
+		}
+		layout(self);
+	}
+
+	private Object getDataObject() {
+		IStructuredSelection selection = getSelection();
+		return selection.getFirstElement();
+	}
+
+	private Control createSection(Composite parent, URL xwtFile, Object source) {
+		ILoadingContext xwtContext = XWT.getLoadingContext();
+		XWT.setLoadingContext(loadingContext);
+
+		Control control = null;
+		try {
+			control = (Control) XWT.load(parent, xwtFile, source);
+
+			if (control != null) {
+				control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
+						true));
+			}
+		} catch (Exception ex) {
+			Label label = new Label(parent, SWT.NONE);
+			label.setText("An error occured in the property view. The file " + xwtFile + " could not be loaded"); //$NON-NLS-1$ //$NON-NLS-2$
+			ex.printStackTrace();
+		}
+		// layout(parent);
+
+		XWT.setLoadingContext(xwtContext);
+
+		return control;
+	}
+
+	private void layout(Composite parent) {
+		parent.getParent().getParent().layout();
+		parent.getParent().layout();
+		parent.layout();
+	}
+
+	@Override
+	public void dispose() {
+		if (self != null) {
+			self.dispose();
+		}
+		super.dispose();
+	}
+
+	@Override
+	public void setInput(IWorkbenchPart part, ISelection selection) {
+		if (selection == getSelection()) {
+			return;
+		}
+		super.setInput(part, selection);
+	}
+
+	@Override
+	public IStructuredSelection getSelection() {
+		return (IStructuredSelection) super.getSelection();
+	}
+}
diff --git a/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/XWTSectionDescriptor.java b/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/XWTSectionDescriptor.java
new file mode 100644
index 0000000..9cd4140
--- /dev/null
+++ b/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/XWTSectionDescriptor.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2014 Soyatec (http://www.soyatec.com) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Soyatec - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.xwt.ui.workbench.properties;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
+import org.eclipse.ui.views.properties.tabbed.ISection;
+import org.eclipse.xwt.IConstants;
+
+public class XWTSectionDescriptor extends AbstractSectionDescriptor {
+
+	private String id;
+	private String targetTab;
+	private String sectionTypeName;
+	private List<String> inputTypes;
+
+	public XWTSectionDescriptor(String id, String targetTab,
+			String sectionTypeName) {
+		Assert.isNotNull(id, "Section id can not be null");
+		Assert.isNotNull(targetTab, "Tab id can not be null");
+		Assert.isNotNull(sectionTypeName,
+				"URL for renderering section can not be null");
+		this.id = id;
+		this.targetTab = targetTab;
+		this.sectionTypeName = sectionTypeName;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public ISection getSectionClass() {
+		URL sectionURL = null;
+		try {
+			Class<?> type = Class.forName(sectionTypeName);
+			sectionURL = type.getResource(type.getSimpleName()
+					+ IConstants.XWT_EXTENSION_SUFFIX);
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		}
+		return new XWTSection(sectionURL);
+	}
+
+	public String getTargetTab() {
+		return targetTab;
+	}
+
+	public List<String> getInputTypes() {
+		if (inputTypes == null) {
+			inputTypes = new ArrayList<String>();
+		}
+		return inputTypes;
+	}
+
+	public void addInputType(String inputType) {
+		getInputTypes().add(inputType);
+	}
+}
diff --git a/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/XWTTabDescriptor.java b/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/XWTTabDescriptor.java
new file mode 100644
index 0000000..416f1e4
--- /dev/null
+++ b/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/XWTTabDescriptor.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2014 Soyatec (http://www.soyatec.com) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Soyatec - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.xwt.ui.workbench.properties;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
+
+public class XWTTabDescriptor extends AbstractTabDescriptor {
+
+	private String id;
+	private String label;
+	private String category;
+
+	public XWTTabDescriptor(String id, String label, String category) {
+		Assert.isNotNull(id, "Tab id can not be null");
+		this.id = id;
+		this.category = category;
+		this.label = label;
+	}
+
+	public String getCategory() {
+		return category;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public String getLabel() {
+		return label;
+	}
+
+}
diff --git a/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/XWTTabDescriptorProvider.java b/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/XWTTabDescriptorProvider.java
new file mode 100644
index 0000000..44b4afa
--- /dev/null
+++ b/org.eclipse.xwt.ui.workbench/src/org/eclipse/xwt/ui/workbench/properties/XWTTabDescriptorProvider.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2014 Soyatec (http://www.soyatec.com) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Soyatec - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.xwt.ui.workbench.properties;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyRegistry;
+import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyRegistryFactory;
+import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
+import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
+
+@SuppressWarnings("restriction")
+public abstract class XWTTabDescriptorProvider implements ITabDescriptorProvider {
+
+	private IWorkbenchPart previousPart;
+
+	private ISelection previousSelection;
+
+	private ITabDescriptor[] cachedResult;
+
+	public ITabDescriptor[] getTabDescriptors(IWorkbenchPart part,
+			ISelection selection) {
+		if (part != previousPart || selection != previousSelection) {
+			this.previousPart = part;
+			this.previousSelection = selection;
+			List<ITabDescriptor> descriptors = new ArrayList<ITabDescriptor>();
+
+			addTabDescriptors(descriptors);
+
+			// TODO: 2. Define/Get "category" of a TabDescriptor.
+
+			// TODO: Add custom defined Tabs and Section from extensions.
+			// FIXME: In some cases (e.g. Selection in the Papyrus Tree
+			// outline), the IWorkbenchPart is not an
+			// ITabbedPropertySheetPageContributor
+			// TODO: Investigate on this case and fix the issue (contributor ==
+			// null in this case)
+			ITabbedPropertySheetPageContributor contributor;
+			if (part instanceof ITabbedPropertySheetPageContributor) {
+				contributor = (ITabbedPropertySheetPageContributor) part;
+			} else {
+				contributor = (ITabbedPropertySheetPageContributor) (part
+						.getAdapter(ITabbedPropertySheetPageContributor.class));
+			}
+
+			if (contributor != null) {
+				// get all tab descriptors for the registered extension points
+				// Memory leak here
+				TabbedPropertyRegistry registry = TabbedPropertyRegistryFactory
+						.getInstance().createRegistry(contributor);
+
+				// invoke dynamically on the tab registry, as method is private
+				// problem of implementation of tabbed properties tabbed
+				// registry. Either contribution using extension points, either
+				// a tabprovider
+				// both contribution can not exist together, the only solution
+				// is to make a workaround.
+				try {
+					Method method = TabbedPropertyRegistry.class
+							.getDeclaredMethod("getAllTabDescriptors"); //$NON-NLS-1$
+					method.setAccessible(true);
+					ITabDescriptor[] registeredTabDesriptors;
+
+					registeredTabDesriptors = (ITabDescriptor[]) method
+							.invoke(registry);
+
+					if (registeredTabDesriptors != null) {
+						for (ITabDescriptor descriptor : registeredTabDesriptors) {
+							if (descriptor.getSectionDescriptors().size() > 0) {
+								descriptors.add(descriptor);
+							}
+						}
+					}
+				} catch (IllegalArgumentException e) {
+					e.printStackTrace();
+				} catch (IllegalAccessException e) {
+					e.printStackTrace();
+				} catch (InvocationTargetException e) {
+					e.printStackTrace();
+				} catch (SecurityException e) {
+					e.printStackTrace();
+				} catch (NoSuchMethodException e) {
+					e.printStackTrace();
+				}
+			}
+
+			// TODO: need a sort?
+			cachedResult = descriptors.toArray(new ITabDescriptor[descriptors
+					.size()]);
+		}
+		return cachedResult;
+	}
+
+	abstract protected void addTabDescriptors(List<ITabDescriptor> descriptors);
+}
