diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml b/tools/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml
index 81bb606..2c1394c 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml
@@ -501,7 +501,7 @@
                class="com.android.ide.eclipse.adt.refactorings.extractstring.ExtractStringAction"
                definitionId="com.android.ide.eclipse.adt.refactoring.extract.string"
                id="com.android.ide.eclipse.adt.actions.ExtractString"
-               label="Extract Android String"
+               label="Extract Android String..."
                menubarPath="org.eclipse.jdt.ui.refactoring.menu/codingGroup"
                style="push"
                tooltip="Extracts a string into Android resource string">
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringAction.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringAction.java
index dceb144..4ef1268 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringAction.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringAction.java
@@ -22,9 +22,7 @@
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.ITypeRoot;
 import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.JavaUI;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.text.ITextSelection;
 import org.eclipse.jface.viewers.ISelection;
@@ -122,7 +120,7 @@
     public void run(IAction action) {
         if (mSelection != null && mFile != null) {
             ExtractStringRefactoring ref = new ExtractStringRefactoring(mFile, mSelection);
-            RefactoringWizard wizard = new ExtractStringWizard(ref, "Extract Android String");
+            RefactoringWizard wizard = new ExtractStringWizard(ref, mFile.getProject());
             RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
             try {
                 op.run(mWindow.getShell(), wizard.getDefaultPageTitle());
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringInputPage.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringInputPage.java
index cb449f0..5ffeeb0 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringInputPage.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringInputPage.java
@@ -16,29 +16,74 @@
 
 package com.android.ide.eclipse.adt.refactorings.extractstring;
 
+
+import com.android.ide.eclipse.common.AndroidConstants;
+import com.android.ide.eclipse.editors.resources.configurations.FolderConfiguration;
+import com.android.ide.eclipse.editors.resources.manager.ResourceFolderType;
+import com.android.ide.eclipse.editors.wizards.ConfigurationSelector;
+import com.android.sdklib.SdkConstants;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
 
+import java.util.HashMap;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 /**
  * @see ExtractStringRefactoring
  */
 class ExtractStringInputPage extends UserInputWizardPage implements IWizardPage {
 
-    public ExtractStringInputPage() {
-        super("ExtractStringInputPage");  //$NON-NLS-1$
-    }
+    /** Last res file path used, shared across the session instances but specific to the
+     *  current project. The default for unknown projects is {@link #DEFAULT_RES_FILE_PATH}. */
+    private static HashMap<String, String> sLastResFilePath = new HashMap<String, String>();
 
+    /** The project where the user selection happened. */
+    private final IProject mProject;
+
+    /** Field displaying the user-selected string to be replaced. */
     private Label mStringLabel;
+    /** Test field where the user enters the new ID to be generated or replaced with. */ 
     private Text mNewIdTextField;
-    private Label mFileLabel;
+    /** The configuration selector, to select the resource path of the XML file. */
+    private ConfigurationSelector mConfigSelector;
+    /** The combo to display the existing XML files or enter a new one. */
+    private Combo mResFileCombo;
+
+    /** Regex pattern to read a valid res XML file path. It checks that the are 2 folders and
+     *  a leaf file name ending with .xml */
+    private static final Pattern RES_XML_FILE_REGEX = Pattern.compile(
+                                     "/res/[a-z][a-zA-Z0-9_-]+/[^.]+\\.xml");  //$NON-NLS-1$
+    /** Absolute destination folder root, e.g. "/res/" */
+    private static final String RES_FOLDER_ABS =
+        AndroidConstants.WS_RESOURCES + AndroidConstants.WS_SEP;
+    /** Relative destination folder root, e.g. "res/" */
+    private static final String RES_FOLDER_REL =
+        SdkConstants.FD_RESOURCES + AndroidConstants.WS_SEP;
+
+    private static final String DEFAULT_RES_FILE_PATH = "/res/values/strings.xml";
+    
+    public ExtractStringInputPage(IProject project) {
+        super("ExtractStringInputPage");  //$NON-NLS-1$
+        mProject = project;
+    }
 
     /**
      * Create the UI for the refactoring wizard.
@@ -48,34 +93,57 @@
      */
     public void createControl(Composite parent) {
         
-        final ExtractStringRefactoring ref = getOurRefactoring();
-        
         Composite content = new Composite(parent, SWT.NONE);
 
         GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
+        layout.numColumns = 1;
         content.setLayout(layout);
-
-        // line 1: String found in selection
         
-        Label label = new Label(content, SWT.NONE);
+        createStringReplacementGroup(content);
+        createResFileGroup(content);
+
+        validatePage();
+        setControl(content);
+    }
+
+    /**
+     * Creates the top group with the field to replace which string and by what
+     * and by which options.
+     * 
+     * @param content A composite with a 1-column grid layout
+     */
+    private void createStringReplacementGroup(Composite content) {
+
+        final ExtractStringRefactoring ref = getOurRefactoring();
+        
+        Group group = new Group(content, SWT.NONE);
+        group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        group.setText("String Replacement");
+
+        GridLayout layout = new GridLayout();
+        layout.numColumns = 2;
+        group.setLayout(layout);
+
+        // line: String found in selection
+        
+        Label label = new Label(group, SWT.NONE);
         label.setText("String:");
 
         String selectedString = ref.getTokenString();
         
-        mStringLabel = new Label(content, SWT.NONE);
+        mStringLabel = new Label(group, SWT.NONE);
         mStringLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
         mStringLabel.setText(selectedString != null ? selectedString : "");
         
         // TODO provide an option to replace all occurences of this string instead of
         // just the one.
 
-        // line 2 : Textfield for new ID
+        // line : Textfield for new ID
         
-        label = new Label(content, SWT.NONE);
+        label = new Label(group, SWT.NONE);
         label.setText("Replace by R.string.");
 
-        mNewIdTextField = new Text(content, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
+        mNewIdTextField = new Text(group, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
         mNewIdTextField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
         mNewIdTextField.setText(guessId(selectedString));
 
@@ -83,37 +151,65 @@
 
         mNewIdTextField.addModifyListener(new ModifyListener() {
             public void modifyText(ModifyEvent e) {
-                if (validatePage(ref)) {
+                if (validatePage()) {
                     ref.setReplacementStringId(mNewIdTextField.getText().trim());
                 }
             }
         });
-
-        // line 3: selection of the output file
-        // TODO add a file field/chooser combo to let the user select the file to edit.
-
-        label = new Label(content, SWT.NONE);
-        label.setText("Resource file:");
-
-        mFileLabel = new Label(content, SWT.NONE);
-        mFileLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mFileLabel.setText("/res/values/strings.xml");
-        ref.setTargetFile(mFileLabel.getText());
-
-        // line 4: selection of the res config
-        // TODO add the Configuration Selector to decide with strings.xml to change
-
-        label = new Label(content, SWT.NONE);
-        label.setText("Configuration:");
-
-        label = new Label(content, SWT.NONE);
-        label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        label.setText("default");
-        
-        validatePage(ref);
-        setControl(content);
     }
 
+    /**
+     * Creates the lower group with the fields to choose the resource confirmation and
+     * the target XML file.
+     * 
+     * @param content A composite with a 1-column grid layout
+     */
+    private void createResFileGroup(Composite content) {
+
+        Group group = new Group(content, SWT.NONE);
+        group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        group.setText("XML resource to edit");
+
+        GridLayout layout = new GridLayout();
+        layout.numColumns = 2;
+        group.setLayout(layout);
+        
+        // line: selection of the res config
+
+        Label label;
+        label = new Label(group, SWT.NONE);
+        label.setText("Configuration:");
+
+        mConfigSelector = new ConfigurationSelector(group);
+        GridData gd = new GridData(2, GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
+        gd.widthHint = ConfigurationSelector.WIDTH_HINT;
+        gd.heightHint = ConfigurationSelector.HEIGHT_HINT;
+        mConfigSelector.setLayoutData(gd);
+        OnConfigSelectorUpdated onConfigSelectorUpdated = new OnConfigSelectorUpdated();
+        mConfigSelector.setOnChangeListener(onConfigSelectorUpdated);
+        
+        // line: selection of the output file
+
+        label = new Label(group, SWT.NONE);
+        label.setText("Resource file:");
+
+        mResFileCombo = new Combo(group, SWT.DROP_DOWN);
+        mResFileCombo.select(0);
+        mResFileCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        mResFileCombo.addModifyListener(onConfigSelectorUpdated);
+
+        // set output file name to the last one used
+        
+        String projPath = mProject.getFullPath().toPortableString();
+        String filePath = sLastResFilePath.get(projPath);
+        
+        mResFileCombo.setText(filePath != null ? filePath : DEFAULT_RES_FILE_PATH);
+        onConfigSelectorUpdated.run();
+    }
+
+    /**
+     * Utility method to guess a suitable new XML ID based on the selected string.
+     */
     private String guessId(String text) {
         // make lower case
         text = text.toLowerCase();
@@ -128,16 +224,25 @@
         return text;
     }
 
+    /**
+     * Returns the {@link ExtractStringRefactoring} instance used by this wizard page.
+     */
     private ExtractStringRefactoring getOurRefactoring() {
         return (ExtractStringRefactoring) getRefactoring();
     }
 
-    private boolean validatePage(ExtractStringRefactoring ref) {
-        String text = mNewIdTextField.getText().trim();
+    /**
+     * Validates fields of the wizard input page. Displays errors as appropriate and
+     * enable the "Next" button (or not) by calling {@link #setPageComplete(boolean)}.
+     * 
+     * @return True if the page has been positively validated. It may still have warnings.
+     */
+    private boolean validatePage() {
         boolean success = true;
 
         // Analyze fatal errors.
         
+        String text = mNewIdTextField.getText().trim();
         if (text == null || text.length() < 1) {
             setErrorMessage("Please provide a resource ID to replace with.");
             success = false;
@@ -157,21 +262,216 @@
             }
         }
 
+        String resFile = mResFileCombo.getText();
+        if (success) {           
+            if (resFile == null || resFile.length() == 0) {
+                setErrorMessage("A resource file name is required.");
+                success = false;
+            } else if (!RES_XML_FILE_REGEX.matcher(resFile).matches()) {
+                setErrorMessage("The XML file name is not valid.");
+                success = false;
+            }
+        }
+        
         // Analyze info & warnings.
         
         if (success) {
-            if (ref.isResIdDuplicate(mFileLabel.getText(), text)) {
-                setErrorMessage(null);
+            setErrorMessage(null);
+
+            ExtractStringRefactoring ref = getOurRefactoring();
+
+            ref.setTargetFile(resFile);
+            sLastResFilePath.put(mProject.getFullPath().toPortableString(), resFile);
+
+            if (ref.isResIdDuplicate(resFile, text)) {
                 setMessage(
-                    String.format("Warning: There's already a string item called '%1$s' in %2$s.",
-                        text, mFileLabel.getText()));
+                        String.format("There's already a string item called '%1$s' in %2$s.",
+                                      text, resFile),
+                        WizardPage.WARNING);
+            } else if (mProject.findMember(resFile) == null) {
+                setMessage(
+                        String.format("File %2$s does not exist and will be created.",
+                                      text, resFile),
+                        WizardPage.INFORMATION);
             } else {
                 setMessage(null);
-                setErrorMessage(null);
             }
         }
 
         setPageComplete(success);
         return success;
     }
+
+    public class OnConfigSelectorUpdated implements Runnable, ModifyListener {
+        
+        /** Regex pattern to parse a valid res path: it reads (/res/folder-name/)+(filename). */
+        private final Pattern mPathRegex = Pattern.compile(
+            "(/res/[a-z][a-zA-Z0-9_-]+/)(.+)");  //$NON-NLS-1$
+
+        /** Temporary config object used to retrieve the Config Selector value. */
+        private FolderConfiguration mTempConfig = new FolderConfiguration();
+
+        private HashMap<String, TreeSet<String>> mFolderCache =
+            new HashMap<String, TreeSet<String>>();
+        private String mLastFolderUsedInCombo = null;
+        private boolean mInternalConfigChange;
+        private boolean mInternalFileComboChange;
+
+        /**
+         * Callback invoked when the {@link ConfigurationSelector} has been changed.
+         * <p/>
+         * The callback does the following:
+         * <ul>
+         * <li> Examine the current file name to retrieve the XML filename, if any.
+         * <li> Recompute the path based on the configuration selector (e.g. /res/values-fr/).
+         * <li> Examine the path to retrieve all the files in it. Keep those in a local cache.
+         * <li> If the XML filename from step 1 is not in the file list, it's a custom file name.
+         *      Insert it and sort it.
+         * <li> Re-populate the file combo with all the choices.
+         * <li> Select the original XML file. 
+         */
+        public void run() {
+            if (mInternalConfigChange) {
+                return;
+            }
+            
+            // get current leafname, if any
+            String leafName = "";
+            String currPath = mResFileCombo.getText();
+            Matcher m = mPathRegex.matcher(currPath);
+            if (m.matches()) {
+                // Note: groups 1 and 2 cannot be null.
+                leafName = m.group(2);
+                currPath = m.group(1);
+            } else {
+                // There was a path but it was invalid. Ignore it.
+                currPath = "";
+            }
+
+            // recreate the res path from the current configuration
+            mConfigSelector.getConfiguration(mTempConfig);
+            StringBuffer sb = new StringBuffer(RES_FOLDER_ABS);
+            sb.append(mTempConfig.getFolderName(ResourceFolderType.VALUES));
+            sb.append('/');
+
+            String newPath = sb.toString();
+            if (newPath.equals(currPath) && newPath.equals(mLastFolderUsedInCombo)) {
+                // Path has not changed. No need to reload.
+                return;
+            }
+            
+            // Get all the files at the new path
+
+            TreeSet<String> filePaths = mFolderCache.get(newPath);
+            
+            if (filePaths == null) {
+                filePaths = new TreeSet<String>();
+
+                IFolder folder = mProject.getFolder(newPath);
+                if (folder != null && folder.exists()) {
+                    try {
+                        for (IResource res : folder.members()) {
+                            String name = res.getName();
+                            if (res.getType() == IResource.FILE && name.endsWith(".xml")) {
+                                filePaths.add(newPath + name);
+                            }
+                        }
+                    } catch (CoreException e) {
+                        // Ignore.
+                    }
+                }
+                
+                mFolderCache.put(newPath, filePaths);
+            }
+
+            currPath = newPath + leafName;
+            if (leafName.length() > 0 && !filePaths.contains(currPath)) {
+                filePaths.add(currPath);
+            }
+            
+            // Fill the combo
+            try {
+                mInternalFileComboChange = true;
+                
+                mResFileCombo.removeAll();
+                
+                for (String filePath : filePaths) {
+                    mResFileCombo.add(filePath);
+                }
+
+                int index = -1;
+                if (leafName.length() > 0) {
+                    index = mResFileCombo.indexOf(currPath);
+                    if (index >= 0) {
+                        mResFileCombo.select(index);
+                    }
+                }
+                
+                if (index == -1) {
+                    mResFileCombo.setText(currPath);
+                }
+                
+                mLastFolderUsedInCombo = newPath;
+                
+            } finally {
+                mInternalFileComboChange = false;
+            }
+
+            // finally validate the whole page
+            validatePage();
+        }
+
+        /**
+         * Callback invoked when {@link ExtractStringInputPage#mResFileCombo} has been
+         * modified.
+         */
+        public void modifyText(ModifyEvent e) {
+            if (mInternalFileComboChange) {
+                return;
+            }
+
+            String wsFolderPath = mResFileCombo.getText();
+
+            // This is a custom path, we need to sanitize it.
+            // First it should start with "/res/". Then we need to make sure there are no
+            // relative paths, things like "../" or "./" or even "//".
+            wsFolderPath = wsFolderPath.replaceAll("/+\\.\\./+|/+\\./+|//+|\\\\+|^/+", "/");  //$NON-NLS-1$ //$NON-NLS-2$
+            wsFolderPath = wsFolderPath.replaceAll("^\\.\\./+|^\\./+", "");                   //$NON-NLS-1$ //$NON-NLS-2$
+            wsFolderPath = wsFolderPath.replaceAll("/+\\.\\.$|/+\\.$|/+$", "");               //$NON-NLS-1$ //$NON-NLS-2$
+
+            // We get "res/foo" from selections relative to the project when we want a "/res/foo" path.
+            if (wsFolderPath.startsWith(RES_FOLDER_REL)) {
+                wsFolderPath = RES_FOLDER_ABS + wsFolderPath.substring(RES_FOLDER_REL.length());
+                
+                mInternalFileComboChange = true;
+                mResFileCombo.setText(wsFolderPath);
+                mInternalFileComboChange = false;
+            }
+
+            if (wsFolderPath.startsWith(RES_FOLDER_ABS)) {
+                wsFolderPath = wsFolderPath.substring(RES_FOLDER_ABS.length());
+                
+                int pos = wsFolderPath.indexOf(AndroidConstants.WS_SEP_CHAR);
+                if (pos >= 0) {
+                    wsFolderPath = wsFolderPath.substring(0, pos);
+                }
+
+                String[] folderSegments = wsFolderPath.split(FolderConfiguration.QUALIFIER_SEP);
+
+                if (folderSegments.length > 0) {
+                    String folderName = folderSegments[0];
+
+                    if (folderName != null && !folderName.equals(wsFolderPath)) {
+                        // update config selector
+                        mInternalConfigChange = true;
+                        mConfigSelector.setConfiguration(folderSegments);
+                        mInternalConfigChange = false;
+                    }
+                }
+            }
+
+            validatePage();
+        }
+    }
+
 }
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringRefactoring.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringRefactoring.java
index 99711bf..6c88a38 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringRefactoring.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringRefactoring.java
@@ -177,7 +177,7 @@
     public ExtractStringRefactoring(IFile file, ITextSelection selection) {
         mFile = file;
         mSelectionStart = selection.getOffset();
-        mSelectionEnd = mSelectionStart + selection.getLength();
+        mSelectionEnd = mSelectionStart + Math.max(0, selection.getLength() - 1);
     }
 
     /**
@@ -906,9 +906,8 @@
      * compilation unit. The resource may not exist.
      */
     private IResource getTargetXmlResource(String xmlFileWsPath) {
-        IProject proj = mUnit.getPrimary().getResource().getProject();
-        Path path = new Path(xmlFileWsPath);
-        IResource resource = proj.findMember(path);
+        IProject proj = mFile.getProject();
+        IResource resource = proj.getFile(xmlFileWsPath);
         return resource;
     }
 
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringWizard.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringWizard.java
index 2083a6e..c5b0c7d 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringWizard.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringWizard.java
@@ -16,6 +16,7 @@
 
 package com.android.ide.eclipse.adt.refactorings.extractstring;
 
+import org.eclipse.core.resources.IProject;
 import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
 
 /**
@@ -26,17 +27,24 @@
  */
 class ExtractStringWizard extends RefactoringWizard {
 
+    private final IProject mProject;
+
     /**
      * Create a wizard for ExtractString based on a simple dialog with one page.
+     * 
+     * @param ref The instance of {@link ExtractStringRefactoring} to associate to the wizard.
+     * @param project The project where the wizard was invoked from (e.g. where the user selection
+     *                happened, so that we can retrieve project resources.)
      */
-    public ExtractStringWizard(ExtractStringRefactoring ref, String title) {
+    public ExtractStringWizard(ExtractStringRefactoring ref, IProject project) {
         super(ref, DIALOG_BASED_USER_INTERFACE | PREVIEW_EXPAND_FIRST_NODE);
-        setDefaultPageTitle(title);
+        mProject = project;
+        setDefaultPageTitle(ref.getName());
     }
 
     @Override
     protected void addUserInputPages() {
-        addPage(new ExtractStringInputPage());
+        addPage(new ExtractStringInputPage(mProject));
     }
 
 }
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/wizards/NewXmlFileCreationPage.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/wizards/NewXmlFileCreationPage.java
index e84c051..80cc0f5 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/wizards/NewXmlFileCreationPage.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/wizards/NewXmlFileCreationPage.java
@@ -271,9 +271,9 @@
     final static int NUM_COL = 4;
 
     /** Absolute destination folder root, e.g. "/res/" */
-    private static String sResFolderAbs = AndroidConstants.WS_RESOURCES + AndroidConstants.WS_SEP;
+    private static final String RES_FOLDER_ABS = AndroidConstants.WS_RESOURCES + AndroidConstants.WS_SEP;
     /** Relative destination folder root, e.g. "res/" */
-    private static String sResFolderRel = SdkConstants.FD_RESOURCES + AndroidConstants.WS_SEP;
+    private static final String RES_FOLDER_REL = SdkConstants.FD_RESOURCES + AndroidConstants.WS_SEP;
     
     private IProject mProject;
     private Text mProjectTextField;
@@ -856,16 +856,16 @@
         ArrayList<TypeInfo> matches = new ArrayList<TypeInfo>();
 
         // We get "res/foo" from selections relative to the project when we want a "/res/foo" path.
-        if (wsFolderPath.startsWith(sResFolderRel)) {
-            wsFolderPath = sResFolderAbs + wsFolderPath.substring(sResFolderRel.length());
+        if (wsFolderPath.startsWith(RES_FOLDER_REL)) {
+            wsFolderPath = RES_FOLDER_ABS + wsFolderPath.substring(RES_FOLDER_REL.length());
             
             mInternalWsFolderPathUpdate = true;
             mWsFolderPathTextField.setText(wsFolderPath);
             mInternalWsFolderPathUpdate = false;
         }
 
-        if (wsFolderPath.startsWith(sResFolderAbs)) {
-            wsFolderPath = wsFolderPath.substring(sResFolderAbs.length());
+        if (wsFolderPath.startsWith(RES_FOLDER_ABS)) {
+            wsFolderPath = wsFolderPath.substring(RES_FOLDER_ABS.length());
             
             int pos = wsFolderPath.indexOf(AndroidConstants.WS_SEP_CHAR);
             if (pos >= 0) {
@@ -952,16 +952,16 @@
             // The configuration is valid. Reformat the folder path using the canonical
             // value from the configuration.
             
-            newPath = sResFolderAbs + mTempConfig.getFolderName(type.getResFolderType());
+            newPath = RES_FOLDER_ABS + mTempConfig.getFolderName(type.getResFolderType());
         } else {
             // The configuration is invalid. We still update the path but this time
             // do it manually on the string.
-            if (wsFolderPath.startsWith(sResFolderAbs)) {
+            if (wsFolderPath.startsWith(RES_FOLDER_ABS)) {
                 wsFolderPath.replaceFirst(
-                        "^(" + sResFolderAbs +")[^-]*(.*)",         //$NON-NLS-1$ //$NON-NLS-2$
+                        "^(" + RES_FOLDER_ABS +")[^-]*(.*)",         //$NON-NLS-1$ //$NON-NLS-2$
                         "\\1" + type.getResFolderName() + "\\2");   //$NON-NLS-1$ //$NON-NLS-2$
             } else {
-                newPath = sResFolderAbs + mTempConfig.getFolderName(type.getResFolderType());
+                newPath = RES_FOLDER_ABS + mTempConfig.getFolderName(type.getResFolderType());
             }
         }
 
@@ -1018,7 +1018,7 @@
             
             if (type != null) {
                 mConfigSelector.getConfiguration(mTempConfig);
-                StringBuffer sb = new StringBuffer(sResFolderAbs);
+                StringBuffer sb = new StringBuffer(RES_FOLDER_ABS);
                 sb.append(mTempConfig.getFolderName(type.getResFolderType()));
                 
                 mInternalWsFolderPathUpdate = true;
@@ -1131,8 +1131,8 @@
         // -- validate generated path
         if (error == null) {
             String wsFolderPath = getWsFolderPath();
-            if (!wsFolderPath.startsWith(sResFolderAbs)) {
-                error = String.format("Target folder must start with %1$s.", sResFolderAbs);
+            if (!wsFolderPath.startsWith(RES_FOLDER_ABS)) {
+                error = String.format("Target folder must start with %1$s.", RES_FOLDER_ABS);
             }
         }
 
