Index: trunk/quest-ui-swt/src/main/java/de/ugoe/cs/quest/ui/swt/ShowGuiModelDialog.java
===================================================================
--- trunk/quest-ui-swt/src/main/java/de/ugoe/cs/quest/ui/swt/ShowGuiModelDialog.java	(revision 845)
+++ trunk/quest-ui-swt/src/main/java/de/ugoe/cs/quest/ui/swt/ShowGuiModelDialog.java	(revision 846)
@@ -12,4 +12,5 @@
 import org.eclipse.swt.widgets.Dialog;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.MessageBox;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Tree;
@@ -18,4 +19,6 @@
 import de.ugoe.cs.quest.eventcore.guimodel.GUIModel;
 import de.ugoe.cs.quest.eventcore.guimodel.IGUIElement;
+import de.ugoe.cs.util.console.Console;
+
 import org.eclipse.swt.widgets.Label;
 
@@ -72,8 +75,8 @@
         shell.setText(getText());
 
-        shell.setLayout(new GridLayout(2, false));
+        shell.setLayout(new GridLayout(3, false));
 
-        guiTree = new Tree(shell, SWT.BORDER);
-        guiTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
+        guiTree = new Tree(shell, SWT.BORDER | SWT.MULTI);
+        guiTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1));
 
         buildGuiTree();
@@ -96,4 +99,16 @@
         });
         btnCollapseAll.setText("Collapse all");
+        
+        Button btnMerge = new Button(shell, SWT.NONE);
+        btnMerge.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                mergeSelectedNode(guiTree);
+            }
+        });
+        btnMerge.setText("Merge");
+        
+        //new Label(shell, SWT.NONE);
+        new Label(shell, SWT.NONE);
         new Label(shell, SWT.NONE);
         new Label(shell, SWT.NONE);
@@ -105,4 +120,5 @@
             TreeItem child = new TreeItem(guiTree, SWT.NULL);
             child.setText(element.toString());
+            child.setData(element);
             buildGuiTree(child, model.getChildren(element));
         }
@@ -113,4 +129,5 @@
             TreeItem child = new TreeItem(currentParent, SWT.NULL);
             child.setText(element.toString());
+            child.setData(element);
             buildGuiTree(child, model.getChildren(element));
         }
@@ -129,4 +146,41 @@
         }
     }
+    
+    private void mergeSelectedNode(Tree tree) {
+        TreeItem[] selectedNodes = tree.getSelection();
+        if( selectedNodes.length<2 ) {
+            MessageBox messageBox = new MessageBox(shell, SWT.ERROR);
+            messageBox.setMessage("Must select at least two nodes to merge!");
+            messageBox.setText("Error");
+            messageBox.open();
+            return;
+        }
+        
+        TreeItem firstParent = selectedNodes[0].getParentItem();
+        for( int i=1 ; i<selectedNodes.length ; i++ ) {
+            if( firstParent!=selectedNodes[i].getParentItem() ) {
+                MessageBox messageBox = new MessageBox(shell, SWT.ERROR);
+                messageBox.setMessage("All selected nodes must have the same parent!");
+                messageBox.setText("Error");
+                messageBox.open();
+                return;
+            }
+        }
+        
+        try {
+            // try to merge the elements
+            IGUIElement firstElement = (IGUIElement) selectedNodes[0].getData();
+            for( int i=1 ; i<selectedNodes.length ; i++ ) {
+                model.mergeGUIElements(firstElement, (IGUIElement) selectedNodes[i].getData());
+            }
+        } catch( IllegalArgumentException e) {
+            Console.logException(e);
+        }
+        
+        // update visualization of the model
+        firstParent.removeAll();
+        buildGuiTree(firstParent, model.getChildren((IGUIElement) firstParent.getData()));
+        firstParent.setExpanded(true);
+    }
 
 }
