515404: Provide a way to get tables from Papyrus or Sirius

Change-Id: Ib432eeff0fad79320aba98765eb6914e330ba2dc
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=515404
Signed-off-by: Mohamed Ali BACH TOBJI <mohamed-ali.bachtobji@atos.net>
Signed-off-by: Antonio Campesino <antonio.campesino.robles@ericsson.com>
diff --git a/features/org.eclipse.gendoc.feature/feature.xml b/features/org.eclipse.gendoc.feature/feature.xml
index 9b5cf90..07c04e1 100644
--- a/features/org.eclipse.gendoc.feature/feature.xml
+++ b/features/org.eclipse.gendoc.feature/feature.xml
@@ -371,4 +371,10 @@
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.eclipse.gendoc.table"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"/>
+
 </feature>
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.commons/META-INF/MANIFEST.MF b/plugins/org.eclipse.gendoc.bundle.acceleo.commons/META-INF/MANIFEST.MF
index a0f760d..66f6cb0 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.commons/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.commons/META-INF/MANIFEST.MF
@@ -18,7 +18,8 @@
  org.eclipse.emf.edit,
  org.eclipse.gendoc.tags.handlers,
  org.eclipse.gendoc.tags,
- org.eclipse.gendoc.documents
+ org.eclipse.gendoc.documents,
+ org.eclipse.gendoc.table
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy
 Eclipse-LazyStart: true
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.commons/pom.xml b/plugins/org.eclipse.gendoc.bundle.acceleo.commons/pom.xml
index 1eb5092..6dc474c 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.commons/pom.xml
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.commons/pom.xml
@@ -37,6 +37,7 @@
 					</acceleoProject>
 					<packagesToRegister>
 						<packageToRegister>org.eclipse.emf.ecore.EcorePackage</packageToRegister>
+						<packageToRegister>org.eclipse.gendoc.table.TablePackage</packageToRegister>
 					</packagesToRegister>
 				</configuration>
 			</plugin>
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.commons/src/org/eclipse/gendoc/bundle/acceleo/commons/files/CommonService.java b/plugins/org.eclipse.gendoc.bundle.acceleo.commons/src/org/eclipse/gendoc/bundle/acceleo/commons/files/CommonService.java
index ce999b4..a0c34c5 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.commons/src/org/eclipse/gendoc/bundle/acceleo/commons/files/CommonService.java
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.commons/src/org/eclipse/gendoc/bundle/acceleo/commons/files/CommonService.java
@@ -13,7 +13,8 @@
  *		- Add format service
  *  Antonio Campesino (Ericsson) - Bug 477381 - [GenDoc] cleanAndFormat produces 
  *      xml-encoded characters.
- *
+ *  Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net fix bug #515404 : 
+        add new method getTableId() to get unique id for a table  
  *****************************************************************************/
 package org.eclipse.gendoc.bundle.acceleo.commons.files;
 
@@ -44,6 +45,7 @@
 import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
 import org.eclipse.gendoc.documents.IAdditionalResourceService;
 import org.eclipse.gendoc.documents.IDocumentService;
+import org.eclipse.gendoc.documents.ITableService;
 import org.eclipse.gendoc.services.GendocServices;
 import org.eclipse.gendoc.services.IGendocDiagnostician;
 import org.eclipse.gendoc.services.IRegistryService;
@@ -52,6 +54,8 @@
 import org.eclipse.gendoc.tags.handlers.IEMFModelLoaderService;
 import org.osgi.framework.Bundle;
 
+import org.eclipse.gendoc.table.Table;
+
 public class CommonService {
 	
 	
@@ -228,7 +232,21 @@
 		}
 		return id;
 	}
-
+    
+	/**
+	 * Returns a unique table id
+	 * 
+	 * @param table
+	 * @return 
+	 */
+	public static String getTableId(EObject table) {
+		if (table instanceof Table){
+			IDocumentService documentService = GendocServices.getDefault().getService(IDocumentService.class);
+			return documentService.getTableService().getTableId((Table) table);
+		}
+		return null;
+	}
+	
 	/**
 	 * Get the resource containing 'object' and load the resource with same URI
 	 * except for fileExtension, replaced by extensionReplacement
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.commons/src/org/eclipse/gendoc/bundle/acceleo/commons/files/commons.mtl b/plugins/org.eclipse.gendoc.bundle.acceleo.commons/src/org/eclipse/gendoc/bundle/acceleo/commons/files/commons.mtl
index 7806092..17afa84 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.commons/src/org/eclipse/gendoc/bundle/acceleo/commons/files/commons.mtl
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.commons/src/org/eclipse/gendoc/bundle/acceleo/commons/files/commons.mtl
@@ -8,8 +8,9 @@
  
   Contributors:
    Anne Haugommard (Atos Origin) anne.haugommard@atosorigin.com - Initial API and implementation
+   Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net fix bug #515404 : add new method getTableId() to get unique id for a table  
  /]
-[module commons('http://www.eclipse.org/emf/2002/Ecore')/]
+[module commons('http://www.eclipse.org/emf/2002/Ecore','http://www.eclipse.org/gendoc/1.0/table')/]
 
 [comment - Replace special characters inside the given String <, >, &, ', " and replace them by corresponding XML codes/]	
 [query public clean(arg0 : String) : String
@@ -40,6 +41,10 @@
 [query public getId(arg0 : OclAny) : String
 	= invoke('org.eclipse.gendoc.bundle.acceleo.commons.files.CommonService', 'getId(org.eclipse.emf.ecore.EObject)', Sequence{arg0}) /]
 
+[comment - returns a unique ID for the element table in parameter/]
+[query public getTableId(arg0 : OclAny) : String
+	= invoke('org.eclipse.gendoc.bundle.acceleo.commons.files.CommonService', 'getTableId(org.eclipse.emf.ecore.EObject)', Sequence{arg0}) /]
+
 [comment - load (objet : OclAny, extensionReplacement : String) : String
 for a Package p contained in the file located at file://c:/test/file.uml
 the call : p.load('notation') will load the file located at file://c:/test/file.notation /]
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/META-INF/MANIFEST.MF b/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/META-INF/MANIFEST.MF
index 583a8d1..568231f 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/META-INF/MANIFEST.MF
@@ -23,7 +23,15 @@
  org.eclipse.papyrus.uml.tools,
  org.eclipse.papyrus.infra.core.log,
  org.eclipse.papyrus.infra.services.resourceloading,
- org.eclipse.gendoc.bundle.acceleo.commons
+ org.eclipse.gendoc.bundle.acceleo.commons,
+ org.eclipse.papyrus.infra.nattable,
+ org.eclipse.gendoc.documents,
+ org.eclipse.gendoc.table,
+ org.eclipse.nebula.widgets.nattable.core,
+ org.eclipse.papyrus.infra.nattable.model,
+ org.eclipse.papyrus.infra.emf,
+ org.eclipse.papyrus.infra.services.labelprovider,
+ ca.odell.glazedlists
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy
 Eclipse-LazyStart: true
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/build.acceleo b/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/build.acceleo
index 5d0ad38..48a111c 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/build.acceleo
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/build.acceleo
@@ -18,7 +18,7 @@
         <acceleoCompiler 
             sourceFolder="${target.folder}"
             outputFolder="${target.folder}"
-            dependencies="${target.folder}/../../org.eclipse.gendoc.bundle.acceleo.gmf;${target.folder}/../../org.eclipse.gendoc.script.acceleo;${target.folder}/../../org.eclipse.gendoc.m2t;${target.folder}/../../org.eclipse.gendoc.services;${target.folder}/../../org.eclipse.gendoc.document.parser;${target.folder}/../../org.eclipse.gendoc.tags.handlers;${target.folder}/../../org.eclipse.gendoc.documents;${target.folder}/../../org.eclipse.gendoc.tags.parsers;${target.folder}/../../org.eclipse.gendoc.tags;${target.folder}/../../org.eclipse.gendoc.process;"
+            dependencies="${target.folder}/../../org.eclipse.gendoc.bundle.acceleo.gmf;${target.folder}/../../org.eclipse.gendoc.script.acceleo;${target.folder}/../../org.eclipse.gendoc.m2t;${target.folder}/../../org.eclipse.gendoc.services;${target.folder}/../../org.eclipse.gendoc.document.parser;${target.folder}/../../org.eclipse.gendoc.tags.handlers;${target.folder}/../../org.eclipse.gendoc.documents;${target.folder}/../../org.eclipse.gendoc.tags.parsers;${target.folder}/../../org.eclipse.gendoc.tags;${target.folder}/../../org.eclipse.gendoc.process;${target.folder}/../../org.eclipse.gendoc.model;"
             binaryResource="false"
             packagesToRegister="">
         </acceleoCompiler>
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/pom.xml b/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/pom.xml
index 0c0a831..d683e77 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/pom.xml
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/pom.xml
@@ -36,6 +36,9 @@
 					<packagesToRegister>
 						<packageToRegister>org.eclipse.emf.ecore.EcorePackage</packageToRegister>
 						<packageToRegister>org.eclipse.gmf.runtime.notation.NotationPackage</packageToRegister>
+						<packageToRegister>org.eclipse.papyrus.infra.nattable.model.nattable.NattablePackage</packageToRegister>
+						<packageToRegister>org.eclipse.gendoc.table.TablePackage</packageToRegister>
+						<packageToRegister>org.eclipse.uml2.uml.UMLPackage</packageToRegister>
 					</packagesToRegister>
 				</configuration>
 			</plugin>
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/src/org/eclipse/gendoc/bundle/acceleo/papyrus/mtl/papyrus.mtl b/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/src/org/eclipse/gendoc/bundle/acceleo/papyrus/mtl/papyrus.mtl
index 62f5438..b696f70 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/src/org/eclipse/gendoc/bundle/acceleo/papyrus/mtl/papyrus.mtl
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/src/org/eclipse/gendoc/bundle/acceleo/papyrus/mtl/papyrus.mtl
@@ -5,9 +5,10 @@
   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:
+  Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net fix bug #515404 : Papyrus table generation
 /]
-[module papyrus('http://www.eclipse.org/gmf/runtime/1.0.2/notation')/]
+[module papyrus('http://www.eclipse.org/gmf/runtime/1.0.2/notation','http://www.eclipse.org/papyrus/nattable/model','http://www.eclipse.org/gendoc/1.0/table')/]
 
 [comment - get the diagrams of an object /]
 [query public getPapyrusDiagrams(arg0 : ecore::EObject) : Sequence(Diagram)
@@ -24,4 +25,9 @@
 [query public replaceLinksByNameOrLabel(arg0 : String, arg1 : ecore::EObject) : String
 	= invoke('org.eclipse.gendoc.bundle.acceleo.papyrus.service.PapyrusServices', 'replaceLinksByNameOrLabel(java.lang.String, org.eclipse.emf.ecore.EObject)', Sequence{arg0, arg1}) /]
 
+
+[query public  getPapyrusTables (arg0 : ecore::EObject) : Sequence(table::Table)
+= invoke('org.eclipse.gendoc.bundle.acceleo.papyrus.service.PapyrusServices', 'getPapyrusTables(org.eclipse.emf.ecore.EObject)', Sequence{arg0}) /]
+
+
 [comment - virtual order methods must be implemented if the module is integrated to papyrus/]
\ No newline at end of file
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/src/org/eclipse/gendoc/bundle/acceleo/papyrus/service/PapyrusServices.java b/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/src/org/eclipse/gendoc/bundle/acceleo/papyrus/service/PapyrusServices.java
index e2a44de..8a0b0d8 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/src/org/eclipse/gendoc/bundle/acceleo/papyrus/service/PapyrusServices.java
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.papyrus/src/org/eclipse/gendoc/bundle/acceleo/papyrus/service/PapyrusServices.java
@@ -10,12 +10,15 @@
  * Contributors:
  *  Alexia Allanic (Atos Origin) alexia.allanic@atosorigin.com - Initial API and implementation
  *  Anne Haugommard (Atos) anne.haugommard@atos.net - Remove references to Papyrus Documentation services
- *
+ *  Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net - fix bug #515404 : add getPapyrusTables method
+ *  Antonio Campesino Robles (Ericsson) - Support for Tree tables.
  *****************************************************************************/
 package org.eclipse.gendoc.bundle.acceleo.papyrus.service;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map.Entry;
@@ -32,9 +35,15 @@
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.EMap;
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.common.util.WrappedException;
 import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EModelElement;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
+import org.eclipse.emf.transaction.util.TransactionUtil;
 import org.eclipse.gendoc.bundle.acceleo.commons.files.CommonService;
 import org.eclipse.gendoc.bundle.acceleo.gmf.service.GMFServices;
 import org.eclipse.gendoc.bundle.acceleo.papyrus.Activator;
@@ -42,12 +51,38 @@
 import org.eclipse.gendoc.services.IGendocDiagnostician;
 import org.eclipse.gendoc.services.ILogger;
 import org.eclipse.gendoc.services.exception.ModelNotFoundException;
+import org.eclipse.gendoc.services.exception.ServiceException;
 import org.eclipse.gendoc.tags.handlers.IEMFModelLoaderService;
 import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.nebula.widgets.nattable.config.ConfigRegistry;
+import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
+import org.eclipse.nebula.widgets.nattable.layer.AbstractLayer;
+import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
+import org.eclipse.nebula.widgets.nattable.layer.ILayer;
+import org.eclipse.nebula.widgets.nattable.layer.cell.ColumnOverrideLabelAccumulator;
+import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
+import org.eclipse.nebula.widgets.nattable.layer.cell.TranslatedLayerCell;
+import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.nattable.dataprovider.BodyDataProvider;
+import org.eclipse.papyrus.infra.nattable.manager.table.ITableAxisElementProvider;
+import org.eclipse.papyrus.infra.nattable.manager.table.ITreeNattableModelManager;
+import org.eclipse.papyrus.infra.nattable.manager.table.NattableModelManager;
+import org.eclipse.papyrus.infra.nattable.selection.ObjectsSelectionExtractor;
+import org.eclipse.papyrus.infra.nattable.utils.Constants;
+import org.eclipse.papyrus.infra.nattable.utils.LabelProviderCellContextElementWrapper;
+import org.eclipse.papyrus.infra.nattable.utils.NattableConfigAttributes;
+import org.eclipse.papyrus.infra.nattable.utils.NattableModelManagerFactory;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.NamedElement;
 
+import org.eclipse.gendoc.table.Table;
+import org.eclipse.gendoc.table.TableFactory;
+import org.eclipse.gendoc.table.TableHeader;
+
 public class PapyrusServices extends GMFServices {
 
 	private static final String ASSOCIATED_RESOURCES_SOURCE = "http://www.topcased.org/resources";
@@ -236,5 +271,156 @@
 		}
 		return uris;
 	}
+	
+	
+
+	/**
+	 * Get a collection of papyrus tables 
+	 * @param modelElement
+	 * @return
+	 * @throws ServiceException
+	 * @throws org.eclipse.papyrus.infra.core.services.ServiceException 
+	 */
+	public Collection<Table> getPapyrusTables(EObject modelElement) throws ServiceException, org.eclipse.papyrus.infra.core.services.ServiceException {
+		Collection<Table> result = null;
+		
+		URI uri = modelElement.eResource().getURI();
+		Resource diResource = getDiResouce(modelElement, uri.trimFileExtension().appendFileExtension("notation"));
+		EditingDomain domain = TransactionUtil.getEditingDomain(diResource.getResourceSet());
+		if (domain == null) {
+			domain = TransactionalEditingDomainImpl.FactoryImpl.INSTANCE.createEditingDomain(diResource.getResourceSet());
+		}
+		
+		
+		for (Iterator<EObject> i = EcoreUtil.getAllProperContents(diResource, true); i.hasNext();) {
+			EObject eobject = i.next();
+			if (eobject instanceof org.eclipse.papyrus.infra.nattable.model.nattable.Table) {
+
+				org.eclipse.papyrus.infra.nattable.model.nattable.Table table = (org.eclipse.papyrus.infra.nattable.model.nattable.Table) eobject;
+				if (table.getOwner() != null && table.getOwner().equals(modelElement)) {
+					if(result == null)
+					{
+						 result = new LinkedList<org.eclipse.gendoc.table.Table>();
+							
+					}
+					result.add(getGendocTable(table));
+				}
+				
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Transform a Papyrus Table to a GendocTable
+	 * @param table Papyrus Nattable table
+	 * @return the corresponding Gendoc table
+	 * @throws ServiceException LabelProviderService not accessible
+	 * @throws org.eclipse.papyrus.infra.core.services.ServiceException 
+	 */
+	private Table getGendocTable(org.eclipse.papyrus.infra.nattable.model.nattable.Table table) throws ServiceException, org.eclipse.papyrus.infra.core.services.ServiceException {
+		Table gendocTable = TableFactory.eINSTANCE.createTable();
+		// Set Papyrus table name
+		gendocTable.setName(table.getName());
+		// Set Papyrus table type
+		gendocTable.setType(table.getTableConfiguration().getType());
+		// Initialize useful services accessors
+		final NattableModelManager nattableModelManager = (NattableModelManager) NattableModelManagerFactory.INSTANCE
+				.createNatTableModelManager(table, new ObjectsSelectionExtractor());
+				ITableAxisElementProvider axisElementProvider = nattableModelManager.getTableAxisElementProvider(); 
+		List<Object> horizontalHeader = axisElementProvider.getColumnElementsList();
+		LabelProviderService labelProviderService = ServiceUtilsForEObject.getInstance().getServiceRegistry(table.getContext()).getService(LabelProviderService.class);
+		ConfigRegistry configRegistry = new ConfigRegistry();
+		configRegistry.registerConfigAttribute(NattableConfigAttributes.NATTABLE_MODEL_MANAGER_CONFIG_ATTRIBUTE, nattableModelManager, DisplayMode.NORMAL, NattableConfigAttributes.NATTABLE_MODEL_MANAGER_ID);
+		configRegistry.registerConfigAttribute(NattableConfigAttributes.LABEL_PROVIDER_SERVICE_CONFIG_ATTRIBUTE, labelProviderService, DisplayMode.NORMAL, NattableConfigAttributes.LABEL_PROVIDER_SERVICE_ID);
+		LabelProviderService serv = configRegistry.getConfigAttribute(NattableConfigAttributes.LABEL_PROVIDER_SERVICE_CONFIG_ATTRIBUTE, DisplayMode.NORMAL, NattableConfigAttributes.LABEL_PROVIDER_SERVICE_ID);
+		
+		// extracting data from axis
+		TableHeader header = TableFactory.eINSTANCE.createTableHeader();
+		for (Object axis : horizontalHeader) {
+			org.eclipse.gendoc.table.Cell cell = TableFactory.eINSTANCE.createCell();
+			cell.setLabel( getColumnLabel(nattableModelManager, configRegistry, serv, axis));
+			header.getCells().add(cell);
+		}
+		gendocTable.setTableheader(header);
+		
+		// extracting data from body cells
+		
+		//FIXME remove references to ILayer, ILayerCell
+		ILayer  dataLayer = new DataLayer(new BodyDataProvider(nattableModelManager));
+		((AbstractLayer) dataLayer).setConfigLabelAccumulator(new ColumnOverrideLabelAccumulator(dataLayer));
+		((AbstractLayer) dataLayer).setRegionName(GridRegion.BODY);
+		ILayerCell layer = new TranslatedLayerCell(null, dataLayer,0, 0, 0, 0);
+		for (int rowPosition = 0; rowPosition < nattableModelManager.getRowCount(); rowPosition++) {
+			boolean isEmpty = (nattableModelManager instanceof ITreeNattableModelManager);
+			org.eclipse.gendoc.table.Row row = TableFactory.eINSTANCE.createRow();
+			for (int columnPosition = 0; columnPosition < nattableModelManager.getColumnCount(); columnPosition++) {
+				org.eclipse.gendoc.table.Cell cell = TableFactory.eINSTANCE.createCell();
+			   	Object value = nattableModelManager.getDataValue(columnPosition, rowPosition);
+				LabelProviderCellContextElementWrapper contextElement = new LabelProviderCellContextElementWrapper();
+				contextElement.setObject(value);
+				contextElement.setConfigRegistry(configRegistry);
+				ILabelProvider bodylabelProvider = serv.getLabelProvider(Constants.TABLE_LABEL_PROVIDER_CONTEXT, contextElement);
+				contextElement.setCell(layer);
+				String label = bodylabelProvider.getText(value); 
+				cell.setLabel(label);
+				isEmpty = isEmpty && label.isEmpty();
+				row.getCells().add(cell);
+				if (nattableModelManager instanceof ITreeNattableModelManager) {
+					((ITreeNattableModelManager)nattableModelManager).getTreeList().setExpanded(rowPosition, true);
+				}
+			}
+			if (!isEmpty)
+				gendocTable.getRows().add(row);
+		}
+		return gendocTable;
+	}
+
+	/**
+	 * Get a label of Papyrus table axis  
+	 * @param nattableModelManager
+	 * @param configRegistry
+	 * @param serv
+	 * @param axis
+	 * @return
+	 */
+	private String getColumnLabel(final NattableModelManager nattableModelManager, ConfigRegistry configRegistry,
+			LabelProviderService serv, Object axis) {
+		LabelProviderCellContextElementWrapper contextElement = new LabelProviderCellContextElementWrapper();
+		contextElement.setObject(axis);
+		contextElement.setConfigRegistry(configRegistry);
+		
+		//FIXME remove references to ILayer, ILayerCell
+		ILayer  dataLayer = new DataLayer(new BodyDataProvider(nattableModelManager));
+		((AbstractLayer) dataLayer).setConfigLabelAccumulator(new ColumnOverrideLabelAccumulator(dataLayer));
+		((AbstractLayer) dataLayer).setRegionName(GridRegion.COLUMN_HEADER);
+		ILayerCell layer = new TranslatedLayerCell(null, dataLayer,0, 0, 0, 0);
+		contextElement.setCell(layer);
+		ILabelProvider headerlabelProvider = serv.getLabelProvider(Constants.HEADER_LABEL_PROVIDER_CONTEXT, contextElement);
+		return headerlabelProvider.getText(contextElement);
+	}
+
+	/**
+	 * @param modelElement
+	 * @param notationFile
+	 * @return
+	 */
+	private Resource getDiResouce(EObject modelElement, URI notationFile) {
+		Resource diResource = null;
+		if (modelElement.eResource().getURI().equals(notationFile)) {
+			diResource = modelElement.eResource();
+		} else {
+			try {
+				diResource = modelElement.eResource().getResourceSet().getResource(notationFile, true);
+			} catch (WrappedException ex) {
+				IGendocDiagnostician diag = GendocServices.getDefault().getService(IGendocDiagnostician.class);
+				diag.addDiagnostic(new BasicDiagnostic(Diagnostic.ERROR, Activator.PLUGIN_ID, 0,
+						String.format("Resource %s not found", notationFile.toString()), new Object[] { modelElement }));
+				ex.printStackTrace();
+			}
+
+		}
+		return diResource;
+	}
 
 }
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/META-INF/MANIFEST.MF b/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/META-INF/MANIFEST.MF
index 7b933ad..38b28c8 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/META-INF/MANIFEST.MF
@@ -18,7 +18,10 @@
  org.eclipse.gendoc.process,
  org.eclipse.gendoc.tags.handlers,
  org.eclipse.sirius.diagram;bundle-version="2.0.4",
- org.eclipse.gendoc.bundle.acceleo.commons;bundle-version="0.6.0"
+ org.eclipse.gendoc.bundle.acceleo.commons;bundle-version="0.6.0",
+ org.eclipse.sirius.table;bundle-version="4.1.3",
+ org.eclipse.gendoc.documents,
+ org.eclipse.gendoc.table
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
 Eclipse-LazyStart: true
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/pom.xml b/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/pom.xml
index 817090e..ee51c57 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/pom.xml
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/pom.xml
@@ -39,6 +39,7 @@
 						<packageToRegister>org.eclipse.emf.ecore.EcorePackage</packageToRegister>
 						<packageToRegister>org.eclipse.gmf.runtime.notation.NotationPackage</packageToRegister>
 						<packageToRegister>org.eclipse.sirius.diagram.DiagramPackage</packageToRegister>
+						<packageToRegister>org.eclipse.gendoc.table.TablePackage</packageToRegister>
 					</packagesToRegister>
 				</configuration>
 			</plugin>
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/src/org/eclipse/gendoc/bundle/acceleo/sirius/mtl/sirius.mtl b/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/src/org/eclipse/gendoc/bundle/acceleo/sirius/mtl/sirius.mtl
index f3429b5..e95908d 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/src/org/eclipse/gendoc/bundle/acceleo/sirius/mtl/sirius.mtl
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/src/org/eclipse/gendoc/bundle/acceleo/sirius/mtl/sirius.mtl
@@ -5,9 +5,10 @@
   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:
+  Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net fix bug #515404 : Sirius table generation
 /]
-[module sirius('http://www.eclipse.org/gmf/runtime/1.0.2/notation', 'http://www.eclipse.org/sirius/diagram/1.1.0')/]
+[module sirius('http://www.eclipse.org/gmf/runtime/1.0.2/notation', 'http://www.eclipse.org/sirius/diagram/1.1.0','http://www.eclipse.org/gendoc/1.0/table')/]
 
 [comment - get the diagrams of an object /]
 [query public getSiriusDiagrams(arg0 : ecore::EObject) : Sequence(Diagram)
@@ -17,3 +18,7 @@
 [query public getSiriusDiagramName(di : Diagram) : String
 	=  di.eContainer().eContainer().oclAsType(diagram::DSemanticDiagram).name /]
 	 
+
+
+[query public getSiriusTables(arg0 : ecore::EObject) : Sequence(table::Table)
+  = invoke('org.eclipse.gendoc.bundle.acceleo.sirius.service.SiriusServices', 'getSiriusTables(org.eclipse.emf.ecore.EObject)', Sequence{arg0})/]
diff --git a/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/src/org/eclipse/gendoc/bundle/acceleo/sirius/service/SiriusServices.java b/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/src/org/eclipse/gendoc/bundle/acceleo/sirius/service/SiriusServices.java
index 201e25f..00eeac5 100644
--- a/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/src/org/eclipse/gendoc/bundle/acceleo/sirius/service/SiriusServices.java
+++ b/plugins/org.eclipse.gendoc.bundle.acceleo.sirius/src/org/eclipse/gendoc/bundle/acceleo/sirius/service/SiriusServices.java
@@ -13,8 +13,15 @@
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.sirius.business.api.session.CustomDataConstants;
 import org.eclipse.sirius.diagram.DSemanticDiagram;
+import org.eclipse.sirius.table.metamodel.table.DTable;
+import org.eclipse.sirius.table.tools.internal.export.csv.TableCsvHelper;
 import org.eclipse.sirius.viewpoint.description.AnnotationEntry;
 
+import org.eclipse.gendoc.table.Cell;
+import org.eclipse.gendoc.table.Row;
+import org.eclipse.gendoc.table.Table;
+import org.eclipse.gendoc.table.TableFactory;
+import org.eclipse.gendoc.table.TableHeader;
 
 
 public class SiriusServices {
@@ -49,4 +56,62 @@
 		}
 		return result;
 	}
+	
+	/**
+	 * Get sirius tables under element object
+	 * @param element
+	 * @return
+	 */
+	public Collection<org.eclipse.gendoc.table.Table> getSiriusTables(EObject element) {
+		// TO IMPROVE ? reuse existing sirius services ?
+				CommonService.load(element, "aird");
+				ResourceSet set = null;
+				if (element.eResource() != null && element.eResource().getResourceSet() != null){
+					set = element.eResource().getResourceSet();
+				}
+				if (set == null){
+					return null; 
+				}
+				ECrossReferenceAdapter cross = ECrossReferenceAdapter.getCrossReferenceAdapter(set);
+				if (cross == null){
+					cross = new ECrossReferenceAdapter();
+					set.eAdapters().add(cross);
+				}
+						
+				Collection<Setting> inverses = cross.getInverseReferences(element, true);
+		Collection<org.eclipse.gendoc.table.Table> results = new LinkedList<org.eclipse.gendoc.table.Table>();
+		for (Setting s : inverses){
+			if (s.getEObject() instanceof DTable) {
+				
+				DTable sem = (DTable) s.getEObject();
+				Table result = TableFactory.eINSTANCE.createTable();
+				result.setName(sem.getName());
+				Iterable<Iterable<String>> tableDescriptors = TableCsvHelper.getTableDescriptor(sem);
+				int index=0;
+				for (Iterable<java.lang.String> line : tableDescriptors) {
+					if (index==0){
+						TableHeader header = TableFactory.eINSTANCE.createTableHeader();
+						for (String cellValue : line) {
+							Cell cell = TableFactory.eINSTANCE.createCell();
+			                cell.setLabel(cellValue);
+			                header.getCells().add(cell);
+			            }
+						result.setTableheader(header);
+					} else {
+					
+					 Row row = TableFactory.eINSTANCE.createRow();
+					 for (String cellValue : line) {
+						Cell cell = TableFactory.eINSTANCE.createCell();
+		                cell.setLabel(cellValue);
+		                row.getCells().add(cell);
+		             }
+					 result.getRows().add(row);
+					}
+		            index++;
+		        }
+				results.add(result);
+			}
+		}
+		return results;
+	}
 }
diff --git a/plugins/org.eclipse.gendoc.documents/META-INF/MANIFEST.MF b/plugins/org.eclipse.gendoc.documents/META-INF/MANIFEST.MF
index 4239aa5..3d67e89 100644
--- a/plugins/org.eclipse.gendoc.documents/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.gendoc.documents/META-INF/MANIFEST.MF
@@ -11,6 +11,7 @@
  org.eclipse.gendoc.tags.parsers,
  org.eclipse.gendoc.services,
  org.eclipse.gendoc.tags,
- org.apache.xmlgraphics
+ org.apache.xmlgraphics,
+ org.eclipse.gendoc.table
 Export-Package: org.eclipse.gendoc.documents
 Bundle-ClassPath: .
diff --git a/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/AbstractTableService.java b/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/AbstractTableService.java
new file mode 100644
index 0000000..6c24976
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/AbstractTableService.java
@@ -0,0 +1,42 @@
+/*****************************************************************************
+ * Copyright (c) 2017 Atos.
+ * 
+ * 
+ * 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:
+ * Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net - Initial API and implementation
+ *****************************************************************************/
+
+package org.eclipse.gendoc.documents;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.gendoc.documents.impl.IDGenerator;
+import org.eclipse.gendoc.services.AbstractService;
+
+import org.eclipse.gendoc.table.Table;
+
+public abstract class AbstractTableService extends AbstractService implements ITableService{
+
+	/**
+	 * 
+	 * This table is dedicated to save table instances
+	 * Table Map 
+	 */
+	private final Map<String, Table> tableMap = new HashMap<String,Table>();
+	
+	public String getTableId(Table table) {
+		String key = IDGenerator.nextID();
+		tableMap.put(key, table);
+		return key;
+	}
+	
+	public Table getTable(String tableId){
+		return tableMap.get(tableId);
+	}
+}
diff --git a/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/IDocumentService.java b/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/IDocumentService.java
index 070544b..2a50bed 100644
--- a/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/IDocumentService.java
+++ b/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/IDocumentService.java
@@ -103,6 +103,12 @@
     
     String getTableLabel();
     
+   
+    
+    String getRowLabel();
+    
+    String getCellLabel();
+    
     IAdditionalResourceService getAdditionalResourceService();
 
     /**
@@ -136,4 +142,6 @@
      * @return
      */
     public String format(String input); 
+    
+    ITableService getTableService(); 
 }
diff --git a/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/ITableService.java b/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/ITableService.java
new file mode 100644
index 0000000..a016edd
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/ITableService.java
@@ -0,0 +1,54 @@
+/*****************************************************************************
+ * Copyright (c) 2017 Atos.
+ * 
+ * 
+ * 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:
+ * Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net - Initial API and implementation
+ *****************************************************************************/
+
+package org.eclipse.gendoc.documents;
+
+import org.eclipse.gendoc.services.IService;
+import org.eclipse.gendoc.services.exception.InvalidContentException;
+import org.eclipse.gendoc.tags.ITag;
+import org.w3c.dom.Node;
+
+import org.eclipse.gendoc.table.Table;
+
+public interface ITableService extends IService {
+	
+	
+	/**
+	 * Returns the generated table
+	 * @param tag
+	 * @param documentService
+	 * @param returnValue
+	 * @param tableModel
+	 * @param tableNode
+	 * @return
+	 * @throws InvalidContentException
+	 */
+	String manageTable(ITag tag, IDocumentService documentService, StringBuffer returnValue, Object tableModel,
+			Node tableNode) throws InvalidContentException;
+	
+	/**
+	 * Returns a unique Id for the table parameter
+	 * @param e
+	 * @return
+	 */
+	String getTableId(Table e);
+	
+	
+	/**
+	 * Returns the table whose id is given as parameter  
+	 * @param tableId
+	 * @return
+	 */
+	Table getTable(String tableId);
+
+}
diff --git a/plugins/org.eclipse.gendoc.services.docx/META-INF/MANIFEST.MF b/plugins/org.eclipse.gendoc.services.docx/META-INF/MANIFEST.MF
index f69de2d..72c86f2 100644
--- a/plugins/org.eclipse.gendoc.services.docx/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.gendoc.services.docx/META-INF/MANIFEST.MF
@@ -12,9 +12,11 @@
  org.eclipse.gendoc.tags,
  org.eclipse.gendoc.tags.handlers,
  org.eclipse.gendoc.documents.metadata,
- org.eclipse.gendoc.ui
+ org.eclipse.gendoc.ui,
+ org.eclipse.gendoc.table
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipse.gendoc.services.docx
 Eclipse-RegisterBuddy: org.eclipse.gendoc.services
-Import-Package: org.eclipse.emf.common.util
+Import-Package: org.eclipse.emf.common.util,
+ org.eclipse.draw2d.graph
diff --git a/plugins/org.eclipse.gendoc.services.docx/src/org/eclipse/gendoc/services/docx/DOCXDocumentService.java b/plugins/org.eclipse.gendoc.services.docx/src/org/eclipse/gendoc/services/docx/DOCXDocumentService.java
index 6251310..37aeee5 100644
--- a/plugins/org.eclipse.gendoc.services.docx/src/org/eclipse/gendoc/services/docx/DOCXDocumentService.java
+++ b/plugins/org.eclipse.gendoc.services.docx/src/org/eclipse/gendoc/services/docx/DOCXDocumentService.java
@@ -39,6 +39,7 @@
 import org.eclipse.gendoc.document.parser.documents.docx.DocxNamespaceContext;
 import org.eclipse.gendoc.documents.IAdditionalResourceService;
 import org.eclipse.gendoc.documents.IMimeHtmlService;
+import org.eclipse.gendoc.documents.ITableService;
 import org.eclipse.gendoc.documents.XMLDocumentService;
 import org.eclipse.gendoc.documents.metadata.IDocumentMetadataService;
 import org.eclipse.gendoc.services.exception.DocumentServiceException;
@@ -65,11 +66,14 @@
 	/** The Constant TRANSFORMER_FACTORY create a XML transformation . */
 	private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance();
 	
+	private ITableService tableService;
+	
 	public DOCXDocumentService()
     {
         super();
         additionalResourceService = new DOCXAdditionalResourceService();
         mimehtmlservice = new DOCXMimeHtmlService();
+        tableService = new DOCXTableService();
     }
 
     public DOCXDocumentService(Document document)
@@ -77,6 +81,7 @@
         super(document);
         additionalResourceService = new DOCXAdditionalResourceService();
         mimehtmlservice = new DOCXMimeHtmlService();
+        tableService = new DOCXTableService();
     }
 
     public String getListLabel()
@@ -108,6 +113,20 @@
     {
         return "w:tr".equals(label);
     }
+    
+   
+    
+	public String getRowLabel() {
+		
+		return "w:tr";
+	}
+    
+    public String getCellLabel()
+    {
+        return "w:tc";
+    }
+    
+    
 
     public boolean isCell(String label)
     {
@@ -495,5 +514,14 @@
  	    }
 		
 		private Map<String, String> mapping; 
-	}	
+	}
+
+
+
+	@Override
+	public ITableService getTableService() {
+		return tableService;
+	}
+
+	
 }
diff --git a/plugins/org.eclipse.gendoc.services.docx/src/org/eclipse/gendoc/services/docx/DOCXTableService.java b/plugins/org.eclipse.gendoc.services.docx/src/org/eclipse/gendoc/services/docx/DOCXTableService.java
new file mode 100644
index 0000000..4e973c9
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.services.docx/src/org/eclipse/gendoc/services/docx/DOCXTableService.java
@@ -0,0 +1,179 @@
+/*****************************************************************************
+ * Copyright (c) 2017 Atos.
+ * 
+ * 
+ * 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:
+ * Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net - Initial API and implementation
+ *****************************************************************************/
+
+package org.eclipse.gendoc.services.docx;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.gendoc.documents.AbstractTableService;
+import org.eclipse.gendoc.documents.IDocumentService;
+import org.eclipse.gendoc.services.exception.InvalidContentException;
+import org.eclipse.gendoc.tags.ITag;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.eclipse.gendoc.table.Cell;
+import org.eclipse.gendoc.table.Row;
+import org.eclipse.gendoc.table.Table;
+
+public class DOCXTableService extends AbstractTableService {
+
+	/*
+	 * 
+	 * @see
+	 * org.eclipse.gendoc.documents.ITableService#manageTable(org.eclipse.gendoc
+	 * .tags.ITag, org.eclipse.gendoc.documents.IDocumentService,
+	 * java.lang.StringBuffer, java.lang.Object, org.w3c.dom.Node)
+	 */
+	public String manageTable(ITag tag, IDocumentService documentService, StringBuffer returnValue, Object tableModel,
+			Node tableNode) throws InvalidContentException {
+		Node mainTable = tableNode.getFirstChild();
+		if (documentService.isTable(mainTable.getNodeName())) {
+			if (tableModel instanceof Table) {
+
+				// extract width of the table to generate
+				String wdth = getChildNode("w:gridCol", getChildNode("w:tblGrid", mainTable)).getAttributes()
+						.getNamedItem("w:w").getNodeValue();
+				Node rowNode = getChildNode(documentService.getRowLabel(), mainTable);
+				String rowLabel = documentService.getRowLabel();
+				/**
+				 * FIXME find a better way to get the row label index
+				 */
+				Pattern rowPattern = Pattern.compile("<" + rowLabel + "[^<>]*>.*</" + rowLabel + ">");
+				Matcher rowm = rowPattern.matcher(returnValue);
+				int index_row_start = 0;
+				int index_row_end = 0;
+				if (rowm.find()) {
+					index_row_start = rowm.start();
+					index_row_end = returnValue.lastIndexOf("</" + rowLabel + ">");
+					String row = returnValue.substring(index_row_start, index_row_end + rowLabel.length() + 3);
+					String colLabel = documentService.getCellLabel();
+					int index_col_start = row.lastIndexOf("<" + colLabel + ">");
+					int index_col_end = row.lastIndexOf("</" + colLabel + ">");
+					Node colNode = getChildNode(documentService.getCellLabel(), rowNode);
+					int nbCol = ((Table) tableModel).getColCount();
+					int colWidth = Math.round(Integer.parseInt(wdth) / nbCol);
+					getChildNode("w:tcW", getChildNode("w:tcPr", colNode)).getAttributes().getNamedItem("w:w")
+							.setNodeValue(String.valueOf(colWidth));
+					StringBuffer colNodetxt = new StringBuffer(documentService.asText(colNode));
+					String txtLabel = "w:p";
+					String txtstyleLabel = "w:rPr";
+					Pattern txtPattern = Pattern.compile("<" + txtLabel + "[^<>]*>.*</" + txtLabel + ">");
+					Pattern txtstylePattern = Pattern
+							.compile("<" + txtstyleLabel + "[^<>]*>.*</" + txtstyleLabel + ">");
+					Matcher txtm = txtPattern.matcher(colNodetxt);
+					Matcher txtstylem = txtstylePattern.matcher(colNodetxt);
+					if (txtm.find()) {
+						String style = "";
+						if (txtstylem.find()) {
+							style = colNodetxt.substring(txtstylem.start(),
+									txtstylem.end() + txtstyleLabel.length() + 3);
+						}
+
+						return generateTable(returnValue, tableModel, rowLabel, index_row_start, index_row_end, row,
+								colLabel, index_col_start, index_col_end, colNodetxt, txtm, style, txtLabel);
+					}
+				}
+			}
+
+		}
+		return null;
+	}
+
+	/**
+	 * Get a node from the parent node given as parameter
+	 * 
+	 * @param label
+	 *            of the node to fetch
+	 * @param parentnode
+	 * @return
+	 */
+	private Node getChildNode(String label, Node parentnode) {
+
+		NodeList rowChildNodes = parentnode.getChildNodes();
+		for (int i = 0; i < rowChildNodes.getLength(); i++) {
+			Node current = rowChildNodes.item(i);
+			if (current.getNodeName() == label) {
+				return current;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Generates the table
+	 * 
+	 * @param returnValue
+	 * @param tableModel
+	 * @param rowLabel
+	 * @param index_row_start
+	 * @param index_row_end
+	 * @param row
+	 * @param colLabel
+	 * @param index_col_start
+	 * @param index_col_end
+	 * @param colNodetxt
+	 * @param txtm
+	 * @param rows
+	 * @param style
+	 * @param txtLabel
+	 * @return
+	 */
+	private String generateTable(StringBuffer returnValue, Object tableModel, String rowLabel, int index_row_start,
+			int index_row_end, String row, String colLabel, int index_col_start, int index_col_end,
+			StringBuffer colNodetxt, Matcher txtm, String style, String txtLabel) {
+		String rows = "";
+		String cells = "";
+		// generate table header
+		StringBuffer newRow = new StringBuffer(row);
+		cells = generateCells(((Table) tableModel).getTableheader().getCells(), colNodetxt, txtm, style, txtLabel);
+		newRow.replace(index_col_start, index_col_end + colLabel.length() + 3, cells);
+		rows += newRow.toString();
+		// generate table body
+		for (Row r : ((Table) tableModel).getRows()) {
+			newRow = new StringBuffer(row);
+			cells = generateCells(r.getCells(), colNodetxt, txtm, style, txtLabel);
+			newRow.replace(index_col_start, index_col_end + colLabel.length() + 3, cells);
+			rows += newRow.toString();
+		}
+		return returnValue.replace(index_row_start, index_row_end + rowLabel.length() + 3, rows).toString();
+	}
+
+	/**
+	 * Generates a row
+	 * 
+	 * @param modelCells
+	 * @param colNodetxt
+	 * @param txtm
+	 * @param style
+	 * @param txtLabel
+	 * @param cols
+	 * @return
+	 */
+	private String generateCells(EList<Cell> modelCells, StringBuffer colNodetxt, Matcher txtm, String style,
+			String txtLabel) {
+		String cols = "";
+		for (Cell cell : modelCells) {
+			StringBuffer newCol;
+			int txtindex = txtm.end() - txtLabel.length() - 3;
+			newCol = new StringBuffer(colNodetxt.toString());
+			newCol.insert(txtindex, "<w:r>" + style + "<w:t>" + cell.getLabel() + "</w:t></w:r>");
+			cols += newCol.toString();
+
+		}
+		return cols;
+	}
+
+}
diff --git a/plugins/org.eclipse.gendoc.services.odt/META-INF/MANIFEST.MF b/plugins/org.eclipse.gendoc.services.odt/META-INF/MANIFEST.MF
index 0a40261..e4747ca 100644
--- a/plugins/org.eclipse.gendoc.services.odt/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.gendoc.services.odt/META-INF/MANIFEST.MF
@@ -11,8 +11,9 @@
  org.eclipse.gendoc.documents,
  org.eclipse.gendoc.services,
  org.eclipse.gendoc.tags,
+ org.eclipse.gendoc.ui,
  org.eclipse.gendoc.tags.handlers,
- org.eclipse.gendoc.ui
+ org.eclipse.gendoc.table
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipse.gendoc.services.odt
diff --git a/plugins/org.eclipse.gendoc.services.odt/src/org/eclipse/gendoc/services/odt/ODTDocumentService.java b/plugins/org.eclipse.gendoc.services.odt/src/org/eclipse/gendoc/services/odt/ODTDocumentService.java
index 6579ec3..accf1ac 100644
--- a/plugins/org.eclipse.gendoc.services.odt/src/org/eclipse/gendoc/services/odt/ODTDocumentService.java
+++ b/plugins/org.eclipse.gendoc.services.odt/src/org/eclipse/gendoc/services/odt/ODTDocumentService.java
@@ -38,6 +38,7 @@
 import org.eclipse.gendoc.document.parser.documents.odt.ODTDocument;
 import org.eclipse.gendoc.document.parser.documents.odt.ODTNamespaceContext;
 import org.eclipse.gendoc.documents.IAdditionalResourceService;
+import org.eclipse.gendoc.documents.ITableService;
 import org.eclipse.gendoc.documents.XMLDocumentService;
 import org.eclipse.gendoc.services.exception.DocumentServiceException;
 import org.eclipse.gendoc.services.exception.InvalidContentException;
@@ -64,17 +65,19 @@
     private final String TAG_TABLE = "table:table";
 
 	private String serviceId;
-	
+	private ITableService tableService;
     public ODTDocumentService()
     {
         super();
         additionalResourceService = new ODTAdditionalResourceService();
+        tableService = new ODTTableService();
     }
 
     public ODTDocumentService(Document document)
     {
         super(document);
         additionalResourceService = new ODTAdditionalResourceService();
+        tableService = new ODTTableService();
     }
 
     public boolean isList(String label)
@@ -469,5 +472,27 @@
 				.replace(TABULATION,TAB)
 				.replace("\t",TAB);
 	}
-    
+
+	@Override
+	public String getRowLabel() {
+		return "table:table-row";
+	}
+
+	@Override
+	public String getCellLabel() {
+		
+		return "table:table-cell";
+	}
+	
+
+	   
+
+	@Override
+	public ITableService getTableService() {
+		
+		return tableService;
+	}
+
+	
+
 }
diff --git a/plugins/org.eclipse.gendoc.services.odt/src/org/eclipse/gendoc/services/odt/ODTTableService.java b/plugins/org.eclipse.gendoc.services.odt/src/org/eclipse/gendoc/services/odt/ODTTableService.java
new file mode 100644
index 0000000..045d4a3
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.services.odt/src/org/eclipse/gendoc/services/odt/ODTTableService.java
@@ -0,0 +1,153 @@
+/*****************************************************************************
+ * Copyright (c) 2017 Atos.
+ * 
+ * 
+ * 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:
+ * Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net - - Initial API and implementation
+ *****************************************************************************/
+
+package org.eclipse.gendoc.services.odt;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.gendoc.documents.AbstractTableService;
+import org.eclipse.gendoc.documents.IDocumentService;
+import org.eclipse.gendoc.services.exception.InvalidContentException;
+import org.eclipse.gendoc.tags.ITag;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.eclipse.gendoc.table.Cell;
+import org.eclipse.gendoc.table.Row;
+import org.eclipse.gendoc.table.Table;
+
+public class ODTTableService extends AbstractTableService {
+
+	@Override
+	public String manageTable(ITag tag, IDocumentService documentService, StringBuffer returnValue, Object tableModel,
+			Node tableNode) throws InvalidContentException {
+
+		Node mainTable = tableNode.getFirstChild();
+		if (documentService.isTable(mainTable.getNodeName())) {
+			if (tableModel instanceof Table) {
+
+				int nbCol = ((Table) tableModel).getColCount();
+				String colLabel = "table:table-column";
+				int index_col_start = returnValue.indexOf("<" + colLabel);
+				returnValue.insert(index_col_start + colLabel.length() + 1,
+						" table:number-columns-repeated=\"" + nbCol + "\"");
+				Node rowNode = getChildNode(documentService.getRowLabel(), mainTable);
+				String rowLabel = documentService.getRowLabel();
+
+				Pattern rowPattern = Pattern.compile("<" + rowLabel + "[^<>]*>.*</" + rowLabel + ">");
+				Matcher rowm = rowPattern.matcher(returnValue);
+				int index_row_start = 0;
+				int index_row_end = 0;
+				if (rowm.find()) {
+					index_row_start = rowm.start();
+					index_row_end = returnValue.lastIndexOf("</" + rowLabel + ">");
+
+					String row = returnValue.substring(index_row_start, index_row_end + rowLabel.length() + 3);
+
+					String cellLabel = documentService.getCellLabel();
+					int index_cell_start = row.indexOf("<" + cellLabel);
+					int index_cell_end = row.lastIndexOf("</" + cellLabel + ">");
+
+					Node cellNode = getChildNode(documentService.getCellLabel(), rowNode);
+					if (cellNode != null) {
+						StringBuffer colNodetxt = new StringBuffer(documentService.asText(cellNode));
+						String txtLabel = "text:p";
+						Pattern txtPattern = Pattern.compile("<" + txtLabel + "[^<>]*>.*</" + txtLabel + ">");
+						Matcher txtm = txtPattern.matcher(colNodetxt);
+						if (txtm.find()) {
+							String style = "";
+							return generateTable(returnValue, tableModel, rowLabel, index_row_start, index_row_end, row,
+									cellLabel, index_cell_start, index_cell_end, colNodetxt, txtm, style, txtLabel);
+						}
+					}
+				}
+			}
+
+		}
+		return null;
+	}
+
+	private Node getChildNode(String label, Node node) {
+
+		NodeList rowChildNodes = node.getChildNodes();
+		for (int i = 0; i < rowChildNodes.getLength(); i++) {
+			Node current = rowChildNodes.item(i);
+			if (current.getNodeName() == label) {
+				return current;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * @param returnValue
+	 * @param tableModel
+	 * @param rowLabel
+	 * @param index_row_start
+	 * @param index_row_end
+	 * @param row
+	 * @param colLabel
+	 * @param index_col_start
+	 * @param index_col_end
+	 * @param colNodetxt
+	 * @param txtm
+	 * @param rows
+	 * @param style
+	 * @param txtLabel
+	 * @return
+	 */
+	private String generateTable(StringBuffer returnValue, Object tableModel, String rowLabel, int index_row_start,
+			int index_row_end, String row, String colLabel, int index_col_start, int index_col_end,
+			StringBuffer colNodetxt, Matcher txtm, String style, String txtLabel) {
+		String rows = "";
+		String cells = "";
+		// generating table header
+		StringBuffer newRow = new StringBuffer(row);
+		cells = generateCells(((Table) tableModel).getTableheader().getCells(), colNodetxt, txtm, style, txtLabel);
+		newRow.replace(index_col_start, index_col_end + colLabel.length() + 3, cells);
+		rows += newRow.toString();
+		// generating table body
+		for (Row r : ((Table) tableModel).getRows()) {
+			newRow = new StringBuffer(row);
+			cells = generateCells(r.getCells(), colNodetxt, txtm, style, txtLabel);
+			newRow.replace(index_col_start, index_col_end + colLabel.length() + 3, cells);
+			rows += newRow.toString();
+		}
+		return returnValue.replace(index_row_start, index_row_end + rowLabel.length() + 3, rows).toString();
+	}
+
+	/**
+	 * @param modelCells
+	 * @param colNodetxt
+	 * @param txtm
+	 * @param style
+	 * @param txtLabel
+	 * @param cols
+	 * @return
+	 */
+	private String generateCells(EList<Cell> modelCells, StringBuffer colNodetxt, Matcher txtm, String style,
+			String txtLabel) {
+		String cols = "";
+		for (Cell cell : modelCells) {
+			StringBuffer newCol;
+			int txtindex = txtm.end() - txtLabel.length() - 3;
+			newCol = new StringBuffer(colNodetxt.toString());
+			newCol.insert(txtindex, cell.getLabel());
+			cols += newCol.toString();
+		}
+		return cols;
+	}
+
+}
diff --git a/plugins/org.eclipse.gendoc.services.pptx/src/org/eclipse/gendoc/services/pptx/PPTXDocumentService.java b/plugins/org.eclipse.gendoc.services.pptx/src/org/eclipse/gendoc/services/pptx/PPTXDocumentService.java
index 35e8e44..199d6dc 100644
--- a/plugins/org.eclipse.gendoc.services.pptx/src/org/eclipse/gendoc/services/pptx/PPTXDocumentService.java
+++ b/plugins/org.eclipse.gendoc.services.pptx/src/org/eclipse/gendoc/services/pptx/PPTXDocumentService.java
@@ -38,6 +38,7 @@
 import org.eclipse.gendoc.document.parser.pptx.PPTXNamespaceContext;
 import org.eclipse.gendoc.documents.IAdditionalResourceService;
 import org.eclipse.gendoc.documents.IDocumentService;
+import org.eclipse.gendoc.documents.ITableService;
 import org.eclipse.gendoc.documents.XMLDocumentService;
 import org.eclipse.gendoc.services.exception.DocumentServiceException;
 import org.eclipse.gendoc.services.exception.InvalidContentException;
@@ -331,4 +332,22 @@
 		return null;
 	}
 
+	@Override
+	public String getRowLabel() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public String getCellLabel() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public ITableService getTableService() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
 }
diff --git a/plugins/org.eclipse.gendoc.services.xlsx/src/org/eclipse/gendoc/services/xlsx/XLSXDocumentService.java b/plugins/org.eclipse.gendoc.services.xlsx/src/org/eclipse/gendoc/services/xlsx/XLSXDocumentService.java
index a1bc9a6..52da8ea 100644
--- a/plugins/org.eclipse.gendoc.services.xlsx/src/org/eclipse/gendoc/services/xlsx/XLSXDocumentService.java
+++ b/plugins/org.eclipse.gendoc.services.xlsx/src/org/eclipse/gendoc/services/xlsx/XLSXDocumentService.java
@@ -40,6 +40,7 @@
 import org.eclipse.gendoc.document.parser.xlsx.XLSXParser;
 import org.eclipse.gendoc.documents.IAdditionalResourceService;
 import org.eclipse.gendoc.documents.IDocumentService;
+import org.eclipse.gendoc.documents.ITableService;
 import org.eclipse.gendoc.documents.XMLDocumentService;
 import org.eclipse.gendoc.services.exception.DocumentServiceException;
 import org.eclipse.gendoc.services.exception.InvalidContentException;
@@ -338,4 +339,23 @@
 		return null;
 	}
 
+	@Override
+	public String getRowLabel() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public String getCellLabel() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public ITableService getTableService() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	
 }
diff --git a/plugins/org.eclipse.gendoc.table/.classpath b/plugins/org.eclipse.gendoc.table/.classpath
new file mode 100644
index 0000000..deb6736
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.gendoc.table/.gitignore b/plugins/org.eclipse.gendoc.table/.gitignore
new file mode 100644
index 0000000..ae3c172
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/plugins/org.eclipse.gendoc.table/.project b/plugins/org.eclipse.gendoc.table/.project
new file mode 100644
index 0000000..4e9b7a4
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.gendoc.table</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.gendoc.table/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.gendoc.table/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..c537b63
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/plugins/org.eclipse.gendoc.table/META-INF/MANIFEST.MF b/plugins/org.eclipse.gendoc.table/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a04eb62
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.gendoc.table;singleton:=true
+Bundle-Version: 0.7.0.qualifier
+Bundle-ClassPath: .
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: 
+ org.eclipse.gendoc.table,
+ org.eclipse.gendoc.table.impl,
+ org.eclipse.gendoc.table.util
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.emf.ecore;visibility:=reexport
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.gendoc.table/build.properties b/plugins/org.eclipse.gendoc.table/build.properties
new file mode 100644
index 0000000..4465407
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/build.properties
@@ -0,0 +1,10 @@
+#
+
+bin.includes = .,\
+               model/,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/plugins/org.eclipse.gendoc.table/model/gendoc.aird b/plugins/org.eclipse.gendoc.table/model/gendoc.aird
new file mode 100644
index 0000000..a1f4610
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/model/gendoc.aird
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<viewpoint:DAnalysis xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description" xmi:id="_AxnNADobEeerop7vJRGxDA" selectedViews="_A4iUYDobEeerop7vJRGxDA" version="11.1.0.201608251200">
+  <semanticResources>gendoc.ecore</semanticResources>
+  <semanticResources>gendoc.genmodel</semanticResources>
+  <ownedViews xmi:type="viewpoint:DView" xmi:id="_A4iUYDobEeerop7vJRGxDA">
+    <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/>
+  </ownedViews>
+</viewpoint:DAnalysis>
diff --git a/plugins/org.eclipse.gendoc.table/model/gendoc.ecore b/plugins/org.eclipse.gendoc.table/model/gendoc.ecore
new file mode 100644
index 0000000..ece6f5f
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/model/gendoc.ecore
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="gendoc" nsURI="http://www.eclipse.org/gendoc/1.0" nsPrefix="gendoc">
+  <eSubpackages name="table" nsURI="http://www.eclipse.org/gendoc/1.0/table" nsPrefix="table">
+    <eClassifiers xsi:type="ecore:EClass" name="Table">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+          defaultValueLiteral=""/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+          defaultValueLiteral=""/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="rows" upperBound="-1"
+          eType="#//table/Row"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="tableheader" eType="#//table/TableHeader"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Row">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="cells" upperBound="-1"
+          eType="#//table/Cell"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Cell">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="label" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+          defaultValueLiteral=""/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="TableHeader" eSuperTypes="#//table/Row"/>
+  </eSubpackages>
+</ecore:EPackage>
diff --git a/plugins/org.eclipse.gendoc.table/model/gendoc.genmodel b/plugins/org.eclipse.gendoc.table/model/gendoc.genmodel
new file mode 100644
index 0000000..635b272
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/model/gendoc.genmodel
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.gendoc.model/src" modelPluginID="org.eclipse.gendoc.model"
+    modelName="Gendoc" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
+    importerID="org.eclipse.emf.importer.ecore" complianceLevel="8.0" copyrightFields="false"
+    operationReflection="true" importOrganizing="true">
+  <foreignModel>gendoc.ecore</foreignModel>
+  <genPackages prefix="Gendoc" basePackage="org.eclipse" disposableProviderFactory="true"
+      ecorePackage="gendoc.ecore#/">
+    <nestedGenPackages prefix="Table" disposableProviderFactory="true" ecorePackage="gendoc.ecore#//table">
+      <genClasses ecoreClass="gendoc.ecore#//table/Table">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute gendoc.ecore#//table/Table/name"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute gendoc.ecore#//table/Table/type"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference gendoc.ecore#//table/Table/rows"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference gendoc.ecore#//table/Table/tableheader"/>
+      </genClasses>
+      <genClasses ecoreClass="gendoc.ecore#//table/Row">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute gendoc.ecore#//table/Row/object"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference gendoc.ecore#//table/Row/cells"/>
+      </genClasses>
+      <genClasses ecoreClass="gendoc.ecore#//table/Cell">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute gendoc.ecore#//table/Cell/object"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute gendoc.ecore#//table/Cell/label"/>
+      </genClasses>
+      <genClasses ecoreClass="gendoc.ecore#//table/TableHeader"/>
+    </nestedGenPackages>
+  </genPackages>
+</genmodel:GenModel>
diff --git a/plugins/org.eclipse.gendoc.table/plugin.properties b/plugins/org.eclipse.gendoc.table/plugin.properties
new file mode 100644
index 0000000..a1b35f7
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/plugin.properties
@@ -0,0 +1,4 @@
+#
+
+pluginName = Gendoc Model
+providerName = Eclipse Modeling Project
diff --git a/plugins/org.eclipse.gendoc.table/plugin.xml b/plugins/org.eclipse.gendoc.table/plugin.xml
new file mode 100644
index 0000000..e54d39d
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/plugin.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+-->
+
+<plugin>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated gendoc -->
+      <package
+            uri="http://www.eclipse.org/gendoc/1.0/table"
+            class="org.eclipse.gendoc.table.TablePackage"
+            genModel="model/gendoc.genmodel"/>
+   </extension>
+
+</plugin>
diff --git a/plugins/org.eclipse.gendoc.table/pom.xml b/plugins/org.eclipse.gendoc.table/pom.xml
new file mode 100644
index 0000000..121fcf4
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/pom.xml
@@ -0,0 +1,12 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.gendoc</groupId>
+    <artifactId>parent</artifactId>
+    <relativePath>../../pom.xml</relativePath>
+    <version>0.7.0-SNAPSHOT</version>
+  </parent>
+  
+  <artifactId>org.eclipse.gendoc.table</artifactId>
+  <packaging>eclipse-plugin</packaging>
+</project>
\ No newline at end of file
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/Cell.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/Cell.java
new file mode 100644
index 0000000..8642118
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/Cell.java
@@ -0,0 +1,78 @@
+/**
+ */
+package org.eclipse.gendoc.table;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Cell</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.gendoc.table.Cell#getObject <em>Object</em>}</li>
+ *   <li>{@link org.eclipse.gendoc.table.Cell#getLabel <em>Label</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.gendoc.table.TablePackage#getCell()
+ * @model
+ * @generated
+ */
+public interface Cell extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Object</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Object</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Object</em>' attribute.
+	 * @see #setObject(Object)
+	 * @see org.eclipse.gendoc.table.TablePackage#getCell_Object()
+	 * @model
+	 * @generated
+	 */
+	Object getObject();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.gendoc.table.Cell#getObject <em>Object</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Object</em>' attribute.
+	 * @see #getObject()
+	 * @generated
+	 */
+	void setObject(Object value);
+
+	/**
+	 * Returns the value of the '<em><b>Label</b></em>' attribute.
+	 * The default value is <code>""</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Label</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Label</em>' attribute.
+	 * @see #setLabel(String)
+	 * @see org.eclipse.gendoc.table.TablePackage#getCell_Label()
+	 * @model default=""
+	 * @generated
+	 */
+	String getLabel();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.gendoc.table.Cell#getLabel <em>Label</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Label</em>' attribute.
+	 * @see #getLabel()
+	 * @generated
+	 */
+	void setLabel(String value);
+
+} // Cell
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/Row.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/Row.java
new file mode 100644
index 0000000..d638404
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/Row.java
@@ -0,0 +1,69 @@
+/**
+ */
+package org.eclipse.gendoc.table;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Row</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.gendoc.table.Row#getObject <em>Object</em>}</li>
+ *   <li>{@link org.eclipse.gendoc.table.Row#getCells <em>Cells</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.gendoc.table.TablePackage#getRow()
+ * @model
+ * @generated
+ */
+public interface Row extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Object</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Object</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Object</em>' attribute.
+	 * @see #setObject(Object)
+	 * @see org.eclipse.gendoc.table.TablePackage#getRow_Object()
+	 * @model
+	 * @generated
+	 */
+	Object getObject();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.gendoc.table.Row#getObject <em>Object</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Object</em>' attribute.
+	 * @see #getObject()
+	 * @generated
+	 */
+	void setObject(Object value);
+
+	/**
+	 * Returns the value of the '<em><b>Cells</b></em>' reference list.
+	 * The list contents are of type {@link org.eclipse.gendoc.table.Cell}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Cells</em>' reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Cells</em>' reference list.
+	 * @see org.eclipse.gendoc.table.TablePackage#getRow_Cells()
+	 * @model
+	 * @generated
+	 */
+	EList<Cell> getCells();
+
+} // Row
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/Table.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/Table.java
new file mode 100644
index 0000000..141c20c
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/Table.java
@@ -0,0 +1,134 @@
+/**
+ */
+package org.eclipse.gendoc.table;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Table</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.gendoc.table.Table#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.gendoc.table.Table#getType <em>Type</em>}</li>
+ *   <li>{@link org.eclipse.gendoc.table.Table#getRows <em>Rows</em>}</li>
+ *   <li>{@link org.eclipse.gendoc.table.Table#getTableheader <em>Tableheader</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.gendoc.table.TablePackage#getTable()
+ * @model
+ * @generated
+ */
+public interface Table extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * The default value is <code>""</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see org.eclipse.gendoc.table.TablePackage#getTable_Name()
+	 * @model default=""
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.gendoc.table.Table#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Type</b></em>' attribute.
+	 * The default value is <code>""</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Type</em>' attribute.
+	 * @see #setType(String)
+	 * @see org.eclipse.gendoc.table.TablePackage#getTable_Type()
+	 * @model default=""
+	 * @generated
+	 */
+	String getType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.gendoc.table.Table#getType <em>Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Type</em>' attribute.
+	 * @see #getType()
+	 * @generated
+	 */
+	void setType(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Rows</b></em>' reference list.
+	 * The list contents are of type {@link org.eclipse.gendoc.table.Row}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Rows</em>' reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Rows</em>' reference list.
+	 * @see org.eclipse.gendoc.table.TablePackage#getTable_Rows()
+	 * @model
+	 * @generated
+	 */
+	EList<Row> getRows();
+
+	/**
+	 * Returns the value of the '<em><b>Tableheader</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Tableheader</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Tableheader</em>' reference.
+	 * @see #setTableheader(TableHeader)
+	 * @see org.eclipse.gendoc.table.TablePackage#getTable_Tableheader()
+	 * @model
+	 * @generated
+	 */
+	TableHeader getTableheader();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.gendoc.table.Table#getTableheader <em>Tableheader</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Tableheader</em>' reference.
+	 * @see #getTableheader()
+	 * @generated
+	 */
+	void setTableheader(TableHeader value);
+	
+	
+	/**
+	 * @generated NOT
+	 */
+	
+	int getColCount();
+		
+	
+
+} // Table
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/TableFactory.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/TableFactory.java
new file mode 100644
index 0000000..f02a062
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/TableFactory.java
@@ -0,0 +1,69 @@
+/**
+ */
+package org.eclipse.gendoc.table;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.gendoc.table.TablePackage
+ * @generated
+ */
+public interface TableFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	TableFactory eINSTANCE = org.eclipse.gendoc.table.impl.TableFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Table</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Table</em>'.
+	 * @generated
+	 */
+	Table createTable();
+
+	/**
+	 * Returns a new object of class '<em>Row</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Row</em>'.
+	 * @generated
+	 */
+	Row createRow();
+
+	/**
+	 * Returns a new object of class '<em>Cell</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Cell</em>'.
+	 * @generated
+	 */
+	Cell createCell();
+
+	/**
+	 * Returns a new object of class '<em>Header</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Header</em>'.
+	 * @generated
+	 */
+	TableHeader createTableHeader();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	TablePackage getTablePackage();
+
+} //TableFactory
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/TableHeader.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/TableHeader.java
new file mode 100644
index 0000000..1be93f8
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/TableHeader.java
@@ -0,0 +1,17 @@
+/**
+ */
+package org.eclipse.gendoc.table;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Header</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.gendoc.table.TablePackage#getTableHeader()
+ * @model
+ * @generated
+ */
+public interface TableHeader extends Row {
+} // TableHeader
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/TablePackage.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/TablePackage.java
new file mode 100644
index 0000000..849895a
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/TablePackage.java
@@ -0,0 +1,519 @@
+/**
+ */
+package org.eclipse.gendoc.table;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.gendoc.table.TableFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface TablePackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "table";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/gendoc/1.0/table";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "table";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	TablePackage eINSTANCE = org.eclipse.gendoc.table.impl.TablePackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.gendoc.table.impl.TableImpl <em>Table</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.gendoc.table.impl.TableImpl
+	 * @see org.eclipse.gendoc.table.impl.TablePackageImpl#getTable()
+	 * @generated
+	 */
+	int TABLE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TABLE__NAME = 0;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TABLE__TYPE = 1;
+
+	/**
+	 * The feature id for the '<em><b>Rows</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TABLE__ROWS = 2;
+
+	/**
+	 * The feature id for the '<em><b>Tableheader</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TABLE__TABLEHEADER = 3;
+
+	/**
+	 * The number of structural features of the '<em>Table</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TABLE_FEATURE_COUNT = 4;
+
+	/**
+	 * The number of operations of the '<em>Table</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TABLE_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.gendoc.table.impl.RowImpl <em>Row</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.gendoc.table.impl.RowImpl
+	 * @see org.eclipse.gendoc.table.impl.TablePackageImpl#getRow()
+	 * @generated
+	 */
+	int ROW = 1;
+
+	/**
+	 * The feature id for the '<em><b>Object</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROW__OBJECT = 0;
+
+	/**
+	 * The feature id for the '<em><b>Cells</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROW__CELLS = 1;
+
+	/**
+	 * The number of structural features of the '<em>Row</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROW_FEATURE_COUNT = 2;
+
+	/**
+	 * The number of operations of the '<em>Row</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROW_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.gendoc.table.impl.CellImpl <em>Cell</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.gendoc.table.impl.CellImpl
+	 * @see org.eclipse.gendoc.table.impl.TablePackageImpl#getCell()
+	 * @generated
+	 */
+	int CELL = 2;
+
+	/**
+	 * The feature id for the '<em><b>Object</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CELL__OBJECT = 0;
+
+	/**
+	 * The feature id for the '<em><b>Label</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CELL__LABEL = 1;
+
+	/**
+	 * The number of structural features of the '<em>Cell</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CELL_FEATURE_COUNT = 2;
+
+	/**
+	 * The number of operations of the '<em>Cell</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CELL_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.gendoc.table.impl.TableHeaderImpl <em>Header</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.gendoc.table.impl.TableHeaderImpl
+	 * @see org.eclipse.gendoc.table.impl.TablePackageImpl#getTableHeader()
+	 * @generated
+	 */
+	int TABLE_HEADER = 3;
+
+	/**
+	 * The feature id for the '<em><b>Object</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TABLE_HEADER__OBJECT = ROW__OBJECT;
+
+	/**
+	 * The feature id for the '<em><b>Cells</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TABLE_HEADER__CELLS = ROW__CELLS;
+
+	/**
+	 * The number of structural features of the '<em>Header</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TABLE_HEADER_FEATURE_COUNT = ROW_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Header</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TABLE_HEADER_OPERATION_COUNT = ROW_OPERATION_COUNT + 0;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.gendoc.table.Table <em>Table</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Table</em>'.
+	 * @see org.eclipse.gendoc.table.Table
+	 * @generated
+	 */
+	EClass getTable();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.gendoc.table.Table#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see org.eclipse.gendoc.table.Table#getName()
+	 * @see #getTable()
+	 * @generated
+	 */
+	EAttribute getTable_Name();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.gendoc.table.Table#getType <em>Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Type</em>'.
+	 * @see org.eclipse.gendoc.table.Table#getType()
+	 * @see #getTable()
+	 * @generated
+	 */
+	EAttribute getTable_Type();
+
+	/**
+	 * Returns the meta object for the reference list '{@link org.eclipse.gendoc.table.Table#getRows <em>Rows</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference list '<em>Rows</em>'.
+	 * @see org.eclipse.gendoc.table.Table#getRows()
+	 * @see #getTable()
+	 * @generated
+	 */
+	EReference getTable_Rows();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.gendoc.table.Table#getTableheader <em>Tableheader</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Tableheader</em>'.
+	 * @see org.eclipse.gendoc.table.Table#getTableheader()
+	 * @see #getTable()
+	 * @generated
+	 */
+	EReference getTable_Tableheader();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.gendoc.table.Row <em>Row</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Row</em>'.
+	 * @see org.eclipse.gendoc.table.Row
+	 * @generated
+	 */
+	EClass getRow();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.gendoc.table.Row#getObject <em>Object</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Object</em>'.
+	 * @see org.eclipse.gendoc.table.Row#getObject()
+	 * @see #getRow()
+	 * @generated
+	 */
+	EAttribute getRow_Object();
+
+	/**
+	 * Returns the meta object for the reference list '{@link org.eclipse.gendoc.table.Row#getCells <em>Cells</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference list '<em>Cells</em>'.
+	 * @see org.eclipse.gendoc.table.Row#getCells()
+	 * @see #getRow()
+	 * @generated
+	 */
+	EReference getRow_Cells();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.gendoc.table.Cell <em>Cell</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Cell</em>'.
+	 * @see org.eclipse.gendoc.table.Cell
+	 * @generated
+	 */
+	EClass getCell();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.gendoc.table.Cell#getObject <em>Object</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Object</em>'.
+	 * @see org.eclipse.gendoc.table.Cell#getObject()
+	 * @see #getCell()
+	 * @generated
+	 */
+	EAttribute getCell_Object();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.gendoc.table.Cell#getLabel <em>Label</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Label</em>'.
+	 * @see org.eclipse.gendoc.table.Cell#getLabel()
+	 * @see #getCell()
+	 * @generated
+	 */
+	EAttribute getCell_Label();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.gendoc.table.TableHeader <em>Header</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Header</em>'.
+	 * @see org.eclipse.gendoc.table.TableHeader
+	 * @generated
+	 */
+	EClass getTableHeader();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	TableFactory getTableFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.gendoc.table.impl.TableImpl <em>Table</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.gendoc.table.impl.TableImpl
+		 * @see org.eclipse.gendoc.table.impl.TablePackageImpl#getTable()
+		 * @generated
+		 */
+		EClass TABLE = eINSTANCE.getTable();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute TABLE__NAME = eINSTANCE.getTable_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute TABLE__TYPE = eINSTANCE.getTable_Type();
+
+		/**
+		 * The meta object literal for the '<em><b>Rows</b></em>' reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference TABLE__ROWS = eINSTANCE.getTable_Rows();
+
+		/**
+		 * The meta object literal for the '<em><b>Tableheader</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference TABLE__TABLEHEADER = eINSTANCE.getTable_Tableheader();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.gendoc.table.impl.RowImpl <em>Row</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.gendoc.table.impl.RowImpl
+		 * @see org.eclipse.gendoc.table.impl.TablePackageImpl#getRow()
+		 * @generated
+		 */
+		EClass ROW = eINSTANCE.getRow();
+
+		/**
+		 * The meta object literal for the '<em><b>Object</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute ROW__OBJECT = eINSTANCE.getRow_Object();
+
+		/**
+		 * The meta object literal for the '<em><b>Cells</b></em>' reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ROW__CELLS = eINSTANCE.getRow_Cells();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.gendoc.table.impl.CellImpl <em>Cell</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.gendoc.table.impl.CellImpl
+		 * @see org.eclipse.gendoc.table.impl.TablePackageImpl#getCell()
+		 * @generated
+		 */
+		EClass CELL = eINSTANCE.getCell();
+
+		/**
+		 * The meta object literal for the '<em><b>Object</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute CELL__OBJECT = eINSTANCE.getCell_Object();
+
+		/**
+		 * The meta object literal for the '<em><b>Label</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute CELL__LABEL = eINSTANCE.getCell_Label();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.gendoc.table.impl.TableHeaderImpl <em>Header</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.gendoc.table.impl.TableHeaderImpl
+		 * @see org.eclipse.gendoc.table.impl.TablePackageImpl#getTableHeader()
+		 * @generated
+		 */
+		EClass TABLE_HEADER = eINSTANCE.getTableHeader();
+
+	}
+
+} //TablePackage
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/CellImpl.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/CellImpl.java
new file mode 100644
index 0000000..f93bd5c
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/CellImpl.java
@@ -0,0 +1,217 @@
+/**
+ */
+package org.eclipse.gendoc.table.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.gendoc.table.Cell;
+import org.eclipse.gendoc.table.TablePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Cell</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.gendoc.table.impl.CellImpl#getObject <em>Object</em>}</li>
+ *   <li>{@link org.eclipse.gendoc.table.impl.CellImpl#getLabel <em>Label</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class CellImpl extends MinimalEObjectImpl.Container implements Cell {
+	/**
+	 * The default value of the '{@link #getObject() <em>Object</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getObject()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final Object OBJECT_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getObject() <em>Object</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getObject()
+	 * @generated
+	 * @ordered
+	 */
+	protected Object object = OBJECT_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getLabel() <em>Label</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLabel()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String LABEL_EDEFAULT = "";
+
+	/**
+	 * The cached value of the '{@link #getLabel() <em>Label</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLabel()
+	 * @generated
+	 * @ordered
+	 */
+	protected String label = LABEL_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected CellImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return TablePackage.Literals.CELL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Object getObject() {
+		return object;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setObject(Object newObject) {
+		Object oldObject = object;
+		object = newObject;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, TablePackage.CELL__OBJECT, oldObject, object));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLabel() {
+		return label;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLabel(String newLabel) {
+		String oldLabel = label;
+		label = newLabel;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, TablePackage.CELL__LABEL, oldLabel, label));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case TablePackage.CELL__OBJECT:
+				return getObject();
+			case TablePackage.CELL__LABEL:
+				return getLabel();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case TablePackage.CELL__OBJECT:
+				setObject(newValue);
+				return;
+			case TablePackage.CELL__LABEL:
+				setLabel((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case TablePackage.CELL__OBJECT:
+				setObject(OBJECT_EDEFAULT);
+				return;
+			case TablePackage.CELL__LABEL:
+				setLabel(LABEL_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case TablePackage.CELL__OBJECT:
+				return OBJECT_EDEFAULT == null ? object != null : !OBJECT_EDEFAULT.equals(object);
+			case TablePackage.CELL__LABEL:
+				return LABEL_EDEFAULT == null ? label != null : !LABEL_EDEFAULT.equals(label);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (object: ");
+		result.append(object);
+		result.append(", label: ");
+		result.append(label);
+		result.append(')');
+		return result.toString();
+	}
+
+} //CellImpl
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/RowImpl.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/RowImpl.java
new file mode 100644
index 0000000..409c8cc
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/RowImpl.java
@@ -0,0 +1,205 @@
+/**
+ */
+package org.eclipse.gendoc.table.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
+import org.eclipse.gendoc.table.Cell;
+import org.eclipse.gendoc.table.Row;
+import org.eclipse.gendoc.table.TablePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Row</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.gendoc.table.impl.RowImpl#getObject <em>Object</em>}</li>
+ *   <li>{@link org.eclipse.gendoc.table.impl.RowImpl#getCells <em>Cells</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class RowImpl extends MinimalEObjectImpl.Container implements Row {
+	/**
+	 * The default value of the '{@link #getObject() <em>Object</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getObject()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final Object OBJECT_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getObject() <em>Object</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getObject()
+	 * @generated
+	 * @ordered
+	 */
+	protected Object object = OBJECT_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getCells() <em>Cells</em>}' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCells()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Cell> cells;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected RowImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return TablePackage.Literals.ROW;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Object getObject() {
+		return object;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setObject(Object newObject) {
+		Object oldObject = object;
+		object = newObject;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, TablePackage.ROW__OBJECT, oldObject, object));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Cell> getCells() {
+		if (cells == null) {
+			cells = new EObjectResolvingEList<Cell>(Cell.class, this, TablePackage.ROW__CELLS);
+		}
+		return cells;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case TablePackage.ROW__OBJECT:
+				return getObject();
+			case TablePackage.ROW__CELLS:
+				return getCells();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case TablePackage.ROW__OBJECT:
+				setObject(newValue);
+				return;
+			case TablePackage.ROW__CELLS:
+				getCells().clear();
+				getCells().addAll((Collection<? extends Cell>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case TablePackage.ROW__OBJECT:
+				setObject(OBJECT_EDEFAULT);
+				return;
+			case TablePackage.ROW__CELLS:
+				getCells().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case TablePackage.ROW__OBJECT:
+				return OBJECT_EDEFAULT == null ? object != null : !OBJECT_EDEFAULT.equals(object);
+			case TablePackage.ROW__CELLS:
+				return cells != null && !cells.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (object: ");
+		result.append(object);
+		result.append(')');
+		return result.toString();
+	}
+
+} //RowImpl
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/TableFactoryImpl.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/TableFactoryImpl.java
new file mode 100644
index 0000000..71df54d
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/TableFactoryImpl.java
@@ -0,0 +1,128 @@
+/**
+ */
+package org.eclipse.gendoc.table.impl;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+import org.eclipse.gendoc.table.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class TableFactoryImpl extends EFactoryImpl implements TableFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static TableFactory init() {
+		try {
+			TableFactory theTableFactory = (TableFactory)EPackage.Registry.INSTANCE.getEFactory(TablePackage.eNS_URI);
+			if (theTableFactory != null) {
+				return theTableFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new TableFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TableFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case TablePackage.TABLE: return createTable();
+			case TablePackage.ROW: return createRow();
+			case TablePackage.CELL: return createCell();
+			case TablePackage.TABLE_HEADER: return createTableHeader();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Table createTable() {
+		TableImpl table = new TableImpl();
+		return table;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Row createRow() {
+		RowImpl row = new RowImpl();
+		return row;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Cell createCell() {
+		CellImpl cell = new CellImpl();
+		return cell;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TableHeader createTableHeader() {
+		TableHeaderImpl tableHeader = new TableHeaderImpl();
+		return tableHeader;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TablePackage getTablePackage() {
+		return (TablePackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static TablePackage getPackage() {
+		return TablePackage.eINSTANCE;
+	}
+
+} //TableFactoryImpl
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/TableHeaderImpl.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/TableHeaderImpl.java
new file mode 100644
index 0000000..8929407
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/TableHeaderImpl.java
@@ -0,0 +1,37 @@
+/**
+ */
+package org.eclipse.gendoc.table.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.gendoc.table.TableHeader;
+import org.eclipse.gendoc.table.TablePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Header</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class TableHeaderImpl extends RowImpl implements TableHeader {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TableHeaderImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return TablePackage.Literals.TABLE_HEADER;
+	}
+
+} //TableHeaderImpl
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/TableImpl.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/TableImpl.java
new file mode 100644
index 0000000..7bf24dd
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/TableImpl.java
@@ -0,0 +1,334 @@
+/**
+ */
+package org.eclipse.gendoc.table.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
+import org.eclipse.gendoc.table.Row;
+import org.eclipse.gendoc.table.Table;
+import org.eclipse.gendoc.table.TableHeader;
+import org.eclipse.gendoc.table.TablePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Table</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.gendoc.table.impl.TableImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.gendoc.table.impl.TableImpl#getType <em>Type</em>}</li>
+ *   <li>{@link org.eclipse.gendoc.table.impl.TableImpl#getRows <em>Rows</em>}</li>
+ *   <li>{@link org.eclipse.gendoc.table.impl.TableImpl#getTableheader <em>Tableheader</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class TableImpl extends MinimalEObjectImpl.Container implements Table {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = "";
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String TYPE_EDEFAULT = "";
+
+	/**
+	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getType()
+	 * @generated
+	 * @ordered
+	 */
+	protected String type = TYPE_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getRows() <em>Rows</em>}' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRows()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Row> rows;
+
+	/**
+	 * The cached value of the '{@link #getTableheader() <em>Tableheader</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTableheader()
+	 * @generated
+	 * @ordered
+	 */
+	protected TableHeader tableheader;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TableImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return TablePackage.Literals.TABLE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, TablePackage.TABLE__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setType(String newType) {
+		String oldType = type;
+		type = newType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, TablePackage.TABLE__TYPE, oldType, type));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Row> getRows() {
+		if (rows == null) {
+			rows = new EObjectResolvingEList<Row>(Row.class, this, TablePackage.TABLE__ROWS);
+		}
+		return rows;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TableHeader getTableheader() {
+		if (tableheader != null && tableheader.eIsProxy()) {
+			InternalEObject oldTableheader = (InternalEObject)tableheader;
+			tableheader = (TableHeader)eResolveProxy(oldTableheader);
+			if (tableheader != oldTableheader) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, TablePackage.TABLE__TABLEHEADER, oldTableheader, tableheader));
+			}
+		}
+		return tableheader;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TableHeader basicGetTableheader() {
+		return tableheader;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTableheader(TableHeader newTableheader) {
+		TableHeader oldTableheader = tableheader;
+		tableheader = newTableheader;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, TablePackage.TABLE__TABLEHEADER, oldTableheader, tableheader));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case TablePackage.TABLE__NAME:
+				return getName();
+			case TablePackage.TABLE__TYPE:
+				return getType();
+			case TablePackage.TABLE__ROWS:
+				return getRows();
+			case TablePackage.TABLE__TABLEHEADER:
+				if (resolve) return getTableheader();
+				return basicGetTableheader();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case TablePackage.TABLE__NAME:
+				setName((String)newValue);
+				return;
+			case TablePackage.TABLE__TYPE:
+				setType((String)newValue);
+				return;
+			case TablePackage.TABLE__ROWS:
+				getRows().clear();
+				getRows().addAll((Collection<? extends Row>)newValue);
+				return;
+			case TablePackage.TABLE__TABLEHEADER:
+				setTableheader((TableHeader)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case TablePackage.TABLE__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case TablePackage.TABLE__TYPE:
+				setType(TYPE_EDEFAULT);
+				return;
+			case TablePackage.TABLE__ROWS:
+				getRows().clear();
+				return;
+			case TablePackage.TABLE__TABLEHEADER:
+				setTableheader((TableHeader)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case TablePackage.TABLE__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case TablePackage.TABLE__TYPE:
+				return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
+			case TablePackage.TABLE__ROWS:
+				return rows != null && !rows.isEmpty();
+			case TablePackage.TABLE__TABLEHEADER:
+				return tableheader != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(", type: ");
+		result.append(type);
+		result.append(')');
+		return result.toString();
+	}
+
+	
+	/**
+	 * @generated NOT
+	 */
+	
+	@Override
+	public int getColCount() {
+		if (this.tableheader!=null){
+		return this.tableheader.getCells().size();
+		}
+		return 0;
+	}
+
+} //TableImpl
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/TablePackageImpl.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/TablePackageImpl.java
new file mode 100644
index 0000000..61d117a
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/impl/TablePackageImpl.java
@@ -0,0 +1,319 @@
+/**
+ */
+package org.eclipse.gendoc.table.impl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+import org.eclipse.gendoc.table.Cell;
+import org.eclipse.gendoc.table.Row;
+import org.eclipse.gendoc.table.Table;
+import org.eclipse.gendoc.table.TableFactory;
+import org.eclipse.gendoc.table.TableHeader;
+import org.eclipse.gendoc.table.TablePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class TablePackageImpl extends EPackageImpl implements TablePackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass tableEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass rowEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass cellEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass tableHeaderEClass = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.gendoc.table.TablePackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private TablePackageImpl() {
+		super(eNS_URI, TableFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link TablePackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static TablePackage init() {
+		if (isInited) return (TablePackage)EPackage.Registry.INSTANCE.getEPackage(TablePackage.eNS_URI);
+
+		// Obtain or create and register package
+		TablePackageImpl theTablePackage = (TablePackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof TablePackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new TablePackageImpl());
+
+		isInited = true;
+
+		// Create package meta-data objects
+		theTablePackage.createPackageContents();
+
+		// Initialize created meta-data
+		theTablePackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theTablePackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(TablePackage.eNS_URI, theTablePackage);
+		return theTablePackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getTable() {
+		return tableEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getTable_Name() {
+		return (EAttribute)tableEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getTable_Type() {
+		return (EAttribute)tableEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getTable_Rows() {
+		return (EReference)tableEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getTable_Tableheader() {
+		return (EReference)tableEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getRow() {
+		return rowEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getRow_Object() {
+		return (EAttribute)rowEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getRow_Cells() {
+		return (EReference)rowEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getCell() {
+		return cellEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getCell_Object() {
+		return (EAttribute)cellEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getCell_Label() {
+		return (EAttribute)cellEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getTableHeader() {
+		return tableHeaderEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TableFactory getTableFactory() {
+		return (TableFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		tableEClass = createEClass(TABLE);
+		createEAttribute(tableEClass, TABLE__NAME);
+		createEAttribute(tableEClass, TABLE__TYPE);
+		createEReference(tableEClass, TABLE__ROWS);
+		createEReference(tableEClass, TABLE__TABLEHEADER);
+
+		rowEClass = createEClass(ROW);
+		createEAttribute(rowEClass, ROW__OBJECT);
+		createEReference(rowEClass, ROW__CELLS);
+
+		cellEClass = createEClass(CELL);
+		createEAttribute(cellEClass, CELL__OBJECT);
+		createEAttribute(cellEClass, CELL__LABEL);
+
+		tableHeaderEClass = createEClass(TABLE_HEADER);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		tableHeaderEClass.getESuperTypes().add(this.getRow());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(tableEClass, Table.class, "Table", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getTable_Name(), ecorePackage.getEString(), "name", "", 0, 1, Table.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getTable_Type(), ecorePackage.getEString(), "type", "", 0, 1, Table.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getTable_Rows(), this.getRow(), null, "rows", null, 0, -1, Table.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getTable_Tableheader(), this.getTableHeader(), null, "tableheader", null, 0, 1, Table.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(rowEClass, Row.class, "Row", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getRow_Object(), ecorePackage.getEJavaObject(), "object", null, 0, 1, Row.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getRow_Cells(), this.getCell(), null, "cells", null, 0, -1, Row.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(cellEClass, Cell.class, "Cell", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getCell_Object(), ecorePackage.getEJavaObject(), "object", null, 0, 1, Cell.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getCell_Label(), ecorePackage.getEString(), "label", "", 0, 1, Cell.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(tableHeaderEClass, TableHeader.class, "TableHeader", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		// Create resource
+		createResource(eNS_URI);
+	}
+
+} //TablePackageImpl
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/util/TableAdapterFactory.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/util/TableAdapterFactory.java
new file mode 100644
index 0000000..4a57e2d
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/util/TableAdapterFactory.java
@@ -0,0 +1,174 @@
+/**
+ */
+package org.eclipse.gendoc.table.util;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.gendoc.table.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.gendoc.table.TablePackage
+ * @generated
+ */
+public class TableAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static TablePackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TableAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = TablePackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TableSwitch<Adapter> modelSwitch =
+		new TableSwitch<Adapter>() {
+			@Override
+			public Adapter caseTable(Table object) {
+				return createTableAdapter();
+			}
+			@Override
+			public Adapter caseRow(Row object) {
+				return createRowAdapter();
+			}
+			@Override
+			public Adapter caseCell(Cell object) {
+				return createCellAdapter();
+			}
+			@Override
+			public Adapter caseTableHeader(TableHeader object) {
+				return createTableHeaderAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.gendoc.table.Table <em>Table</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.gendoc.table.Table
+	 * @generated
+	 */
+	public Adapter createTableAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.gendoc.table.Row <em>Row</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.gendoc.table.Row
+	 * @generated
+	 */
+	public Adapter createRowAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.gendoc.table.Cell <em>Cell</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.gendoc.table.Cell
+	 * @generated
+	 */
+	public Adapter createCellAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.gendoc.table.TableHeader <em>Header</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.gendoc.table.TableHeader
+	 * @generated
+	 */
+	public Adapter createTableHeaderAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //TableAdapterFactory
diff --git a/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/util/TableSwitch.java b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/util/TableSwitch.java
new file mode 100644
index 0000000..d4aaee1
--- /dev/null
+++ b/plugins/org.eclipse.gendoc.table/src/org/eclipse/gendoc/table/util/TableSwitch.java
@@ -0,0 +1,174 @@
+/**
+ */
+package org.eclipse.gendoc.table.util;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+import org.eclipse.gendoc.table.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.gendoc.table.TablePackage
+ * @generated
+ */
+public class TableSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static TablePackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TableSwitch() {
+		if (modelPackage == null) {
+			modelPackage = TablePackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case TablePackage.TABLE: {
+				Table table = (Table)theEObject;
+				T result = caseTable(table);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case TablePackage.ROW: {
+				Row row = (Row)theEObject;
+				T result = caseRow(row);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case TablePackage.CELL: {
+				Cell cell = (Cell)theEObject;
+				T result = caseCell(cell);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case TablePackage.TABLE_HEADER: {
+				TableHeader tableHeader = (TableHeader)theEObject;
+				T result = caseTableHeader(tableHeader);
+				if (result == null) result = caseRow(tableHeader);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Table</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Table</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseTable(Table object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Row</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Row</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseRow(Row object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Cell</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Cell</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseCell(Cell object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Header</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Header</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseTableHeader(TableHeader object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //TableSwitch
diff --git a/plugins/org.eclipse.gendoc.tags.handlers/META-INF/MANIFEST.MF b/plugins/org.eclipse.gendoc.tags.handlers/META-INF/MANIFEST.MF
index 04dc468..f6e2fdf 100644
--- a/plugins/org.eclipse.gendoc.tags.handlers/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.gendoc.tags.handlers/META-INF/MANIFEST.MF
@@ -14,7 +14,10 @@
  org.eclipse.gendoc.tags,
  org.eclipse.gendoc.tags.parsers,
  org.eclipse.core.resources,
- org.eclipse.ui
+ org.eclipse.ui,
+ org.eclipse.ui.workbench,
+ org.eclipse.emf.ecore,
+ org.eclipse.gendoc.table
 Export-Package: org.eclipse.gendoc.tags.handlers,
  org.eclipse.gendoc.tags.handlers.impl,
  org.eclipse.gendoc.tags.handlers.impl.config,
diff --git a/plugins/org.eclipse.gendoc.tags.handlers/bin/org/eclipse/gendoc/tags/handlers/impl/RegisteredTags.properties b/plugins/org.eclipse.gendoc.tags.handlers/bin/org/eclipse/gendoc/tags/handlers/impl/RegisteredTags.properties
index a5e2868..76e4daf 100644
--- a/plugins/org.eclipse.gendoc.tags.handlers/bin/org/eclipse/gendoc/tags/handlers/impl/RegisteredTags.properties
+++ b/plugins/org.eclipse.gendoc.tags.handlers/bin/org/eclipse/gendoc/tags/handlers/impl/RegisteredTags.properties
@@ -37,6 +37,7 @@
 LIST=list
 
 TABLE=table
+TABLE_OBJECT=object
 
 DROP=drop
 
diff --git a/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/RegisteredTags.java b/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/RegisteredTags.java
index 9c94e44..3086f66 100644
--- a/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/RegisteredTags.java
+++ b/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/RegisteredTags.java
@@ -9,7 +9,7 @@
  * 
  * Contributors:
  * Kris Robertson (Atos Origin) kris.robertson@atosorigin.com - Initial API and implementation
- * 
+ * Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net - fix bug #515404: create new attribute (object) for table tag
  *****************************************************************************/
 package org.eclipse.gendoc.tags.handlers.impl;
 
@@ -88,7 +88,7 @@
 
     // table
     public static String TABLE;
-
+    public static String TABLE_OBJECT;
     // drop
     public static String DROP;
     
diff --git a/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/RegisteredTags.properties b/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/RegisteredTags.properties
index a5e2868..76e4daf 100644
--- a/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/RegisteredTags.properties
+++ b/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/RegisteredTags.properties
@@ -37,6 +37,7 @@
 LIST=list
 
 TABLE=table
+TABLE_OBJECT=object
 
 DROP=drop
 
diff --git a/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/scripts/TableTagHandler.java b/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/scripts/TableTagHandler.java
index 22a0fb3..fbecbff 100644
--- a/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/scripts/TableTagHandler.java
+++ b/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/scripts/TableTagHandler.java
@@ -9,7 +9,7 @@
  * 
  * Contributors:
  * Kris Robertson (Atos Origin) kris.robertson@atosorigin.com - Initial API and implementation
- * 
+ * Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net - fix bug #515404: generate tables automatically 
  *****************************************************************************/
 package org.eclipse.gendoc.tags.handlers.impl.scripts;
 
@@ -18,15 +18,19 @@
 
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.gendoc.documents.IDocumentService;
+import org.eclipse.gendoc.documents.ITableService;
 import org.eclipse.gendoc.services.GendocServices;
 import org.eclipse.gendoc.services.ILogger;
 import org.eclipse.gendoc.services.exception.GenDocException;
 import org.eclipse.gendoc.services.exception.InvalidContentException;
 import org.eclipse.gendoc.tags.ITag;
 import org.eclipse.gendoc.tags.handlers.AbstractPrePostTagHandler;
+import org.eclipse.gendoc.tags.handlers.impl.RegisteredTags;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
+import org.eclipse.gendoc.table.Table;
+
 /**
  * Handler for &lt;table&gt; tags.
  * 
@@ -62,6 +66,25 @@
         }
         else
         {
+        	if (tag.getAttributes().containsKey("object")) {
+                
+				Object tableModel = getTableModel(tag, documentService);
+				int indexStart = m.start();
+				int indexEnd = returnValue.lastIndexOf("</" + tableLabel + ">");
+				// Add the length of the tag label </TAG_LABEL> (3 => '<' + '/'
+				// + '>')
+				indexEnd += tableLabel.length() + 3;
+				// Extract the string that contains only the table nodes
+				String tableText = returnValue.substring(indexStart, indexEnd);
+				// Transform the text as XML nodes
+				String nodes = "<document>" + tableText + "</document>";
+				nodes = documentService.addNamingSpaces(nodes, "document");
+				Node tableNode = documentService.asNode(nodes).getFirstChild();
+				ITableService tableService = documentService.getTableService();
+				return tableService.manageTable(tag, documentService, returnValue, tableModel, tableNode);
+				
+								
+			} else {
             int indexStart = m.start();
             int indexEnd = returnValue.lastIndexOf("</" + tableLabel + ">");
             // Add the length of the tag label </TAG_LABEL> (3 => '<' + '/' + '>')
@@ -72,9 +95,31 @@
             String singleTable = this.concatTables(documentService, tableText);
             // Replace the tables by the created table
             returnValue.replace(indexStart, indexEnd, singleTable);
+			}
         }
         return returnValue.toString();
     }
+    
+    
+    /**
+     * Get table model 
+	 * @param tag
+     * @param documentService 
+	 * @return
+	 */
+	private Object getTableModel(ITag tag, IDocumentService documentService) {
+
+		Table tableModel = null;
+		if (tag != null && tag.getAttributes() != null) {
+			String tableId = tag.getAttributes().get(RegisteredTags.TABLE_OBJECT);
+			ITableService tableService = documentService.getTableService();
+			if (tableService != null) {
+				tableModel = tableService.getTable(tableId);
+			}
+		}
+		return tableModel;
+	}
+    
 
     /**
      * Create a single table from all the tables in the given string => Find the first table and then insert all the row
@@ -127,5 +172,7 @@
         }
         return documentService.asText(mainTable);
     }
+    
+
 
 }
diff --git a/pom.xml b/pom.xml
index d5e643e..7c6e29c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,6 +33,7 @@
 		<module>plugins/org.eclipse.gendoc.services.odt</module>
 	    <module>plugins/org.eclipse.gendoc.services.pptx</module>
 		<module>plugins/org.eclipse.gendoc.services.xlsx</module>
+		<module>plugins/org.eclipse.gendoc.table</module>
 		<module>plugins/org.eclipse.gendoc.tags</module>
 		<module>plugins/org.eclipse.gendoc.tags.handlers</module>
 		<module>plugins/org.eclipse.gendoc.tags.html</module>