diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupGroupHeaderLayer.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupGroupHeaderLayer.java
index a0f776b..8743d6e 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupGroupHeaderLayer.java
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupGroupHeaderLayer.java
@@ -196,24 +196,30 @@
 	protected int getColumnSpan(int columnPosition) {
 		int columnIndex = getColumnIndexByPosition(columnPosition);
 		ColumnGroup columnGroup = model.getColumnGroupByIndex(columnIndex);
-
+		
+		int sizeOfGroup = columnGroup.getSize();		
+		
 		if (columnGroup.isCollapsed()) {
 			int sizeOfStaticColumns = columnGroup.getStaticColumnIndexes().size();
-			return sizeOfStaticColumns == 0 ? 1 : sizeOfStaticColumns;
-		} else {
-			int startPositionOfGroup = getStartPositionOfGroup(columnPosition);
-			int sizeOfGroup = columnGroup.getSize();
-			int endPositionOfGroup = startPositionOfGroup + sizeOfGroup;
-			List<Integer> columnIndexesInGroup = columnGroup.getMembers();
-
-			for (int i = startPositionOfGroup; i < endPositionOfGroup; i++) {
-				int index = getColumnIndexByPosition(i);
-				if (!columnIndexesInGroup.contains(Integer.valueOf(index))) {
-					sizeOfGroup--;
-				}
+			if (sizeOfStaticColumns == 0) {
+				return 1;
 			}
-			return sizeOfGroup;
+			else {
+				sizeOfGroup = sizeOfStaticColumns;
+			}
 		}
+
+		int startPositionOfGroup = getStartPositionOfGroup(columnPosition);
+		int endPositionOfGroup = startPositionOfGroup + sizeOfGroup;
+		List<Integer> columnIndexesInGroup = columnGroup.getMembers();
+
+		for (int i = startPositionOfGroup; i < endPositionOfGroup; i++) {
+			int index = getColumnIndexByPosition(i);
+			if (!columnIndexesInGroup.contains(Integer.valueOf(index))) {
+				sizeOfGroup--;
+			}
+		}
+		return sizeOfGroup;
 	}
 
 	/**
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupHeaderLayer.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupHeaderLayer.java
index 53a54e7..fb1afdd 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupHeaderLayer.java
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupHeaderLayer.java
@@ -269,23 +269,29 @@
 		int columnIndex = getColumnIndexByPosition(columnPosition);
 		ColumnGroup columnGroup = model.getColumnGroupByIndex(columnIndex);
 		
+		int sizeOfGroup = columnGroup.getSize();		
+		
 		if (columnGroup.isCollapsed()) {
 			int sizeOfStaticColumns = columnGroup.getStaticColumnIndexes().size();
-			return sizeOfStaticColumns == 0 ? 1 : sizeOfStaticColumns;
-		} else {
-			int startPositionOfGroup = getStartPositionOfGroup(columnPosition);
-			int sizeOfGroup = columnGroup.getSize();
-			int endPositionOfGroup = startPositionOfGroup + sizeOfGroup;
-			List<Integer> columnIndexesInGroup = columnGroup.getMembers();
-
-			for (int i = startPositionOfGroup; i < endPositionOfGroup; i++) {
-				int index = getColumnIndexByPosition(i);
-				if (!columnIndexesInGroup.contains(Integer.valueOf(index))) {
-					sizeOfGroup--;
-				}
+			if (sizeOfStaticColumns == 0) {
+				return 1;
 			}
-			return sizeOfGroup;
+			else {
+				sizeOfGroup = sizeOfStaticColumns;
+			}
 		}
+
+		int startPositionOfGroup = getStartPositionOfGroup(columnPosition);
+		int endPositionOfGroup = startPositionOfGroup + sizeOfGroup;
+		List<Integer> columnIndexesInGroup = columnGroup.getMembers();
+
+		for (int i = startPositionOfGroup; i < endPositionOfGroup; i++) {
+			int index = getColumnIndexByPosition(i);
+			if (!columnIndexesInGroup.contains(Integer.valueOf(index))) {
+				sizeOfGroup--;
+			}
+		}
+		return sizeOfGroup;
 	}
 
 	/**
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupModel.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupModel.java
index b595183..62a5141 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupModel.java
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupModel.java
@@ -504,8 +504,7 @@
 		
 		public List<Integer> getMembersSorted() {
 			
-			List<Integer> sortedMembers = 
-					Collections.unmodifiableList(members);
+			List<Integer> sortedMembers = new LinkedList<Integer>(members);
 			Collections.sort(sortedMembers);
 			
 			return sortedMembers;
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/RowGroupHeaderLayer.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/RowGroupHeaderLayer.java
index a5f71c4..8d7740d 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/RowGroupHeaderLayer.java
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/RowGroupHeaderLayer.java
@@ -211,23 +211,30 @@
 		// Get the row and the group from our cache and model.
 		final IRowGroup<T> rowGroup = RowGroupUtils.getRowGroupForRowIndex(model, rowIndex);
 		
-		if (RowGroupUtils.isCollapsed(model, rowGroup)) {
-			return rowGroup.getOwnStaticMemberRows().size();			
-		} else {
-			int startPositionOfGroup = getStartPositionOfGroup(rowPosition);
-			int sizeOfGroup = RowGroupUtils.sizeOfGroup(model, rowIndex);
-			int endPositionOfGroup = startPositionOfGroup + sizeOfGroup;
-			List<Integer> rowIndexesInGroup = RowGroupUtils.getRowIndexesInGroup(model, rowIndex);
+		int sizeOfGroup = RowGroupUtils.sizeOfGroup(model, rowIndex);
 
-			for (int i = startPositionOfGroup; i < endPositionOfGroup; i++) {
-				int index = getRowIndexByPosition(i);
-				if (!rowIndexesInGroup.contains(Integer.valueOf(index))) {
-					sizeOfGroup--;
-				}
+		if (RowGroupUtils.isCollapsed(model, rowGroup)) {
+			int sizeOfStaticRows = rowGroup.getOwnStaticMemberRows().size();
+			if (sizeOfStaticRows == 0) {
+				return 1;
 			}
-			
-			return Math.max(1, sizeOfGroup);
+			else {
+				sizeOfGroup = sizeOfStaticRows;
+			}
+		} 
+		
+		int startPositionOfGroup = getStartPositionOfGroup(rowPosition);
+		int endPositionOfGroup = startPositionOfGroup + sizeOfGroup;
+		List<Integer> rowIndexesInGroup = RowGroupUtils.getRowIndexesInGroup(model, rowIndex);
+
+		for (int i = startPositionOfGroup; i < endPositionOfGroup; i++) {
+			int index = getRowIndexByPosition(i);
+			if (!rowIndexesInGroup.contains(Integer.valueOf(index))) {
+				sizeOfGroup--;
+			}
 		}
+		
+		return sizeOfGroup;
 	}
 	
 	/**
diff --git a/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_500_Layers/_5111_ColumnGroupingExample.java b/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_500_Layers/_5111_ColumnGroupingExample.java
index 89b19fb..c09e29c 100644
--- a/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_500_Layers/_5111_ColumnGroupingExample.java
+++ b/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_500_Layers/_5111_ColumnGroupingExample.java
@@ -14,13 +14,18 @@
 import java.util.Map;
 
 import org.eclipse.nebula.widgets.nattable.NatTable;
+import org.eclipse.nebula.widgets.nattable.columnChooser.command.DisplayColumnChooserCommandHandler;
+import org.eclipse.nebula.widgets.nattable.config.AbstractUiBindingConfiguration;
 import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration;
+import org.eclipse.nebula.widgets.nattable.data.ExtendedReflectiveColumnPropertyAccessor;
+import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor;
 import org.eclipse.nebula.widgets.nattable.data.IDataProvider;
+import org.eclipse.nebula.widgets.nattable.data.ListDataProvider;
 import org.eclipse.nebula.widgets.nattable.examples.AbstractNatExample;
-import org.eclipse.nebula.widgets.nattable.examples.data.person.Person;
+import org.eclipse.nebula.widgets.nattable.examples.data.person.ExtendedPersonWithAddress;
 import org.eclipse.nebula.widgets.nattable.examples.data.person.PersonService;
 import org.eclipse.nebula.widgets.nattable.examples.runner.StandaloneNatExampleRunner;
-import org.eclipse.nebula.widgets.nattable.grid.data.DefaultBodyDataProvider;
+import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
 import org.eclipse.nebula.widgets.nattable.grid.data.DefaultColumnHeaderDataProvider;
 import org.eclipse.nebula.widgets.nattable.grid.data.DefaultCornerDataProvider;
 import org.eclipse.nebula.widgets.nattable.grid.data.DefaultRowHeaderDataProvider;
@@ -34,14 +39,22 @@
 import org.eclipse.nebula.widgets.nattable.group.ColumnGroupHeaderLayer;
 import org.eclipse.nebula.widgets.nattable.group.ColumnGroupModel;
 import org.eclipse.nebula.widgets.nattable.group.ColumnGroupReorderLayer;
+import org.eclipse.nebula.widgets.nattable.group.config.ColumnGroupMenuItemProviders;
 import org.eclipse.nebula.widgets.nattable.hideshow.ColumnHideShowLayer;
 import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
 import org.eclipse.nebula.widgets.nattable.layer.ILayer;
 import org.eclipse.nebula.widgets.nattable.reorder.ColumnReorderLayer;
 import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
+import org.eclipse.nebula.widgets.nattable.ui.binding.UiBindingRegistry;
+import org.eclipse.nebula.widgets.nattable.ui.matcher.MouseEventMatcher;
+import org.eclipse.nebula.widgets.nattable.ui.menu.HeaderMenuConfiguration;
+import org.eclipse.nebula.widgets.nattable.ui.menu.PopupMenuAction;
+import org.eclipse.nebula.widgets.nattable.ui.menu.PopupMenuBuilder;
 import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
 
 /**
  * Simple example showing how to add the {@link ColumnGroupHeaderLayer} to the layer
@@ -68,7 +81,10 @@
 	@Override
 	public Control createExampleControl(Composite parent) {
 		//property names of the Person class
-		String[] propertyNames = {"firstName", "lastName", "gender", "married", "birthday"};
+		String[] propertyNames = {"firstName", "lastName", "gender", "married", 
+				"address.street", "address.housenumber", "address.postalCode", "address.city", 
+				"age", "birthday", "money",
+				"description", "favouriteFood", "favouriteDrinks"};
 
 		//mapping from property to label, needed for column header labels
 		Map<String, String> propertyToLabelMap = new HashMap<String, String>();
@@ -76,7 +92,19 @@
 		propertyToLabelMap.put("lastName", "Lastname");
 		propertyToLabelMap.put("gender", "Gender");
 		propertyToLabelMap.put("married", "Married");
+		propertyToLabelMap.put("address.street", "Street");
+		propertyToLabelMap.put("address.housenumber", "Housenumber");
+		propertyToLabelMap.put("address.postalCode", "Postalcode");
+		propertyToLabelMap.put("address.city", "City");
+		propertyToLabelMap.put("age", "Age");
 		propertyToLabelMap.put("birthday", "Birthday");
+		propertyToLabelMap.put("money", "Money");
+		propertyToLabelMap.put("description", "Description");
+		propertyToLabelMap.put("favouriteFood", "Food");
+		propertyToLabelMap.put("favouriteDrinks", "Drinks");
+
+		IColumnPropertyAccessor<ExtendedPersonWithAddress> columnPropertyAccessor = 
+				new ExtendedReflectiveColumnPropertyAccessor<ExtendedPersonWithAddress>(propertyNames);
 
 		ColumnGroupModel columnGroupModel = new ColumnGroupModel();
 		
@@ -84,7 +112,9 @@
 		//Usually you would create a new layer stack by extending AbstractIndexLayerTransform and
 		//setting the ViewportLayer as underlying layer. But in this case using the ViewportLayer
 		//directly as body layer is also working.
-		IDataProvider bodyDataProvider = new DefaultBodyDataProvider<Person>(PersonService.getPersons(10), propertyNames);
+		IDataProvider bodyDataProvider = 
+				new ListDataProvider<ExtendedPersonWithAddress>(
+						PersonService.getExtendedPersonsWithAddress(10), columnPropertyAccessor);
 		DataLayer bodyDataLayer = new DataLayer(bodyDataProvider);
 		ColumnReorderLayer columnReorderLayer = new ColumnReorderLayer(bodyDataLayer);
 		ColumnGroupReorderLayer columnGroupReorderLayer = new ColumnGroupReorderLayer(columnReorderLayer, columnGroupModel);
@@ -96,12 +126,16 @@
 		//build the column header layer
 		IDataProvider columnHeaderDataProvider = new DefaultColumnHeaderDataProvider(propertyNames, propertyToLabelMap);
 		DataLayer columnHeaderDataLayer = new DefaultColumnHeaderDataLayer(columnHeaderDataProvider);
-		ILayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, viewportLayer, selectionLayer);
+		ColumnHeaderLayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, viewportLayer, selectionLayer);
 		ColumnGroupHeaderLayer columnGroupHeaderLayer = new ColumnGroupHeaderLayer(columnHeaderLayer, selectionLayer, columnGroupModel);
 
 		//configure the column groups
-		columnGroupHeaderLayer.addColumnsIndexesToGroup("Name", 0, 1);
-		columnGroupHeaderLayer.addColumnsIndexesToGroup("Details", 2, 3, 4);
+		columnGroupHeaderLayer.addColumnsIndexesToGroup("Person", 0, 1, 2, 3);
+		columnGroupHeaderLayer.addColumnsIndexesToGroup("Address", 4, 5, 6, 7);
+		columnGroupHeaderLayer.addColumnsIndexesToGroup("Facts", 8, 9, 10);
+		columnGroupHeaderLayer.addColumnsIndexesToGroup("Personal", 11, 12, 13);
+		columnGroupHeaderLayer.setStaticColumnIndexesByGroup("Person", 0, 1);
+		columnGroupHeaderLayer.setStaticColumnIndexesByGroup("Address", 4, 5, 6);
 		columnGroupHeaderLayer.setGroupUnbreakable(1);
 		
 		//build the row header layer
@@ -124,6 +158,30 @@
 		//DefaultNatTableStyleConfiguration manually	
 		natTable.addConfiguration(new DefaultNatTableStyleConfiguration());
 		
+		natTable.addConfiguration(new HeaderMenuConfiguration(natTable) {
+			@Override
+			protected PopupMenuBuilder createColumnHeaderMenu(NatTable natTable) {
+				return super.createColumnHeaderMenu(natTable)
+						.withColumnChooserMenuItem();
+			}
+		});
+		
+		// Column group header menu
+		final Menu columnGroupHeaderMenu =
+				new PopupMenuBuilder(natTable)
+					.withMenuItemProvider(ColumnGroupMenuItemProviders.renameColumnGroupMenuItemProvider())
+					.withMenuItemProvider(ColumnGroupMenuItemProviders.removeColumnGroupMenuItemProvider())
+					.build();
+		
+		natTable.addConfiguration(new AbstractUiBindingConfiguration() {
+			@Override
+			public void configureUiBindings(UiBindingRegistry uiBindingRegistry) {
+				uiBindingRegistry.registerFirstMouseDownBinding(
+						new MouseEventMatcher(SWT.NONE, GridRegion.COLUMN_GROUP_HEADER, MouseEventMatcher.RIGHT_BUTTON),
+						new PopupMenuAction(columnGroupHeaderMenu));
+			}
+		});
+		
 		//enable this configuration to verify the automatic height calculation when using vertical text painter
 //		natTable.addConfiguration(new AbstractRegistryConfiguration() {
 //			
@@ -135,6 +193,16 @@
 //			}
 //		});
 		
+		// Register column chooser
+		DisplayColumnChooserCommandHandler columnChooserCommandHandler = new DisplayColumnChooserCommandHandler(
+				selectionLayer,
+				columnHideShowLayer,
+				columnHeaderLayer,
+				columnHeaderDataLayer,
+				columnGroupHeaderLayer,
+				columnGroupModel);
+		viewportLayer.registerCommandHandler(columnChooserCommandHandler);
+
 		natTable.configure();
 		
 		return natTable;
diff --git a/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_500_Layers/_5112_TwoLevelColumnGroupingExample.java b/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_500_Layers/_5112_TwoLevelColumnGroupingExample.java
new file mode 100644
index 0000000..4fc9f00
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_500_Layers/_5112_TwoLevelColumnGroupingExample.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Dirk Fauth and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Dirk Fauth <dirk.fauth@gmail.com> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.examples._500_Layers;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.nebula.widgets.nattable.NatTable;
+import org.eclipse.nebula.widgets.nattable.data.ExtendedReflectiveColumnPropertyAccessor;
+import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor;
+import org.eclipse.nebula.widgets.nattable.data.IDataProvider;
+import org.eclipse.nebula.widgets.nattable.data.ListDataProvider;
+import org.eclipse.nebula.widgets.nattable.examples.AbstractNatExample;
+import org.eclipse.nebula.widgets.nattable.examples.data.person.ExtendedPersonWithAddress;
+import org.eclipse.nebula.widgets.nattable.examples.data.person.PersonService;
+import org.eclipse.nebula.widgets.nattable.examples.runner.StandaloneNatExampleRunner;
+import org.eclipse.nebula.widgets.nattable.grid.data.DefaultColumnHeaderDataProvider;
+import org.eclipse.nebula.widgets.nattable.grid.data.DefaultCornerDataProvider;
+import org.eclipse.nebula.widgets.nattable.grid.data.DefaultRowHeaderDataProvider;
+import org.eclipse.nebula.widgets.nattable.grid.layer.ColumnHeaderLayer;
+import org.eclipse.nebula.widgets.nattable.grid.layer.CornerLayer;
+import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultColumnHeaderDataLayer;
+import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultRowHeaderDataLayer;
+import org.eclipse.nebula.widgets.nattable.grid.layer.GridLayer;
+import org.eclipse.nebula.widgets.nattable.grid.layer.RowHeaderLayer;
+import org.eclipse.nebula.widgets.nattable.group.ColumnGroupExpandCollapseLayer;
+import org.eclipse.nebula.widgets.nattable.group.ColumnGroupGroupHeaderLayer;
+import org.eclipse.nebula.widgets.nattable.group.ColumnGroupHeaderLayer;
+import org.eclipse.nebula.widgets.nattable.group.ColumnGroupModel;
+import org.eclipse.nebula.widgets.nattable.group.ColumnGroupReorderLayer;
+import org.eclipse.nebula.widgets.nattable.hideshow.ColumnHideShowLayer;
+import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
+import org.eclipse.nebula.widgets.nattable.layer.ILayer;
+import org.eclipse.nebula.widgets.nattable.reorder.ColumnReorderLayer;
+import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
+import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * Simple example showing how to add the {@link ColumnGroupHeaderLayer} and the
+ * {@link ColumnGroupGroupHeaderLayer} to the layer composition of a grid and 
+ * how to add the corresponding actions to the column header menu.
+ * 
+ * @author Dirk Fauth
+ *
+ */
+public class _5112_TwoLevelColumnGroupingExample extends AbstractNatExample {
+
+	public static void main(String[] args) throws Exception {
+		StandaloneNatExampleRunner.run(new _5112_TwoLevelColumnGroupingExample());
+	}
+
+	@Override
+	public String getDescription() {
+		return "This example shows the usage of the ColumnGroupHeaderLayer and the ColumnGroupHeaderLayer "
+				+ "within a grid and its corresponding actions in the column header menu. If you perform a "
+				+ "right click on the column header, you are able to hide the current selected "
+				+ "column or show all columns again.";
+	}
+	
+	@Override
+	public Control createExampleControl(Composite parent) {
+		//property names of the Person class
+		String[] propertyNames = {"firstName", "lastName", "gender", "married", 
+				"address.street", "address.housenumber", "address.postalCode", "address.city", 
+				"age", "birthday", "money",
+				"description", "favouriteFood", "favouriteDrinks"};
+
+		//mapping from property to label, needed for column header labels
+		Map<String, String> propertyToLabelMap = new HashMap<String, String>();
+		propertyToLabelMap.put("firstName", "Firstname");
+		propertyToLabelMap.put("lastName", "Lastname");
+		propertyToLabelMap.put("gender", "Gender");
+		propertyToLabelMap.put("married", "Married");
+		propertyToLabelMap.put("address.street", "Street");
+		propertyToLabelMap.put("address.housenumber", "Housenumber");
+		propertyToLabelMap.put("address.postalCode", "Postalcode");
+		propertyToLabelMap.put("address.city", "City");
+		propertyToLabelMap.put("age", "Age");
+		propertyToLabelMap.put("birthday", "Birthday");
+		propertyToLabelMap.put("money", "Money");
+		propertyToLabelMap.put("description", "Description");
+		propertyToLabelMap.put("favouriteFood", "Food");
+		propertyToLabelMap.put("favouriteDrinks", "Drinks");
+
+		IColumnPropertyAccessor<ExtendedPersonWithAddress> columnPropertyAccessor = 
+				new ExtendedReflectiveColumnPropertyAccessor<ExtendedPersonWithAddress>(propertyNames);
+
+		ColumnGroupModel columnGroupModel = new ColumnGroupModel();
+		ColumnGroupModel sndColumnGroupModel = new ColumnGroupModel();
+		
+		//build the body layer stack 
+		//Usually you would create a new layer stack by extending AbstractIndexLayerTransform and
+		//setting the ViewportLayer as underlying layer. But in this case using the ViewportLayer
+		//directly as body layer is also working.
+		IDataProvider bodyDataProvider = 
+				new ListDataProvider<ExtendedPersonWithAddress>(
+						PersonService.getExtendedPersonsWithAddress(10), columnPropertyAccessor);
+		DataLayer bodyDataLayer = new DataLayer(bodyDataProvider);
+		ColumnReorderLayer columnReorderLayer = new ColumnReorderLayer(bodyDataLayer);
+		ColumnGroupReorderLayer columnGroupReorderLayer = new ColumnGroupReorderLayer(columnReorderLayer, columnGroupModel);
+		ColumnHideShowLayer columnHideShowLayer = new ColumnHideShowLayer(columnGroupReorderLayer);
+		ColumnGroupExpandCollapseLayer columnGroupExpandCollapseLayer = 
+				new ColumnGroupExpandCollapseLayer(columnHideShowLayer, sndColumnGroupModel, columnGroupModel);
+		SelectionLayer selectionLayer = new SelectionLayer(columnGroupExpandCollapseLayer);
+		ViewportLayer viewportLayer = new ViewportLayer(selectionLayer);
+
+		//build the column header layer
+		IDataProvider columnHeaderDataProvider = new DefaultColumnHeaderDataProvider(propertyNames, propertyToLabelMap);
+		DataLayer columnHeaderDataLayer = new DefaultColumnHeaderDataLayer(columnHeaderDataProvider);
+		ILayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, viewportLayer, selectionLayer);
+		ColumnGroupHeaderLayer columnGroupHeaderLayer = new ColumnGroupHeaderLayer(columnHeaderLayer, selectionLayer, columnGroupModel);
+
+		//configure the column groups
+		columnGroupHeaderLayer.addColumnsIndexesToGroup("Person", 0, 1, 2, 3);
+		columnGroupHeaderLayer.addColumnsIndexesToGroup("Address", 4, 5, 6, 7);
+		columnGroupHeaderLayer.addColumnsIndexesToGroup("Facts", 8, 9, 10);
+		columnGroupHeaderLayer.addColumnsIndexesToGroup("Personal", 11, 12, 13);
+		columnGroupHeaderLayer.setStaticColumnIndexesByGroup("Person", 0, 1);
+		columnGroupHeaderLayer.setStaticColumnIndexesByGroup("Address", 4, 5, 6);
+		columnGroupHeaderLayer.setGroupUnbreakable(1);
+
+		ColumnGroupGroupHeaderLayer sndGroup = 
+				new ColumnGroupGroupHeaderLayer(columnGroupHeaderLayer, selectionLayer, sndColumnGroupModel);
+		
+		sndGroup.addColumnsIndexesToGroup("PersonWithAddress", 0, 1, 2, 3, 4, 5, 6, 7);
+		sndGroup.addColumnsIndexesToGroup("Additional Information", 8, 9, 10, 11, 12, 13);
+
+		sndGroup.setStaticColumnIndexesByGroup("PersonWithAddress", 0, 1);
+		
+		//build the row header layer
+		IDataProvider rowHeaderDataProvider = new DefaultRowHeaderDataProvider(bodyDataProvider);
+		DataLayer rowHeaderDataLayer = new DefaultRowHeaderDataLayer(rowHeaderDataProvider);
+		ILayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer, viewportLayer, selectionLayer);
+		
+		//build the corner layer
+		IDataProvider cornerDataProvider = new DefaultCornerDataProvider(columnHeaderDataProvider, rowHeaderDataProvider);
+		DataLayer cornerDataLayer = new DataLayer(cornerDataProvider);
+		ILayer cornerLayer = new CornerLayer(cornerDataLayer, rowHeaderLayer, sndGroup);
+		
+		//build the grid layer
+		GridLayer gridLayer = new GridLayer(viewportLayer, sndGroup, rowHeaderLayer, cornerLayer);
+		
+		//turn the auto configuration off as we want to add our header menu configuration
+		NatTable natTable = new NatTable(parent, gridLayer);
+		
+		return natTable;
+	}
+
+}
diff --git a/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_800_Integration/_807_SortableFilterableColumnGroupExample.java b/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_800_Integration/_807_SortableFilterableColumnGroupExample.java
index 3019891..775dfb9 100644
--- a/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_800_Integration/_807_SortableFilterableColumnGroupExample.java
+++ b/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_800_Integration/_807_SortableFilterableColumnGroupExample.java
@@ -17,7 +17,9 @@
 import java.util.Map;
 
 import org.eclipse.nebula.widgets.nattable.NatTable;
+import org.eclipse.nebula.widgets.nattable.columnChooser.command.DisplayColumnChooserCommandHandler;
 import org.eclipse.nebula.widgets.nattable.config.AbstractRegistryConfiguration;
+import org.eclipse.nebula.widgets.nattable.config.AbstractUiBindingConfiguration;
 import org.eclipse.nebula.widgets.nattable.config.ConfigRegistry;
 import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration;
 import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
@@ -42,6 +44,9 @@
 import org.eclipse.nebula.widgets.nattable.filterrow.FilterRowTextCellEditor;
 import org.eclipse.nebula.widgets.nattable.filterrow.TextMatchingMode;
 import org.eclipse.nebula.widgets.nattable.filterrow.config.FilterRowConfigAttributes;
+import org.eclipse.nebula.widgets.nattable.freeze.CompositeFreezeLayer;
+import org.eclipse.nebula.widgets.nattable.freeze.FreezeLayer;
+import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
 import org.eclipse.nebula.widgets.nattable.grid.data.DefaultColumnHeaderDataProvider;
 import org.eclipse.nebula.widgets.nattable.grid.data.DefaultCornerDataProvider;
 import org.eclipse.nebula.widgets.nattable.grid.data.DefaultRowHeaderDataProvider;
@@ -54,6 +59,7 @@
 import org.eclipse.nebula.widgets.nattable.group.ColumnGroupHeaderLayer;
 import org.eclipse.nebula.widgets.nattable.group.ColumnGroupModel;
 import org.eclipse.nebula.widgets.nattable.group.ColumnGroupReorderLayer;
+import org.eclipse.nebula.widgets.nattable.group.config.ColumnGroupMenuItemProviders;
 import org.eclipse.nebula.widgets.nattable.hideshow.ColumnHideShowLayer;
 import org.eclipse.nebula.widgets.nattable.layer.AbstractLayerTransform;
 import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
@@ -62,9 +68,16 @@
 import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
 import org.eclipse.nebula.widgets.nattable.sort.SortHeaderLayer;
 import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
+import org.eclipse.nebula.widgets.nattable.ui.binding.UiBindingRegistry;
+import org.eclipse.nebula.widgets.nattable.ui.matcher.MouseEventMatcher;
+import org.eclipse.nebula.widgets.nattable.ui.menu.HeaderMenuConfiguration;
+import org.eclipse.nebula.widgets.nattable.ui.menu.PopupMenuAction;
+import org.eclipse.nebula.widgets.nattable.ui.menu.PopupMenuBuilder;
 import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
 
 import ca.odell.glazedlists.EventList;
 import ca.odell.glazedlists.FilterList;
@@ -119,7 +132,7 @@
 
 		IDataProvider columnHeaderDataProvider = new DefaultColumnHeaderDataProvider(propertyNames, propertyToLabelMap);
 		DataLayer columnHeaderDataLayer = new DataLayer(columnHeaderDataProvider);
-		ILayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, bodyLayer, bodyLayer.getSelectionLayer());
+		ColumnHeaderLayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, bodyLayer, bodyLayer.getSelectionLayer());
 		
 		SortHeaderLayer<ExtendedPersonWithAddress> sortHeaderLayer = 
 				new SortHeaderLayer<ExtendedPersonWithAddress>(columnHeaderLayer, 
@@ -170,6 +183,40 @@
 		//add filter row configuration
 		natTable.addConfiguration(new FilterRowConfiguration());
 		
+		natTable.addConfiguration(new HeaderMenuConfiguration(natTable) {
+			@Override
+			protected PopupMenuBuilder createColumnHeaderMenu(NatTable natTable) {
+				return super.createColumnHeaderMenu(natTable)
+						.withColumnChooserMenuItem();
+			}
+		});
+		
+		// Column group header menu
+		final Menu columnGroupHeaderMenu =
+				new PopupMenuBuilder(natTable)
+					.withMenuItemProvider(ColumnGroupMenuItemProviders.renameColumnGroupMenuItemProvider())
+					.withMenuItemProvider(ColumnGroupMenuItemProviders.removeColumnGroupMenuItemProvider())
+					.build();
+		
+		natTable.addConfiguration(new AbstractUiBindingConfiguration() {
+			@Override
+			public void configureUiBindings(UiBindingRegistry uiBindingRegistry) {
+				uiBindingRegistry.registerFirstMouseDownBinding(
+						new MouseEventMatcher(SWT.NONE, GridRegion.COLUMN_GROUP_HEADER, MouseEventMatcher.RIGHT_BUTTON),
+						new PopupMenuAction(columnGroupHeaderMenu));
+			}
+		});
+		
+		// Register column chooser
+		DisplayColumnChooserCommandHandler columnChooserCommandHandler = new DisplayColumnChooserCommandHandler(
+				bodyLayer.getSelectionLayer(),
+				bodyLayer.getColumnHideShowLayer(),
+				columnHeaderLayer,
+				columnHeaderDataLayer,
+				columnGroupHeaderLayer,
+				columnGroupModel);
+		bodyLayer.registerCommandHandler(columnChooserCommandHandler);
+		
 		natTable.configure();
 
 		return natTable;
@@ -217,7 +264,11 @@
 			columnGroupExpandCollapseLayer = new ColumnGroupExpandCollapseLayer(columnHideShowLayer, columnGroupModel);
 			selectionLayer = new SelectionLayer(columnGroupExpandCollapseLayer);
 			viewportLayer = new ViewportLayer(selectionLayer);
-			setUnderlyingLayer(viewportLayer);
+			
+			final FreezeLayer freezeLayer = new FreezeLayer(selectionLayer);
+		    final CompositeFreezeLayer compositeFreezeLayer = new CompositeFreezeLayer(freezeLayer, viewportLayer, selectionLayer);
+
+			setUnderlyingLayer(compositeFreezeLayer);
 		}
 
 		public SortedList<T> getSortedList() {
