diff --git a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumn.java b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumn.java
index 41946bb..846d08f 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumn.java
+++ b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumn.java
@@ -68,6 +68,8 @@
   private Image footerImage;
   private Font footerFont;
   private boolean packed;
+  private boolean wordWrap;
+  private boolean headerWordWrap;
   int imageCount;
   int textCount;
 
@@ -774,6 +776,44 @@
   }
 
   /**
+   * Returns the true if the cells in receiver wrap their text.
+   *
+   * @return true if the cells wrap their text.
+   * @throws org.eclipse.swt.SWTException
+   *             <ul>
+   *             <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed
+   *             </li>
+   *             <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+   *             thread that created the receiver</li>
+   *             </ul>
+   */
+  public boolean getWordWrap() {
+    checkWidget();
+    return wordWrap;
+  }
+
+  /**
+   * If the argument is true, wraps the text in the receiver's cells. This
+   * feature will not cause the row height to expand to accommodate the
+   * wrapped text. Please use <code>Grid#setItemHeight</code> to change the
+   * height of each row.
+   *
+   * @param wordWrap
+   *            true to make cells wrap their text.
+   * @throws org.eclipse.swt.SWTException
+   *             <ul>
+   *             <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed
+   *             </li>
+   *             <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+   *             thread that created the receiver</li>
+   *             </ul>
+   */
+  public void setWordWrap( boolean wordWrap ) {
+    checkWidget();
+    this.wordWrap = wordWrap;
+  }
+
+  /**
    * Sets the Font to be used when displaying the Header text.
    *
    * @param font
@@ -860,6 +900,32 @@
   }
 
   /**
+   * Sets whether or not text is word-wrapped in the header for this column.
+   * If Grid.setAutoHeight(true) is set, the row height is adjusted to
+   * accommodate word-wrapped text.
+   *
+   * @param wordWrap
+   *            Set to true to wrap the text, false otherwise
+   * @see #getHeaderWordWrap()
+   */
+  public void setHeaderWordWrap( boolean wordWrap ) {
+    checkWidget();
+    this.headerWordWrap = wordWrap;
+  }
+
+  /**
+   * Returns whether or not text is word-wrapped in the header for this
+   * column.
+   *
+   * @return true if the header wraps its text.
+   * @see GridColumn#setHeaderWordWrap(boolean)
+   */
+  public boolean getHeaderWordWrap() {
+    checkWidget();
+    return headerWordWrap;
+  }
+
+  /**
    * Sets the receiver's footer text.
    *
    * @param text
diff --git a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridcolumnkit/GridColumnLCA.java b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridcolumnkit/GridColumnLCA.java
index 6cc7930..79fb605 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridcolumnkit/GridColumnLCA.java
+++ b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/internal/gridcolumnkit/GridColumnLCA.java
@@ -51,6 +51,8 @@
   private static final String PROP_FOOTER_FONT = "footerFont";
   private static final String PROP_FOOTER_TEXT = "footerText";
   private static final String PROP_FOOTER_IMAGE = "footerImage";
+  private static final String PROP_WORD_WRAP = "wordWrap";
+  private static final String PROP_HEADER_WORD_WRAP = "headerWordWrap";
   private static final String PROP_SELECTION_LISTENER = "Selection";
 
   private static final int ZERO = 0;
@@ -86,6 +88,8 @@
     preserveProperty( column, PROP_FOOTER_FONT, column.getFooterFont() );
     preserveProperty( column, PROP_FOOTER_TEXT, column.getFooterText() );
     preserveProperty( column, PROP_FOOTER_IMAGE, column.getFooterImage() );
+    preserveProperty( column, PROP_WORD_WRAP, column.getWordWrap() );
+    preserveProperty( column, PROP_HEADER_WORD_WRAP, column.getHeaderWordWrap() );
     preserveListener( column, PROP_SELECTION_LISTENER, isListening( column, SWT.Selection ) );
   }
 
@@ -107,6 +111,8 @@
     renderFont( column, PROP_FOOTER_FONT, column.getFooterFont() );
     renderProperty( column, PROP_FOOTER_TEXT, column.getFooterText(), "" );
     renderProperty( column, PROP_FOOTER_IMAGE, column.getFooterImage(), null );
+    renderProperty( column, PROP_WORD_WRAP, column.getWordWrap(), false );
+    renderProperty( column, PROP_HEADER_WORD_WRAP, column.getHeaderWordWrap(), false );
     renderListener( column, PROP_SELECTION_LISTENER, isListening( column, SWT.Selection ), false );
   }
 
diff --git a/examples/org.eclipse.rap.nebula.widgets.grid.demo.standalone/.settings/GridSnippets.launch b/examples/org.eclipse.rap.nebula.widgets.grid.demo.standalone/.settings/GridSnippets.launch
index 3a12f24..4c46557 100644
--- a/examples/org.eclipse.rap.nebula.widgets.grid.demo.standalone/.settings/GridSnippets.launch
+++ b/examples/org.eclipse.rap.nebula.widgets.grid.demo.standalone/.settings/GridSnippets.launch
@@ -21,7 +21,7 @@
 <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -console -consolelog"/>
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
 <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.ignoreApp=true&#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Dorg.eclipse.equinox.http.jetty.log.stderr.threshold=info"/>
-<stringAttribute key="org.eclipse.rap.launch.browserMode" value="INTERNAL"/>
+<stringAttribute key="org.eclipse.rap.launch.browserMode" value="EXTERNAL"/>
 <stringAttribute key="org.eclipse.rap.launch.contextpath" value=""/>
 <stringAttribute key="org.eclipse.rap.launch.dataLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.rap.tools.launch/GridSnippets"/>
 <booleanAttribute key="org.eclipse.rap.launch.developmentMode" value="true"/>
diff --git a/examples/org.eclipse.rap.nebula.widgets.grid.demo.standalone/src/org/eclipse/rap/nebula/widgets/grid/snippets/GridSnippet.java b/examples/org.eclipse.rap.nebula.widgets.grid.demo.standalone/src/org/eclipse/rap/nebula/widgets/grid/snippets/GridSnippet.java
index bac26f0..ae75290 100644
--- a/examples/org.eclipse.rap.nebula.widgets.grid.demo.standalone/src/org/eclipse/rap/nebula/widgets/grid/snippets/GridSnippet.java
+++ b/examples/org.eclipse.rap.nebula.widgets.grid.demo.standalone/src/org/eclipse/rap/nebula/widgets/grid/snippets/GridSnippet.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2013 EclipseSource and others.
+ * Copyright (c) 2012, 2014 EclipseSource 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
@@ -58,6 +58,8 @@
     createShowColumnGroup( parent );
     createShowHeaderButton( parent );
     createShowFooterButton( parent );
+    createWordWrapButton( parent );
+    createHeaderWordWrapButton( parent );
     createQueryFocusItem( parent );
   }
 
@@ -352,6 +354,34 @@
     } );
   }
 
+  private void createWordWrapButton( Composite parent ) {
+    final Button button = new Button( parent, SWT.CHECK );
+    button.setText( "Word wrap cells text" );
+    button.setSelection( false );
+    button.addSelectionListener( new SelectionAdapter() {
+      @Override
+      public void widgetSelected( SelectionEvent event ) {
+        for( GridColumn column : grid.getColumns() ) {
+          column.setWordWrap( button.getSelection() );
+        }
+      }
+    } );
+  }
+
+  private void createHeaderWordWrapButton( Composite parent ) {
+    final Button button = new Button( parent, SWT.CHECK );
+    button.setText( "Word wrap headers text" );
+    button.setSelection( false );
+    button.addSelectionListener( new SelectionAdapter() {
+      @Override
+      public void widgetSelected( SelectionEvent event ) {
+        for( GridColumn column : grid.getColumns() ) {
+          column.setHeaderWordWrap( button.getSelection() );
+        }
+      }
+    } );
+  }
+
   private void createQueryFocusItem( Composite parent ) {
     Button button = new Button( parent, SWT.PUSH );
     button.setText( "Query focusItem" );
diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumn_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumn_Test.java
index 345df30..de1587c 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumn_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumn_Test.java
@@ -13,12 +13,16 @@
 import static org.eclipse.nebula.widgets.grid.GridTestUtil.createGridColumns;
 import static org.eclipse.nebula.widgets.grid.GridTestUtil.createGridItems;
 import static org.eclipse.nebula.widgets.grid.GridTestUtil.loadImage;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import junit.framework.TestCase;
-
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.internal.lifecycle.PhaseId;
 import org.eclipse.rap.rwt.internal.service.ContextProvider;
@@ -38,21 +42,23 @@
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 
 @SuppressWarnings({
   "restriction", "deprecation"
 })
-public class GridColumn_Test extends TestCase {
+public class GridColumn_Test {
 
   private Display display;
   private Shell shell;
   private Grid grid;
   private List<Event> eventLog;
 
-  @Override
-  protected void setUp() throws Exception {
+  @Before
+  public void setUp() {
     Fixture.setUp();
     Fixture.fakePhase( PhaseId.PROCESS_ACTION );
     display = new Display();
@@ -61,12 +67,13 @@
     eventLog = new ArrayList<Event>();
   }
 
-  @Override
-  protected void tearDown() throws Exception {
+  @After
+  public void tearDown() {
     Fixture.tearDown();
   }
 
-  public void testGridColumnCreation_GridParent() {
+  @Test
+  public void testGridColumnCreation_withGridParent() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertSame( grid, column.getParent() );
@@ -75,7 +82,8 @@
     assertEquals( 1, grid.getColumnCount() );
   }
 
-  public void testGridColumnCreation_GroupParent() {
+  @Test
+  public void testGridColumnCreation_withGroupParent() {
     GridColumnGroup group = new GridColumnGroup( grid, SWT.NONE );
     GridColumn column = new GridColumn( group, SWT.NONE );
 
@@ -85,6 +93,7 @@
     assertEquals( 1, grid.getColumnCount() );
   }
 
+  @Test
   public void testGridColumnCreation_AtIndexWithGridParent() {
     createGridColumns( grid, 5, SWT.NONE );
 
@@ -95,6 +104,7 @@
     assertEquals( 6, grid.getColumnCount() );
   }
 
+  @Test
   public void testGridColumnCreation_AtIndexWithGroupParent() {
     createGridColumns( grid, 2, SWT.NONE );
     GridColumnGroup group = new GridColumnGroup( grid, SWT.NONE );
@@ -107,6 +117,7 @@
     assertSame( column, group.getColumns()[ 1 ] );
   }
 
+  @Test
   public void testDispose() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -116,6 +127,7 @@
     assertEquals( 0, grid.getColumnCount() );
   }
 
+  @Test
   public void testDispose_WithGroup() {
     GridColumnGroup group = new GridColumnGroup( grid, SWT.NONE );
     GridColumn column1 = new GridColumn( group, SWT.NONE );
@@ -127,6 +139,7 @@
     assertSame( column2, group.getColumns()[ 0 ] );
   }
 
+  @Test
   public void testSendDisposeEvent() {
     final List<DisposeEvent> log = new ArrayList<DisposeEvent>();
     GridColumn column = new GridColumn( grid, SWT.NONE );
@@ -142,6 +155,7 @@
     assertSame( column, log.get( 0 ).widget );
   }
 
+  @Test
   public void testSendDisposeEventOnGridDispose() {
     final List<DisposeEvent> log = new ArrayList<DisposeEvent>();
     GridColumn column = new GridColumn( grid, SWT.NONE );
@@ -157,6 +171,7 @@
     assertSame( column, log.get( 0 ).widget );
   }
 
+  @Test
   public void testIsCheck() {
     GridColumn column1 = new GridColumn( grid, SWT.NONE );
     GridColumn column2 = new GridColumn( grid, SWT.CHECK );
@@ -167,6 +182,7 @@
     assertFalse( column3.isCheck() );
   }
 
+  @Test
   public void testIsCheck_TableCheck() {
     grid = new Grid( shell, SWT.CHECK );
     GridColumn column1 = new GridColumn( grid, SWT.NONE );
@@ -181,6 +197,7 @@
     assertFalse( column3.isCheck() );
   }
 
+  @Test
   public void testIsCheck_OnColumnAddRemove() {
     grid = new Grid( shell, SWT.CHECK );
     GridColumn[] columns = createGridColumns( grid, 3, SWT.NONE );
@@ -193,12 +210,14 @@
     assertTrue( columns[ 0 ].isCheck() );
   }
 
+  @Test
   public void testGetWidth_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertEquals( 10, column.getWidth() );
   }
 
+  @Test
   public void testGetWidth() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -207,6 +226,7 @@
     assertEquals( 100, column.getWidth() );
   }
 
+  @Test
   public void testSetWidth_BelowMinimumWidth() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -216,12 +236,14 @@
     assertEquals( 20, column.getWidth() );
   }
 
+  @Test
   public void testGetMinimumWidth_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertEquals( 0, column.getMinimumWidth() );
   }
 
+  @Test
   public void testGetMinimumWidth() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -230,6 +252,7 @@
     assertEquals( 10, column.getMinimumWidth() );
   }
 
+  @Test
   public void testSetMinimumWidth_AdjustWidth() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     column.setWidth( 10 );
@@ -239,12 +262,14 @@
     assertEquals( 20, column.getWidth() );
   }
 
+  @Test
   public void testGetSort_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertEquals( SWT.NONE, column.getSort() );
   }
 
+  @Test
   public void testGetSort() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -253,6 +278,7 @@
     assertEquals( SWT.DOWN, column.getSort() );
   }
 
+  @Test
   public void testSetSort_OnlyOneSortColumn() {
     GridColumn[] columns = createGridColumns( grid, 3, SWT.NONE );
     columns[ 0 ].setSort( SWT.UP );
@@ -262,6 +288,7 @@
     assertEquals( SWT.NONE, columns[ 0 ].getSort() );
   }
 
+  @Test
   public void testGetVisible_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -269,6 +296,7 @@
     assertTrue( column.isVisible() );
   }
 
+  @Test
   public void testGetVisible() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -277,6 +305,7 @@
     assertFalse( column.getVisible() );
   }
 
+  @Test
   public void testSetVisible_FireHideEvent() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     column.addListener( SWT.Hide, new LoggingListener() );
@@ -289,6 +318,7 @@
     assertSame( column, event.widget );
   }
 
+  @Test
   public void testSetVisible_FireShowEvent() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     column.setVisible( false );
@@ -302,6 +332,7 @@
     assertSame( column, event.widget );
   }
 
+  @Test
   public void testSetVisible_FireMoveEventOnNextColumns() {
     GridColumn[] columns = createGridColumns( grid, 3, SWT.NONE );
     columns[ 0 ].addListener( SWT.Move, new LoggingListener() );
@@ -315,6 +346,7 @@
     assertSame( columns[ 2 ], event.widget );
   }
 
+  @Test
   public void testSetVisible_FireEventOnlyOnce() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     column.addListener( SWT.Hide, new LoggingListener() );
@@ -325,6 +357,7 @@
     assertEquals( 1, eventLog.size() );
   }
 
+  @Test
   public void testIsTree_WithoutSubItems() {
     GridColumn[] columns = createGridColumns( grid, 3, SWT.NONE );
     createGridItems( grid, 3, 0 );
@@ -334,6 +367,7 @@
     assertFalse( columns[ 2 ].isTree() );
   }
 
+  @Test
   public void testIsTree_WithSubItems() {
     GridColumn[] columns = createGridColumns( grid, 3, SWT.NONE );
     createGridItems( grid, 3, 1 );
@@ -343,6 +377,7 @@
     assertFalse( columns[ 2 ].isTree() );
   }
 
+  @Test
   public void testIsTree_AddColumn() {
     GridColumn[] columns = createGridColumns( grid, 3, SWT.NONE );
     createGridItems( grid, 3, 1 );
@@ -355,6 +390,7 @@
     assertFalse( columns[ 2 ].isTree() );
   }
 
+  @Test
   public void testIsTree_RemoveColumn() {
     GridColumn[] columns = createGridColumns( grid, 3, SWT.NONE );
     createGridItems( grid, 3, 1 );
@@ -365,18 +401,21 @@
     assertFalse( columns[ 2 ].isTree() );
   }
 
+  @Test
   public void testGetAlignment_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertEquals( SWT.LEFT, column.getAlignment() );
   }
 
+  @Test
   public void testGetAlignment_WithStyleFlag() {
     GridColumn column = new GridColumn( grid, SWT.RIGHT );
 
     assertEquals( SWT.RIGHT, column.getAlignment() );
   }
 
+  @Test
   public void testSetAlignment() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -385,6 +424,7 @@
     assertEquals( SWT.CENTER, column.getAlignment() );
   }
 
+  @Test
   public void testSetAlignment_InvalidValue() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -393,12 +433,14 @@
     assertEquals( SWT.LEFT, column.getAlignment() );
   }
 
+  @Test
   public void testGetMoveable_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertFalse( column.getMoveable() );
   }
 
+  @Test
   public void testGetMoveable() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -407,12 +449,14 @@
     assertTrue( column.getMoveable() );
   }
 
+  @Test
   public void testGetResizeable_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertTrue( column.getResizeable() );
   }
 
+  @Test
   public void testGetResizeable() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -421,12 +465,14 @@
     assertFalse( column.getResizeable() );
   }
 
+  @Test
   public void testGetCheckable_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertTrue( column.getCheckable() );
   }
 
+  @Test
   public void testGetCheckable() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -435,12 +481,14 @@
     assertFalse( column.getCheckable() );
   }
 
+  @Test
   public void testIsDetail_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertTrue( column.isDetail() );
   }
 
+  @Test
   public void testIsDetail() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -449,12 +497,14 @@
     assertFalse( column.isDetail() );
   }
 
+  @Test
   public void testIsSummary_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertTrue( column.isSummary() );
   }
 
+  @Test
   public void testIsSummary() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -463,6 +513,7 @@
     assertFalse( column.isSummary() );
   }
 
+  @Test
   public void testAddRemoveSelectionListener() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     SelectionListener listener = new SelectionAdapter() { };
@@ -475,26 +526,21 @@
     assertFalse( column.isListening( SWT.Selection ) );
   }
 
+  @Test( expected = IllegalArgumentException.class )
   public void testAddSelectionListener_NullArgument() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
-    try {
-      column.addSelectionListener( null );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
+    column.addSelectionListener( null );
   }
 
+  @Test( expected = IllegalArgumentException.class )
   public void testRemoveSelectionListener_NullArgument() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
-    try {
-      column.removeSelectionListener( null );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
+    column.removeSelectionListener( null );
   }
 
+  @Test
   public void testAddRemoveControlListener() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     ControlListener listener = new ControlAdapter() { };
@@ -510,32 +556,28 @@
     assertFalse( column.isListening( SWT.Resize ) );
   }
 
+  @Test( expected = IllegalArgumentException.class )
   public void testAddControlListener_NullArgument() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
-    try {
-      column.addControlListener( null );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
+    column.addControlListener( null );
   }
 
+  @Test( expected = IllegalArgumentException.class )
   public void testRemoveControlListener_NullArgument() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
-    try {
-      column.removeControlListener( null );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
+    column.removeControlListener( null );
   }
 
+  @Test
   public void testGetHeaderText_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertEquals( "", column.getText() );
   }
 
+  @Test
   public void testGetHeaderText() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -544,22 +586,21 @@
     assertEquals( "foo", column.getText() );
   }
 
+  @Test( expected = IllegalArgumentException.class )
   public void testSetHeaderText_NullArgument() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
-    try {
-      column.setText( null );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
+    column.setText( null );
   }
 
+  @Test
   public void testGetHeaderImage_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertNull( column.getImage() );
   }
 
+  @Test
   public void testGetHeaderImage() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     Image image = loadImage( display, Fixture.IMAGE1 );
@@ -569,24 +610,23 @@
     assertSame( image, column.getImage() );
   }
 
+  @Test( expected = IllegalArgumentException.class )
   public void testSetHeaderImage_DisposedImage() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     Image image = loadImage( display, Fixture.IMAGE1 );
     image.dispose();
 
-    try {
-      column.setImage( image );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
+    column.setImage( image );
   }
 
+  @Test
   public void testGetHeaderFont_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertSame( grid.getFont(), column.getHeaderFont() );
   }
 
+  @Test
   public void testGetHeaderFont() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     Font font = new Font( display, "Arial", 20, SWT.BOLD );
@@ -596,24 +636,23 @@
     assertSame( font, column.getHeaderFont() );
   }
 
+  @Test( expected = IllegalArgumentException.class )
   public void testSetHeaderFont_DisposedFont() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     Font font = new Font( display, "Arial", 20, SWT.BOLD );
     font.dispose();
 
-    try {
-      column.setHeaderFont( font );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
+    column.setHeaderFont( font );
   }
 
+  @Test
   public void testGetFooterText_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertEquals( "", column.getFooterText() );
   }
 
+  @Test
   public void testGetFooterText() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -622,22 +661,21 @@
     assertEquals( "foo", column.getFooterText() );
   }
 
+  @Test( expected = IllegalArgumentException.class )
   public void testSetFooterText_NullArgument() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
-    try {
-      column.setFooterText( null );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
+    column.setFooterText( null );
   }
 
+  @Test
   public void testGetFooterImage_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertNull( column.getFooterImage() );
   }
 
+  @Test
   public void testGetFooterImage() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     Image image = loadImage( display, Fixture.IMAGE1 );
@@ -647,24 +685,23 @@
     assertSame( image, column.getFooterImage() );
   }
 
+  @Test( expected = IllegalArgumentException.class )
   public void testSetFooterImage_DisposedImage() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     Image image = loadImage( display, Fixture.IMAGE1 );
     image.dispose();
 
-    try {
-      column.setFooterImage( image );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
+    column.setFooterImage( image );
   }
 
+  @Test
   public void testGetFooterFont_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertSame( grid.getFont(), column.getFooterFont() );
   }
 
+  @Test
   public void testGetFooterFont() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     Font font = new Font( display, "Arial", 20, SWT.BOLD );
@@ -674,18 +711,16 @@
     assertSame( font, column.getFooterFont() );
   }
 
+  @Test( expected = IllegalArgumentException.class )
   public void testSetFooterFont_DisposedFont() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     Font font = new Font( display, "Arial", 20, SWT.BOLD );
     font.dispose();
 
-    try {
-      column.setFooterFont( font );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
+    column.setFooterFont( font );
   }
 
+  @Test
   public void testPack_TreeColumnEmpty() {
     GridColumn[] columns = createGridColumns( grid, 2, SWT.NONE );
     GridItem item = new GridItem( grid, SWT.NONE );
@@ -698,6 +733,7 @@
     assertEquals( 38, columns[ 0 ].getWidth() );
   }
 
+  @Test
   public void testPack_NonTreeColumnEmpty() {
     GridColumn[] columns = createGridColumns( grid, 2, SWT.NONE );
     GridItem item = new GridItem( grid, SWT.NONE );
@@ -710,6 +746,7 @@
     assertEquals( 16, columns[ 1 ].getWidth() );
   }
 
+  @Test
   public void testPack_TreeColumn() {
     grid = new Grid( shell, SWT.CHECK );
     GridColumn[] columns = createGridColumns( grid, 2, SWT.NONE );
@@ -727,6 +764,7 @@
     assertEquals( 139, columns[ 0 ].getWidth() );
   }
 
+  @Test
   public void testPack_NonTreeColumn() {
     grid = new Grid( shell, SWT.CHECK );
     GridColumn[] columns = createGridColumns( grid, 2, SWT.NONE );
@@ -744,6 +782,7 @@
     assertEquals( 90, columns[ 1 ].getWidth() );
   }
 
+  @Test
   public void testPack_WithHeaderVisible() {
     grid.setHeaderVisible( true );
     GridColumn[] columns = createGridColumns( grid, 2, SWT.CHECK );
@@ -763,6 +802,7 @@
     assertEquals( 353, columns[ 0 ].getWidth() );
   }
 
+  @Test
   public void testPack_WithFooterVisible() {
     grid.setFooterVisible( true );
     GridColumn[] columns = createGridColumns( grid, 2, SWT.CHECK );
@@ -782,6 +822,7 @@
     assertEquals( 353, columns[ 0 ].getWidth() );
   }
 
+  @Test
   public void testRepackAfterTextSizeDetermination() {
     grid.setHeaderVisible( true );
     GridColumn column = new GridColumn( grid, SWT.NONE );
@@ -801,12 +842,14 @@
     assertTrue( repackedWidth > packedWidth );
   }
 
+  @Test
   public void testGetHeaderTooltip_Initial() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
     assertNull( column.getHeaderTooltip() );
   }
 
+  @Test
   public void testGetHeaderTooltip() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
 
@@ -815,6 +858,39 @@
     assertEquals( "foo", column.getHeaderTooltip() );
   }
 
+  @Test
+  public void testGetHeaderWordWrap_Initial() {
+    GridColumn column = new GridColumn( grid, SWT.NONE );
+
+    assertFalse( column.getHeaderWordWrap() );
+  }
+
+  @Test
+  public void testGetHeaderWordWrap() {
+    GridColumn column = new GridColumn( grid, SWT.NONE );
+
+    column.setHeaderWordWrap( true );
+
+    assertTrue( column.getHeaderWordWrap() );
+  }
+
+  @Test
+  public void testGetWordWrap_Initial() {
+    GridColumn column = new GridColumn( grid, SWT.NONE );
+
+    assertFalse( column.getWordWrap() );
+  }
+
+  @Test
+  public void testGetWordWrap() {
+    GridColumn column = new GridColumn( grid, SWT.NONE );
+
+    column.setWordWrap( true );
+
+    assertTrue( column.getWordWrap() );
+  }
+
+  @Test
   public void testIsVisible_Initial() {
     GridColumnGroup group = new GridColumnGroup( grid, SWT.NONE );
     GridColumn column = new GridColumn( group, SWT.NONE );
@@ -822,6 +898,7 @@
     assertTrue( column.isVisible() );
   }
 
+  @Test
   public void testIsVisible_ExpandedGroup() {
     GridColumnGroup group = new GridColumnGroup( grid, SWT.NONE );
     group.setExpanded( true );
@@ -831,6 +908,7 @@
     assertFalse( column.isVisible() );
   }
 
+  @Test
   public void testIsVisible_CollapsedGroup() {
     GridColumnGroup group = new GridColumnGroup( grid, SWT.NONE );
     group.setExpanded( false );
@@ -852,16 +930,12 @@
     }
   }
 
-  @Test
+  @Test( expected = IllegalArgumentException.class )
   public void testMarkupToolTipTextWithMarkupEnabled() {
     GridColumn column = new GridColumn( grid, SWT.NONE );
     column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
 
-    try {
-      column.setHeaderTooltip( "invalid xhtml: <<&>>" );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
+    column.setHeaderTooltip( "invalid xhtml: <<&>>" );
   }
 
   @Test
diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumnkit/GridColumnLCA_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumnkit/GridColumnLCA_Test.java
index c4badf1..5954f67 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumnkit/GridColumnLCA_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumnkit/GridColumnLCA_Test.java
@@ -20,6 +20,7 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
 import java.util.LinkedList;
@@ -41,8 +42,6 @@
 import org.eclipse.rap.rwt.testfixture.Fixture;
 import org.eclipse.rap.rwt.testfixture.TestMessage;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.internal.graphics.ImageFactory;
@@ -563,7 +562,7 @@
     Fixture.markInitialized( column );
     Fixture.preserveWidgets();
 
-    column.addSelectionListener( new SelectionAdapter() { } );
+    column.addListener( SWT.Selection, mock( Listener.class ) );
     lca.renderChanges( column );
 
     TestMessage message = Fixture.getProtocolMessage();
@@ -572,13 +571,13 @@
 
   @Test
   public void testRenderRemoveSelectionListener() throws Exception {
-    SelectionListener listener = new SelectionAdapter() { };
-    column.addSelectionListener( listener );
+    Listener listener = mock( Listener.class );
+    column.addListener( SWT.Selection, listener );
     Fixture.markInitialized( display );
     Fixture.markInitialized( column );
     Fixture.preserveWidgets();
 
-    column.removeSelectionListener( listener );
+    column.removeListener( SWT.Selection, listener );
     lca.renderChanges( column );
 
     TestMessage message = Fixture.getProtocolMessage();
@@ -591,7 +590,7 @@
     Fixture.markInitialized( column );
     Fixture.preserveWidgets();
 
-    column.addSelectionListener( new SelectionAdapter() { } );
+    column.addListener( SWT.Selection, mock( Listener.class ) );
     Fixture.preserveWidgets();
     lca.renderChanges( column );
 
@@ -801,6 +800,68 @@
     assertEquals( JsonObject.NULL, message.findSetProperty( column, "footerImage" ) );
   }
 
+  @Test
+  public void testRenderInitialWordWrap() throws IOException {
+    lca.render( column );
+
+    TestMessage message = Fixture.getProtocolMessage();
+    CreateOperation operation = message.findCreateOperation( column );
+    assertTrue( operation.getProperties().names().indexOf( "wordWrap" ) == -1 );
+  }
+
+  @Test
+  public void testRenderWordWrap() throws IOException {
+    column.setWordWrap( true );
+    lca.renderChanges( column );
+
+    TestMessage message = Fixture.getProtocolMessage();
+    assertEquals( JsonValue.TRUE, message.findSetProperty( column, "wordWrap" ) );
+  }
+
+  @Test
+  public void testRenderWordWrapUnchanged() throws IOException {
+    Fixture.markInitialized( display );
+    Fixture.markInitialized( column );
+
+    column.setWordWrap( true );
+    Fixture.preserveWidgets();
+    lca.renderChanges( column );
+
+    TestMessage message = Fixture.getProtocolMessage();
+    assertNull( message.findSetOperation( column, "wordWrap" ) );
+  }
+
+  @Test
+  public void testRenderInitialHeaderWordWrap() throws IOException {
+    lca.render( column );
+
+    TestMessage message = Fixture.getProtocolMessage();
+    CreateOperation operation = message.findCreateOperation( column );
+    assertTrue( operation.getProperties().names().indexOf( "headerWordWrap" ) == -1 );
+  }
+
+  @Test
+  public void testRenderHeaderWordWrap() throws IOException {
+    column.setHeaderWordWrap( true );
+    lca.renderChanges( column );
+
+    TestMessage message = Fixture.getProtocolMessage();
+    assertEquals( JsonValue.TRUE, message.findSetProperty( column, "headerWordWrap" ) );
+  }
+
+  @Test
+  public void testRenderHeaderWordWrapUnchanged() throws IOException {
+    Fixture.markInitialized( display );
+    Fixture.markInitialized( column );
+
+    column.setHeaderWordWrap( true );
+    Fixture.preserveWidgets();
+    lca.renderChanges( column );
+
+    TestMessage message = Fixture.getProtocolMessage();
+    assertNull( message.findSetOperation( column, "headerWordWrap" ) );
+  }
+
   //////////////////
   // Helping classes
 
