diff --git a/bundles/org.eclipse.rap.rwt.supplemental.filedialog.demo/META-INF/MANIFEST.MF b/bundles/org.eclipse.rap.rwt.supplemental.filedialog.demo/META-INF/MANIFEST.MF
index 82996ce..fbce080 100644
--- a/bundles/org.eclipse.rap.rwt.supplemental.filedialog.demo/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.rap.rwt.supplemental.filedialog.demo/META-INF/MANIFEST.MF
@@ -6,6 +6,7 @@
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Import-Package: javax.servlet;version="[2.5.0,4.0.0)",
  javax.servlet.http;version="[2.5.0,4.0.0)",
+ org.eclipse.rap.rwt.supplemental.fileupload,
  org.osgi.framework;version="1.3.0"
 Bundle-Vendor: %Bundle-Vendor
 Require-Bundle: org.eclipse.rap.ui;bundle-version="1.5.0",
diff --git a/bundles/org.eclipse.rap.rwt.supplemental.filedialog.demo/src/org/eclipse/rap/examples/demo/fileupload/FileUploadExamplePage.java b/bundles/org.eclipse.rap.rwt.supplemental.filedialog.demo/src/org/eclipse/rap/examples/demo/fileupload/FileUploadExamplePage.java
index 48de5c2..ece1636 100644
--- a/bundles/org.eclipse.rap.rwt.supplemental.filedialog.demo/src/org/eclipse/rap/examples/demo/fileupload/FileUploadExamplePage.java
+++ b/bundles/org.eclipse.rap.rwt.supplemental.filedialog.demo/src/org/eclipse/rap/examples/demo/fileupload/FileUploadExamplePage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2011 EclipseSource and others.
+ * Copyright (c) 2011, 2012 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
@@ -10,15 +10,29 @@
  ******************************************************************************/
 package org.eclipse.rap.examples.demo.fileupload;
 
-import org.eclipse.jface.layout.GridDataFactory;
+import java.io.File;
+
 import org.eclipse.rap.examples.ExampleUtil;
 import org.eclipse.rap.examples.IExamplePage;
-import org.eclipse.rwt.widgets.*;
+import org.eclipse.rap.rwt.supplemental.fileupload.DiskFileUploadReceiver;
+import org.eclipse.rap.rwt.supplemental.fileupload.FileUploadEvent;
+import org.eclipse.rap.rwt.supplemental.fileupload.FileUploadHandler;
+import org.eclipse.rap.rwt.supplemental.fileupload.FileUploadListener;
+import org.eclipse.rwt.lifecycle.UICallBack;
+import org.eclipse.rwt.widgets.DialogCallback;
+import org.eclipse.rwt.widgets.DialogUtil;
+import org.eclipse.rwt.widgets.FileUpload;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
 
 
 public class FileUploadExamplePage implements IExamplePage {
@@ -27,29 +41,60 @@
   private FileUpload fileUpload;
   private Label fileNameLabel;
   private Button uploadButton;
-  private Label statsLabel;
+  private Text logText;
 
   public void createControl( Composite parent ) {
-    parent.setLayout( ExampleUtil.createMainLayout( 1 ) );
-    Control fileUploadArea = createFileUploadArea( parent );
+    parent.setLayout( ExampleUtil.createMainLayout( 3 ) );
+    Control controlsColumn = createControlsColumn( parent );
+    controlsColumn.setLayoutData( ExampleUtil.createFillData() );
+    Control serverColumn = createLogColumn( parent );
+    serverColumn.setLayoutData( ExampleUtil.createFillData() );
+    Control infoColumn = createInfoColumn( parent );
+    infoColumn.setLayoutData( ExampleUtil.createFillData() );
+  }
+
+  private Control createControlsColumn( Composite parent ) {
+    Composite column = new Composite( parent, SWT.NONE );
+    column.setLayout( ExampleUtil.createGridLayoutWithoutMargin( 1, false ) );
+    Control fileUploadArea = createFileUploadArea( column );
     fileUploadArea.setLayoutData( ExampleUtil.createHorzFillData() );
-    Control fileDialogArea = createFileDialogArea( parent );
-    fileDialogArea.setLayoutData( ExampleUtil.createFillData() );
+    Control fileDialogArea = createFileDialogArea( column );
+    fileDialogArea.setLayoutData( ExampleUtil.createHorzFillData() );
+    return column;
+  }
+
+  private Control createLogColumn( Composite parent ) {
+    Composite column = new Composite( parent, SWT.NONE );
+    column.setLayout( ExampleUtil.createGridLayout( 1, false, true, true ) );
+    ExampleUtil.createHeading( column, "Server log", 2 );
+    logText = new Text( column, SWT.MULTI | SWT.READ_ONLY | SWT.H_SCROLL | SWT.BORDER );
+    logText.setText( INITIAL_TEXT );
+    logText.setLayoutData( ExampleUtil.createFillData() );
+    createClearButton( column );
+    return column;
+  }
+
+  private Control createInfoColumn( Composite parent ) {
+    Label label = new Label( parent, SWT.NONE );
+    label.setLayoutData( ExampleUtil.createFillData() );
+    return label;
   }
 
   private Control createFileUploadArea( Composite parent ) {
-    Group group = new Group( parent, SWT.NONE );
-    group.setText( "File Upload" );
-    GridLayout layout = ExampleUtil.createGridLayout( 3, false, 10, 10 );
-    layout.marginBottom = 50;
-    group.setLayout( layout );
-    fileUpload = new FileUpload( group, SWT.NONE );
+    Composite area = new Composite( parent, SWT.NONE );
+    area.setLayout( ExampleUtil.createGridLayout( 2, true, true, true ) );
+    ExampleUtil.createHeading( area, "FileUpload widget", 2 );
+    fileUpload = new FileUpload( area, SWT.NONE );
     fileUpload.setText( "Select File" );
-    fileNameLabel = new Label( group, SWT.NONE );
+    fileUpload.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, false, false ) );
+    fileNameLabel = new Label( area, SWT.NONE );
     fileNameLabel.setText( "no file selected" );
     fileNameLabel.setLayoutData( ExampleUtil.createHorzFillData() );
-    uploadButton = new Button( group, SWT.PUSH );
+    fileNameLabel.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) );
+    uploadButton = new Button( area, SWT.PUSH );
     uploadButton.setText( "Upload" );
+    uploadButton.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, false, false ) );
+    new Label( area, SWT.NONE );
     fileUpload.addSelectionListener( new SelectionAdapter() {
       @Override
       public void widgetSelected( SelectionEvent e ) {
@@ -57,35 +102,69 @@
         fileNameLabel.setText( fileName == null ? "" : fileName );
       }
     } );
+    final String url = startUploadReceiver();
     uploadButton.addSelectionListener( new SelectionAdapter() {
       @Override
       public void widgetSelected( SelectionEvent e ) {
-        fileUpload.submit( "http://localhost/" );
+        UICallBack.activate( "upload" );
+        fileUpload.submit( url );
       }
     } );
-    return group;
+    return area;
+  }
+
+  private String startUploadReceiver() {
+    DiskFileUploadReceiver receiver = new DiskFileUploadReceiver();
+    FileUploadHandler uploadHandler = new FileUploadHandler( receiver );
+    uploadHandler.addUploadListener( new FileUploadListener() {
+
+      public void uploadProgress( FileUploadEvent event ) {
+        // handle upload progress
+      }
+
+      public void uploadFailed( FileUploadEvent event ) {
+        addToLog( "upload failed: " + event.getFileName() );
+      }
+
+      public void uploadFinished( FileUploadEvent event ) {
+        addToLog( "received: " + event.getFileName() );
+      }
+    } );
+    return uploadHandler.getUploadUrl();
+  }
+
+  private void addToLog( final String message ) {
+    if( !logText.isDisposed() ) {
+      logText.getDisplay().asyncExec( new Runnable() {
+        public void run() {
+          String text = logText.getText();
+          if( INITIAL_TEXT.equals( text ) ) {
+            text = "";
+          }
+          logText.setText( text + message + "\n" );
+          UICallBack.deactivate( "upload" );
+        }
+      } );
+    }
   }
 
   private Composite createFileDialogArea( Composite parent ) {
-    Group group = new Group( parent, SWT.NONE );
-    group.setText( "File Dialog" );
-    group.setLayout( ExampleUtil.createGridLayout( 1, false, 10, 10 ) );
-    Composite buttonComposite = new Composite( group, SWT.NONE );
-    buttonComposite.setLayoutData( GridDataFactory.fillDefaults().create() );
-    buttonComposite.setLayout( new GridLayout( 1, true ) );
-    createAddSingleButton( buttonComposite );
-    createAddMultiButton( buttonComposite );
-    createClearButton( buttonComposite );
-    createStatsLabel( group );
-    return group;
+    Composite area = new Composite( parent, SWT.NONE );
+    area.setLayout( ExampleUtil.createGridLayout( 2, true, true, true ) );
+    ExampleUtil.createHeading( area, "FileDialog", 2 );
+    createAddSingleButton( area );
+    new Label( area, SWT.NONE );
+    createAddMultiButton( area );
+    return area;
   }
 
   private void createAddSingleButton( Composite parent ) {
-    Button addBtn = new Button( parent, SWT.PUSH );
-    addBtn.setText( "Add Single File" );
-    addBtn.setToolTipText( "Launches file dialog for single file selection." );
+    Button button = new Button( parent, SWT.PUSH );
+    button.setLayoutData( ExampleUtil.createHorzFillData() );
+    button.setText( "Single File" );
+    button.setToolTipText( "Launches file dialog for single file selection." );
     final Shell parentShell = parent.getShell();
-    addBtn.addSelectionListener( new SelectionAdapter() {
+    button.addSelectionListener( new SelectionAdapter() {
       @Override
       public void widgetSelected( SelectionEvent e ) {
         openFileDialog( parentShell, false );
@@ -94,36 +173,32 @@
   }
 
   private void createAddMultiButton( Composite parent ) {
-    Button addMultiBtn = new Button( parent, SWT.PUSH );
-    addMultiBtn.setText( "Add Multiple Files" );
-    addMultiBtn.setToolTipText( "Launches file dialog for multiple file selection." );
+    Button button = new Button( parent, SWT.PUSH );
+    button.setLayoutData( ExampleUtil.createHorzFillData() );
+    button.setText( "Multiple Files" );
+    button.setToolTipText( "Launches file dialog for multiple file selection." );
     final Shell parentShell = parent.getShell();
-    addMultiBtn.addSelectionListener( new SelectionAdapter() {
+    button.addSelectionListener( new SelectionAdapter() {
       @Override
       public void widgetSelected( SelectionEvent e ) {
         openFileDialog( parentShell, true );
       }
     } );
   }
-  
+
   private void createClearButton( Composite parent ) {
-    Button clearBtn = new Button( parent, SWT.PUSH );
-    clearBtn.setText( "Clear" );
-    clearBtn.setToolTipText( "Clears the results list" );
-    clearBtn.addSelectionListener( new SelectionAdapter() {
+    Button button = new Button( parent, SWT.PUSH );
+    button.setLayoutData( ExampleUtil.createHorzFillData() );
+    button.setText( "Clear" );
+    button.setToolTipText( "Clears the results list" );
+    button.addSelectionListener( new SelectionAdapter() {
       @Override
       public void widgetSelected( SelectionEvent e ) {
-        statsLabel.setText( "" );
+        logText.setText( INITIAL_TEXT );
       }
     } );
   }
 
-  private void createStatsLabel( Group group ) {
-    statsLabel = new Label( group, SWT.NONE );
-    statsLabel.setText( INITIAL_TEXT );
-    statsLabel.setLayoutData( ExampleUtil.createFillData() );
-  }
-
   private void openFileDialog( Shell parent, boolean multi ) {
     int style = getDialogStyle( multi );
     final FileDialog fileDialog = new FileDialog( parent, style );
@@ -139,13 +214,10 @@
   }
 
   private void showUploadResults( FileDialog fileDialog ) {
-    StringBuilder builder = new StringBuilder();
-    builder.append( "Results:\n" );
     String[] selectedFiles = fileDialog.getFileNames();
     for( String fileName : selectedFiles ) {
-      builder.append( fileName + "\n" );
+      addToLog( "received: " + new File( fileName ).getName() );
     }
-    statsLabel.setText( builder.toString() );
   }
 
   private static int getDialogStyle( boolean multi ) {
