diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/InputDialog.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/InputDialog.java
new file mode 100644
index 0000000..3d879e5
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/InputDialog.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.ui.preferences;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Base class for dialogs that accept user input.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class InputDialog extends Dialog {
+
+  private final String title;
+
+  /**
+   * Creates a new </code>{@link InputDialog}</code>.
+   * @param parent a shell which will be the parent of the new instance.
+   * @param title the title of the dialog.
+   */
+  public InputDialog(Shell parent, String title) {
+    super(parent);
+    setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.APPLICATION_MODAL);
+    this.title = title;
+  }
+
+  @Override protected void configureShell(Shell shell) {
+    super.configureShell(shell);
+    if (title != null) shell.setText(title);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/AddDirectoryDialog.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/AddDirectoryDialog.java
index 5b32eb7..d88b0f8 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/AddDirectoryDialog.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/AddDirectoryDialog.java
@@ -9,8 +9,8 @@
 package com.google.eclipse.protobuf.ui.preferences.paths;
 
 import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.*;
-import static com.google.eclipse.protobuf.ui.swt.SelectDirectoryDialogLauncher.*;
-import static com.google.eclipse.protobuf.ui.swt.Shells.centerShell;
+import static com.google.eclipse.protobuf.ui.preferences.paths.SelectDirectoryDialogs.*;
+import static org.eclipse.jface.dialogs.IDialogConstants.OK_ID;
 import static org.eclipse.xtext.util.Strings.isEmpty;
 
 import org.eclipse.swt.SWT;
@@ -18,17 +18,14 @@
 import org.eclipse.swt.layout.*;
 import org.eclipse.swt.widgets.*;
 
+import com.google.eclipse.protobuf.ui.preferences.InputDialog;
+
 /**
  * Dialog where users can select a path (in the workspace or file system) to be included in resolution of imports.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class AddDirectoryDialog extends Dialog {
-
-  private final Shell parent;
-
-  private Shell shell;
-  private boolean result;
+public class AddDirectoryDialog extends InputDialog {
 
   private DirectoryPath selectedPath;
 
@@ -36,52 +33,33 @@
   private Button btnWorkspace;
   private Button btnIsWorkspacePath;
   private Button btnFileSystem;
-  private Button btnCancel;
-  private Button btnOk;
 
   /**
    * Creates a new </code>{@link AddDirectoryDialog}</code>.
    * @param parent a shell which will be the parent of the new instance.
-   * @param title the title of this dialog.
    */
-  public AddDirectoryDialog(Shell parent, String title) {
-    super(parent, SWT.NONE);
-    this.parent = parent;
-    getStyle();
-    setText(title);
+  public AddDirectoryDialog(Shell parent) {
+    super(parent, includeDirectoryTitle);
   }
 
-  /**
-   * Opens this dialog.
-   * @return {@code true} if the user made a selection and pressed "OK" or {@code false} if the user pressed "Cancel."
-   */
-  public boolean open() {
-    result = false;
-    shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
-    shell.setSize(503, 254);
-    shell.setText(getText());
-    createAndCenterContent();
-    shell.open();
-    Display display = parent.getDisplay();
-    while (!shell.isDisposed())
-      if (!display.readAndDispatch()) display.sleep();
-    return result;
-  }
+  /** {@inheritDoc} */
+  @Override protected Control createDialogArea(Composite parent) {
+    Composite cmpDialogArea = (Composite) super.createDialogArea(parent);
 
-  private void createAndCenterContent() {
-    shell.setLayout(new GridLayout(2, false));
+    GridLayout gridLayout = (GridLayout) cmpDialogArea.getLayout();
+    gridLayout.numColumns = 2;
 
-    Label label = new Label(shell, SWT.NONE);
+    Label label = new Label(cmpDialogArea, SWT.NONE);
     label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
     label.setText(includeDirectoryPrompt);
 
-    txtPath = new Text(shell, SWT.BORDER);
+    txtPath = new Text(cmpDialogArea, SWT.BORDER);
     txtPath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
     txtPath.setEditable(false);
 
-    Composite cmpCheckBox = new Composite(shell, SWT.NONE);
+    Composite cmpCheckBox = new Composite(cmpDialogArea, SWT.NONE);
     cmpCheckBox.setEnabled(false);
-    cmpCheckBox.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
+    cmpCheckBox.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1));
     cmpCheckBox.setLayout(new GridLayout(1, false));
 
     btnIsWorkspacePath = new Button(cmpCheckBox, SWT.CHECK);
@@ -89,7 +67,8 @@
     btnIsWorkspacePath.setSize(158, 24);
     btnIsWorkspacePath.setText(isWorkspacePathCheck);
 
-    Composite cmpButtons = new Composite(shell, SWT.NONE);
+    Composite cmpButtons = new Composite(cmpDialogArea, SWT.NONE);
+    cmpButtons.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
     cmpButtons.setLayout(new GridLayout(2, true));
     new Label(cmpButtons, SWT.NONE);
 
@@ -98,31 +77,20 @@
     btnWorkspace.setText(browseWorkspace);
     new Label(cmpButtons, SWT.NONE);
 
-        btnFileSystem = new Button(cmpButtons, SWT.NONE);
-        btnFileSystem.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-        btnFileSystem.setText(browseFileSystem);
-
-    btnOk = new Button(cmpButtons, SWT.NONE);
-    btnOk.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-    btnOk.setEnabled(false);
-    btnOk.setText(ok);
-
-    btnCancel = new Button(cmpButtons, SWT.NONE);
-    btnCancel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-    btnCancel.setText(cancel);
+    btnFileSystem = new Button(cmpButtons, SWT.NONE);
+    btnFileSystem.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
+    btnFileSystem.setText(browseFileSystem);
 
     addEventListeners();
 
-    shell.setDefaultButton(btnOk);
-    shell.pack();
-
-    centerWindow();
+    applyDialogFont(cmpDialogArea);
+    return cmpDialogArea;
   }
 
   private void addEventListeners() {
     btnWorkspace.addSelectionListener(new SelectionAdapter() {
       @Override public void widgetSelected(SelectionEvent e) {
-        String path = showWorkspaceDirectoryDialog(shell, txtPath.getText(), null);
+        String path = showWorkspaceDirectoryDialog(getShell(), enteredPathText());
         if (path != null) {
           txtPath.setText(path.trim());
           btnIsWorkspacePath.setSelection(true);
@@ -131,35 +99,36 @@
     });
     btnFileSystem.addSelectionListener(new SelectionAdapter() {
       @Override public void widgetSelected(SelectionEvent e) {
-        String path = showFileSystemFolderDialog(shell, txtPath.getText());
+        String path = showFileSystemFolderDialog(getShell(), enteredPathText());
         if (path != null) {
           txtPath.setText(path.trim());
           btnIsWorkspacePath.setSelection(false);
         }
       }
     });
-    btnOk.addSelectionListener(new SelectionAdapter() {
-      @Override public void widgetSelected(SelectionEvent e) {
-        selectedPath = new DirectoryPath(txtPath.getText().trim(), btnIsWorkspacePath.getSelection());
-        result = true;
-        shell.dispose();
-      }
-    });
-    btnCancel.addSelectionListener(new SelectionAdapter() {
-      @Override public void widgetSelected(SelectionEvent e) {
-        shell.dispose();
-      }
-    });
     txtPath.addModifyListener(new ModifyListener() {
       public void modifyText(ModifyEvent e) {
-        boolean hasText = !isEmpty(txtPath.getText().trim());
-        btnOk.setEnabled(hasText);
+        boolean hasText = !isEmpty(enteredPathText());
+        getButton(OK_ID).setEnabled(hasText);
       }
     });
   }
 
-  private void centerWindow() {
-    centerShell(shell, parent);
+  /** {@inheritDoc} */
+  @Override protected void createButtonsForButtonBar(Composite parent) {
+    super.createButtonsForButtonBar(parent);
+    getButton(OK_ID).setEnabled(false);
+    txtPath.setFocus();
+  }
+
+  /** {@inheritDoc} */
+  @Override protected void okPressed() {
+    selectedPath = new DirectoryPath(enteredPathText(), btnIsWorkspacePath.getSelection());
+    super.okPressed();
+  }
+
+  private String enteredPathText() {
+    return txtPath.getText().trim();
   }
 
   /**
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPathsEditor.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPathsEditor.java
index c3721b1..e268f64 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPathsEditor.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPathsEditor.java
@@ -10,6 +10,7 @@
 
 import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.*;
 import static java.util.Collections.unmodifiableList;
+import static org.eclipse.jface.window.Window.OK;
 
 import java.util.*;
 import java.util.List;
@@ -92,8 +93,8 @@
     });
     btnAdd.addSelectionListener(new SelectionAdapter() {
       @Override public void widgetSelected(SelectionEvent e) {
-        AddDirectoryDialog dialog = new AddDirectoryDialog(getShell(), includeDirectoryTitle);
-        if (dialog.open()) {
+        AddDirectoryDialog dialog = new AddDirectoryDialog(getShell());
+        if (dialog.open() == OK) {
           importPaths.add(dialog.selectedPath());
           updateTable();
           enableButtonsDependingOnTableSelection();
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/swt/SelectDirectoryDialogLauncher.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/SelectDirectoryDialogs.java
similarity index 76%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/swt/SelectDirectoryDialogLauncher.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/SelectDirectoryDialogs.java
index 4acbf87..3912eeb 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/swt/SelectDirectoryDialogLauncher.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/SelectDirectoryDialogs.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.swt;
+package com.google.eclipse.protobuf.ui.preferences.paths;
 
 import static com.google.eclipse.protobuf.ui.swt.Messages.*;
 import static org.eclipse.core.runtime.IStatus.ERROR;
@@ -17,24 +17,25 @@
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.*;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-import org.eclipse.ui.dialogs.ISelectionStatusValidator;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.dialogs.*;
+import org.eclipse.ui.model.*;
 import org.eclipse.ui.views.navigator.ResourceComparator;
 
 /**
- * Launches dialog where users can select a directory (either in a workspace or the file system.)
- * 
+ * Launchers for dialogs where users can select a directory (either in a workspace or the file system.)
+ *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class SelectDirectoryDialogLauncher {
+class SelectDirectoryDialogs {
 
   private static final String PLUGIN_ID = "com.google.eclipse.protobuf.ui";
 
-  public static String showWorkspaceDirectoryDialog(Shell shell, String initialPath, IProject project) {
+  static String showWorkspaceDirectoryDialog(Shell shell, String initialPath) {
+    return showWorkspaceDirectoryDialog(shell, initialPath, null);
+  }
+
+  static String showWorkspaceDirectoryDialog(Shell shell, String initialPath, IProject project) {
     String currentPathText = initialPath.replaceAll("\"", "");
     IPath path = new Path(currentPathText);
     ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(shell, new WorkbenchLabelProvider(),
@@ -61,8 +62,8 @@
     if (resource == null) return null;
     return resource.getFullPath().toString();
   }
-  
-  public static String showFileSystemFolderDialog(Shell shell, String filterPath) {
+
+  static String showFileSystemFolderDialog(Shell shell, String filterPath) {
     DirectoryDialog dialog = new DirectoryDialog(shell, SWT.OPEN | SWT.APPLICATION_MODAL);
     if (filterPath != null && filterPath.trim().length() != 0) dialog.setFilterPath(filterPath);
     dialog.setMessage(browseFileSystemFolderPrompt);
@@ -73,5 +74,5 @@
     return ResourcesPlugin.getWorkspace().getRoot();
   }
 
-  private SelectDirectoryDialogLauncher() {}
+  private SelectDirectoryDialogs() {}
 }
