diff --git a/org.apache.hdt.core/META-INF/MANIFEST.MF b/org.apache.hdt.core/META-INF/MANIFEST.MF
index de9d579..e491870 100644
--- a/org.apache.hdt.core/META-INF/MANIFEST.MF
+++ b/org.apache.hdt.core/META-INF/MANIFEST.MF
@@ -10,3 +10,5 @@
  org.eclipse.jdt.core
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy
+Export-Package: org.apache.hdt.core,
+ org.apache.hdt.core.natures
diff --git a/org.apache.hdt.ui/META-INF/MANIFEST.MF b/org.apache.hdt.ui/META-INF/MANIFEST.MF
index 4883ec0..759cd82 100644
--- a/org.apache.hdt.ui/META-INF/MANIFEST.MF
+++ b/org.apache.hdt.ui/META-INF/MANIFEST.MF
@@ -6,6 +6,11 @@
 Bundle-Activator: org.apache.hdt.ui.Activator
 Bundle-Vendor: Apache Foundation
 Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime
+ org.eclipse.core.runtime,
+ org.apache.hdt.core,
+ org.eclipse.core.resources,
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.ui,
+ org.eclipse.ui.ide
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy
diff --git a/org.apache.hdt.ui/build.properties b/org.apache.hdt.ui/build.properties
index 34d2e4d..342f3ff 100644
--- a/org.apache.hdt.ui/build.properties
+++ b/org.apache.hdt.ui/build.properties
@@ -1,4 +1,5 @@
 source.. = src/
 output.. = bin/
 bin.includes = META-INF/,\
-               .
+               .,\
+               resources/
diff --git a/org.apache.hdt.ui/resources/Components/Conf.png b/org.apache.hdt.ui/resources/Components/Conf.png
new file mode 100644
index 0000000..b23c4ec
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Components/Conf.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Components/Export.png b/org.apache.hdt.ui/resources/Components/Export.png
new file mode 100644
index 0000000..acddba0
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Components/Export.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Components/Import.png b/org.apache.hdt.ui/resources/Components/Import.png
new file mode 100644
index 0000000..4a2060a
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Components/Import.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Components/New.png b/org.apache.hdt.ui/resources/Components/New.png
new file mode 100644
index 0000000..b098629
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Components/New.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Components/Reload.png b/org.apache.hdt.ui/resources/Components/Reload.png
new file mode 100644
index 0000000..aa19bf7
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Components/Reload.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Components/Tool.png b/org.apache.hdt.ui/resources/Components/Tool.png
new file mode 100644
index 0000000..4993aab
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Components/Tool.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Components/Tools.png b/org.apache.hdt.ui/resources/Components/Tools.png
new file mode 100644
index 0000000..0240ed2
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Components/Tools.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant-16x16.png b/org.apache.hdt.ui/resources/Elephant-16x16.png
new file mode 100644
index 0000000..5721a7a
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant-16x16.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant-24x24.png b/org.apache.hdt.ui/resources/Elephant-24x24.png
new file mode 100644
index 0000000..0a48eaa
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant-24x24.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant-32x32.png b/org.apache.hdt.ui/resources/Elephant-32x32.png
new file mode 100644
index 0000000..82ef714
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant-32x32.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant-64x64.png b/org.apache.hdt.ui/resources/Elephant-64x64.png
new file mode 100644
index 0000000..7e26118
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant-64x64.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant-small-16x16.png b/org.apache.hdt.ui/resources/Elephant-small-16x16.png
new file mode 100644
index 0000000..0c349c7
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant-small-16x16.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant.jpg b/org.apache.hdt.ui/resources/Elephant.jpg
new file mode 100644
index 0000000..530baf9
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant.jpg
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant100x100.gif b/org.apache.hdt.ui/resources/Elephant100x100.gif
new file mode 100644
index 0000000..77e2e0d
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant100x100.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant16x16.gif b/org.apache.hdt.ui/resources/Elephant16x16.gif
new file mode 100644
index 0000000..80f650e
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant16x16.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant2-136x136.png b/org.apache.hdt.ui/resources/Elephant2-136x136.png
new file mode 100644
index 0000000..2fa7f14
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant2-136x136.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant2-16x16.png b/org.apache.hdt.ui/resources/Elephant2-16x16.png
new file mode 100644
index 0000000..b12dd8a
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant2-16x16.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant2-24x24.png b/org.apache.hdt.ui/resources/Elephant2-24x24.png
new file mode 100644
index 0000000..d1a105e
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant2-24x24.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant2-32x32.png b/org.apache.hdt.ui/resources/Elephant2-32x32.png
new file mode 100644
index 0000000..036469a
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant2-32x32.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant2-64x64.png b/org.apache.hdt.ui/resources/Elephant2-64x64.png
new file mode 100644
index 0000000..e9b5a30
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant2-64x64.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant2.jpg b/org.apache.hdt.ui/resources/Elephant2.jpg
new file mode 100644
index 0000000..fdf8a41
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant2.jpg
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant3-122x122.png b/org.apache.hdt.ui/resources/Elephant3-122x122.png
new file mode 100644
index 0000000..9096b4c
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant3-122x122.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant3-16x16.png b/org.apache.hdt.ui/resources/Elephant3-16x16.png
new file mode 100644
index 0000000..8ec09d4
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant3-16x16.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/Elephant3-24x24.png b/org.apache.hdt.ui/resources/Elephant3-24x24.png
new file mode 100644
index 0000000..0d65327
--- /dev/null
+++ b/org.apache.hdt.ui/resources/Elephant3-24x24.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/MAP100x100.gif b/org.apache.hdt.ui/resources/MAP100x100.gif
new file mode 100644
index 0000000..71cb60d
--- /dev/null
+++ b/org.apache.hdt.ui/resources/MAP100x100.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/MAP16x15.gif b/org.apache.hdt.ui/resources/MAP16x15.gif
new file mode 100644
index 0000000..b2d3c04
--- /dev/null
+++ b/org.apache.hdt.ui/resources/MAP16x15.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/download.png b/org.apache.hdt.ui/resources/download.png
new file mode 100644
index 0000000..d9f1de8
--- /dev/null
+++ b/org.apache.hdt.ui/resources/download.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/drive100x100.gif b/org.apache.hdt.ui/resources/drive100x100.gif
new file mode 100644
index 0000000..1f36b54
--- /dev/null
+++ b/org.apache.hdt.ui/resources/drive100x100.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/drive16x16.gif b/org.apache.hdt.ui/resources/drive16x16.gif
new file mode 100644
index 0000000..15d5718
--- /dev/null
+++ b/org.apache.hdt.ui/resources/drive16x16.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/driver.png b/org.apache.hdt.ui/resources/driver.png
new file mode 100644
index 0000000..ba270f4
--- /dev/null
+++ b/org.apache.hdt.ui/resources/driver.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/driverwiz.png b/org.apache.hdt.ui/resources/driverwiz.png
new file mode 100644
index 0000000..a70b1e4
--- /dev/null
+++ b/org.apache.hdt.ui/resources/driverwiz.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/elephantblue16x16.gif b/org.apache.hdt.ui/resources/elephantblue16x16.gif
new file mode 100644
index 0000000..0927b13
--- /dev/null
+++ b/org.apache.hdt.ui/resources/elephantblue16x16.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/files.gif b/org.apache.hdt.ui/resources/files.gif
new file mode 100644
index 0000000..cc01595
--- /dev/null
+++ b/org.apache.hdt.ui/resources/files.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/hadoop-logo-16x16.png b/org.apache.hdt.ui/resources/hadoop-logo-16x16.png
new file mode 100644
index 0000000..4a87cdf
--- /dev/null
+++ b/org.apache.hdt.ui/resources/hadoop-logo-16x16.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/hadoop-logo-24x24.png b/org.apache.hdt.ui/resources/hadoop-logo-24x24.png
new file mode 100644
index 0000000..318a570
--- /dev/null
+++ b/org.apache.hdt.ui/resources/hadoop-logo-24x24.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/hadoop-logo-85x85.png b/org.apache.hdt.ui/resources/hadoop-logo-85x85.png
new file mode 100644
index 0000000..6fee03b
--- /dev/null
+++ b/org.apache.hdt.ui/resources/hadoop-logo-85x85.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/hadoop-logo.jpg b/org.apache.hdt.ui/resources/hadoop-logo.jpg
new file mode 100644
index 0000000..809525d
--- /dev/null
+++ b/org.apache.hdt.ui/resources/hadoop-logo.jpg
Binary files differ
diff --git a/org.apache.hdt.ui/resources/hadoop.gif b/org.apache.hdt.ui/resources/hadoop.gif
new file mode 100644
index 0000000..828c515
--- /dev/null
+++ b/org.apache.hdt.ui/resources/hadoop.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/hadoop_small.gif b/org.apache.hdt.ui/resources/hadoop_small.gif
new file mode 100644
index 0000000..df609f3
--- /dev/null
+++ b/org.apache.hdt.ui/resources/hadoop_small.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/job.gif b/org.apache.hdt.ui/resources/job.gif
new file mode 100644
index 0000000..2bc247a
--- /dev/null
+++ b/org.apache.hdt.ui/resources/job.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/location-edit-16x16.png b/org.apache.hdt.ui/resources/location-edit-16x16.png
new file mode 100644
index 0000000..d563edb
--- /dev/null
+++ b/org.apache.hdt.ui/resources/location-edit-16x16.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/location-new-16x16.png b/org.apache.hdt.ui/resources/location-new-16x16.png
new file mode 100644
index 0000000..a7a072f
--- /dev/null
+++ b/org.apache.hdt.ui/resources/location-new-16x16.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/map16x16.gif b/org.apache.hdt.ui/resources/map16x16.gif
new file mode 100644
index 0000000..2de5c5d
--- /dev/null
+++ b/org.apache.hdt.ui/resources/map16x16.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/mapper16.png b/org.apache.hdt.ui/resources/mapper16.png
new file mode 100644
index 0000000..fe1d64e
--- /dev/null
+++ b/org.apache.hdt.ui/resources/mapper16.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/mapwiz.png b/org.apache.hdt.ui/resources/mapwiz.png
new file mode 100644
index 0000000..54c4495
--- /dev/null
+++ b/org.apache.hdt.ui/resources/mapwiz.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/new-folder.png b/org.apache.hdt.ui/resources/new-folder.png
new file mode 100644
index 0000000..5fb0b28
--- /dev/null
+++ b/org.apache.hdt.ui/resources/new-folder.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/projwiz.png b/org.apache.hdt.ui/resources/projwiz.png
new file mode 100644
index 0000000..6efa859
--- /dev/null
+++ b/org.apache.hdt.ui/resources/projwiz.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/reduce100x100.gif b/org.apache.hdt.ui/resources/reduce100x100.gif
new file mode 100644
index 0000000..b30af6b
--- /dev/null
+++ b/org.apache.hdt.ui/resources/reduce100x100.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/reduce16x16.gif b/org.apache.hdt.ui/resources/reduce16x16.gif
new file mode 100644
index 0000000..288a5d4
--- /dev/null
+++ b/org.apache.hdt.ui/resources/reduce16x16.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/reducer-16x16.gif b/org.apache.hdt.ui/resources/reducer-16x16.gif
new file mode 100644
index 0000000..74ee382
--- /dev/null
+++ b/org.apache.hdt.ui/resources/reducer-16x16.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/reducer16.png b/org.apache.hdt.ui/resources/reducer16.png
new file mode 100644
index 0000000..24fec89
--- /dev/null
+++ b/org.apache.hdt.ui/resources/reducer16.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/reducewiz.png b/org.apache.hdt.ui/resources/reducewiz.png
new file mode 100644
index 0000000..61b800d
--- /dev/null
+++ b/org.apache.hdt.ui/resources/reducewiz.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/refresh.png b/org.apache.hdt.ui/resources/refresh.png
new file mode 100644
index 0000000..ed961d2
--- /dev/null
+++ b/org.apache.hdt.ui/resources/refresh.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/spite_overcloud.png b/org.apache.hdt.ui/resources/spite_overcloud.png
new file mode 100644
index 0000000..e256a7e
--- /dev/null
+++ b/org.apache.hdt.ui/resources/spite_overcloud.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/spitesmall.gif b/org.apache.hdt.ui/resources/spitesmall.gif
new file mode 100644
index 0000000..5a1c095
--- /dev/null
+++ b/org.apache.hdt.ui/resources/spitesmall.gif
Binary files differ
diff --git a/org.apache.hdt.ui/resources/spitesmall.png b/org.apache.hdt.ui/resources/spitesmall.png
new file mode 100644
index 0000000..01c2b57
--- /dev/null
+++ b/org.apache.hdt.ui/resources/spitesmall.png
Binary files differ
diff --git a/org.apache.hdt.ui/resources/upload.png b/org.apache.hdt.ui/resources/upload.png
new file mode 100644
index 0000000..38cf1cc
--- /dev/null
+++ b/org.apache.hdt.ui/resources/upload.png
Binary files differ
diff --git a/org.apache.hdt.ui/src/org/apache/hdt/ui/ImageLibrary.java b/org.apache.hdt.ui/src/org/apache/hdt/ui/ImageLibrary.java
new file mode 100644
index 0000000..09cd6e0
--- /dev/null
+++ b/org.apache.hdt.ui/src/org/apache/hdt/ui/ImageLibrary.java
@@ -0,0 +1,252 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hdt.ui;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.Bundle;
+
+/**
+ * Icons manager
+ */
+public class ImageLibrary {
+
+  private final Bundle bundle = Activator.getDefault().getBundle();
+
+  /**
+   * Singleton instance
+   */
+  private static volatile ImageLibrary instance = null;
+
+  private ISharedImages sharedImages =
+      PlatformUI.getWorkbench().getSharedImages();
+
+  /**
+   * Where resources (icons, images...) are available in the Bundle
+   */
+  private static final String RESOURCE_DIR = "resources/";
+
+  /**
+   * Public access to image descriptors
+   * 
+   * @param name
+   * @return the image descriptor
+   */
+  public static ImageDescriptor get(String name) {
+    return getInstance().getImageDescriptorByName(name);
+  }
+
+  /**
+   * Public access to images
+   * 
+   * @param name
+   * @return the image
+   */
+  public static Image getImage(String name) {
+    return getInstance().getImageByName(name);
+  }
+
+  /**
+   * Singleton access
+   * 
+   * @return the Image library
+   */
+  public static ImageLibrary getInstance() {
+    if (instance == null) {
+      synchronized (ImageLibrary.class) {
+        if (instance == null)
+          instance = new ImageLibrary();
+      }
+    }
+    return instance;
+  }
+
+  /**
+   * Map of registered resources (ImageDescriptor and Image)
+   */
+  private Map<String, ImageDescriptor> descMap =
+      new HashMap<String, ImageDescriptor>();
+
+  private Map<String, Image> imageMap = new HashMap<String, Image>();
+
+  /**
+   * Image library constructor: put image definitions here.
+   */
+  private ImageLibrary() {
+    /*
+     * Servers view
+     */
+    newImage("server.view.location.entry", "Elephant-24x24.png");
+    newImage("server.view.job.entry", "job.gif");
+    newImage("server.view.action.location.new", "location-new-16x16.png");
+    newImage("server.view.action.location.edit", "location-edit-16x16.png");
+    newSharedImage("server.view.action.delete",
+        ISharedImages.IMG_TOOL_DELETE);
+
+    /*
+     * DFS Browser
+     */
+    newImage("dfs.browser.root.entry", "files.gif");
+    newImage("dfs.browser.location.entry", "Elephant-16x16.png");
+    newSharedImage("dfs.browser.folder.entry", ISharedImages.IMG_OBJ_FOLDER);
+    newSharedImage("dfs.browser.file.entry", ISharedImages.IMG_OBJ_FILE);
+    // DFS files in editor
+    newSharedImage("dfs.file.editor", ISharedImages.IMG_OBJ_FILE);
+    // Actions
+    newImage("dfs.browser.action.mkdir", "new-folder.png");
+    newImage("dfs.browser.action.download", "download.png");
+    newImage("dfs.browser.action.upload_files", "upload.png");
+    newImage("dfs.browser.action.upload_dir", "upload.png");
+    newSharedImage("dfs.browser.action.delete",
+        ISharedImages.IMG_TOOL_DELETE);
+    newImage("dfs.browser.action.refresh", "refresh.png");
+
+    /*
+     * Wizards
+     */
+    newImage("wizard.mapper.new", "mapwiz.png");
+    newImage("wizard.reducer.new", "reducewiz.png");
+    newImage("wizard.driver.new", "driverwiz.png");
+    newImage("wizard.mapreduce.project.new", "projwiz.png");
+  }
+
+  /**
+   * Accessor to images
+   * 
+   * @param name
+   * @return
+   */
+  private ImageDescriptor getImageDescriptorByName(String name) {
+    return this.descMap.get(name);
+  }
+
+  /**
+   * Accessor to images
+   * 
+   * @param name
+   * @return
+   */
+  private Image getImageByName(String name) {
+    return this.imageMap.get(name);
+  }
+
+  /**
+   * Access to platform shared images
+   * 
+   * @param name
+   * @return
+   */
+  private ImageDescriptor getSharedByName(String name) {
+    return sharedImages.getImageDescriptor(name);
+  }
+
+  /**
+   * Load and register a new image. If the image resource does not exist or
+   * fails to load, a default "error" resource is supplied.
+   * 
+   * @param name name of the image
+   * @param filename name of the file containing the image
+   * @return whether the image has correctly been loaded
+   */
+  private boolean newImage(String name, String filename) {
+    ImageDescriptor id;
+    boolean success;
+
+    try {
+      URL fileURL =
+          FileLocator.find(bundle, new Path(RESOURCE_DIR + filename), null);
+      id = ImageDescriptor.createFromURL(FileLocator.toFileURL(fileURL));
+      success = true;
+
+    } catch (Exception e) {
+
+      e.printStackTrace();
+      id = ImageDescriptor.getMissingImageDescriptor();
+      // id = getSharedByName(ISharedImages.IMG_OBJS_ERROR_TSK);
+      success = false;
+    }
+
+    descMap.put(name, id);
+    imageMap.put(name, id.createImage(true));
+
+    return success;
+  }
+
+  /**
+   * Register an image from the workspace shared image pool. If the image
+   * resource does not exist or fails to load, a default "error" resource is
+   * supplied.
+   * 
+   * @param name name of the image
+   * @param sharedName name of the shared image ({@link ISharedImages})
+   * @return whether the image has correctly been loaded
+   */
+  private boolean newSharedImage(String name, String sharedName) {
+    boolean success = true;
+    ImageDescriptor id = getSharedByName(sharedName);
+
+    if (id == null) {
+      id = ImageDescriptor.getMissingImageDescriptor();
+      // id = getSharedByName(ISharedImages.IMG_OBJS_ERROR_TSK);
+      success = false;
+    }
+
+    descMap.put(name, id);
+    imageMap.put(name, id.createImage(true));
+
+    return success;
+  }
+
+  /**
+   * Register an image from the workspace shared image pool. If the image
+   * resource does not exist or fails to load, a default "error" resource is
+   * supplied.
+   * 
+   * @param name name of the image
+   * @param sharedName name of the shared image ({@link ISharedImages})
+   * @return whether the image has correctly been loaded
+   */
+  private boolean newPluginImage(String name, String pluginId,
+      String filename) {
+
+    boolean success = true;
+    ImageDescriptor id =
+        AbstractUIPlugin.imageDescriptorFromPlugin(pluginId, filename);
+
+    if (id == null) {
+      id = ImageDescriptor.getMissingImageDescriptor();
+      // id = getSharedByName(ISharedImages.IMG_OBJS_ERROR_TSK);
+      success = false;
+    }
+
+    descMap.put(name, id);
+    imageMap.put(name, id.createImage(true));
+
+    return success;
+  }
+}
diff --git a/org.apache.hdt.ui/src/org/apache/hdt/ui/preferences/MapReducePreferencePage.java b/org.apache.hdt.ui/src/org/apache/hdt/ui/preferences/MapReducePreferencePage.java
new file mode 100644
index 0000000..b653b10
--- /dev/null
+++ b/org.apache.hdt.ui/src/org/apache/hdt/ui/preferences/MapReducePreferencePage.java
@@ -0,0 +1,64 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hdt.ui.preferences;
+
+import org.apache.hdt.ui.Activator;
+import org.eclipse.jface.preference.DirectoryFieldEditor;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * This class represents a preference page that is contributed to the
+ * Preferences dialog. By sub-classing <tt>FieldEditorPreferencePage</tt>,
+ * we can use the field support built into JFace that allows us to create a
+ * page that is small and knows how to save, restore and apply itself.
+ * 
+ * <p>
+ * This page is used to modify preferences only. They are stored in the
+ * preference store that belongs to the main plug-in class. That way,
+ * preferences can be accessed directly via the preference store.
+ */
+
+public class MapReducePreferencePage extends FieldEditorPreferencePage
+    implements IWorkbenchPreferencePage {
+
+  public MapReducePreferencePage() {
+    super(GRID);
+    setPreferenceStore(Activator.getDefault().getPreferenceStore());
+    setTitle("Hadoop Map/Reduce Tools");
+    // setDescription("Hadoop Map/Reduce Preferences");
+  }
+
+  /**
+   * Creates the field editors. Field editors are abstractions of the common
+   * GUI blocks needed to manipulate various types of preferences. Each field
+   * editor knows how to save and restore itself.
+   */
+  @Override
+  public void createFieldEditors() {
+    addField(new DirectoryFieldEditor(PreferenceConstants.P_PATH,
+        "&Hadoop installation directory:", getFieldEditorParent()));
+
+  }
+
+  /* @inheritDoc */
+  public void init(IWorkbench workbench) {
+  }
+
+}
diff --git a/org.apache.hdt.ui/src/org/apache/hdt/ui/preferences/PreferenceConstants.java b/org.apache.hdt.ui/src/org/apache/hdt/ui/preferences/PreferenceConstants.java
new file mode 100644
index 0000000..4efcbdd
--- /dev/null
+++ b/org.apache.hdt.ui/src/org/apache/hdt/ui/preferences/PreferenceConstants.java
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hdt.ui.preferences;
+
+/**
+ * Constant definitions for plug-in preferences
+ */
+public class PreferenceConstants {
+
+  public static final String P_PATH = "pathPreference";
+
+  // public static final String P_BOOLEAN = "booleanPreference";
+  //
+  // public static final String P_CHOICE = "choicePreference";
+  //
+  // public static final String P_STRING = "stringPreference";
+  //	
+}
diff --git a/org.apache.hdt.ui/src/org/apache/hdt/ui/preferences/PreferenceInitializer.java b/org.apache.hdt.ui/src/org/apache/hdt/ui/preferences/PreferenceInitializer.java
new file mode 100644
index 0000000..c16168c
--- /dev/null
+++ b/org.apache.hdt.ui/src/org/apache/hdt/ui/preferences/PreferenceInitializer.java
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hdt.ui.preferences;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+
+/**
+ * Class used to initialize default preference values.
+ */
+public class PreferenceInitializer extends AbstractPreferenceInitializer {
+
+  /* @inheritDoc */
+  @Override
+  public void initializeDefaultPreferences() {
+  }
+
+}
diff --git a/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewDriverWizard.java b/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewDriverWizard.java
new file mode 100644
index 0000000..7b27fe9
--- /dev/null
+++ b/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewDriverWizard.java
@@ -0,0 +1,99 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hdt.ui.wizards;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.internal.ui.wizards.NewElementWizard;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * Wizard for creating a new Driver class (a class that runs a MapReduce job).
+ * 
+ */
+
+public class NewDriverWizard extends NewElementWizard implements INewWizard,
+    IRunnableWithProgress {
+  private NewDriverWizardPage page;
+
+  /*
+   * @Override public boolean performFinish() { }
+   */
+  public void run(IProgressMonitor monitor) {
+    try {
+      page.createType(monitor);
+    } catch (CoreException e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    } catch (InterruptedException e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    }
+  }
+
+  public NewDriverWizard() {
+    setWindowTitle("New MapReduce Driver");
+  }
+
+  @Override
+  public void init(IWorkbench workbench, IStructuredSelection selection) {
+    super.init(workbench, selection);
+
+    page = new NewDriverWizardPage();
+    addPage(page);
+    page.setSelection(selection);
+  }
+
+  @Override
+  /**
+   * Performs any actions appropriate in response to the user having pressed the
+   * Finish button, or refuse if finishing now is not permitted.
+   */
+  public boolean performFinish() {
+    if (super.performFinish()) {
+      if (getCreatedElement() != null) {
+        selectAndReveal(page.getModifiedResource());
+        openResource((IFile) page.getModifiedResource());
+      }
+
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  @Override
+  /**
+   * 
+   */
+  protected void finishPage(IProgressMonitor monitor)
+      throws InterruptedException, CoreException {
+    this.run(monitor);
+  }
+
+  @Override
+  public IJavaElement getCreatedElement() {
+    return page.getCreatedType().getPrimaryElement();
+  }
+}
diff --git a/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewDriverWizardPage.java b/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewDriverWizardPage.java
new file mode 100644
index 0000000..99d0f99
--- /dev/null
+++ b/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewDriverWizardPage.java
@@ -0,0 +1,264 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hdt.ui.wizards;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.apache.hdt.ui.ImageLibrary;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.ui.IJavaElementSearchConstants;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+/**
+ * Pre-fills the new MapReduce driver class with a template.
+ * 
+ */
+
+public class NewDriverWizardPage extends NewTypeWizardPage {
+  private Button isCreateMapMethod;
+
+  private Text reducerText;
+
+  private Text mapperText;
+
+  private final boolean showContainerSelector;
+
+  public NewDriverWizardPage() {
+    this(true);
+  }
+
+  public NewDriverWizardPage(boolean showContainerSelector) {
+    super(true, "MapReduce Driver");
+
+    this.showContainerSelector = showContainerSelector;
+    setTitle("MapReduce Driver");
+    setDescription("Create a new MapReduce driver.");
+    setImageDescriptor(ImageLibrary.get("wizard.driver.new"));
+  }
+
+  public void setSelection(IStructuredSelection selection) {
+    initContainerPage(getInitialJavaElement(selection));
+    initTypePage(getInitialJavaElement(selection));
+  }
+
+  @Override
+  /**
+   * Creates the new type using the entered field values.
+   */
+  public void createType(IProgressMonitor monitor) throws CoreException,
+      InterruptedException {
+    super.createType(monitor);
+  }
+
+  @Override
+  protected void createTypeMembers(final IType newType, ImportsManager imports,
+      final IProgressMonitor monitor) throws CoreException {
+    super.createTypeMembers(newType, imports, monitor);
+    imports.addImport("org.apache.hadoop.fs.Path");
+    imports.addImport("org.apache.hadoop.io.Text");
+    imports.addImport("org.apache.hadoop.io.IntWritable");
+    imports.addImport("org.apache.hadoop.mapred.JobClient");
+    imports.addImport("org.apache.hadoop.mapred.JobConf");
+    imports.addImport("org.apache.hadoop.mapred.Reducer");
+    imports.addImport("org.apache.hadoop.mapred.Mapper");
+
+    /**
+     * TODO(jz) - move most code out of the runnable
+     */
+    getContainer().getShell().getDisplay().syncExec(new Runnable() {
+      public void run() {
+
+        String method = "public static void main(String[] args) {\n JobClient client = new JobClient();";
+        method += "JobConf conf = new JobConf("
+            + newType.getFullyQualifiedName() + ".class);\n\n";
+
+        method += "// TODO: specify output types\nconf.setOutputKeyClass(Text.class);\nconf.setOutputValueClass(IntWritable.class);\n\n";
+
+        method += "// TODO: specify input and output DIRECTORIES (not files)\nconf.setInputPath(new Path(\"src\"));\nconf.setOutputPath(new Path(\"out\"));\n\n";
+
+        if (mapperText.getText().length() > 0) {
+          method += "conf.setMapperClass(" + mapperText.getText()
+              + ".class);\n\n";
+        } else {
+          method += "// TODO: specify a mapper\nconf.setMapperClass(org.apache.hadoop.mapred.lib.IdentityMapper.class);\n\n";
+        }
+        if (reducerText.getText().length() > 0) {
+          method += "conf.setReducerClass(" + reducerText.getText()
+              + ".class);\n\n";
+        } else {
+          method += "// TODO: specify a reducer\nconf.setReducerClass(org.apache.hadoop.mapred.lib.IdentityReducer.class);\n\n";
+        }
+
+        method += "client.setConf(conf);\n";
+        method += "try {\n\tJobClient.runJob(conf);\n} catch (Exception e) {\n"
+            + "\te.printStackTrace();\n}\n";
+        method += "}\n";
+
+        try {
+          newType.createMethod(method, null, false, monitor);
+        } catch (JavaModelException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+        }
+      }
+    });
+  }
+
+  public void createControl(Composite parent) {
+    // super.createControl(parent);
+
+    initializeDialogUnits(parent);
+    Composite composite = new Composite(parent, SWT.NONE);
+    GridLayout layout = new GridLayout();
+    layout.numColumns = 4;
+    composite.setLayout(layout);
+
+    createContainerControls(composite, 4);
+
+    createPackageControls(composite, 4);
+    createSeparator(composite, 4);
+    createTypeNameControls(composite, 4);
+
+    createSuperClassControls(composite, 4);
+    createSuperInterfacesControls(composite, 4);
+    createSeparator(composite, 4);
+
+    createMapperControls(composite);
+    createReducerControls(composite);
+
+    if (!showContainerSelector) {
+      setPackageFragmentRoot(null, false);
+      setSuperClass("java.lang.Object", false);
+      setSuperInterfaces(new ArrayList(), false);
+    }
+
+    setControl(composite);
+
+    setFocus();
+    handleFieldChanged(CONTAINER);
+
+    // setSuperClass("org.apache.hadoop.mapred.MapReduceBase", true);
+    // setSuperInterfaces(Arrays.asList(new String[]{
+    // "org.apache.hadoop.mapred.Mapper" }), true);
+  }
+
+  @Override
+  protected void handleFieldChanged(String fieldName) {
+    super.handleFieldChanged(fieldName);
+
+    validate();
+  }
+
+  private void validate() {
+    if (showContainerSelector) {
+      updateStatus(new IStatus[] { fContainerStatus, fPackageStatus,
+          fTypeNameStatus, fSuperClassStatus, fSuperInterfacesStatus });
+    } else {
+      updateStatus(new IStatus[] { fTypeNameStatus, });
+    }
+  }
+
+  private void createMapperControls(Composite composite) {
+    this.mapperText = createBrowseClassControl(composite, "Ma&pper:",
+        "&Browse...", "org.apache.hadoop.mapred.Mapper", "Mapper Selection");
+  }
+
+  private void createReducerControls(Composite composite) {
+    this.reducerText = createBrowseClassControl(composite, "&Reducer:",
+        "Browse&...", "org.apache.hadoop.mapred.Reducer", "Reducer Selection");
+  }
+
+  private Text createBrowseClassControl(final Composite composite,
+      final String string, String browseButtonLabel,
+      final String baseClassName, final String dialogTitle) {
+    Label label = new Label(composite, SWT.NONE);
+    GridData data = new GridData(GridData.FILL_HORIZONTAL);
+    label.setText(string);
+    label.setLayoutData(data);
+
+    final Text text = new Text(composite, SWT.SINGLE | SWT.BORDER);
+    GridData data2 = new GridData(GridData.FILL_HORIZONTAL);
+    data2.horizontalSpan = 2;
+    text.setLayoutData(data2);
+
+    Button browse = new Button(composite, SWT.NONE);
+    browse.setText(browseButtonLabel);
+    GridData data3 = new GridData(GridData.FILL_HORIZONTAL);
+    browse.setLayoutData(data3);
+    browse.addListener(SWT.Selection, new Listener() {
+      public void handleEvent(Event event) {
+        IType baseType;
+        try {
+          baseType = getPackageFragmentRoot().getJavaProject().findType(
+              baseClassName);
+
+          // edit this to limit the scope
+          SelectionDialog dialog = JavaUI.createTypeDialog(
+              composite.getShell(), new ProgressMonitorDialog(composite
+                  .getShell()), SearchEngine.createHierarchyScope(baseType),
+              IJavaElementSearchConstants.CONSIDER_CLASSES, false);
+
+          dialog.setMessage("&Choose a type:");
+          dialog.setBlockOnOpen(true);
+          dialog.setTitle(dialogTitle);
+          dialog.open();
+
+          if ((dialog.getReturnCode() == Window.OK)
+              && (dialog.getResult().length > 0)) {
+            IType type = (IType) dialog.getResult()[0];
+            text.setText(type.getFullyQualifiedName());
+          }
+        } catch (JavaModelException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+        }
+      }
+    });
+
+    if (!showContainerSelector) {
+      label.setEnabled(false);
+      text.setEnabled(false);
+      browse.setEnabled(false);
+    }
+
+    return text;
+  }
+}
diff --git a/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewMapReduceProjectWizard.java b/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewMapReduceProjectWizard.java
new file mode 100644
index 0000000..3377731
--- /dev/null
+++ b/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewMapReduceProjectWizard.java
@@ -0,0 +1,418 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hdt.ui.wizards;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.lang.reflect.InvocationTargetException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.hdt.core.natures.MapReduceNature;
+import org.apache.hdt.ui.Activator;
+import org.apache.hdt.ui.ImageLibrary;
+import org.apache.hdt.ui.preferences.MapReducePreferencePage;
+import org.apache.hdt.ui.preferences.PreferenceConstants;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jdt.ui.wizards.NewJavaProjectWizardPage;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.preference.PreferenceManager;
+import org.eclipse.jface.preference.PreferenceNode;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWizard;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
+import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
+
+/**
+ * Wizard for creating a new MapReduce Project
+ * 
+ */
+
+public class NewMapReduceProjectWizard extends Wizard implements
+		IWorkbenchWizard, IExecutableExtension {
+	static Logger log = Logger.getLogger(NewMapReduceProjectWizard.class
+			.getName());
+
+	private HadoopFirstPage firstPage;
+
+	private NewJavaProjectWizardPage javaPage;
+
+	public NewDriverWizardPage newDriverPage;
+
+	private IConfigurationElement config;
+
+	public NewMapReduceProjectWizard() {
+		setWindowTitle("New MapReduce Project Wizard");
+	}
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+
+	}
+
+	@Override
+	public boolean canFinish() {
+		return firstPage.isPageComplete() && javaPage.isPageComplete()
+		// && ((!firstPage.generateDriver.getSelection())
+		// || newDriverPage.isPageComplete()
+		;
+	}
+
+	@Override
+	public IWizardPage getNextPage(IWizardPage page) {
+		// if (page == firstPage
+		// && firstPage.generateDriver.getSelection()
+		// )
+		// {
+		// return newDriverPage; // if "generate mapper" checked, second page is
+		// new driver page
+		// }
+		// else
+		// {
+		IWizardPage answer = super.getNextPage(page);
+		if (answer == newDriverPage) {
+			return null; // dont flip to new driver page unless "generate
+			// driver" is checked
+		} else if (answer == javaPage) {
+			return answer;
+		} else {
+			return answer;
+		}
+		// }
+	}
+
+	@Override
+	public IWizardPage getPreviousPage(IWizardPage page) {
+		if (page == newDriverPage) {
+			return firstPage; // newDriverPage, if it appears, is the second
+			// page
+		} else {
+			return super.getPreviousPage(page);
+		}
+	}
+
+	static class HadoopFirstPage extends WizardNewProjectCreationPage implements
+			SelectionListener {
+		public HadoopFirstPage() {
+			super("New Hadoop Project");
+			setImageDescriptor(ImageLibrary.get("wizard.mapreduce.project.new"));
+		}
+
+		private Link openPreferences;
+
+		private Button workspaceHadoop;
+
+		private Button projectHadoop;
+
+		private Text location;
+
+		private Button browse;
+
+		private String path;
+
+		public String currentPath;
+
+		// private Button generateDriver;
+
+		@Override
+		public void createControl(Composite parent) {
+			super.createControl(parent);
+
+			setTitle("MapReduce Project");
+			setDescription("Create a MapReduce project.");
+
+			Group group = new Group((Composite) getControl(), SWT.NONE);
+			group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			group.setText("Hadoop MapReduce Library Installation Path");
+			GridLayout layout = new GridLayout(3, true);
+			layout.marginLeft = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+			layout.marginRight = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+			layout.marginTop = convertHorizontalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+			layout.marginBottom = convertHorizontalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+			group.setLayout(layout);
+
+			workspaceHadoop = new Button(group, SWT.RADIO);
+			GridData d = new GridData(GridData.BEGINNING, GridData.BEGINNING,
+					false, false);
+			d.horizontalSpan = 2;
+			workspaceHadoop.setLayoutData(d);
+			// workspaceHadoop.setText("Use default workbench Hadoop library
+			// location");
+			workspaceHadoop.setSelection(true);
+
+			updateHadoopDirLabelFromPreferences();
+
+			openPreferences = new Link(group, SWT.NONE);
+			openPreferences
+					.setText("<a>Configure Hadoop install directory...</a>");
+			openPreferences.setLayoutData(new GridData(GridData.END,
+					GridData.CENTER, false, false));
+			openPreferences.addSelectionListener(this);
+
+			projectHadoop = new Button(group, SWT.RADIO);
+			projectHadoop.setLayoutData(new GridData(GridData.BEGINNING,
+					GridData.CENTER, false, false));
+			projectHadoop.setText("Specify Hadoop library location");
+
+			location = new Text(group, SWT.SINGLE | SWT.BORDER);
+			location.setText("");
+			d = new GridData(GridData.END, GridData.CENTER, true, false);
+			d.horizontalSpan = 1;
+			d.widthHint = 250;
+			d.grabExcessHorizontalSpace = true;
+			location.setLayoutData(d);
+			location.setEnabled(false);
+
+			browse = new Button(group, SWT.NONE);
+			browse.setText("Browse...");
+			browse.setLayoutData(new GridData(GridData.BEGINNING,
+					GridData.CENTER, false, false));
+			browse.setEnabled(false);
+			browse.addSelectionListener(this);
+
+			projectHadoop.addSelectionListener(this);
+			workspaceHadoop.addSelectionListener(this);
+
+			// generateDriver = new Button((Composite) getControl(), SWT.CHECK);
+			// generateDriver.setText("Generate a MapReduce driver");
+			// generateDriver.addListener(SWT.Selection, new Listener()
+			// {
+			// public void handleEvent(Event event) {
+			// getContainer().updateButtons(); }
+			// });
+		}
+
+		@Override
+		public boolean isPageComplete() {
+			boolean validHadoop = validateHadoopLocation();
+
+			if (!validHadoop && isCurrentPage()) {
+				setErrorMessage("Invalid Hadoop Runtime specified; please click 'Configure Hadoop install directory' or fill in library location input field");
+			} else {
+				setErrorMessage(null);
+			}
+
+			return super.isPageComplete() && validHadoop;
+		}
+
+		private boolean validateHadoopLocation() {
+			FilenameFilter gotHadoopJar = new FilenameFilter() {
+				public boolean accept(File dir, String name) {
+					return (name.startsWith("hadoop") && name.endsWith(".jar")
+							&& (name.indexOf("test") == -1) && (name
+							.indexOf("examples") == -1));
+				}
+			};
+
+			if (workspaceHadoop.getSelection()) {
+				this.currentPath = path;
+				return new Path(path).toFile().exists()
+						&& (new Path(path).toFile().list(gotHadoopJar).length > 0);
+			} else {
+				this.currentPath = location.getText();
+				File file = new Path(location.getText()).toFile();
+				return file.exists()
+						&& (new Path(location.getText()).toFile().list(
+								gotHadoopJar).length > 0);
+			}
+		}
+
+		private void updateHadoopDirLabelFromPreferences() {
+			path = Activator.getDefault().getPreferenceStore()
+					.getString(PreferenceConstants.P_PATH);
+
+			if ((path != null) && (path.length() > 0)) {
+				workspaceHadoop.setText("Use default Hadoop");
+			} else {
+				workspaceHadoop
+						.setText("Use default Hadoop (currently not set)");
+			}
+		}
+
+		public void widgetDefaultSelected(SelectionEvent e) {
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			if (e.getSource() == openPreferences) {
+				PreferenceManager manager = new PreferenceManager();
+				manager.addToRoot(new PreferenceNode(
+						"Hadoop Installation Directory",
+						new MapReducePreferencePage()));
+				PreferenceDialog dialog = new PreferenceDialog(this.getShell(),
+						manager);
+				dialog.create();
+				dialog.setMessage("Select Hadoop Installation Directory");
+				dialog.setBlockOnOpen(true);
+				dialog.open();
+
+				updateHadoopDirLabelFromPreferences();
+			} else if (e.getSource() == browse) {
+				DirectoryDialog dialog = new DirectoryDialog(this.getShell());
+				dialog.setMessage("Select a hadoop installation, containing hadoop-X-core.jar");
+				dialog.setText("Select Hadoop Installation Directory");
+				String directory = dialog.open();
+
+				if (directory != null) {
+					location.setText(directory);
+
+					if (!validateHadoopLocation()) {
+						setErrorMessage("No Hadoop jar found in specified directory");
+					} else {
+						setErrorMessage(null);
+					}
+				}
+			} else if (projectHadoop.getSelection()) {
+				location.setEnabled(true);
+				browse.setEnabled(true);
+			} else {
+				location.setEnabled(false);
+				browse.setEnabled(false);
+			}
+
+			getContainer().updateButtons();
+		}
+	}
+
+	@Override
+	public void addPages() {
+		/*
+		 * firstPage = new HadoopFirstPage(); addPage(firstPage ); addPage( new
+		 * JavaProjectWizardSecondPage(firstPage) );
+		 */
+
+		firstPage = new HadoopFirstPage();
+		javaPage = new NewJavaProjectWizardPage(ResourcesPlugin.getWorkspace()
+				.getRoot(), firstPage);
+		// newDriverPage = new NewDriverWizardPage(false);
+		// newDriverPage.setPageComplete(false); // ensure finish button
+		// initially disabled
+		addPage(firstPage);
+		addPage(javaPage);
+
+		// addPage(newDriverPage);
+	}
+
+	@Override
+	public boolean performFinish() {
+		try {
+			PlatformUI.getWorkbench().getProgressService()
+					.runInUI(this.getContainer(), new IRunnableWithProgress() {
+						public void run(IProgressMonitor monitor) {
+							try {
+								monitor.beginTask("Create Hadoop Project", 300);
+
+								javaPage.getRunnable().run(
+										new SubProgressMonitor(monitor, 100));
+
+								// if( firstPage.generateDriver.getSelection())
+								// {
+								// newDriverPage.setPackageFragmentRoot(javaPage.getNewJavaProject().getAllPackageFragmentRoots()[0],
+								// false);
+								// newDriverPage.getRunnable().run(new
+								// SubProgressMonitor(monitor,100));
+								// }
+
+								IProject project = javaPage.getNewJavaProject()
+										.getResource().getProject();
+								IProjectDescription description = project
+										.getDescription();
+								String[] existingNatures = description
+										.getNatureIds();
+								String[] natures = new String[existingNatures.length + 1];
+								for (int i = 0; i < existingNatures.length; i++) {
+									natures[i + 1] = existingNatures[i];
+								}
+
+								natures[0] = MapReduceNature.ID;
+								description.setNatureIds(natures);
+
+								project.setPersistentProperty(
+										new QualifiedName(Activator.PLUGIN_ID,
+												"hadoop.runtime.path"),
+										firstPage.currentPath);
+								project.setDescription(description,
+										new NullProgressMonitor());
+
+								String[] natureIds = project.getDescription()
+										.getNatureIds();
+								for (int i = 0; i < natureIds.length; i++) {
+									log.fine("Nature id # " + i + " > "
+											+ natureIds[i]);
+								}
+
+								monitor.worked(100);
+								monitor.done();
+
+								BasicNewProjectResourceWizard
+										.updatePerspective(config);
+							} catch (CoreException e) {
+								// TODO Auto-generated catch block
+								log.log(Level.SEVERE, "CoreException thrown.",
+										e);
+							} catch (InvocationTargetException e) {
+								// TODO Auto-generated catch block
+								e.printStackTrace();
+							} catch (InterruptedException e) {
+								// TODO Auto-generated catch block
+								e.printStackTrace();
+							}
+						}
+					}, null);
+		} catch (InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		return true;
+	}
+
+	public void setInitializationData(IConfigurationElement config,
+			String propertyName, Object data) throws CoreException {
+		this.config = config;
+	}
+}
diff --git a/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewMapperWizard.java b/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewMapperWizard.java
new file mode 100644
index 0000000..710c915
--- /dev/null
+++ b/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewMapperWizard.java
@@ -0,0 +1,182 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hdt.ui.wizards;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.apache.hdt.ui.ImageLibrary;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.internal.ui.wizards.NewElementWizard;
+import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * Wizard for creating a new Mapper class (a class that runs the Map portion
+ * of a MapReduce job). The class is pre-filled with a template.
+ * 
+ */
+
+public class NewMapperWizard extends NewElementWizard implements INewWizard,
+    IRunnableWithProgress {
+  private Page page;
+
+  public NewMapperWizard() {
+    setWindowTitle("New Mapper");
+  }
+
+  public void run(IProgressMonitor monitor) {
+    try {
+      page.createType(monitor);
+    } catch (CoreException e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    } catch (InterruptedException e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    }
+  }
+
+  @Override
+  public void init(IWorkbench workbench, IStructuredSelection selection) {
+    super.init(workbench, selection);
+
+    page = new Page();
+    addPage(page);
+    page.setSelection(selection);
+  }
+
+  public static class Page extends NewTypeWizardPage {
+    private Button isCreateMapMethod;
+
+    public Page() {
+      super(true, "Mapper");
+
+      setTitle("Mapper");
+      setDescription("Create a new Mapper implementation.");
+      setImageDescriptor(ImageLibrary.get("wizard.mapper.new"));
+    }
+
+    public void setSelection(IStructuredSelection selection) {
+      initContainerPage(getInitialJavaElement(selection));
+      initTypePage(getInitialJavaElement(selection));
+    }
+
+    @Override
+    public void createType(IProgressMonitor monitor) throws CoreException,
+        InterruptedException {
+      super.createType(monitor);
+    }
+
+    @Override
+    protected void createTypeMembers(IType newType, ImportsManager imports,
+        IProgressMonitor monitor) throws CoreException {
+      super.createTypeMembers(newType, imports, monitor);
+      imports.addImport("java.io.IOException");
+      imports.addImport("org.apache.hadoop.io.WritableComparable");
+      imports.addImport("org.apache.hadoop.io.Writable");
+      imports.addImport("org.apache.hadoop.mapred.OutputCollector");
+      imports.addImport("org.apache.hadoop.mapred.Reporter");
+      newType
+          .createMethod(
+              "public void map(WritableComparable key, Writable values, OutputCollector output, Reporter reporter) throws IOException \n{\n}\n",
+              null, false, monitor);
+    }
+
+    public void createControl(Composite parent) {
+      // super.createControl(parent);
+
+      initializeDialogUnits(parent);
+      Composite composite = new Composite(parent, SWT.NONE);
+      GridLayout layout = new GridLayout();
+      layout.numColumns = 4;
+      composite.setLayout(layout);
+
+      createContainerControls(composite, 4);
+      createPackageControls(composite, 4);
+      createSeparator(composite, 4);
+      createTypeNameControls(composite, 4);
+      createSuperClassControls(composite, 4);
+      createSuperInterfacesControls(composite, 4);
+      // createSeparator(composite, 4);
+
+      setControl(composite);
+
+      setSuperClass("org.apache.hadoop.mapred.MapReduceBase", true);
+      setSuperInterfaces(Arrays
+          .asList(new String[] { "org.apache.hadoop.mapred.Mapper" }), true);
+
+      setFocus();
+      validate();
+    }
+
+    @Override
+    protected void handleFieldChanged(String fieldName) {
+      super.handleFieldChanged(fieldName);
+
+      validate();
+    }
+
+    private void validate() {
+      updateStatus(new IStatus[] { fContainerStatus, fPackageStatus,
+          fTypeNameStatus, fSuperClassStatus, fSuperInterfacesStatus });
+    }
+  }
+
+  @Override
+  public boolean performFinish() {
+    if (super.performFinish()) {
+      if (getCreatedElement() != null) {
+        openResource((IFile) page.getModifiedResource());
+        selectAndReveal(page.getModifiedResource());
+      }
+
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  @Override
+  protected void finishPage(IProgressMonitor monitor)
+      throws InterruptedException, CoreException {
+    this.run(monitor);
+  }
+
+  @Override
+  public IJavaElement getCreatedElement() {
+    return page.getCreatedType().getPrimaryElement();
+  }
+
+}
diff --git a/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewReducerWizard.java b/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewReducerWizard.java
new file mode 100644
index 0000000..5ea7bab
--- /dev/null
+++ b/org.apache.hdt.ui/src/org/apache/hdt/ui/wizards/NewReducerWizard.java
@@ -0,0 +1,185 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hdt.ui.wizards;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.apache.hdt.ui.ImageLibrary;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.internal.ui.wizards.NewElementWizard;
+import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * Wizard for creating a new Reducer class (a class that runs the Reduce
+ * portion of a MapReduce job). The class is pre-filled with a template.
+ * 
+ */
+
+public class NewReducerWizard extends NewElementWizard implements
+    INewWizard, IRunnableWithProgress {
+  private Page page;
+
+  public NewReducerWizard() {
+    setWindowTitle("New Reducer");
+  }
+
+  public void run(IProgressMonitor monitor) {
+    try {
+      page.createType(monitor);
+    } catch (CoreException e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    } catch (InterruptedException e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    }
+  }
+
+  @Override
+  public void init(IWorkbench workbench, IStructuredSelection selection) {
+    super.init(workbench, selection);
+
+    page = new Page();
+    addPage(page);
+    page.setSelection(selection);
+  }
+
+  public static class Page extends NewTypeWizardPage {
+    public Page() {
+      super(true, "Reducer");
+
+      setTitle("Reducer");
+      setDescription("Create a new Reducer implementation.");
+      setImageDescriptor(ImageLibrary.get("wizard.reducer.new"));
+    }
+
+    public void setSelection(IStructuredSelection selection) {
+      initContainerPage(getInitialJavaElement(selection));
+      initTypePage(getInitialJavaElement(selection));
+    }
+
+    @Override
+    public void createType(IProgressMonitor monitor) throws CoreException,
+        InterruptedException {
+      super.createType(monitor);
+    }
+
+    @Override
+    protected void createTypeMembers(IType newType, ImportsManager imports,
+        IProgressMonitor monitor) throws CoreException {
+      super.createTypeMembers(newType, imports, monitor);
+      imports.addImport("java.io.IOException");
+      imports.addImport("org.apache.hadoop.io.WritableComparable");
+      imports.addImport("org.apache.hadoop.mapred.OutputCollector");
+      imports.addImport("org.apache.hadoop.mapred.Reporter");
+      imports.addImport("java.util.Iterator");
+      newType
+          .createMethod(
+              "public void reduce(WritableComparable _key, Iterator values, OutputCollector output, Reporter reporter) throws IOException \n{\n"
+                  + "\t// replace KeyType with the real type of your key\n"
+                  + "\tKeyType key = (KeyType) _key;\n\n"
+                  + "\twhile (values.hasNext()) {\n"
+                  + "\t\t// replace ValueType with the real type of your value\n"
+                  + "\t\tValueType value = (ValueType) values.next();\n\n"
+                  + "\t\t// process value\n" + "\t}\n" + "}\n", null, false,
+              monitor);
+    }
+
+    public void createControl(Composite parent) {
+      // super.createControl(parent);
+
+      initializeDialogUnits(parent);
+      Composite composite = new Composite(parent, SWT.NONE);
+      GridLayout layout = new GridLayout();
+      layout.numColumns = 4;
+      composite.setLayout(layout);
+
+      createContainerControls(composite, 4);
+      createPackageControls(composite, 4);
+      createSeparator(composite, 4);
+      createTypeNameControls(composite, 4);
+      createSuperClassControls(composite, 4);
+      createSuperInterfacesControls(composite, 4);
+      // createSeparator(composite, 4);
+
+      setControl(composite);
+
+      setSuperClass("org.apache.hadoop.mapred.MapReduceBase", true);
+      setSuperInterfaces(Arrays
+          .asList(new String[] { "org.apache.hadoop.mapred.Reducer" }), true);
+
+      setFocus();
+      validate();
+    }
+
+    @Override
+    protected void handleFieldChanged(String fieldName) {
+      super.handleFieldChanged(fieldName);
+
+      validate();
+    }
+
+    private void validate() {
+      updateStatus(new IStatus[] { fContainerStatus, fPackageStatus,
+          fTypeNameStatus, fSuperClassStatus, fSuperInterfacesStatus });
+    }
+  }
+
+  @Override
+  public boolean performFinish() {
+    if (super.performFinish()) {
+      if (getCreatedElement() != null) {
+        selectAndReveal(page.getModifiedResource());
+        openResource((IFile) page.getModifiedResource());
+      }
+
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  @Override
+  protected void finishPage(IProgressMonitor monitor)
+      throws InterruptedException, CoreException {
+    this.run(monitor);
+  }
+
+  @Override
+  public IJavaElement getCreatedElement() {
+    return (page.getCreatedType() == null) ? null : page.getCreatedType()
+        .getPrimaryElement();
+  }
+}
