diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/PreCompilerBuilder.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/PreCompilerBuilder.java
index af0960c..5b6293c 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/PreCompilerBuilder.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/PreCompilerBuilder.java
@@ -27,7 +27,7 @@
 import com.android.sdklib.AndroidVersion;
 import com.android.sdklib.IAndroidTarget;
 import com.android.sdklib.SdkConstants;
-import com.android.sdklib.xml.ManifestConstants;
+import com.android.sdklib.xml.AndroidManifest;
 
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
@@ -336,7 +336,7 @@
                         // integer minSdk when the target is a preview => fatal error
                         String msg = String.format(
                                 "Platform %1$s is a preview and requires appication manifest to set %2$s to '%1$s'",
-                                codename, ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION);
+                                codename, AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION);
                         AdtPlugin.printErrorToConsole(project, msg);
                         BaseProjectHelper.addMarker(manifest, AdtConstants.MARKER_ADT, msg,
                                 IMarker.SEVERITY_ERROR);
@@ -345,7 +345,7 @@
                         // integer minSdk is not high enough for the target => warning
                         String msg = String.format(
                                 "Attribute %1$s (%2$d) is lower than the project target API level (%3$d)",
-                                ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION,
+                                AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION,
                                 minSdkValue, projectVersion.getApiLevel());
                         AdtPlugin.printBuildToConsole(AdtConstants.BUILD_VERBOSE, project, msg);
                         BaseProjectHelper.addMarker(manifest, AdtConstants.MARKER_ADT, msg,
@@ -354,7 +354,7 @@
                         // integer minSdk is too high for the target => warning
                         String msg = String.format(
                                 "Attribute %1$s (%2$d) is higher than the project target API level (%3$d)",
-                                ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION,
+                                AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION,
                                 minSdkValue, projectVersion.getApiLevel());
                         AdtPlugin.printBuildToConsole(AdtConstants.BUILD_VERBOSE, project, msg);
                         BaseProjectHelper.addMarker(manifest, AdtConstants.MARKER_ADT, msg,
@@ -368,7 +368,7 @@
                         // platform is not a preview => fatal error
                         String msg = String.format(
                                 "Manifest attribute '%1$s' is set to '%2$s'. Integer is expected.",
-                                ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION, minSdkVersion);
+                                AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION, minSdkVersion);
                         AdtPlugin.printErrorToConsole(project, msg);
                         BaseProjectHelper.addMarker(manifest, AdtConstants.MARKER_ADT, msg,
                                 IMarker.SEVERITY_ERROR);
@@ -377,7 +377,7 @@
                         // platform and manifest codenames don't match => fatal error.
                         String msg = String.format(
                                 "Value of manifest attribute '%1$s' does not match platform codename '%2$s'",
-                                ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION, codename);
+                                AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION, codename);
                         AdtPlugin.printErrorToConsole(project, msg);
                         BaseProjectHelper.addMarker(manifest, AdtConstants.MARKER_ADT, msg,
                                 IMarker.SEVERITY_ERROR);
@@ -390,7 +390,7 @@
                 String codename = projectTarget.getVersion().getCodename();
                 String msg = String.format(
                         "Platform %1$s is a preview and requires appication manifests to set %2$s to '%1$s'",
-                        codename, ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION);
+                        codename, AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION);
                 AdtPlugin.printErrorToConsole(project, msg);
                 BaseProjectHelper.addMarker(manifest, AdtConstants.MARKER_ADT, msg,
                         IMarker.SEVERITY_ERROR);
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiClassAttributeNode.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiClassAttributeNode.java
index 3119b70..d5abc09 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiClassAttributeNode.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiClassAttributeNode.java
@@ -25,8 +25,8 @@
 import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper;
 import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
 import com.android.ide.eclipse.adt.internal.editors.uimodel.UiTextAttributeNode;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestParser;
 import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
+import com.android.sdklib.xml.AndroidManifest;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
@@ -94,9 +94,9 @@
     private IPostTypeCreationAction mPostCreationAction;
     private boolean mMandatory;
     private final boolean mDefaultToProjectOnly;
-    
+
     private class HierarchyTypeSelection extends TypeSelectionExtension {
-        
+
         private IJavaProject mJavaProject;
         private IType mReferenceType;
         private Button mProjectOnly;
@@ -112,13 +112,13 @@
         public ITypeInfoFilterExtension getFilterExtension() {
             return new ITypeInfoFilterExtension() {
                 public boolean select(ITypeInfoRequestor typeInfoRequestor) {
-                    
+
                     boolean projectOnly = mUseProjectOnly;
-                    
+
                     String packageName = typeInfoRequestor.getPackageName();
                     String typeName = typeInfoRequestor.getTypeName();
                     String enclosingType = typeInfoRequestor.getEnclosingName();
-                    
+
                     // build the full class name.
                     StringBuilder sb = new StringBuilder(packageName);
                     sb.append('.');
@@ -127,9 +127,9 @@
                         sb.append('.');
                     }
                     sb.append(typeName);
-                    
+
                     String className = sb.toString();
-                    
+
                     try {
                         IType type = mJavaProject.findType(className);
 
@@ -150,11 +150,11 @@
                                 return false;
                             }
                         }
-                        
+
                         // get the type hierarchy and reference type is one of the super classes.
                         ITypeHierarchy hierarchy = type.newSupertypeHierarchy(
                                 new NullProgressMonitor());
-                        
+
                         IType[] supertypes = hierarchy.getAllSupertypes(type);
                         int n = supertypes.length;
                         for (int i = 0; i < n; i++) {
@@ -165,12 +165,12 @@
                         }
                     } catch (JavaModelException e) {
                     }
-                    
+
                     return false;
                 }
             };
         }
-        
+
         @Override
         public Control createContentArea(Composite parent) {
 
@@ -178,10 +178,10 @@
             mProjectOnly.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
             mProjectOnly.setText(String.format("Display classes from sources of project '%s' only",
                     mJavaProject.getProject().getName()));
-            
+
             mUseProjectOnly = mDefaultToProjectOnly;
             mProjectOnly.setSelection(mUseProjectOnly);
-            
+
             mProjectOnly.addSelectionListener(new SelectionAdapter() {
                 @Override
                 public void widgetSelected(SelectionEvent e) {
@@ -190,7 +190,7 @@
                     getTypeSelectionComponent().triggerSearch();
                 }
             });
-            
+
             return super.createContentArea(parent);
         }
     }
@@ -216,13 +216,13 @@
      * @param mandatory indicates if the class value is mandatory
      * @param attributeDescriptor the {@link AttributeDescriptor} object linked to the Ui Node.
      * @param defaultToProjectOnly When true display classes of this project only by default.
-     *         When false any class path will be considered. The user can always toggle this. 
+     *         When false any class path will be considered. The user can always toggle this.
      */
     public UiClassAttributeNode(String referenceClass, IPostTypeCreationAction postCreationAction,
             boolean mandatory, AttributeDescriptor attributeDescriptor, UiElementNode uiParent,
             boolean defaultToProjectOnly) {
         super(attributeDescriptor, uiParent);
-        
+
         mReferenceClass = referenceClass;
         mPostCreationAction = postCreationAction;
         mMandatory = mandatory;
@@ -256,7 +256,7 @@
         });
         formText.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.MIDDLE));
         SectionHelper.addControlTooltip(formText, desc.getTooltip());
-        
+
         Composite composite = toolkit.createComposite(parent);
         composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.MIDDLE));
         GridLayout gl = new GridLayout(2, false);
@@ -265,13 +265,13 @@
         // Fixes missing text borders under GTK... also requires adding a 1-pixel margin
         // for the text field below
         toolkit.paintBordersFor(composite);
-        
+
         final Text text = toolkit.createText(composite, getCurrentValue());
         GridData gd = new GridData(GridData.FILL_HORIZONTAL);
         gd.horizontalIndent = 1;  // Needed by the fixed composite borders under GTK
         text.setLayoutData(gd);
         Button browseButton = toolkit.createButton(composite, "Browse...", SWT.PUSH);
-        
+
         setTextWidget(text);
 
         browseButton.addSelectionListener(new SelectionAdapter() {
@@ -282,9 +282,9 @@
             }
         });
     }
-    
+
     /* (non-java doc)
-     * 
+     *
      * Add a modify listener that will check the validity of the class
      */
     @Override
@@ -305,12 +305,12 @@
                     String javaPackage = getManifestPackage();
 
                     // build the fully qualified name of the class
-                    String className = AndroidManifestParser.combinePackageAndClassName(
+                    String className = AndroidManifest.combinePackageAndClassName(
                             javaPackage, textValue);
-                    
+
                     // only test the vilibility for activities.
                     boolean testVisibility = AndroidConstants.CLASS_ACTIVITY.equals(
-                            mReferenceClass); 
+                            mReferenceClass);
 
                     // test the class
                     setErrorMessage(BaseProjectHelper.testClassForManifest(
@@ -339,11 +339,11 @@
 
     private void handleBrowseClick() {
         Text text = getTextWidget();
-        
+
         // we need to get the project of the manifest.
         IProject project = getProject();
         if (project != null) {
-            
+
             // Create a search scope including only the source folder of the current
             // project.
             IPackageFragmentRoot[] packageFragmentRoots = getPackageFragmentRoots(project,
@@ -365,7 +365,7 @@
                 if (dlg instanceof ITypeSelectionComponent) {
                     ((ITypeSelectionComponent)dlg).triggerSearch();
                 }
-                
+
                 if (dlg.open() == Window.OK) {
                     Object[] results = dlg.getResult();
                     if (results.length == 1) {
@@ -384,7 +384,7 @@
 
         // get the package name from the manifest.
         String packageName = getManifestPackage();
-        
+
         if (className.length() == 0) {
             createNewClass(packageName, null /* className */);
         } else {
@@ -398,10 +398,10 @@
                     fullClassName = packageName + "." + className; //$NON-NLS-1$
                 }
             }
-            
+
             // in case the type is enclosed, we need to replace the $ with .
             fullClassName = fullClassName.replaceAll("\\$", "\\."); //$NON-NLS-1$ //$NON-NLS2$
-            
+
             // now we try to find the file that contains this class and we open it in the editor.
             IProject project = getProject();
             IJavaProject javaProject = JavaCore.create(project);
@@ -427,7 +427,7 @@
             }
         }
     }
-    
+
     private IProject getProject() {
         UiElementNode uiNode = getUiParent();
         AndroidEditor editor = uiNode.getEditor();
@@ -437,7 +437,7 @@
             IFile file = ((IFileEditorInput)input).getFile();
             return file.getProject();
         }
-        
+
         return null;
     }
 
@@ -449,7 +449,7 @@
     private String getManifestPackage() {
         // get the root uiNode to get the 'package' attribute value.
         UiElementNode rootNode = getUiParent().getUiRoot();
-                  
+
         Element xmlElement = (Element) rootNode.getXmlNode();
 
         if (xmlElement != null) {
@@ -485,20 +485,20 @@
 
         return result.toArray(new IPackageFragmentRoot[result.size()]);
     }
-    
+
     private void handleNewType(IType type) {
         Text text = getTextWidget();
 
         // get the fully qualified name with $ to properly detect the enclosing types.
         String name = type.getFullyQualifiedName('$');
-        
+
         String packageValue = getManifestPackage();
-        
+
         // check if the class doesn't start with the package.
         if (packageValue.length() > 0 && name.startsWith(packageValue)) {
             // if it does, we remove the package and the first dot.
             name = name.substring(packageValue.length() + 1);
-            
+
             // look for how many segments we have left.
             // if one, just write it that way.
             // if more than one, write it with a leading dot.
@@ -512,14 +512,14 @@
             text.setText(name);
         }
     }
-    
+
     private void createNewClass(String packageName, String className) {
         // create the wizard page for the class creation, and configure it
         NewClassWizardPage page = new NewClassWizardPage();
-        
+
         // set the parent class
         page.setSuperClass(mReferenceClass, true /* canBeModified */);
-        
+
         // get the source folders as java elements.
         IPackageFragmentRoot[] roots = getPackageFragmentRoots(getProject(),
                 true /*include_containers*/);
@@ -527,7 +527,7 @@
         IPackageFragmentRoot currentRoot = null;
         IPackageFragment currentFragment = null;
         int packageMatchCount = -1;
-        
+
         for (IPackageFragmentRoot root : roots) {
             // Get the java element for the package.
             // This method is said to always return a IPackageFragment even if the
@@ -564,7 +564,7 @@
                 }
             }
         }
-        
+
         ArrayList<IPackageFragment> createdFragments = null;
 
         if (currentRoot != null) {
@@ -578,7 +578,7 @@
                 // know what to delete in case of a cancel.
                 try {
                     createdFragments = new ArrayList<IPackageFragment>();
-                    
+
                     int totalCount = packageName.split("\\.").length; //$NON-NLS-1$
                     int count = 0;
                     int index = -1;
@@ -587,7 +587,7 @@
                         index = packageName.indexOf('.', index+1);
                         count++;
                     }
-                    
+
                     // create the rest of the segments, except for the last one as indexOf will
                     // return -1;
                     while (count < totalCount - 1) {
@@ -597,11 +597,11 @@
                                 packageName.substring(0, index),
                                 true /* force*/, new NullProgressMonitor()));
                     }
-                    
+
                     // create the last package
                     createdFragments.add(currentRoot.createPackageFragment(
                             packageName, true /* force*/, new NullProgressMonitor()));
-                    
+
                     // set the root and fragment in the Wizard page
                     page.setPackageFragmentRoot(currentRoot, true /* canBeModified*/);
                     page.setPackageFragment(createdFragments.get(createdFragments.size()-1),
@@ -626,27 +626,27 @@
             // if we haven't found a valid fragment, we set the root to the first source folder.
             page.setPackageFragmentRoot(roots[0], true /* canBeModified*/);
         }
-        
+
         // if we have a starting class name we use it
         if (className != null) {
             page.setTypeName(className, true /* canBeModified*/);
         }
-        
+
         // create the action that will open it the wizard.
         OpenNewClassWizardAction action = new OpenNewClassWizardAction();
         action.setConfiguredWizardPage(page);
         action.run();
         IJavaElement element = action.getCreatedElement();
-        
+
         if (element != null) {
             if (element.getElementType() == IJavaElement.TYPE) {
-                    
+
                 IType type = (IType)element;
-                
+
                 if (mPostCreationAction != null) {
                     mPostCreationAction.processNewType(type);
                 }
-                
+
                 handleNewType(type);
             }
         } else {
@@ -663,7 +663,7 @@
             }
         }
     }
-    
+
     /**
      * Sets the error messages. If message is <code>null</code>, the message is removed.
      * @param message the message to set, or <code>null</code> to remove the current message
@@ -679,7 +679,7 @@
             getManagedForm().getMessageManager().removeMessage(textWidget, textWidget);
         }
     }
-    
+
     @Override
     public String[] getPossibleValues(String prefix) {
         // TODO: compute a list of existing classes for content assist completion
