diff --git a/de.bmotionstudio.gef.editor/plugin.xml b/de.bmotionstudio.gef.editor/plugin.xml
index 08ffb3e0b4f674f97b0bdea5d55f17559fa7af79..2c44c36df58d3693d32553202cc0f263e64b1956 100644
--- a/de.bmotionstudio.gef.editor/plugin.xml
+++ b/de.bmotionstudio.gef.editor/plugin.xml
@@ -291,9 +291,13 @@
             name="External Observer Script">
       </observer>
       <observer
-            class="de.bmotionstudio.gef.editor.observer.ColumnObserver"
+            class="de.bmotionstudio.gef.editor.observer.TableObserver"
             name="Table Observer">
       </observer>
+      <observer
+            class="de.bmotionstudio.gef.editor.observer.ColumnObserver"
+            name="Column Observer">
+      </observer>
    </extension>
    <extension
          point="de.bmotionstudio.gef.editor.schedulerEvent">
@@ -537,7 +541,13 @@
          <observer
                id="de.bmotionstudio.gef.editor.observer.ColumnObserver">
             <control
-                  id="de.bmotionstudio.gef.editor.tablecell">
+                  id="de.bmotionstudio.gef.editor.tablecolumn">
+            </control>
+         </observer>
+         <observer
+               id="de.bmotionstudio.gef.editor.observer.TableObserver">
+            <control
+                  id="de.bmotionstudio.gef.editor.table">
             </control>
          </observer>
       </include>
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/ColumnObserver.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/ColumnObserver.java
index 988f9c8a1b4d5a010bd7f11167b610f94600a016..078476c654321fee9d8c69ffee5b964ca0438ad3 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/ColumnObserver.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/ColumnObserver.java
@@ -2,10 +2,10 @@ package de.bmotionstudio.gef.editor.observer;
 
 import de.bmotionstudio.gef.editor.Animation;
 import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.attribute.AbstractAttribute;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.observer.wizard.WizardColumnObserver;
 import de.bmotionstudio.gef.editor.util.BMSUtil;
-import de.prob.unicode.UnicodeTranslator;
 
 public class ColumnObserver extends Observer {
 
@@ -25,53 +25,24 @@ public class ColumnObserver extends Observer {
 
 			String fEval = BMSUtil.parseExpression(expression, control,
 					animation);
-
-			fEval = fEval.replace("}", "").replace("{", "").replace(")", "")
-					.replace("(", "");
+			fEval = fEval.replace("}", "").replace("{", "");
 			String[] splitArray = fEval.split(",");
 
-			// ---------------------------------------------------------------
-
-			int numberOfRows = splitArray.length;
-
-			BControl tableControl = control.getParent().getParent();
-
-			// Set the correct number of rows
-			tableControl
-					.setAttributeValue(AttributeConstants.ATTRIBUTE_ROWS,
-							numberOfRows, true, false);
-
-			System.out.println("number of rows: " + numberOfRows);
-
-			boolean setColumns = false;
-
-			// Set content and the correct number of columns
-			for (int i = 0; i < numberOfRows; i++) {
-
-				String content = UnicodeTranslator.toAscii(splitArray[i])
-						.replace("|->", ",");
+			AbstractAttribute attributeRows = control.getParent().getAttribute(
+					AttributeConstants.ATTRIBUTE_ROWS);
 
-				String[] vals = content.split(",");
-				int numberOfColumns = vals.length;
-				
-				// Set only one time the number of columns!
-				if (!setColumns) {
-					tableControl
-							.setAttributeValue(
-									AttributeConstants.ATTRIBUTE_COLUMNS,
-									numberOfColumns, true, false);
-					setColumns = true;
-					System.out.println("number of columns: " + numberOfColumns);
-				}
+			Integer defaultRows = Integer.valueOf(attributeRows.getInitValue()
+					.toString());
 
-				for (int z = 0; z < numberOfColumns; z++) {
-					String val = vals[z];
-					BControl column = tableControl.getChildrenArray().get(z);
-					BControl cell = column.getChildrenArray().get(i);
-					cell.setAttributeValue(AttributeConstants.ATTRIBUTE_TEXT,
-							val);
-				}
+			control.getParent().setAttributeValue(
+					AttributeConstants.ATTRIBUTE_ROWS,
+					defaultRows + splitArray.length, true, false);
 
+			for (int i = defaultRows; i < splitArray.length + defaultRows; i++) {
+				control.getChildrenArray()
+						.get(i)
+						.setAttributeValue(AttributeConstants.ATTRIBUTE_TEXT,
+								splitArray[i - defaultRows]);
 			}
 
 		}
@@ -99,4 +70,4 @@ public class ColumnObserver extends Observer {
 		return new WizardColumnObserver(control, this);
 	}
 
-}
+}
\ No newline at end of file
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/TableObserver.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/TableObserver.java
new file mode 100644
index 0000000000000000000000000000000000000000..a63cb1b67e4402064143cab7c3ad85caf90d5717
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/TableObserver.java
@@ -0,0 +1,104 @@
+package de.bmotionstudio.gef.editor.observer;
+
+import de.bmotionstudio.gef.editor.Animation;
+import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.observer.wizard.WizardTableObserver;
+import de.bmotionstudio.gef.editor.util.BMSUtil;
+import de.prob.unicode.UnicodeTranslator;
+
+public class TableObserver extends Observer {
+
+	private String expression;
+	private String predicate;
+
+	@Override
+	public void check(Animation animation, BControl control) {
+
+		// First evaluate predicate (predicate field)
+		String bolValue = "true";
+		if (predicate != null && predicate.length() > 0) {
+			bolValue = BMSUtil.parsePredicate(predicate, control, animation);
+		}
+
+		if (Boolean.valueOf(bolValue)) {
+
+			String fEval = BMSUtil.parseExpression(expression, control,
+					animation);
+
+			fEval = fEval.replace("}", "").replace("{", "").replace(")", "")
+					.replace("(", "");
+			String[] splitArray = fEval.split(",");
+
+			// ---------------------------------------------------------------
+
+			Integer numberOfOldRows = Integer.valueOf(control
+					.getAttributeValue(AttributeConstants.ATTRIBUTE_ROWS)
+					.toString());
+			Integer numberOfOldColumns = Integer.valueOf(control
+					.getAttributeValue(AttributeConstants.ATTRIBUTE_COLUMNS)
+					.toString());
+			int numberOfNewRows = splitArray.length;
+
+			// Set the correct number of rows
+			control.setAttributeValue(AttributeConstants.ATTRIBUTE_ROWS,
+					numberOfNewRows + numberOfOldRows, true, false);
+
+			boolean setColumns = false;
+
+			// Set content and the correct number of columns
+			for (int i = numberOfOldRows; i < numberOfNewRows + numberOfOldRows; i++) {
+
+				String content = UnicodeTranslator.toAscii(
+						splitArray[i - numberOfOldRows]).replace("|->", ",");
+
+				String[] vals = content.split(",");
+				int numberOfNewColumns = vals.length;
+
+				// Set only one time the number of columns!
+				if (!setColumns) {
+					int ncolumns = numberOfNewColumns;
+					if (numberOfOldColumns > numberOfNewColumns)
+						ncolumns = numberOfOldColumns;
+					control.setAttributeValue(
+							AttributeConstants.ATTRIBUTE_COLUMNS, ncolumns,
+							true, false);
+					setColumns = true;
+				}
+
+				for (int z = 0; z < numberOfNewColumns; z++) {
+					String val = vals[z];
+					BControl column = control.getChildrenArray().get(z);
+					BControl cell = column.getChildrenArray().get(i);
+					cell.setAttributeValue(AttributeConstants.ATTRIBUTE_TEXT,
+							val);
+				}
+
+			}
+
+		}
+
+	}
+
+	public void setExpression(String expression) {
+		this.expression = expression;
+	}
+
+	public String getExpression() {
+		return expression;
+	}
+
+	public String getPredicate() {
+		return predicate;
+	}
+
+	public void setPredicate(String predicate) {
+		this.predicate = predicate;
+	}
+
+	@Override
+	public ObserverWizard getWizard(BControl control) {
+		return new WizardTableObserver(control, this);
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardTableObserver.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardTableObserver.java
new file mode 100644
index 0000000000000000000000000000000000000000..9da7ff156f63ec99cbb0003adfd147ab40e0c84b
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardTableObserver.java
@@ -0,0 +1,125 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.observer.wizard;
+
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.databinding.beans.BeansObservables;
+import org.eclipse.jface.databinding.swt.SWTObservables;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.observer.Observer;
+import de.bmotionstudio.gef.editor.observer.ObserverWizard;
+import de.bmotionstudio.gef.editor.observer.TableObserver;
+
+public class WizardTableObserver extends ObserverWizard {
+
+	private class TableObserverPage extends WizardPage {
+
+		private Text txtExpression;
+		private Text txtPredicate;
+
+		public Text getTxtExpression() {
+			return txtExpression;
+		}
+
+		protected TableObserverPage(final String pageName) {
+			super(pageName);
+		}
+
+		public void createControl(final Composite parent) {
+
+			final DataBindingContext dbc = new DataBindingContext();
+
+			Composite container = new Composite(parent, SWT.NONE);
+
+			container.setLayoutData(new GridData(GridData.FILL_BOTH));
+			container.setLayout(new GridLayout(2, false));
+
+			Label lb = new Label(container, SWT.NONE);
+			lb.setText("Predicate:");
+
+			txtPredicate = new Text(container, SWT.BORDER);
+			txtPredicate.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			txtPredicate.setFont(new Font(Display.getDefault(), new FontData(
+					"Arial", 10, SWT.NONE)));
+
+			lb = new Label(container, SWT.NONE);
+			lb.setText("Expression:");
+			lb.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+
+			txtExpression = new Text(container, SWT.BORDER | SWT.MULTI
+					| SWT.WRAP);
+			txtExpression.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+			initBindings(dbc);
+
+			setControl(container);
+
+		}
+
+		private void initBindings(DataBindingContext dbc) {
+
+			dbc.bindValue(SWTObservables.observeText(txtPredicate, SWT.Modify),
+					BeansObservables.observeValue(
+							(TableObserver) getObserver(), "predicate"));
+
+			dbc.bindValue(
+					SWTObservables.observeText(txtExpression, SWT.Modify),
+					BeansObservables.observeValue(
+							(TableObserver) getObserver(), "expression"));
+
+		}
+
+	}
+
+	public WizardTableObserver(BControl bcontrol,
+			Observer bobserver) {
+		super(bcontrol, bobserver);
+		addPage(new TableObserverPage("TableObserverPage"));
+	}
+
+	@Override
+	protected Boolean prepareToFinish() {
+
+		TableObserverPage page = (TableObserverPage) getPage("TableObserverPage");
+
+		String errorStr = "";
+
+		if (page.getTxtExpression().getText().length() == 0)
+			errorStr += "Please enter an expression.\n";
+
+		if (page.getErrorMessage() != null)
+			errorStr += "Please check the syntax/parser error.\n";
+
+		if (errorStr.length() > 0) {
+			MessageDialog.openError(Display.getDefault().getActiveShell(),
+					"An Error occured", errorStr);
+			return false;
+		}
+
+		return true;
+
+	}
+
+	@Override
+	public Point getSize() {
+		return new Point(600, 500);
+	}
+
+}