diff --git a/adtproductbuild/build.xml b/adtproductbuild/build.xml
index b5c26de..7c1529b 100644
--- a/adtproductbuild/build.xml
+++ b/adtproductbuild/build.xml
@@ -90,6 +90,7 @@
         <unzip src="${targetSrcDir}/wtp/wtp-repo-R-3.3.2-20120210195245.zip" dest="${targetDir}/repos/wtp" overwrite="false" />
         <unzip src="${targetSrcDir}/gef/GEF-SDK-3.7.2.zip" dest="${targetDir}/repos/gef" overwrite="false" />
         <unzip src="${targetSrcDir}/pde/org.eclipse.pde-3.8.zip" dest="${targetDir}/repos/pde" overwrite="false" />
+        <unzip src="${targetSrcDir}/egit/org.eclipse.egit.repository-2.2.0.201212191850-r.zip" dest="${targetDir}/repos/egit" overwrite="false" />
     </target>
 
     <!-- Launch pde build to build the adtpackage product -->
diff --git a/anttasks/Android.mk b/anttasks/Android.mk
index 9922f53..ae0c3a9 100644
--- a/anttasks/Android.mk
+++ b/anttasks/Android.mk
@@ -25,7 +25,8 @@
         common \
         sdklib \
         manifmerger \
-        ant
+        ant \
+        guava-tools
 
 LOCAL_MODULE := anttasks
 
diff --git a/anttasks/src/com/android/ant/AaptExecTask.java b/anttasks/src/com/android/ant/AaptExecTask.java
index 257d1b9..a1d44c4 100644
--- a/anttasks/src/com/android/ant/AaptExecTask.java
+++ b/anttasks/src/com/android/ant/AaptExecTask.java
@@ -20,8 +20,8 @@
 import com.android.sdklib.internal.build.SymbolLoader;
 import com.android.sdklib.internal.build.SymbolWriter;
 import com.android.xml.AndroidXPathFactory;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
 
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
@@ -32,12 +32,10 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
 
 import javax.xml.xpath.XPath;
@@ -401,6 +399,7 @@
      *
      * @see org.apache.tools.ant.Task#execute()
      */
+    @SuppressWarnings("deprecation")
     @Override
     public void execute() throws BuildException {
         if (mLibraryResFolderPathRefid == null) {
@@ -706,8 +705,8 @@
                 File rFile = new File(mBinFolder, SdkConstants.FN_RESOURCE_TEXT);
                 if (rFile.isFile()) {
                     // Load the full symbols from the full R.txt file.
-                    SymbolLoader fullSymbols = new SymbolLoader(rFile);
-                    fullSymbols.load();
+                    SymbolLoader fullSymbolValues = new SymbolLoader(rFile);
+                    fullSymbolValues.load();
 
                     // we have two props which contains list of items. Both items represent
                     // 2 data of a single property.
@@ -729,67 +728,42 @@
                         mOriginalManifestPackage = getPackageName(mManifestFile);
                     }
 
-                    // simpler case of a single library
-                    if (packages.length == 1) {
-                        if (!mOriginalManifestPackage.equals(packages[0])) {
-                            createRClass(fullSymbols, rFiles[0], packages[0]);
-                        }
-                    } else {
+                    Multimap<String, SymbolLoader> libMap = ArrayListMultimap.create();
 
-                        Map<String, String> libPackages = Maps.newHashMapWithExpectedSize(
-                                packages.length);
-                        Set<String> duplicatePackages = Sets.newHashSet();
+                    // First pass processing the libraries, collecting them by packageName,
+                    // and ignoring the ones that have the same package name as the application
+                    // (since that R class was already created).
+                    for (int i = 0 ; i < packages.length ; i++) {
+                        String libPackage = packages[i];
 
-                        // preprocessing to figure out if there are dups in the package names of
-                        // the libraries
-                        for (int i = 0 ; i < packages.length ; i++) {
-                            String libPackage = packages[i];
-                            if (mOriginalManifestPackage.equals(libPackage)) {
-                                // skip libraries that have the same package name as the application.
-                                continue;
-                            }
-
-                            String existingPkg = libPackages.get(libPackage);
-                            if (existingPkg != null) {
-                                // record the dup package and keep going, in case there are all the same
-                                duplicatePackages.add(libPackage);
-                                continue;
-                            }
-
-                            libPackages.put(libPackage, rFiles[i]);
+                        // skip libraries that have the same package name as the application.
+                        if (mOriginalManifestPackage.equals(libPackage)) {
+                            continue;
                         }
 
-                        // check if we have duplicate but all files are the same.
-                        if (duplicatePackages.size() > 0) {
-                            // possible conflict!
-                            // detect case of all libraries == same package.
-                            if (duplicatePackages.size() == 1 && libPackages.size() == 1 &&
-                                    duplicatePackages.iterator().next().equals(libPackages.keySet().iterator().next())) {
-                                // this is ok, all libraries have the same package.
-                                // Make a copy of the full R class.
-                                SymbolWriter writer = new SymbolWriter(mRFolder,
-                                        duplicatePackages.iterator().next(),
-                                        fullSymbols, fullSymbols);
-                                writer.write();
-                            } else {
-                                StringBuilder sb = new StringBuilder();
-                                sb.append("The following packages have been found to be used by two or more libraries:");
-                                for (String pkg : duplicatePackages) {
-                                    sb.append("\n\t").append(pkg);
-                                }
-                                sb.append("\nNo libraries must share the same package, unless all libraries share the same packages.");
-                                throw new BuildException(sb.toString());
-                            }
-                        } else {
-                            // no dups, all libraries have different packages.
-                            // Conflicts with the main package have been removed already.
-                            // Just process all the libraries from the list where we removed
-                            // libs that had the same package as the app.
-                            for (Entry<String, String> lib : libPackages.entrySet()) {
-                                createRClass(fullSymbols, lib.getValue(), lib.getKey());
-                            }
+                        File rText = new File(rFiles[i]);
+                        if (rText.isFile()) {
+                            // load the lib symbols
+                            SymbolLoader libSymbols = new SymbolLoader(rText);
+                            libSymbols.load();
+
+                            // store these symbols by associating them with the package name.
+                            libMap.put(libPackage, libSymbols);
                         }
                     }
+
+                    // now loop on all the package names, merge all the symbols to write,
+                    // and write them
+                    for (String packageName : libMap.keySet()) {
+                        Collection<SymbolLoader> symbols = libMap.get(packageName);
+
+                        SymbolWriter writer = new SymbolWriter(mRFolder, packageName,
+                                fullSymbolValues);
+                        for (SymbolLoader symbolLoader : symbols) {
+                            writer.addSymbolsToWrite(symbolLoader);
+                        }
+                        writer.write();
+                    }
                 }
             }
         } catch (Exception e) {
@@ -803,18 +777,6 @@
         }
     }
 
-    private void createRClass(SymbolLoader fullSymbols, String libRTxtFile, String libPackage)
-            throws IOException {
-        File libSymbolFile = new File(libRTxtFile);
-        if (libSymbolFile.isFile()) {
-            SymbolLoader libSymbols = new SymbolLoader(libSymbolFile);
-            libSymbols.load();
-
-            SymbolWriter writer = new SymbolWriter(mRFolder, libPackage, libSymbols, fullSymbols);
-            writer.write();
-        }
-    }
-
     private String getPackageName(String manifest) {
         XPath xpath = AndroidXPathFactory.newXPath();
 
diff --git a/anttasks/src/com/android/ant/TaskHelper.java b/anttasks/src/com/android/ant/TaskHelper.java
index 43ea33a..c93b193 100644
--- a/anttasks/src/com/android/ant/TaskHelper.java
+++ b/anttasks/src/com/android/ant/TaskHelper.java
@@ -22,7 +22,7 @@
 import com.android.sdklib.internal.project.ProjectProperties;
 import com.android.sdklib.internal.project.ProjectProperties.PropertyType;
 import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;
-import com.android.sdklib.internal.repository.packages.FullRevision;
+import com.android.sdklib.repository.FullRevision;
 import com.android.sdklib.repository.PkgProps;
 
 import org.apache.tools.ant.BuildException;
diff --git a/assetstudio/Android.mk b/assetstudio/Android.mk
index 88f4987..17f9415 100644
--- a/assetstudio/Android.mk
+++ b/assetstudio/Android.mk
@@ -16,8 +16,14 @@
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
-LOCAL_JAVA_RESOURCE_DIRS := src
+# The assetstudio code has moved to tools/base/assetstudio.
+# The rule below uses the prebuilt assetstudio.jar.
+#
+# If you want to run the tests, cd to tools/base/assetstudio
+# and run ./gradlew :assetstudio:test
+
+LOCAL_MODULE := assetstudio
+LOCAL_MODULE_TAGS := optional
 
 # TODO: Replace common with the batik stuff
 LOCAL_JAVA_LIBRARIES := \
@@ -27,8 +33,8 @@
 
 LOCAL_JAR_MANIFEST := etc/manifest.txt
 
-LOCAL_MODULE := assetstudio
+LOCAL_PREBUILT_JAVA_LIBRARIES := \
+	../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
 
-LOCAL_MODULE_TAGS := optional
+include $(BUILD_HOST_PREBUILT)
 
-include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/assetstudio/src/com/android/assetstudiolib/ActionBarIconGenerator.java b/assetstudio/src/com/android/assetstudiolib/ActionBarIconGenerator.java
deleted file mode 100644
index 3cd6f11..0000000
--- a/assetstudio/src/com/android/assetstudiolib/ActionBarIconGenerator.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 com.android.assetstudiolib;
-
-import com.android.assetstudiolib.Util.Effect;
-import com.android.assetstudiolib.Util.FillEffect;
-
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.image.BufferedImage;
-
-/**
- * Generate icons for the action bar
- */
-public class ActionBarIconGenerator extends GraphicGenerator {
-
-    /** Creates a new {@link ActionBarIconGenerator} */
-    public ActionBarIconGenerator() {
-    }
-
-    @Override
-    public BufferedImage generate(GraphicGeneratorContext context, Options options) {
-        ActionBarOptions actionBarOptions = (ActionBarOptions) options;
-        Rectangle iconSizeMdpi = new Rectangle(0, 0, 32, 32);
-        Rectangle targetRectMdpi = actionBarOptions.sourceIsClipart
-                ? new Rectangle(0, 0, 32, 32)
-                : new Rectangle(4, 4, 24, 24);
-        final float scaleFactor = GraphicGenerator.getMdpiScaleFactor(options.density);
-        Rectangle imageRect = Util.scaleRectangle(iconSizeMdpi, scaleFactor);
-        Rectangle targetRect = Util.scaleRectangle(targetRectMdpi, scaleFactor);
-        BufferedImage outImage = Util.newArgbBufferedImage(imageRect.width, imageRect.height);
-        Graphics2D g = (Graphics2D) outImage.getGraphics();
-
-        BufferedImage tempImage = Util.newArgbBufferedImage(
-                imageRect.width, imageRect.height);
-        Graphics2D g2 = (Graphics2D) tempImage.getGraphics();
-        Util.drawCenterInside(g2, options.sourceImage, targetRect);
-
-        if (actionBarOptions.theme == Theme.HOLO_LIGHT) {
-            Util.drawEffects(g, tempImage, 0, 0, new Effect[] {
-                    new FillEffect(new Color(0x333333), 0.6),
-            });
-        } else {
-            assert actionBarOptions.theme == Theme.HOLO_DARK;
-            Util.drawEffects(g, tempImage, 0, 0, new Effect[] {
-                    new FillEffect(new Color(0xFFFFFF), 0.8)
-            });
-        }
-
-        g.dispose();
-        g2.dispose();
-
-        return outImage;
-    }
-
-    /** Options specific to generating action bar icons */
-    public static class ActionBarOptions extends GraphicGenerator.Options {
-        /** The theme to generate icons for */
-        public Theme theme = Theme.HOLO_LIGHT;
-
-        /** Whether or not the source image is a clipart source */
-        public boolean sourceIsClipart = false;
-    }
-
-    /** The themes to generate action bar icons for */
-    public enum Theme {
-        /** Theme.Holo - a dark (and default) version of the Honeycomb theme */
-        HOLO_DARK,
-
-        /** Theme.HoloLight - a light version of the Honeycomb theme */
-        HOLO_LIGHT;
-    }
-}
diff --git a/assetstudio/src/com/android/assetstudiolib/GraphicGenerator.java b/assetstudio/src/com/android/assetstudiolib/GraphicGenerator.java
deleted file mode 100644
index 706adc8..0000000
--- a/assetstudio/src/com/android/assetstudiolib/GraphicGenerator.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.assetstudiolib;
-
-import com.android.resources.Density;
-import com.google.common.io.Closeables;
-
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.security.ProtectionDomain;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.jar.JarFile;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import javax.imageio.ImageIO;
-
-/**
- * The base Generator class.
- */
-public abstract class GraphicGenerator {
-    /**
-     * Options used for all generators.
-     */
-    public static class Options {
-        /** Minimum version (API level) of the SDK to generate icons for */
-        public int minSdk = 1;
-
-        /** Source image to use as a basis for the icon */
-        public BufferedImage sourceImage;
-
-        /** The density to generate the icon with */
-        public Density density = Density.XHIGH;
-    }
-
-    /** Shapes that can be used for icon backgrounds */
-    public static enum Shape {
-        /** No background */
-        NONE("none"),
-        /** Circular background */
-        CIRCLE("circle"),
-        /** Square background */
-        SQUARE("square");
-
-        /** Id, used in filenames to identify associated stencils */
-        public final String id;
-
-        Shape(String id) {
-            this.id = id;
-        }
-    }
-
-    /** Foreground effects styles */
-    public static enum Style {
-        /** No effects */
-        SIMPLE("fore1");
-
-        /** Id, used in filenames to identify associated stencils */
-        public final String id;
-
-        Style(String id) {
-            this.id = id;
-        }
-    }
-
-    /**
-     * Generate a single icon using the given options
-     *
-     * @param context render context to use for looking up resources etc
-     * @param options options controlling the appearance of the icon
-     * @return a {@link BufferedImage} with the generated icon
-     */
-    public abstract BufferedImage generate(GraphicGeneratorContext context, Options options);
-
-    /**
-     * Computes the target filename (relative to the Android project folder)
-     * where an icon rendered with the given options should be stored. This is
-     * also used as the map keys in the result map used by
-     * {@link #generate(String, Map, GraphicGeneratorContext, Options, String)}.
-     *
-     * @param options the options object used by the generator for the current
-     *            image
-     * @param name the base name to use when creating the path
-     * @return a path relative to the res/ folder where the image should be
-     *         stored (will always use / as a path separator, not \ on Windows)
-     */
-    protected String getIconPath(Options options, String name) {
-        return getIconFolder(options) + '/' + getIconName(options, name);
-    }
-
-    /**
-     * Gets name of the file itself. It is sometimes modified by options, for
-     * example in unselected tabs we change foo.png to foo-unselected.png
-     */
-    protected String getIconName(Options options, String name) {
-        return name + ".png"; //$NON-NLS-1$
-    }
-
-    /**
-     * Gets name of the folder to contain the resource. It usually includes the
-     * density, but is also sometimes modified by options. For example, in some
-     * notification icons we add in -v9 or -v11.
-     */
-    protected String getIconFolder(Options options) {
-        return "res/drawable-" + options.density.getResourceValue(); //$NON-NLS-1$
-    }
-
-    /**
-     * Generates a full set of icons into the given map. The values in the map
-     * will be the generated images, and each value is keyed by the
-     * corresponding relative path of the image, which is determined by the
-     * {@link #getIconPath(Options, String)} method.
-     *
-     * @param category the current category to place images into (if null the
-     *            density name will be used)
-     * @param categoryMap the map to put images into, should not be null. The
-     *            map is a map from a category name, to a map from file path to
-     *            image.
-     * @param context a generator context which for example can load resources
-     * @param options options to apply to this generator
-     * @param name the base name of the icons to generate
-     */
-    public void generate(String category, Map<String, Map<String, BufferedImage>> categoryMap,
-            GraphicGeneratorContext context, Options options, String name) {
-        Density[] densityValues = Density.values();
-        // Sort density values into ascending order
-        Arrays.sort(densityValues, new Comparator<Density>() {
-            @Override
-            public int compare(Density d1, Density d2) {
-                return d1.getDpiValue() - d2.getDpiValue();
-            }
-        });
-
-        for (Density density : densityValues) {
-            if (!density.isValidValueForDevice()) {
-                continue;
-            }
-            if (density == Density.LOW || density == Density.TV ||
-                    (density == Density.XXHIGH && !(this instanceof LauncherIconGenerator))) {
-                // TODO don't manually check and instead gracefully handle missing stencils.
-                // Not yet supported -- missing stencil image
-                continue;
-            }
-            options.density = density;
-            BufferedImage image = generate(context, options);
-            if (image != null) {
-                String mapCategory = category;
-                if (mapCategory == null) {
-                    mapCategory = options.density.getResourceValue();
-                }
-                Map<String, BufferedImage> imageMap = categoryMap.get(mapCategory);
-                if (imageMap == null) {
-                    imageMap = new LinkedHashMap<String, BufferedImage>();
-                    categoryMap.put(mapCategory, imageMap);
-                }
-                imageMap.put(getIconPath(options, name), image);
-            }
-        }
-    }
-
-    /**
-     * Returns the scale factor to apply for a given MDPI density to compute the
-     * absolute pixel count to use to draw an icon of the given target density
-     *
-     * @param density the density
-     * @return a factor to multiple mdpi distances with to compute the target density
-     */
-    public static float getMdpiScaleFactor(Density density) {
-        return density.getDpiValue() / (float) Density.MEDIUM.getDpiValue();
-    }
-
-    /**
-     * Returns one of the built in stencil images, or null
-     *
-     * @param relativePath stencil path such as "launcher-stencil/square/web/back.png"
-     * @return the image, or null
-     * @throws IOException if an unexpected I/O error occurs
-     */
-    @SuppressWarnings("resource") // Eclipse doesn't know about Closeables#closeQuietly yet
-    public static BufferedImage getStencilImage(String relativePath) throws IOException {
-        InputStream is = GraphicGenerator.class.getResourceAsStream(relativePath);
-        try {
-            return ImageIO.read(is);
-        } finally {
-            Closeables.closeQuietly(is);
-        }
-    }
-
-    /**
-     * Returns the icon (32x32) for a given clip art image.
-     *
-     * @param name the name of the image to be loaded (which can be looked up via
-     *            {@link #getClipartNames()})
-     * @return the icon image
-     * @throws IOException if the image cannot be loaded
-     */
-    @SuppressWarnings("resource") // Eclipse doesn't know about Closeables#closeQuietly yet
-    public static BufferedImage getClipartIcon(String name) throws IOException {
-        InputStream is = GraphicGenerator.class.getResourceAsStream(
-                "/images/clipart/small/" + name);
-        try {
-            return ImageIO.read(is);
-        } finally {
-            Closeables.closeQuietly(is);
-        }
-    }
-
-    /**
-     * Returns the full size clip art image for a given image name.
-     *
-     * @param name the name of the image to be loaded (which can be looked up via
-     *            {@link #getClipartNames()})
-     * @return the clip art image
-     * @throws IOException if the image cannot be loaded
-     */
-    @SuppressWarnings("resource") // Eclipse doesn't know about Closeables#closeQuietly yet
-    public static BufferedImage getClipartImage(String name) throws IOException {
-        InputStream is = GraphicGenerator.class.getResourceAsStream(
-                "/images/clipart/big/" + name);
-        try {
-            return ImageIO.read(is);
-        } finally {
-            Closeables.closeQuietly(is);
-        }
-    }
-
-    /**
-     * Returns the names of available clip art images which can be obtained by passing the
-     * name to {@link #getClipartIcon(String)} or
-     * {@link GraphicGenerator#getClipartImage(String)}
-     *
-     * @return an iterator for the available image names
-     */
-    public static Iterator<String> getClipartNames() {
-        List<String> names = new ArrayList<String>(80);
-        try {
-            String pathPrefix = "images/clipart/big/"; //$NON-NLS-1$
-            ProtectionDomain protectionDomain = GraphicGenerator.class.getProtectionDomain();
-            URL url = protectionDomain.getCodeSource().getLocation();
-            File file;
-            try {
-                file = new File(url.toURI());
-            } catch (URISyntaxException e) {
-                file = new File(url.getPath());
-            }
-            final ZipFile zipFile = new JarFile(file);
-            Enumeration<? extends ZipEntry> enumeration = zipFile.entries();
-            while (enumeration.hasMoreElements()) {
-                ZipEntry zipEntry = enumeration.nextElement();
-                String name = zipEntry.getName();
-                if (!name.startsWith(pathPrefix) || !name.endsWith(".png")) { //$NON-NLS-1$
-                    continue;
-                }
-
-                int lastSlash = name.lastIndexOf('/');
-                if (lastSlash != -1) {
-                    name = name.substring(lastSlash + 1);
-                }
-                names.add(name);
-            }
-        } catch (final Exception e) {
-            e.printStackTrace();
-        }
-
-        return names.iterator();
-    }
-}
diff --git a/assetstudio/src/com/android/assetstudiolib/GraphicGeneratorContext.java b/assetstudio/src/com/android/assetstudiolib/GraphicGeneratorContext.java
deleted file mode 100644
index e0b00a6..0000000
--- a/assetstudio/src/com/android/assetstudiolib/GraphicGeneratorContext.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.assetstudiolib;
-
-import java.awt.image.BufferedImage;
-
-/**
- * The context used during graphic generation.
- */
-public interface GraphicGeneratorContext {
-    /**
-     * Loads the given image resource, as requested by the graphic generator.
-     *
-     * @param path The path to the resource, relative to the general "resources" path, as defined by
-     *             the context implementor.
-     * @return The loaded image resource, or null if there was an error.
-     */
-    public BufferedImage loadImageResource(String path);
-}
diff --git a/assetstudio/src/com/android/assetstudiolib/LauncherIconGenerator.java b/assetstudio/src/com/android/assetstudiolib/LauncherIconGenerator.java
deleted file mode 100644
index 8902774..0000000
--- a/assetstudio/src/com/android/assetstudiolib/LauncherIconGenerator.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.assetstudiolib;
-
-import com.android.resources.Density;
-import com.android.utils.Pair;
-
-import java.awt.AlphaComposite;
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.image.BufferedImage;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A {@link GraphicGenerator} that generates Android "launcher" icons.
- */
-public class LauncherIconGenerator extends GraphicGenerator {
-    private static final Rectangle IMAGE_SIZE_WEB = new Rectangle(0, 0, 512, 512);
-    private static final Rectangle IMAGE_SIZE_MDPI = new Rectangle(0, 0, 48, 48);
-
-    private static final Map<Pair<Shape, Density>, Rectangle> TARGET_RECTS
-            = new HashMap<Pair<Shape, Density>, Rectangle>();
-
-    static {
-        // None, Web
-        TARGET_RECTS.put(Pair.of(Shape.NONE, (Density) null), new Rectangle(32, 32, 448, 448));
-        // None, HDPI
-        TARGET_RECTS.put(Pair.of(Shape.NONE, Density.HIGH), new Rectangle(4, 4, 64, 64));
-        // None, MDPI
-        TARGET_RECTS.put(Pair.of(Shape.NONE, Density.MEDIUM), new Rectangle(3, 3, 42, 42));
-
-        // Circle, Web
-        TARGET_RECTS.put(Pair.of(Shape.CIRCLE, (Density) null), new Rectangle(32, 43, 448, 448));
-        // Circle, HDPI
-        TARGET_RECTS.put(Pair.of(Shape.CIRCLE, Density.HIGH), new Rectangle(4, 6, 64, 64));
-        // Circle, MDPI
-        TARGET_RECTS.put(Pair.of(Shape.CIRCLE, Density.MEDIUM), new Rectangle(3, 4, 42, 42));
-
-        // Square, Web
-        TARGET_RECTS.put(Pair.of(Shape.SQUARE, (Density) null), new Rectangle(32, 53, 448, 427));
-        // Square, HDPI
-        TARGET_RECTS.put(Pair.of(Shape.SQUARE, Density.HIGH), new Rectangle(4, 8, 64, 60));
-        // Square, MDPI
-        TARGET_RECTS.put(Pair.of(Shape.SQUARE, Density.MEDIUM), new Rectangle(3, 5, 42, 40));
-    }
-
-    @Override
-    public BufferedImage generate(GraphicGeneratorContext context, Options options) {
-        LauncherOptions launcherOptions = (LauncherOptions) options;
-
-        String density;
-        if (launcherOptions.isWebGraphic) {
-            density = "web";
-        } else {
-            density = launcherOptions.density.getResourceValue();
-        }
-
-        BufferedImage backImage = null, foreImage = null, maskImage = null, maskInnerImage = null;
-        if (launcherOptions.shape != Shape.NONE && launcherOptions.shape != null) {
-            String shape = launcherOptions.shape.id;
-            backImage = context.loadImageResource("/images/launcher_stencil/"
-                    + shape + "/" + density + "/back.png");
-            foreImage = context.loadImageResource("/images/launcher_stencil/"
-                    + shape + "/" + density + "/" + launcherOptions.style.id + ".png");
-            maskImage = context.loadImageResource("/images/launcher_stencil/"
-                    + shape + "/" + density + "/mask.png");
-            maskInnerImage = context.loadImageResource("/images/launcher_stencil/"
-                    + shape + "/" + density + "/mask_inner.png");
-        }
-
-        Rectangle imageRect = IMAGE_SIZE_WEB;
-        if (!launcherOptions.isWebGraphic) {
-            imageRect = Util.scaleRectangle(IMAGE_SIZE_MDPI,
-                    GraphicGenerator.getMdpiScaleFactor(launcherOptions.density));
-        }
-
-        Rectangle targetRect = TARGET_RECTS.get(
-                Pair.of(launcherOptions.shape, launcherOptions.density));
-        if (targetRect == null) {
-            // Scale up from MDPI if no density-specific target rectangle is defined.
-            targetRect = Util.scaleRectangle(
-                    TARGET_RECTS.get(Pair.of(launcherOptions.shape, Density.MEDIUM)),
-                    GraphicGenerator.getMdpiScaleFactor(launcherOptions.density));
-        }
-
-        BufferedImage outImage = Util.newArgbBufferedImage(imageRect.width, imageRect.height);
-        Graphics2D g = (Graphics2D) outImage.getGraphics();
-        if (backImage != null) {
-            g.drawImage(backImage, 0, 0, null);
-        }
-
-        BufferedImage tempImage = Util.newArgbBufferedImage(imageRect.width, imageRect.height);
-        Graphics2D g2 = (Graphics2D) tempImage.getGraphics();
-        if (maskImage != null) {
-            g2.drawImage(maskImage, 0, 0, null);
-            g2.setComposite(AlphaComposite.SrcAtop);
-            g2.setPaint(new Color(launcherOptions.backgroundColor));
-            g2.fillRect(0, 0, imageRect.width, imageRect.height);
-        }
-
-        BufferedImage tempImage2 = Util.newArgbBufferedImage(imageRect.width, imageRect.height);
-        Graphics2D g3 = (Graphics2D) tempImage2.getGraphics();
-        if (maskInnerImage != null) {
-            g3.drawImage(maskInnerImage, 0, 0, null);
-            g3.setComposite(AlphaComposite.SrcAtop);
-            g3.setPaint(new Color(launcherOptions.backgroundColor));
-            g3.fillRect(0, 0, imageRect.width, imageRect.height);
-        }
-
-        if (launcherOptions.crop) {
-            Util.drawCenterCrop(g3, launcherOptions.sourceImage, targetRect);
-        } else {
-            Util.drawCenterInside(g3, launcherOptions.sourceImage, targetRect);
-        }
-
-        g2.drawImage(tempImage2, 0, 0, null);
-        g.drawImage(tempImage, 0, 0, null);
-        if (foreImage != null) {
-            g.drawImage(foreImage, 0, 0, null);
-        }
-
-        g.dispose();
-        g2.dispose();
-
-        return outImage;
-    }
-
-    @Override
-    public void generate(String category, Map<String, Map<String, BufferedImage>> categoryMap,
-            GraphicGeneratorContext context, Options options, String name) {
-        LauncherOptions launcherOptions = (LauncherOptions) options;
-        boolean generateWebImage = launcherOptions.isWebGraphic;
-        launcherOptions.isWebGraphic = false;
-        super.generate(category, categoryMap, context, options, name);
-
-        if (generateWebImage) {
-            launcherOptions.isWebGraphic = true;
-            launcherOptions.density = null;
-            BufferedImage image = generate(context, options);
-            if (image != null) {
-                Map<String, BufferedImage> imageMap = new HashMap<String, BufferedImage>();
-                categoryMap.put("Web", imageMap);
-                imageMap.put(getIconPath(options, name), image);
-            }
-        }
-    }
-
-    @Override
-    protected String getIconPath(Options options, String name) {
-        if (((LauncherOptions) options).isWebGraphic) {
-            return name + "-web.png"; // Store at the root of the project
-        }
-
-        return super.getIconPath(options, name);
-    }
-
-    /** Options specific to generating launcher icons */
-    public static class LauncherOptions extends GraphicGenerator.Options {
-        /** Background color, as an RRGGBB packed integer */
-        public int backgroundColor = 0;
-
-        /** Whether the image should be cropped or not */
-        public boolean crop = true;
-
-        /** The shape to use for the background */
-        public Shape shape = Shape.SQUARE;
-
-        /** The effects to apply to the foreground */
-        public Style style = Style.SIMPLE;
-
-        /**
-         * Whether a web graphic should be generated (will ignore normal density
-         * setting). The {@link #generate(GraphicGeneratorContext, Options)}
-         * method will use this to decide whether to generate a normal density
-         * icon or a high res web image. The
-         * {@link GraphicGenerator#generate(String, Map, GraphicGeneratorContext, Options, String)}
-         * method will use this flag to determine whether it should include a
-         * web graphic in its iteration.
-         */
-        public boolean isWebGraphic;
-    }
-}
diff --git a/assetstudio/src/com/android/assetstudiolib/MenuIconGenerator.java b/assetstudio/src/com/android/assetstudiolib/MenuIconGenerator.java
deleted file mode 100644
index 33b9c34..0000000
--- a/assetstudio/src/com/android/assetstudiolib/MenuIconGenerator.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.assetstudiolib;
-
-import com.android.assetstudiolib.Util.Effect;
-import com.android.assetstudiolib.Util.FillEffect;
-import com.android.assetstudiolib.Util.ShadowEffect;
-
-import java.awt.Color;
-import java.awt.GradientPaint;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.image.BufferedImage;
-
-/**
- * A {@link GraphicGenerator} that generates Android "menu" icons.
- */
-public class MenuIconGenerator extends GraphicGenerator {
-    /** Creates a menu icon generator */
-    public MenuIconGenerator() {
-    }
-
-    @Override
-    public BufferedImage generate(GraphicGeneratorContext context, Options options) {
-        Rectangle imageSizeHdpi = new Rectangle(0, 0, 48, 48);
-        Rectangle targetRectHdpi = new Rectangle(8, 8, 32, 32);
-        float scaleFactor = GraphicGenerator.getMdpiScaleFactor(options.density);
-        Rectangle imageRect = Util.scaleRectangle(imageSizeHdpi, scaleFactor);
-        Rectangle targetRect = Util.scaleRectangle(targetRectHdpi, scaleFactor);
-
-        BufferedImage outImage = Util.newArgbBufferedImage(imageRect.width, imageRect.height);
-        Graphics2D g = (Graphics2D) outImage.getGraphics();
-
-        BufferedImage tempImage = Util.newArgbBufferedImage(
-                imageRect.width, imageRect.height);
-        Graphics2D g2 = (Graphics2D) tempImage.getGraphics();
-        Util.drawCenterInside(g2, options.sourceImage, targetRect);
-
-        Util.drawEffects(g, tempImage, 0, 0, new Effect[] {
-                new FillEffect(
-                        new GradientPaint(
-                                0, 0,
-                                new Color(0xa3a3a3),
-                                0, imageRect.height,
-                                new Color(0x787878))),
-                new ShadowEffect(
-                        0,
-                        2 * scaleFactor,
-                        2 * scaleFactor,
-                        Color.BLACK,
-                        0.2,
-                        true),
-                new ShadowEffect(
-                        0,
-                        1,
-                        0,
-                        Color.BLACK,
-                        0.35,
-                        true),
-                new ShadowEffect(
-                        0,
-                        -1,
-                        0,
-                        Color.WHITE,
-                        0.35,
-                        true),
-        });
-
-        g.dispose();
-        g2.dispose();
-
-        return outImage;
-    }
-}
diff --git a/assetstudio/src/com/android/assetstudiolib/NotificationIconGenerator.java b/assetstudio/src/com/android/assetstudiolib/NotificationIconGenerator.java
deleted file mode 100644
index b84af1b..0000000
--- a/assetstudio/src/com/android/assetstudiolib/NotificationIconGenerator.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 com.android.assetstudiolib;
-
-import com.android.assetstudiolib.Util.Effect;
-import com.android.assetstudiolib.Util.FillEffect;
-import com.android.assetstudiolib.Util.ShadowEffect;
-
-import java.awt.Color;
-import java.awt.GradientPaint;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.image.BufferedImage;
-import java.util.Map;
-
-/**
- * Generate icons for the notifications bar
- */
-public class NotificationIconGenerator extends GraphicGenerator {
-    /** Creates a new {@link NotificationIconGenerator} */
-    public NotificationIconGenerator() {
-    }
-
-    @Override
-    public BufferedImage generate(GraphicGeneratorContext context, Options options) {
-        Rectangle iconSizeMdpi;
-        Rectangle targetRectMdpi;
-        NotificationOptions notificationOptions = (NotificationOptions) options;
-        if (notificationOptions.version == Version.OLDER) {
-            iconSizeMdpi = new Rectangle(0, 0, 25, 25);
-            targetRectMdpi = new Rectangle(4, 4, 17, 17);
-        } else if (notificationOptions.version == Version.V11) {
-            iconSizeMdpi = new Rectangle(0, 0, 24, 24);
-            targetRectMdpi = new Rectangle(1, 1, 22, 22);
-        } else {
-            assert notificationOptions.version == Version.V9;
-            iconSizeMdpi = new Rectangle(0, 0, 16, 25);
-            targetRectMdpi = new Rectangle(0, 5, 16, 16);
-        }
-
-        final float scaleFactor = GraphicGenerator.getMdpiScaleFactor(options.density);
-        Rectangle imageRect = Util.scaleRectangle(iconSizeMdpi, scaleFactor);
-        Rectangle targetRect = Util.scaleRectangle(targetRectMdpi, scaleFactor);
-
-        BufferedImage outImage = Util.newArgbBufferedImage(imageRect.width, imageRect.height);
-        Graphics2D g = (Graphics2D) outImage.getGraphics();
-
-        BufferedImage tempImage = Util.newArgbBufferedImage(
-                imageRect.width, imageRect.height);
-        Graphics2D g2 = (Graphics2D) tempImage.getGraphics();
-
-        if (notificationOptions.version == Version.OLDER) {
-            BufferedImage backImage = context.loadImageResource(
-                    "/images/notification_stencil/"
-                            + notificationOptions.density.getResourceValue()
-                            + ".png");
-            g.drawImage(backImage, 0, 0, null);
-            BufferedImage top = options.sourceImage;
-            BufferedImage filled = Util.filledImage(top, Color.WHITE);
-            Util.drawCenterInside(g, filled, targetRect);
-        } else if (notificationOptions.version == Version.V11) {
-            Util.drawCenterInside(g2, options.sourceImage, targetRect);
-            Util.drawEffects(g, tempImage, 0, 0, new Effect[] {
-                    new FillEffect(Color.WHITE),
-            });
-        } else {
-            assert notificationOptions.version == Version.V9;
-            Util.drawCenterInside(g2, options.sourceImage, targetRect);
-            Util.drawEffects(g, tempImage, 0, 0, new Effect[] {
-                    new FillEffect(
-                            new GradientPaint(
-                                    0, 0,
-                                    new Color(0x919191),
-                                    0, imageRect.height,
-                                    new Color(0x828282))),
-                    new ShadowEffect(
-                            0,
-                            1,
-                            0,
-                            Color.WHITE,
-                            0.10,
-                            true),
-            });
-        }
-
-        g.dispose();
-        g2.dispose();
-
-        return outImage;
-    }
-
-    @Override
-    public void generate(String category, Map<String, Map<String, BufferedImage>> categoryMap,
-            GraphicGeneratorContext context, Options baseOptions, String name) {
-        NotificationOptions options = (NotificationOptions) baseOptions;
-        if (options.minSdk < 9) {
-            options.version = Version.OLDER;
-            super.generate(options.version.getDisplayName(), categoryMap, context, options, name);
-        }
-        if (options.minSdk < 11) {
-            options.version = Version.V9;
-            super.generate(options.version.getDisplayName(), categoryMap, context, options, name);
-        }
-        options.version = Version.V11;
-        super.generate(options.minSdk < 11 ? options.version.getDisplayName() : null,
-                categoryMap, context, options, name);
-    }
-
-    @Override
-    protected String getIconFolder(Options options) {
-        String folder = super.getIconFolder(options);
-        Version version = ((NotificationOptions) options).version;
-        if (version == Version.V11 && options.minSdk < 11) {
-            return folder + "-v11"; //$NON-NLS-1$
-        } else if (version == Version.V9 && options.minSdk < 9) {
-            return folder + "-v9"; //$NON-NLS-1$
-        } else {
-            return folder;
-        }
-    }
-
-    /**
-     * Options specific to generating notification icons
-     */
-    public static class NotificationOptions extends GraphicGenerator.Options {
-        /**
-         * The version of the icon to generate - different styles are used for different
-         * versions of Android
-         */
-        public Version version = Version.V9;
-    }
-
-    /**
-     * The version of the icon to generate - different styles are used for different
-     * versions of Android
-     */
-    public enum Version {
-        /** Icon style used for -v9 and -v10 */
-        V9("V9"),
-
-        /** Icon style used for -v11 (Honeycomb) and later */
-        V11("V11"),
-
-        /** Icon style used for versions older than v9 */
-        OLDER("Other");
-
-        private final String mDisplayName;
-
-        Version(String displayName) {
-            mDisplayName = displayName;
-        }
-
-        /**
-         * Returns the display name for this version, typically shown as a
-         * category
-         *
-         * @return the display name, never null
-         */
-        public String getDisplayName() {
-            return mDisplayName;
-        }
-    }
-}
diff --git a/assetstudio/src/com/android/assetstudiolib/TabIconGenerator.java b/assetstudio/src/com/android/assetstudiolib/TabIconGenerator.java
deleted file mode 100644
index 3d2ac30..0000000
--- a/assetstudio/src/com/android/assetstudiolib/TabIconGenerator.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 com.android.assetstudiolib;
-
-import com.android.assetstudiolib.Util.Effect;
-import com.android.assetstudiolib.Util.FillEffect;
-import com.android.assetstudiolib.Util.ShadowEffect;
-
-import java.awt.Color;
-import java.awt.GradientPaint;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.image.BufferedImage;
-import java.util.Map;
-
-
-/**
- * Generate icons for tabs
- */
-public class TabIconGenerator extends GraphicGenerator {
-    /** Creates a new {@link TabIconGenerator} */
-    public TabIconGenerator() {
-    }
-
-    @Override
-    public BufferedImage generate(GraphicGeneratorContext context, Options options) {
-        Rectangle iconSizeMdpi = new Rectangle(0, 0, 32, 32);
-        Rectangle targetRectMdpi = new Rectangle(2, 2, 28, 28);
-        final float scaleFactor = GraphicGenerator.getMdpiScaleFactor(options.density);
-        Rectangle imageRect = Util.scaleRectangle(iconSizeMdpi, scaleFactor);
-        Rectangle targetRect = Util.scaleRectangle(targetRectMdpi, scaleFactor);
-        BufferedImage outImage = Util.newArgbBufferedImage(imageRect.width, imageRect.height);
-        Graphics2D g = (Graphics2D) outImage.getGraphics();
-
-        BufferedImage tempImage = Util.newArgbBufferedImage(
-                imageRect.width, imageRect.height);
-        Graphics2D g2 = (Graphics2D) tempImage.getGraphics();
-        Util.drawCenterInside(g2, options.sourceImage, targetRect);
-
-        TabOptions tabOptions = (TabOptions) options;
-        if (tabOptions.selected) {
-            if (tabOptions.oldStyle) {
-                Util.drawEffects(g, tempImage, 0, 0, new Effect[] {
-                        new FillEffect(
-                                new GradientPaint(
-                                        0, 0,
-                                        new Color(0xa3a3a3),
-                                        0, imageRect.height,
-                                        new Color(0x787878))),
-                        new ShadowEffect(
-                                0,
-                                2 * scaleFactor,
-                                2 * scaleFactor,
-                                Color.BLACK,
-                                0.2,
-                                true),
-                        new ShadowEffect(
-                                0,
-                                1,
-                                0,
-                                Color.BLACK,
-                                0.35,
-                                true),
-                        new ShadowEffect(
-                                0,
-                                -1,
-                                0,
-                                Color.WHITE,
-                                0.35,
-                                true),
-                });
-            } else {
-                Util.drawEffects(g, tempImage, 0, 0, new Effect[] {
-                        new FillEffect(Color.WHITE),
-                        new ShadowEffect(
-                                0,
-                                0,
-                                3 * scaleFactor,
-                                Color.BLACK,
-                                0.25,
-                                false),
-                });
-            }
-        } else {
-            // Unselected
-            if (tabOptions.oldStyle) {
-                Util.drawEffects(g, tempImage, 0, 0, new Effect[] {
-                        new FillEffect(
-                                new GradientPaint(
-                                        0, 0.25f * imageRect.height,
-                                        new Color(0xf9f9f9),
-                                        0, imageRect.height,
-                                        new Color(0xdfdfdf))),
-                        new ShadowEffect(
-                                0,
-                                2 * scaleFactor,
-                                2 * scaleFactor,
-                                Color.BLACK,
-                                0.1,
-                                true),
-                        new ShadowEffect(
-                                0,
-                                1,
-                                0,
-                                Color.BLACK,
-                                0.35,
-                                true),
-                        new ShadowEffect(
-                                0,
-                                -1,
-                                0,
-                                Color.WHITE,
-                                0.35,
-                                true),
-                });
-            } else {
-                Util.drawEffects(g, tempImage, 0, 0, new Effect[] {
-                        new FillEffect(new Color(0x808080)),
-                });
-            }
-        }
-
-        g.dispose();
-        g2.dispose();
-
-        return outImage;
-    }
-
-    @Override
-    public void generate(String category, Map<String, Map<String, BufferedImage>> categoryMap,
-            GraphicGeneratorContext context, Options baseOptions, String name) {
-        TabOptions options = (TabOptions) baseOptions;
-        // Generate all permutations of tabOptions.selected and tabOptions.oldStyle
-        options.selected = true;
-        options.oldStyle = false;
-
-        String selectedLabelV5 = "Selected (v5+)";
-        String unselectedLabelV5 = "Unselected (v5+)";
-        String selectedLabel = "Selected";
-        String unselectedLabel = "Unselected";
-
-        boolean generateOldStyle = options.minSdk < 5;
-        if (generateOldStyle) {
-            options.oldStyle = true;
-            options.selected = true;
-            super.generate(selectedLabel, categoryMap, context, options, name);
-            options.selected = false;
-            super.generate(unselectedLabel, categoryMap, context, options, name);
-        }
-
-        options.oldStyle = false;
-        options.selected = true;
-        super.generate(generateOldStyle ? unselectedLabelV5 : unselectedLabel,
-                categoryMap, context, options, name);
-        options.selected = false;
-        super.generate(generateOldStyle ? selectedLabelV5 : selectedLabel,
-                categoryMap, context, options, name);
-    }
-
-    @Override
-    protected String getIconFolder(Options options) {
-        String folder = super.getIconFolder(options);
-
-        TabOptions tabOptions = (TabOptions) options;
-        if (tabOptions.oldStyle || options.minSdk >= 5) {
-            return folder;
-        } else {
-            return folder + "-v5"; //$NON-NLS-1$
-        }
-    }
-
-    @Override
-    protected String getIconName(Options options, String name) {
-        TabOptions tabOptions = (TabOptions) options;
-        if (tabOptions.selected) {
-            return name + "_selected.png"; //$NON-NLS-1$
-        } else {
-            return name + "_unselected.png"; //$NON-NLS-1$
-        }
-    }
-
-    /** Options specific to generating tab icons */
-    public static class TabOptions extends GraphicGenerator.Options {
-        /** Generate icon in the style used prior to v5 */
-        public boolean oldStyle;
-        /** Generate "selected" icon if true, and "unselected" icon if false */
-        public boolean selected = true;
-    }
-}
diff --git a/assetstudio/src/com/android/assetstudiolib/TextRenderUtil.java b/assetstudio/src/com/android/assetstudiolib/TextRenderUtil.java
deleted file mode 100644
index e08a234..0000000
--- a/assetstudio/src/com/android/assetstudiolib/TextRenderUtil.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.assetstudiolib;
-
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.font.FontRenderContext;
-import java.awt.font.TextLayout;
-import java.awt.geom.Rectangle2D;
-import java.awt.image.BufferedImage;
-
-/**
- * A set of utility classes for rendering text to a {@link BufferedImage}, suitable for use as a
- * source image to {@link GraphicGenerator} objects.
- */
-public class TextRenderUtil {
-    /**
-     * Renders the given string with the provided {@link Options} to a
-     * {@link BufferedImage}.
-     *
-     * @param text The text to render.
-     * @param paddingPercentage If nonzero, a percentage of the width or height
-     *            (whichever is smaller) to add as padding around the text
-     * @param options The optional parameters for rendering the text.
-     * @return An image, suitable for use as an input to a
-     *         {@link GraphicGenerator}.
-     */
-    public static BufferedImage renderTextImage(String text, int paddingPercentage,
-            Options options) {
-        if (options == null) {
-            options = new Options();
-        }
-
-        BufferedImage tempImage = Util.newArgbBufferedImage(1, 1);
-        if (text == null || text.equals("")) {
-            return tempImage;
-        }
-
-        Graphics2D tempG = (Graphics2D) tempImage.getGraphics();
-
-        Font font = options.font;
-        if (font == null) {
-            font = new Font(options.fontName, options.fontStyle, options.fontSize);
-            // Map<TextAttribute, Object> map = new Hashtable<TextAttribute, Object>();
-            // map.put(TextAttribute.TRACKING, 0.3);
-            // font = font.deriveFont(map);
-        }
-
-        FontRenderContext frc = tempG.getFontRenderContext();
-
-        TextLayout layout = new TextLayout(text, font, frc);
-        Rectangle2D bounds = layout.getBounds();
-
-        // The padding is a percentage relative to the overall minimum of the width or height
-        if (paddingPercentage != 0) {
-            double minDimension = Math.min(bounds.getWidth(), bounds.getHeight());
-            double delta = minDimension * paddingPercentage / 100;
-            bounds.setRect(bounds.getMinX() - delta, bounds.getMinY() - delta,
-                    bounds.getWidth() + 2 * delta, bounds.getHeight() + 2 * delta);
-        }
-
-        BufferedImage image = Util.newArgbBufferedImage(
-                Math.max(1, (int) bounds.getWidth()), Math.max(1, (int) bounds.getHeight()));
-        Graphics2D g = (Graphics2D) image.getGraphics();
-        g.setColor(new Color(options.foregroundColor, true));
-        g.setFont(font);
-
-        g.setRenderingHint(
-                RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-        g.setRenderingHint(
-                RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
-
-        g.drawString(text, (float) -bounds.getX(), (float) -bounds.getY());
-
-        g.dispose();
-        tempG.dispose();
-
-        return image;
-    }
-
-    /**
-     * The parameters for text rendering. There are no required values so a <code>new
-     * Options()</code> object is considered valid.
-     */
-    public static class Options {
-        // We use a large default font size to reduce the need to scale generated images up.
-        // TODO: Instead, a graphic generator should use a different source image for each density.
-        private static final int DEFAULT_FONT_SIZE = 512;
-
-        /** Foreground color to render text with, as an AARRGGBB packed integer */
-        public int foregroundColor = 0xFFFFFFFF;
-
-        /**
-         * The optional {@link Font} to use. If null, a {@link Font} object will be generated using
-         * the other options.
-         */
-        public Font font = null;
-
-        /**
-         * The optional font name. Defaults to {@link Font#SERIF}.
-         *
-         * @see Font#Font(String, int, int)
-         */
-        public String fontName = Font.SERIF;
-
-        /**
-         * The optional font styling (bold and/or italic). Defaults to no styling.
-         *
-         * @see Font#Font(String, int, int)
-         */
-        public int fontStyle = 0;
-
-        /**
-         * The optional font size, in points. Defaults to a very large font size, to prevent
-         * up-scaling rendered text.
-         *
-         * @see Font#Font(String, int, int)
-         */
-        public int fontSize = DEFAULT_FONT_SIZE;
-    }
-}
diff --git a/assetstudio/src/com/android/assetstudiolib/Util.java b/assetstudio/src/com/android/assetstudiolib/Util.java
deleted file mode 100644
index ee2a5f7..0000000
--- a/assetstudio/src/com/android/assetstudiolib/Util.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.assetstudiolib;
-
-import java.awt.AlphaComposite;
-import java.awt.Color;
-import java.awt.Composite;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Image;
-import java.awt.Paint;
-import java.awt.Rectangle;
-import java.awt.image.BufferedImage;
-import java.awt.image.BufferedImageOp;
-import java.awt.image.ConvolveOp;
-import java.awt.image.Kernel;
-import java.awt.image.Raster;
-import java.awt.image.RescaleOp;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A set of utility classes for manipulating {@link BufferedImage} objects and drawing them to
- * {@link Graphics2D} canvases.
- */
-public class Util {
-    /**
-     * Scales the given rectangle by the given scale factor.
-     *
-     * @param rect        The rectangle to scale.
-     * @param scaleFactor The factor to scale by.
-     * @return The scaled rectangle.
-     */
-    public static Rectangle scaleRectangle(Rectangle rect, float scaleFactor) {
-        return new Rectangle(
-                (int) Math.round(rect.x * scaleFactor),
-                (int) Math.round(rect.y * scaleFactor),
-                (int) Math.round(rect.width * scaleFactor),
-                (int) Math.round(rect.height * scaleFactor));
-    }
-
-    /**
-     * Creates a new ARGB {@link BufferedImage} of the given width and height.
-     *
-     * @param width  The width of the new image.
-     * @param height The height of the new image.
-     * @return The newly created image.
-     */
-    public static BufferedImage newArgbBufferedImage(int width, int height) {
-        return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
-    }
-
-    /**
-     * Smoothly scales the given {@link BufferedImage} to the given width and height using the
-     * {@link Image#SCALE_SMOOTH} algorithm (generally bicubic resampling or bilinear filtering).
-     *
-     * @param source The source image.
-     * @param width  The destination width to scale to.
-     * @param height The destination height to scale to.
-     * @return A new, scaled image.
-     */
-    public static BufferedImage scaledImage(BufferedImage source, int width, int height) {
-        Image scaledImage = source.getScaledInstance(width, height, Image.SCALE_SMOOTH);
-        BufferedImage scaledBufImage = new BufferedImage(width, height,
-                BufferedImage.TYPE_INT_ARGB);
-        Graphics g = scaledBufImage.createGraphics();
-        g.drawImage(scaledImage, 0, 0, null);
-        g.dispose();
-        return scaledBufImage;
-    }
-
-    /**
-     * Applies a gaussian blur of the given radius to the given {@link BufferedImage} using a kernel
-     * convolution.
-     *
-     * @param source The source image.
-     * @param radius The blur radius, in pixels.
-     * @return A new, blurred image, or the source image if no blur is performed.
-     */
-    public static BufferedImage blurredImage(BufferedImage source, double radius) {
-        if (radius == 0) {
-            return source;
-        }
-
-        final int r = (int) Math.ceil(radius);
-        final int rows = r * 2 + 1;
-        final float[] kernelData = new float[rows * rows];
-
-        final double sigma = radius / 3;
-        final double sigma22 = 2 * sigma * sigma;
-        final double sqrtPiSigma22 = Math.sqrt(Math.PI * sigma22);
-        final double radius2 = radius * radius;
-
-        double total = 0;
-        int index = 0;
-        double distance2;
-
-        int x, y;
-        for (y = -r; y <= r; y++) {
-            for (x = -r; x <= r; x++) {
-                distance2 = 1.0 * x * x + 1.0 * y * y;
-                if (distance2 > radius2) {
-                    kernelData[index] = 0;
-                } else {
-                    kernelData[index] = (float) (Math.exp(-distance2 / sigma22) / sqrtPiSigma22);
-                }
-                total += kernelData[index];
-                ++index;
-            }
-        }
-
-        for (index = 0; index < kernelData.length; index++) {
-            kernelData[index] /= total;
-        }
-
-        // We first pad the image so the kernel can operate at the edges.
-        BufferedImage paddedSource = paddedImage(source, r);
-        BufferedImage blurredPaddedImage = operatedImage(paddedSource, new ConvolveOp(
-                new Kernel(rows, rows, kernelData), ConvolveOp.EDGE_ZERO_FILL, null));
-        return blurredPaddedImage.getSubimage(r, r, source.getWidth(), source.getHeight());
-    }
-
-    /**
-     * Inverts the alpha channel of the given {@link BufferedImage}. RGB data for the inverted area
-     * are undefined, so it's generally best to fill the resulting image with a color.
-     *
-     * @param source The source image.
-     * @return A new image with an alpha channel inverted from the original.
-     */
-    public static BufferedImage invertedAlphaImage(BufferedImage source) {
-        final float[] scaleFactors = new float[]{1, 1, 1, -1};
-        final float[] offsets = new float[]{0, 0, 0, 255};
-
-        return operatedImage(source, new RescaleOp(scaleFactors, offsets, null));
-    }
-
-    /**
-     * Applies a {@link BufferedImageOp} on the given {@link BufferedImage}.
-     *
-     * @param source The source image.
-     * @param op     The operation to perform.
-     * @return A new image with the operation performed.
-     */
-    public static BufferedImage operatedImage(BufferedImage source, BufferedImageOp op) {
-        BufferedImage newImage = newArgbBufferedImage(source.getWidth(), source.getHeight());
-        Graphics2D g = (Graphics2D) newImage.getGraphics();
-        g.drawImage(source, op, 0, 0);
-        return newImage;
-    }
-
-    /**
-     * Fills the given {@link BufferedImage} with a {@link Paint}, preserving its alpha channel.
-     *
-     * @param source The source image.
-     * @param paint  The paint to fill with.
-     * @return A new, painted/filled image.
-     */
-    public static BufferedImage filledImage(BufferedImage source, Paint paint) {
-        BufferedImage newImage = newArgbBufferedImage(source.getWidth(), source.getHeight());
-        Graphics2D g = (Graphics2D) newImage.getGraphics();
-        g.drawImage(source, 0, 0, null);
-        g.setComposite(AlphaComposite.SrcAtop);
-        g.setPaint(paint);
-        g.fillRect(0, 0, source.getWidth(), source.getHeight());
-        return newImage;
-    }
-
-    /**
-     * Pads the given {@link BufferedImage} on all sides by the given padding amount.
-     *
-     * @param source  The source image.
-     * @param padding The amount to pad on all sides, in pixels.
-     * @return A new, padded image, or the source image if no padding is performed.
-     */
-    public static BufferedImage paddedImage(BufferedImage source, int padding) {
-        if (padding == 0) {
-            return source;
-        }
-
-        BufferedImage newImage = newArgbBufferedImage(
-                source.getWidth() + padding * 2, source.getHeight() + padding * 2);
-        Graphics2D g = (Graphics2D) newImage.getGraphics();
-        g.drawImage(source, padding, padding, null);
-        return newImage;
-    }
-
-    /**
-     * Trims the transparent pixels from the given {@link BufferedImage} (returns a sub-image).
-     *
-     * @param source The source image.
-     * @return A new, trimmed image, or the source image if no trim is performed.
-     */
-    public static BufferedImage trimmedImage(BufferedImage source) {
-        final int minAlpha = 1;
-        final int srcWidth = source.getWidth();
-        final int srcHeight = source.getHeight();
-        Raster raster = source.getRaster();
-        int l = srcWidth, t = srcHeight, r = 0, b = 0;
-
-        int alpha, x, y;
-        int[] pixel = new int[4];
-        for (y = 0; y < srcHeight; y++) {
-            for (x = 0; x < srcWidth; x++) {
-                raster.getPixel(x, y, pixel);
-                alpha = pixel[3];
-                if (alpha >= minAlpha) {
-                    l = Math.min(x, l);
-                    t = Math.min(y, t);
-                    r = Math.max(x, r);
-                    b = Math.max(y, b);
-                }
-            }
-        }
-
-        if (l > r || t > b) {
-            // No pixels, couldn't trim
-            return source;
-        }
-
-        return source.getSubimage(l, t, r - l + 1, b - t + 1);
-    }
-
-    /**
-     * Draws the given {@link BufferedImage} to the canvas, at the given coordinates, with the given
-     * {@link Effect}s applied. Note that drawn effects may be outside the bounds of the source
-     * image.
-     *
-     * @param g       The destination canvas.
-     * @param source  The source image.
-     * @param x       The x offset at which to draw the image.
-     * @param y       The y offset at which to draw the image.
-     * @param effects The list of effects to apply.
-     */
-    public static void drawEffects(Graphics2D g, BufferedImage source, int x, int y,
-            Effect[] effects) {
-        List<ShadowEffect> shadowEffects = new ArrayList<ShadowEffect>();
-        List<FillEffect> fillEffects = new ArrayList<FillEffect>();
-
-        for (Effect effect : effects) {
-            if (effect instanceof ShadowEffect) {
-                shadowEffects.add((ShadowEffect) effect);
-            } else if (effect instanceof FillEffect) {
-                fillEffects.add((FillEffect) effect);
-            }
-        }
-
-        Composite oldComposite = g.getComposite();
-        for (ShadowEffect effect : shadowEffects) {
-            if (effect.inner) {
-                continue;
-            }
-
-            // Outer shadow
-            g.setComposite(AlphaComposite.getInstance(
-                    AlphaComposite.SRC_OVER, (float) effect.opacity));
-            g.drawImage(
-                    filledImage(
-                            blurredImage(source, effect.radius),
-                            effect.color),
-                    (int) effect.xOffset, (int) effect.yOffset, null);
-        }
-        g.setComposite(oldComposite);
-
-        // Inner shadow & fill effects.
-        final Rectangle imageRect = new Rectangle(0, 0, source.getWidth(), source.getHeight());
-        BufferedImage out = newArgbBufferedImage(imageRect.width, imageRect.height);
-        Graphics2D g2 = (Graphics2D) out.getGraphics();
-        double fillOpacity = 1.0;
-
-        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
-        g2.drawImage(source, 0, 0, null);
-        g2.setComposite(AlphaComposite.SrcAtop);
-
-        // Gradient fill
-        for (FillEffect effect : fillEffects) {
-            g2.setPaint(effect.paint);
-            g2.fillRect(0, 0, imageRect.width, imageRect.height);
-            fillOpacity = Math.max(0, Math.min(1, effect.opacity));
-        }
-
-        // Inner shadows
-        for (ShadowEffect effect : shadowEffects) {
-            if (!effect.inner) {
-                continue;
-            }
-
-            BufferedImage innerShadowImage = newArgbBufferedImage(
-                    imageRect.width, imageRect.height);
-            Graphics2D g3 = (Graphics2D) innerShadowImage.getGraphics();
-            g3.drawImage(source, (int) effect.xOffset, (int) effect.yOffset, null);
-            g2.setComposite(AlphaComposite.getInstance(
-                    AlphaComposite.SRC_ATOP, (float) effect.opacity));
-            g2.drawImage(
-                    filledImage(
-                            blurredImage(invertedAlphaImage(innerShadowImage), effect.radius),
-                            effect.color),
-                    0, 0, null);
-        }
-
-        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) fillOpacity));
-        g.drawImage(out, x, y, null);
-        g.setComposite(oldComposite);
-    }
-
-    /**
-     * Draws the given {@link BufferedImage} to the canvas, centered, wholly contained within the
-     * bounds defined by the destination rectangle, and with preserved aspect ratio.
-     *
-     * @param g       The destination canvas.
-     * @param source  The source image.
-     * @param dstRect The destination rectangle in the destination canvas into which to draw the
-     *                image.
-     */
-    public static void drawCenterInside(Graphics2D g, BufferedImage source, Rectangle dstRect) {
-        final int srcWidth = source.getWidth();
-        final int srcHeight = source.getHeight();
-        if (srcWidth * 1.0 / srcHeight > dstRect.width * 1.0 / dstRect.height) {
-            final int scaledWidth = Math.max(1, dstRect.width);
-            final int scaledHeight = Math.max(1, dstRect.width * srcHeight / srcWidth);
-            Image scaledImage = scaledImage(source, scaledWidth, scaledHeight);
-            g.drawImage(scaledImage,
-                    dstRect.x,
-                    dstRect.y + (dstRect.height - scaledHeight) / 2,
-                    dstRect.x + dstRect.width,
-                    dstRect.y + (dstRect.height - scaledHeight) / 2 + scaledHeight,
-                    0,
-                    0,
-                    0 + scaledWidth,
-                    0 + scaledHeight,
-                    null);
-        } else {
-            final int scaledWidth = Math.max(1, dstRect.height * srcWidth / srcHeight);
-            final int scaledHeight = Math.max(1, dstRect.height);
-            Image scaledImage = scaledImage(source, scaledWidth, scaledHeight);
-            g.drawImage(scaledImage,
-                    dstRect.x + (dstRect.width - scaledWidth) / 2,
-                    dstRect.y,
-                    dstRect.x + (dstRect.width - scaledWidth) / 2 + scaledWidth,
-                    dstRect.y + dstRect.height,
-                    0,
-                    0,
-                    0 + scaledWidth,
-                    0 + scaledHeight,
-                    null);
-        }
-    }
-
-    /**
-     * Draws the given {@link BufferedImage} to the canvas, centered and cropped to fill the
-     * bounds defined by the destination rectangle, and with preserved aspect ratio.
-     *
-     * @param g       The destination canvas.
-     * @param source  The source image.
-     * @param dstRect The destination rectangle in the destination canvas into which to draw the
-     *                image.
-     */
-    public static void drawCenterCrop(Graphics2D g, BufferedImage source, Rectangle dstRect) {
-        final int srcWidth = source.getWidth();
-        final int srcHeight = source.getHeight();
-        if (srcWidth * 1.0 / srcHeight > dstRect.width * 1.0 / dstRect.height) {
-            final int scaledWidth = dstRect.height * srcWidth / srcHeight;
-            final int scaledHeight = dstRect.height;
-            Image scaledImage = scaledImage(source, scaledWidth, scaledHeight);
-            g.drawImage(scaledImage,
-                    dstRect.x,
-                    dstRect.y,
-                    dstRect.x + dstRect.width,
-                    dstRect.y + dstRect.height,
-                    0 + (scaledWidth - dstRect.width) / 2,
-                    0,
-                    0 + (scaledWidth - dstRect.width) / 2 + dstRect.width,
-                    0 + dstRect.height,
-                    null);
-        } else {
-            final int scaledWidth = dstRect.width;
-            final int scaledHeight = dstRect.width * srcHeight / srcWidth;
-            Image scaledImage = scaledImage(source, scaledWidth, scaledHeight);
-            g.drawImage(scaledImage,
-                    dstRect.x,
-                    dstRect.y,
-                    dstRect.x + dstRect.width,
-                    dstRect.y + dstRect.height,
-                    0,
-                    0 + (scaledHeight - dstRect.height) / 2,
-                    0 + dstRect.width,
-                    0 + (scaledHeight - dstRect.height) / 2 + dstRect.height,
-                    null);
-        }
-    }
-
-    /**
-     * An effect to apply in
-     * {@link Util#drawEffects(java.awt.Graphics2D, java.awt.image.BufferedImage, int, int, Util.Effect[])}
-     */
-    public static abstract class Effect {
-    }
-
-    /**
-     * An inner or outer shadow.
-     */
-    public static class ShadowEffect extends Effect {
-        public double xOffset;
-        public double yOffset;
-        public double radius;
-        public Color color;
-        public double opacity;
-        public boolean inner;
-
-        public ShadowEffect(double xOffset, double yOffset, double radius, Color color,
-                double opacity, boolean inner) {
-            this.xOffset = xOffset;
-            this.yOffset = yOffset;
-            this.radius = radius;
-            this.color = color;
-            this.opacity = opacity;
-            this.inner = inner;
-        }
-    }
-
-    /**
-     * A fill, defined by a paint.
-     */
-    public static class FillEffect extends Effect {
-        public Paint paint;
-        public double opacity;
-
-        public FillEffect(Paint paint, double opacity) {
-            this.paint = paint;
-            this.opacity = opacity;
-        }
-
-        public FillEffect(Paint paint) {
-            this.paint = paint;
-            this.opacity = 1.0;
-        }
-    }
-}
diff --git a/assetstudio/src/images/clipart/big/1-navigation-accept.png b/assetstudio/src/images/clipart/big/1-navigation-accept.png
deleted file mode 100644
index 121b347..0000000
--- a/assetstudio/src/images/clipart/big/1-navigation-accept.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/1-navigation-back.png b/assetstudio/src/images/clipart/big/1-navigation-back.png
deleted file mode 100644
index 863074c..0000000
--- a/assetstudio/src/images/clipart/big/1-navigation-back.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/1-navigation-cancel.png b/assetstudio/src/images/clipart/big/1-navigation-cancel.png
deleted file mode 100644
index d968d34..0000000
--- a/assetstudio/src/images/clipart/big/1-navigation-cancel.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/1-navigation-collapse.png b/assetstudio/src/images/clipart/big/1-navigation-collapse.png
deleted file mode 100644
index e525983..0000000
--- a/assetstudio/src/images/clipart/big/1-navigation-collapse.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/1-navigation-expand.png b/assetstudio/src/images/clipart/big/1-navigation-expand.png
deleted file mode 100644
index f5b0728..0000000
--- a/assetstudio/src/images/clipart/big/1-navigation-expand.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/1-navigation-forward.png b/assetstudio/src/images/clipart/big/1-navigation-forward.png
deleted file mode 100644
index 4cae802..0000000
--- a/assetstudio/src/images/clipart/big/1-navigation-forward.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/1-navigation-next-item.png b/assetstudio/src/images/clipart/big/1-navigation-next-item.png
deleted file mode 100644
index a1b8b83..0000000
--- a/assetstudio/src/images/clipart/big/1-navigation-next-item.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/1-navigation-previous-item.png b/assetstudio/src/images/clipart/big/1-navigation-previous-item.png
deleted file mode 100644
index 9312bf6..0000000
--- a/assetstudio/src/images/clipart/big/1-navigation-previous-item.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/1-navigation-refresh.png b/assetstudio/src/images/clipart/big/1-navigation-refresh.png
deleted file mode 100644
index b5202f9..0000000
--- a/assetstudio/src/images/clipart/big/1-navigation-refresh.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-accounts.png b/assetstudio/src/images/clipart/big/10-device-access-accounts.png
deleted file mode 100644
index 64544c5..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-accounts.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-add-alarm.png b/assetstudio/src/images/clipart/big/10-device-access-add-alarm.png
deleted file mode 100644
index bd4bcc3..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-add-alarm.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-alarms.png b/assetstudio/src/images/clipart/big/10-device-access-alarms.png
deleted file mode 100644
index a5b1ead..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-alarms.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-battery.png b/assetstudio/src/images/clipart/big/10-device-access-battery.png
deleted file mode 100644
index d86b2c1..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-battery.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-bightness-low.png b/assetstudio/src/images/clipart/big/10-device-access-bightness-low.png
deleted file mode 100644
index 738f203..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-bightness-low.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-bluetooth-connected.png b/assetstudio/src/images/clipart/big/10-device-access-bluetooth-connected.png
deleted file mode 100644
index 403a0b5..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-bluetooth-connected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-bluetooth-searching.png b/assetstudio/src/images/clipart/big/10-device-access-bluetooth-searching.png
deleted file mode 100644
index a99f65a..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-bluetooth-searching.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-bluetooth.png b/assetstudio/src/images/clipart/big/10-device-access-bluetooth.png
deleted file mode 100644
index 556499d..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-bluetooth.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-brightness-auto.png b/assetstudio/src/images/clipart/big/10-device-access-brightness-auto.png
deleted file mode 100644
index 46d2b8a..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-brightness-auto.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-brightness-high.png b/assetstudio/src/images/clipart/big/10-device-access-brightness-high.png
deleted file mode 100644
index 97e3f19..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-brightness-high.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-brightness-medium.png b/assetstudio/src/images/clipart/big/10-device-access-brightness-medium.png
deleted file mode 100644
index 5e361cb..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-brightness-medium.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-call.png b/assetstudio/src/images/clipart/big/10-device-access-call.png
deleted file mode 100644
index 940bcb6..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-call.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-camera.png b/assetstudio/src/images/clipart/big/10-device-access-camera.png
deleted file mode 100644
index ad8857a..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-camera.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-data-usage.png b/assetstudio/src/images/clipart/big/10-device-access-data-usage.png
deleted file mode 100644
index 9fa73a5..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-data-usage.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-dial-pad.png b/assetstudio/src/images/clipart/big/10-device-access-dial-pad.png
deleted file mode 100644
index 81da080..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-dial-pad.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-end-call.png b/assetstudio/src/images/clipart/big/10-device-access-end-call.png
deleted file mode 100644
index c28f284..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-end-call.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-flash-automatic.png b/assetstudio/src/images/clipart/big/10-device-access-flash-automatic.png
deleted file mode 100644
index e5c2c03..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-flash-automatic.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-flash-off.png b/assetstudio/src/images/clipart/big/10-device-access-flash-off.png
deleted file mode 100644
index dfcb747..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-flash-off.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-flash-on.png b/assetstudio/src/images/clipart/big/10-device-access-flash-on.png
deleted file mode 100644
index 1109aa0..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-flash-on.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-location-found.png b/assetstudio/src/images/clipart/big/10-device-access-location-found.png
deleted file mode 100644
index d829a3c..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-location-found.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-location-off.png b/assetstudio/src/images/clipart/big/10-device-access-location-off.png
deleted file mode 100644
index e58c258..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-location-off.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-location-searching.png b/assetstudio/src/images/clipart/big/10-device-access-location-searching.png
deleted file mode 100644
index 3de2f26..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-location-searching.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-mic-muted.png b/assetstudio/src/images/clipart/big/10-device-access-mic-muted.png
deleted file mode 100644
index 65b4ae6..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-mic-muted.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-mic.png b/assetstudio/src/images/clipart/big/10-device-access-mic.png
deleted file mode 100644
index 02c1ee8..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-mic.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-network-cell.png b/assetstudio/src/images/clipart/big/10-device-access-network-cell.png
deleted file mode 100644
index 9d60dbd..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-network-cell.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-network-wifi.png b/assetstudio/src/images/clipart/big/10-device-access-network-wifi.png
deleted file mode 100644
index 577abdb..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-network-wifi.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-new-account.png b/assetstudio/src/images/clipart/big/10-device-access-new-account.png
deleted file mode 100644
index d9707d8..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-new-account.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-not-secure.png b/assetstudio/src/images/clipart/big/10-device-access-not-secure.png
deleted file mode 100644
index 2ea293a..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-not-secure.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-ring-volume.png b/assetstudio/src/images/clipart/big/10-device-access-ring-volume.png
deleted file mode 100644
index 9d19f89..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-ring-volume.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-screen-locked-to-landscape.png b/assetstudio/src/images/clipart/big/10-device-access-screen-locked-to-landscape.png
deleted file mode 100644
index c702480..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-screen-locked-to-landscape.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-screen-locked-to-portrait.png b/assetstudio/src/images/clipart/big/10-device-access-screen-locked-to-portrait.png
deleted file mode 100644
index f66923c..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-screen-locked-to-portrait.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-screen-rotation.png b/assetstudio/src/images/clipart/big/10-device-access-screen-rotation.png
deleted file mode 100644
index 22e0fcb..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-screen-rotation.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-sd-storage.png b/assetstudio/src/images/clipart/big/10-device-access-sd-storage.png
deleted file mode 100644
index cbde363..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-sd-storage.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-secure.png b/assetstudio/src/images/clipart/big/10-device-access-secure.png
deleted file mode 100644
index 83f4f7d..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-secure.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-storage.png b/assetstudio/src/images/clipart/big/10-device-access-storage.png
deleted file mode 100644
index 5addbad..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-storage.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-switch-camera.png b/assetstudio/src/images/clipart/big/10-device-access-switch-camera.png
deleted file mode 100644
index 8b2a2e3..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-switch-camera.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-switch-video.png b/assetstudio/src/images/clipart/big/10-device-access-switch-video.png
deleted file mode 100644
index a2919f1..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-switch-video.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-time.png b/assetstudio/src/images/clipart/big/10-device-access-time.png
deleted file mode 100644
index aa21482..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-time.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-usb.png b/assetstudio/src/images/clipart/big/10-device-access-usb.png
deleted file mode 100644
index ba01983..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-usb.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-video.png b/assetstudio/src/images/clipart/big/10-device-access-video.png
deleted file mode 100644
index e18c6bd..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-video.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-volume-muted.png b/assetstudio/src/images/clipart/big/10-device-access-volume-muted.png
deleted file mode 100644
index 10433a7..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-volume-muted.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/10-device-access-volume-on.png b/assetstudio/src/images/clipart/big/10-device-access-volume-on.png
deleted file mode 100644
index bc86a7b..0000000
--- a/assetstudio/src/images/clipart/big/10-device-access-volume-on.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/11-alerts-and-states-airplane-mode-off.png b/assetstudio/src/images/clipart/big/11-alerts-and-states-airplane-mode-off.png
deleted file mode 100644
index f7db5e8..0000000
--- a/assetstudio/src/images/clipart/big/11-alerts-and-states-airplane-mode-off.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/11-alerts-and-states-airplane-mode-on.png b/assetstudio/src/images/clipart/big/11-alerts-and-states-airplane-mode-on.png
deleted file mode 100644
index 7e8bf73..0000000
--- a/assetstudio/src/images/clipart/big/11-alerts-and-states-airplane-mode-on.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/11-alerts-and-states-error.png b/assetstudio/src/images/clipart/big/11-alerts-and-states-error.png
deleted file mode 100644
index 24335f9..0000000
--- a/assetstudio/src/images/clipart/big/11-alerts-and-states-error.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/11-alerts-and-states-warning.png b/assetstudio/src/images/clipart/big/11-alerts-and-states-warning.png
deleted file mode 100644
index be321f4..0000000
--- a/assetstudio/src/images/clipart/big/11-alerts-and-states-warning.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/12-hardware-computer.png b/assetstudio/src/images/clipart/big/12-hardware-computer.png
deleted file mode 100644
index 6170018..0000000
--- a/assetstudio/src/images/clipart/big/12-hardware-computer.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/12-hardware-dock.png b/assetstudio/src/images/clipart/big/12-hardware-dock.png
deleted file mode 100644
index c2fc8c8..0000000
--- a/assetstudio/src/images/clipart/big/12-hardware-dock.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/12-hardware-gamepad.png b/assetstudio/src/images/clipart/big/12-hardware-gamepad.png
deleted file mode 100644
index 3ddc322..0000000
--- a/assetstudio/src/images/clipart/big/12-hardware-gamepad.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/12-hardware-headphones.png b/assetstudio/src/images/clipart/big/12-hardware-headphones.png
deleted file mode 100644
index e7bce69..0000000
--- a/assetstudio/src/images/clipart/big/12-hardware-headphones.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/12-hardware-headset.png b/assetstudio/src/images/clipart/big/12-hardware-headset.png
deleted file mode 100644
index 29f659b..0000000
--- a/assetstudio/src/images/clipart/big/12-hardware-headset.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/12-hardware-keyboard.png b/assetstudio/src/images/clipart/big/12-hardware-keyboard.png
deleted file mode 100644
index 4a2bf70..0000000
--- a/assetstudio/src/images/clipart/big/12-hardware-keyboard.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/12-hardware-mouse.png b/assetstudio/src/images/clipart/big/12-hardware-mouse.png
deleted file mode 100644
index 2bf8c05..0000000
--- a/assetstudio/src/images/clipart/big/12-hardware-mouse.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/12-hardware-phone.png b/assetstudio/src/images/clipart/big/12-hardware-phone.png
deleted file mode 100644
index 423fe65..0000000
--- a/assetstudio/src/images/clipart/big/12-hardware-phone.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/2-action-about.png b/assetstudio/src/images/clipart/big/2-action-about.png
deleted file mode 100644
index 6d43316..0000000
--- a/assetstudio/src/images/clipart/big/2-action-about.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/2-action-help.png b/assetstudio/src/images/clipart/big/2-action-help.png
deleted file mode 100644
index 16eb8ef..0000000
--- a/assetstudio/src/images/clipart/big/2-action-help.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/2-action-search.png b/assetstudio/src/images/clipart/big/2-action-search.png
deleted file mode 100644
index 9345a06..0000000
--- a/assetstudio/src/images/clipart/big/2-action-search.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/2-action-settings.png b/assetstudio/src/images/clipart/big/2-action-settings.png
deleted file mode 100644
index a049ca0..0000000
--- a/assetstudio/src/images/clipart/big/2-action-settings.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/3-rating-bad.png b/assetstudio/src/images/clipart/big/3-rating-bad.png
deleted file mode 100644
index 1ab8c5b..0000000
--- a/assetstudio/src/images/clipart/big/3-rating-bad.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/3-rating-favorite.png b/assetstudio/src/images/clipart/big/3-rating-favorite.png
deleted file mode 100644
index 9b68720..0000000
--- a/assetstudio/src/images/clipart/big/3-rating-favorite.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/3-rating-good.png b/assetstudio/src/images/clipart/big/3-rating-good.png
deleted file mode 100644
index c72826b..0000000
--- a/assetstudio/src/images/clipart/big/3-rating-good.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/3-rating-half-important.png b/assetstudio/src/images/clipart/big/3-rating-half-important.png
deleted file mode 100644
index 2110a0f..0000000
--- a/assetstudio/src/images/clipart/big/3-rating-half-important.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/3-rating-important.png b/assetstudio/src/images/clipart/big/3-rating-important.png
deleted file mode 100644
index dbad544..0000000
--- a/assetstudio/src/images/clipart/big/3-rating-important.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/3-rating-not-important.png b/assetstudio/src/images/clipart/big/3-rating-not-important.png
deleted file mode 100644
index f7cf26f..0000000
--- a/assetstudio/src/images/clipart/big/3-rating-not-important.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/4-collections-cloud.png b/assetstudio/src/images/clipart/big/4-collections-cloud.png
deleted file mode 100644
index a2cedbf..0000000
--- a/assetstudio/src/images/clipart/big/4-collections-cloud.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/4-collections-collection.png b/assetstudio/src/images/clipart/big/4-collections-collection.png
deleted file mode 100644
index dfb2508..0000000
--- a/assetstudio/src/images/clipart/big/4-collections-collection.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/4-collections-go-to-today.png b/assetstudio/src/images/clipart/big/4-collections-go-to-today.png
deleted file mode 100644
index b4971ca..0000000
--- a/assetstudio/src/images/clipart/big/4-collections-go-to-today.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/4-collections-labels.png b/assetstudio/src/images/clipart/big/4-collections-labels.png
deleted file mode 100644
index 16f35a8..0000000
--- a/assetstudio/src/images/clipart/big/4-collections-labels.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/4-collections-new-label.png b/assetstudio/src/images/clipart/big/4-collections-new-label.png
deleted file mode 100644
index cbf02af..0000000
--- a/assetstudio/src/images/clipart/big/4-collections-new-label.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/4-collections-sort-by-size.png b/assetstudio/src/images/clipart/big/4-collections-sort-by-size.png
deleted file mode 100644
index 10aec0d..0000000
--- a/assetstudio/src/images/clipart/big/4-collections-sort-by-size.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/4-collections-view-as-grid.png b/assetstudio/src/images/clipart/big/4-collections-view-as-grid.png
deleted file mode 100644
index 10a8fe3..0000000
--- a/assetstudio/src/images/clipart/big/4-collections-view-as-grid.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/4-collections-view-as-list.png b/assetstudio/src/images/clipart/big/4-collections-view-as-list.png
deleted file mode 100644
index 5cf08e4..0000000
--- a/assetstudio/src/images/clipart/big/4-collections-view-as-list.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-attachment.png b/assetstudio/src/images/clipart/big/5-content-attachment.png
deleted file mode 100644
index 92e6726..0000000
--- a/assetstudio/src/images/clipart/big/5-content-attachment.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-backspace.png b/assetstudio/src/images/clipart/big/5-content-backspace.png
deleted file mode 100644
index 9a7e456..0000000
--- a/assetstudio/src/images/clipart/big/5-content-backspace.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-copy.png b/assetstudio/src/images/clipart/big/5-content-copy.png
deleted file mode 100644
index 284a5ce..0000000
--- a/assetstudio/src/images/clipart/big/5-content-copy.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-cut.png b/assetstudio/src/images/clipart/big/5-content-cut.png
deleted file mode 100644
index 18d1763..0000000
--- a/assetstudio/src/images/clipart/big/5-content-cut.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-discard.png b/assetstudio/src/images/clipart/big/5-content-discard.png
deleted file mode 100644
index e40e1fe..0000000
--- a/assetstudio/src/images/clipart/big/5-content-discard.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-edit.png b/assetstudio/src/images/clipart/big/5-content-edit.png
deleted file mode 100644
index f75157c..0000000
--- a/assetstudio/src/images/clipart/big/5-content-edit.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-email.png b/assetstudio/src/images/clipart/big/5-content-email.png
deleted file mode 100644
index 6bec626..0000000
--- a/assetstudio/src/images/clipart/big/5-content-email.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-event.png b/assetstudio/src/images/clipart/big/5-content-event.png
deleted file mode 100644
index dc4ed94..0000000
--- a/assetstudio/src/images/clipart/big/5-content-event.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-import-export.png b/assetstudio/src/images/clipart/big/5-content-import-export.png
deleted file mode 100644
index 7dcd6b0..0000000
--- a/assetstudio/src/images/clipart/big/5-content-import-export.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-merge.png b/assetstudio/src/images/clipart/big/5-content-merge.png
deleted file mode 100644
index 45ca498..0000000
--- a/assetstudio/src/images/clipart/big/5-content-merge.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-new-attachment.png b/assetstudio/src/images/clipart/big/5-content-new-attachment.png
deleted file mode 100644
index 3e441d8..0000000
--- a/assetstudio/src/images/clipart/big/5-content-new-attachment.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-new-email.png b/assetstudio/src/images/clipart/big/5-content-new-email.png
deleted file mode 100644
index fdcd64b..0000000
--- a/assetstudio/src/images/clipart/big/5-content-new-email.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-new-event.png b/assetstudio/src/images/clipart/big/5-content-new-event.png
deleted file mode 100644
index 29ef513..0000000
--- a/assetstudio/src/images/clipart/big/5-content-new-event.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-new-picture.png b/assetstudio/src/images/clipart/big/5-content-new-picture.png
deleted file mode 100644
index 1975219..0000000
--- a/assetstudio/src/images/clipart/big/5-content-new-picture.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-new.png b/assetstudio/src/images/clipart/big/5-content-new.png
deleted file mode 100644
index 9bb4337..0000000
--- a/assetstudio/src/images/clipart/big/5-content-new.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-paste.png b/assetstudio/src/images/clipart/big/5-content-paste.png
deleted file mode 100644
index f9393c0..0000000
--- a/assetstudio/src/images/clipart/big/5-content-paste.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-picture.png b/assetstudio/src/images/clipart/big/5-content-picture.png
deleted file mode 100644
index dc3251b..0000000
--- a/assetstudio/src/images/clipart/big/5-content-picture.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-read.png b/assetstudio/src/images/clipart/big/5-content-read.png
deleted file mode 100644
index 0a48d75..0000000
--- a/assetstudio/src/images/clipart/big/5-content-read.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-remove.png b/assetstudio/src/images/clipart/big/5-content-remove.png
deleted file mode 100644
index d968d34..0000000
--- a/assetstudio/src/images/clipart/big/5-content-remove.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-save.png b/assetstudio/src/images/clipart/big/5-content-save.png
deleted file mode 100644
index befe49a..0000000
--- a/assetstudio/src/images/clipart/big/5-content-save.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-select-all.png b/assetstudio/src/images/clipart/big/5-content-select-all.png
deleted file mode 100644
index 572b2b5..0000000
--- a/assetstudio/src/images/clipart/big/5-content-select-all.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-split.png b/assetstudio/src/images/clipart/big/5-content-split.png
deleted file mode 100644
index 7e5d059..0000000
--- a/assetstudio/src/images/clipart/big/5-content-split.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-undo.png b/assetstudio/src/images/clipart/big/5-content-undo.png
deleted file mode 100644
index 07fc7d8..0000000
--- a/assetstudio/src/images/clipart/big/5-content-undo.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/5-content-unread.png b/assetstudio/src/images/clipart/big/5-content-unread.png
deleted file mode 100644
index 41ba9e2..0000000
--- a/assetstudio/src/images/clipart/big/5-content-unread.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/6-social-add-group.png b/assetstudio/src/images/clipart/big/6-social-add-group.png
deleted file mode 100644
index 7822f4f..0000000
--- a/assetstudio/src/images/clipart/big/6-social-add-group.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/6-social-add-person.png b/assetstudio/src/images/clipart/big/6-social-add-person.png
deleted file mode 100644
index b335788..0000000
--- a/assetstudio/src/images/clipart/big/6-social-add-person.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/6-social-cc-bcc.png b/assetstudio/src/images/clipart/big/6-social-cc-bcc.png
deleted file mode 100644
index 4db30a7..0000000
--- a/assetstudio/src/images/clipart/big/6-social-cc-bcc.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/6-social-chat.png b/assetstudio/src/images/clipart/big/6-social-chat.png
deleted file mode 100644
index b0cccb3..0000000
--- a/assetstudio/src/images/clipart/big/6-social-chat.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/6-social-forward.png b/assetstudio/src/images/clipart/big/6-social-forward.png
deleted file mode 100644
index a5abbfc..0000000
--- a/assetstudio/src/images/clipart/big/6-social-forward.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/6-social-group.png b/assetstudio/src/images/clipart/big/6-social-group.png
deleted file mode 100644
index 1b18678..0000000
--- a/assetstudio/src/images/clipart/big/6-social-group.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/6-social-person.png b/assetstudio/src/images/clipart/big/6-social-person.png
deleted file mode 100644
index 27ade22..0000000
--- a/assetstudio/src/images/clipart/big/6-social-person.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/6-social-reply-all.png b/assetstudio/src/images/clipart/big/6-social-reply-all.png
deleted file mode 100644
index c2a87c6..0000000
--- a/assetstudio/src/images/clipart/big/6-social-reply-all.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/6-social-reply.png b/assetstudio/src/images/clipart/big/6-social-reply.png
deleted file mode 100644
index 550aa80..0000000
--- a/assetstudio/src/images/clipart/big/6-social-reply.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/6-social-send-now.png b/assetstudio/src/images/clipart/big/6-social-send-now.png
deleted file mode 100644
index c3dad3c..0000000
--- a/assetstudio/src/images/clipart/big/6-social-send-now.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/6-social-share.png b/assetstudio/src/images/clipart/big/6-social-share.png
deleted file mode 100644
index b664970..0000000
--- a/assetstudio/src/images/clipart/big/6-social-share.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/7-location-directions.png b/assetstudio/src/images/clipart/big/7-location-directions.png
deleted file mode 100644
index c0e67e4..0000000
--- a/assetstudio/src/images/clipart/big/7-location-directions.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/7-location-map.png b/assetstudio/src/images/clipart/big/7-location-map.png
deleted file mode 100644
index e32dc26..0000000
--- a/assetstudio/src/images/clipart/big/7-location-map.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/7-location-place.png b/assetstudio/src/images/clipart/big/7-location-place.png
deleted file mode 100644
index fec173c..0000000
--- a/assetstudio/src/images/clipart/big/7-location-place.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/7-location-web-site.png b/assetstudio/src/images/clipart/big/7-location-web-site.png
deleted file mode 100644
index 4ef24a3..0000000
--- a/assetstudio/src/images/clipart/big/7-location-web-site.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/8-images-crop.png b/assetstudio/src/images/clipart/big/8-images-crop.png
deleted file mode 100644
index bd44bf9..0000000
--- a/assetstudio/src/images/clipart/big/8-images-crop.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/8-images-rotate-left.png b/assetstudio/src/images/clipart/big/8-images-rotate-left.png
deleted file mode 100644
index 0410adb..0000000
--- a/assetstudio/src/images/clipart/big/8-images-rotate-left.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/8-images-rotate-right.png b/assetstudio/src/images/clipart/big/8-images-rotate-right.png
deleted file mode 100644
index abcff9c..0000000
--- a/assetstudio/src/images/clipart/big/8-images-rotate-right.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/8-images-slideshow.png b/assetstudio/src/images/clipart/big/8-images-slideshow.png
deleted file mode 100644
index 94e47b4..0000000
--- a/assetstudio/src/images/clipart/big/8-images-slideshow.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-add-to-queue.png b/assetstudio/src/images/clipart/big/9-av-add-to-queue.png
deleted file mode 100644
index 57b2e61..0000000
--- a/assetstudio/src/images/clipart/big/9-av-add-to-queue.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-download.png b/assetstudio/src/images/clipart/big/9-av-download.png
deleted file mode 100644
index 46a1919..0000000
--- a/assetstudio/src/images/clipart/big/9-av-download.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-fast-forward.png b/assetstudio/src/images/clipart/big/9-av-fast-forward.png
deleted file mode 100644
index f820f5a..0000000
--- a/assetstudio/src/images/clipart/big/9-av-fast-forward.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-full-screen.png b/assetstudio/src/images/clipart/big/9-av-full-screen.png
deleted file mode 100644
index 1dfd01a..0000000
--- a/assetstudio/src/images/clipart/big/9-av-full-screen.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-make-available-offline.png b/assetstudio/src/images/clipart/big/9-av-make-available-offline.png
deleted file mode 100644
index 2efcb11..0000000
--- a/assetstudio/src/images/clipart/big/9-av-make-available-offline.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-next.png b/assetstudio/src/images/clipart/big/9-av-next.png
deleted file mode 100644
index 871587c..0000000
--- a/assetstudio/src/images/clipart/big/9-av-next.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-pause-over-video.png b/assetstudio/src/images/clipart/big/9-av-pause-over-video.png
deleted file mode 100644
index a2665f2..0000000
--- a/assetstudio/src/images/clipart/big/9-av-pause-over-video.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-pause.png b/assetstudio/src/images/clipart/big/9-av-pause.png
deleted file mode 100644
index 506b1d4..0000000
--- a/assetstudio/src/images/clipart/big/9-av-pause.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-play-over-video.png b/assetstudio/src/images/clipart/big/9-av-play-over-video.png
deleted file mode 100644
index 3db3a1a..0000000
--- a/assetstudio/src/images/clipart/big/9-av-play-over-video.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-play.png b/assetstudio/src/images/clipart/big/9-av-play.png
deleted file mode 100644
index 0c12f86..0000000
--- a/assetstudio/src/images/clipart/big/9-av-play.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-previous.png b/assetstudio/src/images/clipart/big/9-av-previous.png
deleted file mode 100644
index 28f2596..0000000
--- a/assetstudio/src/images/clipart/big/9-av-previous.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-repeat.png b/assetstudio/src/images/clipart/big/9-av-repeat.png
deleted file mode 100644
index 9a7a79a..0000000
--- a/assetstudio/src/images/clipart/big/9-av-repeat.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-replay.png b/assetstudio/src/images/clipart/big/9-av-replay.png
deleted file mode 100644
index ce9df7f..0000000
--- a/assetstudio/src/images/clipart/big/9-av-replay.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-return-from-full-screen.png b/assetstudio/src/images/clipart/big/9-av-return-from-full-screen.png
deleted file mode 100644
index 24725c0..0000000
--- a/assetstudio/src/images/clipart/big/9-av-return-from-full-screen.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-rewind.png b/assetstudio/src/images/clipart/big/9-av-rewind.png
deleted file mode 100644
index b09f61a..0000000
--- a/assetstudio/src/images/clipart/big/9-av-rewind.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-shuffle.png b/assetstudio/src/images/clipart/big/9-av-shuffle.png
deleted file mode 100644
index 6e90f7c..0000000
--- a/assetstudio/src/images/clipart/big/9-av-shuffle.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-stop.png b/assetstudio/src/images/clipart/big/9-av-stop.png
deleted file mode 100644
index 9ba88ee..0000000
--- a/assetstudio/src/images/clipart/big/9-av-stop.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/9-av-upload.png b/assetstudio/src/images/clipart/big/9-av-upload.png
deleted file mode 100644
index 41da601..0000000
--- a/assetstudio/src/images/clipart/big/9-av-upload.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/big/android.png b/assetstudio/src/images/clipart/big/android.png
deleted file mode 100644
index d966fae..0000000
--- a/assetstudio/src/images/clipart/big/android.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/1-navigation-accept.png b/assetstudio/src/images/clipart/small/1-navigation-accept.png
deleted file mode 100644
index f5069d9..0000000
--- a/assetstudio/src/images/clipart/small/1-navigation-accept.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/1-navigation-back.png b/assetstudio/src/images/clipart/small/1-navigation-back.png
deleted file mode 100644
index f35aec5..0000000
--- a/assetstudio/src/images/clipart/small/1-navigation-back.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/1-navigation-cancel.png b/assetstudio/src/images/clipart/small/1-navigation-cancel.png
deleted file mode 100644
index 4302320..0000000
--- a/assetstudio/src/images/clipart/small/1-navigation-cancel.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/1-navigation-collapse.png b/assetstudio/src/images/clipart/small/1-navigation-collapse.png
deleted file mode 100644
index 9c40e2c..0000000
--- a/assetstudio/src/images/clipart/small/1-navigation-collapse.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/1-navigation-expand.png b/assetstudio/src/images/clipart/small/1-navigation-expand.png
deleted file mode 100644
index 684fc5a..0000000
--- a/assetstudio/src/images/clipart/small/1-navigation-expand.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/1-navigation-forward.png b/assetstudio/src/images/clipart/small/1-navigation-forward.png
deleted file mode 100644
index beb6cf7..0000000
--- a/assetstudio/src/images/clipart/small/1-navigation-forward.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/1-navigation-next-item.png b/assetstudio/src/images/clipart/small/1-navigation-next-item.png
deleted file mode 100644
index 932d787..0000000
--- a/assetstudio/src/images/clipart/small/1-navigation-next-item.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/1-navigation-previous-item.png b/assetstudio/src/images/clipart/small/1-navigation-previous-item.png
deleted file mode 100644
index 679b586..0000000
--- a/assetstudio/src/images/clipart/small/1-navigation-previous-item.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/1-navigation-refresh.png b/assetstudio/src/images/clipart/small/1-navigation-refresh.png
deleted file mode 100644
index b946402..0000000
--- a/assetstudio/src/images/clipart/small/1-navigation-refresh.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-accounts.png b/assetstudio/src/images/clipart/small/10-device-access-accounts.png
deleted file mode 100644
index 34b4d6a..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-accounts.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-add-alarm.png b/assetstudio/src/images/clipart/small/10-device-access-add-alarm.png
deleted file mode 100644
index 27c528a..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-add-alarm.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-alarms.png b/assetstudio/src/images/clipart/small/10-device-access-alarms.png
deleted file mode 100644
index 545a8fa..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-alarms.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-battery.png b/assetstudio/src/images/clipart/small/10-device-access-battery.png
deleted file mode 100644
index 52e08bf..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-battery.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-bightness-low.png b/assetstudio/src/images/clipart/small/10-device-access-bightness-low.png
deleted file mode 100644
index a34cdea..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-bightness-low.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-bluetooth-connected.png b/assetstudio/src/images/clipart/small/10-device-access-bluetooth-connected.png
deleted file mode 100644
index d04e9f4..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-bluetooth-connected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-bluetooth-searching.png b/assetstudio/src/images/clipart/small/10-device-access-bluetooth-searching.png
deleted file mode 100644
index 06d69ae..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-bluetooth-searching.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-bluetooth.png b/assetstudio/src/images/clipart/small/10-device-access-bluetooth.png
deleted file mode 100644
index 11ad6b3..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-bluetooth.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-brightness-auto.png b/assetstudio/src/images/clipart/small/10-device-access-brightness-auto.png
deleted file mode 100644
index cd50b9d..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-brightness-auto.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-brightness-high.png b/assetstudio/src/images/clipart/small/10-device-access-brightness-high.png
deleted file mode 100644
index b9d8501..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-brightness-high.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-brightness-medium.png b/assetstudio/src/images/clipart/small/10-device-access-brightness-medium.png
deleted file mode 100644
index 7145eee..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-brightness-medium.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-call.png b/assetstudio/src/images/clipart/small/10-device-access-call.png
deleted file mode 100644
index 732e551..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-call.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-camera.png b/assetstudio/src/images/clipart/small/10-device-access-camera.png
deleted file mode 100644
index f61ab27..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-camera.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-data-usage.png b/assetstudio/src/images/clipart/small/10-device-access-data-usage.png
deleted file mode 100644
index a78127f..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-data-usage.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-dial-pad.png b/assetstudio/src/images/clipart/small/10-device-access-dial-pad.png
deleted file mode 100644
index cfbee88..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-dial-pad.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-end-call.png b/assetstudio/src/images/clipart/small/10-device-access-end-call.png
deleted file mode 100644
index 2562d0d..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-end-call.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-flash-automatic.png b/assetstudio/src/images/clipart/small/10-device-access-flash-automatic.png
deleted file mode 100644
index 574219c..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-flash-automatic.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-flash-off.png b/assetstudio/src/images/clipart/small/10-device-access-flash-off.png
deleted file mode 100644
index 80e3d06..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-flash-off.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-flash-on.png b/assetstudio/src/images/clipart/small/10-device-access-flash-on.png
deleted file mode 100644
index c9c2fff..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-flash-on.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-location-found.png b/assetstudio/src/images/clipart/small/10-device-access-location-found.png
deleted file mode 100644
index 4221d83..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-location-found.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-location-off.png b/assetstudio/src/images/clipart/small/10-device-access-location-off.png
deleted file mode 100644
index ea0511d..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-location-off.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-location-searching.png b/assetstudio/src/images/clipart/small/10-device-access-location-searching.png
deleted file mode 100644
index ef9dc2e..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-location-searching.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-mic-muted.png b/assetstudio/src/images/clipart/small/10-device-access-mic-muted.png
deleted file mode 100644
index 87bc6b3..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-mic-muted.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-mic.png b/assetstudio/src/images/clipart/small/10-device-access-mic.png
deleted file mode 100644
index 7569d6a..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-mic.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-network-cell.png b/assetstudio/src/images/clipart/small/10-device-access-network-cell.png
deleted file mode 100644
index 7a2c443..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-network-cell.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-network-wifi.png b/assetstudio/src/images/clipart/small/10-device-access-network-wifi.png
deleted file mode 100644
index e25cc64..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-network-wifi.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-new-account.png b/assetstudio/src/images/clipart/small/10-device-access-new-account.png
deleted file mode 100644
index c537899..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-new-account.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-not-secure.png b/assetstudio/src/images/clipart/small/10-device-access-not-secure.png
deleted file mode 100644
index 89c732e..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-not-secure.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-ring-volume.png b/assetstudio/src/images/clipart/small/10-device-access-ring-volume.png
deleted file mode 100644
index 5bfe27a..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-ring-volume.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-screen-locked-to-landscape.png b/assetstudio/src/images/clipart/small/10-device-access-screen-locked-to-landscape.png
deleted file mode 100644
index a3b2bbb..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-screen-locked-to-landscape.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-screen-locked-to-portrait.png b/assetstudio/src/images/clipart/small/10-device-access-screen-locked-to-portrait.png
deleted file mode 100644
index 270c069..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-screen-locked-to-portrait.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-screen-rotation.png b/assetstudio/src/images/clipart/small/10-device-access-screen-rotation.png
deleted file mode 100644
index a5337e9..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-screen-rotation.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-sd-storage.png b/assetstudio/src/images/clipart/small/10-device-access-sd-storage.png
deleted file mode 100644
index fe09aca..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-sd-storage.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-secure.png b/assetstudio/src/images/clipart/small/10-device-access-secure.png
deleted file mode 100644
index 9bf3627..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-secure.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-storage.png b/assetstudio/src/images/clipart/small/10-device-access-storage.png
deleted file mode 100644
index 1d38109..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-storage.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-switch-camera.png b/assetstudio/src/images/clipart/small/10-device-access-switch-camera.png
deleted file mode 100644
index 972e3b3..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-switch-camera.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-switch-video.png b/assetstudio/src/images/clipart/small/10-device-access-switch-video.png
deleted file mode 100644
index 2ae54f4..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-switch-video.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-time.png b/assetstudio/src/images/clipart/small/10-device-access-time.png
deleted file mode 100644
index f3d932e..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-time.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-usb.png b/assetstudio/src/images/clipart/small/10-device-access-usb.png
deleted file mode 100644
index 490d286..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-usb.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-video.png b/assetstudio/src/images/clipart/small/10-device-access-video.png
deleted file mode 100644
index d069de4..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-video.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-volume-muted.png b/assetstudio/src/images/clipart/small/10-device-access-volume-muted.png
deleted file mode 100644
index 283d621..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-volume-muted.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/10-device-access-volume-on.png b/assetstudio/src/images/clipart/small/10-device-access-volume-on.png
deleted file mode 100644
index a1d6670..0000000
--- a/assetstudio/src/images/clipart/small/10-device-access-volume-on.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/11-alerts-and-states-airplane-mode-off.png b/assetstudio/src/images/clipart/small/11-alerts-and-states-airplane-mode-off.png
deleted file mode 100644
index bfce2ee..0000000
--- a/assetstudio/src/images/clipart/small/11-alerts-and-states-airplane-mode-off.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/11-alerts-and-states-airplane-mode-on.png b/assetstudio/src/images/clipart/small/11-alerts-and-states-airplane-mode-on.png
deleted file mode 100644
index fba67ae..0000000
--- a/assetstudio/src/images/clipart/small/11-alerts-and-states-airplane-mode-on.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/11-alerts-and-states-error.png b/assetstudio/src/images/clipart/small/11-alerts-and-states-error.png
deleted file mode 100644
index a32766b..0000000
--- a/assetstudio/src/images/clipart/small/11-alerts-and-states-error.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/11-alerts-and-states-warning.png b/assetstudio/src/images/clipart/small/11-alerts-and-states-warning.png
deleted file mode 100644
index 37af134..0000000
--- a/assetstudio/src/images/clipart/small/11-alerts-and-states-warning.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/12-hardware-computer.png b/assetstudio/src/images/clipart/small/12-hardware-computer.png
deleted file mode 100644
index 91c7cdf..0000000
--- a/assetstudio/src/images/clipart/small/12-hardware-computer.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/12-hardware-dock.png b/assetstudio/src/images/clipart/small/12-hardware-dock.png
deleted file mode 100644
index c4a20ae..0000000
--- a/assetstudio/src/images/clipart/small/12-hardware-dock.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/12-hardware-gamepad.png b/assetstudio/src/images/clipart/small/12-hardware-gamepad.png
deleted file mode 100644
index db62572..0000000
--- a/assetstudio/src/images/clipart/small/12-hardware-gamepad.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/12-hardware-headphones.png b/assetstudio/src/images/clipart/small/12-hardware-headphones.png
deleted file mode 100644
index 9d3b020..0000000
--- a/assetstudio/src/images/clipart/small/12-hardware-headphones.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/12-hardware-headset.png b/assetstudio/src/images/clipart/small/12-hardware-headset.png
deleted file mode 100644
index d4efdf3..0000000
--- a/assetstudio/src/images/clipart/small/12-hardware-headset.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/12-hardware-keyboard.png b/assetstudio/src/images/clipart/small/12-hardware-keyboard.png
deleted file mode 100644
index 7b143d2..0000000
--- a/assetstudio/src/images/clipart/small/12-hardware-keyboard.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/12-hardware-mouse.png b/assetstudio/src/images/clipart/small/12-hardware-mouse.png
deleted file mode 100644
index 4f8d2df..0000000
--- a/assetstudio/src/images/clipart/small/12-hardware-mouse.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/12-hardware-phone.png b/assetstudio/src/images/clipart/small/12-hardware-phone.png
deleted file mode 100644
index b5f78e1..0000000
--- a/assetstudio/src/images/clipart/small/12-hardware-phone.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/2-action-about.png b/assetstudio/src/images/clipart/small/2-action-about.png
deleted file mode 100644
index 56a3a55..0000000
--- a/assetstudio/src/images/clipart/small/2-action-about.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/2-action-help.png b/assetstudio/src/images/clipart/small/2-action-help.png
deleted file mode 100644
index 9104862..0000000
--- a/assetstudio/src/images/clipart/small/2-action-help.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/2-action-search.png b/assetstudio/src/images/clipart/small/2-action-search.png
deleted file mode 100644
index 1d3f206..0000000
--- a/assetstudio/src/images/clipart/small/2-action-search.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/2-action-settings.png b/assetstudio/src/images/clipart/small/2-action-settings.png
deleted file mode 100644
index 1dd6bbb..0000000
--- a/assetstudio/src/images/clipart/small/2-action-settings.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/3-rating-bad.png b/assetstudio/src/images/clipart/small/3-rating-bad.png
deleted file mode 100644
index 76060f7..0000000
--- a/assetstudio/src/images/clipart/small/3-rating-bad.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/3-rating-favorite.png b/assetstudio/src/images/clipart/small/3-rating-favorite.png
deleted file mode 100644
index b6ab63f..0000000
--- a/assetstudio/src/images/clipart/small/3-rating-favorite.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/3-rating-good.png b/assetstudio/src/images/clipart/small/3-rating-good.png
deleted file mode 100644
index 0e6f861..0000000
--- a/assetstudio/src/images/clipart/small/3-rating-good.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/3-rating-half-important.png b/assetstudio/src/images/clipart/small/3-rating-half-important.png
deleted file mode 100644
index d9aa154..0000000
--- a/assetstudio/src/images/clipart/small/3-rating-half-important.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/3-rating-important.png b/assetstudio/src/images/clipart/small/3-rating-important.png
deleted file mode 100644
index 0bc5c54..0000000
--- a/assetstudio/src/images/clipart/small/3-rating-important.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/3-rating-not-important.png b/assetstudio/src/images/clipart/small/3-rating-not-important.png
deleted file mode 100644
index 6ea5892..0000000
--- a/assetstudio/src/images/clipart/small/3-rating-not-important.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/4-collections-cloud.png b/assetstudio/src/images/clipart/small/4-collections-cloud.png
deleted file mode 100644
index 5d80291..0000000
--- a/assetstudio/src/images/clipart/small/4-collections-cloud.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/4-collections-collection.png b/assetstudio/src/images/clipart/small/4-collections-collection.png
deleted file mode 100644
index d4a7dcb..0000000
--- a/assetstudio/src/images/clipart/small/4-collections-collection.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/4-collections-go-to-today.png b/assetstudio/src/images/clipart/small/4-collections-go-to-today.png
deleted file mode 100644
index 3326ead..0000000
--- a/assetstudio/src/images/clipart/small/4-collections-go-to-today.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/4-collections-labels.png b/assetstudio/src/images/clipart/small/4-collections-labels.png
deleted file mode 100644
index e647488..0000000
--- a/assetstudio/src/images/clipart/small/4-collections-labels.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/4-collections-new-label.png b/assetstudio/src/images/clipart/small/4-collections-new-label.png
deleted file mode 100644
index f822806..0000000
--- a/assetstudio/src/images/clipart/small/4-collections-new-label.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/4-collections-sort-by-size.png b/assetstudio/src/images/clipart/small/4-collections-sort-by-size.png
deleted file mode 100644
index b097f67..0000000
--- a/assetstudio/src/images/clipart/small/4-collections-sort-by-size.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/4-collections-view-as-grid.png b/assetstudio/src/images/clipart/small/4-collections-view-as-grid.png
deleted file mode 100644
index 9f9e0c1..0000000
--- a/assetstudio/src/images/clipart/small/4-collections-view-as-grid.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/4-collections-view-as-list.png b/assetstudio/src/images/clipart/small/4-collections-view-as-list.png
deleted file mode 100644
index 39a2f1f..0000000
--- a/assetstudio/src/images/clipart/small/4-collections-view-as-list.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-attachment.png b/assetstudio/src/images/clipart/small/5-content-attachment.png
deleted file mode 100644
index ae5dac4..0000000
--- a/assetstudio/src/images/clipart/small/5-content-attachment.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-backspace.png b/assetstudio/src/images/clipart/small/5-content-backspace.png
deleted file mode 100644
index f2743fe..0000000
--- a/assetstudio/src/images/clipart/small/5-content-backspace.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-copy.png b/assetstudio/src/images/clipart/small/5-content-copy.png
deleted file mode 100644
index 7efa0ec..0000000
--- a/assetstudio/src/images/clipart/small/5-content-copy.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-cut.png b/assetstudio/src/images/clipart/small/5-content-cut.png
deleted file mode 100644
index 4f113d6..0000000
--- a/assetstudio/src/images/clipart/small/5-content-cut.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-discard.png b/assetstudio/src/images/clipart/small/5-content-discard.png
deleted file mode 100644
index 9bbe70c..0000000
--- a/assetstudio/src/images/clipart/small/5-content-discard.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-edit.png b/assetstudio/src/images/clipart/small/5-content-edit.png
deleted file mode 100644
index dfef46d..0000000
--- a/assetstudio/src/images/clipart/small/5-content-edit.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-email.png b/assetstudio/src/images/clipart/small/5-content-email.png
deleted file mode 100644
index 0698571..0000000
--- a/assetstudio/src/images/clipart/small/5-content-email.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-event.png b/assetstudio/src/images/clipart/small/5-content-event.png
deleted file mode 100644
index 4fea671..0000000
--- a/assetstudio/src/images/clipart/small/5-content-event.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-import-export.png b/assetstudio/src/images/clipart/small/5-content-import-export.png
deleted file mode 100644
index 1b4ed11..0000000
--- a/assetstudio/src/images/clipart/small/5-content-import-export.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-merge.png b/assetstudio/src/images/clipart/small/5-content-merge.png
deleted file mode 100644
index 4f7451e..0000000
--- a/assetstudio/src/images/clipart/small/5-content-merge.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-new-attachment.png b/assetstudio/src/images/clipart/small/5-content-new-attachment.png
deleted file mode 100644
index 8028ea7..0000000
--- a/assetstudio/src/images/clipart/small/5-content-new-attachment.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-new-email.png b/assetstudio/src/images/clipart/small/5-content-new-email.png
deleted file mode 100644
index 699dca9..0000000
--- a/assetstudio/src/images/clipart/small/5-content-new-email.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-new-event.png b/assetstudio/src/images/clipart/small/5-content-new-event.png
deleted file mode 100644
index 4c4f674..0000000
--- a/assetstudio/src/images/clipart/small/5-content-new-event.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-new-picture.png b/assetstudio/src/images/clipart/small/5-content-new-picture.png
deleted file mode 100644
index 6b7b7ea..0000000
--- a/assetstudio/src/images/clipart/small/5-content-new-picture.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-new.png b/assetstudio/src/images/clipart/small/5-content-new.png
deleted file mode 100644
index 7ccce5b..0000000
--- a/assetstudio/src/images/clipart/small/5-content-new.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-paste.png b/assetstudio/src/images/clipart/small/5-content-paste.png
deleted file mode 100644
index 9c3d906..0000000
--- a/assetstudio/src/images/clipart/small/5-content-paste.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-picture.png b/assetstudio/src/images/clipart/small/5-content-picture.png
deleted file mode 100644
index 0676181..0000000
--- a/assetstudio/src/images/clipart/small/5-content-picture.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-read.png b/assetstudio/src/images/clipart/small/5-content-read.png
deleted file mode 100644
index 7c7186f..0000000
--- a/assetstudio/src/images/clipart/small/5-content-read.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-remove.png b/assetstudio/src/images/clipart/small/5-content-remove.png
deleted file mode 100644
index 97f11f7..0000000
--- a/assetstudio/src/images/clipart/small/5-content-remove.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-save.png b/assetstudio/src/images/clipart/small/5-content-save.png
deleted file mode 100644
index 4b38e6c..0000000
--- a/assetstudio/src/images/clipart/small/5-content-save.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-select-all.png b/assetstudio/src/images/clipart/small/5-content-select-all.png
deleted file mode 100644
index cfb2282..0000000
--- a/assetstudio/src/images/clipart/small/5-content-select-all.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-split.png b/assetstudio/src/images/clipart/small/5-content-split.png
deleted file mode 100644
index 779f650..0000000
--- a/assetstudio/src/images/clipart/small/5-content-split.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-undo.png b/assetstudio/src/images/clipart/small/5-content-undo.png
deleted file mode 100644
index 87b0129..0000000
--- a/assetstudio/src/images/clipart/small/5-content-undo.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/5-content-unread.png b/assetstudio/src/images/clipart/small/5-content-unread.png
deleted file mode 100644
index 69cb276..0000000
--- a/assetstudio/src/images/clipart/small/5-content-unread.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/6-social-add-group.png b/assetstudio/src/images/clipart/small/6-social-add-group.png
deleted file mode 100644
index cae89bb..0000000
--- a/assetstudio/src/images/clipart/small/6-social-add-group.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/6-social-add-person.png b/assetstudio/src/images/clipart/small/6-social-add-person.png
deleted file mode 100644
index ec95691..0000000
--- a/assetstudio/src/images/clipart/small/6-social-add-person.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/6-social-cc-bcc.png b/assetstudio/src/images/clipart/small/6-social-cc-bcc.png
deleted file mode 100644
index 92772f7..0000000
--- a/assetstudio/src/images/clipart/small/6-social-cc-bcc.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/6-social-chat.png b/assetstudio/src/images/clipart/small/6-social-chat.png
deleted file mode 100644
index 675c7e3..0000000
--- a/assetstudio/src/images/clipart/small/6-social-chat.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/6-social-forward.png b/assetstudio/src/images/clipart/small/6-social-forward.png
deleted file mode 100644
index f533b34..0000000
--- a/assetstudio/src/images/clipart/small/6-social-forward.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/6-social-group.png b/assetstudio/src/images/clipart/small/6-social-group.png
deleted file mode 100644
index ee027a7..0000000
--- a/assetstudio/src/images/clipart/small/6-social-group.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/6-social-person.png b/assetstudio/src/images/clipart/small/6-social-person.png
deleted file mode 100644
index bb685c7..0000000
--- a/assetstudio/src/images/clipart/small/6-social-person.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/6-social-reply-all.png b/assetstudio/src/images/clipart/small/6-social-reply-all.png
deleted file mode 100644
index fc94679..0000000
--- a/assetstudio/src/images/clipart/small/6-social-reply-all.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/6-social-reply.png b/assetstudio/src/images/clipart/small/6-social-reply.png
deleted file mode 100644
index e413c9a..0000000
--- a/assetstudio/src/images/clipart/small/6-social-reply.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/6-social-send-now.png b/assetstudio/src/images/clipart/small/6-social-send-now.png
deleted file mode 100644
index 6fa79f0..0000000
--- a/assetstudio/src/images/clipart/small/6-social-send-now.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/6-social-share.png b/assetstudio/src/images/clipart/small/6-social-share.png
deleted file mode 100644
index fb74121..0000000
--- a/assetstudio/src/images/clipart/small/6-social-share.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/7-location-directions.png b/assetstudio/src/images/clipart/small/7-location-directions.png
deleted file mode 100644
index c3e821d..0000000
--- a/assetstudio/src/images/clipart/small/7-location-directions.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/7-location-map.png b/assetstudio/src/images/clipart/small/7-location-map.png
deleted file mode 100644
index 4893657..0000000
--- a/assetstudio/src/images/clipart/small/7-location-map.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/7-location-place.png b/assetstudio/src/images/clipart/small/7-location-place.png
deleted file mode 100644
index 2d41b57..0000000
--- a/assetstudio/src/images/clipart/small/7-location-place.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/7-location-web-site.png b/assetstudio/src/images/clipart/small/7-location-web-site.png
deleted file mode 100644
index fe15c10..0000000
--- a/assetstudio/src/images/clipart/small/7-location-web-site.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/8-images-crop.png b/assetstudio/src/images/clipart/small/8-images-crop.png
deleted file mode 100644
index ddca47f..0000000
--- a/assetstudio/src/images/clipart/small/8-images-crop.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/8-images-rotate-left.png b/assetstudio/src/images/clipart/small/8-images-rotate-left.png
deleted file mode 100644
index 0450f2b..0000000
--- a/assetstudio/src/images/clipart/small/8-images-rotate-left.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/8-images-rotate-right.png b/assetstudio/src/images/clipart/small/8-images-rotate-right.png
deleted file mode 100644
index a34d957..0000000
--- a/assetstudio/src/images/clipart/small/8-images-rotate-right.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/8-images-slideshow.png b/assetstudio/src/images/clipart/small/8-images-slideshow.png
deleted file mode 100644
index 5317cf7..0000000
--- a/assetstudio/src/images/clipart/small/8-images-slideshow.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-add-to-queue.png b/assetstudio/src/images/clipart/small/9-av-add-to-queue.png
deleted file mode 100644
index 544b8fc..0000000
--- a/assetstudio/src/images/clipart/small/9-av-add-to-queue.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-download.png b/assetstudio/src/images/clipart/small/9-av-download.png
deleted file mode 100644
index bbf910c..0000000
--- a/assetstudio/src/images/clipart/small/9-av-download.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-fast-forward.png b/assetstudio/src/images/clipart/small/9-av-fast-forward.png
deleted file mode 100644
index dc7e11f..0000000
--- a/assetstudio/src/images/clipart/small/9-av-fast-forward.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-full-screen.png b/assetstudio/src/images/clipart/small/9-av-full-screen.png
deleted file mode 100644
index c1dd576..0000000
--- a/assetstudio/src/images/clipart/small/9-av-full-screen.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-make-available-offline.png b/assetstudio/src/images/clipart/small/9-av-make-available-offline.png
deleted file mode 100644
index 8e9459c..0000000
--- a/assetstudio/src/images/clipart/small/9-av-make-available-offline.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-next.png b/assetstudio/src/images/clipart/small/9-av-next.png
deleted file mode 100644
index 01e6543..0000000
--- a/assetstudio/src/images/clipart/small/9-av-next.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-pause-over-video.png b/assetstudio/src/images/clipart/small/9-av-pause-over-video.png
deleted file mode 100644
index bac9ce4..0000000
--- a/assetstudio/src/images/clipart/small/9-av-pause-over-video.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-pause.png b/assetstudio/src/images/clipart/small/9-av-pause.png
deleted file mode 100644
index 6a17d65..0000000
--- a/assetstudio/src/images/clipart/small/9-av-pause.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-play-over-video.png b/assetstudio/src/images/clipart/small/9-av-play-over-video.png
deleted file mode 100644
index a3a68fc..0000000
--- a/assetstudio/src/images/clipart/small/9-av-play-over-video.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-play.png b/assetstudio/src/images/clipart/small/9-av-play.png
deleted file mode 100644
index 2092eca..0000000
--- a/assetstudio/src/images/clipart/small/9-av-play.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-previous.png b/assetstudio/src/images/clipart/small/9-av-previous.png
deleted file mode 100644
index cf10fbf..0000000
--- a/assetstudio/src/images/clipart/small/9-av-previous.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-repeat.png b/assetstudio/src/images/clipart/small/9-av-repeat.png
deleted file mode 100644
index 7638bea..0000000
--- a/assetstudio/src/images/clipart/small/9-av-repeat.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-replay.png b/assetstudio/src/images/clipart/small/9-av-replay.png
deleted file mode 100644
index 8f1dae0..0000000
--- a/assetstudio/src/images/clipart/small/9-av-replay.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-return-from-full-screen.png b/assetstudio/src/images/clipart/small/9-av-return-from-full-screen.png
deleted file mode 100644
index 96949cb..0000000
--- a/assetstudio/src/images/clipart/small/9-av-return-from-full-screen.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-rewind.png b/assetstudio/src/images/clipart/small/9-av-rewind.png
deleted file mode 100644
index 1811cd9..0000000
--- a/assetstudio/src/images/clipart/small/9-av-rewind.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-shuffle.png b/assetstudio/src/images/clipart/small/9-av-shuffle.png
deleted file mode 100644
index 6075afb..0000000
--- a/assetstudio/src/images/clipart/small/9-av-shuffle.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-stop.png b/assetstudio/src/images/clipart/small/9-av-stop.png
deleted file mode 100644
index 3c95c99..0000000
--- a/assetstudio/src/images/clipart/small/9-av-stop.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/9-av-upload.png b/assetstudio/src/images/clipart/small/9-av-upload.png
deleted file mode 100644
index af9b895..0000000
--- a/assetstudio/src/images/clipart/small/9-av-upload.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/clipart/small/android.png b/assetstudio/src/images/clipart/small/android.png
deleted file mode 100644
index b2c6cd2..0000000
--- a/assetstudio/src/images/clipart/small/android.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/hdpi/back.png b/assetstudio/src/images/launcher_stencil/circle/hdpi/back.png
deleted file mode 100644
index 5401258..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/hdpi/back.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/hdpi/fore1.png b/assetstudio/src/images/launcher_stencil/circle/hdpi/fore1.png
deleted file mode 100644
index 6295083..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/hdpi/fore1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/hdpi/mask.png b/assetstudio/src/images/launcher_stencil/circle/hdpi/mask.png
deleted file mode 100644
index 7d10568..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/hdpi/mask.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/hdpi/mask_inner.png b/assetstudio/src/images/launcher_stencil/circle/hdpi/mask_inner.png
deleted file mode 100644
index 3cbd8de..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/hdpi/mask_inner.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/mdpi/back.png b/assetstudio/src/images/launcher_stencil/circle/mdpi/back.png
deleted file mode 100644
index 73a640f..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/mdpi/back.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/mdpi/fore1.png b/assetstudio/src/images/launcher_stencil/circle/mdpi/fore1.png
deleted file mode 100644
index 90a9e47..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/mdpi/fore1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/mdpi/mask.png b/assetstudio/src/images/launcher_stencil/circle/mdpi/mask.png
deleted file mode 100644
index 107082b..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/mdpi/mask.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/mdpi/mask_inner.png b/assetstudio/src/images/launcher_stencil/circle/mdpi/mask_inner.png
deleted file mode 100644
index c44b167..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/mdpi/mask_inner.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/web/back.png b/assetstudio/src/images/launcher_stencil/circle/web/back.png
deleted file mode 100644
index 2058604..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/web/back.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/web/fore1.png b/assetstudio/src/images/launcher_stencil/circle/web/fore1.png
deleted file mode 100644
index b80d804..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/web/fore1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/web/mask.png b/assetstudio/src/images/launcher_stencil/circle/web/mask.png
deleted file mode 100644
index 709060e..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/web/mask.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/web/mask_inner.png b/assetstudio/src/images/launcher_stencil/circle/web/mask_inner.png
deleted file mode 100644
index dca886c..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/web/mask_inner.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/xhdpi/back.png b/assetstudio/src/images/launcher_stencil/circle/xhdpi/back.png
deleted file mode 100644
index 4fd8b7d..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/xhdpi/back.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/xhdpi/fore1.png b/assetstudio/src/images/launcher_stencil/circle/xhdpi/fore1.png
deleted file mode 100644
index c0d752b..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/xhdpi/fore1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/xhdpi/mask.png b/assetstudio/src/images/launcher_stencil/circle/xhdpi/mask.png
deleted file mode 100644
index a0bfc98..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/xhdpi/mask.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/xhdpi/mask_inner.png b/assetstudio/src/images/launcher_stencil/circle/xhdpi/mask_inner.png
deleted file mode 100644
index 02bc806..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/xhdpi/mask_inner.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/xxhdpi/back.png b/assetstudio/src/images/launcher_stencil/circle/xxhdpi/back.png
deleted file mode 100644
index 8b62d02..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/xxhdpi/back.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/xxhdpi/fore1.png b/assetstudio/src/images/launcher_stencil/circle/xxhdpi/fore1.png
deleted file mode 100644
index 2e4ab8c..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/xxhdpi/fore1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/xxhdpi/mask.png b/assetstudio/src/images/launcher_stencil/circle/xxhdpi/mask.png
deleted file mode 100644
index 874aa5b..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/xxhdpi/mask.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/circle/xxhdpi/mask_inner.png b/assetstudio/src/images/launcher_stencil/circle/xxhdpi/mask_inner.png
deleted file mode 100644
index 819c144..0000000
--- a/assetstudio/src/images/launcher_stencil/circle/xxhdpi/mask_inner.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/hdpi/back.png b/assetstudio/src/images/launcher_stencil/square/hdpi/back.png
deleted file mode 100644
index 284a785..0000000
--- a/assetstudio/src/images/launcher_stencil/square/hdpi/back.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/hdpi/fore1.png b/assetstudio/src/images/launcher_stencil/square/hdpi/fore1.png
deleted file mode 100644
index e7faa71..0000000
--- a/assetstudio/src/images/launcher_stencil/square/hdpi/fore1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/hdpi/mask.png b/assetstudio/src/images/launcher_stencil/square/hdpi/mask.png
deleted file mode 100644
index fe1aa7a..0000000
--- a/assetstudio/src/images/launcher_stencil/square/hdpi/mask.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/hdpi/mask_inner.png b/assetstudio/src/images/launcher_stencil/square/hdpi/mask_inner.png
deleted file mode 100644
index 28df306..0000000
--- a/assetstudio/src/images/launcher_stencil/square/hdpi/mask_inner.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/mdpi/back.png b/assetstudio/src/images/launcher_stencil/square/mdpi/back.png
deleted file mode 100644
index 849a656..0000000
--- a/assetstudio/src/images/launcher_stencil/square/mdpi/back.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/mdpi/fore1.png b/assetstudio/src/images/launcher_stencil/square/mdpi/fore1.png
deleted file mode 100644
index cef3e48..0000000
--- a/assetstudio/src/images/launcher_stencil/square/mdpi/fore1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/mdpi/mask.png b/assetstudio/src/images/launcher_stencil/square/mdpi/mask.png
deleted file mode 100644
index 8b3d0a2..0000000
--- a/assetstudio/src/images/launcher_stencil/square/mdpi/mask.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/mdpi/mask_inner.png b/assetstudio/src/images/launcher_stencil/square/mdpi/mask_inner.png
deleted file mode 100644
index 3f3ad9b..0000000
--- a/assetstudio/src/images/launcher_stencil/square/mdpi/mask_inner.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/web/back.png b/assetstudio/src/images/launcher_stencil/square/web/back.png
deleted file mode 100644
index bb59979..0000000
--- a/assetstudio/src/images/launcher_stencil/square/web/back.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/web/fore1.png b/assetstudio/src/images/launcher_stencil/square/web/fore1.png
deleted file mode 100644
index 2a3be1c..0000000
--- a/assetstudio/src/images/launcher_stencil/square/web/fore1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/web/mask.png b/assetstudio/src/images/launcher_stencil/square/web/mask.png
deleted file mode 100644
index e3f10a3..0000000
--- a/assetstudio/src/images/launcher_stencil/square/web/mask.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/web/mask_inner.png b/assetstudio/src/images/launcher_stencil/square/web/mask_inner.png
deleted file mode 100644
index ea15b03..0000000
--- a/assetstudio/src/images/launcher_stencil/square/web/mask_inner.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/xhdpi/back.png b/assetstudio/src/images/launcher_stencil/square/xhdpi/back.png
deleted file mode 100644
index 1338f7c..0000000
--- a/assetstudio/src/images/launcher_stencil/square/xhdpi/back.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/xhdpi/fore1.png b/assetstudio/src/images/launcher_stencil/square/xhdpi/fore1.png
deleted file mode 100644
index 90c3430..0000000
--- a/assetstudio/src/images/launcher_stencil/square/xhdpi/fore1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/xhdpi/mask.png b/assetstudio/src/images/launcher_stencil/square/xhdpi/mask.png
deleted file mode 100644
index 7291db1..0000000
--- a/assetstudio/src/images/launcher_stencil/square/xhdpi/mask.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/xhdpi/mask_inner.png b/assetstudio/src/images/launcher_stencil/square/xhdpi/mask_inner.png
deleted file mode 100644
index 388a4c2..0000000
--- a/assetstudio/src/images/launcher_stencil/square/xhdpi/mask_inner.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/xxhdpi/back.png b/assetstudio/src/images/launcher_stencil/square/xxhdpi/back.png
deleted file mode 100644
index 068e28f..0000000
--- a/assetstudio/src/images/launcher_stencil/square/xxhdpi/back.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/xxhdpi/fore1.png b/assetstudio/src/images/launcher_stencil/square/xxhdpi/fore1.png
deleted file mode 100644
index 099b135..0000000
--- a/assetstudio/src/images/launcher_stencil/square/xxhdpi/fore1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/xxhdpi/mask.png b/assetstudio/src/images/launcher_stencil/square/xxhdpi/mask.png
deleted file mode 100644
index be26125..0000000
--- a/assetstudio/src/images/launcher_stencil/square/xxhdpi/mask.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/launcher_stencil/square/xxhdpi/mask_inner.png b/assetstudio/src/images/launcher_stencil/square/xxhdpi/mask_inner.png
deleted file mode 100644
index 3f8c5ea..0000000
--- a/assetstudio/src/images/launcher_stencil/square/xxhdpi/mask_inner.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/notification_stencil/hdpi.png b/assetstudio/src/images/notification_stencil/hdpi.png
deleted file mode 100644
index f755f4f..0000000
--- a/assetstudio/src/images/notification_stencil/hdpi.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/notification_stencil/mdpi.png b/assetstudio/src/images/notification_stencil/mdpi.png
deleted file mode 100644
index 5f80247..0000000
--- a/assetstudio/src/images/notification_stencil/mdpi.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/src/images/notification_stencil/xhdpi.png b/assetstudio/src/images/notification_stencil/xhdpi.png
deleted file mode 100644
index 7c27d82..0000000
--- a/assetstudio/src/images/notification_stencil/xhdpi.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/ActionBarIconGeneratorTest.java b/assetstudio/tests/src/com/android/assetstudiolib/ActionBarIconGeneratorTest.java
deleted file mode 100644
index a097f0a..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/ActionBarIconGeneratorTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 com.android.assetstudiolib;
-
-import com.android.assetstudiolib.ActionBarIconGenerator.ActionBarOptions;
-import com.android.assetstudiolib.ActionBarIconGenerator.Theme;
-
-import java.io.IOException;
-
-@SuppressWarnings("javadoc")
-public class ActionBarIconGeneratorTest extends GeneratorTest {
-    private void checkGraphic(String baseName, Theme theme) throws IOException {
-        ActionBarOptions options = new ActionBarOptions();
-        options.theme = theme;
-
-        ActionBarIconGenerator generator = new ActionBarIconGenerator();
-        checkGraphic(3, "actions", baseName, generator, options);
-    }
-
-    public void testDark() throws Exception {
-        checkGraphic("ic_action_dark", Theme.HOLO_DARK);
-    }
-
-    public void testLight() throws Exception {
-        checkGraphic("ic_action_light", Theme.HOLO_LIGHT);
-    }
-}
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/GeneratorTest.java b/assetstudio/tests/src/com/android/assetstudiolib/GeneratorTest.java
deleted file mode 100644
index 4a96f30..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/GeneratorTest.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 com.android.assetstudiolib;
-
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.imageio.ImageIO;
-
-import junit.framework.TestCase;
-
-/**
- * Shared test infrastructure for code generator
- */
-public abstract class GeneratorTest extends TestCase implements GraphicGeneratorContext {
-    private static final String TEST_DATA_REL_PATH =
-            "assetstudio/tests/src/com/android/assetstudiolib/testdata";
-
-    protected void checkGraphic(int expectedFileCount, String folderName, String baseName,
-            GraphicGenerator generator, GraphicGenerator.Options options)
-            throws IOException {
-        Map<String, Map<String, BufferedImage>> categoryMap =
-                new HashMap<String, Map<String, BufferedImage>>();
-        options.sourceImage = GraphicGenerator.getClipartImage("android.png");
-        generator.generate(null, categoryMap, this, options, baseName);
-
-        File targetDir = getTargetDir();
-
-        List<String> errors = new ArrayList<String>();
-        int fileCount = 0;
-        for (Map<String, BufferedImage> previews : categoryMap.values()) {
-            for (Map.Entry<String, BufferedImage> entry : previews.entrySet()) {
-                String relativePath = entry.getKey();
-                BufferedImage image = entry.getValue();
-
-                String path = "testdata" + File.separator + folderName + File.separator
-                        + relativePath;
-                InputStream is = GeneratorTest.class.getResourceAsStream(path);
-                if (is == null) {
-                    if (targetDir == null) {
-                        fail("Did not find " + path
-                                + ". Set ADT_SDK_SOURCE_PATH to have it created automatically");
-                    }
-                    File fileName = new File(targetDir, folderName + File.separator
-                            + relativePath);
-                    assertFalse(fileName.exists());
-                    if (!fileName.getParentFile().exists()) {
-                        boolean mkdir = fileName.getParentFile().mkdirs();
-                        assertTrue(fileName.getParent(), mkdir);
-                    }
-
-                    ImageIO.write(image, "PNG", fileName);
-                    errors.add("File did not exist, created " + fileName.getPath());
-                } else {
-                    BufferedImage goldenImage = ImageIO.read(is);
-                    assertImageSimilar(relativePath, goldenImage, image, 5.0f);
-                }
-            }
-
-            fileCount += previews.values().size();
-        }
-        if (errors.size() > 0) {
-            fail(errors.toString());
-        }
-
-        assertEquals("Wrong number of generated files", expectedFileCount, fileCount);
-    }
-
-    private void assertImageSimilar(String imageName, BufferedImage goldenImage,
-            BufferedImage image, float maxPercentDifferent) throws IOException {
-        assertTrue("Widths differ too much for " + imageName, Math.abs(goldenImage.getWidth()
-                - image.getWidth()) < 2);
-        assertTrue("Widths differ too much for " + imageName, Math.abs(goldenImage.getHeight()
-                - image.getHeight()) < 2);
-
-        assertEquals(BufferedImage.TYPE_INT_ARGB, image.getType());
-
-        if (goldenImage.getType() != BufferedImage.TYPE_INT_ARGB) {
-            BufferedImage temp = new BufferedImage(goldenImage.getWidth(), goldenImage.getHeight(),
-                    BufferedImage.TYPE_INT_ARGB);
-            temp.getGraphics().drawImage(goldenImage, 0, 0, null);
-            goldenImage = temp;
-        }
-        assertEquals(BufferedImage.TYPE_INT_ARGB, goldenImage.getType());
-
-        int imageWidth = Math.min(goldenImage.getWidth(), image.getWidth());
-        int imageHeight = Math.min(goldenImage.getHeight(), image.getHeight());
-
-        // Blur the images to account for the scenarios where there are pixel
-        // differences
-        // in where a sharp edge occurs
-        // goldenImage = blur(goldenImage, 6);
-        // image = blur(image, 6);
-
-        int width = 3 * imageWidth;
-        int height = imageHeight;
-        BufferedImage deltaImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
-        Graphics g = deltaImage.getGraphics();
-
-        // Compute delta map
-        long delta = 0;
-        for (int y = 0; y < imageHeight; y++) {
-            for (int x = 0; x < imageWidth; x++) {
-                int goldenRgb = goldenImage.getRGB(x, y);
-                int rgb = image.getRGB(x, y);
-                if (goldenRgb == rgb) {
-                    deltaImage.setRGB(imageWidth + x, y, 0x00808080);
-                    continue;
-                }
-
-                // If the pixels have no opacity, don't delta colors at all
-                if (((goldenRgb & 0xFF000000) == 0) && (rgb & 0xFF000000) == 0) {
-                    deltaImage.setRGB(imageWidth + x, y, 0x00808080);
-                    continue;
-                }
-
-                int deltaR = ((rgb & 0xFF0000) >>> 16) - ((goldenRgb & 0xFF0000) >>> 16);
-                int newR = 128 + deltaR & 0xFF;
-                int deltaG = ((rgb & 0x00FF00) >>> 8) - ((goldenRgb & 0x00FF00) >>> 8);
-                int newG = 128 + deltaG & 0xFF;
-                int deltaB = (rgb & 0x0000FF) - (goldenRgb & 0x0000FF);
-                int newB = 128 + deltaB & 0xFF;
-
-                int avgAlpha = ((((goldenRgb & 0xFF000000) >>> 24)
-                        + ((rgb & 0xFF000000) >>> 24)) / 2) << 24;
-
-                int newRGB = avgAlpha | newR << 16 | newG << 8 | newB;
-                deltaImage.setRGB(imageWidth + x, y, newRGB);
-
-                delta += Math.abs(deltaR);
-                delta += Math.abs(deltaG);
-                delta += Math.abs(deltaB);
-            }
-        }
-
-        // 3 different colors, 256 color levels
-        long total = imageHeight * imageWidth * 3L * 256L;
-        float percentDifference = (float) (delta * 100 / (double) total);
-
-        if (percentDifference > maxPercentDifferent) {
-            // Expected on the left
-            // Golden on the right
-            g.drawImage(goldenImage, 0, 0, null);
-            g.drawImage(image, 2 * imageWidth, 0, null);
-
-            // Labels
-            if (imageWidth > 80) {
-                g.setColor(Color.RED);
-                g.drawString("Expected", 10, 20);
-                g.drawString("Actual", 2 * imageWidth + 10, 20);
-            }
-
-            File output = new File(getTempDir(), "delta-"
-                    + imageName.replace(File.separatorChar, '_'));
-            if (output.exists()) {
-                output.delete();
-            }
-            ImageIO.write(deltaImage, "PNG", output);
-            String message = String.format("Images differ (by %.1f%%) - see details in %s",
-                    percentDifference, output);
-            System.out.println(message);
-            fail(message);
-        }
-
-        g.dispose();
-    }
-
-    protected File getTempDir() {
-        if (System.getProperty("os.name").equals("Mac OS X")) {
-            return new File("/tmp"); //$NON-NLS-1$
-        }
-
-        return new File(System.getProperty("java.io.tmpdir")); //$NON-NLS-1$
-    }
-
-    @Override
-    public BufferedImage loadImageResource(String path) {
-        try {
-            return GraphicGenerator.getStencilImage(path);
-        } catch (IOException e) {
-            fail(e.toString());
-        }
-
-        return null;
-    }
-
-    /** Get the location to write missing golden files to */
-    protected File getTargetDir() {
-        // Set $ADT_SDK_SOURCE_PATH to point to your git "sdk" directory
-        String sdk = System.getenv("ADT_SDK_SOURCE_PATH");
-        if (sdk != null) {
-            File sdkPath = new File(sdk);
-            if (sdkPath.exists()) {
-                File testData = new File(sdkPath, TEST_DATA_REL_PATH.replace('/',
-                        File.separatorChar));
-                if (testData.exists()) {
-                    return testData;
-                }
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/LauncherIconGeneratorTest.java b/assetstudio/tests/src/com/android/assetstudiolib/LauncherIconGeneratorTest.java
deleted file mode 100644
index 2ab09b1..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/LauncherIconGeneratorTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 com.android.assetstudiolib;
-
-import com.android.assetstudiolib.LauncherIconGenerator.LauncherOptions;
-
-import java.io.IOException;
-
-@SuppressWarnings("javadoc")
-public class LauncherIconGeneratorTest extends GeneratorTest {
-    private void checkGraphic(String baseName,
-            GraphicGenerator.Shape shape, GraphicGenerator.Style style,
-            boolean crop, int background, boolean isWebGraphic) throws IOException {
-        LauncherOptions options = new LauncherOptions();
-        options.shape = shape;
-        options.crop = crop;
-        options.style = style;
-        options.backgroundColor = background;
-        options.isWebGraphic = isWebGraphic;
-
-        LauncherIconGenerator generator = new LauncherIconGenerator();
-        checkGraphic(4 + (isWebGraphic ? 1 : 0), "launcher", baseName, generator, options);
-    }
-
-    public void testLauncher_simpleCircle() throws Exception {
-        checkGraphic("red_simple_circle", GraphicGenerator.Shape.CIRCLE,
-                GraphicGenerator.Style.SIMPLE, true, 0xFF0000, true);
-    }
-
-    // The glossy rendering type is no longer included since it doesn't match the
-    // style guide.
-    //public void testLauncher_glossySquare() throws Exception {
-    //    checkGraphic("blue_glossy_square", GraphicGenerator.Shape.SQUARE,
-    //            GraphicGenerator.Style.GLOSSY, true, 0x0040FF, true);
-    //}
-}
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/MenuIconGeneratorTest.java b/assetstudio/tests/src/com/android/assetstudiolib/MenuIconGeneratorTest.java
deleted file mode 100644
index 544777d..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/MenuIconGeneratorTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 com.android.assetstudiolib;
-
-import java.io.IOException;
-
-@SuppressWarnings("javadoc")
-public class MenuIconGeneratorTest extends GeneratorTest {
-    private void checkGraphic(String baseName) throws IOException {
-        MenuIconGenerator generator = new MenuIconGenerator();
-        checkGraphic(3, "menus", baseName, generator, new GraphicGenerator.Options());
-    }
-
-    public void testMenu() throws Exception {
-        checkGraphic("ic_menu_1");
-    }
-}
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/NotificationIconGeneratorTest.java b/assetstudio/tests/src/com/android/assetstudiolib/NotificationIconGeneratorTest.java
deleted file mode 100644
index 39fd7ac..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/NotificationIconGeneratorTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 com.android.assetstudiolib;
-
-import com.android.assetstudiolib.NotificationIconGenerator.NotificationOptions;
-
-import java.io.IOException;
-
-@SuppressWarnings("javadoc")
-public class NotificationIconGeneratorTest extends GeneratorTest {
-    private void checkGraphic(String baseName, int minSdk, String folderName,
-            int expectedCount) throws IOException {
-        NotificationOptions options = new NotificationOptions();
-        options.minSdk = minSdk;
-
-        NotificationIconGenerator generator = new NotificationIconGenerator();
-        checkGraphic(expectedCount, folderName, baseName, generator, options);
-    }
-
-    private void checkGraphic(String baseName) throws IOException {
-        checkGraphic(baseName, 1, "notification", 9);
-    }
-
-    public void testNotification1() throws Exception {
-        checkGraphic("ic_stat_1");
-    }
-
-    public void testNotification2() throws Exception {
-        checkGraphic("ic_stat_1", 9 /* minSdk */, "notification-v9+", 6 /* fileCount */);
-    }
-
-    public void testNotification3() throws Exception {
-        checkGraphic("ic_stat_1", 11, "notification-v11+", 3);
-    }
-}
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/TabIconGeneratorTest.java b/assetstudio/tests/src/com/android/assetstudiolib/TabIconGeneratorTest.java
deleted file mode 100644
index fb7849c..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/TabIconGeneratorTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 com.android.assetstudiolib;
-
-import java.io.IOException;
-
-@SuppressWarnings("javadoc")
-public class TabIconGeneratorTest extends GeneratorTest {
-    private void checkGraphic(String folderName, String baseName, int minSdk,
-            int expectedFileCount) throws IOException {
-        TabIconGenerator generator = new TabIconGenerator();
-        TabIconGenerator.TabOptions options = new TabIconGenerator.TabOptions();
-        options.minSdk = minSdk;
-        checkGraphic(expectedFileCount, folderName, baseName, generator, options);
-    }
-
-    public void testTabs1() throws Exception {
-        checkGraphic("tabs", "ic_tab_1", 1 /* minSdk */, 12 /* expectedFileCount */);
-    }
-
-    public void testTabs2() throws Exception {
-        checkGraphic("tabs-v5+", "ic_tab_1", 5, 6);
-    }
-}
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-hdpi/ic_action_dark.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-hdpi/ic_action_dark.png
deleted file mode 100644
index f8950e9..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-hdpi/ic_action_dark.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-hdpi/ic_action_light.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-hdpi/ic_action_light.png
deleted file mode 100644
index 0904e2f..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-hdpi/ic_action_light.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-mdpi/ic_action_dark.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-mdpi/ic_action_dark.png
deleted file mode 100644
index 08a41b6..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-mdpi/ic_action_dark.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-mdpi/ic_action_light.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-mdpi/ic_action_light.png
deleted file mode 100644
index 11d4db7..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-mdpi/ic_action_light.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-xhdpi/ic_action_dark.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-xhdpi/ic_action_dark.png
deleted file mode 100644
index 7396c15..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-xhdpi/ic_action_dark.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-xhdpi/ic_action_light.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-xhdpi/ic_action_light.png
deleted file mode 100644
index 941e377..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/actions/res/drawable-xhdpi/ic_action_light.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/red_simple_circle-web.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/red_simple_circle-web.png
deleted file mode 100644
index 7805116..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/red_simple_circle-web.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/res/drawable-hdpi/red_simple_circle.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/res/drawable-hdpi/red_simple_circle.png
deleted file mode 100644
index 6fdf98e..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/res/drawable-hdpi/red_simple_circle.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/res/drawable-mdpi/red_simple_circle.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/res/drawable-mdpi/red_simple_circle.png
deleted file mode 100644
index 18a677f..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/res/drawable-mdpi/red_simple_circle.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/res/drawable-xhdpi/red_simple_circle.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/res/drawable-xhdpi/red_simple_circle.png
deleted file mode 100644
index 85de4ee..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/res/drawable-xhdpi/red_simple_circle.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/res/drawable-xxhdpi/red_simple_circle.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/res/drawable-xxhdpi/red_simple_circle.png
deleted file mode 100644
index 5670c8c..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/launcher/res/drawable-xxhdpi/red_simple_circle.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/menus/res/drawable-hdpi/ic_menu_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/menus/res/drawable-hdpi/ic_menu_1.png
deleted file mode 100644
index 0d6d67f..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/menus/res/drawable-hdpi/ic_menu_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/menus/res/drawable-mdpi/ic_menu_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/menus/res/drawable-mdpi/ic_menu_1.png
deleted file mode 100644
index de68199..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/menus/res/drawable-mdpi/ic_menu_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/menus/res/drawable-xhdpi/ic_menu_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/menus/res/drawable-xhdpi/ic_menu_1.png
deleted file mode 100644
index dca9a75..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/menus/res/drawable-xhdpi/ic_menu_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v11+/res/drawable-hdpi/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v11+/res/drawable-hdpi/ic_stat_1.png
deleted file mode 100644
index 4273bef..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v11+/res/drawable-hdpi/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v11+/res/drawable-mdpi/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v11+/res/drawable-mdpi/ic_stat_1.png
deleted file mode 100644
index c8994f5..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v11+/res/drawable-mdpi/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v11+/res/drawable-xhdpi/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v11+/res/drawable-xhdpi/ic_stat_1.png
deleted file mode 100644
index 1643eba..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v11+/res/drawable-xhdpi/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-hdpi-v11/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-hdpi-v11/ic_stat_1.png
deleted file mode 100644
index 4273bef..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-hdpi-v11/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-hdpi/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-hdpi/ic_stat_1.png
deleted file mode 100644
index 2fc269b..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-hdpi/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-mdpi-v11/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-mdpi-v11/ic_stat_1.png
deleted file mode 100644
index c8994f5..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-mdpi-v11/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-mdpi/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-mdpi/ic_stat_1.png
deleted file mode 100644
index 524e31a..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-mdpi/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-xhdpi-v11/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-xhdpi-v11/ic_stat_1.png
deleted file mode 100644
index 1643eba..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-xhdpi-v11/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-xhdpi/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-xhdpi/ic_stat_1.png
deleted file mode 100644
index 8b24336..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification-v9+/res/drawable-xhdpi/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-hdpi-v11/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-hdpi-v11/ic_stat_1.png
deleted file mode 100644
index 4273bef..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-hdpi-v11/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-hdpi-v9/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-hdpi-v9/ic_stat_1.png
deleted file mode 100644
index 2fc269b..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-hdpi-v9/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-hdpi/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-hdpi/ic_stat_1.png
deleted file mode 100644
index a1c9285..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-hdpi/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-mdpi-v11/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-mdpi-v11/ic_stat_1.png
deleted file mode 100644
index c8994f5..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-mdpi-v11/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-mdpi-v9/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-mdpi-v9/ic_stat_1.png
deleted file mode 100644
index 524e31a..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-mdpi-v9/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-mdpi/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-mdpi/ic_stat_1.png
deleted file mode 100644
index 40b27af..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-mdpi/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-xhdpi-v11/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-xhdpi-v11/ic_stat_1.png
deleted file mode 100644
index 1643eba..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-xhdpi-v11/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-xhdpi-v9/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-xhdpi-v9/ic_stat_1.png
deleted file mode 100644
index 8b24336..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-xhdpi-v9/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-xhdpi/ic_stat_1.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-xhdpi/ic_stat_1.png
deleted file mode 100644
index c7159ec..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/notification/res/drawable-xhdpi/ic_stat_1.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-hdpi/ic_tab_1_selected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-hdpi/ic_tab_1_selected.png
deleted file mode 100644
index 1e367dc..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-hdpi/ic_tab_1_selected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-hdpi/ic_tab_1_unselected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-hdpi/ic_tab_1_unselected.png
deleted file mode 100644
index 8d1ea96..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-hdpi/ic_tab_1_unselected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-ldpi/ic_tab_1_selected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-ldpi/ic_tab_1_selected.png
deleted file mode 100644
index 1d79c30..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-ldpi/ic_tab_1_selected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-ldpi/ic_tab_1_unselected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-ldpi/ic_tab_1_unselected.png
deleted file mode 100644
index 4ed95d7..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-ldpi/ic_tab_1_unselected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-mdpi/ic_tab_1_selected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-mdpi/ic_tab_1_selected.png
deleted file mode 100644
index c741050..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-mdpi/ic_tab_1_selected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-mdpi/ic_tab_1_unselected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-mdpi/ic_tab_1_unselected.png
deleted file mode 100644
index c11de02..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-mdpi/ic_tab_1_unselected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-xhdpi/ic_tab_1_selected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-xhdpi/ic_tab_1_selected.png
deleted file mode 100644
index f61e1de..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-xhdpi/ic_tab_1_selected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-xhdpi/ic_tab_1_unselected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-xhdpi/ic_tab_1_unselected.png
deleted file mode 100644
index 52852ee..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs-v5+/res/drawable-xhdpi/ic_tab_1_unselected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-hdpi-v5/ic_tab_1_selected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-hdpi-v5/ic_tab_1_selected.png
deleted file mode 100644
index 1e367dc..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-hdpi-v5/ic_tab_1_selected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-hdpi-v5/ic_tab_1_unselected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-hdpi-v5/ic_tab_1_unselected.png
deleted file mode 100644
index 8d1ea96..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-hdpi-v5/ic_tab_1_unselected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-hdpi/ic_tab_1_selected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-hdpi/ic_tab_1_selected.png
deleted file mode 100644
index 5a49be9..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-hdpi/ic_tab_1_selected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-hdpi/ic_tab_1_unselected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-hdpi/ic_tab_1_unselected.png
deleted file mode 100644
index d957240..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-hdpi/ic_tab_1_unselected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-mdpi-v5/ic_tab_1_selected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-mdpi-v5/ic_tab_1_selected.png
deleted file mode 100644
index c741050..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-mdpi-v5/ic_tab_1_selected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-mdpi-v5/ic_tab_1_unselected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-mdpi-v5/ic_tab_1_unselected.png
deleted file mode 100644
index c11de02..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-mdpi-v5/ic_tab_1_unselected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-mdpi/ic_tab_1_selected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-mdpi/ic_tab_1_selected.png
deleted file mode 100644
index 7c603b7..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-mdpi/ic_tab_1_selected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-mdpi/ic_tab_1_unselected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-mdpi/ic_tab_1_unselected.png
deleted file mode 100644
index 521bf60..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-mdpi/ic_tab_1_unselected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-xhdpi-v5/ic_tab_1_selected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-xhdpi-v5/ic_tab_1_selected.png
deleted file mode 100644
index f61e1de..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-xhdpi-v5/ic_tab_1_selected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-xhdpi-v5/ic_tab_1_unselected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-xhdpi-v5/ic_tab_1_unselected.png
deleted file mode 100644
index 52852ee..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-xhdpi-v5/ic_tab_1_unselected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-xhdpi/ic_tab_1_selected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-xhdpi/ic_tab_1_selected.png
deleted file mode 100644
index 317fc5a..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-xhdpi/ic_tab_1_selected.png
+++ /dev/null
Binary files differ
diff --git a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-xhdpi/ic_tab_1_unselected.png b/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-xhdpi/ic_tab_1_unselected.png
deleted file mode 100644
index 7a0ffc6..0000000
--- a/assetstudio/tests/src/com/android/assetstudiolib/testdata/tabs/res/drawable-xhdpi/ic_tab_1_unselected.png
+++ /dev/null
Binary files differ
diff --git a/build/product_sdk.mk b/build/product_sdk.mk
index 226dba3..cf4879e 100644
--- a/build/product_sdk.mk
+++ b/build/product_sdk.mk
@@ -33,13 +33,11 @@
 	anttasks \
 	archquery \
 	assetstudio \
-	common-tests \
 	ddmlib \
 	ddms \
 	ddmuilib \
 	draw9patch \
 	dvlib \
-	dvlib-tests \
 	hierarchyviewer \
 	sdk_common \
 	layoutlib_api \
diff --git a/build/tools.atree b/build/tools.atree
index a8c9da6..b5a7edd 100644
--- a/build/tools.atree
+++ b/build/tools.atree
@@ -69,9 +69,9 @@
 bin/traceview                       tools/traceview
 bin/android                         tools/android
 bin/monkeyrunner                    tools/monkeyrunner
-bin/lint                            tools/lint
 bin/uiautomatorviewer               tools/uiautomatorviewer
-prebuilts/devtools/jobb/etc/jobb    tools/jobb
+prebuilts/devtools/etc/jobb         tools/jobb
+prebuilts/devtools/etc/lint         tools/lint
 
 # sdk.git Ant templates for project build files
 sdk/templates/build.template        tools/lib/build.template
@@ -94,36 +94,36 @@
 sdk/files/android.el tools/lib/android.el
 
 # Java Libraries for the tools
-framework/common.jar             tools/lib/common.jar
-framework/swtmenubar.jar         tools/lib/swtmenubar.jar
-sdk/apkbuilder/etc/apkbuilder    tools/apkbuilder
-framework/sdkstats.jar           tools/lib/sdkstats.jar
-framework/archquery.jar          tools/lib/archquery.jar
-framework/ddms.jar               tools/lib/ddms.jar
-framework/ddmlib.jar             tools/lib/ddmlib.jar
-framework/ddmuilib.jar           tools/lib/ddmuilib.jar
-framework/hierarchyviewer2.jar   tools/lib/hierarchyviewer2.jar
-framework/hierarchyviewerlib.jar tools/lib/hierarchyviewerlib.jar
-framework/draw9patch.jar         tools/lib/draw9patch.jar
-framework/traceview.jar          tools/lib/traceview.jar
-framework/anttasks.jar           tools/lib/anttasks.jar
-framework/sdklib.jar             tools/lib/sdklib.jar
-framework/sdkuilib.jar           tools/lib/sdkuilib.jar
-framework/sdkmanager.jar         tools/lib/sdkmanager.jar
-framework/monkeyrunner.jar       tools/lib/monkeyrunner.jar
-framework/chimpchat.jar          tools/lib/chimpchat.jar
-framework/guava-tools.jar        tools/lib/guava-tools.jar
-framework/jsilver.jar            tools/lib/jsilver.jar
-framework/jython.jar             tools/lib/jython.jar
-framework/lint.jar               tools/lib/lint.jar
-framework/lint_api.jar           tools/lib/lint_api.jar
-framework/lint_checks.jar        tools/lib/lint_checks.jar
-framework/manifmerger.jar        tools/lib/manifmerger.jar
-framework/dvlib.jar              tools/lib/dvlib.jar
-framework/layoutlib_api.jar      tools/lib/layoutlib_api.jar
-framework/uiautomatorviewer.jar  tools/lib/uiautomatorviewer.jar
-framework/jobb.jar               tools/lib/jobb.jar
-framework/fat32lib.jar           tools/lib/fat32lib.jar
+prebuilts/devtools/common.jar             tools/lib/common.jar
+prebuilts/devtools/swtmenubar.jar         tools/lib/swtmenubar.jar
+sdk/apkbuilder/etc/apkbuilder             tools/apkbuilder
+framework/sdkstats.jar                    tools/lib/sdkstats.jar
+framework/archquery.jar                   tools/lib/archquery.jar
+framework/ddms.jar                        tools/lib/ddms.jar
+prebuilts/devtools/ddmlib.jar             tools/lib/ddmlib.jar
+framework/ddmuilib.jar                    tools/lib/ddmuilib.jar
+framework/hierarchyviewer2.jar            tools/lib/hierarchyviewer2.jar
+framework/hierarchyviewerlib.jar          tools/lib/hierarchyviewerlib.jar
+framework/draw9patch.jar                  tools/lib/draw9patch.jar
+framework/traceview.jar                   tools/lib/traceview.jar
+framework/anttasks.jar                    tools/lib/anttasks.jar
+prebuilts/devtools/sdklib.jar             tools/lib/sdklib.jar
+prebuilts/devtools/sdkuilib.jar           tools/lib/sdkuilib.jar
+framework/sdkmanager.jar                  tools/lib/sdkmanager.jar
+framework/monkeyrunner.jar                tools/lib/monkeyrunner.jar
+framework/chimpchat.jar                   tools/lib/chimpchat.jar
+framework/guava-tools.jar                 tools/lib/guava-tools.jar
+framework/jsilver.jar                     tools/lib/jsilver.jar
+framework/jython.jar                      tools/lib/jython.jar
+prebuilts/devtools/lint.jar               tools/lib/lint.jar
+prebuilts/devtools/lint_api.jar           tools/lib/lint_api.jar
+prebuilts/devtools/lint_checks.jar        tools/lib/lint_checks.jar
+prebuilts/devtools/manifmerger.jar        tools/lib/manifmerger.jar
+prebuilts/devtools/dvlib.jar              tools/lib/dvlib.jar
+prebuilts/devtools/layoutlib_api.jar      tools/lib/layoutlib_api.jar
+framework/uiautomatorviewer.jar           tools/lib/uiautomatorviewer.jar
+prebuilts/devtools/jobb.jar               tools/lib/jobb.jar
+framework/fat32lib.jar                    tools/lib/fat32lib.jar
 prebuilts/tools/common/mkidentity/mkidentity-prebuilt.jar tools/lib/mkidentity.jar
 
 # 3rd Party java libraries
@@ -135,7 +135,7 @@
 prebuilts/tools/common/http-client/commons-codec-1.4.jar                            tools/lib/commons-codec-1.4.jar
 framework/emmalib.jar                                                               tools/lib/emma_device.jar
 external/emma/lib/emma.jar                                                          tools/lib/emma.jar
-external/emma/lib/emma_ant.jar                                                     tools/lib/emma_ant.jar
+external/emma/lib/emma_ant.jar                                                      tools/lib/emma_ant.jar
 prebuilts/tools/common/jfreechart/jcommon-1.0.12.jar                                tools/lib/jcommon-1.0.12.jar
 prebuilts/tools/common/jfreechart/jfreechart-1.0.9.jar                              tools/lib/jfreechart-1.0.9.jar
 prebuilts/tools/common/jfreechart/jfreechart-1.0.9-swt.jar                          tools/lib/jfreechart-1.0.9-swt.jar
@@ -143,7 +143,6 @@
 prebuilts/tools/common/eclipse/org.eclipse.equinox.common_3.6.0.v20100503.jar       tools/lib/org.eclipse.equinox.common_3.6.0.v20100503.jar
 prebuilts/tools/common/eclipse/org.eclipse.jface_3.6.2.M20110210-1200.jar           tools/lib/org.eclipse.jface_3.6.2.M20110210-1200.jar
 prebuilts/tools/common/osgi/osgi.jar                                                tools/lib/osgi.jar
-prebuilts/tools/common/swing-worker/swing-worker-1.1.jar                            tools/lib/swing-worker-1.1.jar
 prebuilts/tools/common/asm-tools/asm-4.0.jar                                        tools/lib/asm-4.0.jar
 prebuilts/tools/common/asm-tools/asm-tree-4.0.jar                                   tools/lib/asm-tree-4.0.jar
 prebuilts/tools/common/asm-tools/asm-analysis-4.0.jar                               tools/lib/asm-analysis-4.0.jar
@@ -191,7 +190,4 @@
 
 sdk/testapps                      tests/testapps
 framework/ninepatch-tests.jar     tests/libtests/ninepatch-tests.jar
-framework/common-tests.jar        tests/libtests/common-tests.jar
-framework/layoutlib_api.jar       tests/libtests/layoutlib_api.jar
-framework/dvlib-tests.jar         tests/libtests/dvlib-tests.jar
 
diff --git a/build/tools.windows.atree b/build/tools.windows.atree
index f936d96..3a84ff8 100755
--- a/build/tools.windows.atree
+++ b/build/tools.windows.atree
@@ -37,10 +37,10 @@
 sdk/draw9patch/etc/draw9patch.bat                 tools/draw9patch.bat
 
 rm tools/lint
-sdk/lint/cli/etc/lint.bat                         tools/lint.bat
+prebuilts/devtools/etc/lint.bat                   tools/lint.bat
 
 rm tools/jobb
-prebuilts/devtools/jobb/etc/jobb.bat              tools/jobb.bat
+prebuilts/devtools/etc/jobb.bat                   tools/jobb.bat
 
 
 rm tools/emulator
diff --git a/common/Android.mk b/common/Android.mk
index 85bcd60..dc098fd 100644
--- a/common/Android.mk
+++ b/common/Android.mk
@@ -16,13 +16,12 @@
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
+# The common code has moved to tools/base/common.
+# The rule below uses the prebuilt common.jar.
+#
+# If you want to run the tests, cd to tools/base/common
+# and run ./gradlew :common:test
 
-LOCAL_JAR_MANIFEST := manifest.txt
-
-# IMPORTANT: if you add a new dependency here, please make sure
-# to also check the following files:
-#   common/manifest.txt
 LOCAL_JAVA_LIBRARIES := \
 	guava-tools
 
@@ -30,16 +29,8 @@
 
 LOCAL_MODULE_TAGS := optional
 
-include $(BUILD_HOST_JAVA_LIBRARY)
+LOCAL_PREBUILT_JAVA_LIBRARIES := \
+	../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
 
-# build the tests
-include $(CLEAR_VARS)
+include $(BUILD_HOST_PREBUILT)
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src/test/java)
-
-LOCAL_MODULE := common-tests
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_JAVA_LIBRARIES := common junit
-
-include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/common/src/main/java/com/android/SdkConstants.java b/common/src/main/java/com/android/SdkConstants.java
deleted file mode 100644
index a0fdc39..0000000
--- a/common/src/main/java/com/android/SdkConstants.java
+++ /dev/null
@@ -1,1168 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android;
-
-import java.io.File;
-
-/**
- * Constant definition class.<br>
- * <br>
- * Most constants have a prefix defining the content.
- * <ul>
- * <li><code>OS_</code> OS path constant. These paths are different depending on the platform.</li>
- * <li><code>FN_</code> File name constant.</li>
- * <li><code>FD_</code> Folder name constant.</li>
- * <li><code>TAG_</code> XML element tag name</li>
- * <li><code>ATTR_</code> XML attribute name</li>
- * <li><code>VALUE_</code> XML attribute value</li>
- * <li><code>CLASS_</code> Class name</li>
- * <li><code>DOT_</code> File name extension, including the dot </li>
- * <li><code>EXT_</code> File name extension, without the dot </li>
- * </ul>
- */
-@SuppressWarnings("javadoc") // Not documenting all the fields here
-public final class SdkConstants {
-    public static final int PLATFORM_UNKNOWN = 0;
-    public static final int PLATFORM_LINUX = 1;
-    public static final int PLATFORM_WINDOWS = 2;
-    public static final int PLATFORM_DARWIN = 3;
-
-    /**
-     * Returns current platform, one of {@link #PLATFORM_WINDOWS}, {@link #PLATFORM_DARWIN},
-     * {@link #PLATFORM_LINUX} or {@link #PLATFORM_UNKNOWN}.
-     */
-    public static final int CURRENT_PLATFORM = currentPlatform();
-
-    /**
-     * Charset for the ini file handled by the SDK.
-     */
-    public static final String INI_CHARSET = "UTF-8";                                 //$NON-NLS-1$
-
-    /** An SDK Project's AndroidManifest.xml file */
-    public static final String FN_ANDROID_MANIFEST_XML= "AndroidManifest.xml";        //$NON-NLS-1$
-    /** pre-dex jar filename. i.e. "classes.jar" */
-    public static final String FN_CLASSES_JAR = "classes.jar";                        //$NON-NLS-1$
-    /** Dex filename inside the APK. i.e. "classes.dex" */
-    public static final String FN_APK_CLASSES_DEX = "classes.dex";                    //$NON-NLS-1$
-
-    /** An SDK Project's build.xml file */
-    public static final String FN_BUILD_XML = "build.xml";                            //$NON-NLS-1$
-
-    /** Name of the framework library, i.e. "android.jar" */
-    public static final String FN_FRAMEWORK_LIBRARY = "android.jar";                  //$NON-NLS-1$
-    /** Name of the framework library, i.e. "uiautomator.jar" */
-    public static final String FN_UI_AUTOMATOR_LIBRARY = "uiautomator.jar";           //$NON-NLS-1$
-    /** Name of the layout attributes, i.e. "attrs.xml" */
-    public static final String FN_ATTRS_XML = "attrs.xml";                            //$NON-NLS-1$
-    /** Name of the layout attributes, i.e. "attrs_manifest.xml" */
-    public static final String FN_ATTRS_MANIFEST_XML = "attrs_manifest.xml";          //$NON-NLS-1$
-    /** framework aidl import file */
-    public static final String FN_FRAMEWORK_AIDL = "framework.aidl";                  //$NON-NLS-1$
-    /** framework renderscript folder */
-    public static final String FN_FRAMEWORK_RENDERSCRIPT = "renderscript";            //$NON-NLS-1$
-    /** framework include folder */
-    public static final String FN_FRAMEWORK_INCLUDE = "include";                      //$NON-NLS-1$
-    /** framework include (clang) folder */
-    public static final String FN_FRAMEWORK_INCLUDE_CLANG = "clang-include";          //$NON-NLS-1$
-    /** layoutlib.jar file */
-    public static final String FN_LAYOUTLIB_JAR = "layoutlib.jar";                    //$NON-NLS-1$
-    /** widget list file */
-    public static final String FN_WIDGETS = "widgets.txt";                            //$NON-NLS-1$
-    /** Intent activity actions list file */
-    public static final String FN_INTENT_ACTIONS_ACTIVITY = "activity_actions.txt";   //$NON-NLS-1$
-    /** Intent broadcast actions list file */
-    public static final String FN_INTENT_ACTIONS_BROADCAST = "broadcast_actions.txt"; //$NON-NLS-1$
-    /** Intent service actions list file */
-    public static final String FN_INTENT_ACTIONS_SERVICE = "service_actions.txt";     //$NON-NLS-1$
-    /** Intent category list file */
-    public static final String FN_INTENT_CATEGORIES = "categories.txt";               //$NON-NLS-1$
-
-    /** annotations support jar */
-    public static final String FN_ANNOTATIONS_JAR = "annotations.jar";                //$NON-NLS-1$
-
-    /** platform build property file */
-    public static final String FN_BUILD_PROP = "build.prop";                          //$NON-NLS-1$
-    /** plugin properties file */
-    public static final String FN_PLUGIN_PROP = "plugin.prop";                        //$NON-NLS-1$
-    /** add-on manifest file */
-    public static final String FN_MANIFEST_INI = "manifest.ini";                      //$NON-NLS-1$
-    /** add-on layout device XML file. */
-    public static final String FN_DEVICES_XML = "devices.xml";                        //$NON-NLS-1$
-    /** hardware properties definition file */
-    public static final String FN_HARDWARE_INI = "hardware-properties.ini";           //$NON-NLS-1$
-
-    /** project property file */
-    public static final String FN_PROJECT_PROPERTIES = "project.properties";          //$NON-NLS-1$
-
-    /** project local property file */
-    public static final String FN_LOCAL_PROPERTIES = "local.properties";              //$NON-NLS-1$
-
-    /** project ant property file */
-    public static final String FN_ANT_PROPERTIES = "ant.properties";                  //$NON-NLS-1$
-
-    /** Skin layout file */
-    public static final String FN_SKIN_LAYOUT = "layout";                             //$NON-NLS-1$
-
-    /** dx.jar file */
-    public static final String FN_DX_JAR = "dx.jar";                                  //$NON-NLS-1$
-
-    /** dx executable (with extension for the current OS) */
-    public static final String FN_DX =
-        "dx" + ext(".bat", "");                           //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-    /** aapt executable (with extension for the current OS) */
-    public static final String FN_AAPT =
-        "aapt" + ext(".exe", "");                         //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-    /** aidl executable (with extension for the current OS) */
-    public static final String FN_AIDL =
-        "aidl" + ext(".exe", "");                         //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-    /** renderscript executable (with extension for the current OS) */
-    public static final String FN_RENDERSCRIPT =
-        "llvm-rs-cc" + ext(".exe", "");                   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-    /** adb executable (with extension for the current OS) */
-    public static final String FN_ADB =
-        "adb" + ext(".exe", "");                          //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-    /** emulator executable for the current OS */
-    public static final String FN_EMULATOR =
-        "emulator" + ext(".exe", "");                     //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-    /** zipalign executable (with extension for the current OS) */
-    public static final String FN_ZIPALIGN =
-        "zipalign" + ext(".exe", "");                     //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-    /** dexdump executable (with extension for the current OS) */
-    public static final String FN_DEXDUMP =
-        "dexdump" + ext(".exe", "");                      //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-    /** proguard executable (with extension for the current OS) */
-    public static final String FN_PROGUARD =
-        "proguard" + ext(".bat", ".sh");                  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-    /** find_lock for Windows (with extension for the current OS) */
-    public static final String FN_FIND_LOCK =
-        "find_lock" + ext(".exe", "");                    //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-    /** properties file for SDK Updater packages */
-    public static final String FN_SOURCE_PROP = "source.properties";                  //$NON-NLS-1$
-    /** properties file for content hash of installed packages */
-    public static final String FN_CONTENT_HASH_PROP = "content_hash.properties";      //$NON-NLS-1$
-    /** properties file for the SDK */
-    public static final String FN_SDK_PROP = "sdk.properties";                        //$NON-NLS-1$
-
-    /**
-     * filename for gdbserver.
-     */
-    public static final String FN_GDBSERVER = "gdbserver";              //$NON-NLS-1$
-
-    /** global Android proguard config file */
-    public static final String FN_ANDROID_PROGUARD_FILE = "proguard-android.txt";   //$NON-NLS-1$
-    /** global Android proguard config file with optimization enabled */
-    public static final String FN_ANDROID_OPT_PROGUARD_FILE = "proguard-android-optimize.txt";  //$NON-NLS-1$
-    /** default proguard config file with new file extension (for project specific stuff) */
-    public static final String FN_PROJECT_PROGUARD_FILE = "proguard-project.txt";   //$NON-NLS-1$
-
-    /* Folder Names for Android Projects . */
-
-    /** Resources folder name, i.e. "res". */
-    public static final String FD_RESOURCES = "res";                    //$NON-NLS-1$
-    /** Assets folder name, i.e. "assets" */
-    public static final String FD_ASSETS = "assets";                    //$NON-NLS-1$
-    /** Default source folder name in an SDK project, i.e. "src".
-     * <p/>
-     * Note: this is not the same as {@link #FD_PKG_SOURCES}
-     * which is an SDK sources folder for packages. */
-    public static final String FD_SOURCES = "src";                      //$NON-NLS-1$
-    /** Default generated source folder name, i.e. "gen" */
-    public static final String FD_GEN_SOURCES = "gen";                  //$NON-NLS-1$
-    /** Default native library folder name inside the project, i.e. "libs"
-     * While the folder inside the .apk is "lib", we call that one libs because
-     * that's what we use in ant for both .jar and .so and we need to make the 2 development ways
-     * compatible. */
-    public static final String FD_NATIVE_LIBS = "libs";                 //$NON-NLS-1$
-    /** Native lib folder inside the APK: "lib" */
-    public static final String FD_APK_NATIVE_LIBS = "lib";              //$NON-NLS-1$
-    /** Default output folder name, i.e. "bin" */
-    public static final String FD_OUTPUT = "bin";                       //$NON-NLS-1$
-    /** Classes output folder name, i.e. "classes" */
-    public static final String FD_CLASSES_OUTPUT = "classes";           //$NON-NLS-1$
-    /** proguard output folder for mapping, etc.. files */
-    public static final String FD_PROGUARD = "proguard";                //$NON-NLS-1$
-    /** aidl output folder for copied aidl files */
-    public static final String FD_AIDL = "aidl";                        //$NON-NLS-1$
-
-    /* Folder Names for the Android SDK */
-
-    /** Name of the SDK platforms folder. */
-    public static final String FD_PLATFORMS = "platforms";              //$NON-NLS-1$
-    /** Name of the SDK addons folder. */
-    public static final String FD_ADDONS = "add-ons";                   //$NON-NLS-1$
-    /** Name of the SDK system-images folder. */
-    public static final String FD_SYSTEM_IMAGES = "system-images";      //$NON-NLS-1$
-    /** Name of the SDK sources folder where source packages are installed.
-     * <p/>
-     * Note this is not the same as {@link #FD_SOURCES} which is the folder name where sources
-     * are installed inside a project. */
-    public static final String FD_PKG_SOURCES = "sources";              //$NON-NLS-1$
-    /** Name of the SDK tools folder. */
-    public static final String FD_TOOLS = "tools";                      //$NON-NLS-1$
-    /** Name of the SDK tools/support folder. */
-    public static final String FD_SUPPORT = "support";                  //$NON-NLS-1$
-    /** Name of the SDK platform tools folder. */
-    public static final String FD_PLATFORM_TOOLS = "platform-tools";    //$NON-NLS-1$
-    /** Name of the SDK tools/lib folder. */
-    public static final String FD_LIB = "lib";                          //$NON-NLS-1$
-    /** Name of the SDK docs folder. */
-    public static final String FD_DOCS = "docs";                        //$NON-NLS-1$
-    /** Name of the doc folder containing API reference doc (javadoc) */
-    public static final String FD_DOCS_REFERENCE = "reference";         //$NON-NLS-1$
-    /** Name of the SDK images folder. */
-    public static final String FD_IMAGES = "images";                    //$NON-NLS-1$
-    /** Name of the ABI to support. */
-    public static final String ABI_ARMEABI = "armeabi";                 //$NON-NLS-1$
-    public static final String ABI_ARMEABI_V7A = "armeabi-v7a";         //$NON-NLS-1$
-    public static final String ABI_INTEL_ATOM = "x86";                  //$NON-NLS-1$
-    public static final String ABI_MIPS = "mips";                       //$NON-NLS-1$
-    /** Name of the CPU arch to support. */
-    public static final String CPU_ARCH_ARM = "arm";                    //$NON-NLS-1$
-    public static final String CPU_ARCH_INTEL_ATOM = "x86";             //$NON-NLS-1$
-    public static final String CPU_ARCH_MIPS = "mips";                  //$NON-NLS-1$
-    /** Name of the CPU model to support. */
-    public static final String CPU_MODEL_CORTEX_A8 = "cortex-a8";       //$NON-NLS-1$
-
-    /** Name of the SDK skins folder. */
-    public static final String FD_SKINS = "skins";                      //$NON-NLS-1$
-    /** Name of the SDK samples folder. */
-    public static final String FD_SAMPLES = "samples";                  //$NON-NLS-1$
-    /** Name of the SDK extras folder. */
-    public static final String FD_EXTRAS = "extras";                    //$NON-NLS-1$
-    /**
-     * Name of an extra's sample folder.
-     * Ideally extras should have one {@link #FD_SAMPLES} folder containing
-     * one or more sub-folders (one per sample). However some older extras
-     * might contain a single "sample" folder with directly the samples files
-     * in it. When possible we should encourage extras' owners to move to the
-     * multi-samples format.
-     */
-    public static final String FD_SAMPLE = "sample";                    //$NON-NLS-1$
-    /** Name of the SDK templates folder, i.e. "templates" */
-    public static final String FD_TEMPLATES = "templates";              //$NON-NLS-1$
-    /** Name of the SDK Ant folder, i.e. "ant" */
-    public static final String FD_ANT = "ant";                          //$NON-NLS-1$
-    /** Name of the SDK data folder, i.e. "data" */
-    public static final String FD_DATA = "data";                        //$NON-NLS-1$
-    /** Name of the SDK renderscript folder, i.e. "rs" */
-    public static final String FD_RENDERSCRIPT = "rs";                  //$NON-NLS-1$
-    /** Name of the SDK resources folder, i.e. "res" */
-    public static final String FD_RES = "res";                          //$NON-NLS-1$
-    /** Name of the SDK font folder, i.e. "fonts" */
-    public static final String FD_FONTS = "fonts";                      //$NON-NLS-1$
-    /** Name of the android sources directory */
-    public static final String FD_ANDROID_SOURCES = "sources";          //$NON-NLS-1$
-    /** Name of the addon libs folder. */
-    public static final String FD_ADDON_LIBS = "libs";                  //$NON-NLS-1$
-
-    /** Name of the cache folder in the $HOME/.android. */
-    public static final String FD_CACHE = "cache";                      //$NON-NLS-1$
-
-    /** API codename of a release (non preview) system image or platform. **/
-    public static final String CODENAME_RELEASE = "REL";                //$NON-NLS-1$
-
-    /** Namespace for the resource XML, i.e. "http://schemas.android.com/apk/res/android" */
-    public static final String NS_RESOURCES =
-        "http://schemas.android.com/apk/res/android";                   //$NON-NLS-1$
-
-    /** Namespace for the device schema, i.e. "http://schemas.android.com/sdk/devices/1" */
-    public static final String NS_DEVICES_XSD =
-        "http://schemas.android.com/sdk/devices/1";                     //$NON-NLS-1$
-
-
-    /** The name of the uses-library that provides "android.test.runner" */
-    public static final String ANDROID_TEST_RUNNER_LIB =
-        "android.test.runner";                                          //$NON-NLS-1$
-
-    /* Folder path relative to the SDK root */
-    /** Path of the documentation directory relative to the sdk folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_SDK_DOCS_FOLDER = FD_DOCS + File.separator;
-
-    /** Path of the tools directory relative to the sdk folder, or to a platform folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_SDK_TOOLS_FOLDER = FD_TOOLS + File.separator;
-
-    /** Path of the lib directory relative to the sdk folder, or to a platform folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_SDK_TOOLS_LIB_FOLDER =
-            OS_SDK_TOOLS_FOLDER + FD_LIB + File.separator;
-
-    /**
-     * Path of the lib directory relative to the sdk folder, or to a platform
-     * folder. This is an OS path, ending with a separator.
-     */
-    public static final String OS_SDK_TOOLS_LIB_EMULATOR_FOLDER = OS_SDK_TOOLS_LIB_FOLDER
-            + "emulator" + File.separator;                              //$NON-NLS-1$
-
-    /** Path of the platform tools directory relative to the sdk folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_SDK_PLATFORM_TOOLS_FOLDER = FD_PLATFORM_TOOLS + File.separator;
-
-    /** Path of the Platform tools Lib directory relative to the sdk folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_SDK_PLATFORM_TOOLS_LIB_FOLDER =
-            OS_SDK_PLATFORM_TOOLS_FOLDER + FD_LIB + File.separator;
-
-    /** Path of the bin folder of proguard folder relative to the sdk folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_SDK_TOOLS_PROGUARD_BIN_FOLDER =
-        SdkConstants.OS_SDK_TOOLS_FOLDER +
-        "proguard" + File.separator +                                   //$NON-NLS-1$
-        "bin" + File.separator;                                         //$NON-NLS-1$
-
-    /* Folder paths relative to a platform or add-on folder */
-
-    /** Path of the images directory relative to a platform or addon folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_IMAGES_FOLDER = FD_IMAGES + File.separator;
-
-    /** Path of the skin directory relative to a platform or addon folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_SKINS_FOLDER = FD_SKINS + File.separator;
-
-    /* Folder paths relative to a Platform folder */
-
-    /** Path of the data directory relative to a platform folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_PLATFORM_DATA_FOLDER = FD_DATA + File.separator;
-
-    /** Path of the renderscript directory relative to a platform folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_PLATFORM_RENDERSCRIPT_FOLDER = FD_RENDERSCRIPT + File.separator;
-
-
-    /** Path of the samples directory relative to a platform folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_PLATFORM_SAMPLES_FOLDER = FD_SAMPLES + File.separator;
-
-    /** Path of the resources directory relative to a platform folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_PLATFORM_RESOURCES_FOLDER =
-            OS_PLATFORM_DATA_FOLDER + FD_RES + File.separator;
-
-    /** Path of the fonts directory relative to a platform folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_PLATFORM_FONTS_FOLDER =
-            OS_PLATFORM_DATA_FOLDER + FD_FONTS + File.separator;
-
-    /** Path of the android source directory relative to a platform folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_PLATFORM_SOURCES_FOLDER = FD_ANDROID_SOURCES + File.separator;
-
-    /** Path of the android templates directory relative to a platform folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_PLATFORM_TEMPLATES_FOLDER = FD_TEMPLATES + File.separator;
-
-    /** Path of the Ant build rules directory relative to a platform folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_PLATFORM_ANT_FOLDER = FD_ANT + File.separator;
-
-    /** Path of the attrs.xml file relative to a platform folder. */
-    public static final String OS_PLATFORM_ATTRS_XML =
-            OS_PLATFORM_RESOURCES_FOLDER + SdkConstants.FD_RES_VALUES + File.separator +
-            FN_ATTRS_XML;
-
-    /** Path of the attrs_manifest.xml file relative to a platform folder. */
-    public static final String OS_PLATFORM_ATTRS_MANIFEST_XML =
-            OS_PLATFORM_RESOURCES_FOLDER + SdkConstants.FD_RES_VALUES + File.separator +
-            FN_ATTRS_MANIFEST_XML;
-
-    /** Path of the layoutlib.jar file relative to a platform folder. */
-    public static final String OS_PLATFORM_LAYOUTLIB_JAR =
-            OS_PLATFORM_DATA_FOLDER + FN_LAYOUTLIB_JAR;
-
-    /** Path of the renderscript include folder relative to a platform folder. */
-    public static final String OS_FRAMEWORK_RS =
-            FN_FRAMEWORK_RENDERSCRIPT + File.separator + FN_FRAMEWORK_INCLUDE;
-    /** Path of the renderscript (clang) include folder relative to a platform folder. */
-    public static final String OS_FRAMEWORK_RS_CLANG =
-            FN_FRAMEWORK_RENDERSCRIPT + File.separator + FN_FRAMEWORK_INCLUDE_CLANG;
-
-    /* Folder paths relative to a addon folder */
-    /** Path of the images directory relative to a folder folder.
-     *  This is an OS path, ending with a separator. */
-    public static final String OS_ADDON_LIBS_FOLDER = FD_ADDON_LIBS + File.separator;
-
-    /** Skin default **/
-    public static final String SKIN_DEFAULT = "default";                    //$NON-NLS-1$
-
-    /** SDK property: ant templates revision */
-    public static final String PROP_SDK_ANT_TEMPLATES_REVISION =
-        "sdk.ant.templates.revision";                                       //$NON-NLS-1$
-
-    /** SDK property: default skin */
-    public static final String PROP_SDK_DEFAULT_SKIN = "sdk.skin.default"; //$NON-NLS-1$
-
-    /* Android Class Constants */
-    public static final String CLASS_ACTIVITY = "android.app.Activity"; //$NON-NLS-1$
-    public static final String CLASS_APPLICATION = "android.app.Application"; //$NON-NLS-1$
-    public static final String CLASS_SERVICE = "android.app.Service"; //$NON-NLS-1$
-    public static final String CLASS_BROADCASTRECEIVER = "android.content.BroadcastReceiver"; //$NON-NLS-1$
-    public static final String CLASS_CONTENTPROVIDER = "android.content.ContentProvider"; //$NON-NLS-1$
-    public static final String CLASS_INSTRUMENTATION = "android.app.Instrumentation"; //$NON-NLS-1$
-    public static final String CLASS_INSTRUMENTATION_RUNNER =
-        "android.test.InstrumentationTestRunner"; //$NON-NLS-1$
-    public static final String CLASS_BUNDLE = "android.os.Bundle"; //$NON-NLS-1$
-    public static final String CLASS_R = "android.R"; //$NON-NLS-1$
-    public static final String CLASS_MANIFEST_PERMISSION = "android.Manifest$permission"; //$NON-NLS-1$
-    public static final String CLASS_INTENT = "android.content.Intent"; //$NON-NLS-1$
-    public static final String CLASS_CONTEXT = "android.content.Context"; //$NON-NLS-1$
-    public static final String CLASS_VIEW = "android.view.View"; //$NON-NLS-1$
-    public static final String CLASS_VIEWGROUP = "android.view.ViewGroup"; //$NON-NLS-1$
-    public static final String CLASS_NAME_LAYOUTPARAMS = "LayoutParams"; //$NON-NLS-1$
-    public static final String CLASS_VIEWGROUP_LAYOUTPARAMS =
-        CLASS_VIEWGROUP + "$" + CLASS_NAME_LAYOUTPARAMS; //$NON-NLS-1$
-    public static final String CLASS_NAME_FRAMELAYOUT = "FrameLayout"; //$NON-NLS-1$
-    public static final String CLASS_FRAMELAYOUT =
-        "android.widget." + CLASS_NAME_FRAMELAYOUT; //$NON-NLS-1$
-    public static final String CLASS_PREFERENCE = "android.preference.Preference"; //$NON-NLS-1$
-    public static final String CLASS_NAME_PREFERENCE_SCREEN = "PreferenceScreen"; //$NON-NLS-1$
-    public static final String CLASS_PREFERENCES =
-        "android.preference." + CLASS_NAME_PREFERENCE_SCREEN; //$NON-NLS-1$
-    public static final String CLASS_PREFERENCEGROUP = "android.preference.PreferenceGroup"; //$NON-NLS-1$
-    public static final String CLASS_PARCELABLE = "android.os.Parcelable"; //$NON-NLS-1$
-    public static final String CLASS_FRAGMENT = "android.app.Fragment"; //$NON-NLS-1$
-    public static final String CLASS_V4_FRAGMENT = "android.support.v4.app.Fragment"; //$NON-NLS-1$
-    /** MockView is part of the layoutlib bridge and used to display classes that have
-     * no rendering in the graphical layout editor. */
-    public static final String CLASS_MOCK_VIEW = "com.android.layoutlib.bridge.MockView"; //$NON-NLS-1$
-
-    /** Returns the appropriate name for the 'android' command, which is 'android.exe' for
-     * Windows and 'android' for all other platforms. */
-    public static String androidCmdName() {
-        String os = System.getProperty("os.name");          //$NON-NLS-1$
-        String cmd = "android";                             //$NON-NLS-1$
-        if (os.startsWith("Windows")) {                     //$NON-NLS-1$
-            cmd += ".bat";                                  //$NON-NLS-1$
-        }
-        return cmd;
-    }
-
-    /** Returns the appropriate name for the 'mksdcard' command, which is 'mksdcard.exe' for
-     * Windows and 'mkdsdcard' for all other platforms. */
-    public static String mkSdCardCmdName() {
-        String os = System.getProperty("os.name");          //$NON-NLS-1$
-        String cmd = "mksdcard";                            //$NON-NLS-1$
-        if (os.startsWith("Windows")) {                     //$NON-NLS-1$
-            cmd += ".exe";                                  //$NON-NLS-1$
-        }
-        return cmd;
-    }
-
-    /**
-     * Returns current platform
-     *
-     * @return one of {@link #PLATFORM_WINDOWS}, {@link #PLATFORM_DARWIN},
-     * {@link #PLATFORM_LINUX} or {@link #PLATFORM_UNKNOWN}.
-     */
-    public static int currentPlatform() {
-        String os = System.getProperty("os.name");          //$NON-NLS-1$
-        if (os.startsWith("Mac OS")) {                      //$NON-NLS-1$
-            return PLATFORM_DARWIN;
-        } else if (os.startsWith("Windows")) {              //$NON-NLS-1$
-            return PLATFORM_WINDOWS;
-        } else if (os.startsWith("Linux")) {                //$NON-NLS-1$
-            return PLATFORM_LINUX;
-        }
-
-        return PLATFORM_UNKNOWN;
-    }
-
-    /**
-     * Returns current platform's UI name
-     *
-     * @return one of "Windows", "Mac OS X", "Linux" or "other".
-     */
-    public static String currentPlatformName() {
-        String os = System.getProperty("os.name");          //$NON-NLS-1$
-        if (os.startsWith("Mac OS")) {                      //$NON-NLS-1$
-            return "Mac OS X";                              //$NON-NLS-1$
-        } else if (os.startsWith("Windows")) {              //$NON-NLS-1$
-            return "Windows";                               //$NON-NLS-1$
-        } else if (os.startsWith("Linux")) {                //$NON-NLS-1$
-            return "Linux";                                 //$NON-NLS-1$
-        }
-
-        return "Other";
-    }
-
-    private static String ext(String windowsExtension, String nonWindowsExtension) {
-        if (CURRENT_PLATFORM == PLATFORM_WINDOWS) {
-            return windowsExtension;
-        } else {
-            return nonWindowsExtension;
-        }
-    }
-
-    /** Default anim resource folder name, i.e. "anim" */
-    public static final String FD_RES_ANIM = "anim"; //$NON-NLS-1$
-    /** Default animator resource folder name, i.e. "animator" */
-    public static final String FD_RES_ANIMATOR = "animator"; //$NON-NLS-1$
-    /** Default color resource folder name, i.e. "color" */
-    public static final String FD_RES_COLOR = "color"; //$NON-NLS-1$
-    /** Default drawable resource folder name, i.e. "drawable" */
-    public static final String FD_RES_DRAWABLE = "drawable"; //$NON-NLS-1$
-    /** Default interpolator resource folder name, i.e. "interpolator" */
-    public static final String FD_RES_INTERPOLATOR = "interpolator"; //$NON-NLS-1$
-    /** Default layout resource folder name, i.e. "layout" */
-    public static final String FD_RES_LAYOUT = "layout"; //$NON-NLS-1$
-    /** Default menu resource folder name, i.e. "menu" */
-    public static final String FD_RES_MENU = "menu"; //$NON-NLS-1$
-    /** Default menu resource folder name, i.e. "mipmap" */
-    public static final String FD_RES_MIPMAP = "mipmap"; //$NON-NLS-1$
-    /** Default values resource folder name, i.e. "values" */
-    public static final String FD_RES_VALUES = "values"; //$NON-NLS-1$
-    /** Default xml resource folder name, i.e. "xml" */
-    public static final String FD_RES_XML = "xml"; //$NON-NLS-1$
-    /** Default raw resource folder name, i.e. "raw" */
-    public static final String FD_RES_RAW = "raw"; //$NON-NLS-1$
-    /** Separator between the resource folder qualifier. */
-    public static final String RES_QUALIFIER_SEP = "-"; //$NON-NLS-1$
-    /** Namespace used in XML files for Android attributes */
-
-    // ---- XML ----
-
-    /** URI of the reserved "xmlns"  prefix */
-    public static final String XMLNS_URI = "http://www.w3.org/2000/xmlns/";  //$NON-NLS-1$
-    /** The "xmlns" attribute name */
-    public static final String XMLNS = "xmlns";                              //$NON-NLS-1$
-    /** The default prefix used for the {@link #XMLNS_URI} */
-    public static final String XMLNS_PREFIX = "xmlns:";                      //$NON-NLS-1$
-    /** Qualified name of the xmlns android declaration element */
-    public static final String XMLNS_ANDROID = "xmlns:android";              //$NON-NLS-1$
-    /** The default prefix used for the {@link #ANDROID_URI} name space */
-    public static final String ANDROID_NS_NAME = "android";                  //$NON-NLS-1$
-    /** The default prefix used for the {@link #ANDROID_URI} name space including the colon  */
-    public static final String ANDROID_NS_NAME_PREFIX = "android:";          //$NON-NLS-1$
-    /** The default prefix used for the app */
-    public static final String APP_PREFIX = "app";                          //$NON-NLS-1$
-    /** The entity for the ampersand character */
-    public static final String AMP_ENTITY = "&amp;";                         //$NON-NLS-1$
-    /** The entity for the quote character */
-    public static final String QUOT_ENTITY = "&quot;";                       //$NON-NLS-1$
-    /** The entity for the apostrophe character */
-    public static final String APOS_ENTITY = "&apos;";                       //$NON-NLS-1$
-    /** The entity for the less than character */
-    public static final String LT_ENTITY = "&lt;";                           //$NON-NLS-1$
-    /** The entity for the greater than character */
-    public static final String GT_ENTITY = "&gt;";                           //$NON-NLS-1$
-
-    // ---- Elements and Attributes ----
-
-    /** Namespace prefix used for all resources */
-    public static final String URI_PREFIX =
-            "http://schemas.android.com/apk/res/";                     //$NON-NLS-1$
-    /** Namespace used in XML files for Android attributes */
-    public static final String ANDROID_URI =
-            "http://schemas.android.com/apk/res/android";              //$NON-NLS-1$
-    /** Namespace used in XML files for Android Tooling attributes */
-    public static final String TOOLS_URI =
-            "http://schemas.android.com/tools";                        //$NON-NLS-1$
-    /** Namespace used for auto-adjusting namespaces */
-    public static final String AUTO_URI =
-            "http://schemas.android.com/apk/res-auto";                 //$NON-NLS-1$
-    /** Default prefix used for tools attributes */
-    public static final String TOOLS_PREFIX = "tools";                 //$NON-NLS-1$
-    public static final String R_CLASS = "R";                          //$NON-NLS-1$
-    public static final String ANDROID_PKG = "android";                //$NON-NLS-1$
-
-    // Tags: Manifest
-    public static final String TAG_SERVICE = "service";                //$NON-NLS-1$
-    public static final String TAG_PERMISSION = "permission";          //$NON-NLS-1$
-    public static final String TAG_USES_PERMISSION = "uses-permission";//$NON-NLS-1$
-    public static final String TAG_USES_LIBRARY = "uses-library";      //$NON-NLS-1$
-    public static final String TAG_APPLICATION = "application";        //$NON-NLS-1$
-    public static final String TAG_INTENT_FILTER = "intent-filter";    //$NON-NLS-1$
-    public static final String TAG_USES_SDK = "uses-sdk";              //$NON-NLS-1$
-    public static final String TAG_ACTIVITY = "activity";              //$NON-NLS-1$
-    public static final String TAG_RECEIVER = "receiver";              //$NON-NLS-1$
-    public static final String TAG_PROVIDER = "provider";              //$NON-NLS-1$
-    public static final String TAG_GRANT_PERMISSION = "grant-uri-permission"; //$NON-NLS-1$
-    public static final String TAG_PATH_PERMISSION = "path-permission"; //$NON-NLS-1$
-
-    // Tags: Resources
-    public static final String TAG_RESOURCES = "resources";            //$NON-NLS-1$
-    public static final String TAG_STRING = "string";                  //$NON-NLS-1$
-    public static final String TAG_ARRAY = "array";                    //$NON-NLS-1$
-    public static final String TAG_STYLE = "style";                    //$NON-NLS-1$
-    public static final String TAG_ITEM = "item";                      //$NON-NLS-1$
-    public static final String TAG_STRING_ARRAY = "string-array";      //$NON-NLS-1$
-    public static final String TAG_PLURALS = "plurals";                //$NON-NLS-1$
-    public static final String TAG_INTEGER_ARRAY = "integer-array";    //$NON-NLS-1$
-    public static final String TAG_COLOR = "color";                    //$NON-NLS-1$
-    public static final String TAG_DIMEN = "dimen";                    //$NON-NLS-1$
-    public static final String TAG_DRAWABLE = "drawable";              //$NON-NLS-1$
-    public static final String TAG_MENU = "menu";                      //$NON-NLS-1$
-
-    // Tags: Layouts
-    public static final String VIEW_TAG = "view";                      //$NON-NLS-1$
-    public static final String VIEW_INCLUDE = "include";               //$NON-NLS-1$
-    public static final String VIEW_MERGE = "merge";                   //$NON-NLS-1$
-    public static final String VIEW_FRAGMENT = "fragment";             //$NON-NLS-1$
-    public static final String REQUEST_FOCUS = "requestFocus";         //$NON-NLS-1$
-
-    public static final String VIEW = "View";                          //$NON-NLS-1$
-    public static final String VIEW_GROUP = "ViewGroup";               //$NON-NLS-1$
-    public static final String FRAME_LAYOUT = "FrameLayout";           //$NON-NLS-1$
-    public static final String LINEAR_LAYOUT = "LinearLayout";         //$NON-NLS-1$
-    public static final String RELATIVE_LAYOUT = "RelativeLayout";     //$NON-NLS-1$
-    public static final String GRID_LAYOUT = "GridLayout";             //$NON-NLS-1$
-    public static final String SCROLL_VIEW = "ScrollView";             //$NON-NLS-1$
-    public static final String BUTTON = "Button";                      //$NON-NLS-1$
-    public static final String COMPOUND_BUTTON = "CompoundButton";     //$NON-NLS-1$
-    public static final String ADAPTER_VIEW = "AdapterView";           //$NON-NLS-1$
-    public static final String GALLERY = "Gallery";                    //$NON-NLS-1$
-    public static final String GRID_VIEW = "GridView";                 //$NON-NLS-1$
-    public static final String TAB_HOST = "TabHost";                   //$NON-NLS-1$
-    public static final String RADIO_GROUP = "RadioGroup";             //$NON-NLS-1$
-    public static final String RADIO_BUTTON = "RadioButton";           //$NON-NLS-1$
-    public static final String SWITCH = "Switch";                      //$NON-NLS-1$
-    public static final String EDIT_TEXT = "EditText";                 //$NON-NLS-1$
-    public static final String LIST_VIEW = "ListView";                 //$NON-NLS-1$
-    public static final String TEXT_VIEW = "TextView";                 //$NON-NLS-1$
-    public static final String CHECKED_TEXT_VIEW = "CheckedTextView";  //$NON-NLS-1$
-    public static final String IMAGE_VIEW = "ImageView";               //$NON-NLS-1$
-    public static final String SURFACE_VIEW = "SurfaceView";           //$NON-NLS-1$
-    public static final String ABSOLUTE_LAYOUT = "AbsoluteLayout";     //$NON-NLS-1$
-    public static final String TABLE_LAYOUT = "TableLayout";           //$NON-NLS-1$
-    public static final String TABLE_ROW = "TableRow";                 //$NON-NLS-1$
-    public static final String TAB_WIDGET = "TabWidget";               //$NON-NLS-1$
-    public static final String IMAGE_BUTTON = "ImageButton";           //$NON-NLS-1$
-    public static final String SEEK_BAR = "SeekBar";                   //$NON-NLS-1$
-    public static final String VIEW_STUB = "ViewStub";                 //$NON-NLS-1$
-    public static final String SPINNER = "Spinner";                    //$NON-NLS-1$
-    public static final String WEB_VIEW = "WebView";                   //$NON-NLS-1$
-    public static final String TOGGLE_BUTTON = "ToggleButton";         //$NON-NLS-1$
-    public static final String CHECK_BOX = "CheckBox";                 //$NON-NLS-1$
-    public static final String ABS_LIST_VIEW = "AbsListView";          //$NON-NLS-1$
-    public static final String PROGRESS_BAR = "ProgressBar";           //$NON-NLS-1$
-    public static final String ABS_SPINNER = "AbsSpinner";             //$NON-NLS-1$
-    public static final String ABS_SEEK_BAR = "AbsSeekBar";            //$NON-NLS-1$
-    public static final String VIEW_ANIMATOR = "ViewAnimator";         //$NON-NLS-1$
-    public static final String VIEW_SWITCHER = "ViewSwitcher";         //$NON-NLS-1$
-    public static final String EXPANDABLE_LIST_VIEW = "ExpandableListView";    //$NON-NLS-1$
-    public static final String HORIZONTAL_SCROLL_VIEW = "HorizontalScrollView"; //$NON-NLS-1$
-    public static final String MULTI_AUTO_COMPLETE_TEXT_VIEW = "MultiAutoCompleteTextView"; //$NON-NLS-1$
-    public static final String AUTO_COMPLETE_TEXT_VIEW = "AutoCompleteTextView"; //$NON-NLS-1$
-    public static final String CHECKABLE = "Checkable";                //$NON-NLS-1$
-
-    // Tags: Drawables
-    public static final String TAG_BITMAP = "bitmap";                  //$NON-NLS-1$
-
-    // Attributes: Manifest
-    public static final String ATTR_EXPORTED = "exported";             //$NON-NLS-1$
-    public static final String ATTR_PERMISSION = "permission";         //$NON-NLS-1$
-    public static final String ATTR_MIN_SDK_VERSION = "minSdkVersion"; //$NON-NLS-1$
-    public static final String ATTR_TARGET_SDK_VERSION = "targetSdkVersion"; //$NON-NLS-1$
-    public static final String ATTR_ICON = "icon";                     //$NON-NLS-1$
-    public static final String ATTR_PACKAGE = "package";               //$NON-NLS-1$
-    public static final String ATTR_CORE_APP = "coreApp";              //$NON-NLS-1$
-    public static final String ATTR_THEME = "theme";                   //$NON-NLS-1$
-    public static final String ATTR_PATH = "path";                     //$NON-NLS-1$
-    public static final String ATTR_PATH_PREFIX = "pathPrefix";        //$NON-NLS-1$
-    public static final String ATTR_PATH_PATTERN = "pathPattern";      //$NON-NLS-1$
-    public static final String ATTR_ALLOW_BACKUP = "allowBackup";      //$NON_NLS-1$
-    public static final String ATTR_DEBUGGABLE = "debuggable";         //$NON-NLS-1$
-    public static final String ATTR_READ_PERMISSION = "readPermission"; //$NON_NLS-1$
-    public static final String ATTR_WRITE_PERMISSION = "writePermission"; //$NON_NLS-1$
-
-    // Attributes: Resources
-    public static final String ATTR_NAME = "name";                     //$NON-NLS-1$
-    public static final String ATTR_TYPE = "type";                     //$NON-NLS-1$
-    public static final String ATTR_PARENT = "parent";                 //$NON-NLS-1$
-    public static final String ATTR_TRANSLATABLE = "translatable";     //$NON-NLS-1$
-    public static final String ATTR_COLOR = "color";                   //$NON-NLS-1$
-
-    // Attributes: Layout
-    public static final String ATTR_LAYOUT_RESOURCE_PREFIX = "layout_";//$NON-NLS-1$
-    public static final String ATTR_CLASS = "class";                   //$NON-NLS-1$
-    public static final String ATTR_STYLE = "style";                   //$NON-NLS-1$
-    public static final String ATTR_CONTEXT = "context";               //$NON-NLS-1$
-    public static final String ATTR_ID = "id";                         //$NON-NLS-1$
-    public static final String ATTR_TEXT = "text";                     //$NON-NLS-1$
-    public static final String ATTR_TEXT_SIZE = "textSize";            //$NON-NLS-1$
-    public static final String ATTR_LABEL = "label";                   //$NON-NLS-1$
-    public static final String ATTR_HINT = "hint";                     //$NON-NLS-1$
-    public static final String ATTR_PROMPT = "prompt";                 //$NON-NLS-1$
-    public static final String ATTR_ON_CLICK = "onClick";              //$NON-NLS-1$
-    public static final String ATTR_INPUT_TYPE = "inputType";          //$NON-NLS-1$
-    public static final String ATTR_INPUT_METHOD = "inputMethod";      //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_GRAVITY = "layout_gravity"; //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_WIDTH = "layout_width";     //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_HEIGHT = "layout_height";   //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_WEIGHT = "layout_weight";   //$NON-NLS-1$
-    public static final String ATTR_PADDING = "padding";               //$NON-NLS-1$
-    public static final String ATTR_PADDING_BOTTOM = "paddingBottom";  //$NON-NLS-1$
-    public static final String ATTR_PADDING_TOP = "paddingTop";        //$NON-NLS-1$
-    public static final String ATTR_PADDING_RIGHT = "paddingRight";    //$NON-NLS-1$
-    public static final String ATTR_PADDING_LEFT = "paddingLeft";      //$NON-NLS-1$
-    public static final String ATTR_FOREGROUND = "foreground";         //$NON-NLS-1$
-    public static final String ATTR_BACKGROUND = "background";         //$NON-NLS-1$
-    public static final String ATTR_ORIENTATION = "orientation";       //$NON-NLS-1$
-    public static final String ATTR_LAYOUT = "layout";                 //$NON-NLS-1$
-    public static final String ATTR_ROW_COUNT = "rowCount";            //$NON-NLS-1$
-    public static final String ATTR_COLUMN_COUNT = "columnCount";      //$NON-NLS-1$
-    public static final String ATTR_LABEL_FOR = "labelFor";            //$NON-NLS-1$
-    public static final String ATTR_BASELINE_ALIGNED = "baselineAligned";       //$NON-NLS-1$
-    public static final String ATTR_CONTENT_DESCRIPTION = "contentDescription"; //$NON-NLS-1$
-    public static final String ATTR_IME_ACTION_LABEL = "imeActionLabel";        //$NON-NLS-1$
-    public static final String ATTR_PRIVATE_IME_OPTIONS = "privateImeOptions";  //$NON-NLS-1$
-    public static final String VALUE_NONE = "none";                    //$NON-NLS-1$
-    public static final String VALUE_NO = "no";                        //$NON-NLS-1$
-    public static final String ATTR_NUMERIC = "numeric";               //$NON-NLS-1$
-    public static final String ATTR_IME_ACTION_ID = "imeActionId";     //$NON-NLS-1$
-    public static final String ATTR_IME_OPTIONS = "imeOptions";        //$NON-NLS-1$
-    public static final String ATTR_FREEZES_TEXT = "freezesText";      //$NON-NLS-1$
-    public static final String ATTR_EDITOR_EXTRAS = "editorExtras";    //$NON-NLS-1$
-    public static final String ATTR_EDITABLE = "editable";             //$NON-NLS-1$
-    public static final String ATTR_DIGITS = "digits";                 //$NON-NLS-1$
-    public static final String ATTR_CURSOR_VISIBLE = "cursorVisible";  //$NON-NLS-1$
-    public static final String ATTR_CAPITALIZE = "capitalize";         //$NON-NLS-1$
-    public static final String ATTR_PHONE_NUMBER = "phoneNumber";      //$NON-NLS-1$
-    public static final String ATTR_PASSWORD = "password";             //$NON-NLS-1$
-    public static final String ATTR_BUFFER_TYPE = "bufferType";        //$NON-NLS-1$
-    public static final String ATTR_AUTO_TEXT = "autoText";            //$NON-NLS-1$
-    public static final String ATTR_ENABLED = "enabled";               //$NON-NLS-1$
-    public static final String ATTR_SINGLE_LINE = "singleLine";        //$NON-NLS-1$
-    public static final String ATTR_SCALE_TYPE = "scaleType";          //$NON-NLS-1$
-    public static final String ATTR_VISIBILITY = "visibility";         //$NON-NLS-1$
-    public static final String ATTR_TEXT_IS_SELECTABLE =
-            "textIsSelectable";                                        //$NON-NLS-1$
-    public static final String ATTR_IMPORTANT_FOR_ACCESSIBILITY =
-            "importantForAccessibility";                               //$NON-NLS-1$
-
-    // AbsoluteLayout layout params
-    public static final String ATTR_LAYOUT_Y = "layout_y";             //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_X = "layout_x";             //$NON-NLS-1$
-
-    // GridLayout layout params
-    public static final String ATTR_LAYOUT_ROW = "layout_row";         //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_ROW_SPAN = "layout_rowSpan";//$NON-NLS-1$
-    public static final String ATTR_LAYOUT_COLUMN = "layout_column";   //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_COLUMN_SPAN = "layout_columnSpan";       //$NON-NLS-1$
-
-    // TableRow
-    public static final String ATTR_LAYOUT_SPAN = "layout_span";       //$NON-NLS-1$
-
-    // RelativeLayout layout params:
-    public static final String ATTR_LAYOUT_ALIGN_LEFT = "layout_alignLeft";        //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_ALIGN_RIGHT = "layout_alignRight";      //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_ALIGN_TOP = "layout_alignTop";          //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_ALIGN_BOTTOM = "layout_alignBottom";    //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_ALIGN_PARENT_TOP = "layout_alignParentTop"; //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_ALIGN_PARENT_BOTTOM = "layout_alignParentBottom"; //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_ALIGN_PARENT_LEFT = "layout_alignParentLeft";//$NON-NLS-1$
-    public static final String ATTR_LAYOUT_ALIGN_PARENT_RIGHT = "layout_alignParentRight";   //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_ALIGN_WITH_PARENT_MISSING = "layout_alignWithParentIfMissing"; //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_ALIGN_BASELINE = "layout_alignBaseline"; //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_CENTER_IN_PARENT = "layout_centerInParent"; //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_CENTER_VERTICAL = "layout_centerVertical"; //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_CENTER_HORIZONTAL = "layout_centerHorizontal"; //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_TO_RIGHT_OF = "layout_toRightOf";    //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_TO_LEFT_OF = "layout_toLeftOf";      //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_BELOW = "layout_below";              //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_ABOVE = "layout_above";              //$NON-NLS-1$
-
-    // Margins
-    public static final String ATTR_LAYOUT_MARGIN = "layout_margin";               //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_MARGIN_LEFT = "layout_marginLeft";      //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_MARGIN_RIGHT = "layout_marginRight";    //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_MARGIN_TOP = "layout_marginTop";        //$NON-NLS-1$
-    public static final String ATTR_LAYOUT_MARGIN_BOTTOM = "layout_marginBottom";  //$NON-NLS-1$
-
-    // Attributes: Drawables
-    public static final String ATTR_TILE_MODE = "tileMode";            //$NON-NLS-1$
-
-    // Values: Layouts
-    public static final String VALUE_FILL_PARENT = "fill_parent";       //$NON-NLS-1$
-    public static final String VALUE_MATCH_PARENT = "match_parent";     //$NON-NLS-1$
-    public static final String VALUE_VERTICAL = "vertical";             //$NON-NLS-1$
-    public static final String VALUE_TRUE = "true";                     //$NON-NLS-1$
-    public static final String VALUE_EDITABLE = "editable";             //$NON-NLS-1$
-    public static final String VALUE_AUTO_FIT = "auto_fit";             //$NON-NLS-1$
-    public static final String VALUE_SELECTABLE_ITEM_BACKGROUND =
-            "?android:attr/selectableItemBackground";                   //$NON-NLS-1$
-
-
-    // Values: Resources
-    public static final String VALUE_ID = "id";                        //$NON-NLS-1$
-
-    // Values: Drawables
-    public static final String VALUE_DISABLED = "disabled";            //$NON-NLS-1$
-    public static final String VALUE_CLAMP = "clamp";                  //$NON-NLS-1$
-
-    // Menus
-    public static final String ATTR_SHOW_AS_ACTION = "showAsAction";   //$NON-NLS-1$
-    public static final String ATTR_TITLE = "title";                   //$NON-NLS-1$
-    public static final String ATTR_VISIBLE = "visible";               //$NON-NLS-1$
-    public static final String VALUE_IF_ROOM = "ifRoom";               //$NON-NLS-1$
-    public static final String VALUE_ALWAYS = "always";                //$NON-NLS-1$
-
-    // Units
-    public static final String UNIT_DP = "dp";                         //$NON-NLS-1$
-    public static final String UNIT_DIP = "dip";                       //$NON-NLS-1$
-    public static final String UNIT_SP = "sp";                         //$NON-NLS-1$
-    public static final String UNIT_PX = "px";                         //$NON-NLS-1$
-    public static final String UNIT_IN = "in";                         //$NON-NLS-1$
-    public static final String UNIT_MM = "mm";                         //$NON-NLS-1$
-    public static final String UNIT_PT = "pt";                         //$NON-NLS-1$
-
-    // Filenames and folder names
-    public static final String ANDROID_MANIFEST_XML = "AndroidManifest.xml"; //$NON-NLS-1$
-    public static final String OLD_PROGUARD_FILE = "proguard.cfg";     //$NON-NLS-1$
-    public static final String CLASS_FOLDER =
-            "bin" + File.separator + "classes";                        //$NON-NLS-1$ //$NON-NLS-2$
-    public static final String GEN_FOLDER = "gen";                     //$NON-NLS-1$
-    public static final String SRC_FOLDER = "src";                     //$NON-NLS-1$
-    public static final String LIBS_FOLDER = "libs";                   //$NON-NLS-1$
-    public static final String BIN_FOLDER = "bin";                     //$NON-NLS-1$
-
-    public static final String RES_FOLDER = "res";                     //$NON-NLS-1$
-    public static final String DOT_XML = ".xml";                       //$NON-NLS-1$
-    public static final String DOT_GIF = ".gif";                       //$NON-NLS-1$
-    public static final String DOT_JPG = ".jpg";                       //$NON-NLS-1$
-    public static final String DOT_JPEG = ".jpeg";                     //$NON-NLS-1$
-    public static final String DOT_PNG = ".png";                       //$NON-NLS-1$
-    public static final String DOT_9PNG = ".9.png";                    //$NON-NLS-1$
-    public static final String DOT_JAVA = ".java";                     //$NON-NLS-1$
-    public static final String DOT_CLASS = ".class";                   //$NON-NLS-1$
-    public static final String DOT_JAR = ".jar";                       //$NON-NLS-1$
-
-
-    /** Extension of the Application package Files, i.e. "apk". */
-    public static final String EXT_ANDROID_PACKAGE = "apk"; //$NON-NLS-1$
-    /** Extension of java files, i.e. "java" */
-    public static final String EXT_JAVA = "java"; //$NON-NLS-1$
-    /** Extension of compiled java files, i.e. "class" */
-    public static final String EXT_CLASS = "class"; //$NON-NLS-1$
-    /** Extension of xml files, i.e. "xml" */
-    public static final String EXT_XML = "xml"; //$NON-NLS-1$
-    /** Extension of jar files, i.e. "jar" */
-    public static final String EXT_JAR = "jar"; //$NON-NLS-1$
-    /** Extension of aidl files, i.e. "aidl" */
-    public static final String EXT_AIDL = "aidl"; //$NON-NLS-1$
-    /** Extension of Renderscript files, i.e. "rs" */
-    public static final String EXT_RS = "rs"; //$NON-NLS-1$
-    /** Extension of FilterScript files, i.e. "fs" */
-    public static final String EXT_FS = "fs"; //$NON-NLS-1$
-    /** Extension of dependency files, i.e. "d" */
-    public static final String EXT_DEP = "d"; //$NON-NLS-1$
-    /** Extension of native libraries, i.e. "so" */
-    public static final String EXT_NATIVE_LIB = "so"; //$NON-NLS-1$
-    /** Extension of dex files, i.e. "dex" */
-    public static final String EXT_DEX = "dex"; //$NON-NLS-1$
-    /** Extension for temporary resource files, ie "ap_ */
-    public static final String EXT_RES = "ap_"; //$NON-NLS-1$
-    /** Extension for pre-processable images. Right now pngs */
-    public static final String EXT_PNG = "png"; //$NON-NLS-1$
-
-    private final static String DOT = "."; //$NON-NLS-1$
-
-    /** Dot-Extension of the Application package Files, i.e. ".apk". */
-    public static final String DOT_ANDROID_PACKAGE = DOT + EXT_ANDROID_PACKAGE;
-    /** Dot-Extension of aidl files, i.e. ".aidl" */
-    public static final String DOT_AIDL = DOT + EXT_AIDL;
-    /** Dot-Extension of renderscript files, i.e. ".rs" */
-    public static final String DOT_RS = DOT + EXT_RS;
-    /** Dot-Extension of FilterScript files, i.e. ".fs" */
-    public static final String DOT_FS = DOT + EXT_FS;
-    /** Dot-Extension of dependency files, i.e. ".d" */
-    public static final String DOT_DEP = DOT + EXT_DEP;
-    /** Dot-Extension of dex files, i.e. ".dex" */
-    public static final String DOT_DEX = DOT + EXT_DEX;
-    /** Dot-Extension for temporary resource files, ie "ap_ */
-    public static final String DOT_RES = DOT + EXT_RES;
-    /** Dot-Extension for BMP files, i.e. ".bmp" */
-    public static final String DOT_BMP = ".bmp"; //$NON-NLS-1$
-    /** Dot-Extension for SVG files, i.e. ".svg" */
-    public static final String DOT_SVG = ".svg"; //$NON-NLS-1$
-    /** Dot-Extension for template files */
-    public static final String DOT_FTL = ".ftl"; //$NON-NLS-1$
-    /** Dot-Extension of text files, i.e. ".txt" */
-    public static final String DOT_TXT = ".txt"; //$NON-NLS-1$
-
-    /** Resource base name for java files and classes */
-    public static final String FN_RESOURCE_BASE = "R"; //$NON-NLS-1$
-    /** Resource java class  filename, i.e. "R.java" */
-    public static final String FN_RESOURCE_CLASS = FN_RESOURCE_BASE + DOT_JAVA;
-    /** Resource class file  filename, i.e. "R.class" */
-    public static final String FN_COMPILED_RESOURCE_CLASS = FN_RESOURCE_BASE + DOT_CLASS;
-    /** Resource text filename, i.e. "R.txt" */
-    public static final String FN_RESOURCE_TEXT = FN_RESOURCE_BASE + DOT_TXT;
-    /** Generated manifest class name */
-    public static final String FN_MANIFEST_BASE = "Manifest";          //$NON-NLS-1$
-    /** Generated BuildConfig class name */
-    public static final String FN_BUILD_CONFIG_BASE = "BuildConfig";   //$NON-NLS-1$
-    /** Manifest java class filename, i.e. "Manifest.java" */
-    public static final String FN_MANIFEST_CLASS = FN_MANIFEST_BASE + DOT_JAVA;
-    /** BuildConfig java class filename, i.e. "BuildConfig.java" */
-    public static final String FN_BUILD_CONFIG = FN_BUILD_CONFIG_BASE + DOT_JAVA;
-
-    public static final String DRAWABLE_FOLDER = "drawable";           //$NON-NLS-1$
-    public static final String DRAWABLE_XHDPI = "drawable-xhdpi";      //$NON-NLS-1$
-    public static final String DRAWABLE_HDPI = "drawable-hdpi";        //$NON-NLS-1$
-    public static final String DRAWABLE_MDPI = "drawable-mdpi";        //$NON-NLS-1$
-    public static final String DRAWABLE_LDPI = "drawable-ldpi";        //$NON-NLS-1$
-
-    // Resources
-    public static final String PREFIX_RESOURCE_REF = "@";               //$NON-NLS-1$
-    public static final String PREFIX_THEME_REF = "?";                  //$NON-NLS-1$
-    public static final String ANDROID_PREFIX = "@android:";            //$NON-NLS-1$
-    public static final String ANDROID_THEME_PREFIX = "?android:";      //$NON-NLS-1$
-    public static final String LAYOUT_RESOURCE_PREFIX = "@layout/";     //$NON-NLS-1$
-    public static final String STYLE_RESOURCE_PREFIX = "@style/";       //$NON-NLS-1$
-    public static final String NEW_ID_PREFIX = "@+id/";                 //$NON-NLS-1$
-    public static final String ID_PREFIX = "@id/";                      //$NON-NLS-1$
-    public static final String DRAWABLE_PREFIX = "@drawable/";          //$NON-NLS-1$
-    public static final String STRING_PREFIX = "@string/";              //$NON-NLS-1$
-    public static final String ANDROID_STRING_PREFIX = "@android:string/"; //$NON-NLS-1$
-    public static final String ANDROID_LAYOUT_RESOURCE_PREFIX = "@android:layout/"; //$NON-NLS-1$
-
-    public static final String RESOURCE_CLZ_ID = "id";                  //$NON-NLS-1$
-    public static final String RESOURCE_CLZ_COLOR = "color";            //$NON-NLS-1$
-    public static final String RESOURCE_CLZ_ARRAY = "array";            //$NON-NLS-1$
-    public static final String RESOURCE_CLZ_ATTR = "attr";              //$NON-NLS-1$
-    public static final String RESOURCE_CLR_STYLEABLE = "styleable";    //$NON-NLS-1$
-    public static final String NULL_RESOURCE = "@null";                 //$NON-NLS-1$
-    public static final String TRANSPARENT_COLOR = "@android:color/transparent";      //$NON-NLS-1$
-    public static final String ANDROID_STYLE_RESOURCE_PREFIX = "@android:style/";     //$NON-NLS-1$
-    public static final String REFERENCE_STYLE = "style/";                     //$NON-NLS-1$
-    public static final String PREFIX_ANDROID = "android:";                    //$NON-NLS-1$
-
-    // Resource Types
-    public static final String DRAWABLE_TYPE = "drawable";              //$NON-NLS-1$
-    public static final String MENU_TYPE = "menu";                      //$NON-NLS-1$
-
-    // Packages
-    public static final String ANDROID_PKG_PREFIX = "android.";         //$NON-NLS-1$
-    public static final String WIDGET_PKG_PREFIX = "android.widget.";   //$NON-NLS-1$
-    public static final String VIEW_PKG_PREFIX = "android.view.";       //$NON-NLS-1$
-
-    // Project properties
-    public static final String ANDROID_LIBRARY = "android.library";     //$NON-NLS-1$
-    public static final String PROGUARD_CONFIG = "proguard.config";     //$NON-NLS-1$
-    public static final String ANDROID_LIBRARY_REFERENCE_FORMAT = "android.library.reference.%1$d";//$NON-NLS-1$
-    public static final String PROJECT_PROPERTIES = "project.properties";//$NON-NLS-1$
-
-    // Java References
-    public static final String ATTR_REF_PREFIX = "?attr/";               //$NON-NLS-1$
-    public static final String R_PREFIX = "R.";                          //$NON-NLS-1$
-    public static final String R_ID_PREFIX = "R.id.";                    //$NON-NLS-1$
-    public static final String R_LAYOUT_RESOURCE_PREFIX = "R.layout.";   //$NON-NLS-1$
-    public static final String R_DRAWABLE_PREFIX = "R.drawable.";        //$NON-NLS-1$
-    public static final String R_ATTR_PREFIX = "R.attr.";                //$NON-NLS-1$
-
-    // Attributes related to tools
-    public static final String ATTR_IGNORE = "ignore";                   //$NON-NLS-1$
-    public static final String ATTR_LOCALE = "locale";                   //$NON-NLS-1$
-
-    // SuppressLint
-    public static final String SUPPRESS_ALL = "all";                     //$NON-NLS-1$
-    public static final String SUPPRESS_LINT = "SuppressLint";           //$NON-NLS-1$
-    public static final String TARGET_API = "TargetApi";                 //$NON-NLS-1$
-    public static final String ATTR_TARGET_API = "targetApi";            //$NON-NLS-1$
-    public static final String FQCN_SUPPRESS_LINT = "android.annotation." + SUPPRESS_LINT; //$NON-NLS-1$
-    public static final String FQCN_TARGET_API = "android.annotation." + TARGET_API; //$NON-NLS-1$
-
-    // Class Names
-    public static final String CONSTRUCTOR_NAME = "<init>";                          //$NON-NLS-1$
-    public static final String CLASS_CONSTRUCTOR = "<clinit>";                       //$NON-NLS-1$
-    public static final String FRAGMENT = "android/app/Fragment";                    //$NON-NLS-1$
-    public static final String FRAGMENT_V4 = "android/support/v4/app/Fragment";      //$NON-NLS-1$
-    public static final String ANDROID_APP_ACTIVITY = "android/app/Activity";        //$NON-NLS-1$
-    public static final String ANDROID_APP_SERVICE = "android/app/Service";          //$NON-NLS-1$
-    public static final String ANDROID_CONTENT_CONTENT_PROVIDER =
-            "android/content/ContentProvider";                                       //$NON-NLS-1$
-    public static final String ANDROID_CONTENT_BROADCAST_RECEIVER =
-            "android/content/BroadcastReceiver";                                     //$NON-NLS-1$
-
-    // Method Names
-    public static final String FORMAT_METHOD = "format";                             //$NON-NLS-1$
-    public static final String GET_STRING_METHOD = "getString";                      //$NON-NLS-1$
-
-
-
-
-    public static final String ATTR_TAG = "tag";                        //$NON-NLS-1$
-    public static final String ATTR_NUM_COLUMNS = "numColumns";         //$NON-NLS-1$
-
-    // Some common layout element names
-    public static final String CALENDAR_VIEW = "CalendarView";          //$NON-NLS-1$
-    public static final String SPACE = "Space";                         //$NON-NLS-1$
-    public static final String GESTURE_OVERLAY_VIEW = "GestureOverlayView";//$NON-NLS-1$
-
-    public static final String ATTR_HANDLE = "handle";                  //$NON-NLS-1$
-    public static final String ATTR_CONTENT = "content";                //$NON-NLS-1$
-    public static final String ATTR_CHECKED = "checked";                //$NON-NLS-1$
-
-    // TextView
-    public static final String ATTR_DRAWABLE_RIGHT = "drawableRight";              //$NON-NLS-1$
-    public static final String ATTR_DRAWABLE_LEFT = "drawableLeft";                //$NON-NLS-1$
-    public static final String ATTR_DRAWABLE_BOTTOM = "drawableBottom";            //$NON-NLS-1$
-    public static final String ATTR_DRAWABLE_TOP = "drawableTop";                  //$NON-NLS-1$
-    public static final String ATTR_DRAWABLE_PADDING = "drawablePadding";          //$NON-NLS-1$
-
-    public static final String ATTR_USE_DEFAULT_MARGINS = "useDefaultMargins";      //$NON-NLS-1$
-    public static final String ATTR_MARGINS_INCLUDED_IN_ALIGNMENT = "marginsIncludedInAlignment"; //$NON-NLS-1$
-
-    public static final String VALUE_WRAP_CONTENT = "wrap_content";             //$NON-NLS-1$
-    public static final String VALUE_FALSE= "false";                            //$NON-NLS-1$
-    public static final String VALUE_N_DP = "%ddp";                             //$NON-NLS-1$
-    public static final String VALUE_ZERO_DP = "0dp";                           //$NON-NLS-1$
-    public static final String VALUE_ONE_DP = "1dp";                            //$NON-NLS-1$
-    public static final String VALUE_TOP = "top";                               //$NON-NLS-1$
-    public static final String VALUE_LEFT = "left";                             //$NON-NLS-1$
-    public static final String VALUE_RIGHT = "right";                           //$NON-NLS-1$
-    public static final String VALUE_BOTTOM = "bottom";                         //$NON-NLS-1$
-    public static final String VALUE_CENTER_VERTICAL = "center_vertical";       //$NON-NLS-1$
-    public static final String VALUE_CENTER_HORIZONTAL = "center_horizontal";   //$NON-NLS-1$
-    public static final String VALUE_FILL_HORIZONTAL = "fill_horizontal";       //$NON-NLS-1$
-    public static final String VALUE_FILL_VERTICAL = "fill_vertical";           //$NON-NLS-1$
-    public static final String VALUE_0 = "0";                                   //$NON-NLS-1$
-    public static final String VALUE_1 = "1";                                   //$NON-NLS-1$
-
-    // Gravity values. These have the GRAVITY_ prefix in front of value because we already
-    // have VALUE_CENTER_HORIZONTAL defined for layouts, and its definition conflicts
-    // (centerHorizontal versus center_horizontal)
-    public static final String GRAVITY_VALUE_ = "center";                             //$NON-NLS-1$
-    public static final String GRAVITY_VALUE_CENTER = "center";                       //$NON-NLS-1$
-    public static final String GRAVITY_VALUE_RIGHT = "right";                         //$NON-NLS-1$
-    public static final String GRAVITY_VALUE_LEFT = "left";                           //$NON-NLS-1$
-    public static final String GRAVITY_VALUE_BOTTOM = "bottom";                       //$NON-NLS-1$
-    public static final String GRAVITY_VALUE_TOP = "top";                             //$NON-NLS-1$
-    public static final String GRAVITY_VALUE_FILL_HORIZONTAL = "fill_horizontal";     //$NON-NLS-1$
-    public static final String GRAVITY_VALUE_FILL_VERTICAL = "fill_vertical";         //$NON-NLS-1$
-    public static final String GRAVITY_VALUE_CENTER_HORIZONTAL = "center_horizontal"; //$NON-NLS-1$
-    public static final String GRAVITY_VALUE_CENTER_VERTICAL = "center_vertical";     //$NON-NLS-1$
-    public static final String GRAVITY_VALUE_FILL = "fill";                           //$NON-NLS-1$
-
-    /**
-     * The top level android package as a prefix, "android.".
-     */
-    public static final String ANDROID_SUPPORT_PKG_PREFIX = ANDROID_PKG_PREFIX + "support."; //$NON-NLS-1$
-
-    /** The android.view. package prefix */
-    public static final String ANDROID_VIEW_PKG = ANDROID_PKG_PREFIX + "view."; //$NON-NLS-1$
-
-    /** The android.widget. package prefix */
-    public static final String ANDROID_WIDGET_PREFIX = ANDROID_PKG_PREFIX + "widget."; //$NON-NLS-1$
-
-    /** The android.webkit. package prefix */
-    public static final String ANDROID_WEBKIT_PKG = ANDROID_PKG_PREFIX + "webkit."; //$NON-NLS-1$
-
-    /** The LayoutParams inner-class name suffix, .LayoutParams */
-    public static final String DOT_LAYOUT_PARAMS = ".LayoutParams"; //$NON-NLS-1$
-
-    /** The fully qualified class name of an EditText view */
-    public static final String FQCN_EDIT_TEXT = "android.widget.EditText"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a LinearLayout view */
-    public static final String FQCN_LINEAR_LAYOUT = "android.widget.LinearLayout"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a RelativeLayout view */
-    public static final String FQCN_RELATIVE_LAYOUT = "android.widget.RelativeLayout"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a RelativeLayout view */
-    public static final String FQCN_GRID_LAYOUT = "android.widget.GridLayout"; //$NON-NLS-1$
-    public static final String FQCN_GRID_LAYOUT_V7 = "android.support.v7.widget.GridLayout"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a FrameLayout view */
-    public static final String FQCN_FRAME_LAYOUT = "android.widget.FrameLayout"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a TableRow view */
-    public static final String FQCN_TABLE_ROW = "android.widget.TableRow"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a TableLayout view */
-    public static final String FQCN_TABLE_LAYOUT = "android.widget.TableLayout"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a GridView view */
-    public static final String FQCN_GRID_VIEW = "android.widget.GridView"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a TabWidget view */
-    public static final String FQCN_TAB_WIDGET = "android.widget.TabWidget"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a Button view */
-    public static final String FQCN_BUTTON = "android.widget.Button"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a RadioButton view */
-    public static final String FQCN_RADIO_BUTTON = "android.widget.RadioButton"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a ToggleButton view */
-    public static final String FQCN_TOGGLE_BUTTON = "android.widget.ToggleButton"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a Spinner view */
-    public static final String FQCN_SPINNER = "android.widget.Spinner"; //$NON-NLS-1$
-
-    /** The fully qualified class name of an AdapterView */
-    public static final String FQCN_ADAPTER_VIEW = "android.widget.AdapterView"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a ListView */
-    public static final String FQCN_LIST_VIEW = "android.widget.ListView"; //$NON-NLS-1$
-
-    /** The fully qualified class name of an ExpandableListView */
-    public static final String FQCN_EXPANDABLE_LIST_VIEW = "android.widget.ExpandableListView"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a GestureOverlayView */
-    public static final String FQCN_GESTURE_OVERLAY_VIEW = "android.gesture.GestureOverlayView"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a DatePicker */
-    public static final String FQCN_DATE_PICKER = "android.widget.DatePicker"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a TimePicker */
-    public static final String FQCN_TIME_PICKER = "android.widget.TimePicker"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a RadioGroup */
-    public static final String FQCN_RADIO_GROUP = "android.widgets.RadioGroup";  //$NON-NLS-1$
-
-    /** The fully qualified class name of a Space */
-    public static final String FQCN_SPACE = "android.widget.Space"; //$NON-NLS-1$
-    public static final String FQCN_SPACE_V7 = "android.support.v7.widget.Space"; //$NON-NLS-1$
-
-    /** The fully qualified class name of a TextView view */
-    public static final String FQCN_TEXT_VIEW = "android.widget.TextView"; //$NON-NLS-1$
-
-    /** The fully qualified class name of an ImageView view */
-    public static final String FQCN_IMAGE_VIEW = "android.widget.ImageView"; //$NON-NLS-1$
-
-    public static final String ATTR_SRC = "src"; //$NON-NLS-1$
-
-    public static final String ATTR_GRAVITY = "gravity"; //$NON-NLS-1$
-    public static final String ATTR_WEIGHT_SUM = "weightSum"; //$NON-NLS-1$
-    public static final String ATTR_EMS = "ems"; //$NON-NLS-1$
-
-    public static final String VALUE_HORIZONTAL = "horizontal"; //$NON-NLS-1$
-
-    /**
-     * The highest known API level. Note that the tools may also look at the
-     * installed platforms to see if they can find more recently released
-     * platforms, e.g. when the tools have not yet been updated for a new
-     * release. This number is used as a baseline and any more recent platforms
-     * found can be used to increase the highest known number.
-     */
-    public static final int HIGHEST_KNOWN_API = 17;
-}
diff --git a/common/src/main/java/com/android/annotations/NonNull.java b/common/src/main/java/com/android/annotations/NonNull.java
deleted file mode 100644
index 973ebb6..0000000
--- a/common/src/main/java/com/android/annotations/NonNull.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that a parameter, field or method return value can never be null.
- * <p/>
- * This is a marker annotation and it has no specific attributes.
- */
-@Documented
-@Retention(RetentionPolicy.CLASS)
-@Target({METHOD,PARAMETER,LOCAL_VARIABLE,FIELD})
-public @interface NonNull {
-}
diff --git a/common/src/main/java/com/android/annotations/NonNullByDefault.java b/common/src/main/java/com/android/annotations/NonNullByDefault.java
deleted file mode 100644
index 3db891c..0000000
--- a/common/src/main/java/com/android/annotations/NonNullByDefault.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.annotations;
-
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that all parameters, fields or methods within a class or method by
- * default can not be null. This can be overridden by adding specific
- * {@link com.android.annotations.Nullable} annotations on fields, parameters or
- * methods that should not use the default.
- * <p/>
- * NOTE: Eclipse does not yet handle defaults well (in particular, if
- * you add this on a class which implements Comparable, then it will insist
- * that your compare method is changing the nullness of the compare parameter,
- * so you'll need to add @Nullable on it, which also is not right (since
- * the method should have implied @NonNull and you do not need to check
- * the parameter.). For now, it's best to individually annotate methods,
- * parameters and fields.
- * <p/>
- * This is a marker annotation and it has no specific attributes.
- */
-@Documented
-@Retention(RetentionPolicy.CLASS)
-@Target({PACKAGE, TYPE})
-public @interface NonNullByDefault {
-}
diff --git a/common/src/main/java/com/android/annotations/Nullable.java b/common/src/main/java/com/android/annotations/Nullable.java
deleted file mode 100755
index d9c3861..0000000
--- a/common/src/main/java/com/android/annotations/Nullable.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that a parameter, field or method return value can be null.
- * <b>Note</b>: this is the default assumption for most Java APIs and the
- * default assumption made by most static code checking tools, so usually you
- * don't need to use this annotation; its primary use is to override a default
- * wider annotation like {@link NonNullByDefault}.
- * <p/>
- * When decorating a method call parameter, this denotes the parameter can
- * legitimately be null and the method will gracefully deal with it. Typically
- * used on optional parameters.
- * <p/>
- * When decorating a method, this denotes the method might legitimately return
- * null.
- * <p/>
- * This is a marker annotation and it has no specific attributes.
- */
-@Documented
-@Retention(RetentionPolicy.CLASS)
-@Target({METHOD, PARAMETER, LOCAL_VARIABLE, FIELD})
-public @interface Nullable {
-}
diff --git a/common/src/main/java/com/android/annotations/VisibleForTesting.java b/common/src/main/java/com/android/annotations/VisibleForTesting.java
deleted file mode 100755
index 7f41d70..0000000
--- a/common/src/main/java/com/android/annotations/VisibleForTesting.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Denotes that the class, method or field has its visibility relaxed so
- * that unit tests can access it.
- * <p/>
- * The <code>visibility</code> argument can be used to specific what the original
- * visibility should have been if it had not been made public or package-private for testing.
- * The default is to consider the element private.
- */
-@Retention(RetentionPolicy.SOURCE)
-public @interface VisibleForTesting {
-    /**
-     * Intended visibility if the element had not been made public or package-private for
-     * testing.
-     */
-    enum Visibility {
-        /** The element should be considered protected. */
-        PROTECTED,
-        /** The element should be considered package-private. */
-        PACKAGE,
-        /** The element should be considered private. */
-        PRIVATE
-    }
-
-    /**
-     * Intended visibility if the element had not been made public or package-private for testing.
-     * If not specified, one should assume the element originally intended to be private.
-     */
-    Visibility visibility() default Visibility.PRIVATE;
-}
diff --git a/common/src/main/java/com/android/io/FileWrapper.java b/common/src/main/java/com/android/io/FileWrapper.java
deleted file mode 100644
index 8be7859..0000000
--- a/common/src/main/java/com/android/io/FileWrapper.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.io;
-
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URI;
-
-/**
- * An implementation of {@link IAbstractFile} extending {@link File}.
- */
-public class FileWrapper extends File implements IAbstractFile {
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * Creates a new File instance matching a given {@link File} object.
-     * @param file the file to match
-     */
-    public FileWrapper(File file) {
-        super(file.getAbsolutePath());
-    }
-
-    /**
-     * Creates a new File instance from a parent abstract pathname and a child pathname string.
-     * @param parent the parent pathname
-     * @param child the child name
-     *
-     * @see File#File(File, String)
-     */
-    public FileWrapper(File parent, String child) {
-        super(parent, child);
-    }
-
-    /**
-     * Creates a new File instance by converting the given pathname string into an abstract
-     * pathname.
-     * @param osPathname the OS pathname
-     *
-     * @see File#File(String)
-     */
-    public FileWrapper(String osPathname) {
-        super(osPathname);
-    }
-
-    /**
-     * Creates a new File instance from a parent abstract pathname and a child pathname string.
-     * @param parent the parent pathname
-     * @param child the child name
-     *
-     * @see File#File(String, String)
-     */
-    public FileWrapper(String parent, String child) {
-        super(parent, child);
-    }
-
-    /**
-     * Creates a new File instance by converting the given <code>file:</code> URI into an
-     * abstract pathname.
-     * @param uri An absolute, hierarchical URI with a scheme equal to "file", a non-empty path
-     * component, and undefined authority, query, and fragment components
-     *
-     * @see File#File(URI)
-     */
-    public FileWrapper(URI uri) {
-        super(uri);
-    }
-
-    @Override
-    public InputStream getContents() throws StreamException {
-        try {
-            return new FileInputStream(this);
-        } catch (FileNotFoundException e) {
-            throw new StreamException(e, this, StreamException.Error.FILENOTFOUND);
-        }
-    }
-
-    @Override
-    public void setContents(InputStream source) throws StreamException {
-        FileOutputStream fos = null;
-        try {
-            fos = new FileOutputStream(this);
-
-            byte[] buffer = new byte[1024];
-            int count = 0;
-            while ((count = source.read(buffer)) != -1) {
-                fos.write(buffer, 0, count);
-            }
-        } catch (IOException e) {
-            throw new StreamException(e, this);
-        } finally {
-            if (fos != null) {
-                try {
-                    fos.close();
-                } catch (IOException e) {
-                    throw new StreamException(e, this);
-                }
-            }
-        }
-    }
-
-    @Override
-    public OutputStream getOutputStream() throws StreamException {
-        try {
-            return new FileOutputStream(this);
-        } catch (FileNotFoundException e) {
-            throw new StreamException(e, this);
-        }
-    }
-
-    @Override
-    public PreferredWriteMode getPreferredWriteMode() {
-        return PreferredWriteMode.OUTPUTSTREAM;
-    }
-
-    @Override
-    public String getOsLocation() {
-        return getAbsolutePath();
-    }
-
-    @Override
-    public boolean exists() {
-        return isFile();
-    }
-
-    @Override
-    public long getModificationStamp() {
-        return lastModified();
-    }
-
-    @Override
-    public IAbstractFolder getParentFolder() {
-        String p = this.getParent();
-        if (p == null) {
-            return null;
-        }
-        return new FolderWrapper(p);
-    }
-}
diff --git a/common/src/main/java/com/android/io/FolderWrapper.java b/common/src/main/java/com/android/io/FolderWrapper.java
deleted file mode 100644
index c29c934..0000000
--- a/common/src/main/java/com/android/io/FolderWrapper.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.io;
-
-
-import java.io.File;
-import java.net.URI;
-import java.util.ArrayList;
-
-/**
- * An implementation of {@link IAbstractFolder} extending {@link File}.
- */
-public class FolderWrapper extends File implements IAbstractFolder {
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * Creates a new File instance from a parent abstract pathname and a child pathname string.
-     * @param parent the parent pathname
-     * @param child the child name
-     *
-     * @see File#File(File, String)
-     */
-    public FolderWrapper(File parent, String child) {
-        super(parent, child);
-    }
-
-    /**
-     * Creates a new File instance by converting the given pathname string into an abstract
-     * pathname.
-     * @param pathname the pathname
-     *
-     * @see File#File(String)
-     */
-    public FolderWrapper(String pathname) {
-        super(pathname);
-    }
-
-    /**
-     * Creates a new File instance from a parent abstract pathname and a child pathname string.
-     * @param parent the parent pathname
-     * @param child the child name
-     *
-     * @see File#File(String, String)
-     */
-    public FolderWrapper(String parent, String child) {
-        super(parent, child);
-    }
-
-    /**
-     * Creates a new File instance by converting the given <code>file:</code> URI into an
-     * abstract pathname.
-     * @param uri An absolute, hierarchical URI with a scheme equal to "file", a non-empty path
-     * component, and undefined authority, query, and fragment components
-     *
-     * @see File#File(URI)
-     */
-    public FolderWrapper(URI uri) {
-        super(uri);
-    }
-
-    /**
-     * Creates a new File instance matching a give {@link File} object.
-     * @param file the file to match
-     */
-    public FolderWrapper(File file) {
-        super(file.getAbsolutePath());
-    }
-
-    @Override
-    public IAbstractResource[] listMembers() {
-        File[] files = listFiles();
-        final int count = files == null ? 0 : files.length;
-        IAbstractResource[] afiles = new IAbstractResource[count];
-
-        if (files != null) {
-            for (int i = 0 ; i < count ; i++) {
-                File f = files[i];
-                if (f.isFile()) {
-                    afiles[i] = new FileWrapper(f);
-                } else if (f.isDirectory()) {
-                    afiles[i] = new FolderWrapper(f);
-                }
-            }
-        }
-
-        return afiles;
-    }
-
-    @Override
-    public boolean hasFile(final String name) {
-        String[] match = list(new FilenameFilter() {
-            @Override
-            public boolean accept(IAbstractFolder dir, String filename) {
-                return name.equals(filename);
-            }
-        });
-
-        return match.length > 0;
-    }
-
-    @Override
-    public IAbstractFile getFile(String name) {
-        return new FileWrapper(this, name);
-    }
-
-    @Override
-    public IAbstractFolder getFolder(String name) {
-        return new FolderWrapper(this, name);
-    }
-
-    @Override
-    public IAbstractFolder getParentFolder() {
-        String p = this.getParent();
-        if (p == null) {
-            return null;
-        }
-        return new FolderWrapper(p);
-    }
-
-    @Override
-    public String getOsLocation() {
-        return getAbsolutePath();
-    }
-
-    @Override
-    public boolean exists() {
-        return isDirectory();
-    }
-
-    @Override
-    public String[] list(FilenameFilter filter) {
-        File[] files = listFiles();
-        if (files != null && files.length > 0) {
-            ArrayList<String> list = new ArrayList<String>();
-
-            for (File file : files) {
-                if (filter.accept(this, file.getName())) {
-                    list.add(file.getName());
-                }
-            }
-
-            return list.toArray(new String[list.size()]);
-        }
-
-        return new String[0];
-    }
-}
diff --git a/common/src/main/java/com/android/io/IAbstractFile.java b/common/src/main/java/com/android/io/IAbstractFile.java
deleted file mode 100644
index 6dfc8d8..0000000
--- a/common/src/main/java/com/android/io/IAbstractFile.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.io;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * A file.
- */
-public interface IAbstractFile extends IAbstractResource {
-    public static enum PreferredWriteMode {
-        INPUTSTREAM, OUTPUTSTREAM;
-    }
-
-    /**
-     * Returns an {@link InputStream} object on the file content.
-     * @throws StreamException
-     */
-    InputStream getContents() throws StreamException;
-
-    /**
-     * Sets the content of the file.
-     * @param source the content
-     * @throws StreamException
-     */
-    void setContents(InputStream source) throws StreamException;
-
-    /**
-     * Returns an {@link OutputStream} to write into the file.
-     * @throws StreamException
-     */
-    OutputStream getOutputStream() throws StreamException;
-
-    /**
-     * Returns the preferred mode to write into the file.
-     */
-    PreferredWriteMode getPreferredWriteMode();
-
-    /**
-     * Returns the last modification timestamp
-     */
-    long getModificationStamp();
-}
diff --git a/common/src/main/java/com/android/io/IAbstractFolder.java b/common/src/main/java/com/android/io/IAbstractFolder.java
deleted file mode 100644
index 8335ef9..0000000
--- a/common/src/main/java/com/android/io/IAbstractFolder.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.io;
-
-import java.io.File;
-
-/**
- *  A folder.
- */
-public interface IAbstractFolder extends IAbstractResource {
-    /**
-     * Instances of classes that implement this interface are used to
-     * filter filenames.
-     */
-    public interface FilenameFilter {
-        /**
-         * Tests if a specified file should be included in a file list.
-         *
-         * @param   dir    the directory in which the file was found.
-         * @param   name   the name of the file.
-         * @return  <code>true</code> if and only if the name should be
-         * included in the file list; <code>false</code> otherwise.
-         */
-        boolean accept(IAbstractFolder dir, String name);
-    }
-
-    /**
-     * Returns true if the receiver contains a file with a given name
-     * @param name the name of the file. This is the name without the path leading to the
-     * parent folder.
-     */
-    boolean hasFile(String name);
-
-    /**
-     * Returns an {@link IAbstractFile} representing a child of the current folder with the
-     * given name. The file may not actually exist.
-     * @param name the name of the file.
-     */
-    IAbstractFile getFile(String name);
-
-    /**
-     * Returns an {@link IAbstractFolder} representing a child of the current folder with the
-     * given name. The folder may not actually exist.
-     * @param name the name of the folder.
-     */
-    IAbstractFolder getFolder(String name);
-
-    /**
-     * Returns a list of all existing file and directory members in this folder.
-     * The returned array can be empty but is never null.
-     */
-    IAbstractResource[] listMembers();
-
-    /**
-     * Returns a list of all existing file and directory members in this folder
-     * that satisfy the specified filter.
-     *
-     * @param filter A filename filter instance. Must not be null.
-     * @return An array of file names (generated using {@link File#getName()}).
-     *         The array can be empty but is never null.
-     */
-    String[] list(FilenameFilter filter);
-}
diff --git a/common/src/main/java/com/android/io/IAbstractResource.java b/common/src/main/java/com/android/io/IAbstractResource.java
deleted file mode 100644
index e6358ec..0000000
--- a/common/src/main/java/com/android/io/IAbstractResource.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.io;
-
-/**
- * Base representation of a file system resource.<p/>
- * This somewhat limited interface is designed to let classes use file-system resources, without
- * having the manually handle either the standard Java file or the Eclipse file API..
- */
-public interface IAbstractResource {
-
-    /**
-     * Returns the name of the resource.
-     */
-    String getName();
-
-    /**
-     * Returns the OS path of the folder location.
-     */
-    String getOsLocation();
-
-    /**
-     * Returns whether the resource actually exists.
-     */
-    boolean exists();
-
-    /**
-     * Returns the parent folder or null if there is no parent.
-     */
-    IAbstractFolder getParentFolder();
-
-    /**
-     * Deletes the resource.
-     */
-    boolean delete();
-}
diff --git a/common/src/main/java/com/android/io/StreamException.java b/common/src/main/java/com/android/io/StreamException.java
deleted file mode 100644
index 9f632f4..0000000
--- a/common/src/main/java/com/android/io/StreamException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.io;
-
-
-/**
- * Exception thrown when {@link IAbstractFile#getContents()} fails.
- */
-public class StreamException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    public static enum Error {
-        DEFAULT, OUTOFSYNC, FILENOTFOUND;
-    }
-
-    private final  Error mError;
-    private final IAbstractFile mFile;
-
-    public StreamException(Exception e, IAbstractFile file) {
-        this(e, file, Error.DEFAULT);
-    }
-
-    public StreamException(Exception e, IAbstractFile file, Error error) {
-        super(e);
-        mFile = file;
-        mError = error;
-    }
-
-    public Error getError() {
-        return mError;
-    }
-
-    public IAbstractFile getFile() {
-        return mFile;
-    }
-}
diff --git a/common/src/main/java/com/android/prefs/AndroidLocation.java b/common/src/main/java/com/android/prefs/AndroidLocation.java
deleted file mode 100644
index 6af8e9b..0000000
--- a/common/src/main/java/com/android/prefs/AndroidLocation.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.prefs;
-
-import com.android.annotations.NonNull;
-
-import java.io.File;
-
-/**
- * Manages the location of the android files (including emulator files, ddms config, debug keystore)
- */
-public final class AndroidLocation {
-
-    /**
-     * The name of the .android folder returned by {@link #getFolder()}.
-     */
-    public static final String FOLDER_DOT_ANDROID = ".android";
-
-    /**
-     * Virtual Device folder inside the path returned by {@link #getFolder()}
-     */
-    public static final String FOLDER_AVD = "avd";
-
-    /**
-     * Throw when the location of the android folder couldn't be found.
-     */
-    public static final class AndroidLocationException extends Exception {
-        private static final long serialVersionUID = 1L;
-
-        public AndroidLocationException(String string) {
-            super(string);
-        }
-    }
-
-    private static String sPrefsLocation = null;
-
-    /**
-     * Returns the folder used to store android related files.
-     * @return an OS specific path, terminated by a separator.
-     * @throws AndroidLocationException
-     */
-    @NonNull public final static String getFolder() throws AndroidLocationException {
-        if (sPrefsLocation == null) {
-            String home = findValidPath("ANDROID_SDK_HOME", "user.home", "HOME");
-
-            // if the above failed, we throw an exception.
-            if (home == null) {
-                throw new AndroidLocationException(
-                        "Unable to get the Android SDK home directory.\n" +
-                        "Make sure the environment variable ANDROID_SDK_HOME is set up.");
-            } else {
-                sPrefsLocation = home;
-                if (!sPrefsLocation.endsWith(File.separator)) {
-                    sPrefsLocation += File.separator;
-                }
-                sPrefsLocation += FOLDER_DOT_ANDROID + File.separator;
-            }
-        }
-
-        // make sure the folder exists!
-        File f = new File(sPrefsLocation);
-        if (f.exists() == false) {
-            try {
-                f.mkdir();
-            } catch (SecurityException e) {
-                AndroidLocationException e2 = new AndroidLocationException(String.format(
-                        "Unable to create folder '%1$s'. " +
-                        "This is the path of preference folder expected by the Android tools.",
-                        sPrefsLocation));
-                e2.initCause(e);
-                throw e2;
-            }
-        } else if (f.isFile()) {
-            throw new AndroidLocationException(sPrefsLocation +
-                    " is not a directory! " +
-                    "This is the path of preference folder expected by the Android tools.");
-        }
-
-        return sPrefsLocation;
-    }
-
-    /**
-     * Resets the folder used to store android related files. For testing.
-     */
-    public final static void resetFolder() {
-        sPrefsLocation = null;
-    }
-
-    /**
-     * Checks a list of system properties and/or system environment variables for validity, and
-     * existing director, and returns the first one.
-     * @param names
-     * @return the content of the first property/variable.
-     */
-    private static String findValidPath(String... names) {
-        for (String name : names) {
-            String path;
-            if (name.indexOf('.') != -1) {
-                path = System.getProperty(name);
-            } else {
-                path = System.getenv(name);
-            }
-
-            if (path != null) {
-                File f = new File(path);
-                if (f.isDirectory()) {
-                    return path;
-                }
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/common/src/main/java/com/android/utils/ILogger.java b/common/src/main/java/com/android/utils/ILogger.java
deleted file mode 100644
index 7df5d10..0000000
--- a/common/src/main/java/com/android/utils/ILogger.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.utils;
-
-import com.android.annotations.NonNull;
-
-import java.util.Formatter;
-
-/**
- * Interface used to display warnings/errors while parsing the SDK content.
- * <p/>
- * There are a few default implementations available:
- * <ul>
- * <li> {@link NullLogger} is an implementation that does <em>nothing</em> with the log.
- *  Useful for limited cases where you need to call a class that requires a non-null logging
- *  yet the calling code does not have any mean of reporting logs itself. It can be
- *  acceptable for use as a temporary implementation but most of the time that means the caller
- *  code needs to be reworked to take a logger object from its own caller.
- * </li>
- * <li> {@link StdLogger} is an implementation that dumps the log to {@link System#out} or
- *  {@link System#err}. This is useful for unit tests or code that does not have any GUI.
- *  GUI based apps based should not use it and should provide a better way to report to the user.
- * </li>
- * </ul>
- */
-public interface ILogger {
-
-    /**
-     * Prints an error message.
-     *
-     * @param t is an optional {@link Throwable} or {@link Exception}. If non-null, its
-     *          message will be printed out.
-     * @param msgFormat is an optional error format. If non-null, it will be printed
-     *          using a {@link Formatter} with the provided arguments.
-     * @param args provides the arguments for errorFormat.
-     */
-    void error(Throwable t, String msgFormat, Object... args);
-
-    /**
-     * Prints a warning message.
-     *
-     * @param msgFormat is a string format to be used with a {@link Formatter}. Cannot be null.
-     * @param args provides the arguments for warningFormat.
-     */
-    void warning(@NonNull String msgFormat, Object... args);
-
-    /**
-     * Prints an information message.
-     *
-     * @param msgFormat is a string format to be used with a {@link Formatter}. Cannot be null.
-     * @param args provides the arguments for msgFormat.
-     */
-    void info(@NonNull String msgFormat, Object... args);
-
-    /**
-     * Prints a verbose message.
-     *
-     * @param msgFormat is a string format to be used with a {@link Formatter}. Cannot be null.
-     * @param args provides the arguments for msgFormat.
-     */
-    void verbose(@NonNull String msgFormat, Object... args);
-
-}
diff --git a/common/src/main/java/com/android/utils/NullLogger.java b/common/src/main/java/com/android/utils/NullLogger.java
deleted file mode 100644
index 8b1a3d9..0000000
--- a/common/src/main/java/com/android/utils/NullLogger.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.utils;
-
-import com.android.annotations.NonNull;
-
-/**
- * Dummy implementation of an {@link ILogger}.
- * <p/>
- * Use {@link #getLogger()} to get a default instance of this {@link NullLogger}.
- */
-public class NullLogger implements ILogger {
-
-    private static final ILogger sThis = new NullLogger();
-
-    public static ILogger getLogger() {
-        return sThis;
-    }
-
-    @Override
-    public void error(Throwable t, String errorFormat, Object... args) {
-        // ignore
-    }
-
-    @Override
-    public void warning(@NonNull String warningFormat, Object... args) {
-        // ignore
-    }
-
-    @Override
-    public void info(@NonNull String msgFormat, Object... args) {
-        // ignore
-    }
-
-    @Override
-    public void verbose(@NonNull String msgFormat, Object... args) {
-        // ignore
-    }
-
-}
diff --git a/common/src/main/java/com/android/utils/Pair.java b/common/src/main/java/com/android/utils/Pair.java
deleted file mode 100644
index 63694de..0000000
--- a/common/src/main/java/com/android/utils/Pair.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.utils;
-
-/**
- * A Pair class is simply a 2-tuple for use in this package. We might want to
- * think about adding something like this to a more central utility place, or
- * replace it by a common tuple class if one exists, or even rewrite the layout
- * classes using this Pair by a more dedicated data structure (so we don't have
- * to pass around generic signatures as is currently done, though at least the
- * construction is helped a bit by the {@link #of} factory method.
- *
- * @param <S> The type of the first value
- * @param <T> The type of the second value
- */
-public class Pair<S,T> {
-    private final S mFirst;
-    private final T mSecond;
-
-    // Use {@link Pair#of} factory instead since it infers generic types
-    private Pair(S first, T second) {
-        this.mFirst = first;
-        this.mSecond = second;
-    }
-
-    /**
-     * Return the first item in the pair
-     *
-     * @return the first item in the pair
-     */
-    public S getFirst() {
-        return mFirst;
-    }
-
-    /**
-     * Return the second item in the pair
-     *
-     * @return the second item in the pair
-     */
-    public T getSecond() {
-        return mSecond;
-    }
-
-    /**
-     * Constructs a new pair of the given two objects, inferring generic types.
-     *
-     * @param first the first item to store in the pair
-     * @param second the second item to store in the pair
-     * @param <S> the type of the first item
-     * @param <T> the type of the second item
-     * @return a new pair wrapping the two items
-     */
-    public static <S,T> Pair<S,T> of(S first, T second) {
-        return new Pair<S,T>(first,second);
-    }
-
-    @Override
-    public String toString() {
-        return "Pair [first=" + mFirst + ", second=" + mSecond + "]";
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((mFirst == null) ? 0 : mFirst.hashCode());
-        result = prime * result + ((mSecond == null) ? 0 : mSecond.hashCode());
-        return result;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        Pair other = (Pair) obj;
-        if (mFirst == null) {
-            if (other.mFirst != null)
-                return false;
-        } else if (!mFirst.equals(other.mFirst))
-            return false;
-        if (mSecond == null) {
-            if (other.mSecond != null)
-                return false;
-        } else if (!mSecond.equals(other.mSecond))
-            return false;
-        return true;
-    }
-}
diff --git a/common/src/main/java/com/android/utils/PositionXmlParser.java b/common/src/main/java/com/android/utils/PositionXmlParser.java
deleted file mode 100644
index 73574d5..0000000
--- a/common/src/main/java/com/android/utils/PositionXmlParser.java
+++ /dev/null
@@ -1,729 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.utils;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringReader;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-/**
- * A simple DOM XML parser which can retrieve exact beginning and end offsets
- * (and line and column numbers) for element nodes as well as attribute nodes.
- */
-public class PositionXmlParser {
-    private static final String UTF_8 = "UTF-8";                 //$NON-NLS-1$
-    private static final String UTF_16 = "UTF_16";               //$NON-NLS-1$
-    private static final String UTF_16LE = "UTF_16LE";           //$NON-NLS-1$
-    private static final String CONTENT_KEY = "contents";        //$NON-NLS-1$
-    private final static String POS_KEY = "offsets";             //$NON-NLS-1$
-    private static final String NAMESPACE_PREFIX_FEATURE =
-            "http://xml.org/sax/features/namespace-prefixes";    //$NON-NLS-1$
-    private static final String NAMESPACE_FEATURE =
-            "http://xml.org/sax/features/namespaces";            //$NON-NLS-1$
-    /** See http://www.w3.org/TR/REC-xml/#NT-EncodingDecl */
-    private static final Pattern ENCODING_PATTERN =
-            Pattern.compile("encoding=['\"](\\S*)['\"]");//$NON-NLS-1$
-
-    /**
-     * Parses the XML content from the given input stream.
-     *
-     * @param input the input stream containing the XML to be parsed
-     * @return the corresponding document
-     * @throws ParserConfigurationException if a SAX parser is not available
-     * @throws SAXException if the document contains a parsing error
-     * @throws IOException if something is seriously wrong. This should not
-     *             happen since the input source is known to be constructed from
-     *             a string.
-     */
-    @Nullable
-    public Document parse(@NonNull InputStream input)
-            throws ParserConfigurationException, SAXException, IOException {
-        // Read in all the data
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        byte[] buf = new byte[1024];
-        while (true) {
-          int r = input.read(buf);
-          if (r == -1) {
-            break;
-          }
-          out.write(buf, 0, r);
-        }
-        input.close();
-        return parse(out.toByteArray());
-    }
-
-    /**
-     * Parses the XML content from the given byte array
-     *
-     * @param data the raw XML data (with unknown encoding)
-     * @return the corresponding document
-     * @throws ParserConfigurationException if a SAX parser is not available
-     * @throws SAXException if the document contains a parsing error
-     * @throws IOException if something is seriously wrong. This should not
-     *             happen since the input source is known to be constructed from
-     *             a string.
-     */
-    @Nullable
-    public Document parse(@NonNull byte[] data)
-            throws ParserConfigurationException, SAXException, IOException {
-        String xml = getXmlString(data);
-        return parse(xml, new InputSource(new StringReader(xml)), true);
-    }
-
-    /**
-     * Parses the given XML content.
-     *
-     * @param xml the XML string to be parsed. This must be in the correct
-     *     encoding already.
-     * @return the corresponding document
-     * @throws ParserConfigurationException if a SAX parser is not available
-     * @throws SAXException if the document contains a parsing error
-     * @throws IOException if something is seriously wrong. This should not
-     *             happen since the input source is known to be constructed from
-     *             a string.
-     */
-    @Nullable
-    public Document parse(@NonNull String xml)
-            throws ParserConfigurationException, SAXException, IOException {
-        return parse(xml, new InputSource(new StringReader(xml)), true);
-    }
-
-    @NonNull
-    private Document parse(@NonNull String xml, @NonNull InputSource input, boolean checkBom)
-            throws ParserConfigurationException, SAXException, IOException {
-        try {
-            SAXParserFactory factory = SAXParserFactory.newInstance();
-            factory.setFeature(NAMESPACE_FEATURE, true);
-            factory.setFeature(NAMESPACE_PREFIX_FEATURE, true);
-            SAXParser parser = factory.newSAXParser();
-            DomBuilder handler = new DomBuilder(xml);
-            parser.parse(input, handler);
-            return handler.getDocument();
-        } catch (SAXException e) {
-            if (checkBom && e.getMessage().contains("Content is not allowed in prolog")) {
-                // Byte order mark in the string? Skip it. There are many markers
-                // (see http://en.wikipedia.org/wiki/Byte_order_mark) so here we'll
-                // just skip those up to the XML prolog beginning character, <
-                xml = xml.replaceFirst("^([\\W]+)<","<");  //$NON-NLS-1$ //$NON-NLS-2$
-                return parse(xml, new InputSource(new StringReader(xml)), false);
-            }
-            throw e;
-        }
-    }
-
-    /**
-     * Returns the String corresponding to the given byte array of XML data
-     * (with unknown encoding). This method attempts to guess the encoding based
-     * on the XML prologue.
-     * @param data the XML data to be decoded into a string
-     * @return a string corresponding to the XML data
-     */
-    public static String getXmlString(byte[] data) {
-        int offset = 0;
-
-        String defaultCharset = UTF_8;
-        String charset = null;
-        // Look for the byte order mark, to see if we need to remove bytes from
-        // the input stream (and to determine whether files are big endian or little endian) etc
-        // for files which do not specify the encoding.
-        // See http://unicode.org/faq/utf_bom.html#BOM for more.
-        if (data.length > 4) {
-            if (data[0] == (byte)0xef && data[1] == (byte)0xbb && data[2] == (byte)0xbf) {
-                // UTF-8
-                defaultCharset = charset = UTF_8;
-                offset += 3;
-            } else if (data[0] == (byte)0xfe && data[1] == (byte)0xff) {
-                //  UTF-16, big-endian
-                defaultCharset = charset = UTF_16;
-                offset += 2;
-            } else if (data[0] == (byte)0x0 && data[1] == (byte)0x0
-                    && data[2] == (byte)0xfe && data[3] == (byte)0xff) {
-                // UTF-32, big-endian
-                defaultCharset = charset = "UTF_32";    //$NON-NLS-1$
-                offset += 4;
-            } else if (data[0] == (byte)0xff && data[1] == (byte)0xfe
-                    && data[2] == (byte)0x0 && data[3] == (byte)0x0) {
-                // UTF-32, little-endian. We must check for this *before* looking for
-                // UTF_16LE since UTF_32LE has the same prefix!
-                defaultCharset = charset = "UTF_32LE";  //$NON-NLS-1$
-                offset += 4;
-            } else if (data[0] == (byte)0xff && data[1] == (byte)0xfe) {
-                //  UTF-16, little-endian
-                defaultCharset = charset = UTF_16LE;
-                offset += 2;
-            }
-        }
-        int length = data.length - offset;
-
-        // Guess encoding by searching for an encoding= entry in the first line.
-        // The prologue, and the encoding names, will always be in ASCII - which means
-        // we don't need to worry about strange character encodings for the prologue characters.
-        // However, one wrinkle is that the whole file may be encoded in something like UTF-16
-        // where there are two bytes per character, so we can't just look for
-        //  ['e','n','c','o','d','i','n','g'] etc in the byte array since there could be
-        // multiple bytes for each character. However, since again the prologue is in ASCII,
-        // we can just drop the zeroes.
-        boolean seenOddZero = false;
-        boolean seenEvenZero = false;
-        int prologueStart = -1;
-        for (int lineEnd = offset; lineEnd < data.length; lineEnd++) {
-            if (data[lineEnd] == 0) {
-                if ((lineEnd - offset) % 2 == 0) {
-                    seenEvenZero = true;
-                } else {
-                    seenOddZero = true;
-                }
-            } else if (data[lineEnd] == '\n' || data[lineEnd] == '\r') {
-                break;
-            } else if (data[lineEnd] == '<') {
-                prologueStart = lineEnd;
-            } else if (data[lineEnd] == '>') {
-                // End of prologue. Quick check to see if this is a utf-8 file since that's
-                // common
-                for (int i = lineEnd - 4; i >= 0; i--) {
-                    if ((data[i] == 'u' || data[i] == 'U')
-                            && (data[i + 1] == 't' || data[i + 1] == 'T')
-                            && (data[i + 2] == 'f' || data[i + 2] == 'F')
-                            && (data[i + 3] == '-' || data[i + 3] == '_')
-                            && (data[i + 4] == '8')
-                            ) {
-                        charset = UTF_8;
-                        break;
-                    }
-                }
-
-                if (charset == null) {
-                    StringBuilder sb = new StringBuilder();
-                    for (int i = prologueStart; i <= lineEnd; i++) {
-                        if (data[i] != 0) {
-                            sb.append((char) data[i]);
-                        }
-                    }
-                    String prologue = sb.toString();
-                    int encodingIndex = prologue.indexOf("encoding"); //$NON-NLS-1$
-                    if (encodingIndex != -1) {
-                        Matcher matcher = ENCODING_PATTERN.matcher(prologue);
-                        if (matcher.find(encodingIndex)) {
-                            charset = matcher.group(1);
-                        }
-                    }
-                }
-
-                break;
-            }
-        }
-
-        // No prologue on the first line, and no byte order mark: Assume UTF-8/16
-        if (charset == null) {
-            charset = seenOddZero ? UTF_16LE : seenEvenZero ? UTF_16 : UTF_8;
-        }
-
-        String xml = null;
-        try {
-            xml = new String(data, offset, length, charset);
-        } catch (UnsupportedEncodingException e) {
-            try {
-                if (charset != defaultCharset) {
-                    xml = new String(data, offset, length, defaultCharset);
-                }
-            } catch (UnsupportedEncodingException u) {
-                // Just use the default encoding below
-            }
-        }
-        if (xml == null) {
-            xml = new String(data, offset, length);
-        }
-        return xml;
-    }
-
-    /**
-     * Returns the position for the given node. This is the start position. The
-     * end position can be obtained via {@link Position#getEnd()}.
-     *
-     * @param node the node to look up position for
-     * @return the position, or null if the node type is not supported for
-     *         position info
-     */
-    @Nullable
-    public Position getPosition(@NonNull Node node) {
-        return getPosition(node, -1, -1);
-    }
-
-    /**
-     * Returns the position for the given node. This is the start position. The
-     * end position can be obtained via {@link Position#getEnd()}. A specific
-     * range within the node can be specified with the {@code start} and
-     * {@code end} parameters.
-     *
-     * @param node the node to look up position for
-     * @param start the relative offset within the node range to use as the
-     *            starting position, inclusive, or -1 to not limit the range
-     * @param end the relative offset within the node range to use as the ending
-     *            position, or -1 to not limit the range
-     * @return the position, or null if the node type is not supported for
-     *         position info
-     */
-    @Nullable
-    public Position getPosition(@NonNull Node node, int start, int end) {
-        // Look up the position information stored while parsing for the given node.
-        // Note however that we only store position information for elements (because
-        // there is no SAX callback for individual attributes).
-        // Therefore, this method special cases this:
-        //  -- First, it looks at the owner element and uses its position
-        //     information as a first approximation.
-        //  -- Second, it uses that, as well as the original XML text, to search
-        //     within the node range for an exact text match on the attribute name
-        //     and if found uses that as the exact node offsets instead.
-        if (node instanceof Attr) {
-            Attr attr = (Attr) node;
-            Position pos = (Position) attr.getOwnerElement().getUserData(POS_KEY);
-            if (pos != null) {
-                int startOffset = pos.getOffset();
-                int endOffset = pos.getEnd().getOffset();
-                if (start != -1) {
-                    startOffset += start;
-                    if (end != -1) {
-                        endOffset = start + end;
-                    }
-                }
-
-                // Find attribute in the text
-                String contents = (String) node.getOwnerDocument().getUserData(CONTENT_KEY);
-                if (contents == null) {
-                    return null;
-                }
-
-                // Locate the name=value attribute in the source text
-                // Fast string check first for the common occurrence
-                String name = attr.getName();
-                Pattern pattern = Pattern.compile(
-                        String.format("%1$s\\s*=\\s*[\"'].*[\"']", name)); //$NON-NLS-1$
-                Matcher matcher = pattern.matcher(contents);
-                if (matcher.find(startOffset) && matcher.start() <= endOffset) {
-                    int index = matcher.start();
-                    // Adjust the line and column to this new offset
-                    int line = pos.getLine();
-                    int column = pos.getColumn();
-                    for (int offset = pos.getOffset(); offset < index; offset++) {
-                        char t = contents.charAt(offset);
-                        if (t == '\n') {
-                            line++;
-                            column = 0;
-                        } else {
-                            column++;
-                        }
-                    }
-
-                    Position attributePosition = createPosition(line, column, index);
-                    // Also set end range for retrieval in getLocation
-                    attributePosition.setEnd(createPosition(line, column + matcher.end() - index,
-                            matcher.end()));
-                    return attributePosition;
-                } else {
-                    // No regexp match either: just fall back to element position
-                    return pos;
-                }
-            }
-        } else if (node instanceof Text) {
-            // Position of parent element, if any
-            Position pos = null;
-            if (node.getPreviousSibling() != null) {
-                pos = (Position) node.getPreviousSibling().getUserData(POS_KEY);
-            }
-            if (pos == null) {
-                pos = (Position) node.getParentNode().getUserData(POS_KEY);
-            }
-            if (pos != null) {
-                // Attempt to point forward to the actual text node
-                int startOffset = pos.getOffset();
-                int endOffset = pos.getEnd().getOffset();
-                int line = pos.getLine();
-                int column = pos.getColumn();
-
-                // Find attribute in the text
-                String contents = (String) node.getOwnerDocument().getUserData(CONTENT_KEY);
-                if (contents == null || contents.length() < endOffset) {
-                    return null;
-                }
-
-                boolean inAttribute = false;
-                for (int offset = startOffset; offset <= endOffset; offset++) {
-                    char c = contents.charAt(offset);
-                    if (c == '>' && !inAttribute) {
-                        // Found the end of the element open tag: this is where the
-                        // text begins.
-
-                        // Skip >
-                        offset++;
-                        column++;
-
-                        String text = node.getNodeValue();
-                        int textIndex = 0;
-                        int textLength = text.length();
-                        int newLine = line;
-                        int newColumn = column;
-                        if (start != -1) {
-                            textLength = Math.min(textLength, start);
-                            for (; textIndex < textLength; textIndex++) {
-                                char t = text.charAt(textIndex);
-                                if (t == '\n') {
-                                    newLine++;
-                                    newColumn = 0;
-                                } else {
-                                    newColumn++;
-                                }
-                            }
-                        } else {
-                            // Skip text whitespace prefix, if the text node contains
-                            // non-whitespace characters
-                            for (; textIndex < textLength; textIndex++) {
-                                char t = text.charAt(textIndex);
-                                if (t == '\n') {
-                                    newLine++;
-                                    newColumn = 0;
-                                } else if (!Character.isWhitespace(t)) {
-                                    break;
-                                } else {
-                                    newColumn++;
-                                }
-                            }
-                        }
-                        if (textIndex == text.length()) {
-                            textIndex = 0; // Whitespace node
-                        } else {
-                            line = newLine;
-                            column = newColumn;
-                        }
-
-                        Position attributePosition = createPosition(line, column,
-                                offset + textIndex);
-                        // Also set end range for retrieval in getLocation
-                        if (end != -1) {
-                            attributePosition.setEnd(createPosition(line, column,
-                                    offset + end));
-                        } else {
-                            attributePosition.setEnd(createPosition(line, column,
-                                    offset + textLength));
-                        }
-                        return attributePosition;
-                    } else if (c == '"') {
-                        inAttribute = !inAttribute;
-                    } else if (c == '\n') {
-                        line++;
-                        column = -1; // pre-subtract column added below
-                    }
-                    column++;
-                }
-
-                return pos;
-            }
-        }
-
-        return (Position) node.getUserData(POS_KEY);
-    }
-
-    /**
-     * SAX parser handler which incrementally builds up a DOM document as we go
-     * along, and updates position information along the way. Position
-     * information is attached to the DOM nodes by setting user data with the
-     * {@link POS_KEY} key.
-     */
-    private final class DomBuilder extends DefaultHandler {
-        private final String mXml;
-        private final Document mDocument;
-        private Locator mLocator;
-        private int mCurrentLine = 0;
-        private int mCurrentOffset;
-        private int mCurrentColumn;
-        private final List<Element> mStack = new ArrayList<Element>();
-        private final StringBuilder mPendingText = new StringBuilder();
-
-        private DomBuilder(String xml) throws ParserConfigurationException {
-            mXml = xml;
-
-            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-            factory.setNamespaceAware(true);
-            factory.setValidating(false);
-            DocumentBuilder docBuilder = factory.newDocumentBuilder();
-            mDocument = docBuilder.newDocument();
-            mDocument.setUserData(CONTENT_KEY, xml, null);
-        }
-
-        /** Returns the document parsed by the handler */
-        Document getDocument() {
-            return mDocument;
-        }
-
-        @Override
-        public void setDocumentLocator(Locator locator) {
-            this.mLocator = locator;
-        }
-
-        @Override
-        public void startElement(String uri, String localName, String qName,
-                Attributes attributes) throws SAXException {
-            try {
-                flushText();
-                Element element = mDocument.createElement(qName);
-                for (int i = 0; i < attributes.getLength(); i++) {
-                    if (attributes.getURI(i) != null && attributes.getURI(i).length() > 0) {
-                        Attr attr = mDocument.createAttributeNS(attributes.getURI(i),
-                                attributes.getQName(i));
-                        attr.setValue(attributes.getValue(i));
-                        element.setAttributeNodeNS(attr);
-                        assert attr.getOwnerElement() == element;
-                    } else {
-                        Attr attr = mDocument.createAttribute(attributes.getQName(i));
-                        attr.setValue(attributes.getValue(i));
-                        element.setAttributeNode(attr);
-                        assert attr.getOwnerElement() == element;
-                    }
-                }
-
-                Position pos = getCurrentPosition();
-
-                // The starting position reported to us by SAX is really the END of the
-                // open tag in an element, when all the attributes have been processed.
-                // We have to scan backwards to find the real beginning. We'll do that
-                // by scanning backwards.
-                // -1: Make sure that when we have <foo></foo> we don't consider </foo>
-                // the beginning since pos.offset will typically point to the first character
-                // AFTER the element open tag, which could be a closing tag or a child open
-                // tag
-
-                for (int offset = pos.getOffset() - 1; offset >= 0; offset--) {
-                    char c = mXml.charAt(offset);
-                    // < cannot appear in attribute values or anywhere else within
-                    // an element open tag, so we know the first occurrence is the real
-                    // element start
-                    if (c == '<') {
-                        // Adjust line position
-                        int line = pos.getLine();
-                        for (int i = offset, n = pos.getOffset(); i < n; i++) {
-                            if (mXml.charAt(i) == '\n') {
-                                line--;
-                            }
-                        }
-
-                        // Compute new column position
-                        int column = 0;
-                        for (int i = offset - 1; i >= 0; i--, column++) {
-                            if (mXml.charAt(i) == '\n') {
-                                break;
-                            }
-                        }
-
-                        pos = createPosition(line, column, offset);
-                        break;
-                    }
-                }
-
-                element.setUserData(POS_KEY, pos, null);
-                mStack.add(element);
-            } catch (Exception t) {
-                throw new SAXException(t);
-            }
-        }
-
-        @Override
-        public void endElement(String uri, String localName, String qName) {
-            flushText();
-            Element element = mStack.remove(mStack.size() - 1);
-
-            Position pos = (Position) element.getUserData(POS_KEY);
-            assert pos != null;
-            pos.setEnd(getCurrentPosition());
-
-            if (mStack.isEmpty()) {
-                mDocument.appendChild(element);
-            } else {
-                Element parent = mStack.get(mStack.size() - 1);
-                parent.appendChild(element);
-            }
-        }
-
-        /**
-         * Returns a position holder for the current position. The most
-         * important part of this function is to incrementally compute the
-         * offset as well, by counting forwards until it reaches the new line
-         * number and column position of the XML parser, counting characters as
-         * it goes along.
-         */
-        private Position getCurrentPosition() {
-            int line = mLocator.getLineNumber() - 1;
-            int column = mLocator.getColumnNumber() - 1;
-
-            // Compute offset incrementally now that we have the new line and column
-            // numbers
-            int xmlLength = mXml.length();
-            while (mCurrentLine < line && mCurrentOffset < xmlLength) {
-                char c = mXml.charAt(mCurrentOffset);
-                if (c == '\r' && mCurrentOffset < xmlLength - 1) {
-                    if (mXml.charAt(mCurrentOffset + 1) != '\n') {
-                        mCurrentLine++;
-                        mCurrentColumn = 0;
-                    }
-                } else if (c == '\n') {
-                    mCurrentLine++;
-                    mCurrentColumn = 0;
-                } else {
-                    mCurrentColumn++;
-                }
-                mCurrentOffset++;
-            }
-
-            mCurrentOffset += column - mCurrentColumn;
-            if (mCurrentOffset >= xmlLength) {
-                // The parser sometimes passes wrong column numbers at the
-                // end of the file: Ensure that the offset remains valid.
-                mCurrentOffset = xmlLength;
-            }
-            mCurrentColumn = column;
-
-            return createPosition(mCurrentLine, mCurrentColumn, mCurrentOffset);
-        }
-
-        @Override
-        public void characters(char c[], int start, int length) throws SAXException {
-            mPendingText.append(c, start, length);
-        }
-
-        private void flushText() {
-            if (mPendingText.length() > 0 && !mStack.isEmpty()) {
-                Element element = mStack.get(mStack.size() - 1);
-                Node textNode = mDocument.createTextNode(mPendingText.toString());
-                element.appendChild(textNode);
-                mPendingText.setLength(0);
-            }
-        }
-    }
-
-    /**
-     * Creates a position while constructing the DOM document. This method
-     * allows a subclass to create a custom implementation of the position
-     * class.
-     *
-     * @param line the line number for the position
-     * @param column the column number for the position
-     * @param offset the character offset
-     * @return a new position
-     */
-    @NonNull
-    protected Position createPosition(int line, int column, int offset) {
-        return new DefaultPosition(line, column, offset);
-    }
-
-    protected interface Position {
-        /**
-         * Linked position: for a begin position this will point to the
-         * corresponding end position. For an end position this will be null.
-         *
-         * @return the end position, or null
-         */
-        @Nullable
-        public Position getEnd();
-
-        /**
-         * Linked position: for a begin position this will point to the
-         * corresponding end position. For an end position this will be null.
-         *
-         * @param end the end position
-         */
-        public void setEnd(@NonNull Position end);
-
-        /** @return the line number, 0-based */
-        public int getLine();
-
-        /** @return the offset number, 0-based */
-        public int getOffset();
-
-        /** @return the column number, 0-based, and -1 if the column number if not known */
-        public int getColumn();
-    }
-
-    protected static class DefaultPosition implements Position {
-        /** The line number (0-based where the first line is line 0) */
-        private final int mLine;
-        private final int mColumn;
-        private final int mOffset;
-        private Position mEnd;
-
-        /**
-         * Creates a new {@link Position}
-         *
-         * @param line the 0-based line number, or -1 if unknown
-         * @param column the 0-based column number, or -1 if unknown
-         * @param offset the offset, or -1 if unknown
-         */
-        public DefaultPosition(int line, int column, int offset) {
-            this.mLine = line;
-            this.mColumn = column;
-            this.mOffset = offset;
-        }
-
-        @Override
-        public int getLine() {
-            return mLine;
-        }
-
-        @Override
-        public int getOffset() {
-            return mOffset;
-        }
-
-        @Override
-        public int getColumn() {
-            return mColumn;
-        }
-
-        @Override
-        public Position getEnd() {
-            return mEnd;
-        }
-
-        @Override
-        public void setEnd(@NonNull Position end) {
-            mEnd = end;
-        }
-    }
-}
diff --git a/common/src/main/java/com/android/utils/SdkUtils.java b/common/src/main/java/com/android/utils/SdkUtils.java
deleted file mode 100644
index 160f95d..0000000
--- a/common/src/main/java/com/android/utils/SdkUtils.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.utils;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-
-/** Miscellaneous utilities used by the Android SDK tools */
-public class SdkUtils {
-    /**
-     * Returns true if the given string ends with the given suffix, using a
-     * case-insensitive comparison.
-     *
-     * @param string the full string to be checked
-     * @param suffix the suffix to be checked for
-     * @return true if the string case-insensitively ends with the given suffix
-     */
-    public static boolean endsWithIgnoreCase(String string, String suffix) {
-        return string.regionMatches(true /* ignoreCase */, string.length() - suffix.length(),
-                suffix, 0, suffix.length());
-    }
-
-    /**
-     * Returns true if the given sequence ends with the given suffix (case
-     * sensitive).
-     *
-     * @param sequence the character sequence to be checked
-     * @param suffix the suffix to look for
-     * @return true if the given sequence ends with the given suffix
-     */
-    public static boolean endsWith(CharSequence sequence, CharSequence suffix) {
-        return endsWith(sequence, sequence.length(), suffix);
-    }
-
-    /**
-     * Returns true if the given sequence ends at the given offset with the given suffix (case
-     * sensitive)
-     *
-     * @param sequence the character sequence to be checked
-     * @param endOffset the offset at which the sequence is considered to end
-     * @param suffix the suffix to look for
-     * @return true if the given sequence ends with the given suffix
-     */
-    public static boolean endsWith(CharSequence sequence, int endOffset, CharSequence suffix) {
-        if (endOffset < suffix.length()) {
-            return false;
-        }
-
-        for (int i = endOffset - 1, j = suffix.length() - 1; j >= 0; i--, j--) {
-            if (sequence.charAt(i) != suffix.charAt(j)) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Returns true if the given string starts with the given prefix, using a
-     * case-insensitive comparison.
-     *
-     * @param string the full string to be checked
-     * @param prefix the prefix to be checked for
-     * @return true if the string case-insensitively starts with the given prefix
-     */
-    public static boolean startsWithIgnoreCase(String string, String prefix) {
-        return string.regionMatches(true /* ignoreCase */, 0, prefix, 0, prefix.length());
-    }
-
-    /**
-     * Returns true if the given string starts at the given offset with the
-     * given prefix, case insensitively.
-     *
-     * @param string the full string to be checked
-     * @param offset the offset in the string to start looking
-     * @param prefix the prefix to be checked for
-     * @return true if the string case-insensitively starts at the given offset
-     *         with the given prefix
-     */
-    public static boolean startsWith(String string, int offset, String prefix) {
-        return string.regionMatches(true /* ignoreCase */, offset, prefix, 0, prefix.length());
-    }
-
-    /**
-     * Strips the whitespace from the given string
-     *
-     * @param string the string to be cleaned up
-     * @return the string, without whitespace
-     */
-    public static String stripWhitespace(String string) {
-        StringBuilder sb = new StringBuilder(string.length());
-        for (int i = 0, n = string.length(); i < n; i++) {
-            char c = string.charAt(i);
-            if (!Character.isWhitespace(c)) {
-                sb.append(c);
-            }
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Returns true if the given string has an upper case character.
-     *
-     * @param s the string to check
-     * @return true if it contains uppercase characters
-     */
-    public static boolean hasUpperCaseCharacter(String s) {
-        for (int i = 0; i < s.length(); i++) {
-            if (Character.isUpperCase(s.charAt(i))) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /** For use by {@link #getLineSeparator()} */
-    private static String sLineSeparator;
-
-    /**
-     * Returns the default line separator to use.
-     * <p>
-     * NOTE: If you have an associated IDocument (Eclipse), it is better to call
-     * TextUtilities#getDefaultLineDelimiter(IDocument) since that will
-     * allow (for example) editing a \r\n-delimited document on a \n-delimited
-     * platform and keep a consistent usage of delimiters in the file.
-     *
-     * @return the delimiter string to use
-     */
-    @NonNull
-    public static String getLineSeparator() {
-        if (sLineSeparator == null) {
-            // This is guaranteed to exist:
-            sLineSeparator = System.getProperty("line.separator"); //$NON-NLS-1$
-        }
-
-        return sLineSeparator;
-    }
-
-    /**
-     * Wraps the given text at the given line width, with an optional hanging
-     * indent.
-     *
-     * @param text the text to be wrapped
-     * @param lineWidth the number of characters to wrap the text to
-     * @param hangingIndent the hanging indent (to be used for the second and
-     *            subsequent lines in each paragraph, or null if not known
-     * @return the string, wrapped
-     */
-    @NonNull
-    public static String wrap(
-            @NonNull String text,
-            int lineWidth,
-            @Nullable String hangingIndent) {
-        if (hangingIndent == null) {
-            hangingIndent = "";
-        }
-        int explanationLength = text.length();
-        StringBuilder sb = new StringBuilder(explanationLength * 2);
-        int index = 0;
-
-        while (index < explanationLength) {
-            int lineEnd = text.indexOf('\n', index);
-            int next;
-
-            if (lineEnd != -1 && (lineEnd - index) < lineWidth) {
-                next = lineEnd + 1;
-            } else {
-                // Line is longer than available width; grab as much as we can
-                lineEnd = Math.min(index + lineWidth, explanationLength);
-                if (lineEnd - index < lineWidth) {
-                    next = explanationLength;
-                } else {
-                    // then back up to the last space
-                    int lastSpace = text.lastIndexOf(' ', lineEnd);
-                    if (lastSpace > index) {
-                        lineEnd = lastSpace;
-                        next = lastSpace + 1;
-                    } else {
-                        // No space anywhere on the line: it contains something wider than
-                        // can fit (like a long URL) so just hard break it
-                        next = lineEnd + 1;
-                    }
-                }
-            }
-
-            if (sb.length() > 0) {
-                sb.append(hangingIndent);
-            } else {
-                lineWidth -= hangingIndent.length();
-            }
-
-            sb.append(text.substring(index, lineEnd));
-            sb.append('\n');
-            index = next;
-        }
-
-        return sb.toString();
-    }
-
-}
diff --git a/common/src/main/java/com/android/utils/StdLogger.java b/common/src/main/java/com/android/utils/StdLogger.java
deleted file mode 100644
index 05eb456..0000000
--- a/common/src/main/java/com/android/utils/StdLogger.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.utils;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-
-import java.io.PrintStream;
-import java.util.Formatter;
-
-
-/**
- * An implementation of {@link ILogger} that prints to {@link System#out} and {@link System#err}.
- * <p/>
- *
- */
-public class StdLogger implements ILogger {
-
-    private final Level mLevel;
-
-    public enum Level {
-        VERBOSE(0),
-        INFO(1),
-        WARNING(2),
-        ERROR(3);
-
-        private final int mLevel;
-
-        Level(int level) {
-            mLevel = level;
-        }
-    }
-
-    /**
-     * Creates the {@link StdLogger} with a given log {@link Level}.
-     * @param level the log Level.
-     */
-    public StdLogger(@NonNull Level level) {
-        if (level == null) {
-            throw new IllegalArgumentException("level cannot be null");
-        }
-
-        mLevel = level;
-    }
-
-    /**
-     * Returns the logger's log {@link Level}.
-     * @return the log level.
-     */
-    public Level getLevel() {
-        return mLevel;
-    }
-
-    /**
-     * Prints an error message.
-     * <p/>
-     * The message will be tagged with "Error" on the output so the caller does not
-     * need to put such a prefix in the format string.
-     * <p/>
-     * The output is done on {@link System#err}.
-     * <p/>
-     * This is always displayed, independent of the logging {@link Level}.
-     *
-     * @param t is an optional {@link Throwable} or {@link Exception}. If non-null, it's
-     *          message will be printed out.
-     * @param errorFormat is an optional error format. If non-null, it will be printed
-     *          using a {@link Formatter} with the provided arguments.
-     * @param args provides the arguments for errorFormat.
-     */
-    @Override
-    public void error(Throwable t, String errorFormat, Object... args) {
-        if (errorFormat != null) {
-            String msg = String.format("Error: " + errorFormat, args);
-
-            printMessage(msg, System.err);
-        }
-        if (t != null) {
-            System.err.println(String.format("Error: %1$s", t.getMessage()));
-        }
-    }
-
-    /**
-     * Prints a warning message.
-     * <p/>
-     * The message will be tagged with "Warning" on the output so the caller does not
-     * need to put such a prefix in the format string.
-     * <p/>
-     * The output is done on {@link System#out}.
-     * <p/>
-     * This is displayed only if the logging {@link Level} is {@link Level#WARNING} or higher.
-     *
-     * @param warningFormat is a string format to be used with a {@link Formatter}. Cannot be null.
-     * @param args provides the arguments for warningFormat.
-     */
-    @Override
-    public void warning(@NonNull String warningFormat, Object... args) {
-        if (mLevel.mLevel > Level.WARNING.mLevel) {
-            return;
-        }
-
-        String msg = String.format("Warning: " + warningFormat, args);
-
-        printMessage(msg, System.out);
-    }
-
-    /**
-     * Prints an info message.
-     * <p/>
-     * The output is done on {@link System#out}.
-     * <p/>
-     * This is displayed only if the logging {@link Level} is {@link Level#INFO} or higher.
-     *
-     * @param msgFormat is a string format to be used with a {@link Formatter}. Cannot be null.
-     * @param args provides the arguments for msgFormat.
-     */
-    @Override
-    public void info(@NonNull String msgFormat, Object... args) {
-        if (mLevel.mLevel > Level.INFO.mLevel) {
-            return;
-        }
-
-        String msg = String.format(msgFormat, args);
-
-        printMessage(msg, System.out);
-    }
-
-    /**
-     * Prints a verbose message.
-     * <p/>
-     * The output is done on {@link System#out}.
-     * <p/>
-     * This is displayed only if the logging {@link Level} is {@link Level#VERBOSE} or higher.
-     *
-     * @param msgFormat is a string format to be used with a {@link Formatter}. Cannot be null.
-     * @param args provides the arguments for msgFormat.
-     */
-    @Override
-    public void verbose(@NonNull String msgFormat, Object... args) {
-        if (mLevel.mLevel > Level.VERBOSE.mLevel) {
-            return;
-        }
-
-        String msg = String.format(msgFormat, args);
-
-        printMessage(msg, System.out);
-    }
-
-    private void printMessage(String msg, PrintStream stream) {
-        if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS &&
-                !msg.endsWith("\r\n") &&
-                msg.endsWith("\n")) {
-            // remove last \n so that println can use \r\n as needed.
-            msg = msg.substring(0, msg.length() - 1);
-        }
-
-        stream.print(msg);
-
-        if (!msg.endsWith("\n")) {
-            stream.println();
-        }
-    }
-
-}
diff --git a/common/src/main/java/com/android/utils/XmlUtils.java b/common/src/main/java/com/android/utils/XmlUtils.java
deleted file mode 100644
index c77baee..0000000
--- a/common/src/main/java/com/android/utils/XmlUtils.java
+++ /dev/null
@@ -1,416 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.utils;
-
-import static com.android.SdkConstants.AMP_ENTITY;
-import static com.android.SdkConstants.ANDROID_NS_NAME;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.APOS_ENTITY;
-import static com.android.SdkConstants.APP_PREFIX;
-import static com.android.SdkConstants.LT_ENTITY;
-import static com.android.SdkConstants.QUOT_ENTITY;
-import static com.android.SdkConstants.XMLNS;
-import static com.android.SdkConstants.XMLNS_PREFIX;
-import static com.android.SdkConstants.XMLNS_URI;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.google.common.base.Splitter;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.util.HashSet;
-
-/** XML Utilities */
-public class XmlUtils {
-    /**
-     * Returns the namespace prefix matching the requested namespace URI.
-     * If no such declaration is found, returns the default "android" prefix for
-     * the Android URI, and "app" for other URI's. By default the app namespace
-     * will be created. If this is not desirable, call
-     * {@link #lookupNamespacePrefix(Node, String, boolean)} instead.
-     *
-     * @param node The current node. Must not be null.
-     * @param nsUri The namespace URI of which the prefix is to be found,
-     *              e.g. {@link SdkConstants#ANDROID_URI}
-     * @return The first prefix declared or the default "android" prefix
-     *              (or "app" for non-Android URIs)
-     */
-    @NonNull
-    public static String lookupNamespacePrefix(@NonNull Node node, @NonNull String nsUri) {
-        String defaultPrefix = ANDROID_URI.equals(nsUri) ? ANDROID_NS_NAME : APP_PREFIX;
-        return lookupNamespacePrefix(node, nsUri, defaultPrefix, true /*create*/);
-    }
-
-    /**
-     * Returns the namespace prefix matching the requested namespace URI. If no
-     * such declaration is found, returns the default "android" prefix for the
-     * Android URI, and "app" for other URI's.
-     *
-     * @param node The current node. Must not be null.
-     * @param nsUri The namespace URI of which the prefix is to be found, e.g.
-     *            {@link SdkConstants#ANDROID_URI}
-     * @param create whether the namespace declaration should be created, if
-     *            necessary
-     * @return The first prefix declared or the default "android" prefix (or
-     *         "app" for non-Android URIs)
-     */
-    @NonNull
-    public static String lookupNamespacePrefix(@NonNull Node node, @NonNull String nsUri,
-            boolean create) {
-        String defaultPrefix = ANDROID_URI.equals(nsUri) ? ANDROID_NS_NAME : APP_PREFIX;
-        return lookupNamespacePrefix(node, nsUri, defaultPrefix, create);
-    }
-
-    /**
-     * Returns the namespace prefix matching the requested namespace URI. If no
-     * such declaration is found, returns the default "android" prefix.
-     *
-     * @param node The current node. Must not be null.
-     * @param nsUri The namespace URI of which the prefix is to be found, e.g.
-     *            {@link SdkConstants#ANDROID_URI}
-     * @param defaultPrefix The default prefix (root) to use if the namespace is
-     *            not found. If null, do not create a new namespace if this URI
-     *            is not defined for the document.
-     * @param create whether the namespace declaration should be created, if
-     *            necessary
-     * @return The first prefix declared or the provided prefix (possibly with a
-     *            number appended to avoid conflicts with existing prefixes.
-     */
-    public static String lookupNamespacePrefix(
-            @Nullable Node node, @Nullable String nsUri, @Nullable String defaultPrefix,
-            boolean create) {
-        // Note: Node.lookupPrefix is not implemented in wst/xml/core NodeImpl.java
-        // The following code emulates this simple call:
-        //   String prefix = node.lookupPrefix(NS_RESOURCES);
-
-        // if the requested URI is null, it denotes an attribute with no namespace.
-        if (nsUri == null) {
-            return null;
-        }
-
-        // per XML specification, the "xmlns" URI is reserved
-        if (XMLNS_URI.equals(nsUri)) {
-            return XMLNS;
-        }
-
-        HashSet<String> visited = new HashSet<String>();
-        Document doc = node == null ? null : node.getOwnerDocument();
-
-        // Ask the document about it. This method may not be implemented by the Document.
-        String nsPrefix = null;
-        try {
-            nsPrefix = doc != null ? doc.lookupPrefix(nsUri) : null;
-            if (nsPrefix != null) {
-                return nsPrefix;
-            }
-        } catch (Throwable t) {
-            // ignore
-        }
-
-        // If that failed, try to look it up manually.
-        // This also gathers prefixed in use in the case we want to generate a new one below.
-        for (; node != null && node.getNodeType() == Node.ELEMENT_NODE;
-               node = node.getParentNode()) {
-            NamedNodeMap attrs = node.getAttributes();
-            for (int n = attrs.getLength() - 1; n >= 0; --n) {
-                Node attr = attrs.item(n);
-                if (XMLNS.equals(attr.getPrefix())) {
-                    String uri = attr.getNodeValue();
-                    nsPrefix = attr.getLocalName();
-                    // Is this the URI we are looking for? If yes, we found its prefix.
-                    if (nsUri.equals(uri)) {
-                        return nsPrefix;
-                    }
-                    visited.add(nsPrefix);
-                }
-            }
-        }
-
-        // Failed the find a prefix. Generate a new sensible default prefix, unless
-        // defaultPrefix was null in which case the caller does not want the document
-        // modified.
-        if (defaultPrefix == null) {
-            return null;
-        }
-
-        //
-        // We need to make sure the prefix is not one that was declared in the scope
-        // visited above. Pick a unique prefix from the provided default prefix.
-        String prefix = defaultPrefix;
-        String base = prefix;
-        for (int i = 1; visited.contains(prefix); i++) {
-            prefix = base + Integer.toString(i);
-        }
-        // Also create & define this prefix/URI in the XML document as an attribute in the
-        // first element of the document.
-        if (doc != null) {
-            node = doc.getFirstChild();
-            while (node != null && node.getNodeType() != Node.ELEMENT_NODE) {
-                node = node.getNextSibling();
-            }
-            if (node != null && create) {
-                // This doesn't work:
-                //Attr attr = doc.createAttributeNS(XMLNS_URI, prefix);
-                //attr.setPrefix(XMLNS);
-                //
-                // Xerces throws
-                //org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or
-                // change an object in a way which is incorrect with regard to namespaces.
-                //
-                // Instead pass in the concatenated prefix. (This is covered by
-                // the UiElementNodeTest#testCreateNameSpace() test.)
-                Attr attr = doc.createAttributeNS(XMLNS_URI, XMLNS_PREFIX + prefix);
-                attr.setValue(nsUri);
-                node.getAttributes().setNamedItemNS(attr);
-            }
-        }
-
-        return prefix;
-    }
-
-    /**
-     * Converts the given attribute value to an XML-attribute-safe value, meaning that
-     * single and double quotes are replaced with their corresponding XML entities.
-     *
-     * @param attrValue the value to be escaped
-     * @return the escaped value
-     */
-    @NonNull
-    public static String toXmlAttributeValue(@NonNull String attrValue) {
-        for (int i = 0, n = attrValue.length(); i < n; i++) {
-            char c = attrValue.charAt(i);
-            if (c == '"' || c == '\'' || c == '<' || c == '&') {
-                StringBuilder sb = new StringBuilder(2 * attrValue.length());
-                appendXmlAttributeValue(sb, attrValue);
-                return sb.toString();
-            }
-        }
-
-        return attrValue;
-    }
-
-    /**
-     * Converts the given attribute value to an XML-text-safe value, meaning that
-     * less than and ampersand characters are escaped.
-     *
-     * @param textValue the text value to be escaped
-     * @return the escaped value
-     */
-    @NonNull
-    public static String toXmlTextValue(@NonNull String textValue) {
-        for (int i = 0, n = textValue.length(); i < n; i++) {
-            char c = textValue.charAt(i);
-            if (c == '<' || c == '&') {
-                StringBuilder sb = new StringBuilder(2 * textValue.length());
-                appendXmlTextValue(sb, textValue);
-                return sb.toString();
-            }
-        }
-
-        return textValue;
-    }
-
-    /**
-     * Appends text to the given {@link StringBuilder} and escapes it as required for a
-     * DOM attribute node.
-     *
-     * @param sb the string builder
-     * @param attrValue the attribute value to be appended and escaped
-     */
-    public static void appendXmlAttributeValue(@NonNull StringBuilder sb,
-            @NonNull String attrValue) {
-        int n = attrValue.length();
-        // &, ", ' and < are illegal in attributes; see http://www.w3.org/TR/REC-xml/#NT-AttValue
-        // (' legal in a " string and " is legal in a ' string but here we'll stay on the safe
-        // side)
-        for (int i = 0; i < n; i++) {
-            char c = attrValue.charAt(i);
-            if (c == '"') {
-                sb.append(QUOT_ENTITY);
-            } else if (c == '<') {
-                sb.append(LT_ENTITY);
-            } else if (c == '\'') {
-                sb.append(APOS_ENTITY);
-            } else if (c == '&') {
-                sb.append(AMP_ENTITY);
-            } else {
-                sb.append(c);
-            }
-        }
-    }
-
-    /**
-     * Appends text to the given {@link StringBuilder} and escapes it as required for a
-     * DOM text node.
-     *
-     * @param sb the string builder
-     * @param textValue the text value to be appended and escaped
-     */
-    public static void appendXmlTextValue(@NonNull StringBuilder sb, @NonNull String textValue) {
-        for (int i = 0, n = textValue.length(); i < n; i++) {
-            char c = textValue.charAt(i);
-            if (c == '<') {
-                sb.append(LT_ENTITY);
-            } else if (c == '&') {
-                sb.append(AMP_ENTITY);
-            } else {
-                sb.append(c);
-            }
-        }
-    }
-
-    /**
-     * Dump an XML tree to string. This isn't going to do a beautiful job pretty
-     * printing the XML; it's intended mostly for non-user editable files and
-     * for debugging. If true, preserve whitespace exactly as in the DOM
-     * document (typically used for a DOM which is already formatted), otherwise
-     * this method will insert some newlines here and there (for example, one
-     * per element and one per attribute.)
-     *
-     * @param node the node (which can be a document, an element, a text node,
-     *            etc.
-     * @param preserveWhitespace whether to preserve the whitespace (text nodes)
-     *            in the DOM
-     * @return a string version of the file
-     */
-    public static String toXml(Node node, boolean preserveWhitespace) {
-        StringBuilder sb = new StringBuilder(1000);
-
-        append(sb, node, 0, preserveWhitespace);
-
-        return sb.toString();
-    }
-
-    private static void indent(StringBuilder sb, int indent) {
-        for (int i = 0; i < indent; i++) {
-            sb.append("    ");
-        }
-    }
-
-    private static void append(
-            @NonNull StringBuilder sb,
-            @NonNull Node node,
-            int indent,
-            boolean preserveWhitespace) {
-        short nodeType = node.getNodeType();
-        switch (nodeType) {
-            case Node.DOCUMENT_NODE:
-            case Node.DOCUMENT_FRAGMENT_NODE: {
-                sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); //$NON-NLS-1$
-                NodeList children = node.getChildNodes();
-                for (int i = 0, n = children.getLength(); i < n; i++) {
-                    append(sb, children.item(i), indent, preserveWhitespace);
-                }
-                break;
-            }
-            case Node.COMMENT_NODE:
-            case Node.TEXT_NODE: {
-                if (nodeType == Node.COMMENT_NODE) {
-                    if (!preserveWhitespace) {
-                        indent(sb, indent);
-                    }
-                    sb.append("<!--"); //$NON-NLS-1$
-                    if (!preserveWhitespace) {
-                        sb.append('\n');
-                    }
-                }
-                String text = node.getNodeValue();
-                if (!preserveWhitespace) {
-                    text = text.trim();
-                    for (String line : Splitter.on('\n').split(text)) {
-                        indent(sb, indent + 1);
-                        sb.append(toXmlTextValue(line));
-                        sb.append('\n');
-                    }
-                } else {
-                    sb.append(toXmlTextValue(text));
-                }
-                if (nodeType == Node.COMMENT_NODE) {
-                    if (!preserveWhitespace) {
-                        indent(sb, indent);
-                    }
-                    sb.append("-->"); //$NON-NLS-1$
-                    if (!preserveWhitespace) {
-                        sb.append('\n');
-                    }
-                }
-                break;
-            }
-            case Node.ELEMENT_NODE: {
-                if (!preserveWhitespace) {
-                    indent(sb, indent);
-                }
-                sb.append('<');
-                Element element = (Element) node;
-                sb.append(element.getTagName());
-
-                NamedNodeMap attributes = element.getAttributes();
-                NodeList children = element.getChildNodes();
-                int childCount = children.getLength();
-                int attributeCount = attributes.getLength();
-
-                if (attributeCount > 0) {
-                    for (int i = 0; i < attributeCount; i++) {
-                        Node attribute = attributes.item(i);
-                        sb.append(' ');
-                        sb.append(attribute.getNodeName());
-                        sb.append('=').append('"');
-                        sb.append(toXmlAttributeValue(attribute.getNodeValue()));
-                        sb.append('"');
-                    }
-                }
-
-                if (childCount == 0) {
-                    sb.append('/');
-                }
-                sb.append('>');
-                if (!preserveWhitespace) {
-                    sb.append('\n');
-                }
-                if (childCount > 0) {
-                    for (int i = 0; i < childCount; i++) {
-                        Node child = children.item(i);
-                        append(sb, child, indent + 1, preserveWhitespace);
-                    }
-                    if (!preserveWhitespace) {
-                        if (sb.charAt(sb.length() - 1) != '\n') {
-                            sb.append('\n');
-                        }
-                        indent(sb, indent);
-                    }
-                    sb.append('<').append('/');
-                    sb.append(element.getTagName());
-                    sb.append('>');
-                    if (!preserveWhitespace) {
-                        sb.append('\n');
-                    }
-                }
-                break;
-            }
-
-            default:
-                throw new UnsupportedOperationException(
-                        "Unsupported node type " + nodeType + ": not yet implemented");
-        }
-    }
-}
\ No newline at end of file
diff --git a/common/src/main/java/com/android/xml/AndroidManifest.java b/common/src/main/java/com/android/xml/AndroidManifest.java
deleted file mode 100644
index 306471e..0000000
--- a/common/src/main/java/com/android/xml/AndroidManifest.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed 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 com.android.xml;
-
-import com.android.SdkConstants;
-import com.android.io.IAbstractFile;
-import com.android.io.IAbstractFolder;
-import com.android.io.StreamException;
-
-import org.w3c.dom.Node;
-import org.xml.sax.InputSource;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-
-/**
- * Helper and Constants for the AndroidManifest.xml file.
- *
- */
-public final class AndroidManifest {
-
-    public static final String NODE_MANIFEST = "manifest";
-    public static final String NODE_APPLICATION = "application";
-    public static final String NODE_ACTIVITY = "activity";
-    public static final String NODE_ACTIVITY_ALIAS = "activity-alias";
-    public static final String NODE_SERVICE = "service";
-    public static final String NODE_RECEIVER = "receiver";
-    public static final String NODE_PROVIDER = "provider";
-    public static final String NODE_INTENT = "intent-filter";
-    public static final String NODE_ACTION = "action";
-    public static final String NODE_CATEGORY = "category";
-    public static final String NODE_USES_SDK = "uses-sdk";
-    public static final String NODE_INSTRUMENTATION = "instrumentation";
-    public static final String NODE_USES_LIBRARY = "uses-library";
-    public static final String NODE_SUPPORTS_SCREENS = "supports-screens";
-    public static final String NODE_USES_CONFIGURATION = "uses-configuration";
-    public static final String NODE_USES_FEATURE = "uses-feature";
-
-    public static final String ATTRIBUTE_PACKAGE = "package";
-    public static final String ATTRIBUTE_VERSIONCODE = "versionCode";
-    public static final String ATTRIBUTE_NAME = "name";
-    public static final String ATTRIBUTE_REQUIRED = "required";
-    public static final String ATTRIBUTE_GLESVERSION = "glEsVersion";
-    public static final String ATTRIBUTE_PROCESS = "process";
-    public static final String ATTRIBUTE_DEBUGGABLE = "debuggable";
-    public static final String ATTRIBUTE_LABEL = "label";
-    public static final String ATTRIBUTE_ICON = "icon";
-    public static final String ATTRIBUTE_MIN_SDK_VERSION = "minSdkVersion";
-    public static final String ATTRIBUTE_TARGET_SDK_VERSION = "targetSdkVersion";
-    public static final String ATTRIBUTE_TARGET_PACKAGE = "targetPackage";
-    public static final String ATTRIBUTE_TARGET_ACTIVITY = "targetActivity";
-    public static final String ATTRIBUTE_MANAGE_SPACE_ACTIVITY = "manageSpaceActivity";
-    public static final String ATTRIBUTE_EXPORTED = "exported";
-    public static final String ATTRIBUTE_RESIZEABLE = "resizeable";
-    public static final String ATTRIBUTE_ANYDENSITY = "anyDensity";
-    public static final String ATTRIBUTE_SMALLSCREENS = "smallScreens";
-    public static final String ATTRIBUTE_NORMALSCREENS = "normalScreens";
-    public static final String ATTRIBUTE_LARGESCREENS = "largeScreens";
-    public static final String ATTRIBUTE_REQ_5WAYNAV = "reqFiveWayNav";
-    public static final String ATTRIBUTE_REQ_NAVIGATION = "reqNavigation";
-    public static final String ATTRIBUTE_REQ_HARDKEYBOARD = "reqHardKeyboard";
-    public static final String ATTRIBUTE_REQ_KEYBOARDTYPE = "reqKeyboardType";
-    public static final String ATTRIBUTE_REQ_TOUCHSCREEN = "reqTouchScreen";
-    public static final String ATTRIBUTE_THEME = "theme";
-    public static final String ATTRIBUTE_BACKUP_AGENT = "backupAgent";
-    public static final String ATTRIBUTE_PARENT_ACTIVITY_NAME = "parentActivityName";
-
-    /**
-     * Returns an {@link IAbstractFile} object representing the manifest for the given project.
-     *
-     * @param projectFolder The project containing the manifest file.
-     * @return An IAbstractFile object pointing to the manifest or null if the manifest
-     *         is missing.
-     */
-    public static IAbstractFile getManifest(IAbstractFolder projectFolder) {
-        IAbstractFile file = projectFolder.getFile(SdkConstants.FN_ANDROID_MANIFEST_XML);
-        if (file.exists()) {
-            return file;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the package for a given project.
-     * @param projectFolder the folder of the project.
-     * @return the package info or null (or empty) if not found.
-     * @throws XPathExpressionException
-     * @throws StreamException If any error happens when reading the manifest.
-     */
-    public static String getPackage(IAbstractFolder projectFolder)
-            throws XPathExpressionException, StreamException {
-        IAbstractFile file = getManifest(projectFolder);
-        if (file != null) {
-            return getPackage(file);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the package for a given manifest.
-     * @param manifestFile the manifest to parse.
-     * @return the package info or null (or empty) if not found.
-     * @throws XPathExpressionException
-     * @throws StreamException If any error happens when reading the manifest.
-     */
-    public static String getPackage(IAbstractFile manifestFile)
-            throws XPathExpressionException, StreamException {
-        XPath xPath = AndroidXPathFactory.newXPath();
-
-        return xPath.evaluate(
-                "/"  + NODE_MANIFEST +
-                "/@" + ATTRIBUTE_PACKAGE,
-                new InputSource(manifestFile.getContents()));
-    }
-
-    /**
-     * Returns whether the manifest is set to make the application debuggable.
-     *
-     * If the give manifest does not contain the debuggable attribute then the application
-     * is considered to not be debuggable.
-     *
-     * @param manifestFile the manifest to parse.
-     * @return true if the application is debuggable.
-     * @throws XPathExpressionException
-     * @throws StreamException If any error happens when reading the manifest.
-     */
-    public static boolean getDebuggable(IAbstractFile manifestFile)
-            throws XPathExpressionException, StreamException {
-        XPath xPath = AndroidXPathFactory.newXPath();
-
-        String value = xPath.evaluate(
-                "/"  + NODE_MANIFEST +
-                "/"  + NODE_APPLICATION +
-                "/@" + AndroidXPathFactory.DEFAULT_NS_PREFIX +
-                ":"  + ATTRIBUTE_DEBUGGABLE,
-                new InputSource(manifestFile.getContents()));
-
-        // default is not debuggable, which is the same behavior as parseBoolean
-        return Boolean.parseBoolean(value);
-    }
-
-    /**
-     * Returns the value of the versionCode attribute or -1 if the value is not set.
-     * @param manifestFile the manifest file to read the attribute from.
-     * @return the integer value or -1 if not set.
-     * @throws XPathExpressionException
-     * @throws StreamException If any error happens when reading the manifest.
-     */
-    public static int getVersionCode(IAbstractFile manifestFile)
-            throws XPathExpressionException, StreamException {
-        XPath xPath = AndroidXPathFactory.newXPath();
-
-        String result = xPath.evaluate(
-                "/"  + NODE_MANIFEST +
-                "/@" + AndroidXPathFactory.DEFAULT_NS_PREFIX +
-                ":"  + ATTRIBUTE_VERSIONCODE,
-                new InputSource(manifestFile.getContents()));
-
-        try {
-            return Integer.parseInt(result);
-        } catch (NumberFormatException e) {
-            return -1;
-        }
-    }
-
-    /**
-     * Returns whether the version Code attribute is set in a given manifest.
-     * @param manifestFile the manifest to check
-     * @return true if the versionCode attribute is present and its value is not empty.
-     * @throws XPathExpressionException
-     * @throws StreamException If any error happens when reading the manifest.
-     */
-    public static boolean hasVersionCode(IAbstractFile manifestFile)
-            throws XPathExpressionException, StreamException {
-        XPath xPath = AndroidXPathFactory.newXPath();
-
-        Object result = xPath.evaluate(
-                "/"  + NODE_MANIFEST +
-                "/@" + AndroidXPathFactory.DEFAULT_NS_PREFIX +
-                ":"  + ATTRIBUTE_VERSIONCODE,
-                new InputSource(manifestFile.getContents()),
-                XPathConstants.NODE);
-
-        if (result != null) {
-            Node node  = (Node)result;
-            if (node.getNodeValue().length() > 0) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the value of the minSdkVersion attribute.
-     * <p/>
-     * If the attribute is set with an int value, the method returns an Integer object.
-     * <p/>
-     * If the attribute is set with a codename, it returns the codename as a String object.
-     * <p/>
-     * If the attribute is not set, it returns null.
-     *
-     * @param manifestFile the manifest file to read the attribute from.
-     * @return the attribute value.
-     * @throws XPathExpressionException
-     * @throws StreamException If any error happens when reading the manifest.
-     */
-    public static Object getMinSdkVersion(IAbstractFile manifestFile)
-            throws XPathExpressionException, StreamException {
-        XPath xPath = AndroidXPathFactory.newXPath();
-
-        String result = xPath.evaluate(
-                "/"  + NODE_MANIFEST +
-                "/"  + NODE_USES_SDK +
-                "/@" + AndroidXPathFactory.DEFAULT_NS_PREFIX +
-                ":"  + ATTRIBUTE_MIN_SDK_VERSION,
-                new InputSource(manifestFile.getContents()));
-
-        try {
-            return Integer.valueOf(result);
-        } catch (NumberFormatException e) {
-            return result.length() > 0 ? result : null;
-        }
-    }
-
-    /**
-     * Returns the value of the targetSdkVersion attribute (defaults to 1 if the attribute is
-     * not set), or -1 if the value is a codename.
-     * @param manifestFile the manifest file to read the attribute from.
-     * @return the integer value or -1 if not set.
-     * @throws XPathExpressionException
-     * @throws StreamException If any error happens when reading the manifest.
-     */
-    public static Integer getTargetSdkVersion(IAbstractFile manifestFile)
-            throws XPathExpressionException, StreamException {
-        XPath xPath = AndroidXPathFactory.newXPath();
-
-        String result = xPath.evaluate(
-                "/"  + NODE_MANIFEST +
-                "/"  + NODE_USES_SDK +
-                "/@" + AndroidXPathFactory.DEFAULT_NS_PREFIX +
-                ":"  + ATTRIBUTE_TARGET_SDK_VERSION,
-                new InputSource(manifestFile.getContents()));
-
-        try {
-            return Integer.valueOf(result);
-        } catch (NumberFormatException e) {
-            return result.length() > 0 ? -1 : null;
-        }
-    }
-
-    /**
-     * Returns the application icon  for a given manifest.
-     * @param manifestFile the manifest to parse.
-     * @return the icon or null (or empty) if not found.
-     * @throws XPathExpressionException
-     * @throws StreamException If any error happens when reading the manifest.
-     */
-    public static String getApplicationIcon(IAbstractFile manifestFile)
-            throws XPathExpressionException, StreamException {
-        XPath xPath = AndroidXPathFactory.newXPath();
-
-        return xPath.evaluate(
-                "/"  + NODE_MANIFEST +
-                "/"  + NODE_APPLICATION +
-                "/@" + AndroidXPathFactory.DEFAULT_NS_PREFIX +
-                ":"  + ATTRIBUTE_ICON,
-                new InputSource(manifestFile.getContents()));
-    }
-
-    /**
-     * Returns the application label  for a given manifest.
-     * @param manifestFile the manifest to parse.
-     * @return the label or null (or empty) if not found.
-     * @throws XPathExpressionException
-     * @throws StreamException If any error happens when reading the manifest.
-     */
-    public static String getApplicationLabel(IAbstractFile manifestFile)
-            throws XPathExpressionException, StreamException {
-        XPath xPath = AndroidXPathFactory.newXPath();
-
-        return xPath.evaluate(
-                "/"  + NODE_MANIFEST +
-                "/"  + NODE_APPLICATION +
-                "/@" + AndroidXPathFactory.DEFAULT_NS_PREFIX +
-                ":"  + ATTRIBUTE_LABEL,
-                new InputSource(manifestFile.getContents()));
-    }
-
-    /**
-     * Combines a java package, with a class value from the manifest to make a fully qualified
-     * class name
-     * @param javaPackage the java package from the manifest.
-     * @param className the class name from the manifest.
-     * @return the fully qualified class name.
-     */
-    public static String combinePackageAndClassName(String javaPackage, String className) {
-        if (className == null || className.length() == 0) {
-            return javaPackage;
-        }
-        if (javaPackage == null || javaPackage.length() == 0) {
-            return className;
-        }
-
-        // the class name can be a subpackage (starts with a '.'
-        // char), a simple class name (no dot), or a full java package
-        boolean startWithDot = (className.charAt(0) == '.');
-        boolean hasDot = (className.indexOf('.') != -1);
-        if (startWithDot || hasDot == false) {
-
-            // add the concatenation of the package and class name
-            if (startWithDot) {
-                return javaPackage + className;
-            } else {
-                return javaPackage + '.' + className;
-            }
-        } else {
-            // just add the class as it should be a fully qualified java name.
-            return className;
-        }
-    }
-
-    /**
-     * Given a fully qualified activity name (e.g. com.foo.test.MyClass) and given a project
-     * package base name (e.g. com.foo), returns the relative activity name that would be used
-     * the "name" attribute of an "activity" element.
-     *
-     * @param fullActivityName a fully qualified activity class name, e.g. "com.foo.test.MyClass"
-     * @param packageName The project base package name, e.g. "com.foo"
-     * @return The relative activity name if it can be computed or the original fullActivityName.
-     */
-    public static String extractActivityName(String fullActivityName, String packageName) {
-        if (packageName != null && fullActivityName != null) {
-            if (packageName.length() > 0 && fullActivityName.startsWith(packageName)) {
-                String name = fullActivityName.substring(packageName.length());
-                if (name.length() > 0 && name.charAt(0) == '.') {
-                    return name;
-                }
-            }
-        }
-
-        return fullActivityName;
-    }
-}
diff --git a/common/src/main/java/com/android/xml/AndroidXPathFactory.java b/common/src/main/java/com/android/xml/AndroidXPathFactory.java
deleted file mode 100644
index ee5b87b..0000000
--- a/common/src/main/java/com/android/xml/AndroidXPathFactory.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed 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 com.android.xml;
-
-import com.android.SdkConstants;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.xml.XMLConstants;
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathFactory;
-
-/**
- * XPath factory with automatic support for the android name space.
- */
-public class AndroidXPathFactory {
-    /** Default prefix for android name space: 'android' */
-    public final static String DEFAULT_NS_PREFIX = "android"; //$NON-NLS-1$
-
-    private final static XPathFactory sFactory = XPathFactory.newInstance();
-
-    /** Name space context for Android resource XML files. */
-    private static class AndroidNamespaceContext implements NamespaceContext {
-        private final static AndroidNamespaceContext sThis = new AndroidNamespaceContext(
-                DEFAULT_NS_PREFIX);
-
-        private final String mAndroidPrefix;
-        private final List<String> mAndroidPrefixes;
-
-        /**
-         * Returns the default {@link AndroidNamespaceContext}.
-         */
-        private static AndroidNamespaceContext getDefault() {
-            return sThis;
-        }
-
-        /**
-         * Construct the context with the prefix associated with the android namespace.
-         * @param androidPrefix the Prefix
-         */
-        public AndroidNamespaceContext(String androidPrefix) {
-            mAndroidPrefix = androidPrefix;
-            mAndroidPrefixes = Collections.singletonList(mAndroidPrefix);
-        }
-
-        @Override
-        public String getNamespaceURI(String prefix) {
-            if (prefix != null) {
-                if (prefix.equals(mAndroidPrefix)) {
-                    return SdkConstants.NS_RESOURCES;
-                }
-            }
-
-            return XMLConstants.NULL_NS_URI;
-        }
-
-        @Override
-        public String getPrefix(String namespaceURI) {
-            if (SdkConstants.NS_RESOURCES.equals(namespaceURI)) {
-                return mAndroidPrefix;
-            }
-
-            return null;
-        }
-
-        @Override
-        public Iterator<?> getPrefixes(String namespaceURI) {
-            if (SdkConstants.NS_RESOURCES.equals(namespaceURI)) {
-                return mAndroidPrefixes.iterator();
-            }
-
-            return null;
-        }
-    }
-
-    /**
-     * Creates a new XPath object, specifying which prefix in the query is used for the
-     * android namespace.
-     * @param androidPrefix The namespace prefix.
-     */
-    public static XPath newXPath(String androidPrefix) {
-        XPath xpath = sFactory.newXPath();
-        xpath.setNamespaceContext(new AndroidNamespaceContext(androidPrefix));
-        return xpath;
-    }
-
-    /**
-     * Creates a new XPath object using the default prefix for the android namespace.
-     * @see #DEFAULT_NS_PREFIX
-     */
-    public static XPath newXPath() {
-        XPath xpath = sFactory.newXPath();
-        xpath.setNamespaceContext(AndroidNamespaceContext.getDefault());
-        return xpath;
-    }
-}
diff --git a/common/src/test/.classpath b/common/src/test/.classpath
deleted file mode 100644
index 7564f2f..0000000
--- a/common/src/test/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/common"/>
-        <classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/guava-tools/guava-13.0.1.jar" sourcepath="/ANDROID_SRC/prebuilts/tools/common/guava-tools/src.zip"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/common/src/test/.project b/common/src/test/.project
deleted file mode 100644
index 9f550a3..0000000
--- a/common/src/test/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>common-tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/common/src/test/.settings/org.moreunit.prefs b/common/src/test/.settings/org.moreunit.prefs
deleted file mode 100644
index 5c0456e..0000000
--- a/common/src/test/.settings/org.moreunit.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-eclipse.preferences.version=1
-org.moreunit.prefixes=
-org.moreunit.unitsourcefolder=common-tests\:java\:common\:src/main/java
-org.moreunit.useprojectsettings=true
diff --git a/common/src/test/java/com/android/utils/PositionXmlParserTest.java b/common/src/test/java/com/android/utils/PositionXmlParserTest.java
deleted file mode 100644
index 18eda43..0000000
--- a/common/src/test/java/com/android/utils/PositionXmlParserTest.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.utils;
-
-import com.android.utils.PositionXmlParser.Position;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-import java.io.BufferedOutputStream;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class PositionXmlParserTest extends TestCase {
-    public void test() throws Exception {
-        String xml =
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    android:layout_width=\"match_parent\"\n" +
-                "    android:layout_height=\"wrap_content\"\n" +
-                "    android:orientation=\"vertical\" >\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button1\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:text=\"Button\" />\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button2\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:text=\"Button\" />\n" +
-                "\n" +
-                "</LinearLayout>\n";
-        PositionXmlParser parser = new PositionXmlParser();
-        File file = File.createTempFile("parsertest", ".xml");
-        Writer fw = new BufferedWriter(new FileWriter(file));
-        fw.write(xml);
-        fw.close();
-        Document document = parser.parse(new FileInputStream(file));
-        assertNotNull(document);
-
-        // Basic parsing heart beat tests
-        Element linearLayout = (Element) document.getElementsByTagName("LinearLayout").item(0);
-        assertNotNull(linearLayout);
-        NodeList buttons = document.getElementsByTagName("Button");
-        assertEquals(2, buttons.getLength());
-        final String ANDROID_URI = "http://schemas.android.com/apk/res/android";
-        assertEquals("wrap_content",
-                linearLayout.getAttributeNS(ANDROID_URI, "layout_height"));
-
-        // Check attribute positions
-        Attr attr = linearLayout.getAttributeNodeNS(ANDROID_URI, "layout_width");
-        assertNotNull(attr);
-        Position start = parser.getPosition(attr);
-        Position end = start.getEnd();
-        assertEquals(2, start.getLine());
-        assertEquals(4, start.getColumn());
-        assertEquals(xml.indexOf("android:layout_width"), start.getOffset());
-        assertEquals(2, end.getLine());
-        String target = "android:layout_width=\"match_parent\"";
-        assertEquals(xml.indexOf(target) + target.length(), end.getOffset());
-
-        // Check element positions
-        Element button = (Element) buttons.item(0);
-        start = parser.getPosition(button);
-        end = start.getEnd();
-        assertNull(end.getEnd());
-        assertEquals(6, start.getLine());
-        assertEquals(4, start.getColumn());
-        assertEquals(xml.indexOf("<Button"), start.getOffset());
-        assertEquals(xml.indexOf("/>") + 2, end.getOffset());
-        assertEquals(10, end.getLine());
-        int button1End = end.getOffset();
-
-        Element button2 = (Element) buttons.item(1);
-        start = parser.getPosition(button2);
-        end = start.getEnd();
-        assertEquals(12, start.getLine());
-        assertEquals(4, start.getColumn());
-        assertEquals(xml.indexOf("<Button", button1End), start.getOffset());
-        assertEquals(xml.indexOf("/>", start.getOffset()) + 2, end.getOffset());
-        assertEquals(16, end.getLine());
-
-        file.delete();
-    }
-
-    public void testText() throws Exception {
-        String xml =
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    android:layout_width=\"match_parent\"\n" +
-                "    android:layout_height=\"wrap_content\"\n" +
-                "    android:orientation=\"vertical\" >\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button1\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:text=\"Button\" />\n" +
-                "          some text\n" +
-                "\n" +
-                "</LinearLayout>\n";
-        PositionXmlParser parser = new PositionXmlParser();
-        File file = File.createTempFile("parsertest", ".xml");
-        file.deleteOnExit();
-        Writer fw = new BufferedWriter(new FileWriter(file));
-        fw.write(xml);
-        fw.close();
-        Document document = parser.parse(new FileInputStream(file));
-        assertNotNull(document);
-
-        // Basic parsing heart beat tests
-        Element linearLayout = (Element) document.getElementsByTagName("LinearLayout").item(0);
-        assertNotNull(linearLayout);
-        NodeList buttons = document.getElementsByTagName("Button");
-        assertEquals(1, buttons.getLength());
-        final String ANDROID_URI = "http://schemas.android.com/apk/res/android";
-        assertEquals("wrap_content",
-                linearLayout.getAttributeNS(ANDROID_URI, "layout_height"));
-
-        // Check text positions
-        Element button = (Element) buttons.item(0);
-        Text text = (Text) button.getNextSibling();
-        assertNotNull(text);
-
-        // Check attribute positions
-        Position start = parser.getPosition(text);
-        assertEquals(11, start.getLine());
-        assertEquals(10, start.getColumn());
-        assertEquals(xml.indexOf("some text"), start.getOffset());
-
-        // Check attribute positions with text node offsets
-        start = parser.getPosition(text, 13, 15);
-        assertEquals(11, start.getLine());
-        assertEquals(12, start.getColumn());
-        assertEquals(xml.indexOf("me"), start.getOffset());
-    }
-
-    public void testLineEndings() throws Exception {
-        // Test for http://code.google.com/p/android/issues/detail?id=22925
-        String xml =
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" +
-                "<LinearLayout>\r\n" +
-                "\r" +
-                "<LinearLayout></LinearLayout>\r\n" +
-                "</LinearLayout>\r\n";
-        PositionXmlParser parser = new PositionXmlParser();
-        File file = File.createTempFile("parsertest2", ".xml");
-        Writer fw = new BufferedWriter(new FileWriter(file));
-        fw.write(xml);
-        fw.close();
-        Document document = parser.parse(new FileInputStream(file));
-        assertNotNull(document);
-
-        file.delete();
-    }
-
-    private static void checkEncoding(String encoding, boolean writeBom, boolean writeEncoding,
-            String lineEnding)
-            throws Exception {
-        // Norwegian extra vowel characters such as "latin small letter a with ring above"
-        String value = "\u00e6\u00d8\u00e5";
-        StringBuilder sb = new StringBuilder();
-
-        sb.append("<?xml version=\"1.0\"");
-        if (writeEncoding) {
-            sb.append(" encoding=\"");
-            sb.append(encoding);
-            sb.append("\"");
-        }
-        sb.append("?>");
-        sb.append(lineEnding);
-        sb.append(
-                "<!-- This is a " + lineEnding +
-                "     multiline comment" + lineEnding +
-                "-->" + lineEnding +
-                "<foo ");
-        int startAttrOffset = sb.length();
-        sb.append("attr=\"");
-        sb.append(value);
-        sb.append("\"");
-        sb.append(">" + lineEnding +
-                lineEnding +
-                "<bar></bar>" + lineEnding +
-                "</foo>" + lineEnding);
-        PositionXmlParser parser = new PositionXmlParser();
-        File file = File.createTempFile("parsertest" + encoding + writeBom + writeEncoding,
-                ".xml");
-        BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(file));
-        OutputStreamWriter writer = new OutputStreamWriter(stream, encoding);
-
-        if (writeBom) {
-            String normalized = encoding.toLowerCase().replace("-", "_");
-            if (normalized.equals("utf_8")) {
-                stream.write(0xef);
-                stream.write(0xbb);
-                stream.write(0xbf);
-            } else if (normalized.equals("utf_16")) {
-                stream.write(0xfe);
-                stream.write(0xff);
-            } else if (normalized.equals("utf_16le")) {
-                stream.write(0xff);
-                stream.write(0xfe);
-            } else if (normalized.equals("utf_32")) {
-                stream.write(0x0);
-                stream.write(0x0);
-                stream.write(0xfe);
-                stream.write(0xff);
-            } else if (normalized.equals("utf_32le")) {
-                stream.write(0xff);
-                stream.write(0xfe);
-                stream.write(0x0);
-                stream.write(0x0);
-            } else {
-                fail("Can't write BOM for encoding " + encoding);
-            }
-        }
-
-        writer.write(sb.toString());
-        writer.close();
-
-        Document document = parser.parse(new FileInputStream(file));
-        assertNotNull(document);
-        Element root = document.getDocumentElement();
-        assertEquals(file.getPath(), value, root.getAttribute("attr"));
-        assertEquals(4, parser.getPosition(root).getLine());
-
-        Attr attribute = root.getAttributeNode("attr");
-        assertNotNull(attribute);
-        Position position = parser.getPosition(attribute);
-        assertNotNull(position);
-        assertEquals(4, position.getLine());
-        assertEquals(startAttrOffset, position.getOffset());
-
-        file.delete();
-    }
-
-    public void testEncoding() throws Exception {
-        checkEncoding("utf-8", false /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("UTF-8", false /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("UTF_16", false /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("UTF-16", false /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("UTF_16LE", false /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("UTF_32", false /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("UTF_32LE", false /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("windows-1252", false /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("MacRoman", false /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("ISO-8859-1", false /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("iso-8859-1", false /*bom*/, true /*encoding*/, "\n");
-
-        // Try BOM's (with no encoding specified)
-        checkEncoding("utf-8", true /*bom*/, false /*encoding*/, "\n");
-        checkEncoding("UTF-8", true /*bom*/, false /*encoding*/, "\n");
-        checkEncoding("UTF_16", true /*bom*/, false /*encoding*/, "\n");
-        checkEncoding("UTF-16", true /*bom*/, false /*encoding*/, "\n");
-        checkEncoding("UTF_16LE", true /*bom*/, false /*encoding*/, "\n");
-        checkEncoding("UTF_32", true /*bom*/, false /*encoding*/, "\n");
-        checkEncoding("UTF_32LE", true /*bom*/, false /*encoding*/, "\n");
-
-        // Try default encodings (only defined for utf-8 and utf-16)
-        checkEncoding("utf-8", false /*bom*/, false /*encoding*/, "\n");
-        checkEncoding("UTF-8", false /*bom*/, false /*encoding*/, "\n");
-        checkEncoding("UTF_16", false /*bom*/, false /*encoding*/, "\n");
-        checkEncoding("UTF-16", false /*bom*/, false /*encoding*/, "\n");
-        checkEncoding("UTF_16LE", false /*bom*/, false /*encoding*/, "\n");
-
-        // Try BOM's (with explicit encoding specified)
-        checkEncoding("utf-8", true /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("UTF-8", true /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("UTF_16", true /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("UTF-16", true /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("UTF_16LE", true /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("UTF_32", true /*bom*/, true /*encoding*/, "\n");
-        checkEncoding("UTF_32LE", true /*bom*/, true /*encoding*/, "\n");
-
-        // Make sure this works for \r and \r\n as well
-        checkEncoding("UTF-16", false /*bom*/, true /*encoding*/, "\r");
-        checkEncoding("UTF_16LE", false /*bom*/, true /*encoding*/, "\r");
-        checkEncoding("UTF_32", false /*bom*/, true /*encoding*/, "\r");
-        checkEncoding("UTF_32LE", false /*bom*/, true /*encoding*/, "\r");
-        checkEncoding("windows-1252", false /*bom*/, true /*encoding*/, "\r");
-        checkEncoding("MacRoman", false /*bom*/, true /*encoding*/, "\r");
-        checkEncoding("ISO-8859-1", false /*bom*/, true /*encoding*/, "\r");
-        checkEncoding("iso-8859-1", false /*bom*/, true /*encoding*/, "\r");
-
-        checkEncoding("UTF-16", false /*bom*/, true /*encoding*/, "\r\n");
-        checkEncoding("UTF_16LE", false /*bom*/, true /*encoding*/, "\r\n");
-        checkEncoding("UTF_32", false /*bom*/, true /*encoding*/, "\r\n");
-        checkEncoding("UTF_32LE", false /*bom*/, true /*encoding*/, "\r\n");
-        checkEncoding("windows-1252", false /*bom*/, true /*encoding*/, "\r\n");
-        checkEncoding("MacRoman", false /*bom*/, true /*encoding*/, "\r\n");
-        checkEncoding("ISO-8859-1", false /*bom*/, true /*encoding*/, "\r\n");
-        checkEncoding("iso-8859-1", false /*bom*/, true /*encoding*/, "\r\n");
-    }
-}
diff --git a/common/src/test/java/com/android/utils/SdkUtilsTest.java b/common/src/test/java/com/android/utils/SdkUtilsTest.java
deleted file mode 100644
index 030e1b7..0000000
--- a/common/src/test/java/com/android/utils/SdkUtilsTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.utils;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class SdkUtilsTest extends TestCase {
-    public void testEndsWithIgnoreCase() {
-        assertTrue(SdkUtils.endsWithIgnoreCase("foo", "foo"));
-        assertTrue(SdkUtils.endsWithIgnoreCase("foo", "Foo"));
-        assertTrue(SdkUtils.endsWithIgnoreCase("foo", "foo"));
-        assertTrue(SdkUtils.endsWithIgnoreCase("Barfoo", "foo"));
-        assertTrue(SdkUtils.endsWithIgnoreCase("BarFoo", "foo"));
-        assertTrue(SdkUtils.endsWithIgnoreCase("BarFoo", "foO"));
-
-        assertFalse(SdkUtils.endsWithIgnoreCase("foob", "foo"));
-        assertFalse(SdkUtils.endsWithIgnoreCase("foo", "fo"));
-    }
-
-    public void testStartsWithIgnoreCase() {
-        assertTrue(SdkUtils.startsWithIgnoreCase("foo", "foo"));
-        assertTrue(SdkUtils.startsWithIgnoreCase("foo", "Foo"));
-        assertTrue(SdkUtils.startsWithIgnoreCase("foo", "foo"));
-        assertTrue(SdkUtils.startsWithIgnoreCase("barfoo", "bar"));
-        assertTrue(SdkUtils.startsWithIgnoreCase("BarFoo", "bar"));
-        assertTrue(SdkUtils.startsWithIgnoreCase("BarFoo", "bAr"));
-
-        assertFalse(SdkUtils.startsWithIgnoreCase("bfoo", "foo"));
-        assertFalse(SdkUtils.startsWithIgnoreCase("fo", "foo"));
-    }
-
-    public void testStartsWith() {
-        assertTrue(SdkUtils.startsWith("foo", 0, "foo"));
-        assertTrue(SdkUtils.startsWith("foo", 0, "Foo"));
-        assertTrue(SdkUtils.startsWith("Foo", 0, "foo"));
-        assertTrue(SdkUtils.startsWith("aFoo", 1, "foo"));
-
-        assertFalse(SdkUtils.startsWith("aFoo", 0, "foo"));
-        assertFalse(SdkUtils.startsWith("aFoo", 2, "foo"));
-    }
-
-    public void testEndsWith() {
-        assertTrue(SdkUtils.endsWith("foo", "foo"));
-        assertTrue(SdkUtils.endsWith("foobar", "obar"));
-        assertTrue(SdkUtils.endsWith("foobar", "bar"));
-        assertTrue(SdkUtils.endsWith("foobar", "ar"));
-        assertTrue(SdkUtils.endsWith("foobar", "r"));
-        assertTrue(SdkUtils.endsWith("foobar", ""));
-
-        assertTrue(SdkUtils.endsWith(new StringBuilder("foobar"), "bar"));
-        assertTrue(SdkUtils.endsWith(new StringBuilder("foobar"), new StringBuffer("obar")));
-        assertTrue(SdkUtils.endsWith("foobar", new StringBuffer("obar")));
-
-        assertFalse(SdkUtils.endsWith("foo", "fo"));
-        assertFalse(SdkUtils.endsWith("foobar", "Bar"));
-        assertFalse(SdkUtils.endsWith("foobar", "longfoobar"));
-    }
-
-    public void testEndsWith2() {
-        assertTrue(SdkUtils.endsWith("foo", "foo".length(), "foo"));
-        assertTrue(SdkUtils.endsWith("foo", "fo".length(), "fo"));
-        assertTrue(SdkUtils.endsWith("foo", "f".length(), "f"));
-    }
-
-    public void testStripWhitespace() {
-        assertEquals("foo", SdkUtils.stripWhitespace("foo"));
-        assertEquals("foobar", SdkUtils.stripWhitespace("foo bar"));
-        assertEquals("foobar", SdkUtils.stripWhitespace("  foo bar  \n\t"));
-    }
-
-    public void testWrap() {
-        String s =
-            "Hardcoding text attributes directly in layout files is bad for several reasons:\n" +
-            "\n" +
-            "* When creating configuration variations (for example for landscape or portrait)" +
-            "you have to repeat the actual text (and keep it up to date when making changes)\n" +
-            "\n" +
-            "* The application cannot be translated to other languages by just adding new " +
-            "translations for existing string resources.";
-        String wrapped = SdkUtils.wrap(s, 70, "");
-        assertEquals(
-            "Hardcoding text attributes directly in layout files is bad for several\n" +
-            "reasons:\n" +
-            "\n" +
-            "* When creating configuration variations (for example for landscape or\n" +
-            "portrait)you have to repeat the actual text (and keep it up to date\n" +
-            "when making changes)\n" +
-            "\n" +
-            "* The application cannot be translated to other languages by just\n" +
-            "adding new translations for existing string resources.\n",
-            wrapped);
-    }
-
-    public void testWrapPrefix() {
-        String s =
-            "Hardcoding text attributes directly in layout files is bad for several reasons:\n" +
-            "\n" +
-            "* When creating configuration variations (for example for landscape or portrait)" +
-            "you have to repeat the actual text (and keep it up to date when making changes)\n" +
-            "\n" +
-            "* The application cannot be translated to other languages by just adding new " +
-            "translations for existing string resources.";
-        String wrapped = SdkUtils.wrap(s, 70, "    ");
-        assertEquals(
-            "Hardcoding text attributes directly in layout files is bad for several\n" +
-            "    reasons:\n" +
-            "    \n" +
-            "    * When creating configuration variations (for example for\n" +
-            "    landscape or portrait)you have to repeat the actual text (and keep\n" +
-            "    it up to date when making changes)\n" +
-            "    \n" +
-            "    * The application cannot be translated to other languages by just\n" +
-            "    adding new translations for existing string resources.\n",
-            wrapped);
-    }
-
-
-}
diff --git a/common/src/test/java/com/android/utils/XmlUtilsTest.java b/common/src/test/java/com/android/utils/XmlUtilsTest.java
deleted file mode 100644
index edf0235..0000000
--- a/common/src/test/java/com/android/utils/XmlUtilsTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.utils;
-
-import static com.android.SdkConstants.XMLNS;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class XmlUtilsTest extends TestCase {
-    public void testlookupNamespacePrefix() throws Exception {
-        // Setup
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        DocumentBuilder builder = factory.newDocumentBuilder();
-        Document document = builder.newDocument();
-        Element rootElement = document.createElement("root");
-        Attr attr = document.createAttributeNS(SdkConstants.XMLNS_URI,
-                "xmlns:customPrefix");
-        attr.setValue(SdkConstants.ANDROID_URI);
-        rootElement.getAttributes().setNamedItemNS(attr);
-        document.appendChild(rootElement);
-        Element root = document.getDocumentElement();
-        root.appendChild(document.createTextNode("    "));
-        Element foo = document.createElement("foo");
-        root.appendChild(foo);
-        root.appendChild(document.createTextNode("    "));
-        Element bar = document.createElement("bar");
-        root.appendChild(bar);
-        Element baz = document.createElement("baz");
-        root.appendChild(baz);
-
-        String prefix = XmlUtils.lookupNamespacePrefix(baz, SdkConstants.ANDROID_URI);
-        assertEquals("customPrefix", prefix);
-
-        prefix = XmlUtils.lookupNamespacePrefix(baz,
-                "http://schemas.android.com/tools", "tools", false);
-        assertEquals("tools", prefix);
-
-        prefix = XmlUtils.lookupNamespacePrefix(baz,
-                "http://schemas.android.com/apk/res/my/pkg", "app", false);
-        assertEquals("app", prefix);
-        assertFalse(declaresNamespace(document, "http://schemas.android.com/apk/res/my/pkg"));
-
-        prefix = XmlUtils.lookupNamespacePrefix(baz,
-                "http://schemas.android.com/apk/res/my/pkg", "app", true /*create*/);
-        assertEquals("app", prefix);
-        assertTrue(declaresNamespace(document, "http://schemas.android.com/apk/res/my/pkg"));
-    }
-
-    private static boolean declaresNamespace(Document document, String uri) {
-        NamedNodeMap attributes = document.getDocumentElement().getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Attr attribute = (Attr) attributes.item(i);
-            String name = attribute.getName();
-            if (name.startsWith(XMLNS) && uri.equals(attribute.getValue())) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public void testToXmlAttributeValue() throws Exception {
-        assertEquals("", XmlUtils.toXmlAttributeValue(""));
-        assertEquals("foo", XmlUtils.toXmlAttributeValue("foo"));
-        assertEquals("foo&lt;bar", XmlUtils.toXmlAttributeValue("foo<bar"));
-        assertEquals("foo>bar", XmlUtils.toXmlAttributeValue("foo>bar"));
-
-        assertEquals("&quot;", XmlUtils.toXmlAttributeValue("\""));
-        assertEquals("&apos;", XmlUtils.toXmlAttributeValue("'"));
-        assertEquals("foo&quot;b&apos;&apos;ar",
-                XmlUtils.toXmlAttributeValue("foo\"b''ar"));
-        assertEquals("&lt;&quot;&apos;>&amp;", XmlUtils.toXmlAttributeValue("<\"'>&"));
-    }
-
-    public void testAppendXmlAttributeValue() throws Exception {
-        StringBuilder sb = new StringBuilder();
-        XmlUtils.appendXmlAttributeValue(sb, "<\"'>&");
-        assertEquals("&lt;&quot;&apos;>&amp;", sb.toString());
-    }
-
-    public void testToXmlTextValue() throws Exception {
-        assertEquals("&lt;\"'>&amp;", XmlUtils.toXmlTextValue("<\"'>&"));
-    }
-
-    public void testAppendXmlTextValue() throws Exception {
-        StringBuilder sb = new StringBuilder();
-        XmlUtils.appendXmlTextValue(sb, "<\"'>&");
-        assertEquals("&lt;\"'>&amp;", sb.toString());
-    }
-
-    public void testNew() throws Exception {
-        Document doc = createEmptyPlainDocument();
-        Element root = doc.createElement("myroot");
-        doc.appendChild(root);
-        root.setAttribute("foo", "bar");
-        root.setAttribute("baz", "baz");
-        Element child = doc.createElement("mychild");
-        root.appendChild(child);
-        Element child2 = doc.createElement("hasComment");
-        root.appendChild(child2);
-        Node comment = doc.createComment("This is my comment");
-        child2.appendChild(comment);
-        Element child3 = doc.createElement("hasText");
-        root.appendChild(child3);
-        Node text = doc.createTextNode("  This is my text  ");
-        child3.appendChild(text);
-
-        String xml = XmlUtils.toXml(doc, false);
-        assertEquals(
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<myroot baz=\"baz\" foo=\"bar\">\n" +
-                "    <mychild/>\n" +
-                "    <hasComment>\n" +
-                "        <!--\n" +
-                "            This is my comment\n" +
-                "        -->\n" +
-                "    </hasComment>\n" +
-                "    <hasText>\n" +
-                "            This is my text\n" +
-                "    </hasText>\n" +
-                "</myroot>\n",
-                xml);
-
-        xml = XmlUtils.toXml(doc, true);
-        assertEquals(
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<myroot baz=\"baz\" foo=\"bar\"><mychild/><hasComment><!--This is my comment--></hasComment><hasText>  This is my text  </hasText></myroot>",
-               xml);
-
-    }
-
-    @Nullable
-    private static Document createEmptyPlainDocument() throws Exception {
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        factory.setIgnoringComments(true);
-        DocumentBuilder builder;
-        builder = factory.newDocumentBuilder();
-        return builder.newDocument();
-    }
-}
diff --git a/ddms/app/etc/manifest.txt b/ddms/app/etc/manifest.txt
index 88249c4..f3d4fdd 100644
--- a/ddms/app/etc/manifest.txt
+++ b/ddms/app/etc/manifest.txt
@@ -1,3 +1,3 @@
 Main-Class: com.android.ddms.Main
-Class-Path: common.jar sdkstats.jar ddmlib.jar ddmuilib.jar swtmenubar.jar org.eclipse.jface_3.6.2.M20110210-1200.jar org.eclipse.equinox.common_3.6.0.v20100503.jar org.eclipse.core.commands_3.6.0.I20100512-1500.jar jcommon-1.0.12.jar jfreechart-1.0.9.jar jfreechart-1.0.9-swt.jar osgi.jar
+Class-Path: common.jar sdkstats.jar ddmlib.jar ddmuilib.jar swtmenubar.jar org.eclipse.jface_3.6.2.M20110210-1200.jar org.eclipse.equinox.common_3.6.0.v20100503.jar org.eclipse.core.commands_3.6.0.I20100512-1500.jar jcommon-1.0.12.jar jfreechart-1.0.9.jar jfreechart-1.0.9-swt.jar osgi.jar guava-tools.jar
 
diff --git a/ddms/libs/ddmlib/Android.mk b/ddms/libs/ddmlib/Android.mk
index c479e79..c5ad99e 100644
--- a/ddms/libs/ddmlib/Android.mk
+++ b/ddms/libs/ddmlib/Android.mk
@@ -26,7 +26,7 @@
 LOCAL_JAVA_LIBRARIES := kxml2-2.3.0
 
 LOCAL_PREBUILT_JAVA_LIBRARIES := \
-	../../../../prebuilts/devtools/$(LOCAL_MODULE)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
+	../../../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
 
 include $(BUILD_HOST_PREBUILT)
 
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/ILogCatBufferChangeListener.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/ILogCatBufferChangeListener.java
index 1a547c7..2804629 100644
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/ILogCatBufferChangeListener.java
+++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/ILogCatBufferChangeListener.java
@@ -16,6 +16,8 @@
 
 package com.android.ddmuilib.logcat;
 
+import com.android.ddmlib.logcat.LogCatMessage;
+
 import java.util.List;
 
 /**
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/ILogCatMessageSelectionListener.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/ILogCatMessageSelectionListener.java
index 6e814b0..728b518 100644
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/ILogCatMessageSelectionListener.java
+++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/ILogCatMessageSelectionListener.java
@@ -15,6 +15,8 @@
  */
 package com.android.ddmuilib.logcat;
 
+import com.android.ddmlib.logcat.LogCatMessage;
+
 /**
  * Classes interested in listening to user selection of logcat
  * messages should implement this interface.
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilter.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilter.java
deleted file mode 100644
index 7bdd98a..0000000
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilter.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ddmuilib.logcat;
-
-import com.android.ddmlib.Log.LogLevel;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-
-/**
- * A Filter for logcat messages. A filter can be constructed to match
- * different fields of a logcat message. It can then be queried to see if
- * a message matches the filter's settings.
- */
-public final class LogCatFilter {
-    private static final String PID_KEYWORD = "pid:";   //$NON-NLS-1$
-    private static final String APP_KEYWORD = "app:";   //$NON-NLS-1$
-    private static final String TAG_KEYWORD = "tag:";   //$NON-NLS-1$
-    private static final String TEXT_KEYWORD = "text:"; //$NON-NLS-1$
-
-    private final String mName;
-    private final String mTag;
-    private final String mText;
-    private final String mPid;
-    private final String mAppName;
-    private final LogLevel mLogLevel;
-
-    /** Indicates the number of messages that match this filter, but have not
-     * yet been read by the user. This is really metadata about this filter
-     * necessary for the UI. If we ever end up needing to store more metadata,
-     * then it is probably better to move it out into a separate class. */
-    private int mUnreadCount;
-
-    /** Indicates that this filter is transient, and should not be persisted
-     * across Eclipse sessions. */
-    private boolean mTransient;
-
-    private boolean mCheckPid;
-    private boolean mCheckAppName;
-    private boolean mCheckTag;
-    private boolean mCheckText;
-
-    private Pattern mAppNamePattern;
-    private Pattern mTagPattern;
-    private Pattern mTextPattern;
-
-    /**
-     * Construct a filter with the provided restrictions for the logcat message. All the text
-     * fields accept Java regexes as input, but ignore invalid regexes. Filters are saved and
-     * restored across Eclipse sessions unless explicitly marked transient using
-     * {@link LogCatFilter#setTransient}.
-     * @param name name for the filter
-     * @param tag value for the logcat message's tag field.
-     * @param text value for the logcat message's text field.
-     * @param pid value for the logcat message's pid field.
-     * @param appName value for the logcat message's app name field.
-     * @param logLevel value for the logcat message's log level. Only messages of
-     * higher priority will be accepted by the filter.
-     */
-    public LogCatFilter(String name, String tag, String text, String pid, String appName,
-            LogLevel logLevel) {
-        mName = name.trim();
-        mTag = tag.trim();
-        mText = text.trim();
-        mPid = pid.trim();
-        mAppName = appName.trim();
-        mLogLevel = logLevel;
-
-        mUnreadCount = 0;
-
-        // By default, all filters are persistent. Transient filters should explicitly
-        // mark it so by calling setTransient.
-        mTransient = false;
-
-        mCheckPid = mPid.length() != 0;
-
-        if (mAppName.length() != 0) {
-            try {
-                mAppNamePattern = Pattern.compile(mAppName, getPatternCompileFlags(mAppName));
-                mCheckAppName = true;
-            } catch (PatternSyntaxException e) {
-                mCheckAppName = false;
-            }
-        }
-
-        if (mTag.length() != 0) {
-            try {
-                mTagPattern = Pattern.compile(mTag, getPatternCompileFlags(mTag));
-                mCheckTag = true;
-            } catch (PatternSyntaxException e) {
-                mCheckTag = false;
-            }
-        }
-
-        if (mText.length() != 0) {
-            try {
-                mTextPattern = Pattern.compile(mText, getPatternCompileFlags(mText));
-                mCheckText = true;
-            } catch (PatternSyntaxException e) {
-                mCheckText = false;
-            }
-        }
-    }
-
-    /**
-     * Obtain the flags to pass to {@link Pattern#compile(String, int)}. This method
-     * tries to figure out whether case sensitive matching should be used. It is based on
-     * the following heuristic: if the regex has an upper case character, then the match
-     * will be case sensitive. Otherwise it will be case insensitive.
-     */
-    private int getPatternCompileFlags(String regex) {
-        for (char c : regex.toCharArray()) {
-            if (Character.isUpperCase(c)) {
-                return 0;
-            }
-        }
-
-        return Pattern.CASE_INSENSITIVE;
-    }
-
-    /**
-     * Construct a list of {@link LogCatFilter} objects by decoding the query.
-     * @param query encoded search string. The query is simply a list of words (can be regexes)
-     * a user would type in a search bar. These words are searched for in the text field of
-     * each collected logcat message. To search in a different field, the word could be prefixed
-     * with a keyword corresponding to the field name. Currently, the following keywords are
-     * supported: "pid:", "tag:" and "text:". Invalid regexes are ignored.
-     * @param minLevel minimum log level to match
-     * @return list of filter settings that fully match the given query
-     */
-    public static List<LogCatFilter> fromString(String query, LogLevel minLevel) {
-        List<LogCatFilter> filterSettings = new ArrayList<LogCatFilter>();
-
-        for (String s : query.trim().split(" ")) {
-            String tag = "";
-            String text = "";
-            String pid = "";
-            String app = "";
-
-            if (s.startsWith(PID_KEYWORD)) {
-                pid = s.substring(PID_KEYWORD.length());
-            } else if (s.startsWith(APP_KEYWORD)) {
-                app = s.substring(APP_KEYWORD.length());
-            } else if (s.startsWith(TAG_KEYWORD)) {
-                tag = s.substring(TAG_KEYWORD.length());
-            } else {
-                if (s.startsWith(TEXT_KEYWORD)) {
-                    text = s.substring(TEXT_KEYWORD.length());
-                } else {
-                    text = s;
-                }
-            }
-            filterSettings.add(new LogCatFilter("livefilter-" + s,
-                    tag, text, pid, app, minLevel));
-        }
-
-        return filterSettings;
-    }
-
-    public String getName() {
-        return mName;
-    }
-
-    public String getTag() {
-        return mTag;
-    }
-
-    public String getText() {
-        return mText;
-    }
-
-    public String getPid() {
-        return mPid;
-    }
-
-    public String getAppName() {
-        return mAppName;
-    }
-
-    public LogLevel getLogLevel() {
-        return mLogLevel;
-    }
-
-    /**
-     * Check whether a given message will make it through this filter.
-     * @param m message to check
-     * @return true if the message matches the filter's conditions.
-     */
-    public boolean matches(LogCatMessage m) {
-        /* filter out messages of a lower priority */
-        if (m.getLogLevel().getPriority() < mLogLevel.getPriority()) {
-            return false;
-        }
-
-        /* if pid filter is enabled, filter out messages whose pid does not match
-         * the filter's pid */
-        if (mCheckPid && !m.getPid().equals(mPid)) {
-            return false;
-        }
-
-        /* if app name filter is enabled, filter out messages not matching the app name */
-        if (mCheckAppName) {
-            Matcher matcher = mAppNamePattern.matcher(m.getAppName());
-            if (!matcher.find()) {
-                return false;
-            }
-        }
-
-        /* if tag filter is enabled, filter out messages not matching the tag */
-        if (mCheckTag) {
-            Matcher matcher = mTagPattern.matcher(m.getTag());
-            if (!matcher.find()) {
-                return false;
-            }
-        }
-
-        if (mCheckText) {
-            Matcher matcher = mTextPattern.matcher(m.getMessage());
-            if (!matcher.find()) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Update the unread count based on new messages received. The unread count
-     * is incremented by the count of messages in the received list that will be
-     * accepted by this filter.
-     * @param newMessages list of new messages.
-     */
-    public void updateUnreadCount(List<LogCatMessage> newMessages) {
-        for (LogCatMessage m : newMessages) {
-            if (matches(m)) {
-                mUnreadCount++;
-            }
-        }
-    }
-
-    /**
-     * Reset count of unread messages.
-     */
-    public void resetUnreadCount() {
-        mUnreadCount = 0;
-    }
-
-    /**
-     * Get current value for the unread message counter.
-     */
-    public int getUnreadCount() {
-        return mUnreadCount;
-    }
-
-    /** Make this filter transient: It will not be persisted across sessions. */
-    public void setTransient() {
-        mTransient = true;
-    }
-
-    public boolean isTransient() {
-        return mTransient;
-    }
-}
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterContentProvider.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterContentProvider.java
index 68c08d4..629b0e0 100644
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterContentProvider.java
+++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterContentProvider.java
@@ -15,6 +15,8 @@
  */
 package com.android.ddmuilib.logcat;
 
+import com.android.ddmlib.logcat.LogCatFilter;
+
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterData.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterData.java
new file mode 100644
index 0000000..dbc34d8
--- /dev/null
+++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterData.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed 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 com.android.ddmuilib.logcat;
+
+import com.android.ddmlib.logcat.LogCatFilter;
+import com.android.ddmlib.logcat.LogCatMessage;
+
+import java.util.List;
+
+public class LogCatFilterData {
+    private final LogCatFilter mFilter;
+
+    /** Indicates the number of messages that match this filter, but have not
+     * yet been read by the user. This is really metadata about this filter
+     * necessary for the UI. If we ever end up needing to store more metadata,
+     * then it is probably better to move it out into a separate class. */
+    private int mUnreadCount;
+
+    /** Indicates that this filter is transient, and should not be persisted
+     * across Eclipse sessions. */
+    private boolean mTransient;
+
+    public LogCatFilterData(LogCatFilter f) {
+        mFilter = f;
+
+        // By default, all filters are persistent. Transient filters should explicitly
+        // mark it so by calling setTransient.
+        mTransient = false;
+    }
+
+    /**
+     * Update the unread count based on new messages received. The unread count
+     * is incremented by the count of messages in the received list that will be
+     * accepted by this filter.
+     * @param newMessages list of new messages.
+     */
+    public void updateUnreadCount(List<LogCatMessage> newMessages) {
+        for (LogCatMessage m : newMessages) {
+            if (mFilter.matches(m)) {
+                mUnreadCount++;
+            }
+        }
+    }
+
+    /**
+     * Reset count of unread messages.
+     */
+    public void resetUnreadCount() {
+        mUnreadCount = 0;
+    }
+
+    /**
+     * Get current value for the unread message counter.
+     */
+    public int getUnreadCount() {
+        return mUnreadCount;
+    }
+
+    /** Make this filter transient: It will not be persisted across sessions. */
+    public void setTransient() {
+        mTransient = true;
+    }
+
+    public boolean isTransient() {
+        return mTransient;
+    }
+}
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterLabelProvider.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterLabelProvider.java
index 59e236c..fe24ddd 100644
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterLabelProvider.java
+++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterLabelProvider.java
@@ -15,15 +15,25 @@
  */
 package com.android.ddmuilib.logcat;
 
+import com.android.ddmlib.logcat.LogCatFilter;
+
 import org.eclipse.jface.viewers.ITableLabelProvider;
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.swt.graphics.Image;
 
+import java.util.Map;
+
 /**
  * A JFace label provider for the LogCat filters. It expects elements of type
  * {@link LogCatFilter}.
  */
 public final class LogCatFilterLabelProvider extends LabelProvider implements ITableLabelProvider {
+    private Map<LogCatFilter, LogCatFilterData> mFilterData;
+
+    public LogCatFilterLabelProvider(Map<LogCatFilter, LogCatFilterData> filterData) {
+        mFilterData = filterData;
+    }
+
     @Override
     public Image getColumnImage(Object arg0, int arg1) {
         return null;
@@ -42,11 +52,12 @@
         }
 
         LogCatFilter f = (LogCatFilter) element;
+        LogCatFilterData fd = mFilterData.get(f);
 
-        if (f.getUnreadCount() == 0) {
-            return f.getName();
+        if (fd != null && fd.getUnreadCount() > 0) {
+            return String.format("%s (%d)", f.getName(), fd.getUnreadCount());
         } else {
-            return String.format("%s (%d)", f.getName(), f.getUnreadCount());
+            return f.getName();
         }
     }
 }
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterSettingsSerializer.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterSettingsSerializer.java
index 12fbdfa..de35162 100644
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterSettingsSerializer.java
+++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatFilterSettingsSerializer.java
@@ -16,9 +16,11 @@
 package com.android.ddmuilib.logcat;
 
 import com.android.ddmlib.Log.LogLevel;
+import com.android.ddmlib.logcat.LogCatFilter;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Class to help save/restore user created filters.
@@ -49,14 +51,17 @@
      * {@link LogCatFilterSettingsSerializer#decodeFromPreferenceString(String)} for the
      * reverse operation.
      * @param filters list of filters to save.
+     * @param filterData mapping from filter to per filter UI data
      * @return an encoded string that can be saved in Eclipse preference store. The encoded string
      * is of a list of key:'value' pairs.
      */
-    public String encodeToPreferenceString(List<LogCatFilter> filters) {
+    public String encodeToPreferenceString(List<LogCatFilter> filters,
+            Map<LogCatFilter, LogCatFilterData> filterData) {
         StringBuffer sb = new StringBuffer();
 
         for (LogCatFilter f : filters) {
-            if (f.isTransient()) {
+            LogCatFilterData fd = filterData.get(f);
+            if (fd != null && fd.isTransient()) {
                 // do not persist transient filters
                 continue;
             }
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessage.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessage.java
deleted file mode 100644
index aea4ead..0000000
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessage.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ddmuilib.logcat;
-
-import com.android.ddmlib.Log.LogLevel;
-
-/**
- * Model a single log message output from {@code logcat -v long}.
- * A logcat message has a {@link LogLevel}, the pid (process id) of the process
- * generating the message, the time at which the message was generated, and
- * the tag and message itself.
- */
-public final class LogCatMessage {
-    private final LogLevel mLogLevel;
-    private final String mPid;
-    private final String mTid;
-    private final String mAppName;
-    private final String mTag;
-    private final String mTime;
-    private final String mMessage;
-
-    /**
-     * Construct an immutable log message object.
-     */
-    public LogCatMessage(LogLevel logLevel, String pid, String tid, String appName,
-            String tag, String time, String msg) {
-        mLogLevel = logLevel;
-        mPid = pid;
-        mAppName = appName;
-        mTag = tag;
-        mTime = time;
-        mMessage = msg;
-
-        long tidValue;
-        try {
-            // Thread id's may be in hex on some platforms.
-            // Decode and store them in radix 10.
-            tidValue = Long.decode(tid.trim());
-        } catch (NumberFormatException e) {
-            tidValue = -1;
-        }
-
-        mTid = Long.toString(tidValue);
-    }
-
-    public LogLevel getLogLevel() {
-        return mLogLevel;
-    }
-
-    public String getPid() {
-        return mPid;
-    }
-
-    public String getTid() {
-        return mTid;
-    }
-
-    public String getAppName() {
-        return mAppName;
-    }
-
-    public String getTag() {
-        return mTag;
-    }
-
-    public String getTime() {
-        return mTime;
-    }
-
-    public String getMessage() {
-        return mMessage;
-    }
-
-    @Override
-    public String toString() {
-        return mTime + ": "
-                + mLogLevel.getPriorityLetter() + "/"
-                + mTag + "("
-                + mPid + "): "
-                + mMessage;
-    }
-}
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessageList.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessageList.java
index 080dbc1..c5cd548 100644
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessageList.java
+++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessageList.java
@@ -16,6 +16,8 @@
 
 package com.android.ddmuilib.logcat;
 
+import com.android.ddmlib.logcat.LogCatMessage;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ArrayBlockingQueue;
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessageParser.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessageParser.java
deleted file mode 100644
index b69a433..0000000
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessageParser.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ddmuilib.logcat;
-
-import com.android.ddmlib.Log.LogLevel;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Class to parse raw output of {@code adb logcat -v long} to {@link LogCatMessage} objects.
- */
-public final class LogCatMessageParser {
-    private LogLevel mCurLogLevel = LogLevel.WARN;
-    private String mCurPid = "?";
-    private String mCurTid = "?";
-    private String mCurTag = "?";
-    private String mCurTime = "?:??";
-
-    /**
-     * This pattern is meant to parse the first line of a log message with the option
-     * 'logcat -v long'. The first line represents the date, tag, severity, etc.. while the
-     * following lines are the message (can be several lines).<br>
-     * This first line looks something like:<br>
-     * {@code "[ 00-00 00:00:00.000 <pid>:0x<???> <severity>/<tag>]"}
-     * <br>
-     * Note: severity is one of V, D, I, W, E, A? or F. However, there doesn't seem to be
-     *       a way to actually generate an A (assert) message. Log.wtf is supposed to generate
-     *       a message with severity A, however it generates the undocumented F level. In
-     *       such a case, the parser will change the level from F to A.<br>
-     * Note: the fraction of second value can have any number of digit.<br>
-     * Note: the tag should be trimmed as it may have spaces at the end.
-     */
-    private static Pattern sLogHeaderPattern = Pattern.compile(
-            "^\\[\\s(\\d\\d-\\d\\d\\s\\d\\d:\\d\\d:\\d\\d\\.\\d+)"
-          + "\\s+(\\d*):\\s*(\\S+)\\s([VDIWEAF])/(.*)\\]$");
-
-    /**
-     * Parse a list of strings into {@link LogCatMessage} objects. This method
-     * maintains state from previous calls regarding the last seen header of
-     * logcat messages.
-     * @param lines list of raw strings obtained from logcat -v long
-     * @param pidToNameMapper mapper to obtain the app name given a pid
-     * @return list of LogMessage objects parsed from the input
-     */
-    public List<LogCatMessage> processLogLines(String[] lines,
-            LogCatPidToNameMapper pidToNameMapper) {
-        List<LogCatMessage> messages = new ArrayList<LogCatMessage>(lines.length);
-
-        for (String line : lines) {
-            if (line.length() == 0) {
-                continue;
-            }
-
-            Matcher matcher = sLogHeaderPattern.matcher(line);
-            if (matcher.matches()) {
-                mCurTime = matcher.group(1);
-                mCurPid = matcher.group(2);
-                mCurTid = matcher.group(3);
-                mCurLogLevel = LogLevel.getByLetterString(matcher.group(4));
-                mCurTag = matcher.group(5).trim();
-
-                /* LogLevel doesn't support messages with severity "F". Log.wtf() is supposed
-                 * to generate "A", but generates "F". */
-                if (mCurLogLevel == null && matcher.group(4).equals("F")) {
-                    mCurLogLevel = LogLevel.ASSERT;
-                }
-            } else {
-                LogCatMessage m = new LogCatMessage(mCurLogLevel, mCurPid, mCurTid,
-                        pidToNameMapper.getName(mCurPid),
-                        mCurTag, mCurTime, line);
-                messages.add(m);
-            }
-        }
-
-        return messages;
-    }
-}
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java
index 4f27f02..bda742c 100644
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java
+++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java
@@ -19,6 +19,8 @@
 import com.android.ddmlib.DdmConstants;
 import com.android.ddmlib.IDevice;
 import com.android.ddmlib.Log.LogLevel;
+import com.android.ddmlib.logcat.LogCatFilter;
+import com.android.ddmlib.logcat.LogCatMessage;
 import com.android.ddmuilib.AbstractBufferFindTarget;
 import com.android.ddmuilib.FindDialog;
 import com.android.ddmuilib.ITableFocusListener;
@@ -85,6 +87,8 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
@@ -160,6 +164,7 @@
     private IPreferenceStore mPrefStore;
 
     private List<LogCatFilter> mLogCatFilters;
+    private Map<LogCatFilter, LogCatFilterData> mLogCatFilterData;
     private int mCurrentSelectedFilterIndex;
 
     private ToolItem mNewFilterToolItem;
@@ -236,18 +241,25 @@
 
     private void initializeFilters() {
         mLogCatFilters = new ArrayList<LogCatFilter>();
+        mLogCatFilterData = new ConcurrentHashMap<LogCatFilter, LogCatFilterData>();
 
         /* add default filter matching all messages */
         String tag = "";
         String text = "";
         String pid = "";
         String app = "";
-        mLogCatFilters.add(new LogCatFilter("All messages (no filters)",
-                tag, text, pid, app, LogLevel.VERBOSE));
+        LogCatFilter defaultFilter = new LogCatFilter("All messages (no filters)",
+                tag, text, pid, app, LogLevel.VERBOSE);
+
+        mLogCatFilters.add(defaultFilter);
+        mLogCatFilterData.put(defaultFilter, new LogCatFilterData(defaultFilter));
 
         /* restore saved filters from prefStore */
         List<LogCatFilter> savedFilters = getSavedFilters();
-        mLogCatFilters.addAll(savedFilters);
+        for (LogCatFilter f: savedFilters) {
+            mLogCatFilters.add(f);
+            mLogCatFilterData.put(f, new LogCatFilterData(f));
+        }
     }
 
     private void setupDefaultPreferences() {
@@ -323,7 +335,7 @@
 
         /* save all filter settings except the first one which is the default */
         String e = serializer.encodeToPreferenceString(
-                mLogCatFilters.subList(1, mLogCatFilters.size()));
+                mLogCatFilters.subList(1, mLogCatFilters.size()), mLogCatFilterData);
         mPrefStore.setValue(LOGCAT_FILTERS_LIST, e);
     }
 
@@ -348,7 +360,8 @@
 
             // When switching between devices, existing filter match count should be reset.
             for (LogCatFilter f : mLogCatFilters) {
-                f.resetUnreadCount();
+                LogCatFilterData fd = mLogCatFilterData.get(f);
+                fd.resetUnreadCount();
             }
         }
 
@@ -478,6 +491,7 @@
                 LogLevel.getByString(d.getLogLevel()));
 
         mLogCatFilters.add(f);
+        mLogCatFilterData.put(f, new LogCatFilterData(f));
         mFiltersTableViewer.refresh();
 
         /* select the newly added entry */
@@ -489,8 +503,7 @@
     }
 
     private void addNewFilter() {
-        addNewFilter("", "", "",
-                "", LogLevel.VERBOSE);
+        addNewFilter("", "", "", "", LogLevel.VERBOSE);
     }
 
     private void deleteSelectedFilter() {
@@ -500,7 +513,10 @@
             return;
         }
 
+        LogCatFilter f = mLogCatFilters.get(selectedIndex);
         mLogCatFilters.remove(selectedIndex);
+        mLogCatFilterData.remove(f);
+
         mFiltersTableViewer.refresh();
         mFiltersTableViewer.getTable().setSelection(selectedIndex - 1);
 
@@ -551,6 +567,10 @@
         if (f == null) {
             f = createTransientAppFilter(appName);
             mLogCatFilters.add(f);
+
+            LogCatFilterData fd = new LogCatFilterData(f);
+            fd.setTransient();
+            mLogCatFilterData.put(f, fd);
         }
 
         selectFilterAt(mLogCatFilters.indexOf(f));
@@ -558,7 +578,8 @@
 
     private LogCatFilter findTransientAppFilter(String appName) {
         for (LogCatFilter f : mLogCatFilters) {
-            if (f.isTransient() && f.getAppName().equals(appName)) {
+            LogCatFilterData fd = mLogCatFilterData.get(f);
+            if (fd != null && fd.isTransient() && f.getAppName().equals(appName)) {
                 return f;
             }
         }
@@ -572,7 +593,6 @@
                 "",
                 appName,
                 LogLevel.VERBOSE);
-        f.setTransient();
         return f;
     }
 
@@ -594,7 +614,7 @@
 
         mFiltersTableViewer = new TableViewer(table);
         mFiltersTableViewer.setContentProvider(new LogCatFilterContentProvider());
-        mFiltersTableViewer.setLabelProvider(new LogCatFilterLabelProvider());
+        mFiltersTableViewer.setLabelProvider(new LogCatFilterLabelProvider(mLogCatFilterData));
         mFiltersTableViewer.setInput(mLogCatFilters);
 
         mFiltersTableViewer.getTable().addSelectionListener(new SelectionAdapter() {
@@ -671,6 +691,7 @@
                 if (mReceiver != null) {
                     mReceiver.clearMessages();
                     refreshLogCatTable();
+                    resetUnreadCountForAllFilters();
 
                     // the filters view is not cleared unless the filters are re-applied.
                     updateAppliedFilters();
@@ -1091,13 +1112,15 @@
 
         mCurrentSelectedFilterIndex = idx;
 
-        resetUnreadCountForSelectedFilter();
+        resetUnreadCountForAllFilters();
         updateFiltersToolBar();
         updateAppliedFilters();
     }
 
-    private void resetUnreadCountForSelectedFilter() {
-        mLogCatFilters.get(mCurrentSelectedFilterIndex).resetUnreadCount();
+    private void resetUnreadCountForAllFilters() {
+        for (LogCatFilterData fd: mLogCatFilterData.values()) {
+            fd.resetUnreadCount();
+        }
         refreshFiltersTable();
     }
 
@@ -1142,6 +1165,8 @@
     @Override
     public void bufferChanged(List<LogCatMessage> addedMessages,
             List<LogCatMessage> deletedMessages) {
+        updateUnreadCount(addedMessages);
+        refreshFiltersTable();
 
         synchronized (mLogBuffer) {
             addedMessages = applyCurrentFilters(addedMessages);
@@ -1152,8 +1177,6 @@
         }
 
         refreshLogCatTable();
-        updateUnreadCount(addedMessages);
-        refreshFiltersTable();
     }
 
     private void reloadLogBuffer() {
@@ -1184,7 +1207,9 @@
                 /* no need to update unread count for currently selected filter */
                 continue;
             }
-            mLogCatFilters.get(i).updateUnreadCount(receivedMessages);
+            LogCatFilter f = mLogCatFilters.get(i);
+            LogCatFilterData fd = mLogCatFilterData.get(f);
+            fd.updateUnreadCount(receivedMessages);
         }
     }
 
@@ -1328,7 +1353,9 @@
             Display.getDefault().asyncExec(new Runnable() {
                 @Override
                 public void run() {
-                    startScrollBarMonitor(mTable.getVerticalBar());
+                    if (!mTable.isDisposed()) {
+                        startScrollBarMonitor(mTable.getVerticalBar());
+                    }
                 }
             });
         }
@@ -1372,7 +1399,9 @@
 
     /** Scroll to the last line. */
     private void scrollToLatestLog() {
-        mTable.setTopIndex(mTable.getItemCount() - 1);
+        if (!mTable.isDisposed()) {
+            mTable.setTopIndex(mTable.getItemCount() - 1);
+        }
     }
 
     /**
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPidToNameMapper.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPidToNameMapper.java
deleted file mode 100644
index a4455d0..0000000
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPidToNameMapper.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ddmuilib.logcat;
-
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.AndroidDebugBridge.IClientChangeListener;
-import com.android.ddmlib.AndroidDebugBridge.IDeviceChangeListener;
-import com.android.ddmlib.Client;
-import com.android.ddmlib.ClientData;
-import com.android.ddmlib.IDevice;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * This class maintains a mapping between the PID and the application name for all
- * running apps on a device. It does this by implementing callbacks to two events:
- * {@link AndroidDebugBridge.IDeviceChangeListener} and
- * {@link AndroidDebugBridge.IClientChangeListener}.
- */
-public class LogCatPidToNameMapper {
-    /** Default name used when the actual name cannot be determined. */
-    public static final String UNKNOWN_APP = "";
-
-    private IClientChangeListener mClientChangeListener;
-    private IDeviceChangeListener mDeviceChangeListener;
-    private IDevice mDevice;
-    private Map<String, String> mPidToName;
-
-    public LogCatPidToNameMapper(IDevice device) {
-        mDevice = device;
-        mClientChangeListener = constructClientChangeListener();
-        AndroidDebugBridge.addClientChangeListener(mClientChangeListener);
-
-        mDeviceChangeListener = constructDeviceChangeListener();
-        AndroidDebugBridge.addDeviceChangeListener(mDeviceChangeListener);
-
-        mPidToName = new HashMap<String, String>();
-
-        updateClientList(device);
-    }
-
-    private IClientChangeListener constructClientChangeListener() {
-        return new IClientChangeListener() {
-            @Override
-            public void clientChanged(Client client, int changeMask) {
-                if ((changeMask & Client.CHANGE_NAME) == Client.CHANGE_NAME) {
-                    ClientData cd = client.getClientData();
-                    updateClientName(cd);
-                }
-            }
-        };
-    }
-
-    private void updateClientName(ClientData cd) {
-        String name = cd.getClientDescription();
-        if (name != null) {
-            int pid = cd.getPid();
-            if (mPidToName != null) {
-                mPidToName.put(Integer.toString(pid), name);
-            }
-        }
-    }
-
-    private IDeviceChangeListener constructDeviceChangeListener() {
-        return new IDeviceChangeListener() {
-            @Override
-            public void deviceDisconnected(IDevice device) {
-            }
-
-            @Override
-            public void deviceConnected(IDevice device) {
-            }
-
-            @Override
-            public void deviceChanged(IDevice device, int changeMask) {
-                if (changeMask == IDevice.CHANGE_CLIENT_LIST) {
-                    updateClientList(device);
-                }
-            }
-        };
-    }
-
-    private void updateClientList(IDevice device) {
-        if (mDevice == null) {
-            return;
-        }
-
-        if (!mDevice.equals(device)) {
-            return;
-        }
-
-        mPidToName = new HashMap<String, String>();
-        for (Client c : device.getClients()) {
-            ClientData cd = c.getClientData();
-            String name = cd.getClientDescription();
-            int pid = cd.getPid();
-
-            /* The name will be null for apps that have just been created.
-             * In such a case, we fill in the default name, and wait for the
-             * clientChangeListener to do the update with the correct name.
-             */
-            if (name == null) {
-                name = UNKNOWN_APP;
-            }
-
-            mPidToName.put(Integer.toString(pid), name);
-        }
-    }
-
-    /**
-     * Get the application name corresponding to given pid.
-     * @param pid application's pid
-     * @return application name if available, else {@link LogCatPidToNameMapper#UNKNOWN_APP}.
-     */
-    public String getName(String pid) {
-        String name = mPidToName.get(pid);
-        return name != null ? name : UNKNOWN_APP;
-    }
-}
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatReceiver.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatReceiver.java
index da3e86f..a85cd03 100644
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatReceiver.java
+++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatReceiver.java
@@ -17,10 +17,10 @@
 package com.android.ddmuilib.logcat;
 
 import com.android.ddmlib.IDevice;
-import com.android.ddmlib.IShellOutputReceiver;
-import com.android.ddmlib.Log;
 import com.android.ddmlib.Log.LogLevel;
-import com.android.ddmlib.MultiLineReceiver;
+import com.android.ddmlib.logcat.LogCatListener;
+import com.android.ddmlib.logcat.LogCatMessage;
+import com.android.ddmlib.logcat.LogCatReceiverTask;
 
 import org.eclipse.jface.preference.IPreferenceStore;
 
@@ -33,19 +33,15 @@
  * A class to monitor a device for logcat messages. It stores the received
  * log messages in a circular buffer.
  */
-public final class LogCatReceiver {
-    private static final String LOGCAT_COMMAND = "logcat -v long";
-    private static final int DEVICE_POLL_INTERVAL_MSEC = 1000;
+public final class LogCatReceiver implements LogCatListener {
     private static LogCatMessage DEVICE_DISCONNECTED_MESSAGE =
             new LogCatMessage(LogLevel.ERROR, "", "", "",
                     "", "", "Device disconnected");
 
     private LogCatMessageList mLogMessages;
     private IDevice mCurrentDevice;
-    private LogCatOutputReceiver mCurrentLogCatOutputReceiver;
+    private LogCatReceiverTask mLogCatReceiverTask;
     private Set<ILogCatBufferChangeListener> mLogCatMessageListeners;
-    private LogCatMessageParser mLogCatMessageParser;
-    private LogCatPidToNameMapper mPidToNameMapper;
     private IPreferenceStore mPrefStore;
 
     /**
@@ -61,9 +57,6 @@
         mPrefStore = prefStore;
 
         mLogCatMessageListeners = new HashSet<ILogCatBufferChangeListener>();
-        mLogCatMessageParser = new LogCatMessageParser();
-        mPidToNameMapper = new LogCatPidToNameMapper(mCurrentDevice);
-
         mLogMessages = new LogCatMessageList(getFifoSize());
 
         startReceiverThread();
@@ -73,13 +66,14 @@
      * Stop receiving messages from currently active device.
      */
     public void stop() {
-        if (mCurrentLogCatOutputReceiver != null) {
+        if (mLogCatReceiverTask != null) {
             /* stop the current logcat command */
-            mCurrentLogCatOutputReceiver.mIsCancelled = true;
-            mCurrentLogCatOutputReceiver = null;
+            mLogCatReceiverTask.removeLogCatListener(this);
+            mLogCatReceiverTask.stop();
+            mLogCatReceiverTask = null;
 
             // add a message to the log indicating that the device has been disconnected.
-            processLogMessages(Collections.singletonList(DEVICE_DISCONNECTED_MESSAGE));
+            log(Collections.singletonList(DEVICE_DISCONNECTED_MESSAGE));
         }
 
         mCurrentDevice = null;
@@ -91,85 +85,26 @@
     }
 
     private void startReceiverThread() {
-        mCurrentLogCatOutputReceiver = new LogCatOutputReceiver();
+        if (mCurrentDevice == null) {
+            return;
+        }
 
-        Thread t = new Thread(new Runnable() {
-            @Override
-            public void run() {
-                /* wait while the device comes online */
-                while (mCurrentDevice != null && !mCurrentDevice.isOnline()) {
-                    try {
-                        Thread.sleep(DEVICE_POLL_INTERVAL_MSEC);
-                    } catch (InterruptedException e) {
-                        return;
-                    }
-                }
+        mLogCatReceiverTask = new LogCatReceiverTask(mCurrentDevice);
+        mLogCatReceiverTask.addLogCatListener(this);
 
-                try {
-                    if (mCurrentDevice != null) {
-                        mCurrentDevice.executeShellCommand(LOGCAT_COMMAND,
-                            mCurrentLogCatOutputReceiver, 0);
-                    }
-                } catch (Exception e) {
-                    /* There are 4 possible exceptions: TimeoutException,
-                     * AdbCommandRejectedException, ShellCommandUnresponsiveException and
-                     * IOException. In case of any of them, the only recourse is to just
-                     * log this unexpected situation and move on.
-                     */
-                    Log.e("Unexpected error while launching logcat. Try reselecting the device.",
-                            e);
-                }
-            }
-        });
+        Thread t = new Thread(mLogCatReceiverTask);
         t.setName("LogCat output receiver for " + mCurrentDevice.getSerialNumber());
         t.start();
     }
 
-    /**
-     * LogCatOutputReceiver implements {@link MultiLineReceiver#processNewLines(String[])},
-     * which is called whenever there is output from logcat. It simply redirects this output
-     * to {@link LogCatReceiver#processLogLines(String[])}. This class is expected to be
-     * used from a different thread, and the only way to stop that thread is by using the
-     * {@link LogCatOutputReceiver#mIsCancelled} variable.
-     * See {@link IDevice#executeShellCommand(String, IShellOutputReceiver, int)} for more
-     * details.
-     */
-    private class LogCatOutputReceiver extends MultiLineReceiver {
-        private boolean mIsCancelled;
-
-        public LogCatOutputReceiver() {
-            setTrimLine(false);
+    @Override
+    public void log(List<LogCatMessage> newMessages) {
+        List<LogCatMessage> deletedMessages;
+        synchronized (mLogMessages) {
+            deletedMessages = mLogMessages.ensureSpace(newMessages.size());
+            mLogMessages.appendMessages(newMessages);
         }
-
-        /** Implements {@link IShellOutputReceiver#isCancelled() }. */
-        @Override
-        public boolean isCancelled() {
-            return mIsCancelled;
-        }
-
-        @Override
-        public void processNewLines(String[] lines) {
-            if (!mIsCancelled) {
-                processLogLines(lines);
-            }
-        }
-    }
-
-    private void processLogLines(String[] lines) {
-        List<LogCatMessage> newMessages = mLogCatMessageParser.processLogLines(lines,
-                mPidToNameMapper);
-        processLogMessages(newMessages);
-    }
-
-    private void processLogMessages(List<LogCatMessage> newMessages) {
-        if (newMessages.size() > 0) {
-            List<LogCatMessage> deletedMessages;
-            synchronized (mLogMessages) {
-                deletedMessages = mLogMessages.ensureSpace(newMessages.size());
-                mLogMessages.appendMessages(newMessages);
-            }
-            sendLogChangedEvent(newMessages, deletedMessages);
-        }
+        sendLogChangedEvent(newMessages, deletedMessages);
     }
 
     /**
diff --git a/ddms/libs/ddmuilib/tests/src/com/android/ddmuilib/logcat/LogCatFilterSettingsSerializerTest.java b/ddms/libs/ddmuilib/tests/src/com/android/ddmuilib/logcat/LogCatFilterSettingsSerializerTest.java
index 0fc0c76..e6c0e76 100644
--- a/ddms/libs/ddmuilib/tests/src/com/android/ddmuilib/logcat/LogCatFilterSettingsSerializerTest.java
+++ b/ddms/libs/ddmuilib/tests/src/com/android/ddmuilib/logcat/LogCatFilterSettingsSerializerTest.java
@@ -16,8 +16,10 @@
 package com.android.ddmuilib.logcat;
 
 import com.android.ddmlib.Log.LogLevel;
+import com.android.ddmlib.logcat.LogCatFilter;
 
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 
 import junit.framework.TestCase;
@@ -34,7 +36,8 @@
                 LogLevel.ERROR);
 
         LogCatFilterSettingsSerializer serializer = new LogCatFilterSettingsSerializer();
-        String s = serializer.encodeToPreferenceString(Arrays.asList(fs));
+        String s = serializer.encodeToPreferenceString(Arrays.asList(fs),
+                new HashMap<LogCatFilter, LogCatFilterData>());
         List<LogCatFilter> decodedFiltersList = serializer.decodeFromPreferenceString(s);
 
         assertEquals(1, decodedFiltersList.size());
@@ -57,10 +60,14 @@
                 "123",                      //$NON-NLS-1$
                 "TestAppName.*",            //$NON-NLS-1$
                 LogLevel.ERROR);
-        fs.setTransient();
+        LogCatFilterData fd = new LogCatFilterData(fs);
+        fd.setTransient();
+        HashMap<LogCatFilter, LogCatFilterData> fdMap =
+                new HashMap<LogCatFilter, LogCatFilterData>();
+        fdMap.put(fs, fd);
 
         LogCatFilterSettingsSerializer serializer = new LogCatFilterSettingsSerializer();
-        String s = serializer.encodeToPreferenceString(Arrays.asList(fs));
+        String s = serializer.encodeToPreferenceString(Arrays.asList(fs), fdMap);
         List<LogCatFilter> decodedFiltersList = serializer.decodeFromPreferenceString(s);
 
         assertEquals(0, decodedFiltersList.size());
diff --git a/ddms/libs/ddmuilib/tests/src/com/android/ddmuilib/logcat/LogCatFilterTest.java b/ddms/libs/ddmuilib/tests/src/com/android/ddmuilib/logcat/LogCatFilterTest.java
deleted file mode 100644
index 7fedb08..0000000
--- a/ddms/libs/ddmuilib/tests/src/com/android/ddmuilib/logcat/LogCatFilterTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ddmuilib.logcat;
-
-import com.android.ddmlib.Log.LogLevel;
-
-import java.util.List;
-
-import junit.framework.TestCase;
-
-public class LogCatFilterTest extends TestCase {
-    public void testFilterByLogLevel() {
-        LogCatFilter filter = new LogCatFilter("",
-                "", "", "", "", LogLevel.DEBUG);
-
-        /* filter message below filter's log level */
-        LogCatMessage msg = new LogCatMessage(LogLevel.VERBOSE,
-                "", "", "", "", "", "");
-        assertEquals(false, filter.matches(msg));
-
-        /* do not filter message above filter's log level */
-        msg = new LogCatMessage(LogLevel.ERROR,
-                "", "", "", "", "", "");
-        assertEquals(true, filter.matches(msg));
-    }
-
-    public void testFilterByPid() {
-        LogCatFilter filter = new LogCatFilter("",
-                "", "", "123", "", LogLevel.VERBOSE);
-
-        /* show message with pid matching filter */
-        LogCatMessage msg = new LogCatMessage(LogLevel.VERBOSE,
-                "123", "", "", "", "", "");
-        assertEquals(true, filter.matches(msg));
-
-        /* don't show message with pid not matching filter */
-        msg = new LogCatMessage(LogLevel.VERBOSE,
-                "12", "", "", "", "", "");
-        assertEquals(false, filter.matches(msg));
-    }
-
-    public void testFilterByAppNameRegex() {
-        LogCatFilter filter = new LogCatFilter("",
-                "", "", "", "dalvik.*", LogLevel.VERBOSE);
-
-        /* show message with pid matching filter */
-        LogCatMessage msg = new LogCatMessage(LogLevel.VERBOSE,
-                "", "", "dalvikvm1", "", "", "");
-        assertEquals(true, filter.matches(msg));
-
-        /* don't show message with pid not matching filter */
-        msg = new LogCatMessage(LogLevel.VERBOSE,
-                "", "", "system", "", "", "");
-        assertEquals(false, filter.matches(msg));
-    }
-
-    public void testFilterByTagRegex() {
-        LogCatFilter filter = new LogCatFilter("",
-                "tag.*", "", "", "", LogLevel.VERBOSE);
-
-        /* show message with tag matching filter */
-        LogCatMessage msg = new LogCatMessage(LogLevel.VERBOSE,
-                "", "", "", "tag123", "", "");
-        assertEquals(true, filter.matches(msg));
-
-        msg = new LogCatMessage(LogLevel.VERBOSE,
-                "", "", "", "ta123", "", "");
-        assertEquals(false, filter.matches(msg));
-    }
-
-    public void testFilterByTextRegex() {
-        LogCatFilter filter = new LogCatFilter("",
-                "", "text.*", "", "", LogLevel.VERBOSE);
-
-        /* show message with text matching filter */
-        LogCatMessage msg = new LogCatMessage(LogLevel.VERBOSE,
-                "", "", "", "", "", "text123");
-        assertEquals(true, filter.matches(msg));
-
-        msg = new LogCatMessage(LogLevel.VERBOSE,
-                "", "", "", "", "", "te123");
-        assertEquals(false, filter.matches(msg));
-    }
-
-    public void testMatchingText() {
-        LogCatMessage msg = new LogCatMessage(LogLevel.VERBOSE,
-                "", "", "", "", "",                        //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                "message with word1 and word2");       //$NON-NLS-1$
-        assertEquals(true, search("word1 with", msg)); //$NON-NLS-1$
-        assertEquals(true, search("text:w.* ", msg));  //$NON-NLS-1$
-        assertEquals(false, search("absent", msg));    //$NON-NLS-1$
-    }
-
-    public void testTagKeyword() {
-        LogCatMessage msg = new LogCatMessage(LogLevel.VERBOSE,
-                "", "", "", "tag", "",                     //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                "sample message");                     //$NON-NLS-1$
-        assertEquals(false, search("t.*", msg));       //$NON-NLS-1$
-        assertEquals(true, search("tag:t.*", msg));    //$NON-NLS-1$
-    }
-
-    public void testPidKeyword() {
-        LogCatMessage msg = new LogCatMessage(LogLevel.VERBOSE,
-                "123", "", "", "", "",                     //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                "sample message");                     //$NON-NLS-1$
-        assertEquals(false, search("123", msg));       //$NON-NLS-1$
-        assertEquals(true, search("pid:123", msg));    //$NON-NLS-1$
-    }
-
-    public void testAppNameKeyword() {
-        LogCatMessage msg = new LogCatMessage(LogLevel.VERBOSE,
-                "", "", "dalvik", "", "",                  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                "sample message");                     //$NON-NLS-1$
-        assertEquals(false, search("dalv.*", msg));    //$NON-NLS-1$
-        assertEquals(true, search("app:dal.*k", msg)); //$NON-NLS-1$
-    }
-
-    public void testCaseSensitivity() {
-        LogCatMessage msg = new LogCatMessage(LogLevel.VERBOSE,
-                "", "", "", "", "",
-                "Sample message");
-
-        // if regex has an upper case character, it should be
-        // treated as a case sensitive search
-        assertEquals(false, search("Message", msg));
-
-        // if regex is all lower case, then it should be a
-        // case insensitive search
-        assertEquals(true, search("sample", msg));
-    }
-
-    /**
-     * Helper method: search if the query string matches the message.
-     * @param query words to search for
-     * @param message text to search in
-     * @return true if the encoded query is present in message
-     */
-    private boolean search(String query, LogCatMessage message) {
-        List<LogCatFilter> filters = LogCatFilter.fromString(query,
-                LogLevel.VERBOSE);
-
-        /* all filters have to match for the query to match */
-        for (LogCatFilter f : filters) {
-            if (!f.matches(message)) {
-                return false;
-            }
-        }
-        return true;
-    }
-}
diff --git a/ddms/libs/ddmuilib/tests/src/com/android/ddmuilib/logcat/LogCatMessageParserTest.java b/ddms/libs/ddmuilib/tests/src/com/android/ddmuilib/logcat/LogCatMessageParserTest.java
deleted file mode 100644
index dfde250..0000000
--- a/ddms/libs/ddmuilib/tests/src/com/android/ddmuilib/logcat/LogCatMessageParserTest.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ddmuilib.logcat;
-
-import com.android.ddmlib.Log.LogLevel;
-
-import java.util.List;
-
-import junit.framework.TestCase;
-
-/**
- * Unit tests for {@link LogCatMessageParser}.
- */
-public final class LogCatMessageParserTest extends TestCase {
-    private List<LogCatMessage> mParsedMessages;
-
-    /** A list of messages generated with the following code:
-     * <pre>
-     * {@code
-     * Log.d("dtag", "debug message");
-     * Log.e("etag", "error message");
-     * Log.i("itag", "info message");
-     * Log.v("vtag", "verbose message");
-     * Log.w("wtag", "warning message");
-     * Log.wtf("wtftag", "wtf message");
-     * Log.d("dtag", "debug message");
-     * }
-     *  </pre>
-     *  Note: On Android 2.3, Log.wtf doesn't really generate the message.
-     *  It only produces the message header, but swallows the message tag.
-     *  This string has been modified to include the message.
-     */
-    private static final String[] MESSAGES = new String[] {
-            "[ 08-11 19:11:07.132   495:0x1ef D/dtag     ]", //$NON-NLS-1$
-            "debug message",                                 //$NON-NLS-1$
-            "[ 08-11 19:11:07.132   495:  234 E/etag     ]", //$NON-NLS-1$
-            "error message",                                 //$NON-NLS-1$
-            "[ 08-11 19:11:07.132   495:0x1ef I/itag     ]", //$NON-NLS-1$
-            "info message",                                  //$NON-NLS-1$
-            "[ 08-11 19:11:07.132   495:0x1ef V/vtag     ]", //$NON-NLS-1$
-            "verbose message",                               //$NON-NLS-1$
-            "[ 08-11 19:11:07.132   495:0x1ef W/wtag     ]", //$NON-NLS-1$
-            "warning message",                               //$NON-NLS-1$
-            "[ 08-11 19:11:07.132   495:0x1ef F/wtftag   ]", //$NON-NLS-1$
-            "wtf message",                                   //$NON-NLS-1$
-            "[ 08-11 21:15:35.7524  540:0x21c D/dtag     ]", //$NON-NLS-1$
-            "debug message",                                 //$NON-NLS-1$
-    };
-
-    @Override
-    protected void setUp() throws Exception {
-        LogCatMessageParser parser = new LogCatMessageParser();
-        mParsedMessages = parser.processLogLines(MESSAGES, new LogCatPidToNameMapper(null));
-    }
-
-    /** Check that the correct number of messages are received. */
-    public void testMessageCount() {
-        assertEquals(7, mParsedMessages.size());
-    }
-
-    /** Check the log level in a few of the parsed messages. */
-    public void testLogLevel() {
-        assertEquals(mParsedMessages.get(0).getLogLevel(), LogLevel.DEBUG);
-        assertEquals(mParsedMessages.get(5).getLogLevel(), LogLevel.ASSERT);
-    }
-
-    /** Check the parsed tag. */
-    public void testTag() {
-        assertEquals(mParsedMessages.get(1).getTag(), "etag");  //$NON-NLS-1$
-    }
-
-    /** Check the time field. */
-    public void testTime() {
-        assertEquals(mParsedMessages.get(6).getTime(), "08-11 21:15:35.7524"); //$NON-NLS-1$
-    }
-
-    /** Check the message field. */
-    public void testMessage() {
-        assertEquals(mParsedMessages.get(2).getMessage(), MESSAGES[5]);
-    }
-
-    public void testTid() {
-        assertEquals(mParsedMessages.get(0).getTid(), Integer.toString(0x1ef));
-        assertEquals(mParsedMessages.get(1).getTid(), "234");
-    }
-}
diff --git a/device_validator/dvlib/Android.mk b/device_validator/dvlib/Android.mk
index 8db8260..8d07043 100644
--- a/device_validator/dvlib/Android.mk
+++ b/device_validator/dvlib/Android.mk
@@ -15,27 +15,20 @@
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
+# The dvlib code has moved to tools/base/dvlib.
+# The rule below uses the prebuilt dvlib.jar.
+#
+# If you want to run the tests, cd to tools/base/dvlib
+# and run ./gradlew :dvlib:test
+
 LOCAL_JAVA_RESOURCE_DIRS := src/main/resources
 
 LOCAL_MODULE := dvlib
 LOCAL_MODULE_TAGS := optional
 
-include $(BUILD_HOST_JAVA_LIBRARY)
+LOCAL_PREBUILT_JAVA_LIBRARIES := \
+	../../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
+
+include $(BUILD_HOST_PREBUILT)
 
 
-# Build tests
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src/test/java)
-LOCAL_JAVA_RESOURCE_DIRS := src/test/resources
-
-LOCAL_MODULE := dvlib-tests
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_JAVA_LIBRARIES := \
-	dvlib \
-	junit
-
-include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/device_validator/dvlib/src/main/java/com/android/dvlib/DeviceSchema.java b/device_validator/dvlib/src/main/java/com/android/dvlib/DeviceSchema.java
deleted file mode 100644
index b02471b..0000000
--- a/device_validator/dvlib/src/main/java/com/android/dvlib/DeviceSchema.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 com.android.dvlib;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-
-import javax.xml.XMLConstants;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-
-public class DeviceSchema {
-
-    public static final String NS_DEVICES_XSD = "http://schemas.android.com/sdk/devices/1";
-
-    /**
-     * The "devices" element is the root element of this schema.
-     *
-     * It must contain one or more "device" elements that each define the
-     * hardware, software, and states for a given device.
-     */
-    public static final String NODE_DEVICES = "devices";
-
-    /**
-     * A "device" element contains a "hardware" element, a "software" element
-     * for each API version it supports, and a "state" element for each possible
-     * state the device could be in.
-     */
-    public static final String NODE_DEVICE = "device";
-
-    /**
-     * The "hardware" element contains all of the hardware information for a
-     * given device.
-     */
-    public static final String NODE_HARDWARE = "hardware";
-
-    /**
-     * The "software" element contains all of the software information for an
-     * API version of the given device.
-     */
-    public static final String NODE_SOFTWARE = "software";
-
-    /**
-     * The "state" element contains all of the parameters for a given state of
-     * the device. It's also capable of redefining hardware configurations if
-     * they change based on state.
-     */
-    public static final String NODE_STATE = "state";
-
-    public static final String NODE_KEYBOARD = "keyboard";
-
-    public static final String NODE_TOUCH = "touch";
-
-    public static final String NODE_GL_EXTENSIONS = "gl-extensions";
-
-    public static final String NODE_GL_VERSION = "gl-version";
-
-    public static final String NODE_NETWORKING = "networking";
-
-    public static final String NODE_REMOVABLE_STORAGE = "removable-storage";
-
-    public static final String NODE_FLASH = "flash";
-
-    public static final String NODE_LIVE_WALLPAPER_SUPPORT = "live-wallpaper-support";
-
-    public static final String NODE_STATUS_BAR = "status-bar";
-
-    public static final String NODE_BUTTONS = "buttons";
-
-    public static final String NODE_CAMERA = "camera";
-
-    public static final String NODE_LOCATION = "location";
-
-    public static final String NODE_GPU = "gpu";
-
-    public static final String NODE_DOCK = "dock";
-
-    public static final String NODE_YDPI = "ydpi";
-
-    public static final String NODE_POWER_TYPE= "power-type";
-
-    public static final String NODE_Y_DIMENSION = "y-dimension";
-
-    public static final String NODE_SCREEN_RATIO = "screen-ratio";
-
-    public static final String NODE_NAV_STATE = "nav-state";
-
-    public static final String NODE_MIC = "mic";
-
-    public static final String NODE_RAM = "ram";
-
-    public static final String NODE_XDPI = "xdpi";
-
-    public static final String NODE_DIMENSIONS = "dimensions";
-
-    public static final String NODE_ABI = "abi";
-
-    public static final String NODE_MECHANISM = "mechanism";
-
-    public static final String NODE_MULTITOUCH = "multitouch";
-
-    public static final String NODE_NAV = "nav";
-
-    public static final String NODE_PIXEL_DENSITY = "pixel-density";
-
-    public static final String NODE_SCREEN_ORIENTATION = "screen-orientation";
-
-    public static final String NODE_AUTOFOCUS = "autofocus";
-
-    public static final String NODE_SCREEN_SIZE = "screen-size";
-
-    public static final String NODE_DESCRIPTION = "description";
-
-    public static final String NODE_BLUETOOTH_PROFILES = "bluetooth-profiles";
-
-    public static final String NODE_SCREEN = "screen";
-
-    public static final String NODE_SENSORS = "sensors";
-
-    public static final String NODE_DIAGONAL_LENGTH = "diagonal-length";
-
-    public static final String NODE_SCREEN_TYPE = "screen-type";
-
-    public static final String NODE_KEYBOARD_STATE = "keyboard-state";
-
-    public static final String NODE_X_DIMENSION = "x-dimension";
-
-    public static final String NODE_CPU = "cpu";
-
-    public static final String NODE_INTERNAL_STORAGE = "internal-storage";
-
-    public static final String NODE_META = "meta";
-
-    public static final String NODE_ICONS = "icons";
-
-    public static final String NODE_SIXTY_FOUR = "sixty-four";
-
-    public static final String NODE_SIXTEEN = "sixteen";
-
-    public static final String NODE_FRAME = "frame";
-
-    public static final String NODE_PATH = "path";
-
-    public static final String NODE_PORTRAIT_X_OFFSET = "portrait-x-offset";
-
-    public static final String NODE_PORTRAIT_Y_OFFSET = "portrait-y-offset";
-
-    public static final String NODE_LANDSCAPE_X_OFFSET = "landscape-x-offset";
-
-    public static final String NODE_LANDSCAPE_Y_OFFSET = "landscape-y-offset";
-
-    public static final String NODE_NAME = "name";
-
-    public static final String NODE_API_LEVEL = "api-level";
-
-    public static final String NODE_MANUFACTURER = "manufacturer";
-
-    public static final String ATTR_DEFAULT = "default";
-
-    public static final String ATTR_UNIT = "unit";
-
-    public static final String ATTR_NAME = "name";
-
-    /**
-     * Validates the input stream.
-     *
-     * @param deviceXml
-     *            The XML InputStream to validate.
-     * @param out
-     *            The OutputStream for error messages.
-     * @param parent
-     *            The parent directory of the input stream.
-     * @return Whether the given input constitutes a valid devices file.
-     */
-    public static boolean validate(InputStream deviceXml, OutputStream out, File parent) {
-        Schema s;
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        PrintWriter writer = new PrintWriter(out);
-        try {
-            s = DeviceSchema.getSchema();
-            factory.setValidating(false);
-            factory.setNamespaceAware(true);
-            factory.setSchema(s);
-            ValidationHandler validator = new ValidationHandler(parent, writer);
-            SAXParser parser = factory.newSAXParser();
-            parser.parse(deviceXml, validator);
-            return validator.isValidDevicesFile();
-        } catch (SAXException e) {
-            writer.println(e.getMessage());
-            return false;
-        } catch (ParserConfigurationException e) {
-            writer.println("Error creating SAX parser:");
-            writer.println(e.getMessage());
-            return false;
-        } catch (IOException e) {
-            writer.println("Error reading file stream:");
-            writer.println(e.getMessage());
-            return false;
-        } finally {
-            writer.flush();
-        }
-    }
-
-    /**
-     * Helper to get an input stream of the device config XML schema.
-     */
-    public static InputStream getXsdStream() {
-        return DeviceSchema.class.getResourceAsStream("devices.xsd"); //$NON-NLS-1$
-    }
-
-    /** Helper method that returns a {@link Validator} for our XSD */
-    public static Schema getSchema() throws SAXException {
-        InputStream xsdStream = getXsdStream();
-        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
-        Schema schema = factory.newSchema(new StreamSource(xsdStream));
-        return schema;
-    }
-
-    /**
-     * A DefaultHandler that parses only to validate the XML is actually a valid
-     * devices config, since validation can't be entirely encoded in the devices
-     * schema.
-     */
-    private static class ValidationHandler extends DefaultHandler {
-        private boolean mValidDevicesFile = true;
-        private boolean mDefaultSeen = false;
-        private String mDeviceName;
-        private final File mDirectory;
-        private final PrintWriter mWriter;
-        private final StringBuilder mStringAccumulator = new StringBuilder();
-
-        public ValidationHandler(File directory, PrintWriter writer) {
-            mDirectory = directory; // Possibly null
-            mWriter = writer;
-        }
-
-        @Override
-        public void startElement(String uri, String localName, String name, Attributes attributes)
-                throws SAXException {
-            if (NODE_DEVICE.equals(localName)) {
-                // Reset for a new device
-                mDefaultSeen = false;
-            } else if (NODE_STATE.equals(localName)) {
-                // Check if the state is set to be a default state
-                String val = attributes.getValue(ATTR_DEFAULT);
-                if (val != null && ("1".equals(val) || Boolean.parseBoolean(val))) {
-                    /*
-                     * If it is and we already have a default state for this
-                     * device, then the device configuration is invalid.
-                     * Otherwise, set that we've seen a default state for this
-                     * device and continue
-                     */
-
-                    if (mDefaultSeen) {
-                        validationError("More than one default state for device " + mDeviceName);
-                    } else {
-                        mDefaultSeen = true;
-                    }
-                }
-            }
-            mStringAccumulator.setLength(0);
-        }
-
-        @Override
-        public void characters(char[] ch, int start, int length) {
-            mStringAccumulator.append(ch, start, length);
-        }
-
-        @Override
-        public void endElement(String uri, String localName, String name) throws SAXException {
-            // If this is the end of a device node, make sure we have at least
-            // one default state
-            if (NODE_DEVICE.equals(localName) && !mDefaultSeen) {
-                validationError("No default state for device " + mDeviceName);
-            } else if (NODE_NAME.equals(localName)) {
-                mDeviceName = mStringAccumulator.toString().trim();
-            } else if (NODE_PATH.equals(localName) || NODE_SIXTY_FOUR.equals(localName)
-                    || NODE_SIXTEEN.equals(localName)) {
-                if (mDirectory == null) {
-                    // There is no given parent directory, so this is not a
-                    // valid devices file
-                    validationError("No parent directory given, but relative paths exist.");
-                    return;
-                }
-                // This is going to break on any files that end with a space,
-                // but that should be an incredibly rare corner case.
-                String relativePath = mStringAccumulator.toString().trim();
-                File f = new File(mDirectory, relativePath);
-                if (f == null || !f.isFile()) {
-                    validationError(relativePath + " is not a valid path.");
-                    return;
-                }
-                String fileName = f.getName();
-                int extensionStart = fileName.lastIndexOf(".");
-                if (extensionStart == -1 || !fileName.substring(extensionStart + 1).equals("png")) {
-                    validationError(relativePath + " is not a valid file type.");
-                }
-            }
-        }
-
-        @Override
-        public void error(SAXParseException e) {
-            validationError(e.getMessage());
-        }
-
-        @Override
-        public void fatalError(SAXParseException e) {
-            validationError(e.getMessage());
-        }
-
-        public boolean isValidDevicesFile() {
-            return mValidDevicesFile;
-        }
-
-        private void validationError(String reason) {
-            mWriter.println("Error: " + reason);
-            mValidDevicesFile = false;
-        }
-
-    }
-}
diff --git a/device_validator/dvlib/src/main/resources/com/android/dvlib/devices.xsd b/device_validator/dvlib/src/main/resources/com/android/dvlib/devices.xsd
deleted file mode 100644
index d4678da..0000000
--- a/device_validator/dvlib/src/main/resources/com/android/dvlib/devices.xsd
+++ /dev/null
@@ -1,891 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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.
--->
-
-<xsd:schema
-    targetNamespace="http://schemas.android.com/sdk/devices/1"
-    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
-    xmlns:c="http://schemas.android.com/sdk/devices/1"
-    elementFormDefault="qualified"
-    attributeFormDefault="unqualified"
-    version="1">
-
-    <xsd:element name="devices" type="c:devicesType" />
-
-    <xsd:complexType name="devicesType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                The "devices" element is the root element of this schema.
-
-                It must contain one or more "device" elements that each define the configurations
-                and states available for a given device.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:sequence>
-            <xsd:element name="device" minOccurs="1" maxOccurs="unbounded">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        A device element contains one hardware profile for a device, along with
-                        1 or more software profiles and 1 or more states. Each software profile
-                        defines the supported software for a given API release, and each state
-                        profile defines a different possible state of the device (screen in
-                        portrait orientation, screen in landscape orientation with the keyboard
-                        out, etc.)
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:complexType>
-                    <xsd:sequence>
-                        <xsd:element name="name"         type= "xsd:token" />
-                        <xsd:element name="manufacturer" type= "xsd:token" />
-                        <xsd:element name="meta"         type= "c:metaType"     minOccurs="0" />
-                        <xsd:element name="hardware"     type= "c:hardwareType" />
-                        <xsd:element name="software"     type= "c:softwareType"
-                                     maxOccurs="unbounded" />
-                        <xsd:element name="state"        type= "c:stateType"
-                                     maxOccurs="unbounded" />
-                    </xsd:sequence>
-                </xsd:complexType>
-            </xsd:element>
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <xsd:complexType name="hardwareType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                The hardwareType contains all of the hardware information for
-                a given device. This includes things like the GPU type, screen
-                size, mic presence, etc.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:sequence>
-            <xsd:element name="screen"            type= "c:screenType" />
-            <xsd:element name="networking"        type= "c:networkingType" />
-            <xsd:element name="sensors"           type= "c:sensorsType" />
-            <xsd:element name="mic"               type= "c:micType" />
-            <xsd:element name="camera"            type= "c:cameraType"
-                         minOccurs="0"            maxOccurs="unbounded" />
-            <xsd:element name="keyboard"          type= "c:keyboardType" />
-            <xsd:element name="nav"               type= "c:navType" />
-            <xsd:element name="ram"               type= "c:ramType" />
-            <xsd:element name="buttons"           type= "c:buttonsType" />
-            <xsd:element name="internal-storage"  type= "c:internalStorageType" />
-            <xsd:element name="removable-storage" type= "c:removableStorageType" />
-            <xsd:element name="cpu"               type= "c:cpuType" />
-            <xsd:element name="gpu"               type= "c:gpuType" />
-            <xsd:element name="abi"               type= "c:abiType" />
-            <xsd:element name="dock"              type= "c:dockType" />
-            <xsd:element name="power-type"        type= "c:powerType" />
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <xsd:complexType name="softwareType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                The softwareType contains all of the device's software
-                information for a given API version. This includes things like
-                live wallpaper support, OpenGL version, etc.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:sequence>
-            <xsd:element name="api-level">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies which API version(s) this this element is
-                        defining. This can in the form of a single number
-                        or a range of low to high, separated with a dash and
-                        with either limit missing. The default lower limit is
-                        one, and the default upper limit is unbounded.
-                        The following are valid:
-                            10
-                            7-10
-                            -10
-                            7-
-                            -
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:token">
-                        <xsd:pattern value="[\d]*-[\d]*|[\d]+" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-            <xsd:element name="live-wallpaper-support" type="xsd:boolean">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                       Specifies whether the device supports live wallpapers.
-                    </xsd:documentation>
-                </xsd:annotation>
-            </xsd:element>
-
-            <xsd:element name="bluetooth-profiles">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies all of the available Bluetooth profiles.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:list>
-                        <xsd:simpleType>
-                            <xsd:restriction base="xsd:NMTOKEN">
-                                <xsd:enumeration value="A2DP" />
-                                <xsd:enumeration value="ATT" />
-                                <xsd:enumeration value="AVRCP" />
-                                <xsd:enumeration value="AVDTP" />
-                                <xsd:enumeration value="BIP" />
-                                <xsd:enumeration value="BPP" />
-                                <xsd:enumeration value="CIP" />
-                                <xsd:enumeration value="CTP" />
-                                <xsd:enumeration value="DIP" />
-                                <xsd:enumeration value="DUN" />
-                                <xsd:enumeration value="FAX" />
-                                <xsd:enumeration value="FTP" />
-                                <xsd:enumeration value="GAVDP" />
-                                <xsd:enumeration value="GAP" />
-                                <xsd:enumeration value="GATT" />
-                                <xsd:enumeration value="GOEP" />
-                                <xsd:enumeration value="HCRP" />
-                                <xsd:enumeration value="HDP" />
-                                <xsd:enumeration value="HFP" />
-                                <xsd:enumeration value="HID" />
-                                <xsd:enumeration value="HSP" />
-                                <xsd:enumeration value="ICP" />
-                                <xsd:enumeration value="LAP" />
-                                <xsd:enumeration value="MAP" />
-                                <xsd:enumeration value="OPP" />
-                                <xsd:enumeration value="PAN" />
-                                <xsd:enumeration value="PBA" />
-                                <xsd:enumeration value="PBAP" />
-                                <xsd:enumeration value="SPP" />
-                                <xsd:enumeration value="SDAP" />
-                                <xsd:enumeration value="SAP" />
-                                <xsd:enumeration value="SIM" />
-                                <xsd:enumeration value="rSAP" />
-                                <xsd:enumeration value="SYNCH" />
-                                <xsd:enumeration value="VDP" />
-                                <xsd:enumeration value="WAPB" />
-                            </xsd:restriction>
-                        </xsd:simpleType>
-                    </xsd:list>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="gl-version">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the OpenGL version supported for this release.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:decimal">
-                        <xsd:pattern value="[0-9]\.[0-9]" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="gl-extensions">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies all of the supported OpenGL extensions for
-                        this release.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:list itemType="xsd:NMTOKEN" />
-                </xsd:simpleType>
-            </xsd:element>
-            <xsd:element name="status-bar" type="xsd:boolean">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies whether the device has a status bar in this
-                        software configuration.
-                    </xsd:documentation>
-                </xsd:annotation>
-            </xsd:element>
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <xsd:complexType name="stateType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                The stateType contains the information for a given state of
-                of the device. States include things like portrait mode,
-                landscape with the keyboard exposed, etc. States can also
-                modify the hardware attributes of a device. For instance, if
-                sliding out the keyboard increased the available screen
-                real estate, you can define a new screenType to override the
-                default one defined in the device's hardwareType.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:sequence>
-            <xsd:element name="description" type="xsd:token">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        A description of the defined state.
-                    </xsd:documentation>
-                </xsd:annotation>
-            </xsd:element>
-
-            <xsd:element name="screen-orientation">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Defines the orientation of the screen. Use square if
-                        the device's screen has equal height and width,
-                        otherwise use landscape or portrait.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:token">
-                        <xsd:enumeration value="port" />
-                        <xsd:enumeration value="land" />
-                        <xsd:enumeration value="square" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="keyboard-state">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Defines the state of the keyboard. If the device has no
-                        keyboard use keysoft, otherwise use keysexposed or keyshidden.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:token">
-                        <xsd:enumeration value="keyssoft" />
-                        <xsd:enumeration value="keyshidden" />
-                        <xsd:enumeration value="keysexposed" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-            <xsd:element name="nav-state">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Defines the state of the primary non-touchscreen
-                        navigation hardware on the devices. If the device
-                        doesn't have non-touchscreen navigation hardware use
-                        nonav, otherwise use navexposed or navhidden.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:token">
-                        <xsd:enumeration value="nonav" />
-                        <xsd:enumeration value="navhidden" />
-                        <xsd:enumeration value="navexposed" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-            <xsd:element name="screen"            type="c:screenType" minOccurs="0" />
-            <xsd:element name="networking"        type="c:networkingType"
-                         minOccurs="0" />
-            <xsd:element name="sensors"           type="c:sensorsType" minOccurs="0" />
-            <xsd:element name="mic"               type="c:micType" minOccurs="0" />
-            <xsd:element name="camera"            type="c:cameraType"
-                         minOccurs="0"            maxOccurs="unbounded" />
-            <xsd:element name="keyboard"          type="c:keyboardType" minOccurs="0" />
-            <xsd:element name="nav"               type="c:navType" minOccurs="0" />
-            <xsd:element name="ram"               type="c:ramType" minOccurs="0" />
-            <xsd:element name="buttons"           type="c:buttonsType" minOccurs="0" />
-            <xsd:element name="internal-storage"  type="c:internalStorageType"
-                         minOccurs="0" />
-            <xsd:element name="removable-storage" type="c:removableStorageType"
-                         minOccurs="0" />
-            <xsd:element name="cpu"               type="c:cpuType" minOccurs="0" />
-            <xsd:element name="gpu"               type="c:gpuType" minOccurs="0" />
-            <xsd:element name="abi"               type="c:abiType" minOccurs="0" />
-            <xsd:element name="dock"              type="c:dockType" minOccurs="0" />
-            <xsd:element name="power-type"        type="c:powerType"
-                         minOccurs="0" />
-        </xsd:sequence>
-        <xsd:attribute name="name"    use="required" type="xsd:token" />
-        <xsd:attribute name="default" use="optional" type="xsd:boolean" />
-    </xsd:complexType>
-
-    <xsd:complexType name="metaType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Details where more device information can be found, such as
-                icons and frame images.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:sequence>
-            <xsd:element name="icons" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Contains the relative paths to the icon files for this
-                        device.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:complexType>
-                    <xsd:sequence>
-                        <xsd:element name="sixty-four" type="xsd:normalizedString">
-                            <xsd:annotation>
-                                <xsd:documentation xml:lang="en">
-                                    Relative path for the 64x64 icon.
-                                </xsd:documentation>
-                            </xsd:annotation>
-                        </xsd:element>
-                        <xsd:element name="sixteen" type="xsd:normalizedString"
-                                     minOccurs="0">
-                            <xsd:annotation>
-                                <xsd:documentation xml:lang="en">
-                                    Relative path for the 16x16 icon.
-                                </xsd:documentation>
-                            </xsd:annotation>
-                        </xsd:element>
-                    </xsd:sequence>
-                </xsd:complexType>
-            </xsd:element>
-            <xsd:element name="frame" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Contains information about the frame for the device.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:complexType>
-                    <xsd:sequence>
-                        <xsd:element name="path"
-                                     type="xsd:normalizedString">
-                            <xsd:annotation>
-                                <xsd:documentation xml:lang="en">
-                                    The relative path to the emulator frame for
-                                    the device.
-                                </xsd:documentation>
-                            </xsd:annotation>
-                        </xsd:element>
-                        <xsd:element name="portrait-x-offset"
-                                     type="xsd:nonNegativeInteger">
-                            <xsd:annotation>
-                                <xsd:documentation xml:lang="en">
-                                    The offset for the frame in the x direction,
-                                    in portrait mode.
-                                </xsd:documentation>
-                            </xsd:annotation>
-                        </xsd:element>
-                        <xsd:element name="portrait-y-offset"
-                                     type="xsd:nonNegativeInteger">
-                            <xsd:annotation>
-                                <xsd:documentation xml:lang="en">
-                                    The offset for the frame in the y direction,
-                                    in portrait mode.
-                                </xsd:documentation>
-                            </xsd:annotation>
-                        </xsd:element>
-                        <xsd:element name="landscape-x-offset"
-                                     type="xsd:nonNegativeInteger">
-                            <xsd:annotation>
-                                <xsd:documentation xml:lang="en">
-                                    The offset for the frame in the x direction,
-                                    in landscape mode.
-                                </xsd:documentation>
-                            </xsd:annotation>
-                        </xsd:element>
-                        <xsd:element name="landscape-y-offset"
-                                     type="xsd:nonNegativeInteger">
-                            <xsd:annotation>
-                                <xsd:documentation xml:lang="en">
-                                    The offset for the frame in the y direction,
-                                    in landscape mode.
-                                </xsd:documentation>
-                            </xsd:annotation>
-                        </xsd:element>
-                    </xsd:sequence>
-                </xsd:complexType>
-            </xsd:element>
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <xsd:complexType name="screenType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Contains the specifications for the device's screen.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:sequence>
-            <xsd:element name="screen-size">
-                <xsd:simpleType>
-                    <xsd:annotation>
-                        <xsd:documentation xml:lang="en">
-                            Specifies the class of the screen.
-                        </xsd:documentation>
-                    </xsd:annotation>
-                    <xsd:restriction base="xsd:token">
-                        <xsd:enumeration value="small" />
-                        <xsd:enumeration value="normal" />
-                        <xsd:enumeration value="large" />
-                        <xsd:enumeration value="xlarge" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="diagonal-length">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the diagonal length of the screen in inches.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:decimal">
-                        <!-- Negative lengths are not valid -->
-                        <xsd:minInclusive value="0" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="pixel-density">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the screen density of the device. The
-                        medium density of traditional HVGA screens (mdpi)
-                        is defined to be approximately 160dpi; low density
-                        (ldpi) is 120, and high density (hdpi) is 240. There
-                        is thus a 4:3 scaling factor between each density,
-                        so a 9x9 bitmap in ldpi would be 12x12 in mdpi and
-                        16x16 in hdpi.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:token">
-                        <xsd:enumeration value="ldpi" />
-                        <xsd:enumeration value="mdpi" />
-                        <xsd:enumeration value="tvdpi" />
-                        <xsd:enumeration value="hdpi" />
-                        <xsd:enumeration value="xhdpi" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="screen-ratio">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies whether the configuration is for a taller or
-                        wider than traditional screen. This is based purely on
-                        the aspect ratio of the screen: QVGA, HVGA, and VGA are
-                        notlong; WQVGA, WVGA, FWVGA are long. Note that long may
-                        mean either wide or tall, depending on the current
-                        orientation.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:token">
-                        <xsd:enumeration value="notlong" />
-                        <xsd:enumeration value="long" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="dimensions">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the device screen resolution in pixels.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:complexType>
-                    <xsd:sequence>
-                        <xsd:element name="x-dimension">
-                            <xsd:annotation>
-                                <xsd:documentation xml:lang="en">
-                                    Specifies the x-dimension's resolution in
-                                    pixels.
-                                </xsd:documentation>
-                            </xsd:annotation>
-                            <xsd:simpleType>
-                                <xsd:restriction base="xsd:positiveInteger" />
-                            </xsd:simpleType>
-                        </xsd:element>
-                        <xsd:element name="y-dimension">
-                            <xsd:annotation>
-                                <xsd:documentation xml:lang="en">
-                                    Specifies the y-dimension's resolution in
-                                    pixels.
-                                </xsd:documentation>
-                            </xsd:annotation>
-                            <xsd:simpleType>
-                                <xsd:restriction base="xsd:positiveInteger" />
-                            </xsd:simpleType>
-                        </xsd:element>
-                    </xsd:sequence>
-                </xsd:complexType>
-            </xsd:element>
-
-            <xsd:element name="xdpi">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the actual density in X of the device screen.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:decimal">
-                        <!-- Negative DPIs are not valid -->
-                        <xsd:minInclusive value="0" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="ydpi">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the actual density in Y of the device screen.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:decimal">
-                        <!-- Negative DPIs are not valid -->
-                        <xsd:minInclusive value="0" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="touch">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the touch properties of the device.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:complexType>
-                    <xsd:sequence>
-                        <xsd:element name="multitouch">
-                            <xsd:annotation>
-                                <xsd:documentation xml:lang="en">
-                                    Specifies the multitouch capabilities of the
-                                    device. This can be none if multitouch is
-                                    not supported, basic if the device can track
-                                    only basic two finger gestures, distinct if
-                                    the device can track two or more fingers
-                                    simultaneously, or jazz-hands if the device
-                                    can track 5 or more fingers simultaneously.
-                                </xsd:documentation>
-                            </xsd:annotation>
-                            <xsd:simpleType>
-                                <xsd:restriction base="xsd:token">
-                                    <xsd:enumeration value="none" />
-                                    <xsd:enumeration value="basic" />
-                                    <xsd:enumeration value="distinct" />
-                                    <xsd:enumeration value="jazz-hands" />
-                                </xsd:restriction>
-                            </xsd:simpleType>
-                        </xsd:element>
-
-                        <xsd:element name="mechanism">
-                            <xsd:annotation>
-                                <xsd:documentation xml:lang="en">
-                                    Specifies the mechanism the device was
-                                    created for.
-                                </xsd:documentation>
-                            </xsd:annotation>
-                            <xsd:simpleType>
-                                <xsd:restriction base="xsd:token">
-                                    <xsd:enumeration value="notouch" />
-                                    <xsd:enumeration value="stylus" />
-                                    <xsd:enumeration value="finger" />
-                                </xsd:restriction>
-                            </xsd:simpleType>
-                        </xsd:element>
-
-                        <xsd:element name="screen-type">
-                            <xsd:annotation>
-                                <xsd:documentation xml:lang="en">
-                                    Specifies the type of touch screen on the
-                                    device.
-                                </xsd:documentation>
-                            </xsd:annotation>
-                            <xsd:simpleType>
-                                <xsd:restriction base="xsd:token">
-                                    <xsd:enumeration value="notouch" />
-                                    <xsd:enumeration value="capacitive" />
-                                    <xsd:enumeration value="resistive" />
-                                </xsd:restriction>
-                            </xsd:simpleType>
-                        </xsd:element>
-                    </xsd:sequence>
-                </xsd:complexType>
-            </xsd:element>
-
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <xsd:simpleType name="networkingType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies the available networking hardware.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:list>
-            <xsd:simpleType>
-                <xsd:restriction base="xsd:token">
-                    <xsd:enumeration value="NFC" />
-                    <xsd:enumeration value="Bluetooth" />
-                    <xsd:enumeration value="Wifi" />
-                </xsd:restriction>
-            </xsd:simpleType>
-        </xsd:list>
-    </xsd:simpleType>
-
-    <xsd:simpleType name="sensorsType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies the available sensors.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:list>
-            <xsd:simpleType>
-                <xsd:restriction base="xsd:token">
-                    <xsd:enumeration value="Accelerometer" />
-                    <xsd:enumeration value="Barometer" />
-                    <xsd:enumeration value="Compass" />
-                    <xsd:enumeration value="GPS" />
-                    <xsd:enumeration value="Gyroscope" />
-                    <xsd:enumeration value="LightSensor" />
-                    <xsd:enumeration value="ProximitySensor" />
-                </xsd:restriction>
-            </xsd:simpleType>
-        </xsd:list>
-    </xsd:simpleType>
-
-    <xsd:simpleType name="micType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies whether the device has a mic or not.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:restriction base="xsd:boolean" />
-    </xsd:simpleType>
-
-    <xsd:complexType name="cameraType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies the attributes of the camera.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:sequence>
-            <xsd:element name="location">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the location of the camera.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:token">
-                        <xsd:enumeration value="front" />
-                        <xsd:enumeration value="back" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="autofocus" type="xsd:boolean">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies whether the camera can autofocus
-                    </xsd:documentation>
-                </xsd:annotation>
-            </xsd:element>
-
-            <xsd:element name="flash" type="xsd:boolean">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies whether the camera has flash.
-                    </xsd:documentation>
-                </xsd:annotation>
-            </xsd:element>
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <xsd:simpleType name="keyboardType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies the type of keyboard on the device.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:restriction base="xsd:token">
-            <xsd:enumeration value="qwerty" />
-            <xsd:enumeration value="12key"  />
-            <xsd:enumeration value="nokeys" />
-        </xsd:restriction>
-    </xsd:simpleType>
-
-    <xsd:simpleType name="navType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies the primary non-touchscreen navigation
-                hardware on the device.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:restriction base="xsd:token">
-            <xsd:enumeration value="dpad" />
-            <xsd:enumeration value="trackball" />
-            <xsd:enumeration value="wheel" />
-            <xsd:enumeration value="nonav" />
-        </xsd:restriction>
-    </xsd:simpleType>
-
-    <xsd:complexType name="ramType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies the amount of RAM on the device in the unit provided.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:simpleContent>
-            <xsd:extension base="xsd:positiveInteger">
-                <xsd:attribute name="unit" type="c:storageUnitType" use="required" />
-            </xsd:extension>
-        </xsd:simpleContent>
-    </xsd:complexType>
-
-    <xsd:simpleType name="buttonsType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies whether the device has physical (hard) buttons
-                (Home, Search, etc.), or uses soft buttons.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:restriction base="xsd:token">
-            <xsd:enumeration value="hard" />
-            <xsd:enumeration value="soft" />
-        </xsd:restriction>
-    </xsd:simpleType>
-
-    <xsd:complexType name="internalStorageType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                A list specifying the sizes of internal storage in
-                the device, in the storage size unit provided.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:simpleContent>
-            <xsd:extension base="c:storageListType">
-                <xsd:attribute name="unit" type="c:storageUnitType"
-                               use="required" />
-            </xsd:extension>
-        </xsd:simpleContent>
-    </xsd:complexType>
-
-    <xsd:complexType name="removableStorageType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies the range of available removable storage sizes
-                in the unit provided. A positive value indicates the device is
-                available with that storage size included while a zero value
-                indicates an empty storage slot.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:simpleContent>
-            <xsd:extension base="c:storageListType">
-                <xsd:attribute name="unit" type="c:storageUnitType"
-                               use="required" />
-            </xsd:extension>
-        </xsd:simpleContent>
-    </xsd:complexType>
-
-    <xsd:simpleType name="storageListType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Defines a list for storage configurations such as internal or
-                removable storage. A positive value indicates the the device
-                has a storage unit of that size, while a zero value indicates
-                there is an empty location for a storage unit (such as an empty
-                SD card slot).
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:list>
-            <xsd:simpleType>
-                <xsd:restriction base="xsd:nonNegativeInteger" />
-            </xsd:simpleType>
-        </xsd:list>
-    </xsd:simpleType>
-    <xsd:simpleType name="gpuType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies the device's GPU.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:restriction base="xsd:token">
-            <xsd:minLength value="1" />
-        </xsd:restriction>
-    </xsd:simpleType>
-
-    <xsd:simpleType name="cpuType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies the device's CPU.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:restriction base="xsd:token">
-            <xsd:minLength value="1" />
-        </xsd:restriction>
-    </xsd:simpleType>
-
-    <xsd:simpleType name="abiType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies which ABIs the device conforms to.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:list>
-            <xsd:simpleType>
-                <xsd:restriction base="xsd:token">
-                    <xsd:enumeration value="armeabi" />
-                    <xsd:enumeration value="armeabi-v7a" />
-                    <xsd:enumeration value="x86" />
-                    <xsd:enumeration value="mips" />
-                </xsd:restriction>
-            </xsd:simpleType>
-        </xsd:list>
-    </xsd:simpleType>
-
-    <xsd:simpleType name="dockType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies the official docks available for the device.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:list>
-            <xsd:simpleType>
-                <xsd:restriction base="xsd:token">
-                    <xsd:enumeration value="desk" />
-                    <xsd:enumeration value="television" />
-                    <xsd:enumeration value="car" />
-                </xsd:restriction>
-            </xsd:simpleType>
-        </xsd:list>
-    </xsd:simpleType>
-
-    <xsd:simpleType name="powerType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies whether the device is plugged in.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:restriction base="xsd:token">
-            <xsd:enumeration value="plugged-in" />
-            <xsd:enumeration value="battery" />
-        </xsd:restriction>
-    </xsd:simpleType>
-
-    <xsd:simpleType name="storageUnitType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                Specifies the unit of storage. This can be MiB, GiB, etc.
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:restriction base="xsd:token">
-            <xsd:enumeration value="B" />
-            <xsd:enumeration value="KiB" />
-            <xsd:enumeration value="MiB" />
-            <xsd:enumeration value="GiB" />
-            <xsd:enumeration value="TiB" />
-        </xsd:restriction>
-    </xsd:simpleType>
-
-</xsd:schema>
diff --git a/device_validator/dvlib/src/test/java/com/android/dvlib/DeviceSchemaTest.java b/device_validator/dvlib/src/test/java/com/android/dvlib/DeviceSchemaTest.java
deleted file mode 100644
index de70ef3..0000000
--- a/device_validator/dvlib/src/test/java/com/android/dvlib/DeviceSchemaTest.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.dvlib;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Stack;
-
-import javax.xml.XMLConstants;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import junit.framework.TestCase;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-
-public class DeviceSchemaTest extends TestCase {
-
-    private void checkFailure(Map<String, String> replacements, String regex) throws Exception {
-        // Generate XML stream with replacements
-        InputStream xmlStream = getReplacedStream(replacements);
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        assertFalse(
-                "Validation Assertion Failed, XML failed to validate when it was expected to pass\n",
-                DeviceSchema.validate(xmlStream, baos, null));
-        assertTrue(String.format("Regex Assertion Failed:\nExpected: %s\nActual: %s\n", regex, baos
-                .toString().trim()), baos.toString().trim().matches(regex));
-    }
-
-    private void checkFailure(String resource, String regex) throws Exception {
-        InputStream xml = DeviceSchemaTest.class.getResourceAsStream(resource);
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        assertFalse("Validation Assertion Failed, XML validated when it was expected to fail\n",
-                DeviceSchema.validate(xml, baos, null));
-        assertTrue(String.format("Regex Assertion Failed:\nExpected: %s\nActual: %s\n", regex, baos
-                .toString().trim()), baos.toString().trim().matches(regex));
-    }
-
-    private void checkSuccess(Map<String, String> replacements) throws Exception {
-        InputStream xmlStream = getReplacedStream(replacements);
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        assertTrue(DeviceSchema.validate(xmlStream, baos, null));
-        assertTrue(baos.toString().trim().matches(""));
-    }
-
-    public static InputStream getReplacedStream(Map<String, String> replacements) throws Exception {
-        InputStream xml = DeviceSchema.class.getResourceAsStream("devices_minimal.xml");
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        factory.setNamespaceAware(true);
-        SAXParser parser = factory.newSAXParser();
-        ReplacementHandler replacer = new ReplacementHandler(replacements);
-        parser.parse(xml, replacer);
-        Document doc = replacer.getGeneratedDocument();
-        Transformer tf = TransformerFactory.newInstance().newTransformer();
-        // Add indents so we're closer to user generated output
-        tf.setOutputProperty(OutputKeys.INDENT, "yes");
-        DOMSource source = new DOMSource(doc);
-        StringWriter out = new StringWriter();
-        StreamResult result = new StreamResult(out);
-        tf.transform(source, result);
-        return new ByteArrayInputStream(out.toString().getBytes("UTF-8"));
-    }
-
-    public void testValidXml() throws Exception {
-        InputStream xml = DeviceSchemaTest.class.getResourceAsStream("devices.xml");
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        boolean result = DeviceSchema.validate(xml, baos, null);
-        String output = baos.toString().trim();
-        assertTrue(
-                String.format(
-                        "Validation Assertion Failed, XML failed to validate when it was expected to pass\n%s\n",output), result);
-        assertTrue(String.format("Regex Assertion Failed\nExpected No Output\nActual: %s\n", baos
-                .toString().trim()), baos.toString().trim().matches(""));
-    }
-
-    public void testNoHardware() throws Exception {
-        String regex = "Error: cvc-complex-type.2.4.a: Invalid content was found starting with "
-                + "element 'd:software'.*";
-        checkFailure("devices_no_hardware.xml", regex);
-    }
-
-    public void testNoSoftware() throws Exception {
-        String regex = "Error: cvc-complex-type.2.4.a: Invalid content was found starting with "
-                + "element 'd:state'.*";
-        checkFailure("devices_no_software.xml", regex);
-    }
-
-    public void testNoDefault() throws Exception {
-        String regex = "Error: No default state for device Galaxy Nexus.*";
-        checkFailure("devices_no_default.xml", regex);
-    }
-
-    public void testTooManyDefaults() throws Exception {
-        String regex = "Error: More than one default state for device Galaxy Nexus.*";
-        checkFailure("devices_too_many_defaults.xml", regex);
-    }
-
-    public void testNoStates() throws Exception {
-        String regex = "Error: cvc-complex-type.2.4.b: The content of element 'd:device' is not "
-                + "complete.*\nError: No default state for device Galaxy Nexus.*";
-        checkFailure("devices_no_states.xml", regex);
-    }
-
-    public void testBadMechanism() throws Exception {
-        Map<String, String> replacements = new HashMap<String, String>();
-        replacements.put(DeviceSchema.NODE_MECHANISM, "fanger");
-        checkFailure(replacements, "Error: cvc-enumeration-valid: Value 'fanger' is not "
-                + "facet-valid.*\nError: cvc-type.3.1.3: The value 'fanger' of element "
-                + "'d:mechanism' is not valid.*");
-    }
-
-    public void testNegativeXdpi() throws Exception {
-        Map<String, String> replacements = new HashMap<String, String>();
-        replacements.put(DeviceSchema.NODE_XDPI, "-1.0");
-        checkFailure(replacements, "Error: cvc-minInclusive-valid: Value '-1.0'.*\n"
-                + "Error: cvc-type.3.1.3: The value '-1.0' of element 'd:xdpi' is not valid.*");
-    }
-
-    public void testNegativeYdpi() throws Exception {
-        Map<String, String> replacements = new HashMap<String, String>();
-        replacements.put(DeviceSchema.NODE_YDPI, "-1");
-        checkFailure(replacements, "Error: cvc-minInclusive-valid: Value '-1'.*\n"
-                + "Error: cvc-type.3.1.3: The value '-1' of element 'd:ydpi' is not valid.*");
-
-    }
-
-    public void testNegativeDiagonalLength() throws Exception {
-        Map<String, String> replacements = new HashMap<String, String>();
-        replacements.put(DeviceSchema.NODE_DIAGONAL_LENGTH, "-1.0");
-
-        checkFailure(replacements, "Error: cvc-minInclusive-valid: Value '-1.0'.*\n"
-                + "Error: cvc-type.3.1.3: The value '-1.0' of element 'd:diagonal-length'.*");
-
-    }
-
-    public void testInvalidOpenGLVersion() throws Exception {
-        Map<String, String> replacements = new HashMap<String, String>();
-        replacements.put(DeviceSchema.NODE_GL_VERSION, "2");
-        checkFailure(replacements, "Error: cvc-pattern-valid: Value '2' is not facet-valid.*\n"
-                + "Error: cvc-type.3.1.3: The value '2' of element 'd:gl-version' is not valid.*");
-    }
-
-    public void testEmptyOpenGLExtensions() throws Exception {
-        Map<String, String> replacements = new HashMap<String, String>();
-        replacements.put(DeviceSchema.NODE_GL_EXTENSIONS, "");
-        checkSuccess(replacements);
-    }
-
-    public void testEmptySensors() throws Exception {
-        Map<String, String> replacements = new HashMap<String, String>();
-        replacements.put(DeviceSchema.NODE_SENSORS, "");
-        checkSuccess(replacements);
-    }
-
-    public void testEmptyNetworking() throws Exception {
-        Map<String, String> replacements = new HashMap<String, String>();
-        replacements.put(DeviceSchema.NODE_NETWORKING, "");
-        checkSuccess(replacements);
-    }
-
-    public void testEmptyCpu() throws Exception {
-        Map<String, String> replacements = new HashMap<String, String>();
-        replacements.put(DeviceSchema.NODE_CPU, "");
-        checkFailure(replacements, "Error: cvc-minLength-valid: Value '' with length = '0'.*\n"
-                + "Error: cvc-type.3.1.3: The value '' of element 'd:cpu' is not valid.*");
-    }
-
-    public void testEmptyGpu() throws Exception {
-        Map<String, String> replacements = new HashMap<String, String>();
-        replacements.put(DeviceSchema.NODE_GPU, "");
-        checkFailure(replacements, "Error: cvc-minLength-valid: Value '' with length = '0'.*\n"
-                + "Error: cvc-type.3.1.3: The value '' of element 'd:gpu' is not valid.*");
-    }
-
-    /**
-     * Reads in a valid devices XML file and if an element tag is in the
-     * replacements map, it replaces its text content with the corresponding
-     * value. Note this has no concept of namespaces or hierarchy, so it will
-     * replace the contents any and all elements with the specified tag name.
-     */
-    private static class ReplacementHandler extends DefaultHandler {
-        private Element mCurrElement = null;
-        private Document mDocument;
-        private final Stack<Element> mElementStack = new Stack<Element>();
-        private final Map<String, String> mPrefixes = new HashMap<String, String>();
-        private final Map<String, String> mReplacements;
-        private final StringBuilder mStringAccumulator = new StringBuilder();
-
-        public ReplacementHandler(Map<String, String> replacements) {
-            mReplacements = replacements;
-        }
-
-        @Override
-        public void startDocument() {
-            try {
-                mDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
-            } catch (ParserConfigurationException e) {
-                fail(e.getMessage());
-            }
-        }
-
-        @Override
-        public void startElement(String uri, String localName, String name, Attributes attributes) {
-            Element element = mDocument.createElement(name);
-            for (int i = 0; i < attributes.getLength(); i++) {
-                element.setAttribute(attributes.getQName(i), attributes.getValue(i));
-            }
-            for (String key : mPrefixes.keySet()) {
-                element.setAttribute(XMLConstants.XMLNS_ATTRIBUTE + ":" + key, mPrefixes.get(key));
-            }
-            mPrefixes.clear();
-            if (mCurrElement != null) {
-                mElementStack.push(mCurrElement);
-            }
-            mCurrElement = element;
-        }
-
-        @Override
-        public void startPrefixMapping(String prefix, String uri) throws SAXException {
-            mPrefixes.put(prefix, uri);
-        }
-
-        @Override
-        public void characters(char[] ch, int start, int length) {
-            mStringAccumulator.append(ch, start, length);
-        }
-
-        @Override
-        public void endElement(String uri, String localName, String name) throws SAXException {
-            if (mReplacements.containsKey(localName)) {
-                mCurrElement.appendChild(mDocument.createTextNode(mReplacements.get(localName)));
-            } else {
-                String content = mStringAccumulator.toString().trim();
-                if (!content.isEmpty()) {
-                    mCurrElement.appendChild(mDocument.createTextNode(content));
-                }
-            }
-
-            if (mElementStack.empty()) {
-                mDocument.appendChild(mCurrElement);
-                mCurrElement = null;
-            } else {
-                Element parent = mElementStack.pop();
-                parent.appendChild(mCurrElement);
-                mCurrElement = parent;
-            }
-            mStringAccumulator.setLength(0);
-        }
-
-        @Override
-        public void error(SAXParseException e) {
-            fail(e.getMessage());
-        }
-
-        @Override
-        public void fatalError(SAXParseException e) {
-            fail(e.getMessage());
-        }
-
-        public Document getGeneratedDocument() {
-            return mDocument;
-        }
-
-    }
-}
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices.xml b/device_validator/dvlib/src/test/resources/com/android/dvlib/devices.xml
deleted file mode 100644
index 6662099..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices.xml
+++ /dev/null
@@ -1,273 +0,0 @@
-<?xml version="1.0"?>
-<d:devices
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:d="http://schemas.android.com/sdk/devices/1">
-
-    <d:device>
-        <d:name>
-            Galaxy Nexus
-        </d:name>
-        <d:manufacturer>
-            Samsung
-        </d:manufacturer>
-        <d:hardware>
-            <d:screen>
-                <d:screen-size>normal</d:screen-size>
-                <d:diagonal-length>4.65</d:diagonal-length> <!-- In inches -->
-                <d:pixel-density>xhdpi</d:pixel-density>
-                <d:screen-ratio>long</d:screen-ratio>
-                <d:dimensions>
-                    <d:x-dimension>720</d:x-dimension>
-                    <d:y-dimension>1280</d:y-dimension>
-                </d:dimensions>
-                <d:xdpi>316</d:xdpi>
-                <d:ydpi>316</d:ydpi>
-                <d:touch>
-                    <d:multitouch>jazz-hands</d:multitouch>
-                    <d:mechanism>finger</d:mechanism>
-                    <d:screen-type>capacitive</d:screen-type>
-                </d:touch>
-            </d:screen>
-            <d:networking>
-                Bluetooth
-                Wifi
-                NFC
-            </d:networking>
-            <d:sensors>
-                Accelerometer
-                Barometer
-                Gyroscope
-                Compass
-                GPS
-                ProximitySensor
-            </d:sensors>
-            <d:mic>true</d:mic>
-            <d:camera>
-                <d:location>front</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>false</d:flash>
-            </d:camera>
-            <d:camera>
-                <d:location>back</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>true</d:flash>
-            </d:camera>
-            <d:keyboard>nokeys</d:keyboard>
-            <d:nav>nonav</d:nav>
-            <d:ram unit="GiB">1</d:ram>
-            <d:buttons>soft</d:buttons>
-            <d:internal-storage unit="GiB">16</d:internal-storage>
-            <d:removable-storage unit="KiB"></d:removable-storage>
-            <d:cpu>OMAP 4460</d:cpu> <!-- cpu type (Tegra3) freeform -->
-            <d:gpu>PowerVR SGX540</d:gpu>
-            <d:abi>
-                armeabi
-                armeabi-v7a
-            </d:abi>
-            <!--dock (car, desk, tv, none)-->
-            <d:dock>
-            </d:dock>
-            <!-- plugged in (never, charge, always) -->
-            <d:power-type>battery</d:power-type>
-        </d:hardware>
-        <d:software>
-            <d:api-level>14-</d:api-level>
-            <d:live-wallpaper-support>true</d:live-wallpaper-support>
-            <d:bluetooth-profiles>
-                HSP
-                HFP
-                SPP
-                A2DP
-                AVRCP
-                OPP
-                PBAP
-                GAVDP
-                AVDTP
-                HID
-                HDP
-                PAN
-            </d:bluetooth-profiles>
-            <d:gl-version>2.0</d:gl-version>
-            <!--
-             These can be gotten via
-             javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);
-            -->
-            <d:gl-extensions>
-                GL_EXT_discard_framebuffer
-                GL_EXT_multi_draw_arrays
-                GL_EXT_shader_texture_lod
-                GL_EXT_texture_format_BGRA8888
-                GL_IMG_multisampled_render_to_texture
-                GL_IMG_program_binary
-                GL_IMG_read_format
-                GL_IMG_shader_binary
-                GL_IMG_texture_compression_pvrtc
-                GL_IMG_texture_format_BGRA8888
-                GL_IMG_texture_npot
-                GL_OES_compressed_ETC1_RGB8_texture
-                GL_OES_depth_texture
-                GL_OES_depth24
-                GL_OES_EGL_image
-                GL_OES_EGL_image_external
-                GL_OES_egl_sync
-                GL_OES_element_index_uint
-                GL_OES_fragment_precision_high
-                GL_OES_get_program_binary
-                GL_OES_mapbuffer
-                GL_OES_packed_depth_stencil
-                GL_OES_required_internalformat
-                GL_OES_rgb8_rgba8
-                GL_OES_standard_derivatives
-                GL_OES_texture_float
-                GL_OES_texture_half_float
-                GL_OES_vertex_array_object
-                GL_OES_vertex_half_float
-            </d:gl-extensions>
-            <d:status-bar>true</d:status-bar>
-        </d:software>
-        <d:state name="Portrait" default="true">
-            <d:description>The phone in portrait view</d:description>
-            <d:screen-orientation>port</d:screen-orientation>
-            <d:keyboard-state>keyssoft</d:keyboard-state>
-            <d:nav-state>nonav</d:nav-state>
-        </d:state>
-        <d:state name="Landscape">
-            <d:description>The phone in landscape view</d:description>
-            <d:screen-orientation>land</d:screen-orientation>
-            <d:keyboard-state>keyssoft</d:keyboard-state>
-            <d:nav-state>nonav</d:nav-state>
-        </d:state>
-    </d:device>
-    <d:device>
-        <d:name>Droid</d:name>
-        <d:manufacturer>Motorola</d:manufacturer>
-        <d:hardware>
-            <d:screen>
-                <d:screen-size>normal</d:screen-size>
-                <d:diagonal-length>3.7</d:diagonal-length>
-                <d:pixel-density>hdpi</d:pixel-density>
-                <d:screen-ratio>long</d:screen-ratio>
-                <d:dimensions>
-                    <d:x-dimension>480</d:x-dimension>
-                    <d:y-dimension>854</d:y-dimension>
-                </d:dimensions>
-                <d:xdpi>265</d:xdpi>
-                <d:ydpi>265</d:ydpi>
-                <d:touch>
-                    <d:multitouch>distinct</d:multitouch>
-                    <d:mechanism>finger</d:mechanism>
-                    <d:screen-type>capacitive</d:screen-type>
-                </d:touch>
-            </d:screen>
-            <d:networking>
-                Bluetooth
-                Wifi
-                NFC
-            </d:networking>
-            <d:sensors>
-                Accelerometer
-                Barometer
-                Compass
-                GPS
-                ProximitySensor
-                LightSensor
-            </d:sensors>
-            <d:mic>true</d:mic>
-            <d:camera>
-                <d:location>back</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>true</d:flash>
-            </d:camera>
-            <d:keyboard>qwerty</d:keyboard>
-            <d:nav>dpad</d:nav>
-            <d:ram unit="MiB">256</d:ram>
-            <d:buttons>hard</d:buttons>
-            <d:internal-storage unit="MiB">512</d:internal-storage>
-            <d:removable-storage unit="GiB">16</d:removable-storage>
-            <d:cpu>OMAP 3430</d:cpu>
-            <d:gpu>PowerVR SGX 53</d:gpu>
-            <d:abi>
-                armeabi
-                armeabi-v7a
-            </d:abi>
-            <d:dock>
-                car
-                desk
-            </d:dock>
-            <d:power-type>battery</d:power-type>
-        </d:hardware>
-        <d:software>
-            <d:api-level>5-8</d:api-level>
-            <d:live-wallpaper-support>false</d:live-wallpaper-support>
-            <d:bluetooth-profiles>
-                GAP
-                SPP
-                HSP
-                HFP
-                A2DP
-                AVRCP
-                SDAP
-            </d:bluetooth-profiles>
-            <d:gl-version>1.1</d:gl-version>
-            <!--
-             These can be gotten via
-             javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);
-            -->
-            <d:gl-extensions>
-                GL_OES_byte_coordinates
-                GL_OES_fixed_point
-                GL_OES_single_precision
-                GL_OES_matrix_get
-                GL_OES_read_format
-                GL_OES_compressed_paletted_texture
-                GL_OES_point_sprite
-                GL_OES_point_size_array
-                GL_OES_matrix_palette
-                GL_OES_draw_texture
-                GL_OES_query_matrix
-                GL_OES_texture_env_crossbar
-                GL_OES_texture_mirrored_repeat
-                GL_OES_texture_cube_map
-                GL_OES_blend_subtract
-                GL_OES_blend_func_separate
-                GL_OES_blend_equation_separate
-                GL_OES_stencil_wrap
-                GL_OES_extended_matrix_palette
-                GL_OES_framebuffer_object
-                GL_OES_rgb8_rgba8
-                GL_OES_depth24
-                GL_OES_stencil8
-                GL_OES_compressed_ETC1_RGB8_texture
-                GL_OES_mapbuffer
-                GL_OES_EGL_image
-                GL_EXT_multi_draw_arrays
-                GL_OES_required_internalformat
-                GL_IMG_read_format
-                GL_IMG_texture_compression_pvrtc
-                GL_IMG_texture_format_BGRA8888
-                GL_EXT_texture_format_BGRA8888
-                GL_IMG_texture_stream
-                GL_IMG_vertex_program
-            </d:gl-extensions>
-            <d:status-bar>true</d:status-bar>
-        </d:software>
-        <d:state name="Portrait" default="true">
-            <d:description>The phone in portrait view</d:description>
-            <d:screen-orientation>port</d:screen-orientation>
-            <d:keyboard-state>keyshidden</d:keyboard-state>
-            <d:nav-state>navhidden</d:nav-state>
-        </d:state>
-        <d:state name="Landscape, closed">
-            <d:description>The phone in landscape view with the keyboard closed</d:description>
-            <d:screen-orientation>land</d:screen-orientation>
-            <d:keyboard-state>keyshidden</d:keyboard-state>
-            <d:nav-state>navhidden</d:nav-state>
-        </d:state>
-        <d:state name="Landscape, open">
-            <d:description>The phone in landscape view with the keyboard open</d:description>
-            <d:screen-orientation>land</d:screen-orientation>
-            <d:keyboard-state>keysexposed</d:keyboard-state>
-            <d:nav-state>navexposed</d:nav-state>
-        </d:state>
-    </d:device>
-</d:devices>
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_minimal.xml b/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_minimal.xml
deleted file mode 100644
index e063fd1..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_minimal.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version="1.0"?>
-<d:devices
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:d="http://schemas.android.com/sdk/devices/1">
-
-    <d:device>
-        <d:name>
-            Galaxy Nexus
-        </d:name>
-        <d:manufacturer>
-            Samsung
-        </d:manufacturer>
-        <d:hardware>
-            <d:screen>
-                <d:screen-size>normal</d:screen-size>
-                <d:diagonal-length>4.65</d:diagonal-length> <!-- In inches -->
-                <d:pixel-density>xhdpi</d:pixel-density>
-                <d:screen-ratio>long</d:screen-ratio>
-                <d:dimensions>
-                    <d:x-dimension>720</d:x-dimension>
-                    <d:y-dimension>1280</d:y-dimension>
-                </d:dimensions>
-                <d:xdpi>316</d:xdpi>
-                <d:ydpi>316</d:ydpi>
-                <d:touch>
-                    <d:multitouch>jazz-hands</d:multitouch>
-                    <d:mechanism>finger</d:mechanism>
-                    <d:screen-type>capacitive</d:screen-type>
-                </d:touch>
-            </d:screen>
-            <d:networking>
-                Bluetooth
-                Wifi
-                NFC
-            </d:networking>
-            <d:sensors>
-                Accelerometer
-                Barometer
-                Gyroscope
-                Compass
-                GPS
-                ProximitySensor
-            </d:sensors>
-            <d:mic>true</d:mic>
-            <d:camera>
-                <d:location>front</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>false</d:flash>
-            </d:camera>
-            <d:camera>
-                <d:location>back</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>true</d:flash>
-            </d:camera>
-            <d:keyboard>nokeys</d:keyboard>
-            <d:nav>nonav</d:nav>
-            <d:ram unit="GiB">1</d:ram>
-            <d:buttons>soft</d:buttons>
-            <d:internal-storage unit="GiB">16</d:internal-storage>
-            <d:removable-storage unit="KiB"></d:removable-storage>
-            <d:cpu>OMAP 4460</d:cpu> <!-- cpu type (Tegra3) freeform -->
-            <d:gpu>PowerVR SGX540</d:gpu>
-            <d:abi>
-                armeabi
-                armeabi-v7a
-            </d:abi>
-            <!--dock (car, desk, tv, none)-->
-            <d:dock></d:dock>
-            <d:power-type>battery</d:power-type>
-        </d:hardware>
-        <d:software>
-            <d:api-level>15</d:api-level>
-            <d:live-wallpaper-support>true</d:live-wallpaper-support>
-            <d:bluetooth-profiles>
-                HSP
-                HFP
-                SPP
-                A2DP
-                AVRCP
-                OPP
-                PBAP
-                GAVDP
-                AVDTP
-                HID
-                HDP
-                PAN
-            </d:bluetooth-profiles>
-            <d:gl-version>2.0</d:gl-version>
-            <d:gl-extensions>
-                GL_EXT_discard_framebuffer
-                GL_EXT_multi_draw_arrays
-                GL_EXT_shader_texture_lod
-                GL_EXT_texture_format_BGRA8888
-                GL_IMG_multisampled_render_to_texture
-                GL_IMG_program_binary
-                GL_IMG_read_format
-                GL_IMG_shader_binary
-                GL_IMG_texture_compression_pvrtc
-                GL_IMG_texture_format_BGRA8888
-                GL_IMG_texture_npot
-                GL_OES_compressed_ETC1_RGB8_texture
-                GL_OES_depth_texture
-                GL_OES_depth24
-                GL_OES_EGL_image
-                GL_OES_EGL_image_external
-                GL_OES_egl_sync
-                GL_OES_element_index_uint
-                GL_OES_fragment_precision_high
-                GL_OES_get_program_binary
-                GL_OES_mapbuffer
-                GL_OES_packed_depth_stencil
-                GL_OES_required_internalformat
-                GL_OES_rgb8_rgba8
-                GL_OES_standard_derivatives
-                GL_OES_texture_float
-                GL_OES_texture_half_float
-                GL_OES_vertex_array_object
-                GL_OES_vertex_half_float
-            </d:gl-extensions>
-            <d:status-bar>true</d:status-bar>
-        </d:software>
-        <d:state name="Portrait" default="true">
-            <d:description>The phone in portrait view</d:description>
-            <d:screen-orientation>port</d:screen-orientation>
-            <d:keyboard-state>keyssoft</d:keyboard-state>
-            <d:nav-state>nonav</d:nav-state>
-        </d:state>
-        <d:state name="Landscape">
-            <d:description>The phone in landscape view</d:description>
-            <d:screen-orientation>land</d:screen-orientation>
-            <d:keyboard-state>keyssoft</d:keyboard-state>
-            <d:nav-state>nonav</d:nav-state>
-        </d:state>
-    </d:device>
-</d:devices>
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_no_default.xml b/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_no_default.xml
deleted file mode 100644
index 605a6c1..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_no_default.xml
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version="1.0"?>
-<d:devices
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:d="http://schemas.android.com/sdk/devices/1">
-
-    <d:device>
-        <d:name>
-            Galaxy Nexus
-        </d:name>
-        <d:manufacturer>
-            Samsung
-        </d:manufacturer>
-        <d:hardware>
-            <d:screen>
-                <d:screen-size>normal</d:screen-size>
-                <d:diagonal-length>4.65</d:diagonal-length> <!-- In inches -->
-                <d:pixel-density>xhdpi</d:pixel-density>
-                <d:screen-ratio>long</d:screen-ratio>
-                <d:dimensions>
-                    <d:x-dimension>720</d:x-dimension>
-                    <d:y-dimension>1280</d:y-dimension>
-                </d:dimensions>
-                <d:xdpi>316</d:xdpi>
-                <d:ydpi>316</d:ydpi>
-                <d:touch>
-                    <d:multitouch>jazz-hands</d:multitouch>
-                    <d:mechanism>finger</d:mechanism>
-                    <d:screen-type>capacitive</d:screen-type>
-                </d:touch>
-            </d:screen>
-            <d:networking>
-                Bluetooth
-                Wifi
-                NFC
-            </d:networking>
-            <d:sensors>
-                Accelerometer
-                Barometer
-                Gyroscope
-                Compass
-                GPS
-                ProximitySensor
-            </d:sensors>
-            <d:mic>true</d:mic>
-            <d:camera>
-                <d:location>front</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>false</d:flash>
-            </d:camera>
-            <d:camera>
-                <d:location>back</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>true</d:flash>
-            </d:camera>
-            <d:keyboard>nokeys</d:keyboard>
-            <d:nav>nonav</d:nav>
-            <d:ram unit="GiB">1</d:ram>
-            <d:buttons>soft</d:buttons>
-            <d:internal-storage unit="GiB">16</d:internal-storage>
-            <d:removable-storage unit="KiB"></d:removable-storage>
-            <d:cpu>OMAP 4460</d:cpu> <!-- cpu type (Tegra3) freeform -->
-            <d:gpu>PowerVR SGX540</d:gpu>
-            <d:abi>
-                armeabi
-                armeabi-v7a
-            </d:abi>
-            <!--dock (car, desk, tv, none)-->
-            <d:dock>
-            </d:dock>
-            <d:power-type>battery</d:power-type>
-        </d:hardware>
-        <d:software>
-            <d:api-level>14</d:api-level>
-            <d:live-wallpaper-support>true</d:live-wallpaper-support>
-            <d:bluetooth-profiles>
-                HSP
-                HFP
-                SPP
-                A2DP
-                AVRCP
-                OPP
-                PBAP
-                GAVDP
-                AVDTP
-                HID
-                HDP
-                PAN
-            </d:bluetooth-profiles>
-            <d:gl-version>2.0</d:gl-version>
-            <!--
-             These can be gotten via
-             javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);
-            -->
-            <d:gl-extensions>
-                GL_EXT_discard_framebuffer
-                GL_EXT_multi_draw_arrays
-                GL_EXT_shader_texture_lod
-                GL_EXT_texture_format_BGRA8888
-                GL_IMG_multisampled_render_to_texture
-                GL_IMG_program_binary
-                GL_IMG_read_format
-                GL_IMG_shader_binary
-                GL_IMG_texture_compression_pvrtc
-                GL_IMG_texture_format_BGRA8888
-                GL_IMG_texture_npot
-                GL_OES_compressed_ETC1_RGB8_texture
-                GL_OES_depth_texture
-                GL_OES_depth24
-                GL_OES_EGL_image
-                GL_OES_EGL_image_external
-                GL_OES_egl_sync
-                GL_OES_element_index_uint
-                GL_OES_fragment_precision_high
-                GL_OES_get_program_binary
-                GL_OES_mapbuffer
-                GL_OES_packed_depth_stencil
-                GL_OES_required_internalformat
-                GL_OES_rgb8_rgba8
-                GL_OES_standard_derivatives
-                GL_OES_texture_float
-                GL_OES_texture_half_float
-                GL_OES_vertex_array_object
-                GL_OES_vertex_half_float
-            </d:gl-extensions>
-            <d:status-bar>true</d:status-bar>
-        </d:software>
-        <d:state name="Portrait">
-            <d:description>The phone in portrait view</d:description>
-            <d:screen-orientation>port</d:screen-orientation>
-            <d:keyboard-state>keyssoft</d:keyboard-state>
-            <d:nav-state>nonav</d:nav-state>
-        </d:state>
-    </d:device>
-</d:devices>
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_no_hardware.xml b/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_no_hardware.xml
deleted file mode 100644
index fb133ad..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_no_hardware.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0"?>
-<d:devices
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:d="http://schemas.android.com/sdk/devices/1">
-
-    <d:device>
-        <d:name>
-            Galaxy Nexus
-        </d:name>
-        <d:manufacturer>
-            Samsung
-        </d:manufacturer>
-        <d:software>
-            <d:api-level>14</d:api-level>
-            <d:live-wallpaper-support>true</d:live-wallpaper-support>
-            <d:bluetooth-profiles>
-                HSP
-                HFP
-                SPP
-                A2DP
-                AVRCP
-                OPP
-                PBAP
-                GAVDP
-                AVDTP
-                HID
-                HDP
-                PAN
-            </d:bluetooth-profiles>
-            <d:gl-version>2.0</d:gl-version>
-            <!--
-             These can be gotten via
-             javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);
-            -->
-            <d:gl-extensions>
-                GL_EXT_discard_framebuffer
-                GL_EXT_multi_draw_arrays
-                GL_EXT_shader_texture_lod
-                GL_EXT_texture_format_BGRA8888
-                GL_IMG_multisampled_render_to_texture
-                GL_IMG_program_binary
-                GL_IMG_read_format
-                GL_IMG_shader_binary
-                GL_IMG_texture_compression_pvrtc
-                GL_IMG_texture_format_BGRA8888
-                GL_IMG_texture_npot
-                GL_OES_compressed_ETC1_RGB8_texture
-                GL_OES_depth_texture
-                GL_OES_depth24
-                GL_OES_EGL_image
-                GL_OES_EGL_image_external
-                GL_OES_egl_sync
-                GL_OES_element_index_uint
-                GL_OES_fragment_precision_high
-                GL_OES_get_program_binary
-                GL_OES_mapbuffer
-                GL_OES_packed_depth_stencil
-                GL_OES_required_internalformat
-                GL_OES_rgb8_rgba8
-                GL_OES_standard_derivatives
-                GL_OES_texture_float
-                GL_OES_texture_half_float
-                GL_OES_vertex_array_object
-                GL_OES_vertex_half_float
-            </d:gl-extensions>
-            <d:status-bar>true</d:status-bar>
-        </d:software>
-        <d:state name="Portrait" default="true">
-            <d:description>The phone in portrait view</d:description>
-            <d:screen-orientation>port</d:screen-orientation>
-            <d:keyboard-state>keyssoft</d:keyboard-state>
-            <d:nav-state>nonav</d:nav-state>
-        </d:state>
-        <d:state name="Landscape">
-            <d:description>The phone in landscape view</d:description>
-            <d:screen-orientation>land</d:screen-orientation>
-            <d:keyboard-state>keyssoft</d:keyboard-state>
-            <d:nav-state>nonav</d:nav-state>
-        </d:state>
-    </d:device>
-</d:devices>
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_no_software.xml b/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_no_software.xml
deleted file mode 100644
index ae709bb..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_no_software.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0"?>
-<d:devices
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:d="http://schemas.android.com/sdk/devices/1">
-
-    <d:device>
-        <d:name>
-            Galaxy Nexus
-        </d:name>
-        <d:manufacturer>
-            Samsung
-        </d:manufacturer>
-        <d:hardware>
-            <d:screen>
-                <d:screen-size>normal</d:screen-size>
-                <d:diagonal-length>4.65</d:diagonal-length> <!-- In inches -->
-                <d:pixel-density>xhdpi</d:pixel-density>
-                <d:screen-ratio>long</d:screen-ratio>
-                <d:dimensions>
-                    <d:x-dimension>720</d:x-dimension>
-                    <d:y-dimension>1280</d:y-dimension>
-                </d:dimensions>
-                <d:xdpi>316</d:xdpi>
-                <d:ydpi>316</d:ydpi>
-                <d:touch>
-                    <d:multitouch>jazz-hands</d:multitouch>
-                    <d:mechanism>finger</d:mechanism>
-                    <d:screen-type>capacitive</d:screen-type>
-                </d:touch>
-            </d:screen>
-            <d:networking>
-                Bluetooth
-                Wifi
-                NFC
-            </d:networking>
-            <d:sensors>
-                Accelerometer
-                Barometer
-                Gyroscope
-                Compass
-                GPS
-                ProximitySensor
-            </d:sensors>
-            <d:mic>true</d:mic>
-            <d:camera>
-                <d:location>front</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>false</d:flash>
-            </d:camera>
-            <d:camera>
-                <d:location>back</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>true</d:flash>
-            </d:camera>
-            <d:keyboard>nokeys</d:keyboard>
-            <d:nav>nonav</d:nav>
-            <d:ram unit="GiB">1</d:ram>
-            <d:buttons>soft</d:buttons>
-            <d:internal-storage unit="GiB">16</d:internal-storage>
-            <d:removable-storage unit="KiB"></d:removable-storage>
-            <d:cpu>OMAP 4460</d:cpu> <!-- cpu type (Tegra3) freeform -->
-            <d:gpu>PowerVR SGX540</d:gpu>
-            <d:abi>
-                armeabi
-                armeabi-v7a
-            </d:abi>
-            <!--dock (car, desk, tv, none)-->
-            <d:dock>
-            </d:dock>
-            <!-- plugged in (never, charge, always) -->
-            <d:power-type>battery</d:power-type>
-        </d:hardware>
-        <d:state name="Portrait" default="true">
-            <d:description>The phone in portrait view</d:description>
-            <d:screen-orientation>port</d:screen-orientation>
-            <d:keyboard-state>keyssoft</d:keyboard-state>
-            <d:nav-state>nonav</d:nav-state>
-        </d:state>
-    </d:device>
-</d:devices>
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_no_states.xml b/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_no_states.xml
deleted file mode 100644
index 8685e3b..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_no_states.xml
+++ /dev/null
@@ -1,129 +0,0 @@
-<?xml version="1.0"?>
-<d:devices
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:d="http://schemas.android.com/sdk/devices/1">
-
-    <d:device>
-        <d:name>
-            Galaxy Nexus
-        </d:name>
-        <d:manufacturer>
-            Samsung
-        </d:manufacturer>
-        <d:hardware>
-            <d:screen>
-                <d:screen-size>normal</d:screen-size>
-                <d:diagonal-length>4.65</d:diagonal-length> <!-- In inches -->
-                <d:pixel-density>xhdpi</d:pixel-density>
-                <d:screen-ratio>long</d:screen-ratio>
-                <d:dimensions>
-                    <d:x-dimension>720</d:x-dimension>
-                    <d:y-dimension>1280</d:y-dimension>
-                </d:dimensions>
-                <d:xdpi>316</d:xdpi>
-                <d:ydpi>316</d:ydpi>
-                <d:touch>
-                    <d:multitouch>jazz-hands</d:multitouch>
-                    <d:mechanism>finger</d:mechanism>
-                    <d:screen-type>capacitive</d:screen-type>
-                </d:touch>
-            </d:screen>
-            <d:networking>
-                Bluetooth
-                Wifi
-                NFC
-            </d:networking>
-            <d:sensors>
-                Accelerometer
-                Barometer
-                Gyroscope
-                Compass
-                GPS
-                ProximitySensor
-            </d:sensors>
-            <d:mic>true</d:mic>
-            <d:camera>
-                <d:location>front</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>false</d:flash>
-            </d:camera>
-            <d:camera>
-                <d:location>back</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>true</d:flash>
-            </d:camera>
-            <d:keyboard>nokeys</d:keyboard>
-            <d:nav>nonav</d:nav>
-            <d:ram unit="GiB">1</d:ram>
-            <d:buttons>soft</d:buttons>
-            <d:internal-storage unit="GiB">16</d:internal-storage>
-            <d:removable-storage unit="KiB"></d:removable-storage>
-            <d:cpu>OMAP 4460</d:cpu> <!-- cpu type (Tegra3) freeform -->
-            <d:gpu>PowerVR SGX540</d:gpu>
-            <d:abi>
-                armeabi
-                armeabi-v7a
-            </d:abi>
-            <!--dock (car, desk, tv, none)-->
-            <d:dock>
-            </d:dock>
-            <!-- plugged in (never, charge, always) -->
-            <d:power-type>battery</d:power-type>
-        </d:hardware>
-        <d:software>
-            <d:api-level>14</d:api-level>
-            <d:live-wallpaper-support>true</d:live-wallpaper-support>
-            <d:bluetooth-profiles>
-                HSP
-                HFP
-                SPP
-                A2DP
-                AVRCP
-                OPP
-                PBAP
-                GAVDP
-                AVDTP
-                HID
-                HDP
-                PAN
-            </d:bluetooth-profiles>
-            <d:gl-version>2.0</d:gl-version>
-            <!--
-             These can be gotten via
-             javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);
-            -->
-            <d:gl-extensions>
-                GL_EXT_discard_framebuffer
-                GL_EXT_multi_draw_arrays
-                GL_EXT_shader_texture_lod
-                GL_EXT_texture_format_BGRA8888
-                GL_IMG_multisampled_render_to_texture
-                GL_IMG_program_binary
-                GL_IMG_read_format
-                GL_IMG_shader_binary
-                GL_IMG_texture_compression_pvrtc
-                GL_IMG_texture_format_BGRA8888
-                GL_IMG_texture_npot
-                GL_OES_compressed_ETC1_RGB8_texture
-                GL_OES_depth_texture
-                GL_OES_depth24
-                GL_OES_EGL_image
-                GL_OES_EGL_image_external
-                GL_OES_egl_sync
-                GL_OES_element_index_uint
-                GL_OES_fragment_precision_high
-                GL_OES_get_program_binary
-                GL_OES_mapbuffer
-                GL_OES_packed_depth_stencil
-                GL_OES_required_internalformat
-                GL_OES_rgb8_rgba8
-                GL_OES_standard_derivatives
-                GL_OES_texture_float
-                GL_OES_texture_half_float
-                GL_OES_vertex_array_object
-                GL_OES_vertex_half_float
-            </d:gl-extensions>
-            <d:status-bar>true</d:status-bar>
-        </d:software>
-    </d:device>
-</d:devices>
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_too_many_defaults.xml b/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_too_many_defaults.xml
deleted file mode 100644
index c720a7a..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/devices_too_many_defaults.xml
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version="1.0"?>
-<d:devices
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:d="http://schemas.android.com/sdk/devices/1">
-
-    <d:device>
-        <d:name>
-            Galaxy Nexus
-        </d:name>
-        <d:manufacturer>
-            Samsung
-        </d:manufacturer>
-        <d:hardware>
-            <d:screen>
-                <d:screen-size>normal</d:screen-size>
-                <d:diagonal-length>4.65</d:diagonal-length> <!-- In inches -->
-                <d:pixel-density>xhdpi</d:pixel-density>
-                <d:screen-ratio>long</d:screen-ratio>
-                <d:dimensions>
-                    <d:x-dimension>720</d:x-dimension>
-                    <d:y-dimension>1280</d:y-dimension>
-                </d:dimensions>
-                <d:xdpi>316</d:xdpi>
-                <d:ydpi>316</d:ydpi>
-                <d:touch>
-                    <d:multitouch>jazz-hands</d:multitouch>
-                    <d:mechanism>finger</d:mechanism>
-                    <d:screen-type>capacitive</d:screen-type>
-                </d:touch>
-            </d:screen>
-            <d:networking>
-                Bluetooth
-                Wifi
-                NFC
-            </d:networking>
-            <d:sensors>
-                Accelerometer
-                Barometer
-                Gyroscope
-                Compass
-                GPS
-                ProximitySensor
-            </d:sensors>
-            <d:mic>true</d:mic>
-            <d:camera>
-                <d:location>front</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>false</d:flash>
-            </d:camera>
-            <d:camera>
-                <d:location>back</d:location>
-                <d:autofocus>true</d:autofocus>
-                <d:flash>true</d:flash>
-            </d:camera>
-            <d:keyboard>nokeys</d:keyboard>
-            <d:nav>nonav</d:nav>
-            <d:ram unit="GiB">1</d:ram>
-            <d:buttons>soft</d:buttons>
-            <d:internal-storage unit="GiB">16</d:internal-storage>
-            <d:removable-storage unit="KiB"></d:removable-storage>
-            <d:cpu>OMAP 4460</d:cpu> <!-- cpu type (Tegra3) freeform -->
-            <d:gpu>PowerVR SGX540</d:gpu>
-            <d:abi>
-                armeabi
-                armeabi-v7a
-            </d:abi>
-            <!--dock (car, desk, tv, none)-->
-            <d:dock>
-            </d:dock>
-            <!-- plugged in (never, charge, always) -->
-            <d:power-type>battery</d:power-type>
-        </d:hardware>
-        <d:software>
-            <d:api-level>14</d:api-level>
-            <d:live-wallpaper-support>true</d:live-wallpaper-support>
-            <d:bluetooth-profiles>
-                HSP
-                HFP
-                SPP
-                A2DP
-                AVRCP
-                OPP
-                PBAP
-                GAVDP
-                AVDTP
-                HID
-                HDP
-                PAN
-            </d:bluetooth-profiles>
-            <d:gl-version>2.0</d:gl-version>
-            <!--
-             These can be gotten via
-             javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);
-            -->
-            <d:gl-extensions>
-                GL_EXT_discard_framebuffer
-                GL_EXT_multi_draw_arrays
-                GL_EXT_shader_texture_lod
-                GL_EXT_texture_format_BGRA8888
-                GL_IMG_multisampled_render_to_texture
-                GL_IMG_program_binary
-                GL_IMG_read_format
-                GL_IMG_shader_binary
-                GL_IMG_texture_compression_pvrtc
-                GL_IMG_texture_format_BGRA8888
-                GL_IMG_texture_npot
-                GL_OES_compressed_ETC1_RGB8_texture
-                GL_OES_depth_texture
-                GL_OES_depth24
-                GL_OES_EGL_image
-                GL_OES_EGL_image_external
-                GL_OES_egl_sync
-                GL_OES_element_index_uint
-                GL_OES_fragment_precision_high
-                GL_OES_get_program_binary
-                GL_OES_mapbuffer
-                GL_OES_packed_depth_stencil
-                GL_OES_required_internalformat
-                GL_OES_rgb8_rgba8
-                GL_OES_standard_derivatives
-                GL_OES_texture_float
-                GL_OES_texture_half_float
-                GL_OES_vertex_array_object
-                GL_OES_vertex_half_float
-            </d:gl-extensions>
-            <d:status-bar>true</d:status-bar>
-        </d:software>
-        <d:state name="Portrait" default="true">
-            <d:description>The phone in portrait view</d:description>
-            <d:screen-orientation>port</d:screen-orientation>
-            <d:keyboard-state>keyssoft</d:keyboard-state>
-            <d:nav-state>nonav</d:nav-state>
-        </d:state>
-        <d:state name="Landscape" default="true">
-            <d:description>The phone in landscape view</d:description>
-            <d:screen-orientation>land</d:screen-orientation>
-            <d:keyboard-state>keyssoft</d:keyboard-state>
-            <d:nav-state>nonav</d:nav-state>
-        </d:state>
-    </d:device>
-</d:devices>
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/frame.jpeg b/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/frame.jpeg
deleted file mode 100644
index e69de29..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/frame.jpeg
+++ /dev/null
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/frame.png b/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/frame.png
deleted file mode 100644
index e69de29..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/frame.png
+++ /dev/null
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/sixteen.jpeg b/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/sixteen.jpeg
deleted file mode 100644
index e69de29..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/sixteen.jpeg
+++ /dev/null
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/sixteen.png b/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/sixteen.png
deleted file mode 100644
index e69de29..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/sixteen.png
+++ /dev/null
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/sixtyfour.jpeg b/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/sixtyfour.jpeg
deleted file mode 100644
index e69de29..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/sixtyfour.jpeg
+++ /dev/null
diff --git a/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/sixtyfour.png b/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/sixtyfour.png
deleted file mode 100644
index e69de29..0000000
--- a/device_validator/dvlib/src/test/resources/com/android/dvlib/extras/sixtyfour.png
+++ /dev/null
diff --git a/draw9patch/Android.mk b/draw9patch/Android.mk
index ef2184d..ddb8707 100644
--- a/draw9patch/Android.mk
+++ b/draw9patch/Android.mk
@@ -20,9 +20,6 @@
 
 LOCAL_JAR_MANIFEST := etc/manifest.txt
 
-LOCAL_JAVA_LIBRARIES := \
-	swing-worker-1.1
-
 LOCAL_MODULE := draw9patch
 LOCAL_MODULE_TAGS := debug
 
diff --git a/draw9patch/etc/manifest.txt b/draw9patch/etc/manifest.txt
index b2e3528..2616706 100644
--- a/draw9patch/etc/manifest.txt
+++ b/draw9patch/etc/manifest.txt
@@ -1,2 +1 @@
 Main-Class: com.android.draw9patch.Application
-Class-Path: swing-worker-1.1.jar
diff --git a/draw9patch/src/com/android/draw9patch/ui/ImageEditorPanel.java b/draw9patch/src/com/android/draw9patch/ui/ImageEditorPanel.java
index bf3754b..845ee54 100644
--- a/draw9patch/src/com/android/draw9patch/ui/ImageEditorPanel.java
+++ b/draw9patch/src/com/android/draw9patch/ui/ImageEditorPanel.java
@@ -685,6 +685,12 @@
         private boolean showBadPatches;
 
         private JPanel helpPanel;
+        private boolean drawingLine;
+        private int lineFromX;
+        private int lineFromY;
+        private int lineToX;
+        private int lineToY;
+        private boolean showDrawingLine;
 
         ImageViewer() {
             setLayout(new GridBagLayout());
@@ -735,7 +741,12 @@
                     // changed state).
                     currentButton = event.isShiftDown() ? MouseEvent.BUTTON3 : event.getButton();
                     currentButton = event.isControlDown() ? MouseEvent.BUTTON2 : currentButton;
-                    paint(event.getX(), event.getY(), currentButton);
+                    startDrawingLine(event.getX(), event.getY(), currentButton);
+                }
+
+                @Override
+                public void mouseReleased(MouseEvent event) {
+                    endDrawingLine();
                 }
             });
             addMouseMotionListener(new MouseMotionAdapter() {
@@ -743,7 +754,8 @@
                 public void mouseDragged(MouseEvent event) {
                     if (!checkLockedRegion(event.getX(), event.getY())) {
                         // use the stored button, see note above
-                        paint(event.getX(), event.getY(),  currentButton);
+
+                        moveLine(event.getX(), event.getY());
                     }
                 }
 
@@ -754,7 +766,7 @@
             });
             Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
                 public void eventDispatched(AWTEvent event) {
-                    enableEraseMode((KeyEvent) event);                    
+                    enableEraseMode((KeyEvent) event);
                 }
             }, AWTEvent.KEY_EVENT_MASK);
 
@@ -857,21 +869,34 @@
             }
         }
 
-        private void paint(int x, int y, int button) {
-            int color;
-            switch (button) {
-                case MouseEvent.BUTTON1:
-                    color = BLACK_TICK;
-                    break;
-                case MouseEvent.BUTTON2:
-                    color = RED_TICK;
-                    break;
-                case MouseEvent.BUTTON3:
-                    color = 0;
-                    break;
-                default:
-                    return;
+        private void startDrawingLine(int x, int y, int button) {
+            int left = (getWidth() - size.width) / 2;
+            int top = helpPanel.getHeight() + (getHeight() - size.height) / 2;
+
+            x = (x - left) / zoom;
+            y = (y - top) / zoom;
+
+            int width = image.getWidth();
+            int height = image.getHeight();
+            if (((x == 0 || x == width - 1) && (y > 0 && y < height - 1))
+                    || ((x > 0 && x < width - 1) && (y == 0 || y == height - 1))) {
+                drawingLine = true;
+                lineFromX = x;
+                lineFromY = y;
+                lineToX = x;
+                lineToY = y;
+
+                showDrawingLine = true;
+
+                showCursor = false;
+
+                repaint();
             }
+        }
+
+        private void moveLine(int x, int y) {
+            if (drawingLine == false)
+                return;
 
             int left = (getWidth() - size.width) / 2;
             int top = helpPanel.getHeight() + (getHeight() - size.height) / 2;
@@ -881,16 +906,74 @@
 
             int width = image.getWidth();
             int height = image.getHeight();
-            if (((x == 0 || x == width - 1) && (y > 0 && y < height - 1)) ||
-                    ((x > 0 && x < width - 1) && (y == 0 || y == height - 1))) {
-                image.setRGB(x, y, color);
-                findPatches();
-                stretchesViewer.computePatches();
-                if (showBadPatches) {
-                    findBadPatches();
+
+            showDrawingLine = false;
+
+            if (((x == lineFromX) && (y > 0 && y < height - 1))
+                    || ((x > 0 && x < width - 1) && (y == lineFromY))) {
+                if (x == lineFromX || y == lineFromY) {
+                    lineToX = x;
+                    lineToY = y;
+
+                    showDrawingLine = true;
                 }
-                repaint();
             }
+
+            repaint();
+        }
+
+        private void endDrawingLine() {
+            if (drawingLine == false)
+                return;
+
+            drawingLine = false;
+
+            if (showDrawingLine == false)
+                return;
+
+            int color;
+            switch (currentButton) {
+            case MouseEvent.BUTTON1:
+                color = BLACK_TICK;
+                break;
+            case MouseEvent.BUTTON2:
+                color = RED_TICK;
+                break;
+            case MouseEvent.BUTTON3:
+                color = 0;
+                break;
+            default:
+                return;
+            }
+
+            int x = lineFromX;
+            int y = lineFromY;
+
+            int dx = 0;
+            int dy = 0;
+
+            if (lineToX != lineFromX)
+                dx = lineToX > lineFromX ? 1 : -1;
+            else if (lineToY != lineFromY)
+                dy = lineToY > lineFromY ? 1 : -1;
+
+            do {
+                image.setRGB(x, y, color);
+
+                if (x == lineToX && y == lineToY)
+                    break;
+
+                x += dx;
+                y += dy;
+            } while (true);
+
+            findPatches();
+            stretchesViewer.computePatches();
+            if (showBadPatches) {
+                findBadPatches();
+            }
+
+            repaint();
         }
 
         private boolean checkLockedRegion(int x, int y) {
@@ -915,8 +998,10 @@
             locked = x > 0 && x < width - 1 && y > 0 && y < height - 1;
 
             boolean previousCursor = showCursor;
-            showCursor = ((x == 0 || x == width - 1) && (y > 0 && y < height - 1)) ||
-                    ((x > 0 && x < width - 1) && (y == 0 || y == height - 1));
+            showCursor =
+                    !drawingLine &&
+                    ( ((x == 0 || x == width - 1) && (y > 0 && y < height - 1)) ||
+                      ((x > 0 && x < width - 1) && (y == 0 || y == height - 1)) );
 
             if (locked != previousLock) {
                 repaint();
@@ -989,6 +1074,32 @@
 
             g2.dispose();
 
+            if (drawingLine && showDrawingLine) {
+                Graphics cursor = g.create();
+                cursor.setXORMode(Color.WHITE);
+                cursor.setColor(Color.BLACK);
+
+                x = Math.min(lineFromX, lineToX);
+                y = Math.min(lineFromY, lineToY);
+                int w = Math.abs(lineFromX - lineToX) + 1;
+                int h = Math.abs(lineFromY - lineToY) + 1;
+
+                x = x * zoom;
+                y = y * zoom;
+                w = w * zoom;
+                h = h * zoom;
+
+                int left = (getWidth() - size.width) / 2;
+                int top = helpPanel.getHeight() + (getHeight() - size.height)
+                        / 2;
+
+                x += left;
+                y += top;
+
+                cursor.drawRect(x, y, w, h);
+                cursor.dispose();
+            }
+
             if (showCursor) {
                 Graphics cursor = g.create();
                 cursor.setXORMode(Color.WHITE);
diff --git a/draw9patch/src/com/android/draw9patch/ui/MainFrame.java b/draw9patch/src/com/android/draw9patch/ui/MainFrame.java
index a272a28..ff749f4 100644
--- a/draw9patch/src/com/android/draw9patch/ui/MainFrame.java
+++ b/draw9patch/src/com/android/draw9patch/ui/MainFrame.java
@@ -16,24 +16,24 @@
 
 package com.android.draw9patch.ui;
 
+import com.android.draw9patch.graphics.GraphicsUtilities;
 import com.android.draw9patch.ui.action.ExitAction;
 import com.android.draw9patch.ui.action.OpenAction;
 import com.android.draw9patch.ui.action.SaveAction;
-import com.android.draw9patch.graphics.GraphicsUtilities;
 
-import javax.swing.JFrame;
-import javax.swing.JMenuBar;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.ActionMap;
-import javax.swing.JFileChooser;
-import javax.imageio.ImageIO;
 import java.awt.HeadlessException;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.util.concurrent.ExecutionException;
 
-import org.jdesktop.swingworker.SwingWorker;
+import javax.imageio.ImageIO;
+import javax.swing.ActionMap;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.SwingWorker;
 
 public class MainFrame extends JFrame {
     private ActionMap actionsMap;
diff --git a/draw9patch/src/com/android/draw9patch/ui/action/BackgroundAction.java b/draw9patch/src/com/android/draw9patch/ui/action/BackgroundAction.java
index 85d9d4f..11bf261 100644
--- a/draw9patch/src/com/android/draw9patch/ui/action/BackgroundAction.java
+++ b/draw9patch/src/com/android/draw9patch/ui/action/BackgroundAction.java
@@ -16,9 +16,8 @@
 
 package com.android.draw9patch.ui.action;
 
-import org.jdesktop.swingworker.SwingWorker;
-
 import javax.swing.AbstractAction;
+import javax.swing.SwingWorker;
 
 public abstract class BackgroundAction extends AbstractAction {
     protected void executeBackgroundTask(SwingWorker<?, ?> worker) {
diff --git a/eclipse/features/com.android.ide.eclipse.adt.package/feature.xml b/eclipse/features/com.android.ide.eclipse.adt.package/feature.xml
index 38b535c..15871b1 100644
--- a/eclipse/features/com.android.ide.eclipse.adt.package/feature.xml
+++ b/eclipse/features/com.android.ide.eclipse.adt.package/feature.xml
@@ -72,6 +72,7 @@
       <import plugin="org.eclipse.cdt.dsf.gdb"/>
       <import plugin="org.eclipse.cdt.dsf.gdb.ui"/>
       <import plugin="org.eclipse.cdt.launch"/>
+      <import feature="org.eclipse.egit" />
       <import feature="com.android.ide.eclipse.ddms"            version="22.0.0" match="greaterOrEqual" />
       <import feature="com.android.ide.eclipse.adt"             version="22.0.0" match="greaterOrEqual" />
       <import feature="com.android.ide.eclipse.gldebugger"      version="22.0.0" match="greaterOrEqual" />
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF
index 262da58..7cdb400 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF
@@ -58,7 +58,6 @@
  com.android.ide.common.layout;x-friends:="com.android.ide.eclipse.tests",
  com.android.ide.common.layout.grid;x-friends:="com.android.ide.eclipse.tests",
  com.android.ide.common.layout.relative;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.common.rendering.api;x-friends:="com.android.ide.eclipse.tests",
  com.android.ide.common.resources.platform;x-friends:="com.android.ide.eclipse.tests",
  com.android.ide.eclipse.adt;x-friends:="com.android.ide.eclipse.tests",
  com.android.ide.eclipse.adt.internal;x-friends:="com.android.ide.eclipse.tests",
@@ -112,6 +111,7 @@
  com.android.ide.eclipse.adt.internal.sdk;x-friends:="com.android.ide.eclipse.tests",
  com.android.ide.eclipse.adt.internal.sourcelookup;x-friends:="com.android.ide.eclipse.tests",
  com.android.ide.eclipse.adt.internal.ui;x-friends:="com.android.ide.eclipse.tests",
+ com.android.ide.eclipse.adt.internal.utils;x-friends:="com.android.ide.eclipse.tests",
  com.android.ide.eclipse.adt.internal.welcome;x-friends:="com.android.ide.eclipse.tests",
  com.android.ide.eclipse.adt.internal.wizards.actions;x-friends:="com.android.ide.eclipse.tests",
  com.android.ide.eclipse.adt.internal.wizards.export;x-friends:="com.android.ide.eclipse.tests",
@@ -119,11 +119,8 @@
  com.android.ide.eclipse.adt.internal.wizards.newxmlfile;x-friends:="com.android.ide.eclipse.tests",
  com.android.ide.eclipse.adt.internal.wizards.templates;x-friends:="com.android.ide.eclipse.tests",
  com.android.ide.eclipse.adt.io;x-friends:="com.android.ide.eclipse.tests",
- com.android.layoutlib.api;x-friends:="com.android.ide.eclipse.tests",
  com.android.manifmerger;x-friends:="com.android.ide.eclipse.tests",
- com.android.menubar;x-friends:="com.android.ide.eclipse.tests",
  com.android.ninepatch;x-friends:="com.android.ide.eclipse.tests",
- com.android.resources;x-friends:="com.android.ide.eclipse.tests",
  com.android.sdkuilib.internal.repository;x-friends:="com.android.ide.eclipse.tests",
  com.android.sdkuilib.internal.repository.core;x-friends:="com.android.ide.eclipse.tests",
  com.android.sdkuilib.internal.repository.icons;x-friends:="com.android.ide.eclipse.tests",
@@ -135,7 +132,6 @@
  com.android.tools.lint.checks;x-friends:="com.android.ide.eclipse.tests",
  com.android.tools.lint.client.api;x-friends:="com.android.ide.eclipse.tests",
  com.android.tools.lint.detector.api;x-friends:="com.android.ide.eclipse.tests",
- com.android.util;x-friends:="com.android.ide.eclipse.tests",
  freemarker.cache;x-friends:="com.android.ide.eclipse.tests",
  freemarker.template;x-friends:="com.android.ide.eclipse.tests",
  org.kxml2.io;x-friends:="com.android.ide.eclipse.tests",
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java
index 752bbc6..88e9c15 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java
@@ -1884,7 +1884,7 @@
     // --------- ILogger methods -----------
 
     @Override
-    public void error(Throwable t, String format, Object... args) {
+    public void error(@Nullable Throwable t, @Nullable String format, Object... args) {
         if (t != null) {
             log(t, format, args);
         } else {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java
index 223e5e5..697a0bc 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java
@@ -23,6 +23,7 @@
 import com.android.SdkConstants;
 import com.android.annotations.NonNull;
 import com.android.annotations.Nullable;
+import com.android.ide.common.sdk.SdkVersionInfo;
 import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
 import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
 import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
@@ -989,7 +990,7 @@
      * @return the highest known API number
      */
     public static int getHighestKnownApiLevel() {
-        return SdkConstants.HIGHEST_KNOWN_API;
+        return SdkVersionInfo.HIGHEST_KNOWN_API;
     }
 
     /**
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java
index 9c42967..df204b8 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java
@@ -21,7 +21,7 @@
 import com.android.ide.eclipse.adt.AdtPlugin.CheckSdkErrorHandler;
 import com.android.ide.eclipse.adt.AdtPlugin.CheckSdkErrorHandler.Solution;
 import com.android.ide.eclipse.adt.Messages;
-import com.android.sdklib.internal.repository.packages.FullRevision;
+import com.android.sdklib.repository.FullRevision;
 import com.android.sdklib.repository.PkgProps;
 
 import org.osgi.framework.Constants;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/SdkManagerAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/SdkManagerAction.java
index 4155989..71c8263 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/SdkManagerAction.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/SdkManagerAction.java
@@ -28,7 +28,7 @@
 import com.android.sdklib.util.GrabProcessOutput;
 import com.android.sdklib.util.GrabProcessOutput.IProcessOutput;
 import com.android.sdklib.util.GrabProcessOutput.Wait;
-import com.android.sdkuilib.repository.ISdkChangeListener;
+import com.android.sdklib.repository.ISdkChangeListener;
 import com.android.sdkuilib.repository.SdkUpdaterWindow;
 import com.android.sdkuilib.repository.SdkUpdaterWindow.SdkInvocationContext;
 
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java
index ba23c95..0f0cbcc 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java
@@ -18,6 +18,7 @@
 
 import com.android.SdkConstants;
 import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
 import com.android.ide.common.xml.ManifestData;
 import com.android.ide.eclipse.adt.AdtConstants;
 import com.android.ide.eclipse.adt.AdtPlugin;
@@ -55,9 +56,9 @@
 import com.android.utils.ILogger;
 import com.android.utils.Pair;
 import com.android.xml.AndroidManifest;
+import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
+import com.google.common.collect.Multimap;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
@@ -78,9 +79,9 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.xml.parsers.ParserConfigurationException;
 
@@ -94,6 +95,7 @@
  * </ul>
  *
  */
+@SuppressWarnings("deprecation")
 public class PreCompilerBuilder extends BaseBuilder {
 
     /** This ID is used in plugin.xml and in each project's .project file.
@@ -806,6 +808,7 @@
         }
     }
 
+    @SuppressWarnings("deprecation")
     private void handleBuildConfig(@SuppressWarnings("rawtypes") Map args)
             throws IOException, CoreException {
         boolean debugMode = !args.containsKey(RELEASE_REQUESTED);
@@ -895,7 +898,8 @@
                     }
 
                     @Override
-                    public void error(Throwable t, String errorFormat, Object... args) {
+                    public void error(@Nullable Throwable t, @Nullable String errorFormat,
+                            Object... args) {
                         errors.add(String.format(errorFormat, args));
                     }
                 }),
@@ -1034,6 +1038,7 @@
      * @param proguardFile an optional path to store proguard information
      * @throws AbortBuildException
      */
+    @SuppressWarnings("deprecation")
     private void execAapt(IProject project, IAndroidTarget projectTarget, String osOutputPath,
             String osResPath, String osManifestPath, IFolder packageFolder,
             ArrayList<IFolder> libResFolders, List<Pair<File, String>> libRFiles,
@@ -1049,7 +1054,6 @@
         // launch aapt: create the command line
         ArrayList<String> array = new ArrayList<String>();
 
-        @SuppressWarnings("deprecation")
         String aaptPath = projectTarget.getPath(IAndroidTarget.AAPT);
 
         array.add(aaptPath);
@@ -1160,71 +1164,40 @@
                 // if the project has no resources, the file could not exist.
                 if (rFile.isFile()) {
                     // Load the full symbols from the full R.txt file.
-                    SymbolLoader fullSymbols = new SymbolLoader(rFile);
-                    fullSymbols.load();
+                    SymbolLoader fullSymbolValues = new SymbolLoader(rFile);
+                    fullSymbolValues.load();
 
-                    // simpler case of a single library
-                    if (libRFiles.size() == 1) {
-                        Pair<File, String> lib = libRFiles.get(0);
-                        createRClass(fullSymbols, lib.getFirst(), lib.getSecond(), osOutputPath);
+                    Multimap<String, SymbolLoader> libMap = ArrayListMultimap.create();
 
-                    } else {
-                        Map<String, File> libPackages = Maps.newHashMapWithExpectedSize(
-                                libRFiles.size());
-                        Set<String> duplicatePackages = Sets.newHashSet();
+                    // First pass processing the libraries, collecting them by packageName,
+                    // and ignoring the ones that have the same package name as the application
+                    // (since that R class was already created).
 
-                        // preprocessing to figure out if there are dups in the package names of
-                        // the libraries
-                        for (Pair<File, String> lib : libRFiles) {
-                            String libPackage = lib.getSecond();
-                            File existingPkg = libPackages.get(libPackage);
-                            if (existingPkg != null) {
-                                // record the dup package and keep going, in case there are all
-                                // the same
-                                duplicatePackages.add(libPackage);
-                                continue;
-                            }
+                    for (Pair<File, String> lib : libRFiles) {
+                        String libPackage = lib.getSecond();
+                        File rText = lib.getFirst();
 
-                            libPackages.put(libPackage, lib.getFirst());
+                        if (rText.isFile()) {
+                            // load the lib symbols
+                            SymbolLoader libSymbols = new SymbolLoader(rText);
+                            libSymbols.load();
+
+                            // store these symbols by associating them with the package name.
+                            libMap.put(libPackage, libSymbols);
                         }
+                    }
 
-                        // check if we have duplicate but all files are the same.
-                        if (duplicatePackages.size() > 0) {
-                            // possible conflict!
-                            // detect case of all libraries == same package.
-                            if (duplicatePackages.size() == 1 && libPackages.size() == 1 &&
-                                    duplicatePackages.iterator().next().equals(libPackages.keySet().iterator().next())) {
-                                // this is ok, all libraries have the same package.
-                                // Make a copy of the full R class.
-                                SymbolWriter writer = new SymbolWriter(osOutputPath,
-                                        duplicatePackages.iterator().next(),
-                                        fullSymbols, fullSymbols);
-                                writer.write();
-                            } else {
-                                StringBuilder sb = new StringBuilder();
-                                sb.append("The following packages have been found to be used by two or more libraries:");
-                                for (String pkg : duplicatePackages) {
-                                    sb.append("\n\t").append(pkg);
-                                }
-                                sb.append("\nNo libraries must share the same package, unless all libraries share the same packages.");
+                    // now loop on all the package names, merge all the symbols to write,
+                    // and write them
+                    for (String packageName : libMap.keySet()) {
+                        Collection<SymbolLoader> symbols = libMap.get(packageName);
 
-                                String msg = sb.toString();
-                                markProject(AdtConstants.MARKER_ADT, msg, IMarker.SEVERITY_ERROR);
-
-                                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                                        msg);
-
-                                throw new AbortBuildException();
-                            }
-                        } else {
-                            // no dups, all libraries have different packages.
-                            // Conflicts with the main package have been removed already.
-                            // Just process all the libraries.
-                            for (Pair<File, String> lib : libRFiles) {
-                                createRClass(fullSymbols, lib.getFirst(), lib.getSecond(),
-                                        osOutputPath);
-                            }
+                        SymbolWriter writer = new SymbolWriter(osOutputPath, packageName,
+                                fullSymbolValues);
+                        for (SymbolLoader symbolLoader : symbols) {
+                            writer.addSymbolsToWrite(symbolLoader);
                         }
+                        writer.write();
                     }
                 }
             }
@@ -1283,19 +1256,6 @@
         }
     }
 
-    private void createRClass(SymbolLoader fullSymbols, File libRTxtFile, String libPackage,
-            String osOutputPath) throws IOException {
-        if (libRTxtFile.isFile()) {
-            SymbolLoader libSymbols = new SymbolLoader(libRTxtFile);
-            libSymbols.load();
-
-            SymbolWriter writer = new SymbolWriter(osOutputPath, libPackage, libSymbols,
-                    fullSymbols);
-            writer.write();
-        }
-    }
-
-
     /**
      * Creates a relative {@link IPath} from a java package.
      * @param javaPackageName the java package.
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunchController.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunchController.java
index 31d4d0f..4281f19 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunchController.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunchController.java
@@ -377,6 +377,9 @@
             AvdInfo preferredAvd = null;
             if (config.mAvdName != null) {
                 preferredAvd = avdManager.getAvd(config.mAvdName, true /*validAvdOnly*/);
+            }
+
+            if (preferredAvd != null) {
                 IAndroidTarget preferredAvdTarget = preferredAvd.getTarget();
                 if (preferredAvdTarget != null
                         && !preferredAvdTarget.getVersion().canRun(minApiVersion)) {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAnnotation.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAnnotation.java
index d7a0758..b047b1b 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAnnotation.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAnnotation.java
@@ -25,13 +25,13 @@
 
 import com.android.annotations.NonNull;
 import com.android.annotations.Nullable;
+import com.android.ide.common.sdk.SdkVersionInfo;
 import com.android.ide.eclipse.adt.AdtPlugin;
 import com.android.ide.eclipse.adt.AdtUtils;
 import com.android.ide.eclipse.adt.internal.editors.IconFactory;
 import com.android.tools.lint.checks.AnnotationDetector;
 import com.android.tools.lint.checks.ApiDetector;
 import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LintUtils;
 import com.android.tools.lint.detector.api.Scope;
 
 import org.eclipse.core.resources.IMarker;
@@ -345,7 +345,8 @@
         }
 
         Issue issue = EclipseLintClient.getRegistry().getIssue(id);
-        boolean isClassDetector = issue != null && issue.getScope().contains(Scope.CLASS_FILE);
+        boolean isClassDetector = issue != null && issue.getImplementation().getScope().contains(
+                Scope.CLASS_FILE);
 
         // Don't offer to suppress (with an annotation) the annotation checks
         if (issue == AnnotationDetector.ISSUE) {
@@ -409,7 +410,7 @@
                         // @TargetApi is only valid on methods and classes, not fields etc
                         && (body instanceof MethodDeclaration
                                 || body instanceof TypeDeclaration)) {
-                    String apiString = LintUtils.getBuildCode(api);
+                    String apiString = SdkVersionInfo.getBuildCode(api);
                     if (apiString == null) {
                         apiString = Integer.toString(api);
                     }
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAttribute.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAttribute.java
index 0d751cb..b77b475 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAttribute.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAttribute.java
@@ -22,13 +22,13 @@
 
 import com.android.annotations.NonNull;
 import com.android.annotations.Nullable;
+import com.android.ide.common.sdk.SdkVersionInfo;
 import com.android.ide.eclipse.adt.AdtPlugin;
 import com.android.ide.eclipse.adt.AdtUtils;
 import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
 import com.android.ide.eclipse.adt.internal.editors.IconFactory;
 import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
 import com.android.tools.lint.checks.ApiDetector;
-import com.android.tools.lint.detector.api.LintUtils;
 import com.google.common.collect.Lists;
 
 import org.eclipse.core.resources.IMarker;
@@ -186,7 +186,7 @@
                 if (matcher.find()) {
                     api = Integer.parseInt(matcher.group(1));
                     String targetApi;
-                    String buildCode = LintUtils.getBuildCode(api);
+                    String buildCode = SdkVersionInfo.getBuildCode(api);
                     if (buildCode != null) {
                         targetApi = buildCode.toLowerCase(Locale.US);
                         fixes.add(new AddSuppressAttribute(editor, id, marker, element,
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintClient.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintClient.java
index f6b18e0..45ae2c5 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintClient.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintClient.java
@@ -105,6 +105,7 @@
 import java.util.Map;
 import java.util.WeakHashMap;
 
+import lombok.ast.TypeReference;
 import lombok.ast.ecj.EcjTreeConverter;
 import lombok.ast.grammar.ParseProblem;
 import lombok.ast.grammar.Source;
@@ -614,8 +615,8 @@
             return "";
         }
 
-        String summary = issue.getDescription();
-        String explanation = issue.getExplanationAsSimpleText();
+        String summary = issue.getDescription(Issue.OutputFormat.TEXT);
+        String explanation = issue.getExplanation(Issue.OutputFormat.TEXT);
 
         StringBuilder sb = new StringBuilder(summary.length() + explanation.length() + 20);
         try {
@@ -1213,6 +1214,19 @@
                 @NonNull lombok.ast.Node compilationUnit) {
         }
 
+        @Override
+        @Nullable
+        public lombok.ast.Node resolve(@NonNull JavaContext context,
+                @NonNull lombok.ast.Node node) {
+            return null;
+        }
+
+        @Override
+        @Nullable
+        public TypeReference getType(@NonNull JavaContext context, @NonNull lombok.ast.Node node) {
+            return null;
+        }
+
         /* Handle for creating positions cheaply and returning full fledged locations later */
         private class LocationHandle implements Handle {
             private File mFile;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFix.java
index feb6bb5..401703e 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFix.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFix.java
@@ -37,6 +37,7 @@
 import com.android.tools.lint.checks.UseCompoundDrawableDetector;
 import com.android.tools.lint.checks.UselessViewDetector;
 import com.android.tools.lint.detector.api.Issue;
+import com.android.tools.lint.detector.api.Issue.OutputFormat;
 
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.runtime.CoreException;
@@ -109,7 +110,7 @@
     public String getAdditionalProposalInfo() {
         Issue issue = EclipseLintClient.getRegistry().getIssue(mId);
         if (issue != null) {
-            return issue.getExplanationAsHtml();
+            return issue.getExplanation(OutputFormat.HTML);
         }
 
         return null;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFixGenerator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFixGenerator.java
index 22fe23b..ce5fd55 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFixGenerator.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFixGenerator.java
@@ -27,6 +27,7 @@
 import com.android.tools.lint.client.api.DefaultConfiguration;
 import com.android.tools.lint.client.api.IssueRegistry;
 import com.android.tools.lint.detector.api.Issue;
+import com.android.tools.lint.detector.api.Issue.OutputFormat;
 import com.android.tools.lint.detector.api.Project;
 import com.android.tools.lint.detector.api.Severity;
 import com.android.utils.SdkUtils;
@@ -488,11 +489,12 @@
             sb.append('\n').append('\n');
             sb.append("Issue Explanation:");
             sb.append('\n');
-            if (issue.getExplanation() != null) {
+            String explanation = issue.getExplanation(Issue.OutputFormat.TEXT);
+            if (explanation != null && !explanation.isEmpty()) {
                 sb.append('\n');
-                sb.append(issue.getExplanationAsSimpleText());
+                sb.append(explanation);
             } else {
-                sb.append(issue.getDescription());
+                sb.append(issue.getDescription(Issue.OutputFormat.TEXT));
             }
 
             if (issue.getMoreInfo() != null) {
@@ -543,7 +545,8 @@
         public String getAdditionalProposalInfo() {
             return "Provides more information about this issue."
                     + "<br><br>" //$NON-NLS-1$
-                    + EclipseLintClient.getRegistry().getIssue(mId).getExplanationAsHtml();
+                    + EclipseLintClient.getRegistry().getIssue(mId).getExplanation(
+                            OutputFormat.HTML);
         }
 
         @Override
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintJob.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintJob.java
index 95e9f18..bd1eb72 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintJob.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintJob.java
@@ -140,7 +140,7 @@
                     if (issue == null) {
                         continue;
                     }
-                    if (issue.isAdequate(scope)) {
+                    if (issue.getImplementation().isAdequate(scope)) {
                         marker.delete();
                     }
                 }
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/BuildPreferencePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/BuildPreferencePage.java
index d5aa30a..f5f4633 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/BuildPreferencePage.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/BuildPreferencePage.java
@@ -18,6 +18,7 @@
 
 import com.android.ide.eclipse.adt.AdtPlugin;
 import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
+import com.android.ide.eclipse.adt.internal.utils.FingerprintUtils;
 import com.android.prefs.AndroidLocation.AndroidLocationException;
 import com.android.sdklib.internal.build.DebugKeyProvider;
 import com.android.sdklib.internal.build.DebugKeyProvider.KeytoolException;
@@ -25,6 +26,7 @@
 import org.eclipse.jface.preference.BooleanFieldEditor;
 import org.eclipse.jface.preference.FieldEditorPreferencePage;
 import org.eclipse.jface.preference.FileFieldEditor;
+import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.preference.RadioGroupFieldEditor;
 import org.eclipse.jface.preference.StringFieldEditor;
 import org.eclipse.swt.widgets.Composite;
@@ -36,6 +38,7 @@
 import java.io.IOException;
 import java.security.GeneralSecurityException;
 import java.security.PrivateKey;
+import java.security.cert.Certificate;
 import java.security.cert.X509Certificate;
 import java.util.Date;
 
@@ -46,9 +49,22 @@
 public class BuildPreferencePage extends FieldEditorPreferencePage implements
         IWorkbenchPreferencePage {
 
+    private IPreferenceStore mPrefStore = null;
+
+    // default key store
+    private ReadOnlyFieldEditor mDefaultKeyStore = null;
+    private LabelField mDefaultFingerprintMd5 = null;
+    private LabelField mDefaultFingerprintSha1 = null;
+
+    // custom key store
+    private KeystoreFieldEditor mCustomKeyStore = null;
+    private LabelField mCustomFingerprintMd5 = null;
+    private LabelField mCustomFingerprintSha1 = null;
+
     public BuildPreferencePage() {
         super(GRID);
-        setPreferenceStore(AdtPlugin.getDefault().getPreferenceStore());
+        mPrefStore = AdtPlugin.getDefault().getPreferenceStore();
+        setPreferenceStore(mPrefStore);
         setDescription(Messages.BuildPreferencePage_Title);
     }
 
@@ -76,12 +92,90 @@
                 getFieldEditorParent(), true);
         addField(rgfe);
 
-        addField(new ReadOnlyFieldEditor(AdtPrefs.PREFS_DEFAULT_DEBUG_KEYSTORE,
-                Messages.BuildPreferencePage_Default_KeyStore, getFieldEditorParent()));
+        // default debug keystore fingerprints
+        Fingerprints defaultFingerprints = getFingerprints(
+                mPrefStore.getString(AdtPrefs.PREFS_DEFAULT_DEBUG_KEYSTORE));
 
-        addField(new KeystoreFieldEditor(AdtPrefs.PREFS_CUSTOM_DEBUG_KEYSTORE,
-                Messages.BuildPreferencePage_Custom_Keystore, getFieldEditorParent()));
+        // default debug key store fields
+        mDefaultKeyStore = new ReadOnlyFieldEditor(AdtPrefs.PREFS_DEFAULT_DEBUG_KEYSTORE,
+                Messages.BuildPreferencePage_Default_KeyStore, getFieldEditorParent());
+        mDefaultFingerprintMd5 = new LabelField(
+                Messages.BuildPreferencePage_Default_Certificate_Fingerprint_MD5,
+                defaultFingerprints != null ? defaultFingerprints.md5 : "",
+                getFieldEditorParent());
+        mDefaultFingerprintSha1 = new LabelField(
+                Messages.BuildPreferencePage_Default_Certificate_Fingerprint_SHA1,
+                defaultFingerprints != null ? defaultFingerprints.sha1 : "",
+                getFieldEditorParent());
 
+        addField(mDefaultKeyStore);
+        addField(mDefaultFingerprintMd5);
+        addField(mDefaultFingerprintSha1);
+
+        // custom debug keystore fingerprints
+        Fingerprints customFingerprints = null;
+
+        String customDebugKeystorePath = mPrefStore.getString(AdtPrefs.PREFS_CUSTOM_DEBUG_KEYSTORE);
+        if (new File(customDebugKeystorePath).isFile()) {
+            customFingerprints = getFingerprints(customDebugKeystorePath);
+        } else {
+            // file does not exist.
+            setErrorMessage("Not a valid keystore path.");
+        }
+
+        // custom debug key store fields
+        mCustomKeyStore = new KeystoreFieldEditor(AdtPrefs.PREFS_CUSTOM_DEBUG_KEYSTORE,
+                Messages.BuildPreferencePage_Custom_Keystore, getFieldEditorParent());
+        mCustomFingerprintMd5 = new LabelField(
+                Messages.BuildPreferencePage_Default_Certificate_Fingerprint_MD5,
+                customFingerprints != null ? customFingerprints.md5 : "",
+                getFieldEditorParent());
+        mCustomFingerprintSha1 = new LabelField(
+                Messages.BuildPreferencePage_Default_Certificate_Fingerprint_SHA1,
+                customFingerprints != null ? customFingerprints.sha1 : "",
+                getFieldEditorParent());
+
+        // set fingerprint fields
+        mCustomKeyStore.setFingerprintMd5Field(mCustomFingerprintMd5);
+        mCustomKeyStore.setFingerprintSha1Field(mCustomFingerprintSha1);
+
+        addField(mCustomKeyStore);
+        addField(mCustomFingerprintMd5);
+        addField(mCustomFingerprintSha1);
+    }
+
+    /**
+     * MD5 & SHA1 fingerprints.
+     */
+    private static class Fingerprints {
+        final String md5;
+        final String sha1;
+
+        Fingerprints(String md5Val, String sha1Val) {
+            md5 = md5Val;
+            sha1 = sha1Val;
+        }
+    }
+
+    private Fingerprints getFingerprints(String keystorePath) {
+        // attempt to load the debug key.
+        try {
+            DebugKeyProvider keyProvider = new DebugKeyProvider(keystorePath,
+                    null /* storeType */, null /* key gen output */);
+
+            return new Fingerprints(
+                    FingerprintUtils.getFingerprint(keyProvider.getCertificate(), "MD5"),
+                    FingerprintUtils.getFingerprint(keyProvider.getCertificate(), "SHA1"));
+        } catch (GeneralSecurityException e) {
+            setErrorMessage(e.getMessage());
+        } catch (IOException e) {
+            setErrorMessage(e.getMessage());
+        } catch (KeytoolException e) {
+            setErrorMessage(e.getMessage());
+        } catch (AndroidLocationException e) {
+            setErrorMessage(e.getMessage());
+        }
+        return null;
     }
 
     /*
@@ -93,6 +187,27 @@
     public void init(IWorkbench workbench) {
     }
 
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.eclipse.jface.preference.FieldEditorPreferencePage#performDefaults
+     * (org.eclipse.jface.preference.PreferencePage#performDefaults)
+     */
+    @Override
+    protected void performDefaults() {
+        super.performDefaults();
+
+        // restore the default key store fingerprints
+        Fingerprints defaultFingerprints = getFingerprints(mPrefStore
+                .getString(AdtPrefs.PREFS_DEFAULT_DEBUG_KEYSTORE));
+        mDefaultFingerprintMd5.setStringValue(defaultFingerprints.md5);
+        mDefaultFingerprintSha1.setStringValue(defaultFingerprints.sha1);
+
+        // set custom fingerprint fields to blank
+        mCustomFingerprintMd5.setStringValue("");
+        mCustomFingerprintSha1.setStringValue("");
+    }
+
     /**
      * A read-only string field editor.
      */
@@ -112,9 +227,50 @@
     }
 
     /**
+     * A read-only string field.
+     */
+    private static class LabelField extends StringFieldEditor {
+        private String text;
+
+        public LabelField(String labelText, String value, Composite parent) {
+            super("", labelText, parent);
+            text = value;
+        }
+
+        @Override
+        protected void createControl(Composite parent) {
+            super.createControl(parent);
+
+            Text control = getTextControl();
+            control.setEditable(false);
+        }
+
+        @Override
+        protected void doLoad() {
+            setStringValue(text);
+        }
+
+        @Override
+        protected void doStore() {
+            // Do nothing
+        }
+    }
+
+    /**
      * Custom {@link FileFieldEditor} that checks that the keystore is valid.
      */
     private static class KeystoreFieldEditor extends FileFieldEditor {
+        private StringFieldEditor fingerprintMd5 = null;
+        private StringFieldEditor fingerprintSha1 = null;
+
+        public void setFingerprintMd5Field(StringFieldEditor field) {
+            fingerprintMd5 = field;
+        }
+
+        public void setFingerprintSha1Field(StringFieldEditor field) {
+            fingerprintSha1 = field;
+        }
+
         public KeystoreFieldEditor(String name, String label, Composite parent) {
             super(name, label, parent);
             setValidateStrategy(VALIDATE_ON_KEY_STROKE);
@@ -125,6 +281,14 @@
             String fileName = getTextControl().getText();
             fileName = fileName.trim();
 
+            if (fingerprintMd5 != null) {
+                fingerprintMd5.setStringValue("");
+            }
+
+            if (fingerprintSha1 != null) {
+                fingerprintSha1.setStringValue("");
+            }
+
             // empty values are considered ok.
             if (fileName.length() > 0) {
                 File file = new File(fileName);
@@ -141,6 +305,16 @@
                             return false;
                         }
 
+                        if (fingerprintMd5 != null) {
+                            fingerprintMd5.setStringValue(
+                                    FingerprintUtils.getFingerprint(certificate, "MD5"));
+                        }
+
+                        if (fingerprintSha1 != null) {
+                            fingerprintSha1.setStringValue(
+                                    FingerprintUtils.getFingerprint(certificate, "SHA1"));
+                        }
+
                         Date today = new Date();
                         if (certificate.getNotAfter().compareTo(today) < 0) {
                             showErrorMessage("Certificate is expired!");
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/LintPreferencePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/LintPreferencePage.java
index 6e18837..02af2fd 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/LintPreferencePage.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/LintPreferencePage.java
@@ -15,6 +15,9 @@
  */
 package com.android.ide.eclipse.adt.internal.preferences;
 
+import static com.android.tools.lint.detector.api.Issue.OutputFormat.RAW;
+import static com.android.tools.lint.detector.api.Issue.OutputFormat.TEXT;
+
 import com.android.annotations.NonNull;
 import com.android.ide.eclipse.adt.AdtPlugin;
 import com.android.ide.eclipse.adt.AdtUtils;
@@ -448,8 +451,8 @@
             Object data = item != null ? item.getData() : null;
             if (data instanceof Issue) {
                 Issue issue = (Issue) data;
-                String summary = issue.getDescription();
-                String explanation = issue.getExplanation();
+                String summary = issue.getDescription(Issue.OutputFormat.TEXT);
+                String explanation = issue.getExplanation(Issue.OutputFormat.TEXT);
 
                 StringBuilder sb = new StringBuilder(summary.length() + explanation.length() + 20);
                 sb.append(summary);
@@ -568,7 +571,7 @@
                 || issue.getCategory().getName().toLowerCase(Locale.US).startsWith(filter)
                 || issue.getCategory().getFullName().toLowerCase(Locale.US).startsWith(filter)
                 || issue.getId().toLowerCase(Locale.US).contains(filter)
-                || issue.getDescription().toLowerCase(Locale.US).contains(filter);
+                || issue.getDescription(RAW).toLowerCase(Locale.US).contains(filter);
     }
 
     private class ContentProvider extends TreeNodeContentProvider {
@@ -712,7 +715,7 @@
                 case 0:
                     return issue.getId();
                 case 1:
-                    return issue.getDescription();
+                    return issue.getDescription(TEXT);
             }
 
             return null;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/Messages.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/Messages.java
index 1474102..70b9751 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/Messages.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/Messages.java
@@ -18,8 +18,16 @@
 
     public static String BuildPreferencePage_Custom_Keystore;
 
+    public static String BuildPreferencePage_Custom_Certificate_Fingerprint_MD5;
+
+    public static String BuildPreferencePage_Custom_Certificate_Fingerprint_SHA1;
+
     public static String BuildPreferencePage_Default_KeyStore;
 
+    public static String BuildPreferencePage_Default_Certificate_Fingerprint_MD5;
+
+    public static String BuildPreferencePage_Default_Certificate_Fingerprint_SHA1;
+
     public static String BuildPreferencePage_Normal;
 
     public static String BuildPreferencePage_Silent;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/messages.properties b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/messages.properties
index 865ac19..61894fd 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/messages.properties
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/messages.properties
@@ -5,7 +5,11 @@
 BuildPreferencePage_Normal=Normal
 BuildPreferencePage_Verbose=Verbose
 BuildPreferencePage_Default_KeyStore=Default debug keystore:
+BuildPreferencePage_Default_Certificate_Fingerprint_MD5=MD5 fingerprint:
+BuildPreferencePage_Default_Certificate_Fingerprint_SHA1=SHA1 fingerprint:
 BuildPreferencePage_Custom_Keystore=Custom debug keystore:
+BuildPreferencePage_Custom_Certificate_Fingerprint_MD5=MD5 fingerprint:
+BuildPreferencePage_Custom_Certificate_Fingerprint_SHA1=SHA1 fingerprint:
 LaunchPreferencePage_Title=Launch Settings:
 LaunchPreferencePage_Default_Emu_Options=Default emulator options:
 LaunchPreferencePage_Default_HOME_Package=Default HOME package:
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/ApplicationPackageNameRefactoring.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/ApplicationPackageNameRefactoring.java
index f6fa6ee..406cebc 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/ApplicationPackageNameRefactoring.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/ApplicationPackageNameRefactoring.java
@@ -146,7 +146,7 @@
         TextEdit rewrittenImports = importVisitor.getTextEdit();
 
         // If the import of R was potentially implicit, insert an import statement
-        if (cu.getPackage().getName().getFullyQualifiedName()
+        if (rewrittenImports != null && cu.getPackage().getName().getFullyQualifiedName()
                 .equals(mOldPackageName.getFullyQualifiedName())) {
 
             UsageVisitor usageVisitor = new UsageVisitor();
@@ -438,10 +438,10 @@
                     mParser.setSource(icu);
                     CompilationUnit cu = (CompilationUnit) mParser.createAST(null);
 
-                    TextEdit text_edit = updateJavaFileImports(cu);
-                    if (text_edit.hasChildren()) {
+                    TextEdit textEdit = updateJavaFileImports(cu);
+                    if (textEdit != null && textEdit.hasChildren()) {
                         MultiTextEdit edit = new MultiTextEdit();
-                        edit.addChild(text_edit);
+                        edit.addChild(textEdit);
 
                         TextFileChange text_file_change = new TextFileChange(file.getName(), file);
                         text_file_change.setTextType(SdkConstants.EXT_JAVA);
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AdtConsoleSdkLog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AdtConsoleSdkLog.java
index 26afebd..2396a4c 100755
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AdtConsoleSdkLog.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AdtConsoleSdkLog.java
@@ -17,6 +17,7 @@
 package com.android.ide.eclipse.adt.internal.sdk;
 
 import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
 import com.android.ide.eclipse.adt.AdtPlugin;
 import com.android.utils.ILogger;
 
@@ -28,7 +29,7 @@
     private static final String TAG = "SDK Manager"; //$NON-NLS-1$
 
     @Override
-    public void error(Throwable t, String errorFormat, Object... args) {
+    public void error(@Nullable Throwable t, @Nullable String errorFormat, Object... args) {
         if (t != null) {
             AdtPlugin.logAndPrintError(t, TAG, "Error: " + errorFormat, args);
         } else {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
index 5d9c0ef..f187a3f 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
@@ -235,7 +235,8 @@
             final ArrayList<String> logMessages = new ArrayList<String>();
             ILogger log = new ILogger() {
                 @Override
-                public void error(Throwable throwable, String errorFormat, Object... arg) {
+                public void error(@Nullable Throwable throwable, @Nullable String errorFormat,
+                        Object... arg) {
                     if (errorFormat != null) {
                         logMessages.add(String.format("Error: " + errorFormat, arg));
                     }
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/utils/FingerprintUtils.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/utils/FingerprintUtils.java
new file mode 100644
index 0000000..bfe301e
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/utils/FingerprintUtils.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
+ *
+ * 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 com.android.ide.eclipse.adt.internal.utils;
+
+import java.util.Locale;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+
+public class FingerprintUtils {
+
+    /**
+     * Returns the {@link Certificate} fingerprint as returned by <code>keytool</code>.
+     *
+     * @param certificate
+     * @param hashAlgorithm
+     */
+    public static String getFingerprint(Certificate cert, String hashAlgorithm) {
+        if (cert == null) {
+            return null;
+        }
+        try {
+            MessageDigest digest = MessageDigest.getInstance(hashAlgorithm);
+            return toHexadecimalString(digest.digest(cert.getEncoded()));
+        } catch(NoSuchAlgorithmException e) {
+            // ignore
+        } catch(CertificateEncodingException e) {
+            // ignore
+        }
+        return null;
+    }
+
+    private static String toHexadecimalString(byte[] value) {
+        StringBuffer sb = new StringBuffer();
+        int len = value.length;
+        for (int i = 0; i < len; i++) {
+            int num = ((int) value[i]) & 0xff;
+            if (num < 0x10) {
+                sb.append('0');
+            }
+            sb.append(Integer.toHexString(num));
+            if (i < len - 1) {
+                sb.append(':');
+            }
+        }
+        return sb.toString().toUpperCase(Locale.US);
+    }
+}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ExportWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ExportWizard.java
index d7ace9a..62090d4 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ExportWizard.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ExportWizard.java
@@ -18,6 +18,7 @@
 
 import com.android.annotations.Nullable;
 import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.ide.eclipse.adt.internal.utils.FingerprintUtils;
 import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
 import com.android.ide.eclipse.adt.internal.project.ExportHelper;
 import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
@@ -271,6 +272,14 @@
                 if (entry != null) {
                     mPrivateKey = entry.getPrivateKey();
                     mCertificate = (X509Certificate)entry.getCertificate();
+
+                    AdtPlugin.printToConsole(mProject,
+                            String.format("New keystore %s has been created.",
+                                    mDestinationFile.getAbsolutePath()),
+                            "Certificate fingerprints:",
+                            String.format("  MD5 : %s", getCertMd5Fingerprint()),
+                            String.format("  SHA1: %s", getCertSha1Fingerprint()));
+
                 } else {
                     // this really shouldn't happen since we now let the user choose the key
                     // from a list read from the store.
@@ -334,7 +343,8 @@
 
     /*
      * (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
+     * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+     * org.eclipse.jface.viewers.IStructuredSelection)
      */
     @Override
     public void init(IWorkbench workbench, IStructuredSelection selection) {
@@ -478,6 +488,14 @@
         return mDName;
     }
 
+    String getCertSha1Fingerprint() {
+        return FingerprintUtils.getFingerprint(mCertificate, "SHA1");
+    }
+
+    String getCertMd5Fingerprint() {
+        return FingerprintUtils.getFingerprint(mCertificate, "MD5");
+    }
+
     void setSigningInfo(PrivateKey privateKey, X509Certificate certificate) {
         mPrivateKey = privateKey;
         mCertificate = certificate;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeyCheckPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeyCheckPage.java
index 39ab258..c17f43e 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeyCheckPage.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeyCheckPage.java
@@ -57,6 +57,18 @@
  */
 final class KeyCheckPage extends ExportWizardPage {
 
+    private static final int REQUIRED_YEARS = 25;
+
+    private static final String VALIDITY_WARNING =
+            "<p>Make sure the certificate is valid for the planned lifetime of the product.</p>"
+            + "<p>If the certificate expires, you will be forced to sign your application with "
+            + "a different one.</p>"
+            + "<p>Applications cannot be upgraded if their certificate changes from "
+            + "one version to another, forcing a full uninstall/install, which will make "
+            + "the user lose his/her data.</p>"
+            + "<p>Google Play(Android Market) currently requires certificates to be valid "
+            + "until 2033.</p>";
+
     private final ExportWizard mWizard;
     private PrivateKey mPrivateKey;
     private X509Certificate mCertificate;
@@ -169,12 +181,8 @@
                         String.format("<p>Certificate expires in %d years.</p>",
                         validity));
 
-                if (validity < 25) {
-                    sb.append("<p>Make sure the certificate is valid for the planned lifetime of the product.</p>");
-                    sb.append("<p>If the certificate expires, you will be forced to sign your application with a different one.</p>");
-                    sb.append("<p>Applications cannot be upgraded if their certificate changes from one version to another, ");
-                    sb.append("forcing a full uninstall/install, which will make the user lose his/her data.</p>");
-                    sb.append("<p>Android Market currently requires certificates to be valid until 2033.</p>");
+                if (validity < REQUIRED_YEARS) {
+                    sb.append(VALIDITY_WARNING);
                 }
 
                 mKeyDetails = sb.toString();
@@ -239,7 +247,7 @@
                         int expirationYear = expirationCalendar.get(Calendar.YEAR);
                         int thisYear = today.get(Calendar.YEAR);
 
-                        if (thisYear + 25 < expirationYear) {
+                        if (thisYear + REQUIRED_YEARS < expirationYear) {
                             // do nothing
                         } else {
                             if (expirationYear == thisYear) {
@@ -250,14 +258,19 @@
                                         "<p>The Certificate expires in %1$s %2$s.</p>",
                                         count, count == 1 ? "year" : "years"));
                             }
-
-                            sb.append("<p>Make sure the certificate is valid for the planned lifetime of the product.</p>");
-                            sb.append("<p>If the certificate expires, you will be forced to sign your application with a different one.</p>");
-                            sb.append("<p>Applications cannot be upgraded if their certificate changes from one version to another, ");
-                            sb.append("forcing a full uninstall/install, which will make the user lose his/her data.</p>");
-                            sb.append("<p>Android Market currently requires certificates to be valid until 2033.</p>");
+                            sb.append(VALIDITY_WARNING);
                         }
 
+                        // show certificate fingerprints
+                        String sha1 = mWizard.getCertSha1Fingerprint();
+                        String md5 = mWizard.getCertMd5Fingerprint();
+
+                        sb.append("<p></p>" /*blank line*/);
+                        sb.append("<p>Certificate fingerprints:</p>");
+                        sb.append(String.format("<li>MD5 : %s</li>", md5));
+                        sb.append(String.format("<li>SHA1: %s</li>", sha1));
+                        sb.append("<p></p>" /*blank line*/);
+
                         mKeyDetails = sb.toString();
                     }
                 } else {
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/LogCatMonitor.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/LogCatMonitor.java
index 65ddbd4..e99a637 100644
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/LogCatMonitor.java
+++ b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/LogCatMonitor.java
@@ -19,8 +19,8 @@
 import com.android.ddmlib.AndroidDebugBridge.IDeviceChangeListener;
 import com.android.ddmlib.IDevice;
 import com.android.ddmlib.Log.LogLevel;
+import com.android.ddmlib.logcat.LogCatMessage;
 import com.android.ddmuilib.logcat.ILogCatBufferChangeListener;
-import com.android.ddmuilib.logcat.LogCatMessage;
 import com.android.ddmuilib.logcat.LogCatReceiver;
 import com.android.ddmuilib.logcat.LogCatReceiverFactory;
 import com.android.ide.eclipse.ddms.views.LogCatView;
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/LogCatView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/LogCatView.java
index 3514db0..9f78c4a 100644
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/LogCatView.java
+++ b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/LogCatView.java
@@ -15,8 +15,8 @@
  */
 package com.android.ide.eclipse.ddms.views;
 
+import com.android.ddmlib.logcat.LogCatMessage;
 import com.android.ddmuilib.logcat.ILogCatMessageSelectionListener;
-import com.android.ddmuilib.logcat.LogCatMessage;
 import com.android.ddmuilib.logcat.LogCatPanel;
 import com.android.ddmuilib.logcat.LogCatStackTraceParser;
 import com.android.ide.eclipse.ddms.DdmsPlugin;
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/META-INF/MANIFEST.MF
index 3554b41..d4e8b7d 100644
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/META-INF/MANIFEST.MF
+++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/META-INF/MANIFEST.MF
@@ -10,7 +10,8 @@
 Require-Bundle: org.eclipse.ui,
  org.eclipse.core.runtime,
  org.eclipse.ui.console,
- com.android.ide.eclipse.ddms
+ com.android.ide.eclipse.ddms,
+ com.android.ide.eclipse.base
 Bundle-ClassPath: .,
  libs/hierarchyviewerlib.jar
 Export-Package: com.android.ide.eclipse.hierarchyviewer
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/.classpath b/eclipse/plugins/com.android.ide.eclipse.ndk/.classpath
index d37aeb2..58a22d6 100644
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/.classpath
+++ b/eclipse/plugins/com.android.ide.eclipse.ndk/.classpath
@@ -5,6 +5,6 @@
 	<classpathentry kind="src" path="src"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/ddmlib"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/ddmuilib"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/SdkLib"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/sdklib"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/.classpath b/eclipse/plugins/com.android.ide.eclipse.tests/.classpath
index ae0cb35..ab36b62 100644
--- a/eclipse/plugins/com.android.ide.eclipse.tests/.classpath
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/.classpath
@@ -7,8 +7,6 @@
 	<classpathentry kind="lib" path="kxml2-2.3.0.jar"/>
 	<classpathentry kind="lib" path="easymock.jar"/>
 	<classpathentry kind="lib" path="sdktestutils.jar"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ddmlib"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ddmuilib"/>
 	<classpathentry kind="lib" path="/plugin-adt/libs/ninepatch.jar" sourcepath="/ninepatch"/>
 	<classpathentry kind="lib" path="/plugin-base/libs/sdklib.jar" sourcepath="/SdkLib"/>
 	<classpathentry kind="lib" path="/plugin-adt/libs/sdkuilib.jar" sourcepath="/SdkUiLib"/>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandlerTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandlerTest.java
index 4fc2fbe..48681d0 100644
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandlerTest.java
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandlerTest.java
@@ -17,7 +17,6 @@
 
 import static com.android.SdkConstants.CURRENT_PLATFORM;
 import static com.android.SdkConstants.FD_TOOLS;
-import static com.android.SdkConstants.HIGHEST_KNOWN_API;
 import static com.android.SdkConstants.PLATFORM_WINDOWS;
 import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_MIN_API;
 import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_MIN_BUILD_API;
@@ -25,6 +24,7 @@
 
 import com.android.annotations.NonNull;
 import com.android.annotations.Nullable;
+import com.android.ide.common.sdk.SdkVersionInfo;
 import com.android.ide.eclipse.adt.AdtPlugin;
 import com.android.ide.eclipse.adt.AdtUtils;
 import com.android.ide.eclipse.adt.internal.lint.EclipseLintClient;
@@ -329,14 +329,16 @@
             }
 
             for (int minSdk = 1;
-                    minSdk <= HIGHEST_KNOWN_API;
-                    minSdk++) {
+                     minSdk <= SdkVersionInfo.HIGHEST_KNOWN_API;
+                     minSdk++) {
                 // Don't bother checking *every* single minSdk, just pick some interesting ones
                 if (!isInterestingApiLevel(minSdk)) {
                     continue;
                 }
 
-                for (int targetSdk = minSdk; targetSdk <= HIGHEST_KNOWN_API; targetSdk++) {
+                for (int targetSdk = minSdk;
+                         targetSdk <= SdkVersionInfo.HIGHEST_KNOWN_API;
+                         targetSdk++) {
                     if (!isInterestingApiLevel(targetSdk)) {
                         continue;
                     }
@@ -440,14 +442,16 @@
             }
 
             for (int minSdk = 1;
-                    minSdk <= HIGHEST_KNOWN_API;
-                    minSdk++) {
+                     minSdk <= SdkVersionInfo.HIGHEST_KNOWN_API;
+                     minSdk++) {
                 // Don't bother checking *every* single minSdk, just pick some interesting ones
                 if (!isInterestingApiLevel(minSdk)) {
                     continue;
                 }
 
-                for (int targetSdk = minSdk; targetSdk <= HIGHEST_KNOWN_API; targetSdk++) {
+                for (int targetSdk = minSdk;
+                         targetSdk <= SdkVersionInfo.HIGHEST_KNOWN_API;
+                         targetSdk++) {
                     if (!isInterestingApiLevel(targetSdk)) {
                         continue;
                     }
diff --git a/eclipse/scripts/build.xml b/eclipse/scripts/build.xml
new file mode 100644
index 0000000..67861bc
--- /dev/null
+++ b/eclipse/scripts/build.xml
@@ -0,0 +1,133 @@
+<!--
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed 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.
+
+*Sample* build.xml for ADT plugin build. Do not use for actual releases.
+
+Note: this uses the target platform from eclipse-build-deps.
+All these are newer than Eclipse 3.6.2 which is our current baseline.
+
+Note: for actual releases, use build_server.sh instead of this.
+
+To build:
+$ cd sdk/eclipse/scripts
+$ ant
+This should create the plugins in $OUT/host/eclipse/adtplugins/build/v<timestamp>-aosp
+
+-->
+<project name="com.android.eclipse.rcp.build" default="build">
+    <!-- The timestamp for the context qualifier. -->
+    <tstamp>
+        <format property="adt.timestamp"
+                pattern="yyyyMMddHHmmss" />
+    </tstamp>
+
+    <!-- Root of Android Source Tree -->
+    <property name="ANDROID_SRC" location="../../../" />
+
+    <!-- Host Eclipse used for building the RCP -->
+    <property name="basebuilder" value="${ANDROID_SRC}/external/eclipse-basebuilder/basebuilder-3.6.2/org.eclipse.releng.basebuilder/" />
+
+    <!-- Source for target prebuilts -->
+    <property name="targetSrcDir1" value="${ANDROID_SRC}/prebuilts/eclipse/" />
+    <property name="targetSrcDir2" value="${ANDROID_SRC}/prebuilts/eclipse-build-deps/" />
+
+    <!-- Location where build happens and resulting binaries are generated -->
+    <property name="outDir" value="${ANDROID_SRC}/out/host/eclipse/adtplugins/" />
+
+    <!-- Location where the target platform is created -->
+    <property name="targetDir" value="${outDir}/target" />
+
+    <!-- Location where the target platform is created -->
+    <property name="buildDir" value="${outDir}/build" />
+
+    <!-- Location of the sources -->
+    <property name="srcDir" value="${ANDROID_SRC}/sdk/eclipse/" />
+
+    <!-- locate launcher plugin inside eclipse -->
+    <path id="equinox.launcher.path">
+        <fileset dir="${basebuilder}/plugins">
+            <include name="org.eclipse.equinox.launcher_*.jar" />
+        </fileset>
+    </path>
+    <property name="equinox.launcher" refid="equinox.launcher.path" />
+
+    <!-- locate pde build plugin inside eclipse -->
+    <path id="pde.build.dir.path">
+        <dirset dir="${basebuilder}/plugins">
+            <include name="org.eclipse.pde.build_*" />
+        </dirset>
+    </path>
+    <property name="pde.build.dir" refid="pde.build.dir.path" />
+
+    <!-- create the build directory, copy plugins and features into it -->
+    <target name="copy_srcs">
+        <mkdir dir="${buildDir}" />
+        <copy todir="${buildDir}" preservelastmodified="true">
+            <fileset dir="${srcDir}/">
+                <include name="plugins/**" />
+                <include name="features/**" />
+                <exclude name="plugins/*/bin/**" />
+            </fileset>
+        </copy>
+    </target>
+
+    <!-- create target platform -->
+    <target name="create-target">
+        <mkdir dir="${targetDir}" />
+        <mkdir dir="${targetDir}/deltapack" />
+        <mkdir dir="${targetDir}/repos" />
+
+        <unzip src="${targetSrcDir1}/deltapack/eclipse-3.7.2-delta-pack.zip" dest="${targetDir}/deltapack" overwrite="false" />
+        <unzip src="${targetSrcDir1}/platform/org.eclipse.platform-3.7.2.zip" dest="${targetDir}/repos/platform" overwrite="false" />
+        <unzip src="${targetSrcDir2}/cdt/cdt-master-8.0.2.zip" dest="${targetDir}/repos/cdt" overwrite="false" />
+        <unzip src="${targetSrcDir2}/emf/emf-xsd-SDK-M201201231045.zip" dest="${targetDir}/repos/emf" overwrite="false" />
+        <unzip src="${targetSrcDir2}/jdt/org.eclipse.jdt.source-3.7.2.zip" dest="${targetDir}/repos/jdt" overwrite="false" />
+        <unzip src="${targetSrcDir2}/wtp/wtp-repo-R-3.3.2-20120210195245.zip" dest="${targetDir}/repos/wtp" overwrite="false" />
+        <unzip src="${targetSrcDir2}/gef/GEF-SDK-3.7.2.zip" dest="${targetDir}/repos/gef" overwrite="false" />
+    </target>
+
+    <!-- Launch pde build -->
+    <target name="pde-build" depends="copy_srcs, create-target">
+        <java classname="org.eclipse.equinox.launcher.Main" fork="true" failonerror="true">
+            <arg value="-application" />
+            <arg value="org.eclipse.ant.core.antRunner" />
+            <arg value="-buildfile" />
+            <arg value="${pde.build.dir}/scripts/build.xml" />
+            <arg value="-data" />
+            <arg value="${buildDir}/workspace" />
+            <arg value="-configuration" />
+            <arg value="${buildDir}/configuration" />
+            <arg value="-Dbuilder=${srcDir}/buildConfig" />
+            <arg value="-Dtimestamp=${timestamp}" />
+            <arg value="-DeclipseLocation=${baseBuilder}" />
+            <arg value="-DbuildDirectory=${buildDir}" />
+            <arg value="-DbaseLocation=${targetDir}/deltapack/eclipse" />
+            <arg value="-DrepoBaseLocation=${targetDir}/repos/" />
+            <arg value="-DtransformedRepoLocation=${targetDir}/transformedRepos/" />
+            <arg value="-DupdateSiteSource=${srcDir}/sites/external" />
+            <arg value="-DforceContextQualifier=v${adt.timestamp}-aosp" />
+            <classpath>
+                <pathelement location="${equinox.launcher}" />
+            </classpath>
+        </java>
+    </target>
+
+    <target name="clean">
+        <delete dir="${outDir}" />
+        <delete dir="${targetDir}" />
+    </target>
+
+    <target name="build" depends="pde-build" />
+</project>
diff --git a/eclipse/scripts/create_all_symlinks.sh b/eclipse/scripts/create_all_symlinks.sh
index 3130cf1..8f48fb7 100755
--- a/eclipse/scripts/create_all_symlinks.sh
+++ b/eclipse/scripts/create_all_symlinks.sh
@@ -211,7 +211,7 @@
 
 if [[ $PLATFORM != "windows-x86" ]]; then
   # liblzf doesn't build under cygwin. If necessary, this should be fixed first.
-  
+
   GLD_DEST="sdk/eclipse/plugins/com.android.ide.eclipse.gldebugger/libs"
   GLD_LIBS="host-libprotobuf-java-2.3.0-lite liblzf"
 
@@ -219,6 +219,22 @@
   CP_FILES="$CP_FILES @:$GLD_DEST $GLD_LIBS"
 fi
 
+# If some of the libs are available in prebuilts/devtools, use link to them directly
+# instead of trying to rebuild them so remove them from the libs to build. Note that
+# they are already listed in CP_FILES so we'll adjust the source to copy later.
+
+LIBS2=""
+for LIB in $LIBS; do
+  J="prebuilts/devtools/$LIB.jar"
+  if [[ -f $J ]]; then
+    warn "## Using existing $J"
+  else
+    LIBS2="$LIBS2 $LIB"
+  fi
+done
+LIBS="$LIBS2"
+unset LIBS2
+
 # In the mode to only echo dependencies, output them and we're done
 if [[ -n $ONLY_SHOW_DEPS ]]; then
   echo $LIBS
@@ -254,7 +270,11 @@
   fi
   if [[ ! -f "$SRC" ]]; then
     ORIG_SRC="$SRC"
-    SRC="out/host/$PLATFORM/framework/$SRC.jar"
+    # Take a prebuilts/devtools instead of a framework one if possible.
+    SRC="prebuilts/devtools/$SRC.jar"
+    if [[ ! -f "$SRC" ]]; then
+      SRC="out/host/$PLATFORM/framework/$ORIG_SRC.jar"
+    fi
   fi
   if [[ -f "$SRC" ]]; then
     if [[ ! -d "$DEST" ]]; then
diff --git a/hierarchyviewer/etc/manifest.txt b/hierarchyviewer/etc/manifest.txt
index f7ddfa9..06efd79 100644
--- a/hierarchyviewer/etc/manifest.txt
+++ b/hierarchyviewer/etc/manifest.txt
@@ -1,2 +1,2 @@
 Main-Class: com.android.hierarchyviewer.HierarchyViewer
-Class-Path: ddmlib.jar swing-worker-1.1.jar org-openide-util.jar org-netbeans-api-visual.jar
+Class-Path: ddmlib.jar org-openide-util.jar org-netbeans-api-visual.jar
diff --git a/hierarchyviewer/src/Android.mk b/hierarchyviewer/src/Android.mk
index a578218..e84c8f8 100644
--- a/hierarchyviewer/src/Android.mk
+++ b/hierarchyviewer/src/Android.mk
@@ -21,7 +21,6 @@
 LOCAL_JAR_MANIFEST := ../etc/manifest.txt
 LOCAL_JAVA_LIBRARIES := \
 	ddmlib \
-	swing-worker-1.1 \
 	org-openide-util \
 	org-netbeans-api-visual
 LOCAL_MODULE := hierarchyviewer
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/ScreenViewer.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/ScreenViewer.java
index 3b0662f..bae1270 100644
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/ScreenViewer.java
+++ b/hierarchyviewer/src/com/android/hierarchyviewer/ui/ScreenViewer.java
@@ -2,54 +2,53 @@
 
 import com.android.ddmlib.IDevice;
 import com.android.ddmlib.RawImage;
-import com.android.hierarchyviewer.util.WorkerThread;
 import com.android.hierarchyviewer.scene.ViewNode;
-import com.android.hierarchyviewer.ui.util.PngFileFilter;
 import com.android.hierarchyviewer.ui.util.IconLoader;
+import com.android.hierarchyviewer.ui.util.PngFileFilter;
+import com.android.hierarchyviewer.util.WorkerThread;
 
-import javax.swing.JComponent;
-import javax.swing.JScrollPane;
-import javax.swing.Timer;
-import javax.swing.JPanel;
-import javax.swing.SwingUtilities;
-import javax.swing.BorderFactory;
-import javax.swing.JLabel;
-import javax.swing.JSlider;
-import javax.swing.Box;
-import javax.swing.JCheckBox;
-import javax.swing.JButton;
-import javax.swing.JFileChooser;
-import javax.swing.event.ChangeListener;
-import javax.swing.event.ChangeEvent;
-import javax.imageio.ImageIO;
-
-import org.jdesktop.swingworker.SwingWorker;
-
-import java.io.IOException;
-import java.io.File;
-import java.awt.image.BufferedImage;
-import java.awt.Graphics;
-import java.awt.Dimension;
-import java.awt.BorderLayout;
-import java.awt.Graphics2D;
-import java.awt.Color;
-import java.awt.Rectangle;
-import java.awt.Point;
-import java.awt.GridBagLayout;
-import java.awt.GridBagConstraints;
-import java.awt.Insets;
-import java.awt.FlowLayout;
 import java.awt.AlphaComposite;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
 import java.awt.RenderingHints;
-import java.awt.event.ActionListener;
 import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseMotionAdapter;
 import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
 import java.util.concurrent.ExecutionException;
 
+import javax.imageio.ImageIO;
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSlider;
+import javax.swing.SwingUtilities;
+import javax.swing.SwingWorker;
+import javax.swing.Timer;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
 class ScreenViewer extends JPanel implements ActionListener {
     private final Workspace workspace;
     private final IDevice device;
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java
index 82375e0..bfa15b3 100644
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java
+++ b/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java
@@ -22,43 +22,70 @@
 import com.android.hierarchyviewer.device.Window;
 import com.android.hierarchyviewer.laf.UnifiedContentBorder;
 import com.android.hierarchyviewer.scene.CaptureLoader;
+import com.android.hierarchyviewer.scene.ProfilesLoader;
 import com.android.hierarchyviewer.scene.VersionLoader;
 import com.android.hierarchyviewer.scene.ViewHierarchyLoader;
 import com.android.hierarchyviewer.scene.ViewHierarchyScene;
 import com.android.hierarchyviewer.scene.ViewManager;
 import com.android.hierarchyviewer.scene.ViewNode;
 import com.android.hierarchyviewer.scene.WindowsLoader;
-import com.android.hierarchyviewer.scene.ProfilesLoader;
+import com.android.hierarchyviewer.ui.action.CaptureLayersAction;
+import com.android.hierarchyviewer.ui.action.CaptureNodeAction;
 import com.android.hierarchyviewer.ui.action.DumpDisplayListAction;
+import com.android.hierarchyviewer.ui.action.ExitAction;
+import com.android.hierarchyviewer.ui.action.InvalidateAction;
+import com.android.hierarchyviewer.ui.action.LoadGraphAction;
+import com.android.hierarchyviewer.ui.action.RefreshWindowsAction;
+import com.android.hierarchyviewer.ui.action.RequestLayoutAction;
+import com.android.hierarchyviewer.ui.action.SaveSceneAction;
+import com.android.hierarchyviewer.ui.action.ShowDevicesAction;
+import com.android.hierarchyviewer.ui.action.StartServerAction;
+import com.android.hierarchyviewer.ui.action.StopServerAction;
+import com.android.hierarchyviewer.ui.model.ProfilesTableModel;
+import com.android.hierarchyviewer.ui.model.PropertiesTableModel;
+import com.android.hierarchyviewer.ui.model.ViewsTreeModel;
+import com.android.hierarchyviewer.ui.util.IconLoader;
+import com.android.hierarchyviewer.ui.util.PngFileFilter;
 import com.android.hierarchyviewer.ui.util.PsdFileFilter;
 import com.android.hierarchyviewer.util.OS;
 import com.android.hierarchyviewer.util.WorkerThread;
-import com.android.hierarchyviewer.ui.action.ShowDevicesAction;
-import com.android.hierarchyviewer.ui.action.RequestLayoutAction;
-import com.android.hierarchyviewer.ui.action.InvalidateAction;
-import com.android.hierarchyviewer.ui.action.CaptureNodeAction;
-import com.android.hierarchyviewer.ui.action.CaptureLayersAction;
-import com.android.hierarchyviewer.ui.action.RefreshWindowsAction;
-import com.android.hierarchyviewer.ui.action.StopServerAction;
-import com.android.hierarchyviewer.ui.action.StartServerAction;
-import com.android.hierarchyviewer.ui.action.ExitAction;
-import com.android.hierarchyviewer.ui.action.LoadGraphAction;
-import com.android.hierarchyviewer.ui.action.SaveSceneAction;
-import com.android.hierarchyviewer.ui.util.PngFileFilter;
-import com.android.hierarchyviewer.ui.util.IconLoader;
-import com.android.hierarchyviewer.ui.model.PropertiesTableModel;
-import com.android.hierarchyviewer.ui.model.ViewsTreeModel;
-import com.android.hierarchyviewer.ui.model.ProfilesTableModel;
-import org.jdesktop.swingworker.SwingWorker;
+
 import org.netbeans.api.visual.graph.layout.TreeGraphLayout;
 import org.netbeans.api.visual.model.ObjectSceneEvent;
 import org.netbeans.api.visual.model.ObjectSceneEventType;
 import org.netbeans.api.visual.model.ObjectSceneListener;
 import org.netbeans.api.visual.model.ObjectState;
 
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Graphics2D;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Image;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseWheelEvent;
+import java.awt.event.MouseWheelListener;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
 import javax.imageio.ImageIO;
 import javax.swing.ActionMap;
 import javax.swing.BorderFactory;
+import javax.swing.Box;
 import javax.swing.ButtonGroup;
 import javax.swing.ImageIcon;
 import javax.swing.JButton;
@@ -72,56 +99,31 @@
 import javax.swing.JMenuItem;
 import javax.swing.JPanel;
 import javax.swing.JProgressBar;
-import javax.swing.JScrollPane;
 import javax.swing.JScrollBar;
+import javax.swing.JScrollPane;
 import javax.swing.JSlider;
 import javax.swing.JSplitPane;
 import javax.swing.JTable;
+import javax.swing.JTextField;
 import javax.swing.JToggleButton;
 import javax.swing.JToolBar;
+import javax.swing.JTree;
 import javax.swing.ListSelectionModel;
 import javax.swing.SwingUtilities;
-import javax.swing.JTree;
-import javax.swing.Box;
-import javax.swing.JTextField;
-import javax.swing.text.Document;
-import javax.swing.text.BadLocationException;
-import javax.swing.tree.TreePath;
-import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.SwingWorker;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
-import javax.swing.event.TreeSelectionListener;
 import javax.swing.event.TreeSelectionEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.event.DocumentEvent;
+import javax.swing.event.TreeSelectionListener;
 import javax.swing.table.DefaultTableModel;
-import java.awt.image.BufferedImage;
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.GridBagLayout;
-import java.awt.GridBagConstraints;
-import java.awt.Insets;
-import java.awt.FlowLayout;
-import java.awt.Color;
-import java.awt.Image;
-import java.awt.Graphics2D;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseWheelEvent;
-import java.awt.event.MouseWheelListener;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-import java.util.concurrent.ExecutionException;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.tree.TreePath;
 
 public class Workspace extends JFrame {
     private JLabel viewCountLabel;
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/BackgroundAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/BackgroundAction.java
index 051e3f3..b2046fd 100644
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/BackgroundAction.java
+++ b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/BackgroundAction.java
@@ -16,9 +16,8 @@
 
 package com.android.hierarchyviewer.ui.action;
 
-import org.jdesktop.swingworker.SwingWorker;
-
 import javax.swing.AbstractAction;
+import javax.swing.SwingWorker;
 
 public abstract class BackgroundAction extends AbstractAction {
     protected void executeBackgroundTask(SwingWorker<?, ?> worker) {
diff --git a/hierarchyviewer2/app/etc/manifest.txt b/hierarchyviewer2/app/etc/manifest.txt
index 0caa3c2..68222bd 100644
--- a/hierarchyviewer2/app/etc/manifest.txt
+++ b/hierarchyviewer2/app/etc/manifest.txt
@@ -1,2 +1,2 @@
 Main-Class: com.android.hierarchyviewer.HierarchyViewerApplication
-Class-Path: ddmlib.jar ddmuilib.jar hierarchyviewerlib.jar sdklib.jar org.eclipse.jface_3.6.2.M20110210-1200.jar org.eclipse.core.commands_3.6.0.I20100512-1500.jar org.eclipse.equinox.common_3.6.0.v20100503.jar
+Class-Path: ddmlib.jar ddmuilib.jar hierarchyviewerlib.jar sdklib.jar org.eclipse.jface_3.6.2.M20110210-1200.jar org.eclipse.core.commands_3.6.0.I20100512-1500.jar org.eclipse.equinox.common_3.6.0.v20100503.jar guava-tools.jar
diff --git a/hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplication.java b/hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplication.java
index 38f10bc..8983f67 100644
--- a/hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplication.java
+++ b/hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplication.java
@@ -47,6 +47,7 @@
 import com.android.hierarchyviewerlib.models.TreeViewModel;
 import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener;
 import com.android.hierarchyviewerlib.ui.DeviceSelector;
+import com.android.hierarchyviewerlib.ui.InvokeMethodPrompt;
 import com.android.hierarchyviewerlib.ui.LayoutViewer;
 import com.android.hierarchyviewerlib.ui.PixelPerfect;
 import com.android.hierarchyviewerlib.ui.PixelPerfectControls;
@@ -127,9 +128,9 @@
     private LayoutViewer mLayoutViewer;
     private PixelPerfectLoupe mPixelPerfectLoupe;
     private Composite mTreeViewControls;
+    private InvokeMethodPrompt mInvokeMethodPrompt;
 
     private ActionButton dumpDisplayList;
-    private ActionButton mProfileNodes;
 
     private HierarchyViewerDirector mDirector;
 
@@ -428,8 +429,13 @@
         new TreeViewOverview(treeViewOverviewContainer);
 
         Composite propertyViewerContainer = new Composite(sideSash, SWT.BORDER);
-        propertyViewerContainer.setLayout(new FillLayout());
-        new PropertyViewer(propertyViewerContainer);
+        propertyViewerContainer.setLayout(new GridLayout());
+
+        PropertyViewer pv = new PropertyViewer(propertyViewerContainer);
+        pv.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+        mInvokeMethodPrompt = new InvokeMethodPrompt(propertyViewerContainer);
+        mInvokeMethodPrompt.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 
         Composite layoutViewerContainer = new Composite(sideSash, SWT.NONE);
         GridLayout layoutViewerLayout = new GridLayout();
@@ -695,6 +701,8 @@
         mTreeViewButton.setSelection(true);
         mTreeViewButton.setImage(mTreeViewSelectedImage);
 
+        mInvokeMethodPrompt.setEnabled(hvDevice.isViewUpdateEnabled());
+
         mPixelPerfectButton.setSelection(false);
         mPixelPerfectButton.setImage(mPixelPerfectImage);
 
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/.classpath b/hierarchyviewer2/libs/hierarchyviewerlib/.classpath
index 105d22e..779f384 100644
--- a/hierarchyviewer2/libs/hierarchyviewerlib/.classpath
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/.classpath
@@ -4,6 +4,8 @@
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/ddmlib"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/ddmuilib"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/common"/>
+	<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/guava-tools/guava-13.0.1.jar" sourcepath="/ANDROID_SRC/prebuilts/tools/common/guava-tools/src.zip"/>
 	<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/linux-x86/swt/swt.jar"/>
 	<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/eclipse/org.eclipse.core.commands_3.6.0.I20100512-1500.jar"/>
 	<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/eclipse/org.eclipse.equinox.common_3.6.0.v20100503.jar"/>
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt b/hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt
index 3805b59..984261a 100644
--- a/hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt
@@ -1 +1 @@
-Class-Path: ddmlib.jar ddmuilib.jar hierarchyviewerlib.jar org.eclipse.jface_3.6.2.M20110210-1200.jar org.eclipse.core.commands_3.6.0.I20100512-1500.jar org.eclipse.equinox.common_3.6.0.v20100503.jar
+Class-Path: ddmlib.jar ddmuilib.jar hierarchyviewerlib.jar org.eclipse.jface_3.6.2.M20110210-1200.jar org.eclipse.core.commands_3.6.0.I20100512-1500.jar org.eclipse.equinox.common_3.6.0.v20100503.jar guava-13.0.1.jar common.jar
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/Android.mk b/hierarchyviewer2/libs/hierarchyviewerlib/src/Android.mk
index 1afbc92..59753e1 100644
--- a/hierarchyviewer2/libs/hierarchyviewerlib/src/Android.mk
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/Android.mk
@@ -20,8 +20,10 @@
 
 LOCAL_JAR_MANIFEST := ../manifest.txt
 
-LOCAL_JAVA_LIBRARIES := ddmlib \
+LOCAL_JAVA_LIBRARIES := common \
+    ddmlib \
     ddmuilib \
+    guava-tools \
     swt \
     org.eclipse.jface_3.6.2.M20110210-1200 \
     org.eclipse.core.commands_3.6.0.I20100512-1500
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/HierarchyViewerDirector.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/HierarchyViewerDirector.java
index 0f0cf65..cba35f2 100644
--- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/HierarchyViewerDirector.java
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/HierarchyViewerDirector.java
@@ -48,6 +48,7 @@
 import java.io.FileOutputStream;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Timer;
 import java.util.TimerTask;
@@ -615,6 +616,20 @@
         }
     }
 
+    public void invokeMethodOnSelectedView(final String method, final List<Object> args) {
+        final DrawableViewNode selectedNode = TreeViewModel.getModel().getSelection();
+        if (selectedNode != null) {
+            executeInBackground("Invoke View Method", new Runnable() {
+                @Override
+                public void run() {
+                    IHvDevice hvDevice = getHvDevice(selectedNode.viewNode.window.getDevice());
+                    hvDevice.invokeViewMethod(selectedNode.viewNode.window, selectedNode.viewNode,
+                            method, args);
+                }
+            });
+        }
+    }
+
     public void loadAllViews() {
         executeInBackground("Loading all views", new Runnable() {
             @Override
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DdmViewDebugDevice.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DdmViewDebugDevice.java
index 0a6e938..0172995 100644
--- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DdmViewDebugDevice.java
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DdmViewDebugDevice.java
@@ -144,7 +144,7 @@
                 try {
                     HandleViewDebug.listViewRoots(c, handler);
                 } catch (IOException e) {
-                    Log.e(TAG, e);
+                    Log.i(TAG, "No connection to client: " + cd.getClientDescription());
                     continue;
                 }
 
@@ -215,7 +215,11 @@
             return null;
         }
 
-        byte[] data = handler.getData(10, TimeUnit.SECONDS);
+        byte[] data = handler.getData(20, TimeUnit.SECONDS);
+        if (data == null) {
+            return null;
+        }
+
         String viewHierarchy = new String(data, Charset.forName("UTF-8"));
         return DeviceBridge.parseViewHierarchy(new BufferedReader(new StringReader(viewHierarchy)),
                 window);
@@ -370,4 +374,44 @@
             reloadWindows();
         }
     }
+
+    @Override
+    public boolean isViewUpdateEnabled() {
+        return true;
+    }
+
+    @Override
+    public void invokeViewMethod(Window window, ViewNode viewNode, String method,
+            List<?> args) {
+        Client c = window.getClient();
+        if (c == null) {
+            return;
+        }
+
+        String viewRoot = window.getTitle();
+        try {
+            HandleViewDebug.invokeMethod(c, viewRoot, viewNode.toString(), method, args.toArray());
+        } catch (IOException e) {
+            Log.e(TAG, e);
+        }
+    }
+
+    @Override
+    public boolean setLayoutParameter(Window window, ViewNode viewNode, String property,
+            int value) {
+        Client c = window.getClient();
+        if (c == null) {
+            return false;
+        }
+
+        String viewRoot = window.getTitle();
+        try {
+            HandleViewDebug.setLayoutParameter(c, viewRoot, viewNode.toString(), property, value);
+        } catch (IOException e) {
+            Log.e(TAG, e);
+            return false;
+        }
+
+        return true;
+    }
 }
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/HvDeviceFactory.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/HvDeviceFactory.java
index c38a9cc..24a5a4f 100644
--- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/HvDeviceFactory.java
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/HvDeviceFactory.java
@@ -21,13 +21,26 @@
 import com.android.ddmlib.IDevice;
 
 public class HvDeviceFactory {
-    private static final boolean ALWAYS_USE_VIEWSERVER = false; // for debugging
+    private static final String sHvProtoEnvVar =
+            System.getenv("ANDROID_HVPROTO"); //$NON-NLS-1$
 
     public static IHvDevice create(IDevice device) {
-        if (ALWAYS_USE_VIEWSERVER) {
+        // default to old mechanism until the new one is fully tested
+        if (sHvProtoEnvVar == null ||
+                !"ddm".equalsIgnoreCase(sHvProtoEnvVar)) { //$NON-NLS-1$
             return new ViewServerDevice(device);
         }
 
+        // Wait for a few seconds after the device has been connected to
+        // allow all the clients to be initialized. Specifically, we need to wait
+        // until the client data is filled with the list of features supported
+        // by the client.
+        try {
+            Thread.sleep(2000);
+        } catch (InterruptedException e) {
+            // ignore
+        }
+
         boolean ddmViewHierarchy = false;
 
         // see if any of the clients on the device support view hierarchy via DDMS
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/IHvDevice.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/IHvDevice.java
index fe8d1ba..6f1fd37 100644
--- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/IHvDevice.java
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/IHvDevice.java
@@ -24,6 +24,8 @@
 
 import org.eclipse.swt.graphics.Image;
 
+import java.util.List;
+
 /** Represents a device that can perform view debug operations. */
 public interface IHvDevice {
     /**
@@ -51,6 +53,10 @@
     void requestLayout(ViewNode viewNode);
     void outputDisplayList(ViewNode viewNode);
 
+    boolean isViewUpdateEnabled();
+    void invokeViewMethod(Window window, ViewNode viewNode, String method, List<?> args);
+    boolean setLayoutParameter(Window window, ViewNode viewNode, String property, int value);
+
     void addWindowChangeListener(IWindowChangeListener l);
     void removeWindowChangeListener(IWindowChangeListener l);
 }
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/ViewServerDevice.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/ViewServerDevice.java
index 4bd5d6b..4445e9a 100644
--- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/ViewServerDevice.java
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/ViewServerDevice.java
@@ -26,6 +26,8 @@
 
 import org.eclipse.swt.graphics.Image;
 
+import java.util.List;
+
 public class ViewServerDevice extends AbstractHvDevice {
     static final String TAG = "ViewServerDevice";
 
@@ -135,15 +137,33 @@
 
     @Override
     public void addWindowChangeListener(IWindowChangeListener l) {
-        if (mViewServerInfo.protocolVersion >= 3) {
+        if (mViewServerInfo != null && mViewServerInfo.protocolVersion >= 3) {
             WindowUpdater.startListenForWindowChanges(l, mDevice);
         }
     }
 
     @Override
     public void removeWindowChangeListener(IWindowChangeListener l) {
-        if (mViewServerInfo.protocolVersion >= 3) {
+        if (mViewServerInfo != null && mViewServerInfo.protocolVersion >= 3) {
             WindowUpdater.stopListenForWindowChanges(l, mDevice);
         }
     }
+
+    @Override
+    public boolean isViewUpdateEnabled() {
+        return false;
+    }
+
+    @Override
+    public void invokeViewMethod(Window window, ViewNode viewNode, String method,
+            List<?> args) {
+        // not supported
+    }
+
+    @Override
+    public boolean setLayoutParameter(Window window, ViewNode viewNode, String property,
+            int value) {
+        // not supported
+        return false;
+    }
 }
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/WindowUpdater.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/WindowUpdater.java
index 9dbb989..a67d400 100644
--- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/WindowUpdater.java
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/WindowUpdater.java
@@ -72,6 +72,9 @@
     public static void stopListenForWindowChanges(IWindowChangeListener listener, IDevice device) {
         synchronized (sWindowChangeListeners) {
             ArrayList<IWindowChangeListener> listeners = sWindowChangeListeners.get(device);
+            if (listeners == null) {
+                return;
+            }
             listeners.remove(listener);
             // There are more listeners, so don't stop the listening thread.
             if (listeners.size() != 0) {
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/DevicePropertyEditingSupport.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/DevicePropertyEditingSupport.java
new file mode 100644
index 0000000..1bbc97f
--- /dev/null
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/DevicePropertyEditingSupport.java
@@ -0,0 +1,302 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed 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 com.android.hierarchyviewerlib.ui;
+
+import com.android.SdkConstants;
+import com.android.hierarchyviewerlib.device.IHvDevice;
+import com.android.hierarchyviewerlib.models.ViewNode;
+import com.android.hierarchyviewerlib.models.ViewNode.Property;
+import com.android.utils.SdkUtils;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableSet;
+
+import java.text.ParseException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+public class DevicePropertyEditingSupport {
+    public enum PropertyType {
+        INTEGER,
+        INTEGER_OR_CONSTANT,
+        ENUM,
+    };
+
+    private static final List<IDevicePropertyEditor> sDevicePropertyEditors = Arrays.asList(
+                new LayoutPropertyEditor(),
+                new PaddingPropertyEditor()
+            );
+
+    public boolean canEdit(Property p) {
+        return getPropertyEditorFor(p) != null;
+    }
+
+    private IDevicePropertyEditor getPropertyEditorFor(Property p) {
+        for (IDevicePropertyEditor pe: sDevicePropertyEditors) {
+            if (pe.canEdit(p)) {
+                return pe;
+            }
+        }
+
+        return null;
+    }
+
+    public PropertyType getPropertyType(Property p) {
+        return getPropertyEditorFor(p).getType(p);
+    }
+
+    public String[] getPropertyRange(Property p) {
+        return getPropertyEditorFor(p).getPropertyRange(p);
+    }
+
+    public boolean setValue(Collection<Property> properties, Property p, Object newValue,
+            ViewNode viewNode, IHvDevice device) {
+        return getPropertyEditorFor(p).setValue(properties, p, newValue, viewNode, device);
+    }
+
+    private static String stripCategoryPrefix(String name) {
+        return name.substring(name.indexOf(':') + 1);
+    }
+
+    private interface IDevicePropertyEditor {
+        boolean canEdit(Property p);
+        PropertyType getType(Property p);
+        String[] getPropertyRange(Property p);
+        boolean setValue(Collection<Property> properties, Property p, Object newValue,
+                ViewNode viewNode, IHvDevice device);
+    }
+
+    private static class LayoutPropertyEditor implements IDevicePropertyEditor {
+        private static final Set<String> sLayoutPropertiesWithStringValues =
+                ImmutableSet.of(SdkConstants.ATTR_LAYOUT_WIDTH,
+                        SdkConstants.ATTR_LAYOUT_HEIGHT,
+                        SdkConstants.ATTR_LAYOUT_GRAVITY);
+
+        private static final int MATCH_PARENT = -1;
+        private static final int FILL_PARENT = -1;
+        private static final int WRAP_CONTENT = -2;
+
+        private enum LayoutGravity {
+            top(0x30),
+            bottom(0x50),
+            left(0x03),
+            right(0x05),
+            center_vertical(0x10),
+            fill_vertical(0x70),
+            center_horizontal(0x01),
+            fill_horizontal(0x07),
+            center(0x11),
+            fill(0x77),
+            clip_vertical(0x80),
+            clip_horizontal(0x08),
+            start(0x00800003),
+            end(0x00800005);
+
+            private final int mValue;
+
+            private LayoutGravity(int v) {
+                mValue = v;
+            }
+        }
+
+        /**
+         * Returns true if this is a layout property with either a known string value, or an
+         * integer value.
+         */
+        @Override
+        public boolean canEdit(Property p) {
+            String name = stripCategoryPrefix(p.name);
+            if (!name.startsWith(SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX)) {
+                return false;
+            }
+
+            if (sLayoutPropertiesWithStringValues.contains(name)) {
+                return true;
+            }
+
+            try {
+                SdkUtils.parseLocalizedInt(p.value);
+                return true;
+            } catch (ParseException e) {
+                return false;
+            }
+        }
+
+        @Override
+        public PropertyType getType(Property p) {
+            String name = stripCategoryPrefix(p.name);
+            if (sLayoutPropertiesWithStringValues.contains(name)) {
+                return PropertyType.INTEGER_OR_CONSTANT;
+            } else {
+                return PropertyType.INTEGER;
+            }
+        }
+
+        @Override
+        public String[] getPropertyRange(Property p) {
+            return new String[0];
+        }
+
+        @Override
+        public boolean setValue(Collection<Property> properties, Property p, Object newValue,
+                ViewNode viewNode, IHvDevice device) {
+            String name = stripCategoryPrefix(p.name);
+
+            // nothing to do if same as current value
+            if (p.value.equals(newValue)) {
+                return false;
+            }
+
+            int value = -1;
+            String textValue = null;
+
+            if (SdkConstants.ATTR_LAYOUT_GRAVITY.equals(name)) {
+                value = 0;
+                StringBuilder sb = new StringBuilder(20);
+                for (String attr: Splitter.on('|').split((String) newValue)) {
+                    LayoutGravity g;
+                    try {
+                        g = LayoutGravity.valueOf(attr);
+                    } catch (IllegalArgumentException e) {
+                        // ignore this gravity attribute
+                        continue;
+                    }
+
+                    value |= g.mValue;
+
+                    if (sb.length() > 0) {
+                        sb.append('|');
+                    }
+                    sb.append(g.name());
+                }
+                textValue = sb.toString();
+            } else if (SdkConstants.ATTR_LAYOUT_HEIGHT.equals(name)
+                    || SdkConstants.ATTR_LAYOUT_WIDTH.equals(name)) {
+                // newValue is of type string, but its contents may be a named constant or a integer
+                String s = (String) newValue;
+                if (s.equalsIgnoreCase(SdkConstants.VALUE_MATCH_PARENT)) {
+                    textValue = SdkConstants.VALUE_MATCH_PARENT;
+                    value = MATCH_PARENT;
+                } else if (s.equalsIgnoreCase(SdkConstants.VALUE_FILL_PARENT)) {
+                    textValue = SdkConstants.VALUE_FILL_PARENT;
+                    value = FILL_PARENT;
+                } else if (s.equalsIgnoreCase(SdkConstants.VALUE_WRAP_CONTENT)) {
+                    textValue = SdkConstants.VALUE_WRAP_CONTENT;
+                    value = WRAP_CONTENT;
+                }
+            }
+
+            if (textValue == null) {
+                try {
+                    value = Integer.parseInt((String) newValue);
+                } catch (NumberFormatException e) {
+                    return false;
+                }
+            }
+
+            // attempt to set the value on the device
+            name = name.substring(SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX.length());
+            if (device.setLayoutParameter(viewNode.window, viewNode, name, value)) {
+                p.value = textValue != null ? textValue : (String) newValue;
+            }
+
+            return true;
+        }
+    }
+
+    private static class PaddingPropertyEditor implements IDevicePropertyEditor {
+        // These names should match the field names used for padding in the Framework's View class
+        private static final String PADDING_LEFT = "mPaddingLeft";      //$NON-NLS-1$
+        private static final String PADDING_RIGHT = "mPaddingRight";    //$NON-NLS-1$
+        private static final String PADDING_TOP = "mPaddingTop";        //$NON-NLS-1$
+        private static final String PADDING_BOTTOM = "mPaddingBottom";  //$NON-NLS-1$
+
+        private static final Set<String> sPaddingProperties = ImmutableSet.of(
+                PADDING_LEFT, PADDING_RIGHT, PADDING_TOP, PADDING_BOTTOM);
+
+        @Override
+        public boolean canEdit(Property p) {
+            return sPaddingProperties.contains(stripCategoryPrefix(p.name));
+        }
+
+        @Override
+        public PropertyType getType(Property p) {
+            return PropertyType.INTEGER;
+        }
+
+        @Override
+        public String[] getPropertyRange(Property p) {
+            return new String[0];
+        }
+
+        /**
+         * Set padding: Since the only view method is setPadding(l, t, r, b), we need access
+         * to all 4 padding's to update any particular one.
+         */
+        @Override
+        public boolean setValue(Collection<Property> properties, Property prop, Object newValue,
+                ViewNode viewNode, IHvDevice device) {
+            int v;
+            try {
+                v = Integer.parseInt((String) newValue);
+            } catch (NumberFormatException e) {
+                return false;
+            }
+
+            int pLeft = 0;
+            int pRight = 0;
+            int pTop = 0;
+            int pBottom = 0;
+
+            String propName = stripCategoryPrefix(prop.name);
+            for (Property p: properties) {
+                String name = stripCategoryPrefix(p.name);
+                if (!sPaddingProperties.contains(name)) {
+                    continue;
+                }
+
+                if (name.equals(PADDING_LEFT)) {
+                    pLeft = propName.equals(PADDING_LEFT) ?
+                            v : SdkUtils.parseLocalizedInt(p.value, 0);
+                } else if (name.equals(PADDING_RIGHT)) {
+                    pRight = propName.equals(PADDING_RIGHT) ?
+                            v : SdkUtils.parseLocalizedInt(p.value, 0);
+                } else if (name.equals(PADDING_TOP)) {
+                    pTop = propName.equals(PADDING_TOP) ?
+                            v : SdkUtils.parseLocalizedInt(p.value, 0);
+                } else if (name.equals(PADDING_BOTTOM)) {
+                    pBottom = propName.equals(PADDING_BOTTOM) ?
+                            v : SdkUtils.parseLocalizedInt(p.value, 0);
+                }
+            }
+
+            // invoke setPadding() on the device
+            device.invokeViewMethod(viewNode.window, viewNode, "setPadding", Arrays.asList(
+                    Integer.valueOf(pLeft),
+                    Integer.valueOf(pTop),
+                    Integer.valueOf(pRight),
+                    Integer.valueOf(pBottom)
+            ));
+
+            // update the value set in the property (to avoid reading all properties back from
+            // the device)
+            prop.value = Integer.toString(v);
+            return true;
+        }
+    }
+}
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/DeviceSelector.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/DeviceSelector.java
index c3154c8..ae8ad26 100644
--- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/DeviceSelector.java
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/DeviceSelector.java
@@ -330,7 +330,9 @@
 
     @Override
     public void widgetSelected(SelectionEvent e) {
-        Object selection = ((TreeItem) e.item).getData();
+        TreeItem item = (TreeItem) e.item;
+        if (item == null) return;
+        Object selection = item.getData();
         if (selection instanceof IHvDevice) {
             mModel.setSelection((IHvDevice) selection, null);
         } else if (selection instanceof Window) {
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/InvokeMethodPrompt.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/InvokeMethodPrompt.java
new file mode 100644
index 0000000..944a57a
--- /dev/null
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/InvokeMethodPrompt.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed 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 com.android.hierarchyviewerlib.ui;
+
+import com.android.ddmlib.Log;
+import com.android.hierarchyviewerlib.HierarchyViewerDirector;
+import com.android.hierarchyviewerlib.device.IHvDevice;
+import com.android.hierarchyviewerlib.models.TreeViewModel;
+import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener;
+import com.android.hierarchyviewerlib.models.ViewNode;
+import com.android.hierarchyviewerlib.ui.util.DrawableViewNode;
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Splitter;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Text;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class InvokeMethodPrompt extends Composite implements ITreeChangeListener {
+    private TreeViewModel mModel;
+    private DrawableViewNode mSelectedNode;
+    private Text mText;
+    private static final Splitter CMD_SPLITTER = Splitter.on(CharMatcher.anyOf(", "))
+                                                         .trimResults().omitEmptyStrings();
+
+    public InvokeMethodPrompt(Composite parent) {
+        super(parent, SWT.NONE);
+        setLayout(new FillLayout());
+
+        mText = new Text(this, SWT.BORDER);
+        mText.addKeyListener(new KeyListener() {
+            @Override
+            public void keyReleased(KeyEvent ke) {
+            }
+
+            @Override
+            public void keyPressed(KeyEvent ke) {
+                onKeyPress(ke);
+            }
+        });
+
+        mModel = TreeViewModel.getModel();
+        mModel.addTreeChangeListener(this);
+    }
+
+    private void onKeyPress(KeyEvent ke) {
+        if (ke.keyCode == SWT.CR) {
+            String cmd = mText.getText().trim();
+            if (!cmd.isEmpty()) {
+                invokeViewMethod(cmd);
+            }
+            mText.setText("");
+        }
+    }
+
+    private void invokeViewMethod(String cmd) {
+        Iterator<String> segmentIterator = CMD_SPLITTER.split(cmd).iterator();
+
+        String method = null;
+        if (segmentIterator.hasNext()) {
+            method = segmentIterator.next();
+        } else {
+            return;
+        }
+
+        List<Object> args = new ArrayList<Object>(10);
+        while (segmentIterator.hasNext()) {
+            String arg = segmentIterator.next();
+
+            // check for boolean
+            if (arg.equalsIgnoreCase("true")) {
+                args.add(Boolean.TRUE);
+                continue;
+            } else if (arg.equalsIgnoreCase("false")) {
+                args.add(Boolean.FALSE);
+                continue;
+            }
+
+            // see if last character gives a clue regarding the argument type
+            char typeSpecifier = Character.toUpperCase(arg.charAt(arg.length() - 1));
+            try {
+                switch (typeSpecifier) {
+                    case 'L':
+                        args.add(Long.valueOf(arg.substring(0, arg.length())));
+                        break;
+                    case 'D':
+                        args.add(Double.valueOf(arg.substring(0, arg.length())));
+                        break;
+                    case 'F':
+                        args.add(Float.valueOf(arg.substring(0, arg.length())));
+                        break;
+                    case 'S':
+                        args.add(Short.valueOf(arg.substring(0, arg.length())));
+                        break;
+                    case 'B':
+                        args.add(Byte.valueOf(arg.substring(0, arg.length())));
+                        break;
+                    default: // default to integer
+                        args.add(Integer.valueOf(arg));
+                        break;
+                }
+            } catch (NumberFormatException e) {
+                Log.e("hv", "Unable to parse method argument: " + arg);
+                return;
+            }
+        }
+
+        HierarchyViewerDirector.getDirector().invokeMethodOnSelectedView(method, args);
+    }
+
+    @Override
+    public void selectionChanged() {
+        mSelectedNode = mModel.getSelection();
+        refresh();
+    }
+
+    private boolean isViewUpdateEnabled(ViewNode viewNode) {
+        IHvDevice device = viewNode.window.getHvDevice();
+        return device != null && device.isViewUpdateEnabled();
+    }
+
+    private void refresh() {
+        Display.getDefault().syncExec(new Runnable() {
+            @Override
+            public void run() {
+                mText.setEnabled(mSelectedNode != null
+                        && isViewUpdateEnabled(mSelectedNode.viewNode));
+            }
+        });
+    }
+
+    @Override
+    public void treeChanged() {
+        selectionChanged();
+    }
+
+    @Override
+    public void viewportChanged() {
+    }
+
+    @Override
+    public void zoomChanged() {
+    }
+}
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PropertyViewer.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PropertyViewer.java
index 90d2405..9456a0a 100644
--- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PropertyViewer.java
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PropertyViewer.java
@@ -16,17 +16,27 @@
 
 package com.android.hierarchyviewerlib.ui;
 
+import com.android.ddmuilib.ImageLoader;
+import com.android.hierarchyviewerlib.HierarchyViewerDirector;
+import com.android.hierarchyviewerlib.device.IHvDevice;
 import com.android.hierarchyviewerlib.models.TreeViewModel;
-import com.android.hierarchyviewerlib.models.ViewNode;
 import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener;
+import com.android.hierarchyviewerlib.models.ViewNode;
 import com.android.hierarchyviewerlib.models.ViewNode.Property;
+import com.android.hierarchyviewerlib.ui.DevicePropertyEditingSupport.PropertyType;
 import com.android.hierarchyviewerlib.ui.util.DrawableViewNode;
 import com.android.hierarchyviewerlib.ui.util.TreeColumnResizer;
 
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.EditingSupport;
 import org.eclipse.jface.viewers.ILabelProviderListener;
 import org.eclipse.jface.viewers.ITableLabelProvider;
 import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TextCellEditor;
 import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.TreeViewerColumn;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ControlAdapter;
@@ -42,13 +52,17 @@
 import org.eclipse.swt.widgets.TreeColumn;
 
 import java.util.ArrayList;
+import java.util.Collection;
 
 public class PropertyViewer extends Composite implements ITreeChangeListener {
     private TreeViewModel mModel;
 
     private TreeViewer mTreeViewer;
-
     private Tree mTree;
+    private TreeViewerColumn mValueColumn;
+    private PropertyValueEditingSupport mPropertyValueEditingSupport;
+
+    private Image mImage;
 
     private DrawableViewNode mSelectedNode;
 
@@ -144,6 +158,13 @@
 
         @Override
         public Image getColumnImage(Object element, int column) {
+            if (mSelectedNode == null) {
+                return null;
+            }
+            if (column == 1 && mPropertyValueEditingSupport.canEdit(element)) {
+                return mImage;
+            }
+
             return null;
         }
 
@@ -188,6 +209,79 @@
         }
     }
 
+    private class PropertyValueEditingSupport extends EditingSupport {
+        private DevicePropertyEditingSupport mDevicePropertyEditingSupport =
+                new DevicePropertyEditingSupport();
+
+        public PropertyValueEditingSupport(ColumnViewer viewer) {
+            super(viewer);
+        }
+
+        @Override
+        protected boolean canEdit(Object element) {
+            if (mSelectedNode == null) {
+                return false;
+            }
+
+            return element instanceof Property
+                    && mSelectedNode.viewNode.window.getHvDevice().isViewUpdateEnabled()
+                    && mDevicePropertyEditingSupport.canEdit((Property) element);
+        }
+
+        @Override
+        protected CellEditor getCellEditor(Object element) {
+            Property p = (Property) element;
+            PropertyType type = mDevicePropertyEditingSupport.getPropertyType(p);
+            Composite parent = (Composite) getViewer().getControl();
+
+            switch (type) {
+                case INTEGER:
+                case INTEGER_OR_CONSTANT:
+                    return new TextCellEditor(parent);
+                case ENUM:
+                    String[] items = mDevicePropertyEditingSupport.getPropertyRange(p);
+                    return new ComboBoxCellEditor(parent, items, SWT.READ_ONLY);
+            }
+
+            return null;
+        }
+
+        @Override
+        protected Object getValue(Object element) {
+            Property p = (Property) element;
+            PropertyType type = mDevicePropertyEditingSupport.getPropertyType(p);
+
+            if (type == PropertyType.ENUM) {
+                // for enums, return the index of the current value in the list of possible values
+                String[] items = mDevicePropertyEditingSupport.getPropertyRange(p);
+                return Integer.valueOf(indexOf(p.value, items));
+            }
+
+            return ((Property) element).value;
+        }
+
+        private int indexOf(String item, String[] items) {
+            for (int i = 0; i < items.length; i++) {
+                if (items[i].equals(item)) {
+                    return i;
+                }
+            }
+
+            return -1;
+        }
+
+        @Override
+        protected void setValue(Object element, Object newValue) {
+            Property p = (Property) element;
+            IHvDevice device = mSelectedNode.viewNode.window.getHvDevice();
+            Collection<Property> properties = mSelectedNode.viewNode.namedProperties.values();
+            if (mDevicePropertyEditingSupport.setValue(properties, p, newValue,
+                    mSelectedNode.viewNode, device)) {
+                doRefresh();
+            }
+        }
+    }
+
     public PropertyViewer(Composite parent) {
         super(parent, SWT.NONE);
         setLayout(new FillLayout());
@@ -202,6 +296,10 @@
         TreeColumn valueColumn = new TreeColumn(mTree, SWT.NONE);
         valueColumn.setText("Value");
 
+        mValueColumn = new TreeViewerColumn(mTreeViewer, valueColumn);
+        mPropertyValueEditingSupport = new PropertyValueEditingSupport(mTreeViewer);
+        mValueColumn.setEditingSupport(mPropertyValueEditingSupport);
+
         mModel = TreeViewModel.getModel();
         ContentProvider contentProvider = new ContentProvider();
         mTreeViewer.setContentProvider(contentProvider);
@@ -211,10 +309,14 @@
 
         addDisposeListener(mDisposeListener);
 
-        new TreeColumnResizer(this, propertyColumn, valueColumn);
+        @SuppressWarnings("unused")
+        TreeColumnResizer resizer = new TreeColumnResizer(this, propertyColumn, valueColumn);
 
         addControlListener(mControlListener);
 
+        ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class);
+        mImage = imageLoader.loadImage("picker.png", Display.getDefault()); //$NON-NLS-1$
+
         treeChanged();
     }
 
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/picker.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/picker.png
new file mode 100644
index 0000000..8ea2bed
--- /dev/null
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/picker.png
Binary files differ
diff --git a/jobb/Android.mk b/jobb/Android.mk
index 9865f30..1a58732 100644
--- a/jobb/Android.mk
+++ b/jobb/Android.mk
@@ -23,7 +23,7 @@
 LOCAL_JAVA_LIBRARIES := fat32lib
 
 LOCAL_PREBUILT_JAVA_LIBRARIES := \
-	../../prebuilts/devtools/$(LOCAL_MODULE)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
+	../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
 
 include $(BUILD_HOST_PREBUILT)
 
diff --git a/layoutlib_api/Android.mk b/layoutlib_api/Android.mk
index 32ee53f..169cf37 100644
--- a/layoutlib_api/Android.mk
+++ b/layoutlib_api/Android.mk
@@ -16,7 +16,11 @@
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
+# The layoutlib_api code has moved to tools/base/layoutlib_api.
+# The rule below uses the prebuilt layoutlib_api.jar.
+#
+# If you want to run the tests, cd to tools/base/layoutlib_api
+# and run ./gradlew :layoutlib_api:test
 
 LOCAL_JAVA_LIBRARIES := \
 	common \
@@ -24,17 +28,8 @@
 
 LOCAL_MODULE := layoutlib_api
 
-include $(BUILD_HOST_JAVA_LIBRARY)
+LOCAL_PREBUILT_JAVA_LIBRARIES := \
+	../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
 
-# build tests
-include $(CLEAR_VARS)
+include $(BUILD_HOST_PREBUILT)
 
-# Only compile source java files in this lib.
-LOCAL_SRC_FILES := $(call all-java-files-under, src/test/java)
-
-LOCAL_MODULE := layoutlib_api-tests
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_JAVA_LIBRARIES := layoutlib_api junit
-
-include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/AdapterBinding.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/AdapterBinding.java
deleted file mode 100644
index ddcdbd5..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/AdapterBinding.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Describe the content of the dynamic android.widget.Adapter used to fill
- * android.widget.AdapterView
- */
-public class AdapterBinding implements Iterable<DataBindingItem> {
-
-    private final int mRepeatCount;
-    private final List<ResourceReference> mHeaders = new ArrayList<ResourceReference>();
-    private final List<DataBindingItem> mItems = new ArrayList<DataBindingItem>();
-    private final List<ResourceReference> mFooters = new ArrayList<ResourceReference>();
-
-    public AdapterBinding(int repeatCount) {
-        mRepeatCount = repeatCount;
-    }
-
-    public int getRepeatCount() {
-        return mRepeatCount;
-    }
-
-    public void addHeader(ResourceReference layoutInfo) {
-        mHeaders.add(layoutInfo);
-    }
-
-    public int getHeaderCount() {
-        return mHeaders.size();
-    }
-
-    public ResourceReference getHeaderAt(int index) {
-        return mHeaders.get(index);
-    }
-
-    public void addItem(DataBindingItem item) {
-        mItems.add(item);
-    }
-
-    public int getItemCount() {
-        return mItems.size();
-    }
-
-    public DataBindingItem getItemAt(int index) {
-        return mItems.get(index);
-    }
-
-    public void addFooter(ResourceReference layoutInfo) {
-        mFooters.add(layoutInfo);
-    }
-
-    public int getFooterCount() {
-        return mFooters.size();
-    }
-
-    public ResourceReference getFooterAt(int index) {
-        return mFooters.get(index);
-    }
-
-    @Override
-    public Iterator<DataBindingItem> iterator() {
-        return mItems.iterator();
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/AttrResourceValue.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/AttrResourceValue.java
deleted file mode 100644
index 530e3d5..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/AttrResourceValue.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import com.android.resources.ResourceType;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A Resource value representing an attr resource.
- *
- * {@link #getValue()} will return null, instead use {@link #getAttributeValues()} to
- * get the enum/flag value associated with an attribute defined in the declare-styleable.
- *
- */
-public class AttrResourceValue extends ResourceValue {
-
-    private Map<String, Integer> mValueMap;
-
-
-    public AttrResourceValue(ResourceType type, String name, boolean isFramework) {
-        super(type, name, isFramework);
-    }
-
-    /**
-     * Return the enum/flag integer values.
-     *
-     * @return the map of (name, integer) values. Can be null.
-     */
-    public Map<String, Integer> getAttributeValues() {
-        return mValueMap;
-    }
-
-    public void addValue(String name, Integer value) {
-        if (mValueMap == null) {
-            mValueMap = new HashMap<String, Integer>();
-        }
-
-        mValueMap.put(name, value);
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/Bridge.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/Bridge.java
deleted file mode 100644
index a19b8d5..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/Bridge.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-
-import static com.android.ide.common.rendering.api.Result.Status.NOT_IMPLEMENTED;
-
-import com.android.ide.common.rendering.api.Result.Status;
-
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.util.EnumSet;
-import java.util.Map;
-
-/**
- * Entry point of the Layout Library. Extensions of this class provide a method to compute
- * and render a layout.
- */
-public abstract class Bridge {
-
-    public final static int API_CURRENT = 9;
-
-    /**
-     * Returns the API level of the layout library.
-     * <p/>
-     * While no methods will ever be removed, some may become deprecated, and some new ones
-     * will appear.
-     * <p/>All Layout libraries based on {@link Bridge} return at minimum an API level of 5.
-     */
-    public abstract int getApiLevel();
-
-    /**
-     * Returns the revision of the library inside a given (layoutlib) API level.
-     * The true revision number of the library is {@link #getApiLevel()}.{@link #getRevision()}
-     */
-    public int getRevision() {
-        return 0;
-    }
-
-    /**
-     * Returns an {@link EnumSet} of the supported {@link Capability}.
-     * @return an {@link EnumSet} with the supported capabilities.
-     *
-     */
-    public EnumSet<Capability> getCapabilities() {
-        return EnumSet.noneOf(Capability.class);
-    }
-
-    /**
-     * Initializes the Bridge object.
-     *
-     * @param platformProperties The build properties for the platform.
-     * @param fontLocation the location of the fonts.
-     * @param enumValueMap map attrName => { map enumFlagName => Integer value }. This is typically
-     *          read from attrs.xml in the SDK target.
-     * @param log a {@link LayoutLog} object. Can be null.
-     * @return true if success.
-     */
-    public boolean init(Map<String, String> platformProperties,
-            File fontLocation,
-            Map<String, Map<String, Integer>> enumValueMap,
-            LayoutLog log) {
-        return false;
-    }
-
-    /**
-     * Prepares the layoutlib to unloaded.
-     */
-    public boolean dispose() {
-        return false;
-    }
-
-    /**
-     * Starts a layout session by inflating and rendering it. The method returns a
-     * {@link RenderSession} on which further actions can be taken.
-     *
-     * @return a new {@link RenderSession} object that contains the result of the scene creation and
-     * first rendering.
-     */
-    public RenderSession createSession(SessionParams params) {
-        return null;
-    }
-
-    /**
-     * Renders a Drawable. If the rendering is successful, the result image is accessible through
-     * {@link Result#getData()}. It is of type {@link BufferedImage}
-     * @param params the rendering parameters.
-     * @return the result of the action.
-     */
-    public Result renderDrawable(DrawableParams params) {
-        return Status.NOT_IMPLEMENTED.createResult();
-    }
-
-    /**
-     * Clears the resource cache for a specific project.
-     * <p/>This cache contains bitmaps and nine patches that are loaded from the disk and reused
-     * until this method is called.
-     * <p/>The cache is not configuration dependent and should only be cleared when a
-     * resource changes (at this time only bitmaps and 9 patches go into the cache).
-     * <p/>
-     * The project key provided must be similar to the one passed in {@link RenderParams}.
-     *
-     * @param projectKey the key for the project.
-     */
-    public void clearCaches(Object projectKey) {
-
-    }
-
-    /**
-     * Utility method returning the parent of a given view object.
-     *
-     * @param viewObject the object for which to return the parent.
-     *
-     * @return a {@link Result} indicating the status of the action, and if success, the parent
-     *      object in {@link Result#getData()}
-     */
-    public Result getViewParent(Object viewObject) {
-        return NOT_IMPLEMENTED.createResult();
-    }
-
-    /**
-     * Utility method returning the index of a given view in its parent.
-     * @param viewObject the object for which to return the index.
-     *
-     * @return a {@link Result} indicating the status of the action, and if success, the index in
-     *      the parent in {@link Result#getData()}
-     */
-    public Result getViewIndex(Object viewObject) {
-        return NOT_IMPLEMENTED.createResult();
-    }
-
-    /**
-     * Utility method returning the baseline value for a given view object. This basically returns
-     * View.getBaseline().
-     *
-     * @param viewObject the object for which to return the index.
-     *
-     * @return the baseline value or -1 if not applicable to the view object or if this layout
-     *     library does not implement this method.
-     *
-     * @deprecated use the extended ViewInfo.
-     */
-    @Deprecated
-    public Result getViewBaseline(Object viewObject) {
-        return NOT_IMPLEMENTED.createResult();
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/Capability.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/Capability.java
deleted file mode 100644
index 5ad438d..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/Capability.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-/**
- * Enum describing the layout bridge capabilities.
- *
- */
-public enum Capability {
-    /** Ability to render at full size, as required by the layout, and unbound by the screen */
-    UNBOUND_RENDERING,
-    /** Ability to override the background of the rendering with transparency using
-     * {@link SessionParams#setOverrideBgColor(int)} */
-    CUSTOM_BACKGROUND_COLOR,
-    /** Ability to call {@link RenderSession#render()} and {@link RenderSession#render(long)}. */
-    RENDER,
-    /** Ability to ask for a layout only with no rendering through
-     * {@link SessionParams#setLayoutOnly()}
-     */
-    LAYOUT_ONLY,
-    /**
-     * Ability to control embedded layout parsers through {@link ILayoutPullParser#getParser(String)}
-     */
-    EMBEDDED_LAYOUT,
-    /** Ability to call<br>
-     * {@link RenderSession#insertChild(Object, ILayoutPullParser, int, IAnimationListener)}<br>
-     * {@link RenderSession#moveChild(Object, Object, int, java.util.Map, IAnimationListener)}<br>
-     * {@link RenderSession#setProperty(Object, String, String)}<br>
-     * The method that receives an animation listener can only use it if the
-     * ANIMATED_VIEW_MANIPULATION, or FULL_ANIMATED_VIEW_MANIPULATION is also supported.
-     */
-    VIEW_MANIPULATION,
-    /** Ability to play animations with<br>
-     * {@link RenderSession#animate(Object, String, boolean, IAnimationListener)}
-     */
-    PLAY_ANIMATION,
-    /**
-     * Ability to manipulate views with animation, as long as the view does not change parent.
-     * {@link RenderSession#insertChild(Object, ILayoutPullParser, int, IAnimationListener)}<br>
-     * {@link RenderSession#moveChild(Object, Object, int, java.util.Map, IAnimationListener)}<br>
-     * {@link RenderSession#removeChild(Object, IAnimationListener)}<br>
-     */
-    ANIMATED_VIEW_MANIPULATION,
-    /**
-     * Ability to move views (even into a different ViewGroup) with animation.
-     * see {@link RenderSession#moveChild(Object, Object, int, java.util.Map, IAnimationListener)}
-     */
-    FULL_ANIMATED_VIEW_MANIPULATION,
-    ADAPTER_BINDING,
-    EXTENDED_VIEWINFO,
-    /**
-     * Ability to properly resize nine-patch assets.
-     */
-    FIXED_SCALABLE_NINE_PATCH;
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/DataBindingItem.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/DataBindingItem.java
deleted file mode 100644
index 2a93f15..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/DataBindingItem.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import com.android.resources.ResourceType;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A data binding item. It contain a {@link ResourceReference} to the view used to represent it.
- * It also contains how many items of this type the AdapterView should display.
- *
- * It can also contain an optional list of children in case the AdapterView is an
- * ExpandableListView. In this case, the count value is used as a repeat count for the children,
- * similar to {@link AdapterBinding#getRepeatCount()}.
- *
- */
-public class DataBindingItem implements Iterable<DataBindingItem> {
-    private final ResourceReference mReference;
-    private final int mCount;
-    private List<DataBindingItem> mChildren;
-
-    public DataBindingItem(ResourceReference reference, int count) {
-        mReference = reference;
-        mCount = count;
-    }
-
-    public DataBindingItem(String name, boolean platformLayout, int count) {
-        this(new ResourceReference(name, platformLayout), count);
-    }
-
-    public DataBindingItem(String name, boolean platformLayout) {
-        this(name, platformLayout, 1);
-    }
-
-    public DataBindingItem(String name, int count) {
-        this(name, false /*platformLayout*/, count);
-    }
-
-    public DataBindingItem(String name) {
-        this(name, false /*platformLayout*/, 1);
-    }
-
-    /**
-     * Returns the {@link ResourceReference} for the view. The {@link ResourceType} for the
-     * referenced resource is implied to be {@link ResourceType#LAYOUT}.
-     */
-    public ResourceReference getViewReference() {
-        return mReference;
-    }
-
-    /**
-     * The repeat count for this object or the repeat count for the children if there are any.
-     */
-    public int getCount() {
-        return mCount;
-    }
-
-    public void addChild(DataBindingItem child) {
-        if (mChildren == null) {
-            mChildren = new ArrayList<DataBindingItem>();
-        }
-
-        mChildren.add(child);
-    }
-
-    public List<DataBindingItem> getChildren() {
-        if (mChildren != null) {
-            return mChildren;
-        }
-
-        return Collections.emptyList();
-    }
-
-    @Override
-    public Iterator<DataBindingItem> iterator() {
-        List<DataBindingItem> list = getChildren();
-        return list.iterator();
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/DeclareStyleableResourceValue.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/DeclareStyleableResourceValue.java
deleted file mode 100644
index a8f269f..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/DeclareStyleableResourceValue.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import com.android.resources.ResourceType;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A Resource value representing a declare-styleable resource.
- *
- * {@link #getValue()} will return null, instead use {@link #getAttributeValues(String)} to
- * get the enum/flag value associated with an attribute defined in the declare-styleable.
- *
- * @deprecated This class is broken as it does not handle the namespace for each attribute.
- * Thankfully, newer versions of layoutlib don't actually use it, so we just keep it as is for
- * backward compatibility on older layoutlibs.
- *
- */
-@Deprecated
-public class DeclareStyleableResourceValue extends ResourceValue {
-
-    private Map<String, AttrResourceValue> mAttrMap;
-
-    public DeclareStyleableResourceValue(ResourceType type, String name, boolean isFramework) {
-        super(type, name, isFramework);
-    }
-
-    /**
-     * Return the enum/flag integer value for a given attribute.
-     * @param name the name of the attribute
-     * @return the map of (name, integer) values.
-     */
-    public Map<String, Integer> getAttributeValues(String name) {
-        if (mAttrMap != null) {
-            AttrResourceValue attr = mAttrMap.get(name);
-            if (attr != null) {
-                return attr.getAttributeValues();
-            }
-        }
-
-        return null;
-    }
-
-    public Map<String, AttrResourceValue> getAllAttributes() {
-        return mAttrMap;
-    }
-
-    public void addValue(AttrResourceValue attr) {
-        if (mAttrMap == null) {
-            mAttrMap = new HashMap<String, AttrResourceValue>();
-        }
-
-        mAttrMap.put(attr.getName(), attr);
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/DensityBasedResourceValue.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/DensityBasedResourceValue.java
deleted file mode 100644
index 5add715..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/DensityBasedResourceValue.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import com.android.layoutlib.api.IDensityBasedResourceValue;
-import com.android.resources.ResourceType;
-
-@SuppressWarnings("deprecation")
-public class DensityBasedResourceValue extends ResourceValue implements IDensityBasedResourceValue {
-
-    private com.android.resources.Density mDensity;
-
-    public DensityBasedResourceValue(ResourceType type, String name, String value,
-            com.android.resources.Density density, boolean isFramework) {
-        super(type, name, value, isFramework);
-        mDensity = density;
-    }
-
-    /**
-     * Returns the density for which this resource is configured.
-     * @return the density.
-     */
-    public com.android.resources.Density getResourceDensity() {
-        return mDensity;
-    }
-
-    /** Legacy method, do not call
-     * @deprecated use {@link #getResourceDensity()} instead.
-     */
-    @Override
-    @Deprecated
-    public Density getDensity() {
-        return Density.getEnum(mDensity.getDpiValue());
-    }
-
-    @Override
-    public String toString() {
-        return "DensityBasedResourceValue ["
-                + getResourceType() + "/" + getName() + " = " + getValue()
-                + " (density:" + mDensity +", framework:" + isFramework() + ")]";
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = super.hashCode();
-        result = prime * result + ((mDensity == null) ? 0 : mDensity.hashCode());
-        return result;
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (!super.equals(obj))
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        DensityBasedResourceValue other = (DensityBasedResourceValue) obj;
-        if (mDensity == null) {
-            if (other.mDensity != null)
-                return false;
-        } else if (!mDensity.equals(other.mDensity))
-            return false;
-        return true;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/DrawableParams.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/DrawableParams.java
deleted file mode 100644
index b566ad3..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/DrawableParams.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-
-/**
- * Rendering parameters for {@link Bridge#renderDrawable(DrawableParams)}
- *
- */
-public class DrawableParams extends RenderParams {
-
-    private final ResourceValue mDrawable;
-
-    /**
-    * Builds a param object with all the necessary parameters to render a drawable with
-    * {@link Bridge#renderDrawable(DrawableParams)}
-    *
-    * @param drawable the {@link ResourceValue} identifying the drawable.
-    * @param projectKey An Object identifying the project. This is used for the cache mechanism.
-    * @param hardwareConfig the {@link HardwareConfig}.
-    * @param renderResources a {@link RenderResources} object providing access to the resources.
-    * @param projectCallback The {@link IProjectCallback} object to get information from
-    * the project.
-    * @param minSdkVersion the minSdkVersion of the project
-    * @param targetSdkVersion the targetSdkVersion of the project
-    * @param log the object responsible for displaying warning/errors to the user.
-    */
-    public DrawableParams(
-            ResourceValue drawable,
-            Object projectKey,
-            HardwareConfig hardwareConfig,
-            RenderResources renderResources,
-            IProjectCallback projectCallback,
-            int minSdkVersion, int targetSdkVersion,
-            LayoutLog log) {
-        super(projectKey, hardwareConfig,
-                renderResources, projectCallback, minSdkVersion, targetSdkVersion, log);
-        mDrawable = drawable;
-    }
-
-    public DrawableParams(DrawableParams params) {
-        super(params);
-        mDrawable = params.mDrawable;
-    }
-
-    public ResourceValue getDrawable() {
-        return mDrawable;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/HardwareConfig.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/HardwareConfig.java
deleted file mode 100644
index 89f1424..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/HardwareConfig.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import com.android.resources.Density;
-import com.android.resources.ScreenOrientation;
-import com.android.resources.ScreenSize;
-
-/**
- * Hardware configuration for the rendering.
- * This is immutable.
- *
- * @since 9
- */
-public class HardwareConfig {
-
-    private final int mScreenWidth;
-    private final int mScreenHeight;
-    private final Density mDensity;
-    private final float mXdpi;
-    private final float mYdpi;
-    private final ScreenOrientation mOrientation;
-    private final ScreenSize mScreenSize;
-
-    private final boolean mSoftwareButtons;
-
-    public HardwareConfig(
-            int screenWidth,
-            int screenHeight,
-            Density density,
-            float xdpi,
-            float ydpi,
-            ScreenSize screenSize,
-            ScreenOrientation orientation,
-            boolean softwareButtons) {
-        mScreenWidth = screenWidth;
-        mScreenHeight = screenHeight;
-        mDensity = density;
-        mXdpi = xdpi;
-        mYdpi = ydpi;
-        mScreenSize = screenSize;
-        mOrientation = orientation;
-        mSoftwareButtons = softwareButtons;
-    }
-
-    public int getScreenWidth() {
-        return mScreenWidth;
-    }
-
-    public int getScreenHeight() {
-        return mScreenHeight;
-    }
-
-    public Density getDensity() {
-        return mDensity;
-    }
-
-    public float getXdpi() {
-        return mXdpi;
-    }
-
-    public float getYdpi() {
-        return mYdpi;
-    }
-
-    public ScreenSize getScreenSize() {
-        return mScreenSize;
-    }
-
-    public ScreenOrientation getOrientation() {
-        return mOrientation;
-    }
-
-    public boolean hasSoftwareButtons() {
-        return mSoftwareButtons;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/IAnimationListener.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/IAnimationListener.java
deleted file mode 100644
index 81a2320..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/IAnimationListener.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-
-import java.awt.image.BufferedImage;
-
-public interface IAnimationListener {
-    /**
-     * Called when a new animation frame is available for display.
-     *
-     * <p>The {@link RenderSession} object is provided as a convenience. It should be queried
-     * for the image through {@link RenderSession#getImage()}.
-     *
-     * <p>If no {@link IImageFactory} is used, then each new animation frame will be rendered
-     * in its own new {@link BufferedImage} object. However if an image factory is used, and it
-     * always re-use the same object, then the image is only guaranteed to be valid during
-     * this method call. As soon as this method return the image content will be overridden
-     * with new drawing.
-     *
-     */
-    void onNewFrame(RenderSession scene);
-
-    /**
-     * Called when the animation is done playing.
-     */
-    void done(Result result);
-
-    /**
-     * Return true to cancel the animation.
-     */
-    boolean isCanceled();
-
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/IImageFactory.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/IImageFactory.java
deleted file mode 100644
index 7681243..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/IImageFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-
-import java.awt.image.BufferedImage;
-
-/**
- * Image Factory Interface.
- *
- * An Image factory's task is to create the {@link BufferedImage} into which the scene will be
- * rendered. The goal is to let the layoutlib caller create an image that's optimized for its use
- * case.
- *
- * If no factory is passed in {@link RenderParams#setImageFactory(IImageFactory)}, then a default
- * {@link BufferedImage} of type {@link BufferedImage#TYPE_INT_ARGB} is created.
- *
- */
-public interface IImageFactory {
-
-    /**
-     * Creates a buffered image with the given size
-     * @param width the width of the image
-     * @param height the height of the image
-     * @return a new (or reused) BufferedImage of the given size.
-     */
-    BufferedImage getImage(int width, int height);
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/ILayoutPullParser.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/ILayoutPullParser.java
deleted file mode 100644
index 9c0e97b..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/ILayoutPullParser.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import org.xmlpull.v1.XmlPullParser;
-
-/**
- * Extended version of {@link XmlPullParser} to use with
- * {@link Bridge#createSession(SessionParams)}
- */
-public interface ILayoutPullParser extends XmlPullParser {
-
-    /**
-     * Returns a cookie for the current XML node.
-     * <p/>This cookie will be passed back in the {@link ViewInfo} objects, allowing association
-     * of a particular XML node with its result from the layout computation.
-     *
-     * @see ViewInfo#getCookie()
-     */
-    Object getViewCookie();
-
-    /**
-     * Returns a custom parser for the layout of the given name.
-     * @param layoutName the name of the layout.
-     * @return returns a custom parser or null if no custom parsers are needed.
-     *
-     * @deprecated use {@link IProjectCallback#getParser(String)} instead
-     */
-    @Deprecated
-    ILayoutPullParser getParser(String layoutName);
-}
-
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/IProjectCallback.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/IProjectCallback.java
deleted file mode 100644
index a88b0d3..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/IProjectCallback.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import com.android.resources.ResourceType;
-import com.android.util.Pair;
-
-import java.net.URL;
-
-/**
- * Callback for project information needed by the Layout Library.
- * Classes implementing this interface provide methods giving access to some project data, like
- * resource resolution, namespace information, and instantiation of custom view.
- */
-public interface IProjectCallback {
-
-    public enum ViewAttribute {
-        TEXT(String.class),
-        IS_CHECKED(Boolean.class),
-        SRC(URL.class),
-        COLOR(Integer.class);
-
-        private final Class<?> mClass;
-
-        private ViewAttribute(Class<?> theClass) {
-            mClass = theClass;
-        }
-
-        public Class<?> getAttributeClass() {
-            return mClass;
-        }
-    }
-
-    /**
-     * Loads a custom view with the given constructor signature and arguments.
-     * @param name The fully qualified name of the class.
-     * @param constructorSignature The signature of the class to use
-     * @param constructorArgs The arguments to use on the constructor
-     * @return A newly instantiated android.view.View object.
-     * @throws ClassNotFoundException
-     * @throws Exception
-     */
-    @SuppressWarnings("unchecked")
-    Object loadView(String name, Class[] constructorSignature, Object[] constructorArgs)
-        throws ClassNotFoundException, Exception;
-
-    /**
-     * Returns the namespace of the application.
-     * <p/>This lets the Layout Lib load custom attributes for custom views.
-     */
-    String getNamespace();
-
-    /**
-     * Resolves the id of a resource Id.
-     * <p/>The resource id is the value of a <code>R.&lt;type&gt;.&lt;name&gt;</code>, and
-     * this method will return both the type and name of the resource.
-     * @param id the Id to resolve.
-     * @return a Pair of {@link ResourceType} and resource name, or null if the id
-     *     does not match any resource.
-     */
-    @SuppressWarnings("deprecation")
-    Pair<ResourceType, String> resolveResourceId(int id);
-
-    /**
-     * Resolves the id of a resource Id of type int[]
-     * <p/>The resource id is the value of a R.styleable.&lt;name&gt;, and this method will
-     * return the name of the resource.
-     * @param id the Id to resolve.
-     * @return the name of the resource or <code>null</code> if not found.
-     */
-    String resolveResourceId(int[] id);
-
-    /**
-     * Returns the id of a resource.
-     * <p/>The provided type and name must match an existing constant defined as
-     * <code>R.&lt;type&gt;.&lt;name&gt;</code>.
-     * @param type the type of the resource
-     * @param name the name of the resource
-     * @return an Integer containing the resource Id, or <code>null</code> if not found.
-     */
-    Integer getResourceId(ResourceType type, String name);
-
-    /**
-     * Returns a custom parser for the layout of the given name.
-     * @param layoutName the name of the layout.
-     * @return returns a custom parser or null if no custom parsers are needed.
-     * @deprecated This is replaced by {@link #getParser(ResourceValue)} but older version
-     * of the layoutlib (before API7) will still call this method.
-     */
-    @Deprecated
-    ILayoutPullParser getParser(String layoutName);
-
-    /**
-     * Returns a custom parser for a given layout.
-     * @param layoutResource The layout.
-     * @return returns a custom parser or null if no custom parsers are needed.
-     */
-    ILayoutPullParser getParser(ResourceValue layoutResource);
-
-    /**
-     * Returns the value of an item used by an adapter.
-     * @param adapterView The {@link ResourceReference} for the adapter view info.
-     * @param adapterCookie the view cookie for this particular view.
-     * @param itemRef the {@link ResourceReference} for the layout used by the adapter item.
-     * @param fullPosition the position of the item in the full list.
-     * @param positionPerType the position of the item if only items of the same type are
-     *     considered. If there is only one type of items, this is the same as
-     *     <var>fullPosition</var>.
-     * @param fullParentPosition the full position of the item's parent. This is only
-     *     valid if the adapter view is an ExpandableListView.
-     * @param parentPositionPerType the position of the parent's item, only considering items
-     *     of the same type. This is only valid if the adapter view is an ExpandableListView.
-     *     If there is only one type of items, this is the same as <var>fullParentPosition</var>.
-     * @param viewRef The {@link ResourceReference} for the view we're trying to fill.
-     * @param viewAttribute the attribute being queried.
-     * @param defaultValue the default value for this attribute. The object class matches the
-     *      class associated with the {@link ViewAttribute}.
-     * @return the item value or null if there's no value.
-     *
-     * @see ViewAttribute#getAttributeClass()
-     */
-    Object getAdapterItemValue(ResourceReference adapterView, Object adapterCookie,
-            ResourceReference itemRef,
-            int fullPosition, int positionPerType,
-            int fullParentPosition, int parentPositionPerType,
-            ResourceReference viewRef, ViewAttribute viewAttribute, Object defaultValue);
-
-    /**
-     * Returns an adapter binding for a given adapter view.
-     * This is only called if {@link SessionParams} does not have an {@link AdapterBinding} for
-     * the given {@link ResourceReference} already.
-     *
-     * @param adapterViewRef the reference of adapter view to return the adapter binding for.
-     * @param adapterCookie the view cookie for this particular view.
-     * @param viewObject the view object for the adapter.
-     * @return an adapter binding for the given view or null if there's no data.
-     */
-    AdapterBinding getAdapterBinding(ResourceReference adapterViewRef, Object adapterCookie,
-            Object viewObject);
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/LayoutLog.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/LayoutLog.java
deleted file mode 100644
index df29537..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/LayoutLog.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-/**
- * Log class for actions executed through {@link Bridge} and {@link RenderSession}.
- */
-public class LayoutLog {
-    /**
-     * Prefix for resource warnings/errors. This is not meant to be used as-is by the Layout
-     * Library, but is there to help test against a wider type of warning/error.
-     * <p/>
-     * {@code tag.startsWith(LayoutLog.TAG_RESOURCE_PREFIX} will test if the tag is any type
-     * of resource warning/error
-     */
-    public final static String TAG_RESOURCES_PREFIX = "resources.";
-
-    /**
-     * Prefix for matrix warnings/errors. This is not meant to be used as-is by the Layout
-     * Library, but is there to help test against a wider type of warning/error.
-     * <p/>
-     * {@code tag.startsWith(LayoutLog.TAG_MATRIX_PREFIX} will test if the tag is any type
-     * of matrix warning/error
-     */
-    public final static String TAG_MATRIX_PREFIX = "matrix.";
-
-    /**
-     * Tag for unsupported feature that can have a big impact on the rendering. For instance, aild
-     * access.
-     */
-    public final static String TAG_UNSUPPORTED = "unsupported";
-
-    /**
-     * Tag for error when something really unexpected happens.
-     */
-    public final static String TAG_BROKEN = "broken";
-
-    /**
-     * Tag for resource resolution failure.
-     * In this case the warning/error data object will be a ResourceValue containing the type
-     * and name of the resource that failed to resolve
-     */
-    public final static String TAG_RESOURCES_RESOLVE = TAG_RESOURCES_PREFIX + "resolve";
-
-    /**
-     * Tag for resource resolution failure, specifically for theme attributes.
-     * In this case the warning/error data object will be a ResourceValue containing the type
-     * and name of the resource that failed to resolve
-     */
-    public final static String TAG_RESOURCES_RESOLVE_THEME_ATTR = TAG_RESOURCES_RESOLVE + ".theme";
-
-    /**
-     * Tag for failure when reading the content of a resource file.
-     */
-    public final static String TAG_RESOURCES_READ = TAG_RESOURCES_PREFIX + "read";
-
-    /**
-     * Tag for wrong format in a resource value.
-     */
-    public final static String TAG_RESOURCES_FORMAT = TAG_RESOURCES_PREFIX + "format";
-
-    /**
-     * Fidelity Tag used when a non affine transformation matrix is used in a Java API.
-     */
-    public final static String TAG_MATRIX_AFFINE = TAG_MATRIX_PREFIX + "affine";
-
-    /**
-     * Tag used when a matrix cannot be inverted.
-     */
-    public final static String TAG_MATRIX_INVERSE = TAG_MATRIX_PREFIX + "inverse";
-
-    /**
-     * Fidelity Tag used when a mask filter type is used but is not supported.
-     */
-    public final static String TAG_MASKFILTER = "maskfilter";
-
-    /**
-     * Fidelity Tag used when a draw filter type is used but is not supported.
-     */
-    public final static String TAG_DRAWFILTER = "drawfilter";
-
-    /**
-     * Fidelity Tag used when a path effect type is used but is not supported.
-     */
-    public final static String TAG_PATHEFFECT = "patheffect";
-
-    /**
-     * Fidelity Tag used when a color filter type is used but is not supported.
-     */
-    public final static String TAG_COLORFILTER = "colorfilter";
-
-    /**
-     * Fidelity Tag used when a rasterize type is used but is not supported.
-     */
-    public final static String TAG_RASTERIZER = "rasterizer";
-
-    /**
-     * Fidelity Tag used when a shader type is used but is not supported.
-     */
-    public final static String TAG_SHADER = "shader";
-
-    /**
-     * Fidelity Tag used when a xfermode type is used but is not supported.
-     */
-    public final static String TAG_XFERMODE = "xfermode";
-
-    /**
-     * Logs a warning.
-     * @param tag a tag describing the type of the warning
-     * @param message the message of the warning
-     * @param data an optional data bundle that the client can use to improve the warning display.
-     */
-    public void warning(String tag, String message, Object data) {
-    }
-
-    /**
-     * Logs a fidelity warning.
-     *
-     * This type of warning indicates that the render will not be
-     * the same as the rendering on a device due to limitation of the Java rendering API.
-     *
-     * @param tag a tag describing the type of the warning
-     * @param message the message of the warning
-     * @param throwable an optional Throwable that triggered the warning
-     * @param data an optional data bundle that the client can use to improve the warning display.
-     */
-    public void fidelityWarning(String tag, String message, Throwable throwable, Object data) {
-    }
-
-    /**
-     * Logs an error.
-     *
-     * @param tag a tag describing the type of the error
-     * @param message the message of the error
-     * @param data an optional data bundle that the client can use to improve the error display.
-     */
-    public void error(String tag, String message, Object data) {
-    }
-
-    /**
-     * Logs an error, and the {@link Throwable} that triggered it.
-     *
-     * @param tag a tag describing the type of the error
-     * @param message the message of the error
-     * @param throwable the Throwable that triggered the error
-     * @param data an optional data bundle that the client can use to improve the error display.
-     */
-    public void error(String tag, String message, Throwable throwable, Object data) {
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/MergeCookie.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/MergeCookie.java
deleted file mode 100644
index ce5d21d..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/MergeCookie.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-/**
- * Special wrapper class used in special case for {@link ILayoutPullParser#getViewCookie()}.
- * <p/>
- * When an {@code include} tag points to a layout with a {@code merge} top level item, there is no
- * top level item that can use the {@code include} item as cookie.
- * <p/>
- * This class is used as a cookie for all items under the {@code merge} (while referencing the
- * original {@code include} cookie) to make it easy on the client to group all merged items
- * into a single outline item.
- *
- */
-public final class MergeCookie {
-
-    private final Object mCookie;
-
-    public MergeCookie(Object cookie) {
-        mCookie = cookie;
-
-    }
-
-    public Object getCookie() {
-        return mCookie;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/RenderParams.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/RenderParams.java
deleted file mode 100644
index 2e53f14..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/RenderParams.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import com.android.resources.Density;
-import com.android.resources.ScreenSize;
-
-/**
- * Base class for rendering parameters. This include the generic parameters but not what needs
- * to be rendered or additional parameters.
- *
- */
-public abstract class RenderParams {
-
-    public final static long DEFAULT_TIMEOUT = 250; //ms
-
-    private final Object mProjectKey;
-    private final HardwareConfig mHardwareConfig;
-    private final RenderResources mRenderResources;
-    private final IProjectCallback mProjectCallback;
-    private final int mMinSdkVersion;
-    private final int mTargetSdkVersion;
-    private final LayoutLog mLog;
-
-    private boolean mCustomBackgroundEnabled;
-    private int mCustomBackgroundColor;
-    private long mTimeout;
-
-    private IImageFactory mImageFactory = null;
-
-    private String mAppIcon = null;
-    private String mAppLabel = null;
-    private String mLocale = null;
-    private boolean mForceNoDecor;
-
-    /**
-     *
-     * @param projectKey An Object identifying the project. This is used for the cache mechanism.
-     * @param hardwareConfig the {@link HardwareConfig}.
-    * @param renderResources a {@link RenderResources} object providing access to the resources.
-     * @param projectCallback The {@link IProjectCallback} object to get information from
-     * the project.
-     * @param minSdkVersion the minSdkVersion of the project
-     * @param targetSdkVersion the targetSdkVersion of the project
-     * @param log the object responsible for displaying warning/errors to the user.
-     */
-    public RenderParams(
-            Object projectKey,
-            HardwareConfig hardwareConfig,
-            RenderResources renderResources,
-            IProjectCallback projectCallback,
-            int minSdkVersion, int targetSdkVersion,
-            LayoutLog log) {
-        mProjectKey = projectKey;
-        mHardwareConfig = hardwareConfig;
-        mRenderResources = renderResources;
-        mProjectCallback = projectCallback;
-        mMinSdkVersion = minSdkVersion;
-        mTargetSdkVersion = targetSdkVersion;
-        mLog = log;
-        mCustomBackgroundEnabled = false;
-        mTimeout = DEFAULT_TIMEOUT;
-    }
-
-    /**
-     * Copy constructor.
-     */
-    public RenderParams(RenderParams params) {
-        mProjectKey = params.mProjectKey;
-        mHardwareConfig = params.mHardwareConfig;
-        mRenderResources = params.mRenderResources;
-        mProjectCallback = params.mProjectCallback;
-        mMinSdkVersion = params.mMinSdkVersion;
-        mTargetSdkVersion = params.mTargetSdkVersion;
-        mLog = params.mLog;
-        mCustomBackgroundEnabled = params.mCustomBackgroundEnabled;
-        mCustomBackgroundColor = params.mCustomBackgroundColor;
-        mTimeout = params.mTimeout;
-        mImageFactory = params.mImageFactory;
-        mAppIcon = params.mAppIcon;
-        mAppLabel = params.mAppLabel;
-        mLocale = params.mLocale;
-        mForceNoDecor = params.mForceNoDecor;
-    }
-
-    public void setOverrideBgColor(int color) {
-        mCustomBackgroundEnabled = true;
-        mCustomBackgroundColor = color;
-    }
-
-    public void setTimeout(long timeout) {
-        mTimeout = timeout;
-    }
-
-    public void setImageFactory(IImageFactory imageFactory) {
-        mImageFactory = imageFactory;
-    }
-
-    public void setAppIcon(String appIcon) {
-        mAppIcon = appIcon;
-    }
-
-    public void setAppLabel(String appLabel) {
-        mAppLabel = appLabel;
-    }
-
-    public void setLocale(String locale) {
-        mLocale = locale;
-    }
-
-    public void setForceNoDecor() {
-        mForceNoDecor = true;
-    }
-
-    public Object getProjectKey() {
-        return mProjectKey;
-    }
-
-    public HardwareConfig getHardwareConfig() {
-        return mHardwareConfig;
-    }
-
-    public int getMinSdkVersion() {
-        return mMinSdkVersion;
-    }
-
-    public int getTargetSdkVersion() {
-        return mTargetSdkVersion;
-    }
-
-    /**
-     * @deprecated Use {@link #getHardwareConfig()}
-     */
-    @Deprecated
-    public int getScreenWidth() {
-        return mHardwareConfig.getScreenWidth();
-    }
-
-    /**
-     * @deprecated Use {@link #getHardwareConfig()}
-     */
-    @Deprecated
-    public int getScreenHeight() {
-        return mHardwareConfig.getScreenHeight();
-    }
-
-    /**
-     * @deprecated Use {@link #getHardwareConfig()}
-     */
-    @Deprecated
-    public Density getDensity() {
-        return mHardwareConfig.getDensity();
-    }
-
-    /**
-     * @deprecated Use {@link #getHardwareConfig()}
-     */
-    @Deprecated
-    public float getXdpi() {
-        return mHardwareConfig.getXdpi();
-    }
-
-    /**
-     * @deprecated Use {@link #getHardwareConfig()}
-     */
-    @Deprecated
-    public float getYdpi() {
-        return mHardwareConfig.getYdpi();
-    }
-
-    public RenderResources getResources() {
-        return mRenderResources;
-    }
-
-    public IProjectCallback getProjectCallback() {
-        return mProjectCallback;
-    }
-
-    public LayoutLog getLog() {
-        return mLog;
-    }
-
-    public boolean isBgColorOverridden() {
-        return mCustomBackgroundEnabled;
-    }
-
-    public int getOverrideBgColor() {
-        return mCustomBackgroundColor;
-    }
-
-    public long getTimeout() {
-        return mTimeout;
-    }
-
-    public IImageFactory getImageFactory() {
-        return mImageFactory;
-    }
-
-    /**
-     * @deprecated Use {@link #getHardwareConfig()}
-     */
-    @Deprecated
-    public ScreenSize getConfigScreenSize() {
-        return mHardwareConfig.getScreenSize();
-    }
-
-    public String getAppIcon() {
-        return mAppIcon;
-    }
-
-    public String getAppLabel() {
-        return mAppLabel;
-    }
-
-    public String getLocale() {
-        return mLocale;
-    }
-
-    public boolean isForceNoDecor() {
-        return mForceNoDecor;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/RenderResources.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/RenderResources.java
deleted file mode 100644
index c362224..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/RenderResources.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import com.android.resources.ResourceType;
-
-/**
- * A class containing all the resources needed to do a rendering.
- * <p/>
- * This contains both the project specific resources and the framework resources, and provide
- * convenience methods to resolve resource and theme references.
- */
-public class RenderResources {
-
-    public final static String REFERENCE_NULL = "@null";
-
-    public static class FrameworkResourceIdProvider {
-        public Integer getId(ResourceType resType, String resName) {
-            return null;
-        }
-    }
-
-    public void setFrameworkResourceIdProvider(FrameworkResourceIdProvider provider) {
-    }
-
-    public void setLogger(LayoutLog logger) {
-    }
-
-    /**
-     * Returns the {@link StyleResourceValue} representing the current theme.
-     * @return the theme or null if there is no current theme.
-     */
-    public StyleResourceValue getCurrentTheme() {
-        return null;
-    }
-
-    /**
-     * Returns a theme by its name.
-     *
-     * @param name the name of the theme
-     * @param frameworkTheme whether the theme is a framework theme.
-     * @return the theme or null if there's no match
-     */
-    public StyleResourceValue getTheme(String name, boolean frameworkTheme) {
-        return null;
-    }
-
-    /**
-     * Returns whether a theme is a parent of a given theme.
-     * @param parentTheme the parent theme
-     * @param childTheme the child theme.
-     * @return true if the parent theme is indeed a parent theme of the child theme.
-     */
-    public boolean themeIsParentOf(StyleResourceValue parentTheme, StyleResourceValue childTheme) {
-        return false;
-    }
-
-    /**
-     * Returns a framework resource by type and name. The returned resource is resolved.
-     * @param resourceType the type of the resource
-     * @param resourceName the name of the resource
-     */
-    public ResourceValue getFrameworkResource(ResourceType resourceType, String resourceName) {
-        return null;
-    }
-
-    /**
-     * Returns a project resource by type and name. The returned resource is resolved.
-     * @param resourceType the type of the resource
-     * @param resourceName the name of the resource
-     */
-    public ResourceValue getProjectResource(ResourceType resourceType, String resourceName) {
-        return null;
-    }
-
-    /**
-     * Returns the {@link ResourceValue} matching a given name in the current theme. If the
-     * item is not directly available in the theme, the method looks in its parent theme.
-     *
-     * @param itemName the name of the item to search for.
-     * @return the {@link ResourceValue} object or <code>null</code>
-     *
-     * @deprecated Use {@link #findItemInTheme(String, boolean)}
-     */
-    @Deprecated
-    public ResourceValue findItemInTheme(String itemName) {
-        StyleResourceValue currentTheme = getCurrentTheme();
-        if (currentTheme != null) {
-            return findItemInStyle(currentTheme, itemName);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link ResourceValue} matching a given attribute in the current theme. If the
-     * item is not directly available in the theme, the method looks in its parent theme.
-     *
-     * @param attrName the name of the attribute to search for.
-     * @param isFrameworkAttr whether the attribute is a framework attribute
-     * @return the {@link ResourceValue} object or <code>null</code>
-     */
-    public ResourceValue findItemInTheme(String attrName, boolean isFrameworkAttr) {
-        StyleResourceValue currentTheme = getCurrentTheme();
-        if (currentTheme != null) {
-            return findItemInStyle(currentTheme, attrName, isFrameworkAttr);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link ResourceValue} matching a given name in a given style. If the
-     * item is not directly available in the style, the method looks in its parent style.
-     *
-     * This version of doesn't support providing the namespace of the attribute so it'll search
-     * in both the project's namespace and then in the android namespace.
-     *
-     * @param style the style to search in
-     * @param attrName the name of the attribute to search for.
-     * @return the {@link ResourceValue} object or <code>null</code>
-     *
-     * @deprecated Use {@link #findItemInStyle(StyleResourceValue, String, boolean)} since this
-     * method doesn't know the item namespace.
-     */
-    @Deprecated
-    public ResourceValue findItemInStyle(StyleResourceValue style, String attrName) {
-        return null;
-    }
-
-    /**
-     * Returns the {@link ResourceValue} matching a given attribute in a given style. If the
-     * item is not directly available in the style, the method looks in its parent style.
-     *
-     * @param style the style to search in
-     * @param attrName the name of the attribute to search for.
-     * @param isFrameworkAttr whether the attribute is a framework attribute
-     * @return the {@link ResourceValue} object or <code>null</code>
-     */
-    public ResourceValue findItemInStyle(StyleResourceValue style, String attrName,
-            boolean isFrameworkAttr) {
-        return null;
-    }
-
-    /**
-     * Searches for, and returns a {@link ResourceValue} by its reference.
-     * <p/>
-     * The reference format can be:
-     * <pre>@resType/resName</pre>
-     * <pre>@android:resType/resName</pre>
-     * <pre>@resType/android:resName</pre>
-     * <pre>?resType/resName</pre>
-     * <pre>?android:resType/resName</pre>
-     * <pre>?resType/android:resName</pre>
-     * Any other string format will return <code>null</code>.
-     * <p/>
-     * The actual format of a reference is <pre>@[namespace:]resType/resName</pre> but this method
-     * only support the android namespace.
-     *
-     * @param reference the resource reference to search for.
-     * @param forceFrameworkOnly if true all references are considered to be toward framework
-     *      resource even if the reference does not include the android: prefix.
-     * @return a {@link ResourceValue} or <code>null</code>.
-     */
-    public ResourceValue findResValue(String reference, boolean forceFrameworkOnly) {
-        return null;
-    }
-
-    /**
-     * Resolves the value of a resource, if the value references a theme or resource value.
-     * <p/>
-     * This method ensures that it returns a {@link ResourceValue} object that does not
-     * reference another resource.
-     * If the resource cannot be resolved, it returns <code>null</code>.
-     * <p/>
-     * If a value that does not need to be resolved is given, the method will return a new
-     * instance of {@link ResourceValue} that contains the input value.
-     *
-     * @param type the type of the resource
-     * @param name the name of the attribute containing this value.
-     * @param value the resource value, or reference to resolve
-     * @param isFrameworkValue whether the value is a framework value.
-     *
-     * @return the resolved resource value or <code>null</code> if it failed to resolve it.
-     */
-    public ResourceValue resolveValue(ResourceType type, String name, String value,
-            boolean isFrameworkValue) {
-        return null;
-    }
-
-    /**
-     * Returns the {@link ResourceValue} referenced by the value of <var>value</var>.
-     * <p/>
-     * This method ensures that it returns a {@link ResourceValue} object that does not
-     * reference another resource.
-     * If the resource cannot be resolved, it returns <code>null</code>.
-     * <p/>
-     * If a value that does not need to be resolved is given, the method will return the input
-     * value.
-     *
-     * @param value the value containing the reference to resolve.
-     * @return a {@link ResourceValue} object or <code>null</code>
-     */
-    public ResourceValue resolveResValue(ResourceValue value) {
-        return null;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/RenderSession.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/RenderSession.java
deleted file mode 100644
index 96caa6a..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/RenderSession.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import static com.android.ide.common.rendering.api.Result.Status.NOT_IMPLEMENTED;
-
-import com.android.ide.common.rendering.api.Result.Status;
-
-import java.awt.image.BufferedImage;
-import java.util.List;
-import java.util.Map;
-
-/**
- * An object allowing interaction with an Android layout.
- *
- * This is returned by {@link Bridge#createSession(SessionParams)}.
- * and can then be used for subsequent actions on the layout.
- *
- * @since 5
- *
- */
-public class RenderSession {
-
-    /**
-     * Returns the last operation result.
-     */
-    public Result getResult() {
-        return NOT_IMPLEMENTED.createResult();
-    }
-
-    /**
-     * Returns the {@link ViewInfo} objects for the top level views.
-     * <p/>
-     * In most case the list will only contain one item. If the top level node is {@code merge}
-     * though then it will contain all the items under the {@code merge} tag.
-     * <p/>
-     * This is reset to a new instance every time {@link #render()} is called and can be
-     * <code>null</code> if the call failed (and the method returned a {@link Result} with
-     * {@link Status#ERROR_UNKNOWN} or {@link Status#NOT_IMPLEMENTED}.
-     * <p/>
-     * This can be safely modified by the caller.
-     *
-     * @return the list of {@link ViewInfo} or null if there aren't any.
-     */
-    public List<ViewInfo> getRootViews() {
-        return null;
-    }
-
-    /**
-     * Returns the rendering of the full layout.
-     * <p>
-     * This is reset to a new instance every time {@link #render()} is called and can be
-     * <code>null</code> if the call failed (and the method returned a {@link Result} with
-     * {@link Status#ERROR_UNKNOWN} or {@link Status#NOT_IMPLEMENTED}.
-     * <p/>
-     * This can be safely modified by the caller.
-     */
-    public BufferedImage getImage() {
-        return null;
-    }
-
-    /**
-     * Returns true if the current image alpha channel is relevant.
-     *
-     * @return whether the image alpha channel is relevant.
-     */
-    public boolean isAlphaChannelImage() {
-        return true;
-    }
-
-    /**
-     * Returns a map of (XML attribute name, attribute value) containing only default attribute
-     * values, for the given view Object.
-     * @param viewObject the view object.
-     * @return a map of the default property values or null.
-     */
-    public Map<String, String> getDefaultProperties(Object viewObject) {
-        return null;
-    }
-
-    /**
-     * Re-renders the layout as-is.
-     * In case of success, this should be followed by calls to {@link #getRootViews()} and
-     * {@link #getImage()} to access the result of the rendering.
-     *
-     * This is equivalent to calling <code>render(SceneParams.DEFAULT_TIMEOUT)</code>
-     *
-     * @return a {@link Result} indicating the status of the action.
-     */
-    public Result render() {
-        return render(RenderParams.DEFAULT_TIMEOUT);
-    }
-
-    /**
-     * Re-renders the layout as-is, with a given timeout in case other renderings are being done.
-     * In case of success, this should be followed by calls to {@link #getRootViews()} and
-     * {@link #getImage()} to access the result of the rendering.
-     *
-     * The {@link Bridge} is only able to inflate or render one layout at a time. There
-     * is an internal lock object whenever such an action occurs. The timeout parameter is used
-     * when attempting to acquire the lock. If the timeout expires, the method will return
-     * {@link Status#ERROR_TIMEOUT}.
-     *
-     * @param timeout timeout for the rendering, in milliseconds.
-     *
-     * @return a {@link Result} indicating the status of the action.
-     */
-    public Result render(long timeout) {
-        return NOT_IMPLEMENTED.createResult();
-    }
-
-    /**
-     * Sets the value of a given property on a given object.
-     * <p/>
-     * This does nothing more than change the property. To render the scene in its new state, a
-     * call to {@link #render()} is required.
-     * <p/>
-     * Any amount of actions can be taken on the scene before {@link #render()} is called.
-     *
-     * @param objectView
-     * @param propertyName
-     * @param propertyValue
-     *
-     * @return a {@link Result} indicating the status of the action.
-     *
-     * @throws IllegalArgumentException if the view object is not an android.view.View
-     */
-    public Result setProperty(Object objectView, String propertyName, String propertyValue) {
-        return NOT_IMPLEMENTED.createResult();
-    }
-
-    /**
-     * returns the value of a given property on a given object.
-     * <p/>
-     * This returns a {@link Result} object. If the operation of querying the object for its
-     * property was successful (check {@link Result#isSuccess()}), then the property value
-     * is set in the result and can be accessed through {@link Result#getData()}.
-     *
-     * @param objectView
-     * @param propertyName
-     *
-     * @return a {@link Result} indicating the status of the action.
-     *
-     * @throws IllegalArgumentException if the view object is not an android.view.View
-     */
-    public Result getProperty(Object objectView, String propertyName) {
-        return NOT_IMPLEMENTED.createResult();
-    }
-
-    /**
-     * Inserts a new child in a ViewGroup object, and renders the result.
-     * <p/>
-     * The child is first inflated and then added to its new parent, at the given <var>index<var>
-     * position. If the <var>index</var> is -1 then the child is added at the end of the parent.
-     * <p/>
-     * If an animation listener is passed then the rendering is done asynchronously and the
-     * result is sent to the listener.
-     * If the listener is null, then the rendering is done synchronously.
-     * <p/>
-     * The child stays in the view hierarchy after the rendering is done. To remove it call
-     * {@link #removeChild(Object, IAnimationListener)}
-     * <p/>
-     * The returned {@link Result} object will contain the android.view.View object for
-     * the newly inflated child. It is accessible through {@link Result#getData()}.
-     *
-     * @param parentView the parent View object to receive the new child.
-     * @param childXml an {@link ILayoutPullParser} containing the content of the new child,
-     *             including ViewGroup.LayoutParams attributes.
-     * @param index the index at which position to add the new child into the parent. -1 means at
-     *             the end.
-     * @param listener an optional {@link IAnimationListener}.
-     *
-     * @return a {@link Result} indicating the status of the action.
-     */
-    public Result insertChild(Object parentView, ILayoutPullParser childXml, int index,
-            IAnimationListener listener) {
-        return NOT_IMPLEMENTED.createResult();
-    }
-
-    /**
-     * Move a new child to a different ViewGroup object.
-     * <p/>
-     * The child is first removed from its current parent, and then added to its new parent, at the
-     * given <var>index<var> position. In case the <var>parentView</var> is the current parent of
-     * <var>childView</var> then the index must be the value with the <var>childView</var> removed
-     * from its parent. If the <var>index</var> is -1 then the child is added at the end of
-     * the parent.
-     * <p/>
-     * If an animation listener is passed then the rendering is done asynchronously and the
-     * result is sent to the listener.
-     * If the listener is null, then the rendering is done synchronously.
-     * <p/>
-     * The child stays in the view hierarchy after the rendering is done. To remove it call
-     * {@link #removeChild(Object, IAnimationListener)}
-     * <p/>
-     * The returned {@link Result} object will contain the android.view.ViewGroup.LayoutParams
-     * object created from the <var>layoutParams</var> map if it was non <code>null</code>.
-     *
-     * @param parentView the parent View object to receive the child. Can be the current parent
-     *             already.
-     * @param childView the view to move.
-     * @param index the index at which position to add the new child into the parent. -1 means at
-     *             the end.
-     * @param layoutParams an optional map of new ViewGroup.LayoutParams attribute. If non null,
-     *             then the current layout params of the view will be removed and a new one will
-     *             be inflated and set with the content of the map.
-     * @param listener an optional {@link IAnimationListener}.
-     *
-     * @return a {@link Result} indicating the status of the action.
-     */
-    public Result moveChild(Object parentView, Object childView, int index,
-            Map<String, String> layoutParams, IAnimationListener listener) {
-        return NOT_IMPLEMENTED.createResult();
-    }
-
-    /**
-     * Removes a child from a ViewGroup object.
-     * <p/>
-     * This does nothing more than change the layout. To render the scene in its new state, a
-     * call to {@link #render()} is required.
-     * <p/>
-     * Any amount of actions can be taken on the scene before {@link #render()} is called.
-     *
-     * @param childView the view object to remove from its parent
-     * @param listener an optional {@link IAnimationListener}.
-     *
-     * @return a {@link Result} indicating the status of the action.
-     */
-    public Result removeChild(Object childView, IAnimationListener listener) {
-        return NOT_IMPLEMENTED.createResult();
-    }
-
-    /**
-     * Starts playing an given animation on a given object.
-     * <p/>
-     * The animation playback is asynchronous and the rendered frame is sent vi the
-     * <var>listener</var>.
-     *
-     * @param targetObject the view object to animate
-     * @param animationName the name of the animation (res/anim) to play.
-     * @param listener the listener callback.
-     *
-     * @return a {@link Result} indicating the status of the action.
-     */
-    public Result animate(Object targetObject, String animationName,
-            boolean isFrameworkAnimation, IAnimationListener listener) {
-        return NOT_IMPLEMENTED.createResult();
-    }
-
-    /**
-     * Discards the layout. No more actions can be called on this object.
-     */
-    public void dispose() {
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/ResourceReference.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/ResourceReference.java
deleted file mode 100644
index f22f51e..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/ResourceReference.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-/**
- * A resource reference. This contains the String ID of the resource and whether this is a framework
- * reference.
- * This is an immutable class.
- *
- */
-public class ResourceReference {
-    private final String mName;
-    private final boolean mIsFramework;
-
-    /**
-     * Builds a resource reference.
-     * @param name the name of the resource
-     * @param isFramework whether the reference is to a framework resource.
-     */
-    public ResourceReference(String name, boolean isFramework) {
-        mName = name;
-        mIsFramework = isFramework;
-    }
-
-    /**
-     * Builds a non-framework resource reference.
-     * @param name the name of the resource
-     */
-    public ResourceReference(String name) {
-        this(name, false /*platformLayout*/);
-    }
-
-    /**
-     * Returns the name of the resource, as defined in the XML.
-     */
-    public final String getName() {
-        return mName;
-    }
-
-    /**
-     * Returns whether the resource is a framework resource (<code>true</code>) or a project
-     * resource (<code>false</false>).
-     */
-    public final boolean isFramework() {
-        return mIsFramework;
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + (mIsFramework ? 1231 : 1237);
-        result = prime * result + ((mName == null) ? 0 : mName.hashCode());
-        return result;
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        ResourceReference other = (ResourceReference) obj;
-        if (mIsFramework != other.mIsFramework)
-            return false;
-        if (mName == null) {
-            if (other.mName != null)
-                return false;
-        } else if (!mName.equals(other.mName))
-            return false;
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#toString()
-     */
-    @Override
-    public String toString() {
-        return "ResourceReference [" + mName + " (framework:" + mIsFramework+ ")]";
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/ResourceValue.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/ResourceValue.java
deleted file mode 100644
index dceb7c5..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/ResourceValue.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import com.android.layoutlib.api.IResourceValue;
-import com.android.resources.ResourceType;
-
-/**
- * Represents an android resource with a name and a string value.
- */
-@SuppressWarnings("deprecation")
-public class ResourceValue extends ResourceReference implements IResourceValue {
-    private final ResourceType mType;
-    private String mValue = null;
-
-    public ResourceValue(ResourceType type, String name, boolean isFramework) {
-        super(name, isFramework);
-        mType = type;
-    }
-
-    public ResourceValue(ResourceType type, String name, String value, boolean isFramework) {
-        super(name, isFramework);
-        mType = type;
-        mValue = value;
-    }
-
-    public ResourceType getResourceType() {
-        return mType;
-    }
-
-    /**
-     * Returns the type of the resource. For instance "drawable", "color", etc...
-     * @deprecated use {@link #getResourceType()} instead.
-     */
-    @Override
-    @Deprecated
-    public String getType() {
-        return mType.getName();
-    }
-
-    /**
-     * Returns the value of the resource, as defined in the XML. This can be <code>null</code>
-     */
-    @Override
-    public final String getValue() {
-        return mValue;
-    }
-
-    /**
-     * Sets the value of the resource.
-     * @param value the new value
-     */
-    public void setValue(String value) {
-        mValue = value;
-    }
-
-    /**
-     * Sets the value from another resource.
-     * @param value the resource value
-     */
-    public void replaceWith(ResourceValue value) {
-        mValue = value.mValue;
-    }
-
-    @Override
-    public String toString() {
-        return "ResourceValue [" + mType + "/" + getName() + " = " + mValue  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                + " (framework:" + isFramework() + ")]"; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = super.hashCode();
-        result = prime * result + ((mType == null) ? 0 : mType.hashCode());
-        result = prime * result + ((mValue == null) ? 0 : mValue.hashCode());
-        return result;
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (!super.equals(obj))
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        ResourceValue other = (ResourceValue) obj;
-        if (mType == null) {
-            if (other.mType != null)
-                return false;
-        } else if (!mType.equals(other.mType))
-            return false;
-        if (mValue == null) {
-            if (other.mValue != null)
-                return false;
-        } else if (!mValue.equals(other.mValue))
-            return false;
-        return true;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/Result.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/Result.java
deleted file mode 100644
index a739e79..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/Result.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-/**
- * Scene result class. This is an immutable class.
- * <p/>
- * This cannot be allocated directly, instead use
- * {@link Status#createResult()},
- * {@link Status#createResult(String, Throwable)},
- * {@link Status#createResult(String)}
- * {@link Status#createResult(Object)}
- */
-public class Result {
-
-    private final Status mStatus;
-    private final String mErrorMessage;
-    private final Throwable mThrowable;
-    private Object mData;
-
-    /**
-     * Scene Status enum.
-     * <p/>This indicates the status of all scene actions.
-     */
-    public enum Status {
-        SUCCESS,
-        NOT_IMPLEMENTED,
-        ERROR_TIMEOUT,
-        ERROR_LOCK_INTERRUPTED,
-        ERROR_INFLATION,
-        ERROR_VIEWGROUP_NO_CHILDREN,
-        ERROR_NOT_INFLATED,
-        ERROR_RENDER,
-        ERROR_ANIM_NOT_FOUND,
-        ERROR_NOT_A_DRAWABLE,
-        ERROR_REFLECTION,
-        ERROR_UNKNOWN;
-
-        private Result mResult;
-
-        /**
-         * Returns a {@link Result} object with this status.
-         * @return an instance of SceneResult;
-         */
-        public Result createResult() {
-            // don't want to get generic error that way.
-            assert this != ERROR_UNKNOWN;
-
-            if (mResult == null) {
-                mResult = new Result(this);
-            }
-
-            return mResult;
-        }
-
-        /**
-         * Returns a {@link Result} object with this status, and the given data.
-         * @return an instance of SceneResult;
-         *
-         * @see Result#getData()
-         */
-        public Result createResult(Object data) {
-            Result res = createResult();
-
-            if (data != null) {
-                res = res.getCopyWithData(data);
-            }
-
-            return res;
-        }
-
-        /**
-         * Returns a {@link #ERROR_UNKNOWN} result with the given message and throwable
-         * @param errorMessage the error message
-         * @param throwable the throwable
-         * @return an instance of SceneResult.
-         */
-        public Result createResult(String errorMessage, Throwable throwable) {
-            return new Result(this, errorMessage, throwable);
-        }
-
-        /**
-         * Returns a {@link #ERROR_UNKNOWN} result with the given message
-         * @param errorMessage the error message
-         * @return an instance of SceneResult.
-         */
-        public Result createResult(String errorMessage) {
-            return new Result(this, errorMessage, null /*throwable*/);
-        }
-    }
-
-    /**
-     * Creates a {@link Result} object with the given SceneStatus.
-     *
-     * @param status the status. Must not be null.
-     */
-    private Result(Status status) {
-        this(status, null, null);
-    }
-
-    /**
-     * Creates a {@link Result} object with the given SceneStatus, and the given message
-     * and {@link Throwable}
-     *
-     * @param status the status. Must not be null.
-     * @param errorMessage an optional error message.
-     * @param t an optional exception.
-     */
-    private Result(Status status, String errorMessage, Throwable t) {
-        assert status != null;
-        mStatus = status;
-        mErrorMessage = errorMessage;
-        mThrowable = t;
-    }
-
-    private Result(Result result) {
-        mStatus = result.mStatus;
-        mErrorMessage = result.mErrorMessage;
-        mThrowable = result.mThrowable;
-    }
-
-    /**
-     * Returns a copy of the current result with the added (or replaced) given data
-     * @param data the data bundle
-     *
-     * @return returns a new SceneResult instance.
-     */
-    public Result getCopyWithData(Object data) {
-        Result r = new Result(this);
-        r.mData = data;
-        return r;
-    }
-
-
-    /**
-     * Returns whether the status is successful.
-     * <p>
-     * This is the same as calling <code>getStatus() == SceneStatus.SUCCESS</code>
-     * @return <code>true</code> if the status is successful.
-     */
-    public boolean isSuccess() {
-        return mStatus == Status.SUCCESS;
-    }
-
-    /**
-     * Returns the status. This is never null.
-     */
-    public Status getStatus() {
-        return mStatus;
-    }
-
-    /**
-     * Returns the error message. This is only non-null when {@link #getStatus()} returns
-     * {@link Status#ERROR_UNKNOWN}
-     */
-    public String getErrorMessage() {
-        return mErrorMessage;
-    }
-
-    /**
-     * Returns the exception. This is only non-null when {@link #getStatus()} returns
-     * {@link Status#ERROR_UNKNOWN}
-     */
-    public Throwable getException() {
-        return mThrowable;
-    }
-
-    /**
-     * Returns the optional data bundle stored in the result object.
-     * @return the data bundle or <code>null</code> if none have been set.
-     */
-    public Object getData() {
-        return mData;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/SessionParams.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/SessionParams.java
deleted file mode 100644
index 709207e..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/SessionParams.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Rendering parameters for a {@link RenderSession}.
- */
-public class SessionParams extends RenderParams {
-
-    public static enum RenderingMode {
-        NORMAL(false, false),
-        V_SCROLL(false, true),
-        H_SCROLL(true, false),
-        FULL_EXPAND(true, true);
-
-        private final boolean mHorizExpand;
-        private final boolean mVertExpand;
-
-        private RenderingMode(boolean horizExpand, boolean vertExpand) {
-            mHorizExpand = horizExpand;
-            mVertExpand = vertExpand;
-        }
-
-        public boolean isHorizExpand() {
-            return mHorizExpand;
-        }
-
-        public boolean isVertExpand() {
-            return mVertExpand;
-        }
-    }
-
-    private final ILayoutPullParser mLayoutDescription;
-    private final RenderingMode mRenderingMode;
-    private boolean mLayoutOnly = false;
-    private Map<ResourceReference, AdapterBinding> mAdapterBindingMap;
-    private boolean mExtendedViewInfoMode = false;
-
-    /**
-     *
-     * @param layoutDescription the {@link ILayoutPullParser} letting the LayoutLib Bridge visit the
-     * layout file.
-     * @param renderingMode The rendering mode.
-     * @param projectKey An Object identifying the project. This is used for the cache mechanism.
-     * @param hardwareConfig the {@link HardwareConfig}.
-     * @param renderResources a {@link RenderResources} object providing access to the resources.
-     * @param projectCallback The {@link IProjectCallback} object to get information from
-     * the project.
-     * @param minSdkVersion the minSdkVersion of the project
-     * @param targetSdkVersion the targetSdkVersion of the project
-     * @param log the object responsible for displaying warning/errors to the user.
-     */
-    public SessionParams(
-            ILayoutPullParser layoutDescription,
-            RenderingMode renderingMode,
-            Object projectKey,
-            HardwareConfig hardwareConfig,
-            RenderResources renderResources,
-            IProjectCallback projectCallback,
-            int minSdkVersion, int targetSdkVersion,
-            LayoutLog log) {
-        super(projectKey, hardwareConfig,
-                renderResources, projectCallback, minSdkVersion, targetSdkVersion, log);
-
-        mLayoutDescription = layoutDescription;
-        mRenderingMode = renderingMode;
-    }
-
-    public SessionParams(SessionParams params) {
-        super(params);
-        mLayoutDescription = params.mLayoutDescription;
-        mRenderingMode = params.mRenderingMode;
-        if (params.mAdapterBindingMap != null) {
-            mAdapterBindingMap = new HashMap<ResourceReference, AdapterBinding>(
-                    params.mAdapterBindingMap);
-        }
-        mExtendedViewInfoMode = params.mExtendedViewInfoMode;
-    }
-
-    public ILayoutPullParser getLayoutDescription() {
-        return mLayoutDescription;
-    }
-
-    public RenderingMode getRenderingMode() {
-        return mRenderingMode;
-    }
-
-    public void setLayoutOnly() {
-        mLayoutOnly = true;
-    }
-
-    public boolean isLayoutOnly() {
-        return mLayoutOnly;
-    }
-
-    public void addAdapterBinding(ResourceReference reference, AdapterBinding data) {
-        if (mAdapterBindingMap == null) {
-            mAdapterBindingMap = new HashMap<ResourceReference, AdapterBinding>();
-        }
-
-        mAdapterBindingMap.put(reference, data);
-    }
-
-    public Map<ResourceReference, AdapterBinding> getAdapterBindings() {
-        if (mAdapterBindingMap == null) {
-            return Collections.emptyMap();
-        }
-
-        return Collections.unmodifiableMap(mAdapterBindingMap);
-    }
-
-    public void setExtendedViewInfoMode(boolean mode) {
-        mExtendedViewInfoMode = mode;
-    }
-
-    public boolean getExtendedViewInfoMode() {
-        return mExtendedViewInfoMode;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/StyleResourceValue.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/StyleResourceValue.java
deleted file mode 100644
index 7fdfd6a..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/StyleResourceValue.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import com.android.layoutlib.api.IResourceValue;
-import com.android.layoutlib.api.IStyleResourceValue;
-import com.android.resources.ResourceType;
-import com.android.util.Pair;
-
-import java.util.HashMap;
-
-/**
- * Represents an android style resources with a name and a list of children {@link ResourceValue}.
- */
-@SuppressWarnings("deprecation")
-public final class StyleResourceValue extends ResourceValue implements IStyleResourceValue {
-
-    private String mParentStyle = null;
-    private HashMap<Pair<String, Boolean>, ResourceValue> mItems = new HashMap<Pair<String, Boolean>, ResourceValue>();
-
-    public StyleResourceValue(ResourceType type, String name, boolean isFramework) {
-        super(type, name, isFramework);
-    }
-
-    public StyleResourceValue(ResourceType type, String name, String parentStyle,
-            boolean isFramework) {
-        super(type, name, isFramework);
-        mParentStyle = parentStyle;
-    }
-
-    /**
-     * Returns the parent style name or <code>null</code> if unknown.
-     */
-    @Override
-    public String getParentStyle() {
-        return mParentStyle;
-    }
-
-    /**
-     * Finds a value in the list by name
-     * @param name the name of the resource
-     *
-     * @deprecated use {@link #findValue(String, boolean)}
-     */
-    @Deprecated
-    public ResourceValue findValue(String name) {
-        return mItems.get(Pair.of(name, isFramework()));
-    }
-
-    /**
-     * Finds a value in the list by name
-     * @param name the name of the resource
-     */
-    public ResourceValue findValue(String name, boolean isFrameworkAttr) {
-        return mItems.get(Pair.of(name, isFrameworkAttr));
-    }
-
-    public void addValue(ResourceValue value, boolean isFrameworkAttr) {
-        mItems.put(Pair.of(value.getName(), isFrameworkAttr), value);
-    }
-
-    @Override
-    public void replaceWith(ResourceValue value) {
-        assert value instanceof StyleResourceValue;
-        super.replaceWith(value);
-
-        if (value instanceof StyleResourceValue) {
-            mItems.clear();
-            mItems.putAll(((StyleResourceValue)value).mItems);
-        }
-    }
-
-    /**
-     * Legacy method.
-     * @deprecated use {@link #getValue()}
-     */
-    @Override
-    @Deprecated
-    public IResourceValue findItem(String name) {
-        return mItems.get(name);
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/ViewInfo.java b/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/ViewInfo.java
deleted file mode 100644
index d859e95..0000000
--- a/layoutlib_api/src/main/java/com/android/ide/common/rendering/api/ViewInfo.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.api;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Layout information for a specific view object
- */
-public class ViewInfo {
-
-    private final Object mCookie;
-    private final String mName;
-    private final int mLeft;
-    private final int mRight;
-    private final int mTop;
-    private final int mBottom;
-    private List<ViewInfo> mChildren = Collections.emptyList();
-    private final Object mViewObject;
-    private final Object mLayoutParamsObject;
-
-    // optional info
-    private int mBaseLine = Integer.MIN_VALUE;
-    private int mLeftMargin = Integer.MIN_VALUE;
-    private int mTopMargin = Integer.MIN_VALUE;
-    private int mRightMargin = Integer.MIN_VALUE;
-    private int mBottomMargin = Integer.MIN_VALUE;
-
-    public ViewInfo(String name, Object cookie, int left, int top, int right, int bottom) {
-        this(name, cookie, left, top, right, bottom, null /*viewObject*/,
-                null /*layoutParamsObject*/);
-    }
-
-    public ViewInfo(String name, Object cookie, int left, int top, int right, int bottom,
-            Object viewObject, Object layoutParamsObject) {
-        mName = name;
-        mCookie = cookie;
-        mLeft = left;
-        mRight = right;
-        mTop = top;
-        mBottom = bottom;
-        mViewObject = viewObject;
-        mLayoutParamsObject = layoutParamsObject;
-    }
-
-    /**
-     * Sets the list of children {@link ViewInfo}.
-     */
-    public void setChildren(List<ViewInfo> children) {
-        if (children != null) {
-            mChildren = Collections.unmodifiableList(children);
-        } else {
-            mChildren = Collections.emptyList();
-        }
-    }
-
-    public void setExtendedInfo(int baseLine, int leftMargin, int topMargin,
-            int rightMargin, int bottomMargin) {
-        mBaseLine = baseLine;
-        mLeftMargin = leftMargin;
-        mTopMargin = topMargin;
-        mRightMargin = rightMargin;
-        mBottomMargin = bottomMargin;
-    }
-
-    /**
-     * Returns the list of children views. This is never null, but can be empty.
-     */
-    public List<ViewInfo> getChildren() {
-        return mChildren;
-    }
-
-    /**
-     * Returns the cookie associated with the XML node. Can be null.
-     *
-     * @see ILayoutPullParser#getViewCookie()
-     */
-    public Object getCookie() {
-        return mCookie;
-    }
-
-    /**
-     * Returns the class name of the view object. Can be null.
-     */
-    public String getClassName() {
-        return mName;
-    }
-
-    /**
-     * Returns the left of the view bounds, relative to the view parent bounds.
-     */
-    public int getLeft() {
-        return mLeft;
-    }
-
-    /**
-     * Returns the top of the view bounds, relative to the view parent bounds.
-     */
-    public int getTop() {
-        return mTop;
-    }
-
-    /**
-     * Returns the right of the view bounds, relative to the view parent bounds.
-     */
-    public int getRight() {
-        return mRight;
-    }
-
-    /**
-     * Returns the bottom of the view bounds, relative to the view parent bounds.
-     */
-    public int getBottom() {
-        return mBottom;
-    }
-
-    /**
-     * Returns the actual android.view.View (or child class) object. This can be used
-     * to query the object properties that are not in the XML and not available through
-     * {@link RenderSession#getProperty(Object, String)}.
-     */
-    public Object getViewObject() {
-        return mViewObject;
-    }
-
-    /**
-     * Returns the actual  android.view.ViewGroup$LayoutParams (or child class) object.
-     * This can be used to query the object properties that are not in the XML and not available
-     * through {@link RenderSession#getProperty(Object, String)}.
-     */
-    public Object getLayoutParamsObject() {
-        return mLayoutParamsObject;
-    }
-
-    /**
-     * Returns the baseline value. If the value is unknown, returns {@link Integer#MIN_VALUE}.
-     */
-    public int getBaseLine() {
-        return mBaseLine;
-    }
-
-    /**
-     * Returns the left margin value. If the value is unknown, returns {@link Integer#MIN_VALUE}.
-     */
-    public int getLeftMargin() {
-        return mLeftMargin;
-    }
-
-    /**
-     * Returns the top margin value. If the value is unknown, returns {@link Integer#MIN_VALUE}.
-     */
-    public int getTopMargin() {
-        return mTopMargin;
-    }
-
-    /**
-     * Returns the right margin value. If the value is unknown, returns {@link Integer#MIN_VALUE}.
-     */
-    public int getRightMargin() {
-        return mRightMargin;
-    }
-
-    /**
-     * Returns the bottom margin value. If the value is unknown, returns {@link Integer#MIN_VALUE}.
-     */
-    public int getBottomMargin() {
-        return mBottomMargin;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/layoutlib/api/IDensityBasedResourceValue.java b/layoutlib_api/src/main/java/com/android/layoutlib/api/IDensityBasedResourceValue.java
deleted file mode 100644
index 25d9bfb..0000000
--- a/layoutlib_api/src/main/java/com/android/layoutlib/api/IDensityBasedResourceValue.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.layoutlib.api;
-
-import com.android.ide.common.rendering.api.DensityBasedResourceValue;
-
-/**
- * Represents an Android Resources that has a density info attached to it.
- * @deprecated use {@link DensityBasedResourceValue}.
- */
-@Deprecated
-public interface IDensityBasedResourceValue extends IResourceValue {
-
-    /**
-     * Density.
-     *
-     * @deprecated use {@link com.android.resources.Density}.
-     */
-    @Deprecated
-    public static enum Density {
-        XHIGH(320),
-        HIGH(240),
-        MEDIUM(160),
-        LOW(120),
-        NODPI(0);
-
-        private final int mValue;
-
-        Density(int value) {
-            mValue = value;
-        }
-
-        public int getValue() {
-            return mValue;
-        }
-
-        /**
-         * Returns the enum matching the given density value
-         * @param value The density value.
-         * @return the enum for the density value or null if no match was found.
-         */
-        public static Density getEnum(int value) {
-            for (Density d : values()) {
-                if (d.mValue == value) {
-                    return d;
-                }
-            }
-
-            return null;
-        }
-    }
-
-    /**
-     * Returns the density associated to the resource.
-     * @deprecated use {@link DensityBasedResourceValue#getResourceDensity()}
-     */
-    @Deprecated
-    Density getDensity();
-}
diff --git a/layoutlib_api/src/main/java/com/android/layoutlib/api/ILayoutBridge.java b/layoutlib_api/src/main/java/com/android/layoutlib/api/ILayoutBridge.java
deleted file mode 100644
index f849cdd..0000000
--- a/layoutlib_api/src/main/java/com/android/layoutlib/api/ILayoutBridge.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.layoutlib.api;
-
-import com.android.ide.common.rendering.api.Bridge;
-
-import java.util.Map;
-
-/**
- * Entry point of the Layout Lib. Implementations of this interface provide a method to compute
- * and render a layout.
- * <p/>
- * <p/>{@link #getApiLevel()} gives the ability to know which methods are available.
- * <p/>
- * Changes in API level 5:
- * <ul>
- * <li>Bridge should extend {@link Bridge} instead of implementing {@link ILayoutBridge}.</li>
- * </ul>
- * Changes in API level 4:
- * <ul>
- * <li>new render method: {@link #computeLayout(IXmlPullParser, Object, int, int, boolean, int, float, float, String, boolean, Map, Map, IProjectCallback, ILayoutLog)}</li>
- * <li>deprecated {@link #computeLayout(IXmlPullParser, Object, int, int, int, float, float, String, boolean, Map, Map, IProjectCallback, ILayoutLog)}</li>
- * </ul>
- * Changes in API level 3:
- * <ul>
- * <li>new render method: {@link #computeLayout(IXmlPullParser, Object, int, int, int, float, float, String, boolean, Map, Map, IProjectCallback, ILayoutLog)}</li>
- * <li>deprecated {@link #computeLayout(IXmlPullParser, Object, int, int, String, boolean, Map, Map, IProjectCallback, ILayoutLog)}</li>
- * </ul>
- * Changes in API level 2:
- * <ul>
- * <li>new API Level method: {@link #getApiLevel()}</li>
- * <li>new render method: {@link #computeLayout(IXmlPullParser, Object, int, int, String, boolean, Map, Map, IProjectCallback, ILayoutLog)}</li>
- * <li>deprecated {@link #computeLayout(IXmlPullParser, Object, int, int, String, Map, Map, IProjectCallback, ILayoutLog)}</li>
- * </ul>
- * @deprecated Extend {@link Bridge} instead.
- */
-@Deprecated
-public interface ILayoutBridge {
-
-    final int API_CURRENT = 4;
-
-    /**
-     * Returns the API level of the layout library.
-     * While no methods will ever be removed, some may become deprecated, and some new ones
-     * will appear.
-     * <p/>If calling this method throws an {@link AbstractMethodError}, then the API level
-     * should be considered to be 1.
-     */
-    int getApiLevel();
-
-    /**
-     * Initializes the Bridge object.
-     * @param fontOsLocation the location of the fonts.
-     * @param enumValueMap map attrName => { map enumFlagName => Integer value }.
-     * @return true if success.
-     * @since 1
-     */
-    boolean init(String fontOsLocation, Map<String, Map<String, Integer>> enumValueMap);
-
-    /**
-     * Prepares the layoutlib to unloaded.
-     */
-    boolean dispose();
-
-    /**
-     * Starts a layout session by inflating and rendering it. The method returns a
-     * {@link ILayoutResult} on which further actions can be taken.
-     *
-     * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the
-     * layout file.
-     * @param projectKey An Object identifying the project. This is used for the cache mechanism.
-     * @param screenWidth the screen width
-     * @param screenHeight the screen height
-     * @param renderFullSize if true, the rendering will render the full size needed by the
-     * layout. This size is never smaller than <var>screenWidth</var> x <var>screenHeight</var>.
-     * @param density the density factor for the screen.
-     * @param xdpi the screen actual dpi in X
-     * @param ydpi the screen actual dpi in Y
-     * @param themeName The name of the theme to use.
-     * @param isProjectTheme true if the theme is a project theme, false if it is a framework theme.
-     * @param projectResources the resources of the project. The map contains (String, map) pairs
-     * where the string is the type of the resource reference used in the layout file, and the
-     * map contains (String, {@link IResourceValue}) pairs where the key is the resource name,
-     * and the value is the resource value.
-     * @param frameworkResources the framework resources. The map contains (String, map) pairs
-     * where the string is the type of the resource reference used in the layout file, and the map
-     * contains (String, {@link IResourceValue}) pairs where the key is the resource name, and the
-     * value is the resource value.
-     * @param projectCallback The {@link IProjectCallback} object to get information from
-     * the project.
-     * @param logger the object responsible for displaying warning/errors to the user.
-     * @return a new {@link ILayoutResult} object that contains the result of the layout.
-     * @deprecated use {@link Bridge#createSession(com.android.ide.common.rendering.api.SessionParams)}
-     * @since 4
-     */
-    @Deprecated
-    ILayoutResult computeLayout(IXmlPullParser layoutDescription,
-            Object projectKey,
-            int screenWidth, int screenHeight, boolean renderFullSize,
-            int density, float xdpi, float ydpi,
-            String themeName, boolean isProjectTheme,
-            Map<String, Map<String, IResourceValue>> projectResources,
-            Map<String, Map<String, IResourceValue>> frameworkResources,
-            IProjectCallback projectCallback, ILayoutLog logger);
-
-    /**
-     * Computes and renders a layout
-     * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the
-     * layout file.
-     * @param projectKey An Object identifying the project. This is used for the cache mechanism.
-     * @param screenWidth the screen width
-     * @param screenHeight the screen height
-     * @param density the density factor for the screen.
-     * @param xdpi the screen actual dpi in X
-     * @param ydpi the screen actual dpi in Y
-     * @param themeName The name of the theme to use.
-     * @param isProjectTheme true if the theme is a project theme, false if it is a framework theme.
-     * @param projectResources the resources of the project. The map contains (String, map) pairs
-     * where the string is the type of the resource reference used in the layout file, and the
-     * map contains (String, {@link IResourceValue}) pairs where the key is the resource name,
-     * and the value is the resource value.
-     * @param frameworkResources the framework resources. The map contains (String, map) pairs
-     * where the string is the type of the resource reference used in the layout file, and the map
-     * contains (String, {@link IResourceValue}) pairs where the key is the resource name, and the
-     * value is the resource value.
-     * @param projectCallback The {@link IProjectCallback} object to get information from
-     * the project.
-     * @param logger the object responsible for displaying warning/errors to the user.
-     * @return a new {@link ILayoutResult} object that contains the result of the layout.
-     * @deprecated use {@link Bridge#createSession(com.android.ide.common.rendering.api.SessionParams)}
-     * @since 3
-     */
-    @Deprecated
-    ILayoutResult computeLayout(IXmlPullParser layoutDescription,
-            Object projectKey,
-            int screenWidth, int screenHeight, int density, float xdpi, float ydpi,
-            String themeName, boolean isProjectTheme,
-            Map<String, Map<String, IResourceValue>> projectResources,
-            Map<String, Map<String, IResourceValue>> frameworkResources,
-            IProjectCallback projectCallback, ILayoutLog logger);
-
-    /**
-     * Computes and renders a layout
-     * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the
-     * layout file.
-     * @param projectKey An Object identifying the project. This is used for the cache mechanism.
-     * @param screenWidth the screen width
-     * @param screenHeight the screen height
-     * @param themeName The name of the theme to use.
-     * @param isProjectTheme true if the theme is a project theme, false if it is a framework theme.
-     * @param projectResources the resources of the project. The map contains (String, map) pairs
-     * where the string is the type of the resource reference used in the layout file, and the
-     * map contains (String, {@link IResourceValue}) pairs where the key is the resource name,
-     * and the value is the resource value.
-     * @param frameworkResources the framework resources. The map contains (String, map) pairs
-     * where the string is the type of the resource reference used in the layout file, and the map
-     * contains (String, {@link IResourceValue}) pairs where the key is the resource name, and the
-     * value is the resource value.
-     * @param projectCallback The {@link IProjectCallback} object to get information from
-     * the project.
-     * @param logger the object responsible for displaying warning/errors to the user.
-     * @return a new {@link ILayoutResult} object that contains the result of the layout.
-     * @deprecated use {@link Bridge#createSession(com.android.ide.common.rendering.api.SessionParams)}
-     * @since 2
-     */
-    @Deprecated
-    ILayoutResult computeLayout(IXmlPullParser layoutDescription,
-            Object projectKey,
-            int screenWidth, int screenHeight, String themeName, boolean isProjectTheme,
-            Map<String, Map<String, IResourceValue>> projectResources,
-            Map<String, Map<String, IResourceValue>> frameworkResources,
-            IProjectCallback projectCallback, ILayoutLog logger);
-
-    /**
-     * Computes and renders a layout
-     * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the
-     * layout file.
-     * @param projectKey An Object identifying the project. This is used for the cache mechanism.
-     * @param screenWidth
-     * @param screenHeight
-     * @param themeName The name of the theme to use. In order to differentiate project and platform
-     * themes sharing the same name, all project themes must be prepended with a '*' character.
-     * @param projectResources the resources of the project. The map contains (String, map) pairs
-     * where the string is the type of the resource reference used in the layout file, and the
-     * map contains (String, {@link IResourceValue}) pairs where the key is the resource name,
-     * and the value is the resource value.
-     * @param frameworkResources the framework resources. The map contains (String, map) pairs
-     * where the string is the type of the resource reference used in the layout file, and the map
-     * contains (String, {@link IResourceValue}) pairs where the key is the resource name, and the
-     * value is the resource value.
-     * @param projectCallback The {@link IProjectCallback} object to get information from
-     * the project.
-     * @param logger the object responsible for displaying warning/errors to the user.
-     * @return a new {@link ILayoutResult} object that contains the result of the layout.
-     * @deprecated use {@link Bridge#createSession(com.android.ide.common.rendering.api.SessionParams)}
-     * @since 1
-     */
-    @Deprecated
-    ILayoutResult computeLayout(IXmlPullParser layoutDescription,
-            Object projectKey,
-            int screenWidth, int screenHeight, String themeName,
-            Map<String, Map<String, IResourceValue>> projectResources,
-            Map<String, Map<String, IResourceValue>> frameworkResources,
-            IProjectCallback projectCallback, ILayoutLog logger);
-
-    /**
-     * Clears the resource cache for a specific project.
-     * <p/>This cache contains bitmaps and nine patches that are loaded from the disk and reused
-     * until this method is called.
-     * <p/>The cache is not configuration dependent and should only be cleared when a
-     * resource changes (at this time only bitmaps and 9 patches go into the cache).
-     * @param projectKey the key for the project.
-     * @since 1
-     */
-    void clearCaches(Object projectKey);
-}
diff --git a/layoutlib_api/src/main/java/com/android/layoutlib/api/ILayoutLog.java b/layoutlib_api/src/main/java/com/android/layoutlib/api/ILayoutLog.java
deleted file mode 100644
index 38a22b8..0000000
--- a/layoutlib_api/src/main/java/com/android/layoutlib/api/ILayoutLog.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.layoutlib.api;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-
-/**
- * Callback interface to display warnings/errors that happened during the computation and
- * rendering of the layout.
- * @deprecated use {@link LayoutLog}.
- */
-@Deprecated
-public interface ILayoutLog {
-
-    /**
-     * Logs a warning message.
-     * @param message the message to log.
-     */
-    void warning(String message);
-
-    /**
-     * Logs an error message.
-     * @param message the message to log.
-     */
-    void error(String message);
-
-    /**
-     * Logs an exception
-     * @param t the {@link Throwable} to log.
-     */
-    void error(Throwable t);
-}
diff --git a/layoutlib_api/src/main/java/com/android/layoutlib/api/ILayoutResult.java b/layoutlib_api/src/main/java/com/android/layoutlib/api/ILayoutResult.java
deleted file mode 100644
index 6aeaf9f..0000000
--- a/layoutlib_api/src/main/java/com/android/layoutlib/api/ILayoutResult.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.layoutlib.api;
-
-import com.android.ide.common.rendering.api.Bridge;
-import com.android.ide.common.rendering.api.RenderSession;
-
-import java.awt.image.BufferedImage;
-
-/**
- * The result of a layout computation through {@link ILayoutBridge}.
- *
- * @since 1
- * @deprecated use {@link RenderSession} as returned by {@link Bridge#createSession(com.android.ide.common.rendering.api.SessionParams)}
- */
-@Deprecated
-public interface ILayoutResult {
-    /**
-     * Success return code
-     */
-    final static int SUCCESS = 0;
-
-    /**
-     * Error return code, in which case an error message is guaranteed to be defined.
-     * @see #getErrorMessage()
-     */
-    final static int ERROR = 1;
-
-    /**
-     * Returns the result code.
-     * @see #SUCCESS
-     * @see #ERROR
-     */
-    int getSuccess();
-
-    /**
-     * Returns the {@link ILayoutViewInfo} object for the top level view.
-     */
-    ILayoutViewInfo getRootView();
-
-    /**
-     * Returns the rendering of the full layout.
-     */
-    BufferedImage getImage();
-
-    /**
-     * Returns the error message.
-     * <p/>Only valid when {@link #getSuccess()} returns {@link #ERROR}
-     */
-    String getErrorMessage();
-
-    /**
-     * Layout information for a specific view.
-     * @deprecated
-     */
-    @Deprecated
-    public interface ILayoutViewInfo {
-
-        /**
-         * Returns the list of children views.
-         */
-        ILayoutViewInfo[] getChildren();
-
-        /**
-         * Returns the key associated with the node.
-         * @see IXmlPullParser#getViewKey()
-         */
-        Object getViewKey();
-
-        /**
-         * Returns the name of the view.
-         */
-        String getName();
-
-        /**
-         * Returns the left of the view bounds.
-         */
-        int getLeft();
-
-        /**
-         * Returns the top of the view bounds.
-         */
-        int getTop();
-
-        /**
-         * Returns the right of the view bounds.
-         */
-        int getRight();
-
-        /**
-         * Returns the bottom of the view bounds.
-         */
-        int getBottom();
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/layoutlib/api/IProjectCallback.java b/layoutlib_api/src/main/java/com/android/layoutlib/api/IProjectCallback.java
deleted file mode 100644
index 65e2a87..0000000
--- a/layoutlib_api/src/main/java/com/android/layoutlib/api/IProjectCallback.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.layoutlib.api;
-
-/**
- *
- * @deprecated
- *
- */
-public interface IProjectCallback  {
-
-    /**
-     * Loads a custom view with the given constructor signature and arguments.
-     * @param name The fully qualified name of the class.
-     * @param constructorSignature The signature of the class to use
-     * @param constructorArgs The arguments to use on the constructor
-     * @return A newly instantiated android.view.View object.
-     * @throws ClassNotFoundException
-     * @throws Exception
-     */
-    @SuppressWarnings("unchecked")
-    Object loadView(String name, Class[] constructorSignature, Object[] constructorArgs)
-        throws ClassNotFoundException, Exception;
-
-    /**
-     * Returns the namespace of the application.
-     * <p/>This lets the Layout Lib load custom attributes for custom views.
-     */
-    String getNamespace();
-
-    /**
-     * Resolves the id of a resource Id.
-     * <p/>The resource id is the value of a <code>R.&lt;type&gt;.&lt;name&gt;</code>, and
-     * this method will return both the type and name of the resource.
-     * @param id the Id to resolve.
-     * @return an array of 2 strings containing the resource name and type, or null if the id
-     * does not match any resource.
-     */
-    String[] resolveResourceValue(int id);
-
-    /**
-     * Resolves the id of a resource Id of type int[]
-     * <p/>The resource id is the value of a R.styleable.&lt;name&gt;, and this method will
-     * return the name of the resource.
-     * @param id the Id to resolve.
-     * @return the name of the resource or <code>null</code> if not found.
-     */
-    String resolveResourceValue(int[] id);
-
-    /**
-     * Returns the id of a resource.
-     * <p/>The provided type and name must match an existing constant defined as
-     * <code>R.&lt;type&gt;.&lt;name&gt;</code>.
-     * @param type the type of the resource
-     * @param name the name of the resource
-     * @return an Integer containing the resource Id, or <code>null</code> if not found.
-     */
-    Integer getResourceValue(String type, String name);
-}
diff --git a/layoutlib_api/src/main/java/com/android/layoutlib/api/IResourceValue.java b/layoutlib_api/src/main/java/com/android/layoutlib/api/IResourceValue.java
deleted file mode 100644
index 9a00801..0000000
--- a/layoutlib_api/src/main/java/com/android/layoutlib/api/IResourceValue.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.layoutlib.api;
-
-import com.android.ide.common.rendering.api.ResourceValue;
-
-/**
- * Represents an android resource with a name and a string value.
- * @deprecated use {@link ResourceValue}.
- */
-@Deprecated
-public interface IResourceValue {
-
-    /**
-     * Returns the type of the resource. For instance "drawable", "color", etc...
-     */
-    String getType();
-
-    /**
-     * Returns the name of the resource, as defined in the XML.
-     */
-    String getName();
-
-    /**
-     * Returns the value of the resource, as defined in the XML. This can be <code>null</code>
-     */
-    String getValue();
-
-    /**
-     * Returns whether the resource is a framework resource (<code>true</code>) or a project
-     * resource (<code>false</false>).
-     */
-    boolean isFramework();
-}
diff --git a/layoutlib_api/src/main/java/com/android/layoutlib/api/IStyleResourceValue.java b/layoutlib_api/src/main/java/com/android/layoutlib/api/IStyleResourceValue.java
deleted file mode 100644
index 21036ca..0000000
--- a/layoutlib_api/src/main/java/com/android/layoutlib/api/IStyleResourceValue.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.layoutlib.api;
-
-import com.android.ide.common.rendering.api.StyleResourceValue;
-
-/**
- * Represents an android style resources with a name and a list of children {@link IResourceValue}.
- * @deprecated Use {@link StyleResourceValue}.
- */
-@Deprecated
-public interface IStyleResourceValue extends IResourceValue {
-
-    /**
-     * Returns the parent style name or <code>null</code> if unknown.
-     */
-    String getParentStyle();
-
-    /**
-     * Find an item in the list by name
-     * @param name the name of the resource
-     *
-     * @deprecated use {@link StyleResourceValue#findValue(String)}
-     */
-    IResourceValue findItem(String name);
-}
diff --git a/layoutlib_api/src/main/java/com/android/layoutlib/api/IXmlPullParser.java b/layoutlib_api/src/main/java/com/android/layoutlib/api/IXmlPullParser.java
deleted file mode 100644
index e0a98a6..0000000
--- a/layoutlib_api/src/main/java/com/android/layoutlib/api/IXmlPullParser.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.layoutlib.api;
-
-import org.xmlpull.v1.XmlPullParser;
-
-/**
- * @deprecated
- */
-@Deprecated
-public interface IXmlPullParser extends XmlPullParser {
-
-    /**
-     * Returns a key for the current XML node.
-     * <p/>This key will be passed back in the {@link com.android.ide.common.rendering.api.ViewInfo}
-     * objects, allowing association of a particular XML node with its result from the
-     * layout computation.
-     */
-    Object getViewKey();
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/Density.java b/layoutlib_api/src/main/java/com/android/resources/Density.java
deleted file mode 100644
index 1f3fb52..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/Density.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-
-/**
- * Density enum.
- * <p/>This is used in the manifest in the uses-configuration node and in the resource folder names
- * as well as other places needing to know the density values.
- */
-public enum Density implements ResourceEnum {
-    XXHIGH("xxhdpi", "XX-High Density", 480, 16), //$NON-NLS-1$
-    XHIGH("xhdpi", "X-High Density", 320, 8), //$NON-NLS-1$
-    HIGH("hdpi", "High Density", 240, 4), //$NON-NLS-1$
-    TV("tvdpi", "TV Density", 213, 13), //$NON-NLS-1$
-    MEDIUM("mdpi", "Medium Density", 160, 4), //$NON-NLS-1$
-    LOW("ldpi", "Low Density", 120, 4), //$NON-NLS-1$
-    NODPI("nodpi", "No Density", 0, 4); //$NON-NLS-1$
-
-    public final static int DEFAULT_DENSITY = 160;
-
-    private final String mValue;
-    private final String mDisplayValue;
-    private final int mDensity;
-    private final int mSince;
-
-    private Density(String value, String displayValue, int density, int since) {
-        mValue = value;
-        mDisplayValue = displayValue;
-        mDensity = density;
-        mSince = since;
-    }
-
-    /**
-     * Returns the enum matching the provided qualifier value.
-     * @param value The qualifier value.
-     * @return the enum for the qualifier value or null if no match was found.
-     */
-    public static Density getEnum(String value) {
-        for (Density orient : values()) {
-            if (orient.mValue.equals(value)) {
-                return orient;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the enum matching the given density value
-     * @param value The density value.
-     * @return the enum for the density value or null if no match was found.
-     */
-    public static Density getEnum(int value) {
-        for (Density d : values()) {
-            if (d.mDensity == value) {
-                return d;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getResourceValue() {
-        return mValue;
-    }
-
-    public int getDpiValue() {
-        return mDensity;
-    }
-
-    public int since() {
-        return mSince;
-    }
-
-    public String getLegacyValue() {
-        if (this != NODPI) {
-            return String.format("%1$ddpi", getDpiValue());
-        }
-
-        return "";
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        return mDisplayValue;
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return mDisplayValue;
-    }
-
-    public static int getIndex(Density value) {
-        int i = 0;
-        for (Density input : values()) {
-            if (value == input) {
-                return i;
-            }
-
-            i++;
-        }
-
-        return -1;
-    }
-
-    public static Density getByIndex(int index) {
-        int i = 0;
-        for (Density value : values()) {
-            if (i == index) {
-                return value;
-            }
-            i++;
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValidValueForDevice() {
-        return this != NODPI; // nodpi is not a valid config for devices.
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/FolderTypeRelationship.java b/layoutlib_api/src/main/java/com/android/resources/FolderTypeRelationship.java
deleted file mode 100644
index 61a6d85..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/FolderTypeRelationship.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * This class gives access to the bidirectional relationship between {@link ResourceType} and
- * {@link ResourceFolderType}.
- */
-public final class FolderTypeRelationship {
-
-    private final static Map<ResourceType, List<ResourceFolderType>> mTypeToFolderMap =
-        new HashMap<ResourceType, List<ResourceFolderType>>();
-
-    private final static Map<ResourceFolderType, List<ResourceType>> mFolderToTypeMap =
-        new HashMap<ResourceFolderType, List<ResourceType>>();
-
-    static {
-        // generate the relationships in a temporary map
-        add(ResourceType.ANIM, ResourceFolderType.ANIM);
-        add(ResourceType.ANIMATOR, ResourceFolderType.ANIMATOR);
-        add(ResourceType.ARRAY, ResourceFolderType.VALUES);
-        add(ResourceType.ATTR, ResourceFolderType.VALUES);
-        add(ResourceType.BOOL, ResourceFolderType.VALUES);
-        add(ResourceType.COLOR, ResourceFolderType.VALUES);
-        add(ResourceType.COLOR, ResourceFolderType.COLOR);
-        add(ResourceType.DECLARE_STYLEABLE, ResourceFolderType.VALUES);
-        add(ResourceType.DIMEN, ResourceFolderType.VALUES);
-        add(ResourceType.DRAWABLE, ResourceFolderType.VALUES);
-        add(ResourceType.DRAWABLE, ResourceFolderType.DRAWABLE);
-        add(ResourceType.FRACTION, ResourceFolderType.VALUES);
-        add(ResourceType.ID, ResourceFolderType.VALUES);
-        add(ResourceType.INTEGER, ResourceFolderType.VALUES);
-        add(ResourceType.INTERPOLATOR, ResourceFolderType.INTERPOLATOR);
-        add(ResourceType.LAYOUT, ResourceFolderType.LAYOUT);
-        add(ResourceType.ID, ResourceFolderType.LAYOUT);
-        add(ResourceType.MENU, ResourceFolderType.MENU);
-        add(ResourceType.ID, ResourceFolderType.MENU);
-        add(ResourceType.MIPMAP, ResourceFolderType.MIPMAP);
-        add(ResourceType.PLURALS, ResourceFolderType.VALUES);
-        add(ResourceType.PUBLIC, ResourceFolderType.VALUES);
-        add(ResourceType.RAW, ResourceFolderType.RAW);
-        add(ResourceType.STRING, ResourceFolderType.VALUES);
-        add(ResourceType.STYLE, ResourceFolderType.VALUES);
-        add(ResourceType.STYLEABLE, ResourceFolderType.VALUES);
-        add(ResourceType.XML, ResourceFolderType.XML);
-
-        makeSafe();
-    }
-
-    /**
-     * Returns a list of {@link ResourceType}s that can be generated from files inside a folder
-     * of the specified type.
-     * @param folderType The folder type.
-     * @return a list of {@link ResourceType}, possibly empty but never null.
-     */
-    public static List<ResourceType> getRelatedResourceTypes(ResourceFolderType folderType) {
-        List<ResourceType> list = mFolderToTypeMap.get(folderType);
-        if (list != null) {
-            return list;
-        }
-
-        return Collections.emptyList();
-    }
-
-    /**
-     * Returns a list of {@link ResourceFolderType} that can contain files generating resources
-     * of the specified type.
-     * @param resType the type of resource.
-     * @return a list of {@link ResourceFolderType}, possibly empty but never null.
-     */
-    public static List<ResourceFolderType> getRelatedFolders(ResourceType resType) {
-        List<ResourceFolderType> list = mTypeToFolderMap.get(resType);
-        if (list != null) {
-            return list;
-        }
-
-        return Collections.emptyList();
-    }
-
-    /**
-     * Returns true if the {@link ResourceType} and the {@link ResourceFolderType} values match.
-     * @param resType the resource type.
-     * @param folderType the folder type.
-     * @return true if files inside the folder of the specified {@link ResourceFolderType}
-     * could generate a resource of the specified {@link ResourceType}
-     */
-    public static boolean match(ResourceType resType, ResourceFolderType folderType) {
-        List<ResourceFolderType> list = mTypeToFolderMap.get(resType);
-
-        if (list != null) {
-            return list.contains(folderType);
-        }
-
-        return false;
-    }
-
-    /**
-     * Adds a {@link ResourceType} - {@link ResourceFolderType} relationship. this indicates that
-     * a file in the folder can generate a resource of the specified type.
-     * @param type The resourceType
-     * @param folder The {@link ResourceFolderType}
-     */
-    private static void add(ResourceType type, ResourceFolderType folder) {
-        // first we add the folder to the list associated with the type.
-        List<ResourceFolderType> folderList = mTypeToFolderMap.get(type);
-        if (folderList == null) {
-            folderList = new ArrayList<ResourceFolderType>();
-            mTypeToFolderMap.put(type, folderList);
-        }
-        if (folderList.indexOf(folder) == -1) {
-            folderList.add(folder);
-        }
-
-        // now we add the type to the list associated with the folder.
-        List<ResourceType> typeList = mFolderToTypeMap.get(folder);
-        if (typeList == null) {
-            typeList = new ArrayList<ResourceType>();
-            mFolderToTypeMap.put(folder, typeList);
-        }
-        if (typeList.indexOf(type) == -1) {
-            typeList.add(type);
-        }
-    }
-
-    /**
-     * Makes the maps safe by replacing the current list values with unmodifiable lists.
-     */
-    private static void makeSafe() {
-        for (ResourceType type : ResourceType.values()) {
-            List<ResourceFolderType> list = mTypeToFolderMap.get(type);
-            if (list != null) {
-                // replace with a unmodifiable list wrapper around the current list.
-                mTypeToFolderMap.put(type, Collections.unmodifiableList(list));
-            }
-        }
-
-        for (ResourceFolderType folder : ResourceFolderType.values()) {
-            List<ResourceType> list = mFolderToTypeMap.get(folder);
-            if (list != null) {
-                // replace with a unmodifiable list wrapper around the current list.
-                mFolderToTypeMap.put(folder, Collections.unmodifiableList(list));
-            }
-        }
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/Keyboard.java b/layoutlib_api/src/main/java/com/android/resources/Keyboard.java
deleted file mode 100644
index d6bc80a..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/Keyboard.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * Keyboard enum.
- * <p/>This is used in the manifest in the uses-configuration node and in the resource folder names.
- */
-public enum Keyboard implements ResourceEnum {
-    NOKEY("nokeys", null, "No Keys", "No keyboard"), //$NON-NLS-1$
-    QWERTY("qwerty", null, "Qwerty", "Qwerty keybard"), //$NON-NLS-1$
-    TWELVEKEY("12key", "twelvekey", "12 Key", "12 key keyboard"); //$NON-NLS-1$ //$NON-NLS-2$
-
-    private final String mValue, mValue2;
-    private final String mShortDisplayValue;
-    private final String mLongDisplayValue;
-
-    private Keyboard(String value, String value2, String shortDisplayValue,
-            String longDisplayValue) {
-        mValue = value;
-        mValue2 = value2;
-        mShortDisplayValue = shortDisplayValue;
-        mLongDisplayValue = longDisplayValue;
-    }
-
-    /**
-     * Returns the enum for matching the provided qualifier value.
-     * @param value The qualifier value.
-     * @return the enum for the qualifier value or null if no matching was found.
-     */
-    public static Keyboard getEnum(String value) {
-        for (Keyboard kbrd : values()) {
-            if (kbrd.mValue.equals(value) ||
-                    (kbrd.mValue2 != null && kbrd.mValue2.equals(value))) {
-                return kbrd;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getResourceValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        return mShortDisplayValue;
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return mLongDisplayValue;
-    }
-
-    public static int getIndex(Keyboard value) {
-        int i = 0;
-        for (Keyboard input : values()) {
-            if (value == input) {
-                return i;
-            }
-
-            i++;
-        }
-
-        return -1;
-    }
-
-    public static Keyboard getByIndex(int index) {
-        int i = 0;
-        for (Keyboard value : values()) {
-            if (i == index) {
-                return value;
-            }
-            i++;
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValidValueForDevice() {
-        return true;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/KeyboardState.java b/layoutlib_api/src/main/java/com/android/resources/KeyboardState.java
deleted file mode 100644
index 2eb7e00..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/KeyboardState.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * Keyboard state enum.
- * <p/>This is used in the manifest in the uses-configuration node and in the resource folder names.
- */
-public enum KeyboardState implements ResourceEnum {
-    EXPOSED("keysexposed", "Exposed", "Exposed keyboard"), //$NON-NLS-1$
-    HIDDEN("keyshidden", "Hidden", "Hidden keyboard"),    //$NON-NLS-1$
-    SOFT("keyssoft", "Soft", "Soft keyboard");          //$NON-NLS-1$
-
-    private final String mValue;
-    private final String mShortDisplayValue;
-    private final String mLongDisplayValue;
-
-    private KeyboardState(String value, String shortDisplayValue, String longDisplayValue) {
-        mValue = value;
-        mShortDisplayValue = shortDisplayValue;
-        mLongDisplayValue = longDisplayValue;
-    }
-
-    /**
-     * Returns the enum for matching the provided qualifier value.
-     * @param value The qualifier value.
-     * @return the enum for the qualifier value or null if no matching was found.
-     */
-    public static KeyboardState getEnum(String value) {
-        for (KeyboardState state : values()) {
-            if (state.mValue.equals(value)) {
-                return state;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getResourceValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        return mShortDisplayValue;
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return mLongDisplayValue;
-    }
-
-    public static int getIndex(KeyboardState value) {
-        int i = 0;
-        for (KeyboardState input : values()) {
-            if (value == input) {
-                return i;
-            }
-
-            i++;
-        }
-
-        return -1;
-    }
-
-    public static KeyboardState getByIndex(int index) {
-        int i = 0;
-        for (KeyboardState value : values()) {
-            if (i == index) {
-                return value;
-            }
-            i++;
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValidValueForDevice() {
-        return true;
-    }
-
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/LayoutDirection.java b/layoutlib_api/src/main/java/com/android/resources/LayoutDirection.java
deleted file mode 100644
index fbc386d..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/LayoutDirection.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * Layout Direction enum.
- */
-public enum LayoutDirection implements ResourceEnum {
-    LTR("ldltr", "LTR", "Left To Right"), //$NON-NLS-1$
-    RTL("ldrtl", "RTL", "Right To Left"); //$NON-NLS-1$
-
-    private final String mValue;
-    private final String mShortDisplayValue;
-    private final String mLongDisplayValue;
-
-    private LayoutDirection(String value, String shortDisplayValue, String longDisplayValue) {
-        mValue = value;
-        mShortDisplayValue = shortDisplayValue;
-        mLongDisplayValue = longDisplayValue;
-    }
-
-    /**
-     * Returns the enum for matching the provided qualifier value.
-     * @param value The qualifier value.
-     * @return the enum for the qualifier value or null if no matching was found.
-     */
-    public static LayoutDirection getEnum(String value) {
-        for (LayoutDirection orient : values()) {
-            if (orient.mValue.equals(value)) {
-                return orient;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getResourceValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        return mShortDisplayValue;
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return mLongDisplayValue;
-    }
-
-    public static int getIndex(LayoutDirection orientation) {
-        int i = 0;
-        for (LayoutDirection orient : values()) {
-            if (orient == orientation) {
-                return i;
-            }
-
-            i++;
-        }
-
-        return -1;
-    }
-
-    public static LayoutDirection getByIndex(int index) {
-        int i = 0;
-        for (LayoutDirection orient : values()) {
-            if (i == index) {
-                return orient;
-            }
-            i++;
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean isFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValidValueForDevice() {
-        return true;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/Navigation.java b/layoutlib_api/src/main/java/com/android/resources/Navigation.java
deleted file mode 100644
index f857e5f..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/Navigation.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * Navigation enum.
- * <p/>This is used in the manifest in the uses-configuration node and in the resource folder names.
- */
-public enum Navigation implements ResourceEnum {
-    NONAV("nonav", "None", "No navigation"), //$NON-NLS-1$
-    DPAD("dpad", "D-pad", "D-pad navigation"), //$NON-NLS-1$
-    TRACKBALL("trackball", "Trackball", "Trackball navigation"), //$NON-NLS-1$
-    WHEEL("wheel", "Wheel", "Wheel navigation"); //$NON-NLS-1$
-
-    private final String mValue;
-    private final String mShortDisplayValue;
-    private final String mLongDisplayValue;
-
-    private Navigation(String value, String shortDisplayValue, String longDisplayValue) {
-        mValue = value;
-        mShortDisplayValue = shortDisplayValue;
-        mLongDisplayValue = longDisplayValue;
-    }
-
-    /**
-     * Returns the enum for matching the provided qualifier value.
-     * @param value The qualifier value.
-     * @return the enum for the qualifier value or null if no matching was found.
-     */
-    public static Navigation getEnum(String value) {
-        for (Navigation nav : values()) {
-            if (nav.mValue.equals(value)) {
-                return nav;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getResourceValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        return mShortDisplayValue;
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return mLongDisplayValue;
-    }
-
-    public static int getIndex(Navigation value) {
-        int i = 0;
-        for (Navigation nav : values()) {
-            if (nav == value) {
-                return i;
-            }
-
-            i++;
-        }
-
-        return -1;
-    }
-
-    public static Navigation getByIndex(int index) {
-        int i = 0;
-        for (Navigation value : values()) {
-            if (i == index) {
-                return value;
-            }
-            i++;
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValidValueForDevice() {
-        return true;
-    }
-
-}
\ No newline at end of file
diff --git a/layoutlib_api/src/main/java/com/android/resources/NavigationState.java b/layoutlib_api/src/main/java/com/android/resources/NavigationState.java
deleted file mode 100644
index 63b8fea..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/NavigationState.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * Navigation state enum.
- * <p/>This is used in the resource folder names.
- */
-public enum NavigationState implements ResourceEnum {
-    EXPOSED("navexposed", "Exposed", "Exposed navigation"), //$NON-NLS-1$
-    HIDDEN("navhidden", "Hidden", "Hidden navigation");    //$NON-NLS-1$
-
-    private final String mValue;
-    private final String mShortDisplayValue;
-    private final String mLongDisplayValue;
-
-    private NavigationState(String value, String shortDisplayValue, String longDisplayValue) {
-        mValue = value;
-        mShortDisplayValue = shortDisplayValue;
-        mLongDisplayValue = longDisplayValue;
-    }
-
-    /**
-     * Returns the enum for matching the provided qualifier value.
-     * @param value The qualifier value.
-     * @return the enum for the qualifier value or null if no matching was found.
-     */
-    public static NavigationState getEnum(String value) {
-        for (NavigationState state : values()) {
-            if (state.mValue.equals(value)) {
-                return state;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getResourceValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        return mShortDisplayValue;
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return mLongDisplayValue;
-    }
-
-    public static int getIndex(NavigationState value) {
-        int i = 0;
-        for (NavigationState input : values()) {
-            if (value == input) {
-                return i;
-            }
-
-            i++;
-        }
-
-        return -1;
-    }
-
-    public static NavigationState getByIndex(int index) {
-        int i = 0;
-        for (NavigationState value : values()) {
-            if (i == index) {
-                return value;
-            }
-            i++;
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValidValueForDevice() {
-        return true;
-    }
-
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/NightMode.java b/layoutlib_api/src/main/java/com/android/resources/NightMode.java
deleted file mode 100644
index 8fe1dd9..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/NightMode.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * Night enum.
- * <p/>This is used in the resource folder names.
- */
-public enum NightMode implements ResourceEnum {
-    NOTNIGHT("notnight", "Not Night", "Day time"),
-    NIGHT("night", "Night", "Night time");
-
-    private final String mValue;
-    private final String mShortDisplayValue;
-    private final String mLongDisplayValue;
-
-    private NightMode(String value, String shortDisplayValue, String longDisplayValue) {
-        mValue = value;
-        mShortDisplayValue = shortDisplayValue;
-        mLongDisplayValue = longDisplayValue;
-    }
-
-    /**
-     * Returns the enum for matching the provided qualifier value.
-     * @param value The qualifier value.
-     * @return the enum for the qualifier value or null if no matching was found.
-     */
-    public static NightMode getEnum(String value) {
-        for (NightMode mode : values()) {
-            if (mode.mValue.equals(value)) {
-                return mode;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getResourceValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        return mShortDisplayValue;
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return mLongDisplayValue;
-    }
-
-    public static int getIndex(NightMode value) {
-        int i = 0;
-        for (NightMode mode : values()) {
-            if (mode == value) {
-                return i;
-            }
-
-            i++;
-        }
-
-        return -1;
-    }
-
-    public static NightMode getByIndex(int index) {
-        int i = 0;
-        for (NightMode value : values()) {
-            if (i == index) {
-                return value;
-            }
-            i++;
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValidValueForDevice() {
-        return true;
-    }
-
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/ResourceConstants.java b/layoutlib_api/src/main/java/com/android/resources/ResourceConstants.java
deleted file mode 100644
index 748f88a..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/ResourceConstants.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * Resource Constants.
- */
-public class ResourceConstants {
-
-    /** Default anim resource folder name, i.e. "anim" */
-    public final static String FD_RES_ANIM = "anim"; //$NON-NLS-1$
-    /** Default animator resource folder name, i.e. "animator" */
-    public final static String FD_RES_ANIMATOR = "animator"; //$NON-NLS-1$
-    /** Default color resource folder name, i.e. "color" */
-    public final static String FD_RES_COLOR = "color"; //$NON-NLS-1$
-    /** Default drawable resource folder name, i.e. "drawable" */
-    public final static String FD_RES_DRAWABLE = "drawable"; //$NON-NLS-1$
-    /** Default interpolator resource folder name, i.e. "interpolator" */
-    public final static String FD_RES_INTERPOLATOR = "interpolator"; //$NON-NLS-1$
-    /** Default layout resource folder name, i.e. "layout" */
-    public final static String FD_RES_LAYOUT = "layout"; //$NON-NLS-1$
-    /** Default menu resource folder name, i.e. "menu" */
-    public final static String FD_RES_MENU = "menu"; //$NON-NLS-1$
-    /** Default menu resource folder name, i.e. "mipmap" */
-    public final static String FD_RES_MIPMAP = "mipmap"; //$NON-NLS-1$
-    /** Default values resource folder name, i.e. "values" */
-    public final static String FD_RES_VALUES = "values"; //$NON-NLS-1$
-    /** Default xml resource folder name, i.e. "xml" */
-    public final static String FD_RES_XML = "xml"; //$NON-NLS-1$
-    /** Default raw resource folder name, i.e. "raw" */
-    public final static String FD_RES_RAW = "raw"; //$NON-NLS-1$
-
-    /** Separator between the resource folder qualifier. */
-    public final static String RES_QUALIFIER_SEP = "-"; //$NON-NLS-1$
-
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/ResourceEnum.java b/layoutlib_api/src/main/java/com/android/resources/ResourceEnum.java
deleted file mode 100644
index 7f4e16a..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/ResourceEnum.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * An enum representing a resource qualifier value.
- */
-public interface ResourceEnum {
-
-    /**
-     * Returns the resource string. This is to be used in resource folder names.
-     */
-    String getResourceValue();
-
-    /**
-     * Whether the value actually used on device. This returns true only if a device can report
-     * this value, false if it's just used to qualify resources.
-     */
-    boolean isValidValueForDevice();
-
-    /**
-     * Whether the value is neither used for device nor resources. This returns false when
-     * the value is only used for internal usage in the custom editors.
-     */
-    boolean isFakeValue();
-
-    /**
-     * Returns a short string for display value. The string does not need to show the context.
-     * <p/>For instance "exposed", which can be the value for the keyboard state or the navigation
-     * state, would be valid since something else in the UI is expected to show if this is about the
-     * keyboard or the navigation state.
-     *
-     * @see #getLongDisplayValue()
-     */
-    String getShortDisplayValue();
-
-    /**
-     * Returns a long string for display value. This must not only include the enum value but
-     * context (qualifier) about what the value represents.
-     * <p/>For instance "Exposed keyboard", and "Export navigation", as "exposed" would not be
-     * enough to know what qualifier the value is about.
-     *
-     * @see #getShortDisplayValue()
-     */
-    String getLongDisplayValue();
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/ResourceFolderType.java b/layoutlib_api/src/main/java/com/android/resources/ResourceFolderType.java
deleted file mode 100644
index 5a271cf..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/ResourceFolderType.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * Enum representing a type of resource folder.
- */
-public enum ResourceFolderType {
-    ANIM(ResourceConstants.FD_RES_ANIM),
-    ANIMATOR(ResourceConstants.FD_RES_ANIMATOR),
-    COLOR(ResourceConstants.FD_RES_COLOR),
-    DRAWABLE(ResourceConstants.FD_RES_DRAWABLE),
-    INTERPOLATOR(ResourceConstants.FD_RES_INTERPOLATOR),
-    LAYOUT(ResourceConstants.FD_RES_LAYOUT),
-    MENU(ResourceConstants.FD_RES_MENU),
-    MIPMAP(ResourceConstants.FD_RES_MIPMAP),
-    RAW(ResourceConstants.FD_RES_RAW),
-    VALUES(ResourceConstants.FD_RES_VALUES),
-    XML(ResourceConstants.FD_RES_XML);
-
-    private final String mName;
-
-    ResourceFolderType(String name) {
-        mName = name;
-    }
-
-    /**
-     * Returns the folder name for this resource folder type.
-     */
-    public String getName() {
-        return mName;
-    }
-
-    /**
-     * Returns the enum by name.
-     * @param name The enum string value.
-     * @return the enum or null if not found.
-     */
-    public static ResourceFolderType getTypeByName(String name) {
-        assert name.indexOf('-') == -1 : name; // use #getFolderType instead
-        for (ResourceFolderType rType : values()) {
-            if (rType.mName.equals(name)) {
-                return rType;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the {@link ResourceFolderType} from the folder name
-     * @param folderName The name of the folder. This must be a valid folder name in the format
-     * <code>resType[-resqualifiers[-resqualifiers[...]]</code>
-     * @return the <code>ResourceFolderType</code> representing the type of the folder, or
-     * <code>null</code> if no matching type was found.
-     */
-    public static ResourceFolderType getFolderType(String folderName) {
-        int index = folderName.indexOf(ResourceConstants.RES_QUALIFIER_SEP);
-        if (index != -1) {
-            folderName = folderName.substring(0, index);
-        }
-        return getTypeByName(folderName);
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/ResourceType.java b/layoutlib_api/src/main/java/com/android/resources/ResourceType.java
deleted file mode 100644
index e9d4d53..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/ResourceType.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-
-/**
- * Enum representing a type of compiled resource.
- */
-public enum ResourceType {
-    ANIM("anim", "Animation"), //$NON-NLS-1$
-    ANIMATOR("animator", "Animator"), //$NON-NLS-1$
-    ARRAY("array", "Array", "string-array", "integer-array"), //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-4$
-    ATTR("attr", "Attr"), //$NON-NLS-1$
-    BOOL("bool", "Boolean"), //$NON-NLS-1$
-    COLOR("color", "Color"), //$NON-NLS-1$
-    DECLARE_STYLEABLE("declare-styleable", "Declare Stylable"), //$NON-NLS-1$
-    DIMEN("dimen", "Dimension"), //$NON-NLS-1$
-    DRAWABLE("drawable", "Drawable"), //$NON-NLS-1$
-    FRACTION("fraction", "Fraction"), //$NON-NLS-1$
-    ID("id", "ID"), //$NON-NLS-1$
-    INTEGER("integer", "Integer"), //$NON-NLS-1$
-    INTERPOLATOR("interpolator", "Interpolator"), //$NON-NLS-1$
-    LAYOUT("layout", "Layout"), //$NON-NLS-1$
-    MENU("menu", "Menu"), //$NON-NLS-1$
-    MIPMAP("mipmap", "Mip Map"), //$NON-NLS-1$
-    PLURALS("plurals", "Plurals"), //$NON-NLS-1$
-    RAW("raw", "Raw"), //$NON-NLS-1$
-    STRING("string", "String"), //$NON-NLS-1$
-    STYLE("style", "Style"), //$NON-NLS-1$
-    STYLEABLE("styleable", "Styleable"), //$NON-NLS-1$
-    XML("xml", "XML"), //$NON-NLS-1$
-    // this is not actually used. Only there because they get parsed and since we want to
-    // detect new resource type, we need to have this one exist.
-    PUBLIC("public", "###"); //$NON-NLS-1$ //$NON-NLS-2$
-
-    private final String mName;
-    private final String mDisplayName;
-    private final String[] mAlternateXmlNames;
-
-    ResourceType(String name, String displayName, String... alternateXmlNames) {
-        mName = name;
-        mDisplayName = displayName;
-        mAlternateXmlNames = alternateXmlNames;
-    }
-
-    /**
-     * Returns the resource type name, as used by XML files.
-     */
-    public String getName() {
-        return mName;
-    }
-
-    /**
-     * Returns a translated display name for the resource type.
-     */
-    public String getDisplayName() {
-        return mDisplayName;
-    }
-
-    /**
-     * Returns the enum by its name as it appears in the XML or the R class.
-     * @param name name of the resource
-     * @return the matching {@link ResourceType} or <code>null</code> if no match was found.
-     */
-    public static ResourceType getEnum(String name) {
-        for (ResourceType rType : values()) {
-            if (rType.mName.equals(name)) {
-                return rType;
-            } else if (rType.mAlternateXmlNames != null) {
-                // if there are alternate Xml Names, we test those too
-                for (String alternate : rType.mAlternateXmlNames) {
-                    if (alternate.equals(name)) {
-                        return rType;
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns an array with all the names defined by this enum.
-     */
-    public static String[] getNames() {
-        ResourceType[] values = values();
-        String[] names = new String[values.length];
-        for (int i = values.length - 1; i >= 0; --i) {
-            names[i] = values[i].getName();
-        }
-        return names;
-    }
-
-    @Override
-    public String toString() {
-        return getName();
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/ScreenOrientation.java b/layoutlib_api/src/main/java/com/android/resources/ScreenOrientation.java
deleted file mode 100644
index b18753d..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/ScreenOrientation.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * Screen Orientation enum.
- * <p/>This is used in the manifest in the uses-configuration node and in the resource folder names.
- */
-public enum ScreenOrientation implements ResourceEnum {
-    PORTRAIT("port", "Portrait", "Portrait Orientation"), //$NON-NLS-1$
-    LANDSCAPE("land", "Landscape", "Landscape Orientation"), //$NON-NLS-1$
-    SQUARE("square", "Square", "Square Orientation"); //$NON-NLS-1$
-
-    private final String mValue;
-    private final String mShortDisplayValue;
-    private final String mLongDisplayValue;
-
-    private ScreenOrientation(String value, String shortDisplayValue, String longDisplayValue) {
-        mValue = value;
-        mShortDisplayValue = shortDisplayValue;
-        mLongDisplayValue = longDisplayValue;
-    }
-
-    /**
-     * Returns the enum for matching the provided qualifier value.
-     * @param value The qualifier value.
-     * @return the enum for the qualifier value or null if no matching was found.
-     */
-    public static ScreenOrientation getEnum(String value) {
-        for (ScreenOrientation orient : values()) {
-            if (orient.mValue.equals(value)) {
-                return orient;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getResourceValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        return mShortDisplayValue;
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return mLongDisplayValue;
-    }
-
-    public static int getIndex(ScreenOrientation orientation) {
-        int i = 0;
-        for (ScreenOrientation orient : values()) {
-            if (orient == orientation) {
-                return i;
-            }
-
-            i++;
-        }
-
-        return -1;
-    }
-
-    public static ScreenOrientation getByIndex(int index) {
-        int i = 0;
-        for (ScreenOrientation orient : values()) {
-            if (i == index) {
-                return orient;
-            }
-            i++;
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean isFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValidValueForDevice() {
-        return true;
-    }
-
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/ScreenRatio.java b/layoutlib_api/src/main/java/com/android/resources/ScreenRatio.java
deleted file mode 100644
index bb575b0..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/ScreenRatio.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * Screen Ratio enum.
- * <p/>This is used in the manifest in the uses-configuration node and in the resource folder names.
- */
-public enum ScreenRatio implements ResourceEnum {
-    NOTLONG("notlong", "Not Long", "Short screen aspect ratio"), //$NON-NLS-1$
-    LONG("long", "Long", "Long screen aspect ratio"); //$NON-NLS-1$
-
-    private final String mValue;
-    private final String mShortDisplayValue;
-    private final String mLongDisplayValue;
-
-    private ScreenRatio(String value, String displayValue, String longDisplayValue) {
-        mValue = value;
-        mShortDisplayValue = displayValue;
-        mLongDisplayValue = longDisplayValue;
-    }
-
-    /**
-     * Returns the enum for matching the provided qualifier value.
-     * @param value The qualifier value.
-     * @return the enum for the qualifier value or null if no matching was found.
-     */
-    public static ScreenRatio getEnum(String value) {
-        for (ScreenRatio orient : values()) {
-            if (orient.mValue.equals(value)) {
-                return orient;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getResourceValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        return mShortDisplayValue;
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return mLongDisplayValue;
-    }
-
-    public static int getIndex(ScreenRatio orientation) {
-        int i = 0;
-        for (ScreenRatio orient : values()) {
-            if (orient == orientation) {
-                return i;
-            }
-
-            i++;
-        }
-
-        return -1;
-    }
-
-    public static ScreenRatio getByIndex(int index) {
-        int i = 0;
-        for (ScreenRatio orient : values()) {
-            if (i == index) {
-                return orient;
-            }
-            i++;
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean isFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValidValueForDevice() {
-        return true;
-    }
-
-}
-
diff --git a/layoutlib_api/src/main/java/com/android/resources/ScreenSize.java b/layoutlib_api/src/main/java/com/android/resources/ScreenSize.java
deleted file mode 100644
index 4def540..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/ScreenSize.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * Screen size enum.
- * <p/>This is used in the manifest in the uses-configuration node and in the resource folder names.
- */
-public enum ScreenSize implements ResourceEnum {
-    SMALL("small", "Small", "Small Screen"), //$NON-NLS-1$
-    NORMAL("normal", "Normal", "Normal Screen"), //$NON-NLS-1$
-    LARGE("large", "Large", "Large Screen"), //$NON-NLS-1$
-    XLARGE("xlarge", "X-Large", "Extra Large Screen"); //$NON-NLS-1$
-
-    private final String mValue;
-    private final String mShortDisplayValue;
-    private final String mLongDisplayValue;
-
-    private ScreenSize(String value, String shortDisplayValue, String longDisplayValue) {
-        mValue = value;
-        mShortDisplayValue = shortDisplayValue;
-        mLongDisplayValue = longDisplayValue;
-    }
-
-    /**
-     * Returns the enum for matching the provided qualifier value.
-     * @param value The qualifier value.
-     * @return the enum for the qualifier value or null if no matching was found.
-     */
-    public static ScreenSize getEnum(String value) {
-        for (ScreenSize orient : values()) {
-            if (orient.mValue.equals(value)) {
-                return orient;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getResourceValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        return mShortDisplayValue;
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return mLongDisplayValue;
-    }
-
-    public static int getIndex(ScreenSize orientation) {
-        int i = 0;
-        for (ScreenSize orient : values()) {
-            if (orient == orientation) {
-                return i;
-            }
-
-            i++;
-        }
-
-        return -1;
-    }
-
-    public static ScreenSize getByIndex(int index) {
-        int i = 0;
-        for (ScreenSize orient : values()) {
-            if (i == index) {
-                return orient;
-            }
-            i++;
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean isFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValidValueForDevice() {
-        return true;
-    }
-
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/TouchScreen.java b/layoutlib_api/src/main/java/com/android/resources/TouchScreen.java
deleted file mode 100644
index 7eeeb08..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/TouchScreen.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * Touch screen enum.
- * <p/>This is used in the manifest in the uses-configuration node and in the resource folder names.
- */
-public enum TouchScreen implements ResourceEnum {
-    NOTOUCH("notouch", "No Touch", "No-touch screen"), //$NON-NLS-1$
-    STYLUS("stylus", "Stylus", "Stylus-based touchscreen"), //$NON-NLS-1$
-    FINGER("finger", "Finger", "Finger-based touchscreen"); //$NON-NLS-1$
-
-    private final String mValue;
-    private final String mShortDisplayValue;
-    private final String mLongDisplayValue;
-
-    private TouchScreen(String value, String displayValue, String longDisplayValue) {
-        mValue = value;
-        mShortDisplayValue = displayValue;
-        mLongDisplayValue = longDisplayValue;
-    }
-
-    /**
-     * Returns the enum for matching the provided qualifier value.
-     * @param value The qualifier value.
-     * @return the enum for the qualifier value or null if no matching was found.
-     */
-    public static TouchScreen getEnum(String value) {
-        for (TouchScreen orient : values()) {
-            if (orient.mValue.equals(value)) {
-                return orient;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getResourceValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        return mShortDisplayValue;
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return mLongDisplayValue;
-    }
-
-    public static int getIndex(TouchScreen touch) {
-        int i = 0;
-        for (TouchScreen t : values()) {
-            if (t == touch) {
-                return i;
-            }
-
-            i++;
-        }
-
-        return -1;
-    }
-
-    public static TouchScreen getByIndex(int index) {
-        int i = 0;
-        for (TouchScreen value : values()) {
-            if (i == index) {
-                return value;
-            }
-            i++;
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean isFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValidValueForDevice() {
-        return true;
-    }
-
-}
diff --git a/layoutlib_api/src/main/java/com/android/resources/UiMode.java b/layoutlib_api/src/main/java/com/android/resources/UiMode.java
deleted file mode 100644
index d1ddbc8..0000000
--- a/layoutlib_api/src/main/java/com/android/resources/UiMode.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-/**
- * UI Mode enum.
- * <p/>This is used in the resource folder names.
- */
-public enum UiMode implements ResourceEnum {
-    NORMAL("", "Normal"),
-    CAR("car", "Car Dock"),
-    DESK("desk", "Desk Dock"),
-    TELEVISION("television", "Television");
-
-    private final String mValue;
-    private final String mDisplayValue;
-
-    private UiMode(String value, String display) {
-        mValue = value;
-        mDisplayValue = display;
-    }
-
-    /**
-     * Returns the enum for matching the provided qualifier value.
-     * @param value The qualifier value.
-     * @return the enum for the qualifier value or null if no matching was found.
-     */
-    public static UiMode getEnum(String value) {
-        for (UiMode mode : values()) {
-            if (mode.mValue.equals(value)) {
-                return mode;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getResourceValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        return mDisplayValue;
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return mDisplayValue;
-    }
-
-    public static int getIndex(UiMode value) {
-        int i = 0;
-        for (UiMode mode : values()) {
-            if (mode == value) {
-                return i;
-            }
-
-            i++;
-        }
-
-        return -1;
-    }
-
-    public static UiMode getByIndex(int index) {
-        int i = 0;
-        for (UiMode value : values()) {
-            if (i == index) {
-                return value;
-            }
-            i++;
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isFakeValue() {
-        return this == NORMAL; // NORMAL is not a real enum. it's used for internal state only.
-    }
-
-    @Override
-    public boolean isValidValueForDevice() {
-        return this != NORMAL;
-    }
-}
diff --git a/layoutlib_api/src/main/java/com/android/util/Pair.java b/layoutlib_api/src/main/java/com/android/util/Pair.java
deleted file mode 100644
index 7e797e0..0000000
--- a/layoutlib_api/src/main/java/com/android/util/Pair.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.util;
-
-/**
- * A Pair class is simply a 2-tuple for use in this package. We might want to
- * think about adding something like this to a more central utility place, or
- * replace it by a common tuple class if one exists, or even rewrite the layout
- * classes using this Pair by a more dedicated data structure (so we don't have
- * to pass around generic signatures as is currently done, though at least the
- * construction is helped a bit by the {@link #of} factory method.
- *
- * =================================================================================================
- * WARNING
- * This copy of the class is to be used only by layoutlib and is not to be changed, EVER.
- * To use Pair outside of layoutlib, use com.android.utils.Pair, found in common.jar instead.
- * =================================================================================================
- *
- * @param <S> The type of the first value
- * @param <T> The type of the second value
- *
- * @deprecated This is used for backward compatibility with layoutlib_api. Use com.android.utils.Pair instead
- */
-@Deprecated
-public class Pair<S,T> {
-    private final S mFirst;
-    private final T mSecond;
-
-    // Use {@link Pair#of} factory instead since it infers generic types
-    private Pair(S first, T second) {
-        this.mFirst = first;
-        this.mSecond = second;
-    }
-
-    /**
-     * Return the first item in the pair
-     *
-     * @return the first item in the pair
-     */
-    public S getFirst() {
-        return mFirst;
-    }
-
-    /**
-     * Return the second item in the pair
-     *
-     * @return the second item in the pair
-     */
-    public T getSecond() {
-        return mSecond;
-    }
-
-    /**
-     * Constructs a new pair of the given two objects, inferring generic types.
-     *
-     * @param first the first item to store in the pair
-     * @param second the second item to store in the pair
-     * @param <S> the type of the first item
-     * @param <T> the type of the second item
-     * @return a new pair wrapping the two items
-     */
-    public static <S,T> Pair<S,T> of(S first, T second) {
-        return new Pair<S,T>(first,second);
-    }
-
-    @Override
-    public String toString() {
-        return "Pair [first=" + mFirst + ", second=" + mSecond + "]";
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((mFirst == null) ? 0 : mFirst.hashCode());
-        result = prime * result + ((mSecond == null) ? 0 : mSecond.hashCode());
-        return result;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        Pair other = (Pair) obj;
-        if (mFirst == null) {
-            if (other.mFirst != null)
-                return false;
-        } else if (!mFirst.equals(other.mFirst))
-            return false;
-        if (mSecond == null) {
-            if (other.mSecond != null)
-                return false;
-        } else if (!mSecond.equals(other.mSecond))
-            return false;
-        return true;
-    }
-}
diff --git a/layoutlib_api/src/test/.classpath b/layoutlib_api/src/test/.classpath
deleted file mode 100644
index 7564f2f..0000000
--- a/layoutlib_api/src/test/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/common"/>
-        <classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/guava-tools/guava-13.0.1.jar" sourcepath="/ANDROID_SRC/prebuilts/tools/common/guava-tools/src.zip"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/layoutlib_api/src/test/.project b/layoutlib_api/src/test/.project
deleted file mode 100644
index 9f550a3..0000000
--- a/layoutlib_api/src/test/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>common-tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/layoutlib_api/src/test/java/com/android/resources/FolderTypeRelationShipTest.java b/layoutlib_api/src/test/java/com/android/resources/FolderTypeRelationShipTest.java
deleted file mode 100644
index 809eae7..0000000
--- a/layoutlib_api/src/test/java/com/android/resources/FolderTypeRelationShipTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-import com.android.resources.FolderTypeRelationship;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-
-import junit.framework.TestCase;
-
-public class FolderTypeRelationShipTest extends TestCase {
-
-    public void testResourceType() {
-        // all resource type should be in the FolderTypeRelationShip map.
-        // loop on all the enum, and make sure there's at least one folder type for it.
-        for (ResourceType type : ResourceType.values()) {
-            assertTrue(type.getDisplayName(),
-                    FolderTypeRelationship.getRelatedFolders(type).size() > 0);
-        }
-    }
-
-    public void testResourceFolderType() {
-        // all resource folder type should generate at least one type of resource.
-        // loop on all the enum, and make sure there's at least one res type for it.
-        for (ResourceFolderType type : ResourceFolderType.values()) {
-            assertTrue(type.getName(),
-                    FolderTypeRelationship.getRelatedResourceTypes(type).size() > 0);
-        }
-    }
-}
diff --git a/layoutlib_api/src/test/java/com/android/resources/ResourceFolderTypeTest.java b/layoutlib_api/src/test/java/com/android/resources/ResourceFolderTypeTest.java
deleted file mode 100644
index a3c2c51..0000000
--- a/layoutlib_api/src/test/java/com/android/resources/ResourceFolderTypeTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed 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 com.android.resources;
-
-import junit.framework.TestCase;
-
-public class ResourceFolderTypeTest extends TestCase {
-  public void test() {
-    assertEquals(ResourceFolderType.LAYOUT, ResourceFolderType.getFolderType("layout"));
-    assertEquals(ResourceFolderType.LAYOUT, ResourceFolderType.getFolderType("layout-port"));
-    assertEquals(ResourceFolderType.LAYOUT, ResourceFolderType.getFolderType("layout-port-sw600"));
-    assertEquals(ResourceFolderType.VALUES, ResourceFolderType.getFolderType("values"));
-
-    assertNull(ResourceFolderType.getFolderType(""));
-    assertNull(ResourceFolderType.getFolderType("foo"));
-  }
-}
diff --git a/lint/cli/Android.mk b/lint/cli/Android.mk
index dcd1792..00c736b 100644
--- a/lint/cli/Android.mk
+++ b/lint/cli/Android.mk
@@ -1,14 +1,26 @@
 # Copyright 2011 The Android Open Source Project
 #
+# Licensed 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.
+#
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_JAVA_RESOURCE_DIRS := src/main/java
+# The lint code has moved to tools/base/lint.
+# The rule below uses the prebuilt lint.jar.
+#
+# If you want to run the tests, cd to tools/base/lint
+# and run ./gradlew :lint:test
 
-LOCAL_JAR_MANIFEST := etc/manifest.txt
-
-# If the dependency list is changed, etc/manifest.txt
 LOCAL_JAVA_LIBRARIES := \
 	common \
 	sdklib \
@@ -23,21 +35,8 @@
 LOCAL_MODULE := lint
 LOCAL_MODULE_TAGS := optional
 
-include $(BUILD_HOST_JAVA_LIBRARY)
+LOCAL_PREBUILT_JAVA_LIBRARIES := \
+	../../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
 
+include $(BUILD_HOST_PREBUILT)
 
-# Build all sub-directories
-include $(call all-makefiles-under,$(LOCAL_PATH))
-
-# Build tests
-include $(CLEAR_VARS)
-
-# Only compile source java files in this lib.
-LOCAL_SRC_FILES := $(call all-java-files-under, src/test/java)
-
-LOCAL_MODULE := lint_checks-tests
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_JAVA_LIBRARIES := common sdklib lint_api lint_checks lint junit easymock asm-tools asm-tree-tools guava-tools layoutlib_api sdktestutils
-
-include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/ApiDetectorTest.java b/lint/cli/src/test/java/com/android/tools/lint/checks/ApiDetectorTest.java
index 1d8cdc8..947d27b 100644
--- a/lint/cli/src/test/java/com/android/tools/lint/checks/ApiDetectorTest.java
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/ApiDetectorTest.java
@@ -60,6 +60,19 @@
                 ));
     }
 
+    public void testAttrWithoutSlash() throws Exception {
+        assertEquals(""
+                + "res/layout/divider.xml:7: Error: ?android:dividerHorizontal requires API level 11 (current min is 1) [NewApi]\n"
+                + "    android:divider=\"?android:dividerHorizontal\"\n"
+                + "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+                + "1 errors, 0 warnings\n",
+
+                lintProject(
+                        "apicheck/minsdk1.xml=>AndroidManifest.xml",
+                        "apicheck/divider.xml=>res/layout/divider.xml"
+                ));
+    }
+
     public void testXmlApi14() throws Exception {
         assertEquals(
                 "No warnings.",
@@ -861,4 +874,27 @@
                         "apicheck/ApiSourceCheck2.class.data=>bin/classes/test/pkg/ApiSourceCheck2.class"
                 ));
     }
+
+    public void testInheritCompatLibrary() throws Exception {
+        assertEquals(""
+                + "src/test/pkg/MyActivityImpl.java:8: Error: Call requires API level 11 (current min is 1): android.app.Activity#isChangingConfigurations [NewApi]\n"
+                + "  boolean isChanging = super.isChangingConfigurations();\n"
+                + "                             ~~~~~~~~~~~~~~~~~~~~~~~~\n"
+                + "src/test/pkg/MyActivityImpl.java:13: Error: Call requires API level 11 (current min is 1): android.app.Activity#isChangingConfigurations [NewApi]\n"
+                + "  return super.isChangingConfigurations();\n"
+                + "               ~~~~~~~~~~~~~~~~~~~~~~~~\n"
+                + "src/test/pkg/MyActivityImpl.java:12: Error: This method is not overriding anything with the current build target, but will in API level 11 (current target is 3): test.pkg.MyActivityImpl#isChangingConfigurations [Override]\n"
+                + " public boolean isChangingConfigurations() {\n"
+                + "                ~~~~~~~~~~~~~~~~~~~~~~~~\n"
+                + "3 errors, 0 warnings\n",
+
+                lintProject(
+                        "apicheck/classpath=>.classpath",
+                        "apicheck/minsdk1.xml=>AndroidManifest.xml",
+                        "project.properties1=>project.properties",
+                        "apicheck/MyActivityImpl.java.txt=>src/test/pkg/MyActivityImpl.java",
+                        "apicheck/MyActivityImpl.class.data=>bin/classes/test/pkg/MyActivityImpl.class",
+                        "apicheck/android-support-v4.jar.data=>libs/android-support-v4.jar"
+                ));
+    }
 }
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/ManifestTypoDetectorTest.java b/lint/cli/src/test/java/com/android/tools/lint/checks/ManifestTypoDetectorTest.java
new file mode 100644
index 0000000..f0ce60d
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/ManifestTypoDetectorTest.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed 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 com.android.tools.lint.checks;
+
+import com.android.annotations.NonNull;
+import com.android.tools.lint.client.api.LintClient;
+import com.android.tools.lint.detector.api.Detector;
+import com.android.tools.lint.detector.api.Issue;
+import com.android.tools.lint.detector.api.Project;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+@SuppressWarnings("javadoc")
+public class ManifestTypoDetectorTest extends AbstractCheckTest {
+    @Override
+    protected Detector getDetector() {
+        return new ManifestTypoDetector();
+    }
+
+    private Set<Issue> mEnabled = new HashSet<Issue>();
+
+    @Override
+    protected TestConfiguration getConfiguration(LintClient client, Project project) {
+        return new TestConfiguration(client, project, null) {
+            @Override
+            public boolean isEnabled(@NonNull Issue issue) {
+                return super.isEnabled(issue) && mEnabled.contains(issue);
+            }
+        };
+    }
+
+    public void testOk() throws Exception {
+        mEnabled = Collections.singleton(ManifestTypoDetector.ISSUE);
+        assertEquals(
+                "No warnings.",
+                lintProject(
+                        "typo_not_found.xml=>AndroidManifest.xml",
+                        "res/values/strings.xml"));
+    }
+
+    public void testTypoUsesSdk() throws Exception {
+        mEnabled = Collections.singleton(ManifestTypoDetector.ISSUE);
+        assertEquals(
+            "AndroidManifest.xml:7: " +
+            "Warning: <use-sdk> looks like a typo; did you mean <uses-sdk> ? [ManifestTypos]\n" +
+            "    <use-sdk android:minSdkVersion=\"14\" />\n" +
+            "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+            "0 errors, 1 warnings\n" +
+            "",
+
+            lintProject(
+                    "typo_uses_sdk.xml=>AndroidManifest.xml",
+                    "res/values/strings.xml"));
+    }
+
+    public void testTypoUsesSdk2() throws Exception {
+        mEnabled = Collections.singleton(ManifestTypoDetector.ISSUE);
+        assertEquals(
+            "AndroidManifest.xml:7: " +
+            "Warning: <user-sdk> looks like a typo; did you mean <uses-sdk> ? [ManifestTypos]\n" +
+            "    <user-sdk android:minSdkVersion=\"14\" />\n" +
+            "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+            "0 errors, 1 warnings\n" +
+            "",
+
+            lintProject(
+                    "typo_uses_sdk2.xml=>AndroidManifest.xml",
+                    "res/values/strings.xml"));
+    }
+
+    public void testTypoUsesPermission() throws Exception {
+        mEnabled = Collections.singleton(ManifestTypoDetector.ISSUE);
+        assertEquals(
+            "AndroidManifest.xml:9: " +
+            "Warning: <use-permission> looks like a typo; " +
+            "did you mean <uses-permission> ? [ManifestTypos]\n" +
+            "    <use-permission android:name=\"com.example.helloworld.permission\" />\n" +
+            "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+            "0 errors, 1 warnings\n" +
+            "",
+
+            lintProject(
+                    "typo_uses_permission.xml=>AndroidManifest.xml",
+                    "res/values/strings.xml"));
+    }
+
+    public void testTypoUsesPermission2() throws Exception {
+        mEnabled = Collections.singleton(ManifestTypoDetector.ISSUE);
+        assertEquals(
+            "AndroidManifest.xml:9: " +
+            "Warning: <user-permission> looks like a typo; " +
+            "did you mean <uses-permission> ? [ManifestTypos]\n" +
+            "    <user-permission android:name=\"com.example.helloworld.permission\" />\n" +
+            "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+            "0 errors, 1 warnings\n" +
+            "",
+
+            lintProject(
+                    "typo_uses_permission2.xml=>AndroidManifest.xml",
+                    "res/values/strings.xml"));
+    }
+
+    public void testTypoUsesFeature() throws Exception {
+        mEnabled = Collections.singleton(ManifestTypoDetector.ISSUE);
+        assertEquals(
+            "AndroidManifest.xml:11: " +
+            "Warning: <use-feature> looks like a typo; " +
+            "did you mean <uses-feature> ? [ManifestTypos]\n" +
+            "    <use-feature android:name=\"android.hardware.wifi\" />\n" +
+            "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+            "0 errors, 1 warnings\n" +
+            "",
+
+            lintProject(
+                    "typo_uses_feature.xml=>AndroidManifest.xml",
+                    "res/values/strings.xml"));
+    }
+
+    public void testTypoUsesFeature2() throws Exception {
+        mEnabled = Collections.singleton(ManifestTypoDetector.ISSUE);
+        assertEquals(
+            "AndroidManifest.xml:11: " +
+            "Warning: <user-feature> looks like a typo; " +
+            "did you mean <uses-feature> ? [ManifestTypos]\n" +
+            "    <user-feature android:name=\"android.hardware.wifi\" />\n" +
+            "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+            "0 errors, 1 warnings\n" +
+            "",
+
+            lintProject(
+                    "typo_uses_feature2.xml=>AndroidManifest.xml",
+                    "res/values/strings.xml"));
+    }
+
+    public void testTypoUsesLibrary() throws Exception {
+        mEnabled = Collections.singleton(ManifestTypoDetector.ISSUE);
+        assertEquals(
+            "AndroidManifest.xml:16: " +
+            "Warning: <use-library> looks like a typo; " +
+            "did you mean <uses-library> ? [ManifestTypos]\n" +
+            "    <use-library android:name=\"com.example.helloworld\" />\n" +
+            "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+            "0 errors, 1 warnings\n" +
+            "",
+
+            lintProject(
+                    "typo_uses_library.xml=>AndroidManifest.xml",
+                    "res/values/strings.xml"));
+    }
+
+    public void testTypoUsesLibrary2() throws Exception {
+        mEnabled = Collections.singleton(ManifestTypoDetector.ISSUE);
+        assertEquals(
+            "AndroidManifest.xml:16: " +
+            "Warning: <user-library> looks like a typo; " +
+            "did you mean <uses-library> ? [ManifestTypos]\n" +
+            "    <user-library android:name=\"com.example.helloworld\" />\n" +
+            "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+            "0 errors, 1 warnings\n" +
+            "",
+
+            lintProject(
+                    "typo_uses_library2.xml=>AndroidManifest.xml",
+                    "res/values/strings.xml"));
+    }
+}
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/TranslationDetectorTest.java b/lint/cli/src/test/java/com/android/tools/lint/checks/TranslationDetectorTest.java
index f13cff1..ee1a2f2 100644
--- a/lint/cli/src/test/java/com/android/tools/lint/checks/TranslationDetectorTest.java
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/TranslationDetectorTest.java
@@ -209,4 +209,15 @@
                  "res/values-es/strings_locale.xml=>res/values/strings.xml",
                  "res/values-es-rUS/strings.xml"));
     }
+
+    public void testAnalytics() throws Exception {
+        // See http://code.google.com/p/android/issues/detail?id=43070
+        assertEquals(
+                "No warnings.",
+
+                lintProject(
+                        "res/values/analytics.xml",
+                        "res/values-es/donottranslate.xml" // to make app multilingual
+                ));
+    }
 }
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/ViewConstructorDetectorTest.java b/lint/cli/src/test/java/com/android/tools/lint/checks/ViewConstructorDetectorTest.java
index 5517646..a84a74f 100644
--- a/lint/cli/src/test/java/com/android/tools/lint/checks/ViewConstructorDetectorTest.java
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/ViewConstructorDetectorTest.java
@@ -61,4 +61,16 @@
                         "bin/classes/test/pkg/Intermediate$IntermediateCustomV.class"
                 ));
     }
+
+    public void testAbstract() throws Exception {
+        assertEquals(
+                "No warnings.",
+
+                lintProject(
+                        "bytecode/.classpath=>.classpath",
+                        "bytecode/AndroidManifest.xml=>AndroidManifest.xml",
+                        "bytecode/AbstractCustomView.java.txt=>src/test/bytecode/AbstractCustomView.java",
+                        "bytecode/AbstractCustomView.class.data=>bin/classes/test/bytecode/AbstractCustomView.class"
+                ));
+    }
 }
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/apicheck/MyActivityImpl.class.data b/lint/cli/src/test/java/com/android/tools/lint/checks/data/apicheck/MyActivityImpl.class.data
new file mode 100644
index 0000000..6ae6b28
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/apicheck/MyActivityImpl.class.data
Binary files differ
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/apicheck/MyActivityImpl.java.txt b/lint/cli/src/test/java/com/android/tools/lint/checks/data/apicheck/MyActivityImpl.java.txt
new file mode 100644
index 0000000..e39daf8
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/apicheck/MyActivityImpl.java.txt
@@ -0,0 +1,15 @@
+package test.pkg;
+
+import android.app.Activity;
+import android.support.v4.app.FragmentActivity;
+
+public class MyActivityImpl extends FragmentActivity {
+	public void test() {
+		boolean isChanging = super.isChangingConfigurations();
+	}
+
+	@Override
+	public boolean isChangingConfigurations() {
+		return super.isChangingConfigurations();
+	}
+}
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/apicheck/android-support-v4.jar.data b/lint/cli/src/test/java/com/android/tools/lint/checks/data/apicheck/android-support-v4.jar.data
new file mode 100644
index 0000000..6080877
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/apicheck/android-support-v4.jar.data
Binary files differ
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/apicheck/divider.xml b/lint/cli/src/test/java/com/android/tools/lint/checks/data/apicheck/divider.xml
new file mode 100644
index 0000000..4244319
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/apicheck/divider.xml
@@ -0,0 +1,37 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_marginLeft="16dp"
+    android:layout_marginRight="16dp"
+    android:divider="?android:dividerHorizontal"
+    android:orientation="horizontal"
+    android:showDividers="middle"
+    tools:context=".ItemListActivity" >
+
+    <!--
+    This layout is a two-pane layout for the Items
+    master/detail flow. See res/values-large/refs.xml and
+    res/values-sw600dp/refs.xml for an example of layout aliases
+    that replace the single-pane version of the layout with
+    this two-pane version.
+
+    For more on layout aliases, see:
+    http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+    -->
+
+    <fragment
+        android:id="@+id/item_list"
+        android:name="com.example.master.ItemListFragment"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        tools:layout="@android:layout/list_content" />
+
+    <FrameLayout
+        android:id="@+id/item_detail_container"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="3" />
+
+</LinearLayout>
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/AbstractCustomView.class.data b/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/AbstractCustomView.class.data
new file mode 100644
index 0000000..8dc3dc6
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/AbstractCustomView.class.data
Binary files differ
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/AbstractCustomView.java.txt b/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/AbstractCustomView.java.txt
new file mode 100644
index 0000000..aedbafd
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/AbstractCustomView.java.txt
@@ -0,0 +1,9 @@
+package test.pkg;
+
+import android.view.View;
+
+public abstract class AbstractCustomView extends View {
+    public AbstractCustomView() {
+        super(null);
+    }
+}
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_not_found.xml b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_not_found.xml
new file mode 100644
index 0000000..9cd3640
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_not_found.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="foo.bar2"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk android:minSdkVersion="14" />
+
+    <uses-permission android:name="com.example.helloworld.permission" />
+
+    <uses-feature android:name="android.hardware.wifi" />
+
+    <application
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name" >
+        <uses-library android:name="com.example.helloworld" />
+        <activity
+            android:label="@string/app_name"
+            android:name=".Foo2Activity" >
+            <intent-filter >
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_feature.xml b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_feature.xml
new file mode 100644
index 0000000..cff7f2e
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_feature.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="foo.bar2"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk android:minSdkVersion="14" />
+
+    <uses-permission android:name="com.example.helloworld.permission" />
+
+    <use-feature android:name="android.hardware.wifi" />
+
+    <application
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name" >
+        <uses-library android:name="com.example.helloworld" />
+        <activity
+            android:label="@string/app_name"
+            android:name=".Foo2Activity" >
+            <intent-filter >
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_feature2.xml b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_feature2.xml
new file mode 100644
index 0000000..d4d8f6e
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_feature2.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="foo.bar2"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk android:minSdkVersion="14" />
+
+    <uses-permission android:name="com.example.helloworld.permission" />
+
+    <user-feature android:name="android.hardware.wifi" />
+
+    <application
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name" >
+        <uses-library android:name="com.example.helloworld" />
+        <activity
+            android:label="@string/app_name"
+            android:name=".Foo2Activity" >
+            <intent-filter >
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_library.xml b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_library.xml
new file mode 100644
index 0000000..5273642
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_library.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="foo.bar2"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk android:minSdkVersion="14" />
+
+    <uses-permission android:name="com.example.helloworld.permission" />
+
+    <uses-feature android:name="android.hardware.wifi" />
+
+    <application
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name" >
+        <use-library android:name="com.example.helloworld" />
+        <activity
+            android:label="@string/app_name"
+            android:name=".Foo2Activity" >
+            <intent-filter >
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_library2.xml b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_library2.xml
new file mode 100644
index 0000000..966caf4
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_library2.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="foo.bar2"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk android:minSdkVersion="14" />
+
+    <uses-permission android:name="com.example.helloworld.permission" />
+
+    <uses-feature android:name="android.hardware.wifi" />
+
+    <application
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name" >
+        <user-library android:name="com.example.helloworld" />
+        <activity
+            android:label="@string/app_name"
+            android:name=".Foo2Activity" >
+            <intent-filter >
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_permission.xml b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_permission.xml
new file mode 100644
index 0000000..18a31ae
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_permission.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="foo.bar2"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk android:minSdkVersion="14" />
+
+    <use-permission android:name="com.example.helloworld.permission" />
+
+    <uses-feature android:name="android.hardware.wifi" />
+
+    <application
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name" >
+        <uses-library android:name="com.example.helloworld" />
+        <activity
+            android:label="@string/app_name"
+            android:name=".Foo2Activity" >
+            <intent-filter >
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_permission2.xml b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_permission2.xml
new file mode 100644
index 0000000..2f070c5
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_permission2.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="foo.bar2"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk android:minSdkVersion="14" />
+
+    <user-permission android:name="com.example.helloworld.permission" />
+
+    <uses-feature android:name="android.hardware.wifi" />
+
+    <application
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name" >
+        <uses-library android:name="com.example.helloworld" />
+        <activity
+            android:label="@string/app_name"
+            android:name=".Foo2Activity" >
+            <intent-filter >
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_sdk.xml b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_sdk.xml
new file mode 100644
index 0000000..c086515
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_sdk.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="foo.bar2"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <use-sdk android:minSdkVersion="14" />
+
+    <uses-permission android:name="com.example.helloworld.permission" />
+
+    <uses-feature android:name="android.hardware.wifi" />
+
+    <application
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name" >
+        <uses-library android:name="com.example.helloworld" />
+        <activity
+            android:label="@string/app_name"
+            android:name=".Foo2Activity" >
+            <intent-filter >
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_sdk2.xml b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_sdk2.xml
new file mode 100644
index 0000000..148a3fc
--- /dev/null
+++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/typo_uses_sdk2.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="foo.bar2"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <user-sdk android:minSdkVersion="14" />
+
+    <uses-permission android:name="com.example.helloworld.permission" />
+
+    <uses-feature android:name="android.hardware.wifi" />
+
+    <application
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name" >
+        <uses-library android:name="com.example.helloworld" />
+        <activity
+            android:label="@string/app_name"
+            android:name=".Foo2Activity" >
+            <intent-filter >
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/lint/libs/lint_api/Android.mk b/lint/libs/lint_api/Android.mk
index 1d70a25..3510559 100644
--- a/lint/libs/lint_api/Android.mk
+++ b/lint/libs/lint_api/Android.mk
@@ -13,12 +13,14 @@
 # limitations under the License.
 
 LOCAL_PATH := $(call my-dir)
-
 include $(CLEAR_VARS)
 
-# Only compile source java files in this lib.
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_JAVA_RESOURCE_DIRS := src/main/java
+# The lint_api code has moved to tools/base/lint_api.
+# The rule below uses the prebuilt lint_api.jar.
+#
+# If you want to run the tests, cd to tools/base/lint_api
+# and run ./gradlew :lint_api:test
+
 LOCAL_JAVA_LIBRARIES := \
 	lombok-ast-0.2 \
 	common \
@@ -31,7 +33,8 @@
 LOCAL_MODULE := lint_api
 LOCAL_MODULE_TAGS := optional
 
-include $(BUILD_HOST_JAVA_LIBRARY)
+LOCAL_PREBUILT_JAVA_LIBRARIES := \
+	../../../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
 
-# Build all sub-directories
-include $(call all-makefiles-under,$(LOCAL_PATH))
+include $(BUILD_HOST_PREBUILT)
+
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/AsmVisitor.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/AsmVisitor.java
deleted file mode 100644
index e8a4bb5..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/AsmVisitor.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.google.common.annotations.Beta;
-
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.InsnList;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Specialized visitor for running detectors on a class object model.
- * <p>
- * It operates in two phases:
- * <ol>
- *   <li> First, it computes a set of maps where it generates a map from each
- *        significant method name to a list of detectors to consult for that method
- *        name. The set of method names that a detector is interested in is provided
- *        by the detectors themselves.
- *   <li> Second, it iterates over the DOM a single time. For each method call it finds,
- *        it dispatches to any check that has registered interest in that method name.
- *   <li> Finally, it runs a full check on those class scanners that do not register
- *        specific method names to be checked. This is intended for those detectors
- *        that do custom work, not related specifically to method calls.
- * </ol>
- * It also notifies all the detectors before and after the document is processed
- * such that they can do pre- and post-processing.
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-class AsmVisitor {
-    /**
-     * Number of distinct node types specified in {@link AbstractInsnNode}. Sadly
-     * there isn't a max-constant there, so update this along with ASM library
-     * updates.
-     */
-    private static final int TYPE_COUNT = AbstractInsnNode.LINE + 1;
-    private final Map<String, List<ClassScanner>> mMethodNameToChecks =
-            new HashMap<String, List<ClassScanner>>();
-    private final Map<String, List<ClassScanner>> mMethodOwnerToChecks =
-            new HashMap<String, List<ClassScanner>>();
-    private final List<Detector> mFullClassChecks = new ArrayList<Detector>();
-
-    private final List<? extends Detector> mAllDetectors;
-    private List<ClassScanner>[] mNodeTypeDetectors;
-
-    // Really want this:
-    //<T extends List<Detector> & Detector.ClassScanner> ClassVisitor(T xmlDetectors) {
-    // but it makes client code tricky and ugly.
-    @SuppressWarnings("unchecked")
-    AsmVisitor(@NonNull LintClient client, @NonNull List<? extends Detector> classDetectors) {
-        mAllDetectors = classDetectors;
-
-        // TODO: Check appliesTo() for files, and find a quick way to enable/disable
-        // rules when running through a full project!
-        for (Detector detector : classDetectors) {
-            Detector.ClassScanner scanner = (Detector.ClassScanner) detector;
-
-            boolean checkFullClass = true;
-
-            Collection<String> names = scanner.getApplicableCallNames();
-            if (names != null) {
-                checkFullClass = false;
-                for (String element : names) {
-                    List<Detector.ClassScanner> list = mMethodNameToChecks.get(element);
-                    if (list == null) {
-                        list = new ArrayList<Detector.ClassScanner>();
-                        mMethodNameToChecks.put(element, list);
-                    }
-                    list.add(scanner);
-                }
-            }
-
-            Collection<String> owners = scanner.getApplicableCallOwners();
-            if (owners != null) {
-                checkFullClass = false;
-                for (String element : owners) {
-                    List<Detector.ClassScanner> list = mMethodOwnerToChecks.get(element);
-                    if (list == null) {
-                        list = new ArrayList<Detector.ClassScanner>();
-                        mMethodOwnerToChecks.put(element, list);
-                    }
-                    list.add(scanner);
-                }
-            }
-
-            int[] types = scanner.getApplicableAsmNodeTypes();
-            if (types != null) {
-                checkFullClass = false;
-                for (int type : types) {
-                    if (type < 0 || type >= TYPE_COUNT) {
-                        // Can't support this node type: looks like ASM wasn't updated correctly.
-                        client.log(null, "Out of range node type %1$d from detector %2$s",
-                                type, scanner);
-                        continue;
-                    }
-                    if (mNodeTypeDetectors == null) {
-                        mNodeTypeDetectors = new List[TYPE_COUNT];
-                    }
-                    List<ClassScanner> checks = mNodeTypeDetectors[type];
-                    if (checks == null) {
-                        checks = new ArrayList<ClassScanner>();
-                        mNodeTypeDetectors[type] = checks;
-                    }
-                    checks.add(scanner);
-                }
-            }
-
-            if (checkFullClass) {
-                mFullClassChecks.add(detector);
-            }
-        }
-    }
-
-    @SuppressWarnings("rawtypes") // ASM API uses raw types
-    void runClassDetectors(ClassContext context) {
-        ClassNode classNode = context.getClassNode();
-
-        for (Detector detector : mAllDetectors) {
-            detector.beforeCheckFile(context);
-        }
-
-        for (Detector detector : mFullClassChecks) {
-            Detector.ClassScanner scanner = (Detector.ClassScanner) detector;
-            scanner.checkClass(context, classNode);
-            detector.afterCheckFile(context);
-        }
-
-        if (!mMethodNameToChecks.isEmpty() || !mMethodOwnerToChecks.isEmpty() ||
-                mNodeTypeDetectors != null && mNodeTypeDetectors.length > 0) {
-            List methodList = classNode.methods;
-            for (Object m : methodList) {
-                MethodNode method = (MethodNode) m;
-                InsnList nodes = method.instructions;
-                for (int i = 0, n = nodes.size(); i < n; i++) {
-                    AbstractInsnNode instruction = nodes.get(i);
-                    int type = instruction.getType();
-                    if (type == AbstractInsnNode.METHOD_INSN) {
-                        MethodInsnNode call = (MethodInsnNode) instruction;
-
-                        String owner = call.owner;
-                        List<ClassScanner> scanners = mMethodOwnerToChecks.get(owner);
-                        if (scanners != null) {
-                            for (ClassScanner scanner : scanners) {
-                                scanner.checkCall(context, classNode, method, call);
-                            }
-                        }
-
-                        String name = call.name;
-                        scanners = mMethodNameToChecks.get(name);
-                        if (scanners != null) {
-                            for (ClassScanner scanner : scanners) {
-                                scanner.checkCall(context, classNode, method, call);
-                            }
-                        }
-                    }
-
-                    if (mNodeTypeDetectors != null && type < mNodeTypeDetectors.length) {
-                        List<ClassScanner> scanners = mNodeTypeDetectors[type];
-                        if (scanners != null) {
-                            for (ClassScanner scanner : scanners) {
-                                scanner.checkInstruction(context, classNode, method, instruction);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        for (Detector detector : mAllDetectors) {
-            detector.afterCheckFile(context);
-        }
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/CircularDependencyException.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/CircularDependencyException.java
deleted file mode 100644
index 337eb27..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/CircularDependencyException.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Project;
-import com.google.common.annotations.Beta;
-
-/**
- * Exception thrown when there is a circular dependency, such as a circular dependency
- * of library mProject references
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public class CircularDependencyException extends RuntimeException {
-    @Nullable
-    private Project mProject;
-
-    @Nullable
-    private Location mLocation;
-
-    CircularDependencyException(@NonNull String message) {
-        super(message);
-    }
-
-    /**
-     * Returns the associated project, if any
-     *
-     * @return the associated project, if any
-     */
-    @Nullable
-    public Project getProject() {
-        return mProject;
-    }
-
-    /**
-     * Sets the associated project, if any
-     *
-     * @param project the associated project, if any
-     */
-    public void setProject(@Nullable Project project) {
-        mProject = project;
-    }
-
-    /**
-     * Returns the associated location, if any
-     *
-     * @return the associated location, if any
-     */
-    @Nullable
-    public Location getLocation() {
-        return mLocation;
-    }
-
-    /**
-     * Sets the associated location, if any
-     *
-     * @param location the associated location, if any
-     */
-    public void setLocation(@Nullable Location location) {
-        mLocation = location;
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/Configuration.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/Configuration.java
deleted file mode 100644
index d233be7..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/Configuration.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Severity;
-import com.google.common.annotations.Beta;
-
-/**
- * Lint configuration for an Android project such as which specific rules to include,
- * which specific rules to exclude, and which specific errors to ignore.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public abstract class Configuration {
-    /**
-     * Checks whether this issue should be ignored because the user has already
-     * suppressed the error? Note that this refers to individual issues being
-     * suppressed/ignored, not a whole detector being disabled via something
-     * like {@link #isEnabled(Issue)}.
-     *
-     * @param context the context used by the detector when the issue was found
-     * @param issue the issue that was found
-     * @param location the location of the issue
-     * @param message the associated user message
-     * @param data additional information about an issue (see
-     *            {@link LintClient#report(Context, Issue, Severity, Location, String, Object)}
-     *            for more information
-     * @return true if this issue should be suppressed
-     */
-    public boolean isIgnored(
-            @NonNull Context context,
-            @NonNull Issue issue,
-            @Nullable Location location,
-            @NonNull String message,
-            @Nullable Object data) {
-        return false;
-    }
-
-    /**
-     * Returns false if the given issue has been disabled. This is just
-     * a convenience method for {@code getSeverity(issue) != Severity.IGNORE}.
-     *
-     * @param issue the issue to check
-     * @return false if the issue has been disabled
-     */
-    public boolean isEnabled(@NonNull Issue issue) {
-        return getSeverity(issue) != Severity.IGNORE;
-    }
-
-    /**
-     * Returns the severity for a given issue. This is the same as the
-     * {@link Issue#getDefaultSeverity()} unless the user has selected a custom
-     * severity (which is tool context dependent).
-     *
-     * @param issue the issue to look up the severity from
-     * @return the severity use for issues for the given detector
-     */
-    public Severity getSeverity(@NonNull Issue issue) {
-        return issue.getDefaultSeverity();
-    }
-
-    // Editing configurations
-
-    /**
-     * Marks the given warning as "ignored".
-     *
-     * @param context The scanning context
-     * @param issue the issue to be ignored
-     * @param location The location to ignore the warning at, if any
-     * @param message The message for the warning
-     * @param data The corresponding data, or null
-     */
-    public abstract void ignore(
-            @NonNull Context context,
-            @NonNull Issue issue,
-            @Nullable Location location,
-            @NonNull String message,
-            @Nullable Object data);
-
-    /**
-     * Sets the severity to be used for this issue.
-     *
-     * @param issue the issue to set the severity for
-     * @param severity the severity to associate with this issue, or null to
-     *            reset the severity to the default
-     */
-    public abstract void setSeverity(@NonNull Issue issue, @Nullable Severity severity);
-
-    // Bulk editing support
-
-    /**
-     * Marks the beginning of a "bulk" editing operation with repeated calls to
-     * {@link #setSeverity} or {@link #ignore}. After all the values have been
-     * set, the client <b>must</b> call {@link #finishBulkEditing()}. This
-     * allows configurations to avoid doing expensive I/O (such as writing out a
-     * config XML file) for each and every editing operation when they are
-     * applied in bulk, such as from a configuration dialog's "Apply" action.
-     */
-    public void startBulkEditing() {
-    }
-
-    /**
-     * Marks the end of a "bulk" editing operation, where values should be
-     * committed to persistent storage. See {@link #startBulkEditing()} for
-     * details.
-     */
-    public void finishBulkEditing() {
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/DefaultConfiguration.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/DefaultConfiguration.java
deleted file mode 100644
index db82556..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/DefaultConfiguration.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Project;
-import com.android.tools.lint.detector.api.Severity;
-import com.google.common.annotations.Beta;
-import com.google.common.io.Closeables;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXParseException;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-/**
- * Default implementation of a {@link Configuration} which reads and writes
- * configuration data into {@code lint.xml} in the project directory.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public class DefaultConfiguration extends Configuration {
-    private final LintClient mClient;
-    private static final String CONFIG_FILE_NAME = "lint.xml"; //$NON-NLS-1$
-
-    // Lint XML File
-    @NonNull
-    private static final String TAG_ISSUE = "issue"; //$NON-NLS-1$
-    @NonNull
-    private static final String ATTR_ID = "id"; //$NON-NLS-1$
-    @NonNull
-    private static final String ATTR_SEVERITY = "severity"; //$NON-NLS-1$
-    @NonNull
-    private static final String ATTR_PATH = "path"; //$NON-NLS-1$
-    @NonNull
-    private static final String TAG_IGNORE = "ignore"; //$NON-NLS-1$
-
-    private final Configuration mParent;
-    private final Project mProject;
-    private final File mConfigFile;
-    private boolean mBulkEditing;
-
-    /** Map from id to list of project-relative paths for suppressed warnings */
-    private Map<String, List<String>> mSuppressed;
-
-    /**
-     * Map from id to custom {@link Severity} override
-     */
-    private Map<String, Severity> mSeverity;
-
-    protected DefaultConfiguration(
-            @NonNull LintClient client,
-            @Nullable Project project,
-            @Nullable Configuration parent,
-            @NonNull File configFile) {
-        mClient = client;
-        mProject = project;
-        mParent = parent;
-        mConfigFile = configFile;
-    }
-
-    protected DefaultConfiguration(
-            @NonNull LintClient client,
-            @NonNull Project project,
-            @Nullable Configuration parent) {
-        this(client, project, parent, new File(project.getDir(), CONFIG_FILE_NAME));
-    }
-
-    /**
-     * Creates a new {@link DefaultConfiguration}
-     *
-     * @param client the client to report errors to etc
-     * @param project the associated project
-     * @param parent the parent/fallback configuration or null
-     * @return a new configuration
-     */
-    @NonNull
-    public static DefaultConfiguration create(
-            @NonNull LintClient client,
-            @NonNull Project project,
-            @Nullable Configuration parent) {
-        return new DefaultConfiguration(client, project, parent);
-    }
-
-    /**
-     * Creates a new {@link DefaultConfiguration} for the given lint config
-     * file, not affiliated with a project. This is used for global
-     * configurations.
-     *
-     * @param client the client to report errors to etc
-     * @param lintFile the lint file containing the configuration
-     * @return a new configuration
-     */
-    @NonNull
-    public static DefaultConfiguration create(@NonNull LintClient client, @NonNull File lintFile) {
-        return new DefaultConfiguration(client, null /*project*/, null /*parent*/, lintFile);
-    }
-
-    @Override
-    public boolean isIgnored(
-            @NonNull Context context,
-            @NonNull Issue issue,
-            @Nullable Location location,
-            @NonNull String message,
-            @Nullable Object data) {
-        ensureInitialized();
-
-        String id = issue.getId();
-        List<String> paths = mSuppressed.get(id);
-        if (paths != null && location != null) {
-            File file = location.getFile();
-            String relativePath = context.getProject().getRelativePath(file);
-            for (String suppressedPath : paths) {
-                if (suppressedPath.equals(relativePath)) {
-                    return true;
-                }
-            }
-        }
-
-        if (mParent != null) {
-            return mParent.isIgnored(context, issue, location, message, data);
-        }
-
-        return false;
-    }
-
-    @NonNull
-    protected Severity getDefaultSeverity(@NonNull Issue issue) {
-        if (!issue.isEnabledByDefault()) {
-            return Severity.IGNORE;
-        }
-
-        return issue.getDefaultSeverity();
-    }
-
-    @Override
-    @NonNull
-    public Severity getSeverity(@NonNull Issue issue) {
-        ensureInitialized();
-
-        Severity severity = mSeverity.get(issue.getId());
-        if (severity != null) {
-            return severity;
-        }
-
-        if (mParent != null) {
-            return mParent.getSeverity(issue);
-        }
-
-        return getDefaultSeverity(issue);
-    }
-
-    private void ensureInitialized() {
-        if (mSuppressed == null) {
-            readConfig();
-        }
-    }
-
-    private void formatError(String message, Object... args) {
-        if (args != null && args.length > 0) {
-            message = String.format(message, args);
-        }
-        message = "Failed to parse lint.xml configuration file: " + message;
-        LintDriver driver = new LintDriver(new IssueRegistry() {
-            @Override @NonNull public List<Issue> getIssues() {
-                return Collections.emptyList();
-            }
-        }, mClient);
-        mClient.report(new Context(driver, mProject, mProject, mConfigFile),
-                IssueRegistry.LINT_ERROR,
-                mProject.getConfiguration().getSeverity(IssueRegistry.LINT_ERROR),
-                Location.create(mConfigFile), message, null);
-    }
-
-    private void readConfig() {
-        mSuppressed = new HashMap<String, List<String>>();
-        mSeverity = new HashMap<String, Severity>();
-
-        if (!mConfigFile.exists()) {
-            return;
-        }
-
-        @SuppressWarnings("resource") // Eclipse doesn't know about Closeables.closeQuietly
-        BufferedInputStream input = null;
-        try {
-            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-            input = new BufferedInputStream(new FileInputStream(mConfigFile));
-            InputSource source = new InputSource(input);
-            factory.setNamespaceAware(false);
-            factory.setValidating(false);
-            DocumentBuilder builder = factory.newDocumentBuilder();
-            Document document = builder.parse(source);
-            NodeList issues = document.getElementsByTagName(TAG_ISSUE);
-            for (int i = 0, count = issues.getLength(); i < count; i++) {
-                Node node = issues.item(i);
-                Element element = (Element) node;
-                String id = element.getAttribute(ATTR_ID);
-                if (id.isEmpty()) {
-                    formatError("Invalid lint config file: Missing required issue id attribute");
-                    continue;
-                }
-
-                NamedNodeMap attributes = node.getAttributes();
-                for (int j = 0, n = attributes.getLength(); j < n; j++) {
-                    Node attribute = attributes.item(j);
-                    String name = attribute.getNodeName();
-                    String value = attribute.getNodeValue();
-                    if (ATTR_ID.equals(name)) {
-                        // already handled
-                    } else if (ATTR_SEVERITY.equals(name)) {
-                        for (Severity severity : Severity.values()) {
-                            if (value.equalsIgnoreCase(severity.name())) {
-                                mSeverity.put(id, severity);
-                                break;
-                            }
-                        }
-                    } else {
-                        formatError("Unexpected attribute \"%1$s\"", name);
-                    }
-                }
-
-                // Look up ignored errors
-                NodeList childNodes = element.getChildNodes();
-                if (childNodes.getLength() > 0) {
-                    for (int j = 0, n = childNodes.getLength(); j < n; j++) {
-                        Node child = childNodes.item(j);
-                        if (child.getNodeType() == Node.ELEMENT_NODE) {
-                            Element ignore = (Element) child;
-                            String path = ignore.getAttribute(ATTR_PATH);
-                            if (path.isEmpty()) {
-                                formatError("Missing required %1$s attribute under %2$s",
-                                    ATTR_PATH, id);
-                            } else {
-                                List<String> paths = mSuppressed.get(id);
-                                if (paths == null) {
-                                    paths = new ArrayList<String>(n / 2 + 1);
-                                    mSuppressed.put(id, paths);
-                                }
-                                paths.add(path);
-                            }
-                        }
-                    }
-                }
-            }
-        } catch (SAXParseException e) {
-            formatError(e.getMessage());
-        } catch (Exception e) {
-            mClient.log(e, null);
-        } finally {
-            Closeables.closeQuietly(input);
-        }
-    }
-
-    private void writeConfig() {
-        try {
-            // Write the contents to a new file first such that we don't clobber the
-            // existing file if some I/O error occurs.
-            File file = new File(mConfigFile.getParentFile(),
-                    mConfigFile.getName() + ".new"); //$NON-NLS-1$
-
-            Writer writer = new BufferedWriter(new FileWriter(file));
-            writer.write(
-                    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +     //$NON-NLS-1$
-                    "<lint>\n");                                         //$NON-NLS-1$
-
-            if (!mSuppressed.isEmpty() || !mSeverity.isEmpty()) {
-                // Process the maps in a stable sorted order such that if the
-                // files are checked into version control with the project,
-                // there are no random diffs just because hashing algorithms
-                // differ:
-                Set<String> idSet = new HashSet<String>();
-                for (String id : mSuppressed.keySet()) {
-                    idSet.add(id);
-                }
-                for (String id : mSeverity.keySet()) {
-                    idSet.add(id);
-                }
-                List<String> ids = new ArrayList<String>(idSet);
-                Collections.sort(ids);
-
-                for (String id : ids) {
-                    writer.write("    <");                               //$NON-NLS-1$
-                    writer.write(TAG_ISSUE);
-                    writeAttribute(writer, ATTR_ID, id);
-                    Severity severity = mSeverity.get(id);
-                    if (severity != null) {
-                        writeAttribute(writer, ATTR_SEVERITY,
-                                severity.name().toLowerCase(Locale.US));
-                    }
-
-                    List<String> paths = mSuppressed.get(id);
-                    if (paths != null && !paths.isEmpty()) {
-                        writer.write('>');
-                        writer.write('\n');
-                        // The paths are already kept in sorted order when they are modified
-                        // by ignore(...)
-                        for (String path : paths) {
-                            writer.write("        <");                   //$NON-NLS-1$
-                            writer.write(TAG_IGNORE);
-                            writeAttribute(writer, ATTR_PATH, path);
-                            writer.write(" />\n");                       //$NON-NLS-1$
-                        }
-                        writer.write("    </");                          //$NON-NLS-1$
-                        writer.write(TAG_ISSUE);
-                        writer.write('>');
-                        writer.write('\n');
-                    } else {
-                        writer.write(" />\n");                           //$NON-NLS-1$
-                    }
-                }
-            }
-
-            writer.write("</lint>");                                     //$NON-NLS-1$
-            writer.close();
-
-            // Move file into place: move current version to lint.xml~ (removing the old ~ file
-            // if it exists), then move the new version to lint.xml.
-            File oldFile = new File(mConfigFile.getParentFile(),
-                    mConfigFile.getName() + '~'); //$NON-NLS-1$
-            if (oldFile.exists()) {
-                oldFile.delete();
-            }
-            if (mConfigFile.exists()) {
-                mConfigFile.renameTo(oldFile);
-            }
-            boolean ok = file.renameTo(mConfigFile);
-            if (ok && oldFile.exists()) {
-                oldFile.delete();
-            }
-        } catch (Exception e) {
-            mClient.log(e, null);
-        }
-    }
-
-    private static void writeAttribute(
-            @NonNull Writer writer, @NonNull String name, @NonNull String value)
-            throws IOException {
-        writer.write(' ');
-        writer.write(name);
-        writer.write('=');
-        writer.write('"');
-        writer.write(value);
-        writer.write('"');
-    }
-
-    @Override
-    public void ignore(
-            @NonNull Context context,
-            @NonNull Issue issue,
-            @Nullable Location location,
-            @NonNull String message,
-            @Nullable Object data) {
-        // This configuration only supports suppressing warnings on a per-file basis
-        if (location != null) {
-            ignore(issue, location.getFile());
-        }
-    }
-
-    /**
-     * Marks the given issue and file combination as being ignored.
-     *
-     * @param issue the issue to be ignored in the given file
-     * @param file the file to ignore the issue in
-     */
-    public void ignore(@NonNull Issue issue, @NonNull File file) {
-        ensureInitialized();
-
-        String path = mProject != null ? mProject.getRelativePath(file) : file.getPath();
-
-        List<String> paths = mSuppressed.get(issue.getId());
-        if (paths == null) {
-            paths = new ArrayList<String>();
-            mSuppressed.put(issue.getId(), paths);
-        }
-        paths.add(path);
-
-        // Keep paths sorted alphabetically; makes XML output stable
-        Collections.sort(paths);
-
-        if (!mBulkEditing) {
-            writeConfig();
-        }
-    }
-
-    @Override
-    public void setSeverity(@NonNull Issue issue, @Nullable Severity severity) {
-        ensureInitialized();
-
-        String id = issue.getId();
-        if (severity == null) {
-            mSeverity.remove(id);
-        } else {
-            mSeverity.put(id, severity);
-        }
-
-        if (!mBulkEditing) {
-            writeConfig();
-        }
-    }
-
-    @Override
-    public void startBulkEditing() {
-        mBulkEditing = true;
-    }
-
-    @Override
-    public void finishBulkEditing() {
-        mBulkEditing = false;
-        writeConfig();
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/DefaultSdkInfo.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/DefaultSdkInfo.java
deleted file mode 100644
index 2f54659..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/DefaultSdkInfo.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import static com.android.SdkConstants.ABSOLUTE_LAYOUT;
-import static com.android.SdkConstants.ABS_LIST_VIEW;
-import static com.android.SdkConstants.ABS_SEEK_BAR;
-import static com.android.SdkConstants.ABS_SPINNER;
-import static com.android.SdkConstants.ADAPTER_VIEW;
-import static com.android.SdkConstants.AUTO_COMPLETE_TEXT_VIEW;
-import static com.android.SdkConstants.BUTTON;
-import static com.android.SdkConstants.CHECKABLE;
-import static com.android.SdkConstants.CHECKED_TEXT_VIEW;
-import static com.android.SdkConstants.CHECK_BOX;
-import static com.android.SdkConstants.COMPOUND_BUTTON;
-import static com.android.SdkConstants.EDIT_TEXT;
-import static com.android.SdkConstants.EXPANDABLE_LIST_VIEW;
-import static com.android.SdkConstants.FRAME_LAYOUT;
-import static com.android.SdkConstants.GALLERY;
-import static com.android.SdkConstants.GRID_VIEW;
-import static com.android.SdkConstants.HORIZONTAL_SCROLL_VIEW;
-import static com.android.SdkConstants.IMAGE_BUTTON;
-import static com.android.SdkConstants.IMAGE_VIEW;
-import static com.android.SdkConstants.LINEAR_LAYOUT;
-import static com.android.SdkConstants.LIST_VIEW;
-import static com.android.SdkConstants.MULTI_AUTO_COMPLETE_TEXT_VIEW;
-import static com.android.SdkConstants.PROGRESS_BAR;
-import static com.android.SdkConstants.RADIO_BUTTON;
-import static com.android.SdkConstants.RADIO_GROUP;
-import static com.android.SdkConstants.RELATIVE_LAYOUT;
-import static com.android.SdkConstants.SCROLL_VIEW;
-import static com.android.SdkConstants.SEEK_BAR;
-import static com.android.SdkConstants.SPINNER;
-import static com.android.SdkConstants.SURFACE_VIEW;
-import static com.android.SdkConstants.SWITCH;
-import static com.android.SdkConstants.TABLE_LAYOUT;
-import static com.android.SdkConstants.TABLE_ROW;
-import static com.android.SdkConstants.TAB_HOST;
-import static com.android.SdkConstants.TAB_WIDGET;
-import static com.android.SdkConstants.TEXT_VIEW;
-import static com.android.SdkConstants.TOGGLE_BUTTON;
-import static com.android.SdkConstants.VIEW;
-import static com.android.SdkConstants.VIEW_ANIMATOR;
-import static com.android.SdkConstants.VIEW_GROUP;
-import static com.android.SdkConstants.VIEW_PKG_PREFIX;
-import static com.android.SdkConstants.VIEW_STUB;
-import static com.android.SdkConstants.VIEW_SWITCHER;
-import static com.android.SdkConstants.WEB_VIEW;
-import static com.android.SdkConstants.WIDGET_PKG_PREFIX;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.google.common.annotations.Beta;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Default simple implementation of an {@link SdkInfo}
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-class DefaultSdkInfo extends SdkInfo {
-    @Override
-    @Nullable
-    public String getParentViewName(@NonNull String name) {
-        name = getRawType(name);
-
-        return PARENTS.get(name);
-    }
-
-    @Override
-    @Nullable
-    public String getParentViewClass(@NonNull String fqcn) {
-        int index = fqcn.lastIndexOf('.');
-        if (index != -1) {
-            fqcn = fqcn.substring(index + 1);
-        }
-
-        String parent = PARENTS.get(fqcn);
-        if (parent == null) {
-            return null;
-        }
-        // The map only stores class names internally; correct for full package paths
-        if (parent.equals(VIEW) || parent.equals(VIEW_GROUP) || parent.equals(SURFACE_VIEW)) {
-            return VIEW_PKG_PREFIX + parent;
-        } else {
-            return WIDGET_PKG_PREFIX + parent;
-        }
-    }
-
-    @Override
-    public boolean isSubViewOf(@NonNull String parentType, @NonNull String childType) {
-        String parent = getRawType(parentType);
-        String child = getRawType(childType);
-
-        // Do analysis just on non-fqcn paths
-        if (parent.indexOf('.') != -1) {
-            parent = parent.substring(parent.lastIndexOf('.') + 1);
-        }
-        if (child.indexOf('.') != -1) {
-            child = child.substring(child.lastIndexOf('.') + 1);
-        }
-
-        if (parent.equals(VIEW)) {
-            return true;
-        }
-
-        while (!child.equals(VIEW)) {
-            if (parent.equals(child)) {
-                return true;
-            }
-            if (implementsInterface(child, parentType)) {
-                return true;
-            }
-            child = PARENTS.get(child);
-            if (child == null) {
-                // Unknown view - err on the side of caution
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private static boolean implementsInterface(String className, String interfaceName) {
-        return interfaceName.equals(INTERFACES.get(className));
-    }
-
-    // Strip off type parameters, e.g. AdapterView<?> => AdapterView
-    private static String getRawType(String type) {
-        if (type != null) {
-            int index = type.indexOf('<');
-            if (index != -1) {
-                type = type.substring(0, index);
-            }
-        }
-
-        return type;
-    }
-
-    @Override
-    public boolean isLayout(@NonNull String tag) {
-        // TODO: Read in widgets.txt from the platform install area to look up this information
-        // dynamically instead!
-
-        if (super.isLayout(tag)) {
-            return true;
-        }
-
-        return LAYOUTS.contains(tag);
-    }
-
-    private static final int CLASS_COUNT = 59;
-    private static final int LAYOUT_COUNT = 20;
-
-    private static final Map<String,String> PARENTS = Maps.newHashMapWithExpectedSize(CLASS_COUNT);
-    private static final Set<String> LAYOUTS =  Sets.newHashSetWithExpectedSize(CLASS_COUNT);
-
-    static {
-        PARENTS.put(COMPOUND_BUTTON, BUTTON);
-        PARENTS.put(ABS_SPINNER, ADAPTER_VIEW);
-        PARENTS.put(ABS_LIST_VIEW, ADAPTER_VIEW);
-        PARENTS.put(ABS_SEEK_BAR, ADAPTER_VIEW);
-        PARENTS.put(ADAPTER_VIEW, VIEW_GROUP);
-        PARENTS.put(VIEW_GROUP, VIEW);
-
-        PARENTS.put(TEXT_VIEW, VIEW);
-        PARENTS.put(CHECKED_TEXT_VIEW, TEXT_VIEW);
-        PARENTS.put(RADIO_BUTTON, COMPOUND_BUTTON);
-        PARENTS.put(SPINNER, ABS_SPINNER);
-        PARENTS.put(IMAGE_BUTTON, IMAGE_VIEW);
-        PARENTS.put(IMAGE_VIEW, VIEW);
-        PARENTS.put(EDIT_TEXT, TEXT_VIEW);
-        PARENTS.put(PROGRESS_BAR, VIEW);
-        PARENTS.put(TOGGLE_BUTTON, COMPOUND_BUTTON);
-        PARENTS.put(VIEW_STUB, VIEW);
-        PARENTS.put(BUTTON, TEXT_VIEW);
-        PARENTS.put(SEEK_BAR, ABS_SEEK_BAR);
-        PARENTS.put(CHECK_BOX, COMPOUND_BUTTON);
-        PARENTS.put(SWITCH, COMPOUND_BUTTON);
-        PARENTS.put(GALLERY, ABS_SPINNER);
-        PARENTS.put(SURFACE_VIEW, VIEW);
-        PARENTS.put(ABSOLUTE_LAYOUT, VIEW_GROUP);
-        PARENTS.put(LINEAR_LAYOUT, VIEW_GROUP);
-        PARENTS.put(RELATIVE_LAYOUT, VIEW_GROUP);
-        PARENTS.put(LIST_VIEW, ABS_LIST_VIEW);
-        PARENTS.put(VIEW_SWITCHER, VIEW_ANIMATOR);
-        PARENTS.put(FRAME_LAYOUT, VIEW_GROUP);
-        PARENTS.put(HORIZONTAL_SCROLL_VIEW, FRAME_LAYOUT);
-        PARENTS.put(VIEW_ANIMATOR, FRAME_LAYOUT);
-        PARENTS.put(TAB_HOST, FRAME_LAYOUT);
-        PARENTS.put(TABLE_ROW, LINEAR_LAYOUT);
-        PARENTS.put(RADIO_GROUP, LINEAR_LAYOUT);
-        PARENTS.put(TAB_WIDGET, LINEAR_LAYOUT);
-        PARENTS.put(EXPANDABLE_LIST_VIEW, LIST_VIEW);
-        PARENTS.put(TABLE_LAYOUT, LINEAR_LAYOUT);
-        PARENTS.put(SCROLL_VIEW, FRAME_LAYOUT);
-        PARENTS.put(GRID_VIEW, ABS_LIST_VIEW);
-        PARENTS.put(WEB_VIEW, ABSOLUTE_LAYOUT);
-        PARENTS.put(AUTO_COMPLETE_TEXT_VIEW, EDIT_TEXT);
-        PARENTS.put(MULTI_AUTO_COMPLETE_TEXT_VIEW, AUTO_COMPLETE_TEXT_VIEW);
-        PARENTS.put(CHECKED_TEXT_VIEW, TEXT_VIEW);
-
-        PARENTS.put("MediaController", FRAME_LAYOUT);     //$NON-NLS-1$
-        PARENTS.put("SlidingDrawer", VIEW_GROUP);         //$NON-NLS-1$
-        PARENTS.put("DialerFilter", RELATIVE_LAYOUT);     //$NON-NLS-1$
-        PARENTS.put("DigitalClock", TEXT_VIEW);           //$NON-NLS-1$
-        PARENTS.put("Chronometer", TEXT_VIEW);            //$NON-NLS-1$
-        PARENTS.put("ImageSwitcher", VIEW_SWITCHER);      //$NON-NLS-1$
-        PARENTS.put("TextSwitcher", VIEW_SWITCHER);       //$NON-NLS-1$
-        PARENTS.put("AnalogClock", VIEW);                 //$NON-NLS-1$
-        PARENTS.put("TwoLineListItem", RELATIVE_LAYOUT);  //$NON-NLS-1$
-        PARENTS.put("ZoomControls", LINEAR_LAYOUT);       //$NON-NLS-1$
-        PARENTS.put("DatePicker", FRAME_LAYOUT);          //$NON-NLS-1$
-        PARENTS.put("TimePicker", FRAME_LAYOUT);          //$NON-NLS-1$
-        PARENTS.put("VideoView", SURFACE_VIEW);           //$NON-NLS-1$
-        PARENTS.put("ZoomButton", IMAGE_BUTTON);          //$NON-NLS-1$
-        PARENTS.put("RatingBar", ABS_SEEK_BAR);           //$NON-NLS-1$
-        PARENTS.put("ViewFlipper", VIEW_ANIMATOR);        //$NON-NLS-1$
-        PARENTS.put("NumberPicker", LINEAR_LAYOUT);       //$NON-NLS-1$
-
-        assert PARENTS.size() <= CLASS_COUNT : PARENTS.size();
-
-        /*
-        // Check that all widgets lead to the root view
-        if (LintUtils.assertionsEnabled()) {
-            for (String key : PARENTS.keySet()) {
-                String parent = PARENTS.get(key);
-                if (!parent.equals(VIEW)) {
-                    String grandParent = PARENTS.get(parent);
-                    assert grandParent != null : parent;
-                }
-            }
-        }
-        */
-
-        LAYOUTS.add(TAB_HOST);
-        LAYOUTS.add(HORIZONTAL_SCROLL_VIEW);
-        LAYOUTS.add(VIEW_SWITCHER);
-        LAYOUTS.add(TAB_WIDGET);
-        LAYOUTS.add(VIEW_ANIMATOR);
-        LAYOUTS.add(SCROLL_VIEW);
-        LAYOUTS.add(GRID_VIEW);
-        LAYOUTS.add(TABLE_ROW);
-        LAYOUTS.add(RADIO_GROUP);
-        LAYOUTS.add(LIST_VIEW);
-        LAYOUTS.add(EXPANDABLE_LIST_VIEW);
-        LAYOUTS.add("MediaController");        //$NON-NLS-1$
-        LAYOUTS.add("DialerFilter");           //$NON-NLS-1$
-        LAYOUTS.add("ViewFlipper");            //$NON-NLS-1$
-        LAYOUTS.add("SlidingDrawer");          //$NON-NLS-1$
-        LAYOUTS.add("StackView");              //$NON-NLS-1$
-        LAYOUTS.add("SearchView");             //$NON-NLS-1$
-        LAYOUTS.add("TextSwitcher");           //$NON-NLS-1$
-        LAYOUTS.add("AdapterViewFlipper");     //$NON-NLS-1$
-        LAYOUTS.add("ImageSwitcher");          //$NON-NLS-1$
-        assert LAYOUTS.size() <= LAYOUT_COUNT : LAYOUTS.size();
-    }
-
-    // Currently using a map; this should really be a list, but using a map until we actually
-    // start adding more than one item
-    @NonNull
-    private static final Map<String, String> INTERFACES = new HashMap<String, String>(2);
-    static {
-        INTERFACES.put(CHECKED_TEXT_VIEW, CHECKABLE);
-        INTERFACES.put(COMPOUND_BUTTON, CHECKABLE);
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/IDomParser.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/IDomParser.java
deleted file mode 100644
index 1a70fac..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/IDomParser.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.annotations.Beta;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * A wrapper for an XML parser. This allows tools integrating lint to map directly
- * to builtin services, such as already-parsed data structures in XML editors.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public interface IDomParser {
-    /**
-     * Parse the file pointed to by the given context and return as a Document
-     *
-     * @param context the context pointing to the file to be parsed, typically
-     *            via {@link Context#getContents()} but the file handle (
-     *            {@link Context#file} can also be used to map to an existing
-     *            editor buffer in the surrounding tool, etc)
-     * @return the parsed DOM document, or null if parsing fails
-     */
-    @Nullable
-    Document parseXml(@NonNull XmlContext context);
-
-    /**
-     * Returns a {@link Location} for the given DOM node
-     *
-     * @param context information about the file being parsed
-     * @param node the node to create a location for
-     * @return a location for the given node
-     */
-    @NonNull
-    Location getLocation(@NonNull XmlContext context, @NonNull Node node);
-
-    /**
-     * Returns a {@link Location} for the given DOM node. Like
-     * {@link #getLocation(XmlContext, Node)}, but allows a position range that
-     * is a subset of the node range.
-     *
-     * @param context information about the file being parsed
-     * @param node the node to create a location for
-     * @param start the starting position within the node, inclusive
-     * @param end the ending position within the node, exclusive
-     * @return a location for the given node
-     */
-    @NonNull
-    Location getLocation(@NonNull XmlContext context, @NonNull Node node, int start, int end);
-
-    /**
-     * Creates a light-weight handle to a location for the given node. It can be
-     * turned into a full fledged location by
-     * {@link com.android.tools.lint.detector.api.Location.Handle#resolve()}.
-     *
-     * @param context the context providing the node
-     * @param node the node (element or attribute) to create a location handle
-     *            for
-     * @return a location handle
-     */
-    @NonNull
-    Location.Handle createLocationHandle(@NonNull XmlContext context, @NonNull Node node);
-
-    /**
-     * Dispose any data structures held for the given context.
-     * @param context information about the file previously parsed
-     * @param document the document that was parsed and is now being disposed
-     */
-    void dispose(@NonNull XmlContext context, @NonNull Document document);
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/IJavaParser.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/IJavaParser.java
deleted file mode 100644
index 9b74f16..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/IJavaParser.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.Location;
-
-import lombok.ast.Node;
-
-/**
- * A wrapper for a Java parser. This allows tools integrating lint to map directly
- * to builtin services, such as already-parsed data structures in Java editors.
- * <p/>
- * <b>NOTE: This is not a or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-public interface IJavaParser {
-    /**
-     * Parse the file pointed to by the given context.
-     *
-     * @param context the context pointing to the file to be parsed, typically
-     *            via {@link Context#getContents()} but the file handle (
-     *            {@link Context#file} can also be used to map to an existing
-     *            editor buffer in the surrounding tool, etc)
-     * @return the compilation unit node for the file
-     */
-    @Nullable
-    Node parseJava(@NonNull JavaContext context);
-
-    /**
-     * Returns a {@link Location} for the given node
-     *
-     * @param context information about the file being parsed
-     * @param node the node to create a location for
-     * @return a location for the given node
-     */
-    @NonNull
-    Location getLocation(@NonNull JavaContext context, @NonNull Node node);
-
-    /**
-     * Creates a light-weight handle to a location for the given node. It can be
-     * turned into a full fledged location by
-     * {@link com.android.tools.lint.detector.api.Location.Handle#resolve()}.
-     *
-     * @param context the context providing the node
-     * @param node the node (element or attribute) to create a location handle
-     *            for
-     * @return a location handle
-     */
-    @NonNull
-    Location.Handle createLocationHandle(@NonNull JavaContext context, @NonNull Node node);
-
-    /**
-     * Dispose any data structures held for the given context.
-     * @param context information about the file previously parsed
-     * @param compilationUnit the compilation unit being disposed
-     */
-    void dispose(@NonNull JavaContext context, @NonNull Node compilationUnit);
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/IssueRegistry.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/IssueRegistry.java
deleted file mode 100644
index 0b8b141..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/IssueRegistry.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.google.common.annotations.Beta;
-import com.google.common.collect.Maps;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/** Registry which provides a list of checks to be performed on an Android project
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public abstract class IssueRegistry {
-    private static List<Category> sCategories;
-    private static Map<String, Issue> sIdToIssue;
-    private static Map<EnumSet<Scope>, List<Issue>> sScopeIssues = Maps.newHashMap();
-
-    /**
-     * Creates a new {@linkplain IssueRegistry}
-     */
-    protected IssueRegistry() {
-    }
-
-    /**
-     * Issue reported by lint (not a specific detector) when it cannot even
-     * parse an XML file prior to analysis
-     */
-    @NonNull
-    public static final Issue PARSER_ERROR = Issue.create(
-            "ParserError", //$NON-NLS-1$
-            "Finds files that contain fatal parser errors",
-            "Lint will ignore any files that contain fatal parsing errors. These may contain " +
-            "other errors, or contain code which affects issues in other files.",
-            Category.CORRECTNESS,
-            10,
-            Severity.ERROR,
-            Detector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /**
-     * Issue reported by lint for various other issues which prevents lint from
-     * running normally when it's not necessarily an error in the user's code base.
-     */
-    @NonNull
-    public static final Issue LINT_ERROR = Issue.create(
-            "LintError", //$NON-NLS-1$
-            "Issues related to running lint itself, such as failure to read files, etc",
-            "This issue type represents a problem running lint itself. Examples include " +
-            "failure to find bytecode for source files (which means certain detectors " +
-            "could not be run), parsing errors in lint configuration files, etc." +
-            "\n" +
-            "These errors are not errors in your own code, but they are shown to make " +
-            "it clear that some checks were not completed.",
-
-            Category.LINT,
-            10,
-            Severity.ERROR,
-            Detector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /**
-     * Returns the list of issues that can be found by all known detectors.
-     *
-     * @return the list of issues to be checked (including those that may be
-     *         disabled!)
-     */
-    @NonNull
-    public abstract List<Issue> getIssues();
-
-    /**
-     * Returns all available issues of a given scope (regardless of whether
-     * they are actually enabled for a given configuration etc)
-     *
-     * @param scope the applicable scope set
-     * @return a list of issues
-     */
-    @NonNull
-    private List<Issue> getIssuesForScope(@NonNull EnumSet<Scope> scope) {
-        List<Issue> list = sScopeIssues.get(scope);
-        if (list == null) {
-            List<Issue> issues = getIssues();
-            if (scope.equals(Scope.ALL)) {
-                list = issues;
-            } else {
-                int initialSize = 12;
-                if (scope.contains(Scope.RESOURCE_FILE)) {
-                    initialSize += 50;
-                }
-                if (scope.contains(Scope.JAVA_FILE)) {
-                    initialSize += 12;
-                }
-                if (scope.contains(Scope.CLASS_FILE)) {
-                    initialSize += 12;
-                }
-                list = new ArrayList<Issue>(initialSize);
-                for (Issue issue : issues) {
-                    // Determine if the scope matches
-                    if (issue.isAdequate(scope)) {
-                        list.add(issue);
-                    }
-                }
-            }
-            sScopeIssues.put(scope, list);
-        }
-
-        return list;
-    }
-
-    /**
-     * Creates a list of detectors applicable to the given scope, and with the
-     * given configuration.
-     *
-     * @param client the client to report errors to
-     * @param configuration the configuration to look up which issues are
-     *            enabled etc from
-     * @param scope the scope for the analysis, to filter out detectors that
-     *            require wider analysis than is currently being performed
-     * @param scopeToDetectors an optional map which (if not null) will be
-     *            filled by this method to contain mappings from each scope to
-     *            the applicable detectors for that scope
-     * @return a list of new detector instances
-     */
-    @NonNull
-    final List<? extends Detector> createDetectors(
-            @NonNull LintClient client,
-            @NonNull Configuration configuration,
-            @NonNull EnumSet<Scope> scope,
-            @Nullable Map<Scope, List<Detector>> scopeToDetectors) {
-
-        List<Issue> issues = getIssuesForScope(scope);
-        if (issues.isEmpty()) {
-            return Collections.emptyList();
-        }
-
-        Set<Class<? extends Detector>> detectorClasses = new HashSet<Class<? extends Detector>>();
-        Map<Class<? extends Detector>, EnumSet<Scope>> detectorToScope =
-                new HashMap<Class<? extends Detector>, EnumSet<Scope>>();
-
-        for (Issue issue : issues) {
-            Class<? extends Detector> detectorClass = issue.getDetectorClass();
-            EnumSet<Scope> issueScope = issue.getScope();
-            if (!detectorClasses.contains(detectorClass)) {
-                // Determine if the issue is enabled
-                if (!configuration.isEnabled(issue)) {
-                    continue;
-                }
-
-                assert issue.isAdequate(scope); // Ensured by getIssuesForScope above
-
-                detectorClass = client.replaceDetector(detectorClass);
-
-                assert detectorClass != null : issue.getId();
-                detectorClasses.add(detectorClass);
-            }
-
-            if (scopeToDetectors != null) {
-                EnumSet<Scope> s = detectorToScope.get(detectorClass);
-                if (s == null) {
-                    detectorToScope.put(detectorClass, issueScope);
-                } else if (!s.containsAll(issueScope)) {
-                    EnumSet<Scope> union = EnumSet.copyOf(s);
-                    union.addAll(issueScope);
-                    detectorToScope.put(detectorClass, union);
-                }
-            }
-        }
-
-        List<Detector> detectors = new ArrayList<Detector>(detectorClasses.size());
-        for (Class<? extends Detector> clz : detectorClasses) {
-            try {
-                Detector detector = clz.newInstance();
-                detectors.add(detector);
-
-                if (scopeToDetectors != null) {
-                    EnumSet<Scope> union = detectorToScope.get(clz);
-                    for (Scope s : union) {
-                        List<Detector> list = scopeToDetectors.get(s);
-                        if (list == null) {
-                            list = new ArrayList<Detector>();
-                            scopeToDetectors.put(s, list);
-                        }
-                        list.add(detector);
-                    }
-
-                }
-            } catch (Throwable t) {
-                client.log(t, "Can't initialize detector %1$s", clz.getName()); //$NON-NLS-1$
-            }
-        }
-
-        return detectors;
-    }
-
-    /**
-     * Returns true if the given id represents a valid issue id
-     *
-     * @param id the id to be checked
-     * @return true if the given id is valid
-     */
-    public final boolean isIssueId(@NonNull String id) {
-        return getIssue(id) != null;
-    }
-
-    /**
-     * Returns true if the given category is a valid category
-     *
-     * @param name the category name to be checked
-     * @return true if the given string is a valid category
-     */
-    public final boolean isCategoryName(@NonNull String name) {
-        for (Category category : getCategories()) {
-            if (category.getName().equals(name) || category.getFullName().equals(name)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the available categories
-     *
-     * @return an iterator for all the categories, never null
-     */
-    @NonNull
-    public List<Category> getCategories() {
-        if (sCategories == null) {
-            final Set<Category> categories = new HashSet<Category>();
-            for (Issue issue : getIssues()) {
-                categories.add(issue.getCategory());
-            }
-            List<Category> sorted = new ArrayList<Category>(categories);
-            Collections.sort(sorted);
-            sCategories = Collections.unmodifiableList(sorted);
-        }
-
-        return sCategories;
-    }
-
-    /**
-     * Returns the issue for the given id, or null if it's not a valid id
-     *
-     * @param id the id to be checked
-     * @return the corresponding issue, or null
-     */
-    @Nullable
-    public final Issue getIssue(@NonNull String id) {
-        if (sIdToIssue == null) {
-            List<Issue> issues = getIssues();
-            sIdToIssue = new HashMap<String, Issue>(issues.size());
-            for (Issue issue : issues) {
-                sIdToIssue.put(issue.getId(), issue);
-            }
-
-            sIdToIssue.put(PARSER_ERROR.getId(), PARSER_ERROR);
-            sIdToIssue.put(LINT_ERROR.getId(), LINT_ERROR);
-        }
-        return sIdToIssue.get(id);
-    }
-
-    /**
-     * Reset the registry such that it recomputes its available issues.
-     * <p>
-     * NOTE: This is only intended for testing purposes.
-     */
-    @VisibleForTesting
-    protected static void reset() {
-        sIdToIssue = null;
-        sCategories = null;
-        sScopeIssues = Maps.newHashMap();
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/JavaVisitor.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/JavaVisitor.java
deleted file mode 100644
index 81a0339..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/JavaVisitor.java
+++ /dev/null
@@ -1,1195 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import static com.android.SdkConstants.ANDROID_PKG;
-import static com.android.SdkConstants.R_CLASS;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Detector.JavaScanner;
-import com.android.tools.lint.detector.api.Detector.XmlScanner;
-import com.android.tools.lint.detector.api.JavaContext;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import lombok.ast.AlternateConstructorInvocation;
-import lombok.ast.Annotation;
-import lombok.ast.AnnotationDeclaration;
-import lombok.ast.AnnotationElement;
-import lombok.ast.AnnotationMethodDeclaration;
-import lombok.ast.AnnotationValueArray;
-import lombok.ast.ArrayAccess;
-import lombok.ast.ArrayCreation;
-import lombok.ast.ArrayDimension;
-import lombok.ast.ArrayInitializer;
-import lombok.ast.Assert;
-import lombok.ast.AstVisitor;
-import lombok.ast.BinaryExpression;
-import lombok.ast.Block;
-import lombok.ast.BooleanLiteral;
-import lombok.ast.Break;
-import lombok.ast.Case;
-import lombok.ast.Cast;
-import lombok.ast.Catch;
-import lombok.ast.CharLiteral;
-import lombok.ast.ClassDeclaration;
-import lombok.ast.ClassLiteral;
-import lombok.ast.Comment;
-import lombok.ast.CompilationUnit;
-import lombok.ast.ConstructorDeclaration;
-import lombok.ast.ConstructorInvocation;
-import lombok.ast.Continue;
-import lombok.ast.Default;
-import lombok.ast.DoWhile;
-import lombok.ast.EmptyDeclaration;
-import lombok.ast.EmptyStatement;
-import lombok.ast.EnumConstant;
-import lombok.ast.EnumDeclaration;
-import lombok.ast.EnumTypeBody;
-import lombok.ast.Expression;
-import lombok.ast.ExpressionStatement;
-import lombok.ast.FloatingPointLiteral;
-import lombok.ast.For;
-import lombok.ast.ForEach;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.Identifier;
-import lombok.ast.If;
-import lombok.ast.ImportDeclaration;
-import lombok.ast.InlineIfExpression;
-import lombok.ast.InstanceInitializer;
-import lombok.ast.InstanceOf;
-import lombok.ast.IntegralLiteral;
-import lombok.ast.InterfaceDeclaration;
-import lombok.ast.KeywordModifier;
-import lombok.ast.LabelledStatement;
-import lombok.ast.MethodDeclaration;
-import lombok.ast.MethodInvocation;
-import lombok.ast.Modifiers;
-import lombok.ast.Node;
-import lombok.ast.NormalTypeBody;
-import lombok.ast.NullLiteral;
-import lombok.ast.PackageDeclaration;
-import lombok.ast.Return;
-import lombok.ast.Select;
-import lombok.ast.StaticInitializer;
-import lombok.ast.StringLiteral;
-import lombok.ast.Super;
-import lombok.ast.SuperConstructorInvocation;
-import lombok.ast.Switch;
-import lombok.ast.Synchronized;
-import lombok.ast.This;
-import lombok.ast.Throw;
-import lombok.ast.Try;
-import lombok.ast.TypeReference;
-import lombok.ast.TypeReferencePart;
-import lombok.ast.TypeVariable;
-import lombok.ast.UnaryExpression;
-import lombok.ast.VariableDeclaration;
-import lombok.ast.VariableDefinition;
-import lombok.ast.VariableDefinitionEntry;
-import lombok.ast.VariableReference;
-import lombok.ast.While;
-
-
-/**
- * Specialized visitor for running detectors on a Java AST.
- * It operates in three phases:
- * <ol>
- *   <li> First, it computes a set of maps where it generates a map from each
- *        significant AST attribute (such as method call names) to a list
- *        of detectors to consult whenever that attribute is encountered.
- *        Examples of "attributes" are method names, Android resource identifiers,
- *        and general AST node types such as "cast" nodes etc. These are
- *        defined on the {@link JavaScanner} interface.
- *   <li> Second, it iterates over the document a single time, delegating to
- *        the detectors found at each relevant AST attribute.
- *   <li> Finally, it calls the remaining visitors (those that need to process a
- *        whole document on their own).
- * </ol>
- * It also notifies all the detectors before and after the document is processed
- * such that they can do pre- and post-processing.
- */
-public class JavaVisitor {
-    /** Default size of lists holding detectors of the same type for a given node type */
-    private static final int SAME_TYPE_COUNT = 8;
-
-    private final Map<String, List<VisitingDetector>> mMethodDetectors =
-            new HashMap<String, List<VisitingDetector>>();
-    private final List<VisitingDetector> mResourceFieldDetectors =
-            new ArrayList<VisitingDetector>();
-    private final List<VisitingDetector> mAllDetectors;
-    private final List<VisitingDetector> mFullTreeDetectors;
-    private final Map<Class<? extends Node>, List<VisitingDetector>> mNodeTypeDetectors =
-            new HashMap<Class<? extends Node>, List<VisitingDetector>>();
-    private final IJavaParser mParser;
-
-    JavaVisitor(@NonNull IJavaParser parser, @NonNull List<Detector> detectors) {
-        mParser = parser;
-        mAllDetectors = new ArrayList<VisitingDetector>(detectors.size());
-        mFullTreeDetectors = new ArrayList<VisitingDetector>(detectors.size());
-
-        for (Detector detector : detectors) {
-            VisitingDetector v = new VisitingDetector(detector, (JavaScanner) detector);
-            mAllDetectors.add(v);
-
-            List<Class<? extends Node>> nodeTypes = detector.getApplicableNodeTypes();
-            if (nodeTypes != null) {
-                for (Class<? extends Node> type : nodeTypes) {
-                    List<VisitingDetector> list = mNodeTypeDetectors.get(type);
-                    if (list == null) {
-                        list = new ArrayList<VisitingDetector>(SAME_TYPE_COUNT);
-                        mNodeTypeDetectors.put(type, list);
-                    }
-                    list.add(v);
-                }
-            }
-
-            List<String> names = detector.getApplicableMethodNames();
-            if (names != null) {
-                // not supported in Java visitors; adding a method invocation node is trivial
-                // for that case.
-                assert names != XmlScanner.ALL;
-
-                for (String name : names) {
-                    List<VisitingDetector> list = mMethodDetectors.get(name);
-                    if (list == null) {
-                        list = new ArrayList<VisitingDetector>(SAME_TYPE_COUNT);
-                        mMethodDetectors.put(name, list);
-                    }
-                    list.add(v);
-                }
-            }
-
-            if (detector.appliesToResourceRefs()) {
-                mResourceFieldDetectors.add(v);
-            } else if ((names == null || names.isEmpty())
-                    && (nodeTypes == null || nodeTypes.isEmpty())) {
-                mFullTreeDetectors.add(v);
-            }
-        }
-    }
-
-    void visitFile(@NonNull JavaContext context, @NonNull File file) {
-        context.parser = mParser;
-
-        Node compilationUnit = null;
-        try {
-            compilationUnit = mParser.parseJava(context);
-            if (compilationUnit == null) {
-                // No need to log this; the parser should be reporting
-                // a full warning (such as IssueRegistry#PARSER_ERROR)
-                // with details, location, etc.
-                return;
-            }
-            context.compilationUnit = compilationUnit;
-
-            for (VisitingDetector v : mAllDetectors) {
-                v.setContext(context);
-                v.getDetector().beforeCheckFile(context);
-            }
-
-            for (VisitingDetector v : mFullTreeDetectors) {
-                AstVisitor visitor = v.getVisitor();
-                if (visitor != null) {
-                    compilationUnit.accept(visitor);
-                }
-            }
-
-            if (!mMethodDetectors.isEmpty() || !mResourceFieldDetectors.isEmpty()) {
-                AstVisitor visitor = new DelegatingJavaVisitor(context);
-                compilationUnit.accept(visitor);
-            } else if (!mNodeTypeDetectors.isEmpty()) {
-                AstVisitor visitor = new DispatchVisitor();
-                compilationUnit.accept(visitor);
-            }
-
-            for (VisitingDetector v : mAllDetectors) {
-                v.getDetector().afterCheckFile(context);
-            }
-        } finally {
-            if (compilationUnit != null) {
-                mParser.dispose(context, compilationUnit);
-            }
-        }
-    }
-
-    private static class VisitingDetector {
-        private AstVisitor mVisitor; // construct lazily, and clear out on context switch!
-        private JavaContext mContext;
-        public final Detector mDetector;
-        public final JavaScanner mJavaScanner;
-
-        public VisitingDetector(@NonNull Detector detector, @NonNull JavaScanner javaScanner) {
-            mDetector = detector;
-            mJavaScanner = javaScanner;
-        }
-
-        @NonNull
-        public Detector getDetector() {
-            return mDetector;
-        }
-
-        @NonNull
-        public JavaScanner getJavaScanner() {
-            return mJavaScanner;
-        }
-
-        public void setContext(@NonNull JavaContext context) {
-            mContext = context;
-
-            // The visitors are one-per-context, so clear them out here and construct
-            // lazily only if needed
-            mVisitor = null;
-        }
-
-        @NonNull
-        AstVisitor getVisitor() {
-            if (mVisitor == null) {
-                mVisitor = mDetector.createJavaVisitor(mContext);
-                if (mVisitor == null) {
-                    mVisitor = new ForwardingAstVisitor() {
-                    };
-                }
-            }
-            return mVisitor;
-        }
-    }
-
-    /**
-     * Generic dispatcher which visits all nodes (once) and dispatches to
-     * specific visitors for each node. Each visitor typically only wants to
-     * look at a small part of a tree, such as a method call or a class
-     * declaration, so this means we avoid visiting all "uninteresting" nodes in
-     * the tree repeatedly.
-     */
-    private class DispatchVisitor extends AstVisitor {
-        @Override
-        public void endVisit(Node node) {
-            for (VisitingDetector v : mAllDetectors) {
-                v.getVisitor().endVisit(node);
-            }
-        }
-
-        @Override
-        public boolean visitAlternateConstructorInvocation(AlternateConstructorInvocation node) {
-            List<VisitingDetector> list =
-                    mNodeTypeDetectors.get(AlternateConstructorInvocation.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitAlternateConstructorInvocation(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitAnnotation(Annotation node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Annotation.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitAnnotation(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitAnnotationDeclaration(AnnotationDeclaration node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(AnnotationDeclaration.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitAnnotationDeclaration(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitAnnotationElement(AnnotationElement node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(AnnotationElement.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitAnnotationElement(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitAnnotationMethodDeclaration(AnnotationMethodDeclaration node) {
-            List<VisitingDetector> list =
-                    mNodeTypeDetectors.get(AnnotationMethodDeclaration.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitAnnotationMethodDeclaration(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitAnnotationValueArray(AnnotationValueArray node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(AnnotationValueArray.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitAnnotationValueArray(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitArrayAccess(ArrayAccess node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(ArrayAccess.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitArrayAccess(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitArrayCreation(ArrayCreation node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(ArrayCreation.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitArrayCreation(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitArrayDimension(ArrayDimension node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(ArrayDimension.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitArrayDimension(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitArrayInitializer(ArrayInitializer node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(ArrayInitializer.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitArrayInitializer(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitAssert(Assert node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Assert.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitAssert(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitBinaryExpression(BinaryExpression node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(BinaryExpression.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitBinaryExpression(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitBlock(Block node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Block.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitBlock(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitBooleanLiteral(BooleanLiteral node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(BooleanLiteral.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitBooleanLiteral(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitBreak(Break node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Break.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitBreak(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitCase(Case node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Case.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitCase(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitCast(Cast node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Cast.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitCast(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitCatch(Catch node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Catch.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitCatch(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitCharLiteral(CharLiteral node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(CharLiteral.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitCharLiteral(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitClassDeclaration(ClassDeclaration node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(ClassDeclaration.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitClassDeclaration(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitClassLiteral(ClassLiteral node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(ClassLiteral.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitClassLiteral(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitComment(Comment node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Comment.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitComment(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitCompilationUnit(CompilationUnit node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(CompilationUnit.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitCompilationUnit(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitConstructorDeclaration(ConstructorDeclaration node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(ConstructorDeclaration.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitConstructorDeclaration(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitConstructorInvocation(ConstructorInvocation node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(ConstructorInvocation.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitConstructorInvocation(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitContinue(Continue node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Continue.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitContinue(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitDefault(Default node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Default.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitDefault(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitDoWhile(DoWhile node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(DoWhile.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitDoWhile(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitEmptyDeclaration(EmptyDeclaration node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(EmptyDeclaration.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitEmptyDeclaration(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitEmptyStatement(EmptyStatement node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(EmptyStatement.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitEmptyStatement(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitEnumConstant(EnumConstant node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(EnumConstant.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitEnumConstant(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitEnumDeclaration(EnumDeclaration node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(EnumDeclaration.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitEnumDeclaration(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitEnumTypeBody(EnumTypeBody node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(EnumTypeBody.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitEnumTypeBody(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitExpressionStatement(ExpressionStatement node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(ExpressionStatement.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitExpressionStatement(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitFloatingPointLiteral(FloatingPointLiteral node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(FloatingPointLiteral.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitFloatingPointLiteral(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitFor(For node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(For.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitFor(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitForEach(ForEach node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(ForEach.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitForEach(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitIdentifier(Identifier node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Identifier.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitIdentifier(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitIf(If node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(If.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitIf(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitImportDeclaration(ImportDeclaration node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(ImportDeclaration.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitImportDeclaration(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitInlineIfExpression(InlineIfExpression node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(InlineIfExpression.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitInlineIfExpression(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitInstanceInitializer(InstanceInitializer node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(InstanceInitializer.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitInstanceInitializer(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitInstanceOf(InstanceOf node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(InstanceOf.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitInstanceOf(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitIntegralLiteral(IntegralLiteral node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(IntegralLiteral.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitIntegralLiteral(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitInterfaceDeclaration(InterfaceDeclaration node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(InterfaceDeclaration.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitInterfaceDeclaration(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitKeywordModifier(KeywordModifier node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(KeywordModifier.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitKeywordModifier(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitLabelledStatement(LabelledStatement node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(LabelledStatement.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitLabelledStatement(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitMethodDeclaration(MethodDeclaration node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(MethodDeclaration.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitMethodDeclaration(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitMethodInvocation(MethodInvocation node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(MethodInvocation.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitMethodInvocation(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitModifiers(Modifiers node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Modifiers.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitModifiers(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitNormalTypeBody(NormalTypeBody node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(NormalTypeBody.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitNormalTypeBody(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitNullLiteral(NullLiteral node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(NullLiteral.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitNullLiteral(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitPackageDeclaration(PackageDeclaration node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(PackageDeclaration.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitPackageDeclaration(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitParseArtefact(Node node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Node.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitParseArtefact(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitReturn(Return node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Return.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitReturn(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitSelect(Select node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Select.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitSelect(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitStaticInitializer(StaticInitializer node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(StaticInitializer.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitStaticInitializer(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitStringLiteral(StringLiteral node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(StringLiteral.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitStringLiteral(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitSuper(Super node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Super.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitSuper(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(SuperConstructorInvocation.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitSuperConstructorInvocation(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitSwitch(Switch node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Switch.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitSwitch(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitSynchronized(Synchronized node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Synchronized.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitSynchronized(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitThis(This node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(This.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitThis(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitThrow(Throw node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Throw.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitThrow(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitTry(Try node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(Try.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitTry(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitTypeReference(TypeReference node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(TypeReference.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitTypeReference(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitTypeReferencePart(TypeReferencePart node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(TypeReferencePart.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitTypeReferencePart(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitTypeVariable(TypeVariable node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(TypeVariable.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitTypeVariable(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitUnaryExpression(UnaryExpression node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(UnaryExpression.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitUnaryExpression(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitVariableDeclaration(VariableDeclaration node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(VariableDeclaration.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitVariableDeclaration(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitVariableDefinition(VariableDefinition node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(VariableDefinition.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitVariableDefinition(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitVariableDefinitionEntry(VariableDefinitionEntry node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(VariableDefinitionEntry.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitVariableDefinitionEntry(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitVariableReference(VariableReference node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(VariableReference.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitVariableReference(node);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public boolean visitWhile(While node) {
-            List<VisitingDetector> list = mNodeTypeDetectors.get(While.class);
-            if (list != null) {
-                for (VisitingDetector v : list) {
-                    v.getVisitor().visitWhile(node);
-                }
-            }
-            return false;
-        }
-    }
-
-    /** Performs common AST searches for method calls and R-type-field references.
-     * Note that this is a specialized form of the {@link DispatchVisitor}. */
-    private class DelegatingJavaVisitor extends DispatchVisitor {
-        private final JavaContext mContext;
-        private final boolean mVisitResources;
-        private final boolean mVisitMethods;
-
-        public DelegatingJavaVisitor(JavaContext context) {
-            mContext = context;
-
-            mVisitMethods = !mMethodDetectors.isEmpty();
-            mVisitResources = !mResourceFieldDetectors.isEmpty();
-        }
-
-        @Override
-        public boolean visitSelect(Select node) {
-            if (mVisitResources) {
-                // R.type.name
-                if (node.astOperand() instanceof Select) {
-                    Select select = (Select) node.astOperand();
-                    if (select.astOperand() instanceof VariableReference) {
-                        VariableReference reference = (VariableReference) select.astOperand();
-                        if (reference.astIdentifier().astValue().equals(R_CLASS)) {
-                            String type = select.astIdentifier().astValue();
-                            String name = node.astIdentifier().astValue();
-
-                            // R -could- be referenced locally and really have been
-                            // imported as "import android.R;" in the import statements,
-                            // but this is not recommended (and in fact there's a specific
-                            // lint rule warning against it)
-                            boolean isFramework = false;
-
-                            for (VisitingDetector v : mResourceFieldDetectors) {
-                                JavaScanner detector = v.getJavaScanner();
-                                detector.visitResourceReference(mContext, v.getVisitor(),
-                                        node, type, name, isFramework);
-                            }
-
-                            return super.visitSelect(node);
-                        }
-                    }
-                }
-
-                // Arbitrary packages -- android.R.type.name, foo.bar.R.type.name
-                if (node.astIdentifier().astValue().equals(R_CLASS)) {
-                    Node parent = node.getParent();
-                    if (parent instanceof Select) {
-                        Node grandParent = parent.getParent();
-                        if (grandParent instanceof Select) {
-                            Select select = (Select) grandParent;
-                            String name = select.astIdentifier().astValue();
-                            Expression typeOperand = select.astOperand();
-                            if (typeOperand instanceof Select) {
-                                Select typeSelect = (Select) typeOperand;
-                                String type = typeSelect.astIdentifier().astValue();
-                                boolean isFramework =
-                                        node.astIdentifier().astValue().equals(ANDROID_PKG);
-                                for (VisitingDetector v : mResourceFieldDetectors) {
-                                    JavaScanner detector = v.getJavaScanner();
-                                    detector.visitResourceReference(mContext, v.getVisitor(),
-                                            node, type, name, isFramework);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-
-            return super.visitSelect(node);
-        }
-
-        @Override
-        public boolean visitMethodInvocation(MethodInvocation node) {
-            if (mVisitMethods) {
-                String methodName = node.astName().getDescription();
-                List<VisitingDetector> list = mMethodDetectors.get(methodName);
-                if (list != null) {
-                    for (VisitingDetector v : list) {
-                        v.getJavaScanner().visitMethod(mContext, v.getVisitor(), node);
-                    }
-                }
-            }
-
-            return super.visitMethodInvocation(node);
-        }
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/LintClient.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/LintClient.java
deleted file mode 100644
index b8118b7..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/LintClient.java
+++ /dev/null
@@ -1,691 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import static com.android.SdkConstants.CLASS_FOLDER;
-import static com.android.SdkConstants.DOT_JAR;
-import static com.android.SdkConstants.GEN_FOLDER;
-import static com.android.SdkConstants.LIBS_FOLDER;
-import static com.android.SdkConstants.RES_FOLDER;
-import static com.android.SdkConstants.SRC_FOLDER;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.SdkManager;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Project;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.utils.StdLogger;
-import com.android.utils.StdLogger.Level;
-import com.google.common.annotations.Beta;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.io.Files;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-/**
- * Information about the tool embedding the lint analyzer. IDEs and other tools
- * implementing lint support will extend this to integrate logging, displaying errors,
- * etc.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public abstract class LintClient {
-    private static final String PROP_BIN_DIR  = "com.android.tools.lint.bindir";  //$NON-NLS-1$
-
-    /**
-     * Returns a configuration for use by the given project. The configuration
-     * provides information about which issues are enabled, any customizations
-     * to the severity of an issue, etc.
-     * <p>
-     * By default this method returns a {@link DefaultConfiguration}.
-     *
-     * @param project the project to obtain a configuration for
-     * @return a configuration, never null.
-     */
-    public Configuration getConfiguration(@NonNull Project project) {
-        return DefaultConfiguration.create(this, project, null);
-    }
-
-    /**
-     * Report the given issue. This method will only be called if the configuration
-     * provided by {@link #getConfiguration(Project)} has reported the corresponding
-     * issue as enabled and has not filtered out the issue with its
-     * {@link Configuration#ignore(Context, Issue, Location, String, Object)} method.
-     * <p>
-     *
-     * @param context the context used by the detector when the issue was found
-     * @param issue the issue that was found
-     * @param severity the severity of the issue
-     * @param location the location of the issue
-     * @param message the associated user message
-     * @param data optional extra data for a discovered issue, or null. The
-     *            content depends on the specific issue. Detectors can pass
-     *            extra info here which automatic fix tools etc can use to
-     *            extract relevant information instead of relying on parsing the
-     *            error message text. See each detector for details on which
-     *            data if any is supplied for a given issue.
-     */
-    public abstract void report(
-            @NonNull Context context,
-            @NonNull Issue issue,
-            @NonNull Severity severity,
-            @Nullable Location location,
-            @NonNull String message,
-            @Nullable Object data);
-
-    /**
-     * Send an exception or error message (with warning severity) to the log
-     *
-     * @param exception the exception, possibly null
-     * @param format the error message using {@link String#format} syntax, possibly null
-     *    (though in that case the exception should not be null)
-     * @param args any arguments for the format string
-     */
-    public void log(
-            @Nullable Throwable exception,
-            @Nullable String format,
-            @Nullable Object... args) {
-        log(Severity.WARNING, exception, format, args);
-    }
-
-    /**
-     * Send an exception or error message to the log
-     *
-     * @param severity the severity of the warning
-     * @param exception the exception, possibly null
-     * @param format the error message using {@link String#format} syntax, possibly null
-     *    (though in that case the exception should not be null)
-     * @param args any arguments for the format string
-     */
-    public abstract void log(
-            @NonNull Severity severity,
-            @Nullable Throwable exception,
-            @Nullable String format,
-            @Nullable Object... args);
-
-    /**
-     * Returns a {@link IDomParser} to use to parse XML
-     *
-     * @return a new {@link IDomParser}, or null if this client does not support
-     *         XML analysis
-     */
-    @Nullable
-    public abstract IDomParser getDomParser();
-
-    /**
-     * Returns a {@link IJavaParser} to use to parse Java
-     *
-     * @return a new {@link IJavaParser}, or null if this client does not
-     *         support Java analysis
-     */
-    @Nullable
-    public abstract IJavaParser getJavaParser();
-
-    /**
-     * Returns an optimal detector, if applicable. By default, just returns the
-     * original detector, but tools can replace detectors using this hook with a version
-     * that takes advantage of native capabilities of the tool.
-     *
-     * @param detectorClass the class of the detector to be replaced
-     * @return the new detector class, or just the original detector (not null)
-     */
-    @NonNull
-    public Class<? extends Detector> replaceDetector(
-            @NonNull Class<? extends Detector> detectorClass) {
-        return detectorClass;
-    }
-
-    /**
-     * Reads the given text file and returns the content as a string
-     *
-     * @param file the file to read
-     * @return the string to return, never null (will be empty if there is an
-     *         I/O error)
-     */
-    @NonNull
-    public abstract String readFile(@NonNull File file);
-
-    /**
-     * Reads the given binary file and returns the content as a byte array.
-     * By default this method will read the bytes from the file directly,
-     * but this can be customized by a client if for example I/O could be
-     * held in memory and not flushed to disk yet.
-     *
-     * @param file the file to read
-     * @return the bytes in the file, never null
-     * @throws IOException if the file does not exist, or if the file cannot be
-     *             read for some reason
-     */
-    @NonNull
-    public byte[] readBytes(@NonNull File file) throws IOException {
-        return Files.toByteArray(file);
-    }
-
-    /**
-     * Returns the list of source folders for Java source files
-     *
-     * @param project the project to look up Java source file locations for
-     * @return a list of source folders to search for .java files
-     */
-    @NonNull
-    public List<File> getJavaSourceFolders(@NonNull Project project) {
-        return getClassPath(project).getSourceFolders();
-    }
-
-    /**
-     * Returns the list of output folders for class files
-     *
-     * @param project the project to look up class file locations for
-     * @return a list of output folders to search for .class files
-     */
-    @NonNull
-    public List<File> getJavaClassFolders(@NonNull Project project) {
-        return getClassPath(project).getClassFolders();
-
-    }
-
-    /**
-     * Returns the list of Java libraries
-     *
-     * @param project the project to look up jar dependencies for
-     * @return a list of jar dependencies containing .class files
-     */
-    @NonNull
-    public List<File> getJavaLibraries(@NonNull Project project) {
-        return getClassPath(project).getLibraries();
-    }
-
-    /**
-     * Returns the resource folders.
-     *
-     * @param project the project to look up the resource folder for
-     * @return a list of files pointing to the resource folders, possibly empty
-     */
-    @NonNull
-    public List<File> getResourceFolders(@NonNull Project project) {
-        File res = new File(project.getDir(), RES_FOLDER);
-        if (res.exists()) {
-            return Collections.singletonList(res);
-        }
-
-        return Collections.emptyList();
-    }
-
-    /**
-     * Returns the {@link SdkInfo} to use for the given project.
-     *
-     * @param project the project to look up an {@link SdkInfo} for
-     * @return an {@link SdkInfo} for the project
-     */
-    @NonNull
-    public SdkInfo getSdkInfo(@NonNull Project project) {
-        // By default no per-platform SDK info
-        return new DefaultSdkInfo();
-    }
-
-    /**
-     * Returns a suitable location for storing cache files. Note that the
-     * directory may not exist.
-     *
-     * @param create if true, attempt to create the cache dir if it does not
-     *            exist
-     * @return a suitable location for storing cache files, which may be null if
-     *         the create flag was false, or if for some reason the directory
-     *         could not be created
-     */
-    @Nullable
-    public File getCacheDir(boolean create) {
-        String home = System.getProperty("user.home");
-        String relative = ".android" + File.separator + "cache"; //$NON-NLS-1$ //$NON-NLS-2$
-        File dir = new File(home, relative);
-        if (create && !dir.exists()) {
-            if (!dir.mkdirs()) {
-                return null;
-            }
-        }
-        return dir;
-    }
-
-    /**
-     * Returns the File corresponding to the system property or the environment variable
-     * for {@link #PROP_BIN_DIR}.
-     * This property is typically set by the SDK/tools/lint[.bat] wrapper.
-     * It denotes the path of the wrapper on disk.
-     *
-     * @return A new File corresponding to {@link LintClient#PROP_BIN_DIR} or null.
-     */
-    @Nullable
-    private static File getLintBinDir() {
-        // First check the Java properties (e.g. set using "java -jar ... -Dname=value")
-        String path = System.getProperty(PROP_BIN_DIR);
-        if (path == null || path.isEmpty()) {
-            // If not found, check environment variables.
-            path = System.getenv(PROP_BIN_DIR);
-        }
-        if (path != null && !path.isEmpty()) {
-            return new File(path);
-        }
-        return null;
-    }
-
-    /**
-     * Returns the File pointing to the user's SDK install area. This is generally
-     * the root directory containing the lint tool (but also platforms/ etc).
-     *
-     * @return a file pointing to the user's install area
-     */
-    @Nullable
-    public File getSdkHome() {
-        File binDir = getLintBinDir();
-        if (binDir != null) {
-            assert binDir.getName().equals("tools");
-
-            File root = binDir.getParentFile();
-            if (root != null && root.isDirectory()) {
-                return root;
-            }
-        }
-
-        String home = System.getenv("ANDROID_HOME"); //$NON-NLS-1$
-        if (home != null) {
-            return new File(home);
-        }
-
-        return null;
-    }
-
-    /**
-     * Locates an SDK resource (relative to the SDK root directory).
-     * <p>
-     * TODO: Consider switching to a {@link URL} return type instead.
-     *
-     * @param relativePath A relative path (using {@link File#separator} to
-     *            separate path components) to the given resource
-     * @return a {@link File} pointing to the resource, or null if it does not
-     *         exist
-     */
-    @Nullable
-    public File findResource(@NonNull String relativePath) {
-        File top = getSdkHome();
-        if (top == null) {
-            throw new IllegalArgumentException("Lint must be invoked with the System property "
-                   + PROP_BIN_DIR + " pointing to the ANDROID_SDK tools directory");
-        }
-
-        File file = new File(top, relativePath);
-        if (file.exists()) {
-            return file;
-        } else {
-            return null;
-        }
-    }
-
-    private Map<Project, ClassPathInfo> mProjectInfo;
-
-    /**
-     * Information about class paths (sources, class files and libraries)
-     * usually associated with a project.
-     */
-    protected static class ClassPathInfo {
-        private final List<File> mClassFolders;
-        private final List<File> mSourceFolders;
-        private final List<File> mLibraries;
-
-        public ClassPathInfo(
-                @NonNull List<File> sourceFolders,
-                @NonNull List<File> classFolders,
-                @NonNull List<File> libraries) {
-            mSourceFolders = sourceFolders;
-            mClassFolders = classFolders;
-            mLibraries = libraries;
-        }
-
-        @NonNull
-        public List<File> getSourceFolders() {
-            return mSourceFolders;
-        }
-
-        @NonNull
-        public List<File> getClassFolders() {
-            return mClassFolders;
-        }
-
-        @NonNull
-        public List<File> getLibraries() {
-            return mLibraries;
-        }
-    }
-
-    /**
-     * Considers the given project as an Eclipse project and returns class path
-     * information for the project - the source folder(s), the output folder and
-     * any libraries.
-     * <p>
-     * Callers will not cache calls to this method, so if it's expensive to compute
-     * the classpath info, this method should perform its own caching.
-     *
-     * @param project the project to look up class path info for
-     * @return a class path info object, never null
-     */
-    @NonNull
-    protected ClassPathInfo getClassPath(@NonNull Project project) {
-        ClassPathInfo info;
-        if (mProjectInfo == null) {
-            mProjectInfo = Maps.newHashMap();
-            info = null;
-        } else {
-            info = mProjectInfo.get(project);
-        }
-
-        if (info == null) {
-            List<File> sources = new ArrayList<File>(2);
-            List<File> classes = new ArrayList<File>(1);
-            List<File> libraries = new ArrayList<File>();
-
-            File projectDir = project.getDir();
-            File classpathFile = new File(projectDir, ".classpath"); //$NON-NLS-1$
-            if (classpathFile.exists()) {
-                String classpathXml = readFile(classpathFile);
-                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-                InputSource is = new InputSource(new StringReader(classpathXml));
-                factory.setNamespaceAware(false);
-                factory.setValidating(false);
-                try {
-                    DocumentBuilder builder = factory.newDocumentBuilder();
-                    Document document = builder.parse(is);
-                    NodeList tags = document.getElementsByTagName("classpathentry"); //$NON-NLS-1$
-                    for (int i = 0, n = tags.getLength(); i < n; i++) {
-                        Element element = (Element) tags.item(i);
-                        String kind = element.getAttribute("kind"); //$NON-NLS-1$
-                        List<File> addTo = null;
-                        if (kind.equals("src")) {            //$NON-NLS-1$
-                            addTo = sources;
-                        } else if (kind.equals("output")) {  //$NON-NLS-1$
-                            addTo = classes;
-                        } else if (kind.equals("lib")) {     //$NON-NLS-1$
-                            addTo = libraries;
-                        }
-                        if (addTo != null) {
-                            String path = element.getAttribute("path"); //$NON-NLS-1$
-                            File folder = new File(projectDir, path);
-                            if (folder.exists()) {
-                                addTo.add(folder);
-                            }
-                        }
-                    }
-                } catch (Exception e) {
-                    log(null, null);
-                }
-            }
-
-            // Add in libraries that aren't specified in the .classpath file
-            File libs = new File(project.getDir(), LIBS_FOLDER);
-            if (libs.isDirectory()) {
-                File[] jars = libs.listFiles();
-                if (jars != null) {
-                    for (File jar : jars) {
-                        if (LintUtils.endsWith(jar.getPath(), DOT_JAR)
-                                && !libraries.contains(jar)) {
-                            libraries.add(jar);
-                        }
-                    }
-                }
-            }
-
-            if (classes.isEmpty()) {
-                File folder = new File(projectDir, CLASS_FOLDER);
-                if (folder.exists()) {
-                    classes.add(folder);
-                } else {
-                    // Maven checks
-                    folder = new File(projectDir,
-                            "target" + File.separator + "classes"); //$NON-NLS-1$ //$NON-NLS-2$
-                    if (folder.exists()) {
-                        classes.add(folder);
-
-                        // If it's maven, also correct the source path, "src" works but
-                        // it's in a more specific subfolder
-                        if (sources.isEmpty()) {
-                            File src = new File(projectDir,
-                                    "src" + File.separator     //$NON-NLS-1$
-                                    + "main" + File.separator  //$NON-NLS-1$
-                                    + "java");                 //$NON-NLS-1$
-                            if (src.exists()) {
-                                sources.add(src);
-                            } else {
-                                src = new File(projectDir, SRC_FOLDER);
-                                if (src.exists()) {
-                                    sources.add(src);
-                                }
-                            }
-
-                            File gen = new File(projectDir,
-                                    "target" + File.separator                  //$NON-NLS-1$
-                                    + "generated-sources" + File.separator     //$NON-NLS-1$
-                                    + "r");                                    //$NON-NLS-1$
-                            if (gen.exists()) {
-                                sources.add(gen);
-                            }
-                        }
-                    }
-                }
-            }
-
-            // Fallback, in case there is no Eclipse project metadata here
-            if (sources.isEmpty()) {
-                File src = new File(projectDir, SRC_FOLDER);
-                if (src.exists()) {
-                    sources.add(src);
-                }
-                File gen = new File(projectDir, GEN_FOLDER);
-                if (gen.exists()) {
-                    sources.add(gen);
-                }
-            }
-
-            info = new ClassPathInfo(sources, classes, libraries);
-            mProjectInfo.put(project, info);
-        }
-
-        return info;
-    }
-
-    /**
-     * A map from directory to existing projects, or null. Used to ensure that
-     * projects are unique for a directory (in case we process a library project
-     * before its including project for example)
-     */
-    private Map<File, Project> mDirToProject;
-
-    /**
-     * Returns a project for the given directory. This should return the same
-     * project for the same directory if called repeatedly.
-     *
-     * @param dir the directory containing the project
-     * @param referenceDir See {@link Project#getReferenceDir()}.
-     * @return a project, never null
-     */
-    @NonNull
-    public Project getProject(@NonNull File dir, @NonNull File referenceDir) {
-        if (mDirToProject == null) {
-            mDirToProject = new HashMap<File, Project>();
-        }
-
-        File canonicalDir = dir;
-        try {
-            // Attempt to use the canonical handle for the file, in case there
-            // are symlinks etc present (since when handling library projects,
-            // we also call getCanonicalFile to compute the result of appending
-            // relative paths, which can then resolve symlinks and end up with
-            // a different prefix)
-            canonicalDir = dir.getCanonicalFile();
-        } catch (IOException ioe) {
-            // pass
-        }
-
-        Project project = mDirToProject.get(canonicalDir);
-        if (project != null) {
-            return project;
-        }
-
-        project = createProject(dir, referenceDir);
-        mDirToProject.put(canonicalDir, project);
-        return project;
-    }
-
-    private Set<File> mProjectDirs = Sets.newHashSet();
-
-    /**
-     * Create a project for the given directory
-     * @param dir the root directory of the project
-     * @param referenceDir See {@link Project#getReferenceDir()}.
-     * @return a new project
-     */
-    @NonNull
-    protected Project createProject(@NonNull File dir, @NonNull File referenceDir) {
-        if (mProjectDirs.contains(dir)) {
-            throw new CircularDependencyException(
-                "Circular library dependencies; check your project.properties files carefully");
-        }
-        mProjectDirs.add(dir);
-        return Project.create(this, dir, referenceDir);
-    }
-
-    /**
-     * Returns the name of the given project
-     *
-     * @param project the project to look up
-     * @return the name of the project
-     */
-    @NonNull
-    public String getProjectName(@NonNull Project project) {
-        return project.getDir().getName();
-    }
-
-    private IAndroidTarget[] mTargets;
-
-    /**
-     * Returns all the {@link IAndroidTarget} versions installed in the user's SDK install
-     * area.
-     *
-     * @return all the installed targets
-     */
-    @NonNull
-    public IAndroidTarget[] getTargets() {
-        if (mTargets == null) {
-            File sdkHome = getSdkHome();
-            if (sdkHome != null) {
-                StdLogger log = new StdLogger(Level.WARNING);
-                SdkManager manager = SdkManager.createManager(sdkHome.getPath(), log);
-                mTargets = manager.getTargets();
-            } else {
-                mTargets = new IAndroidTarget[0];
-            }
-        }
-
-        return mTargets;
-    }
-
-    /**
-     * Returns the highest known API level.
-     *
-     * @return the highest known API level
-     */
-    public int getHighestKnownApiLevel() {
-        int max = SdkConstants.HIGHEST_KNOWN_API;
-
-        for (IAndroidTarget target : getTargets()) {
-            if (target.isPlatform()) {
-                int api = target.getVersion().getApiLevel();
-                if (api > max && !target.getVersion().isPreview()) {
-                    max = api;
-                }
-            }
-        }
-
-        return max;
-    }
-
-    /**
-     * Returns the super class for the given class name, which should be in VM
-     * format (e.g. java/lang/Integer, not java.lang.Integer, and using $ rather
-     * than . for inner classes). If the super class is not known, returns null.
-     * <p>
-     * This is typically not necessary, since lint analyzes all the available
-     * classes. However, if this lint client is invoking lint in an incremental
-     * context (for example, an IDE offering incremental analysis of a single
-     * source file), then lint may not see all the classes, and the client can
-     * provide its own super class lookup.
-     *
-     * @param project the project containing the class
-     * @param name the fully qualified class name
-     * @return the corresponding super class name (in VM format), or null if not
-     *         known
-     */
-    @Nullable
-    public String getSuperClass(@NonNull Project project, @NonNull String name) {
-        return null;
-    }
-
-    /**
-     * Checks whether the given name is a subclass of the given super class. If
-     * the method does not know, it should return null, and otherwise return
-     * {@link Boolean#TRUE} or {@link Boolean#FALSE}.
-     * <p>
-     * Note that the class names are in internal VM format (java/lang/Integer,
-     * not java.lang.Integer, and using $ rather than . for inner classes).
-     *
-     * @param project the project context to look up the class in
-     * @param name the name of the class to be checked
-     * @param superClassName the name of the super class to compare to
-     * @return true if the class of the given name extends the given super class
-     */
-    @Nullable
-    public Boolean isSubclassOf(
-            @NonNull Project project,
-            @NonNull String name, @NonNull
-            String superClassName) {
-        return null;
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/LintDriver.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/LintDriver.java
deleted file mode 100644
index dc62b5d..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/LintDriver.java
+++ /dev/null
@@ -1,2221 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import static com.android.SdkConstants.ANDROID_MANIFEST_XML;
-import static com.android.SdkConstants.ATTR_IGNORE;
-import static com.android.SdkConstants.DOT_CLASS;
-import static com.android.SdkConstants.DOT_JAR;
-import static com.android.SdkConstants.DOT_JAVA;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.FN_PROJECT_PROGUARD_FILE;
-import static com.android.SdkConstants.OLD_PROGUARD_FILE;
-import static com.android.SdkConstants.RES_FOLDER;
-import static com.android.SdkConstants.SUPPRESS_ALL;
-import static com.android.SdkConstants.SUPPRESS_LINT;
-import static com.android.SdkConstants.TOOLS_URI;
-import static org.objectweb.asm.Opcodes.ASM4;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.resources.ResourceFolderType;
-import com.android.sdklib.IAndroidTarget;
-import com.android.tools.lint.client.api.LintListener.EventType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Project;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.annotations.Beta;
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Multimap;
-import com.google.common.io.ByteStreams;
-import com.google.common.io.Closeables;
-
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.AnnotationNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.FieldInsnNode;
-import org.objectweb.asm.tree.FieldNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Deque;
-import java.util.EnumMap;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-import lombok.ast.Annotation;
-import lombok.ast.AnnotationElement;
-import lombok.ast.AnnotationValue;
-import lombok.ast.ArrayInitializer;
-import lombok.ast.ClassDeclaration;
-import lombok.ast.ConstructorDeclaration;
-import lombok.ast.Expression;
-import lombok.ast.MethodDeclaration;
-import lombok.ast.Modifiers;
-import lombok.ast.Node;
-import lombok.ast.StrictListAccessor;
-import lombok.ast.StringLiteral;
-import lombok.ast.TypeReference;
-import lombok.ast.VariableDefinition;
-
-/**
- * Analyzes Android projects and files
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public class LintDriver {
-    /**
-     * Max number of passes to run through the lint runner if requested by
-     * {@link #requestRepeat}
-     */
-    private static final int MAX_PHASES = 3;
-    private static final String SUPPRESS_LINT_VMSIG = '/' + SUPPRESS_LINT + ';';
-
-    private final LintClient mClient;
-    private final IssueRegistry mRegistry;
-    private volatile boolean mCanceled;
-    private EnumSet<Scope> mScope;
-    private List<? extends Detector> mApplicableDetectors;
-    private Map<Scope, List<Detector>> mScopeDetectors;
-    private List<LintListener> mListeners;
-    private int mPhase;
-    private List<Detector> mRepeatingDetectors;
-    private EnumSet<Scope> mRepeatScope;
-    private Project[] mCurrentProjects;
-    private Project mCurrentProject;
-    private boolean mAbbreviating = true;
-    private boolean mParserErrors;
-    private Map<Object,Object> mProperties;
-
-    /**
-     * Creates a new {@link LintDriver}
-     *
-     * @param registry The registry containing issues to be checked
-     * @param client the tool wrapping the analyzer, such as an IDE or a CLI
-     */
-    public LintDriver(@NonNull IssueRegistry registry, @NonNull LintClient client) {
-        mRegistry = registry;
-        mClient = new LintClientWrapper(client);
-    }
-
-    /** Cancels the current lint run as soon as possible */
-    public void cancel() {
-        mCanceled = true;
-    }
-
-    /**
-     * Returns the scope for the lint job
-     *
-     * @return the scope, never null
-     */
-    @NonNull
-    public EnumSet<Scope> getScope() {
-        return mScope;
-    }
-
-    /**
-     * Returns the lint client requesting the lint check
-     *
-     * @return the client, never null
-     */
-    @NonNull
-    public LintClient getClient() {
-        return mClient;
-    }
-
-    /**
-     * Records a property for later retrieval by {@link #getProperty(Object)}
-     *
-     * @param key the key to associate the value with
-     * @param value the value, or null to remove a previous binding
-     */
-    public void putProperty(@NonNull Object key, @Nullable Object value) {
-        if (mProperties == null) {
-            mProperties = Maps.newHashMap();
-        }
-        if (value == null) {
-            mProperties.remove(key);
-        } else {
-            mProperties.put(key, value);
-        }
-    }
-
-    /**
-     * Returns the property previously stored with the given key, or null
-     *
-     * @param key the key
-     * @return the value or null if not found
-     */
-    @Nullable
-    public Object getProperty(@NonNull Object key) {
-        if (mProperties != null) {
-            return mProperties.get(key);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the current phase number. The first pass is numbered 1. Only one pass
-     * will be performed, unless a {@link Detector} calls {@link #requestRepeat}.
-     *
-     * @return the current phase, usually 1
-     */
-    public int getPhase() {
-        return mPhase;
-    }
-
-    /**
-     * Returns the current {@link IssueRegistry}.
-     *
-     * @return the current {@link IssueRegistry}
-     */
-    @NonNull
-    public IssueRegistry getRegistry() {
-        return mRegistry;
-    }
-
-    /**
-     * Returns the project containing a given file, or null if not found. This searches
-     * only among the currently checked project and its library projects, not among all
-     * possible projects being scanned sequentially.
-     *
-     * @param file the file to be checked
-     * @return the corresponding project, or null if not found
-     */
-    @Nullable
-    public Project findProjectFor(@NonNull File file) {
-        if (mCurrentProjects != null) {
-            if (mCurrentProjects.length == 1) {
-                return mCurrentProjects[0];
-            }
-            String path = file.getPath();
-            for (Project project : mCurrentProjects) {
-                if (path.startsWith(project.getDir().getPath())) {
-                    return project;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Sets whether lint should abbreviate output when appropriate.
-     *
-     * @param abbreviating true to abbreviate output, false to include everything
-     */
-    public void setAbbreviating(boolean abbreviating) {
-        mAbbreviating = abbreviating;
-    }
-
-    /**
-     * Returns whether lint should abbreviate output when appropriate.
-     *
-     * @return true if lint should abbreviate output, false when including everything
-     */
-    public boolean isAbbreviating() {
-        return mAbbreviating;
-    }
-
-    /**
-     * Returns whether lint has encountered any files with fatal parser errors
-     * (e.g. broken source code, or even broken parsers)
-     * <p>
-     * This is useful for checks that need to make sure they've seen all data in
-     * order to be conclusive (such as an unused resource check).
-     *
-     * @return true if any files were not properly processed because they
-     *         contained parser errors
-     */
-    public boolean hasParserErrors() {
-        return mParserErrors;
-    }
-
-    /**
-     * Sets whether lint has encountered files with fatal parser errors.
-     *
-     * @see #hasParserErrors()
-     * @param hasErrors whether parser errors have been encountered
-     */
-    public void setHasParserErrors(boolean hasErrors) {
-        mParserErrors = hasErrors;
-    }
-
-    /**
-     * Returns the projects being analyzed
-     *
-     * @return the projects being analyzed
-     */
-    @NonNull
-    public List<Project> getProjects() {
-        if (mCurrentProjects != null) {
-            return Arrays.asList(mCurrentProjects);
-        }
-        return Collections.emptyList();
-    }
-
-    /**
-     * Analyze the given file (which can point to an Android project). Issues found
-     * are reported to the associated {@link LintClient}.
-     *
-     * @param files the files and directories to be analyzed
-     * @param scope the scope of the analysis; detectors with a wider scope will
-     *            not be run. If null, the scope will be inferred from the files.
-     */
-    public void analyze(@NonNull List<File> files, @Nullable EnumSet<Scope> scope) {
-        mCanceled = false;
-        mScope = scope;
-
-        Collection<Project> projects;
-        try {
-            projects = computeProjects(files);
-        } catch (CircularDependencyException e) {
-            mCurrentProject = e.getProject();
-            if (mCurrentProject != null) {
-                File file = e.getLocation().getFile();
-                Context context = new Context(this, mCurrentProject, null, file);
-                context.report(IssueRegistry.LINT_ERROR, e.getLocation(), e.getMessage(), null);
-                mCurrentProject = null;
-            }
-            return;
-        }
-        if (projects.isEmpty()) {
-            mClient.log(null, "No projects found for %1$s", files.toString());
-            return;
-        }
-        if (mCanceled) {
-            return;
-        }
-
-        if (mScope == null) {
-            // Infer the scope
-            mScope = EnumSet.noneOf(Scope.class);
-            for (Project project : projects) {
-                List<File> subset = project.getSubset();
-                if (subset != null) {
-                    for (File file : subset) {
-                        String name = file.getName();
-                        if (name.equals(ANDROID_MANIFEST_XML)) {
-                            mScope.add(Scope.MANIFEST);
-                        } else if (name.endsWith(DOT_XML)) {
-                            mScope.add(Scope.RESOURCE_FILE);
-                        } else if (name.equals(RES_FOLDER)
-                                || file.getParent().equals(RES_FOLDER)) {
-                            mScope.add(Scope.ALL_RESOURCE_FILES);
-                            mScope.add(Scope.RESOURCE_FILE);
-                        } else if (name.endsWith(DOT_JAVA)) {
-                            mScope.add(Scope.JAVA_FILE);
-                        } else if (name.endsWith(DOT_CLASS)) {
-                            mScope.add(Scope.CLASS_FILE);
-                        } else if (name.equals(OLD_PROGUARD_FILE)
-                                || name.equals(FN_PROJECT_PROGUARD_FILE)) {
-                            mScope.add(Scope.PROGUARD_FILE);
-                        }
-                    }
-                } else {
-                    // Specified a full project: just use the full project scope
-                    mScope = Scope.ALL;
-                    break;
-                }
-            }
-        }
-
-        fireEvent(EventType.STARTING, null);
-
-        for (Project project : projects) {
-            mPhase = 1;
-
-            // The set of available detectors varies between projects
-            computeDetectors(project);
-
-            if (mApplicableDetectors.isEmpty()) {
-                // No detectors enabled in this project: skip it
-                continue;
-            }
-
-            checkProject(project);
-            if (mCanceled) {
-                break;
-            }
-
-            runExtraPhases(project);
-        }
-
-        fireEvent(mCanceled ? EventType.CANCELED : EventType.COMPLETED, null);
-    }
-
-    private void runExtraPhases(Project project) {
-        // Did any detectors request another phase?
-        if (mRepeatingDetectors != null) {
-            // Yes. Iterate up to MAX_PHASES times.
-
-            // During the extra phases, we might be narrowing the scope, and setting it in the
-            // scope field such that detectors asking about the available scope will get the
-            // correct result. However, we need to restore it to the original scope when this
-            // is done in case there are other projects that will be checked after this, since
-            // the repeated phases is done *per project*, not after all projects have been
-            // processed.
-            EnumSet<Scope> oldScope = mScope;
-
-            do {
-                mPhase++;
-                fireEvent(EventType.NEW_PHASE,
-                        new Context(this, project, null, project.getDir()));
-
-                // Narrow the scope down to the set of scopes requested by
-                // the rules.
-                if (mRepeatScope == null) {
-                    mRepeatScope = Scope.ALL;
-                }
-                mScope = Scope.intersect(mScope, mRepeatScope);
-                if (mScope.isEmpty()) {
-                    break;
-                }
-
-                // Compute the detectors to use for this pass.
-                // Unlike the normal computeDetectors(project) call,
-                // this is going to use the existing instances, and include
-                // those that apply for the configuration.
-                computeRepeatingDetectors(mRepeatingDetectors, project);
-
-                if (mApplicableDetectors.isEmpty()) {
-                    // No detectors enabled in this project: skip it
-                    continue;
-                }
-
-                checkProject(project);
-                if (mCanceled) {
-                    break;
-                }
-            } while (mPhase < MAX_PHASES && mRepeatingDetectors != null);
-
-            mScope = oldScope;
-        }
-    }
-
-    private void computeRepeatingDetectors(List<Detector> detectors, Project project) {
-        // Ensure that the current visitor is recomputed
-        mCurrentFolderType = null;
-        mCurrentVisitor = null;
-
-        // Create map from detector class to issue such that we can
-        // compute applicable issues for each detector in the list of detectors
-        // to be repeated
-        List<Issue> issues = mRegistry.getIssues();
-        Multimap<Class<? extends Detector>, Issue> issueMap =
-                ArrayListMultimap.create(issues.size(), 3);
-        for (Issue issue : issues) {
-            issueMap.put(issue.getDetectorClass(), issue);
-        }
-
-        Map<Class<? extends Detector>, EnumSet<Scope>> detectorToScope =
-                new HashMap<Class<? extends Detector>, EnumSet<Scope>>();
-        Map<Scope, List<Detector>> scopeToDetectors =
-                new EnumMap<Scope, List<Detector>>(Scope.class);
-
-        List<Detector> detectorList = new ArrayList<Detector>();
-        // Compute the list of detectors (narrowed down from mRepeatingDetectors),
-        // and simultaneously build up the detectorToScope map which tracks
-        // the scopes each detector is affected by (this is used to populate
-        // the mScopeDetectors map which is used during iteration).
-        Configuration configuration = project.getConfiguration();
-        for (Detector detector : detectors) {
-            Class<? extends Detector> detectorClass = detector.getClass();
-            Collection<Issue> detectorIssues = issueMap.get(detectorClass);
-            if (detectorIssues != null) {
-                boolean add = false;
-                for (Issue issue : detectorIssues) {
-                    // The reason we have to check whether the detector is enabled
-                    // is that this is a per-project property, so when running lint in multiple
-                    // projects, a detector enabled only in a different project could have
-                    // requested another phase, and we end up in this project checking whether
-                    // the detector is enabled here.
-                    if (!configuration.isEnabled(issue)) {
-                        continue;
-                    }
-
-                    add = true; // Include detector if any of its issues are enabled
-
-                    EnumSet<Scope> s = detectorToScope.get(detectorClass);
-                    EnumSet<Scope> issueScope = issue.getScope();
-                    if (s == null) {
-                        detectorToScope.put(detectorClass, issueScope);
-                    } else if (!s.containsAll(issueScope)) {
-                        EnumSet<Scope> union = EnumSet.copyOf(s);
-                        union.addAll(issueScope);
-                        detectorToScope.put(detectorClass, union);
-                    }
-                }
-
-                if (add) {
-                    detectorList.add(detector);
-                    EnumSet<Scope> union = detectorToScope.get(detector.getClass());
-                    for (Scope s : union) {
-                        List<Detector> list = scopeToDetectors.get(s);
-                        if (list == null) {
-                            list = new ArrayList<Detector>();
-                            scopeToDetectors.put(s, list);
-                        }
-                        list.add(detector);
-                    }
-                }
-            }
-        }
-
-        mApplicableDetectors = detectorList;
-        mScopeDetectors = scopeToDetectors;
-        mRepeatingDetectors = null;
-        mRepeatScope = null;
-
-        validateScopeList();
-    }
-
-    private void computeDetectors(@NonNull Project project) {
-        // Ensure that the current visitor is recomputed
-        mCurrentFolderType = null;
-        mCurrentVisitor = null;
-
-        Configuration configuration = project.getConfiguration();
-        mScopeDetectors = new EnumMap<Scope, List<Detector>>(Scope.class);
-        mApplicableDetectors = mRegistry.createDetectors(mClient, configuration,
-                mScope, mScopeDetectors);
-
-        validateScopeList();
-    }
-
-    /** Development diagnostics only, run with assertions on */
-    @SuppressWarnings("all") // Turn off warnings for the intentional assertion side effect below
-    private void validateScopeList() {
-        boolean assertionsEnabled = false;
-        assert assertionsEnabled = true; // Intentional side-effect
-        if (assertionsEnabled) {
-            List<Detector> resourceFileDetectors = mScopeDetectors.get(Scope.RESOURCE_FILE);
-            if (resourceFileDetectors != null) {
-                for (Detector detector : resourceFileDetectors) {
-                    assert detector instanceof ResourceXmlDetector : detector;
-                }
-            }
-
-            List<Detector> manifestDetectors = mScopeDetectors.get(Scope.MANIFEST);
-            if (manifestDetectors != null) {
-                for (Detector detector : manifestDetectors) {
-                    assert detector instanceof Detector.XmlScanner : detector;
-                }
-            }
-            List<Detector> javaCodeDetectors = mScopeDetectors.get(Scope.ALL_JAVA_FILES);
-            if (javaCodeDetectors != null) {
-                for (Detector detector : javaCodeDetectors) {
-                    assert detector instanceof Detector.JavaScanner : detector;
-                }
-            }
-            List<Detector> javaFileDetectors = mScopeDetectors.get(Scope.JAVA_FILE);
-            if (javaFileDetectors != null) {
-                for (Detector detector : javaFileDetectors) {
-                    assert detector instanceof Detector.JavaScanner : detector;
-                }
-            }
-
-            List<Detector> classDetectors = mScopeDetectors.get(Scope.CLASS_FILE);
-            if (classDetectors != null) {
-                for (Detector detector : classDetectors) {
-                    assert detector instanceof Detector.ClassScanner : detector;
-                }
-            }
-
-            List<Detector> classCodeDetectors = mScopeDetectors.get(Scope.ALL_CLASS_FILES);
-            if (classCodeDetectors != null) {
-                for (Detector detector : classCodeDetectors) {
-                    assert detector instanceof Detector.ClassScanner : detector;
-                }
-            }
-
-            List<Detector> otherDetectors = mScopeDetectors.get(Scope.OTHER_SCOPE);
-            if (otherDetectors != null) {
-                for (Detector detector : otherDetectors) {
-                    assert detector instanceof Detector.OtherFileScanner : detector;
-                }
-            }
-        }
-    }
-
-    private void registerProjectFile(
-            @NonNull Map<File, Project> fileToProject,
-            @NonNull File file,
-            @NonNull File projectDir,
-            @NonNull File rootDir) {
-        fileToProject.put(file, mClient.getProject(projectDir, rootDir));
-    }
-
-    private Collection<Project> computeProjects(@NonNull List<File> files) {
-        // Compute list of projects
-        Map<File, Project> fileToProject = new HashMap<File, Project>();
-
-        File sharedRoot = null;
-
-        // Ensure that we have absolute paths such that if you lint
-        //  "foo bar" in "baz" we can show baz/ as the root
-        if (files.size() > 1) {
-            List<File> absolute = new ArrayList<File>(files.size());
-            for (File file : files) {
-                absolute.add(file.getAbsoluteFile());
-            }
-            files = absolute;
-
-            sharedRoot = LintUtils.getCommonParent(files);
-            if (sharedRoot != null && sharedRoot.getParentFile() == null) { // "/" ?
-                sharedRoot = null;
-            }
-        }
-
-
-        for (File file : files) {
-            if (file.isDirectory()) {
-                File rootDir = sharedRoot;
-                if (rootDir == null) {
-                    rootDir = file;
-                    if (files.size() > 1) {
-                        rootDir = file.getParentFile();
-                        if (rootDir == null) {
-                            rootDir = file;
-                        }
-                    }
-                }
-
-                // Figure out what to do with a directory. Note that the meaning of the
-                // directory can be ambiguous:
-                // If you pass a directory which is unknown, we don't know if we should
-                // search upwards (in case you're pointing at a deep java package folder
-                // within the project), or if you're pointing at some top level directory
-                // containing lots of projects you want to scan. We attempt to do the
-                // right thing, which is to see if you're pointing right at a project or
-                // right within it (say at the src/ or res/) folder, and if not, you're
-                // hopefully pointing at a project tree that you want to scan recursively.
-                if (LintUtils.isProjectDir(file)) {
-                    registerProjectFile(fileToProject, file, file, rootDir);
-                    continue;
-                } else {
-                    File parent = file.getParentFile();
-                    if (parent != null) {
-                        if (LintUtils.isProjectDir(parent)) {
-                            registerProjectFile(fileToProject, file, parent, parent);
-                            continue;
-                        } else {
-                            parent = parent.getParentFile();
-                            if (parent != null && LintUtils.isProjectDir(parent)) {
-                                registerProjectFile(fileToProject, file, parent, parent);
-                                continue;
-                            }
-                        }
-                    }
-
-                    // Search downwards for nested projects
-                    addProjects(file, fileToProject, rootDir);
-                }
-            } else {
-                // Pointed at a file: Search upwards for the containing project
-                File parent = file.getParentFile();
-                while (parent != null) {
-                    if (LintUtils.isProjectDir(parent)) {
-                        registerProjectFile(fileToProject, file, parent, parent);
-                        break;
-                    }
-                    parent = parent.getParentFile();
-                }
-            }
-
-            if (mCanceled) {
-                return Collections.emptySet();
-            }
-        }
-
-        for (Map.Entry<File, Project> entry : fileToProject.entrySet()) {
-            File file = entry.getKey();
-            Project project = entry.getValue();
-            if (!file.equals(project.getDir())) {
-                if (file.isDirectory()) {
-                    try {
-                        File dir = file.getCanonicalFile();
-                        if (dir.equals(project.getDir())) {
-                            continue;
-                        }
-                    } catch (IOException ioe) {
-                        // pass
-                    }
-                }
-
-                project.addFile(file);
-            }
-        }
-
-        // Partition the projects up such that we only return projects that aren't
-        // included by other projects (e.g. because they are library projects)
-
-        Collection<Project> allProjects = fileToProject.values();
-        Set<Project> roots = new HashSet<Project>(allProjects);
-        for (Project project : allProjects) {
-            roots.removeAll(project.getAllLibraries());
-        }
-
-        // Report issues for all projects that are explicitly referenced. We need to
-        // do this here, since the project initialization will mark all library
-        // projects as no-report projects by default.
-        for (Project project : allProjects) {
-            // Report issues for all projects explicitly listed or found via a directory
-            // traversal -- including library projects.
-            project.setReportIssues(true);
-        }
-
-        if (LintUtils.assertionsEnabled()) {
-            // Make sure that all the project directories are unique. This ensures
-            // that we didn't accidentally end up with different project instances
-            // for a library project discovered as a directory as well as one
-            // initialized from the library project dependency list
-            IdentityHashMap<Project, Project> projects =
-                    new IdentityHashMap<Project, Project>();
-            for (Project project : roots) {
-                projects.put(project, project);
-                for (Project library : project.getAllLibraries()) {
-                    projects.put(library, library);
-                }
-            }
-            Set<File> dirs = new HashSet<File>();
-            for (Project project : projects.keySet()) {
-                assert !dirs.contains(project.getDir());
-                dirs.add(project.getDir());
-            }
-        }
-
-        return roots;
-    }
-
-    private void addProjects(
-            @NonNull File dir,
-            @NonNull Map<File, Project> fileToProject,
-            @NonNull File rootDir) {
-        if (mCanceled) {
-            return;
-        }
-
-        if (LintUtils.isProjectDir(dir)) {
-            registerProjectFile(fileToProject, dir, dir, rootDir);
-        } else {
-            File[] files = dir.listFiles();
-            if (files != null) {
-                for (File file : files) {
-                    if (file.isDirectory()) {
-                        addProjects(file, fileToProject, rootDir);
-                    }
-                }
-            }
-        }
-    }
-
-    private void checkProject(@NonNull Project project) {
-        File projectDir = project.getDir();
-
-        Context projectContext = new Context(this, project, null, projectDir);
-        fireEvent(EventType.SCANNING_PROJECT, projectContext);
-
-        List<Project> allLibraries = project.getAllLibraries();
-        Set<Project> allProjects = new HashSet<Project>(allLibraries.size() + 1);
-        allProjects.add(project);
-        allProjects.addAll(allLibraries);
-        mCurrentProjects = allProjects.toArray(new Project[allProjects.size()]);
-
-        mCurrentProject = project;
-
-        for (Detector check : mApplicableDetectors) {
-            check.beforeCheckProject(projectContext);
-            if (mCanceled) {
-                return;
-            }
-        }
-
-        assert mCurrentProject == project;
-        runFileDetectors(project, project);
-
-        if (!Scope.checkSingleFile(mScope)) {
-            List<Project> libraries = project.getDirectLibraries();
-            for (Project library : libraries) {
-                Context libraryContext = new Context(this, library, project, projectDir);
-                fireEvent(EventType.SCANNING_LIBRARY_PROJECT, libraryContext);
-                mCurrentProject = library;
-
-                for (Detector check : mApplicableDetectors) {
-                    check.beforeCheckLibraryProject(libraryContext);
-                    if (mCanceled) {
-                        return;
-                    }
-                }
-                assert mCurrentProject == library;
-
-                runFileDetectors(library, project);
-                if (mCanceled) {
-                    return;
-                }
-
-                assert mCurrentProject == library;
-
-                for (Detector check : mApplicableDetectors) {
-                    check.afterCheckLibraryProject(libraryContext);
-                    if (mCanceled) {
-                        return;
-                    }
-                }
-            }
-        }
-
-        mCurrentProject = project;
-
-        for (Detector check : mApplicableDetectors) {
-            check.afterCheckProject(projectContext);
-            if (mCanceled) {
-                return;
-            }
-        }
-
-        if (mCanceled) {
-            mClient.report(
-                projectContext,
-                // Must provide an issue since API guarantees that the issue parameter
-                // is valid
-                Issue.create("Lint", "", "", Category.PERFORMANCE, 0, Severity.INFORMATIONAL, //$NON-NLS-1$
-                        Detector.class, EnumSet.noneOf(Scope.class)),
-                Severity.INFORMATIONAL,
-                null /*range*/,
-                "Lint canceled by user", null);
-        }
-
-        mCurrentProjects = null;
-    }
-
-    private void runFileDetectors(@NonNull Project project, @Nullable Project main) {
-        // Look up manifest information (but not for library projects)
-        File manifestFile = project.getManifestFile();
-        if (manifestFile != null) {
-            XmlContext context = new XmlContext(this, project, main, manifestFile, null);
-            IDomParser parser = mClient.getDomParser();
-            if (parser != null) {
-                context.document = parser.parseXml(context);
-                if (context.document != null) {
-                    project.readManifest(context.document);
-
-                    if ((!project.isLibrary() || (main != null && main.isMergingManifests()))
-                            && mScope.contains(Scope.MANIFEST)) {
-                        List<Detector> detectors = mScopeDetectors.get(Scope.MANIFEST);
-                        if (detectors != null) {
-                            XmlVisitor v = new XmlVisitor(parser, detectors);
-                            fireEvent(EventType.SCANNING_FILE, context);
-                            v.visitFile(context, manifestFile);
-                        }
-                    }
-                }
-            }
-        }
-
-        // Process both Scope.RESOURCE_FILE and Scope.ALL_RESOURCE_FILES detectors together
-        // in a single pass through the resource directories.
-        if (mScope.contains(Scope.ALL_RESOURCE_FILES) || mScope.contains(Scope.RESOURCE_FILE)) {
-            List<Detector> checks = union(mScopeDetectors.get(Scope.RESOURCE_FILE),
-                    mScopeDetectors.get(Scope.ALL_RESOURCE_FILES));
-            if (checks != null && !checks.isEmpty()) {
-                List<ResourceXmlDetector> xmlDetectors =
-                        new ArrayList<ResourceXmlDetector>(checks.size());
-                for (Detector detector : checks) {
-                    if (detector instanceof ResourceXmlDetector) {
-                        xmlDetectors.add((ResourceXmlDetector) detector);
-                    }
-                }
-                if (!xmlDetectors.isEmpty()) {
-                    List<File> files = project.getSubset();
-                    if (files != null) {
-                        checkIndividualResources(project, main, xmlDetectors, files);
-                    } else {
-                        List<File> resourceFolders = project.getResourceFolders();
-                        if (!resourceFolders.isEmpty() && !xmlDetectors.isEmpty()) {
-                            for (File res : resourceFolders) {
-                                checkResFolder(project, main, res, xmlDetectors);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        if (mCanceled) {
-            return;
-        }
-
-        if (mScope.contains(Scope.JAVA_FILE) || mScope.contains(Scope.ALL_JAVA_FILES)) {
-            List<Detector> checks = union(mScopeDetectors.get(Scope.JAVA_FILE),
-                    mScopeDetectors.get(Scope.ALL_JAVA_FILES));
-            if (checks != null && !checks.isEmpty()) {
-                List<File> files = project.getSubset();
-                if (files != null) {
-                    checkIndividualJavaFiles(project, main, checks, files);
-                } else {
-                    List<File> sourceFolders = project.getJavaSourceFolders();
-                    checkJava(project, main, sourceFolders, checks);
-                }
-            }
-        }
-
-        if (mCanceled) {
-            return;
-        }
-
-        if (mScope.contains(Scope.CLASS_FILE)
-                || mScope.contains(Scope.ALL_CLASS_FILES)
-                || mScope.contains(Scope.JAVA_LIBRARIES)) {
-            checkClasses(project, main);
-        }
-
-        if (mScope.contains(Scope.OTHER)) {
-            List<Detector> checks = mScopeDetectors.get(Scope.OTHER);
-            if (checks != null) {
-                OtherFileVisitor visitor = new OtherFileVisitor(checks);
-                visitor.scan(this, project, main);
-            }
-        }
-
-        if (mCanceled) {
-            return;
-        }
-
-        if (project == main && mScope.contains(Scope.PROGUARD_FILE)) {
-            checkProGuard(project, main);
-        }
-    }
-
-    private void checkProGuard(Project project, Project main) {
-        List<Detector> detectors = mScopeDetectors.get(Scope.PROGUARD_FILE);
-        if (detectors != null) {
-            Project p = main != null ? main : project;
-            List<File> files = new ArrayList<File>();
-            String paths = p.getProguardPath();
-            if (paths != null) {
-                Splitter splitter = Splitter.on(CharMatcher.anyOf(":;")); //$NON-NLS-1$
-                for (String path : splitter.split(paths)) {
-                    if (path.contains("${")) { //$NON-NLS-1$
-                        // Don't analyze the global/user proguard files
-                        continue;
-                    }
-                    File file = new File(path);
-                    if (!file.isAbsolute()) {
-                        file = new File(project.getDir(), path);
-                    }
-                    if (file.exists()) {
-                        files.add(file);
-                    }
-                }
-            }
-            if (files.isEmpty()) {
-                File file = new File(project.getDir(), OLD_PROGUARD_FILE);
-                if (file.exists()) {
-                    files.add(file);
-                }
-                file = new File(project.getDir(), FN_PROJECT_PROGUARD_FILE);
-                if (file.exists()) {
-                    files.add(file);
-                }
-            }
-            for (File file : files) {
-                Context context = new Context(this, project, main, file);
-                fireEvent(EventType.SCANNING_FILE, context);
-                for (Detector detector : detectors) {
-                    if (detector.appliesTo(context, file)) {
-                        detector.beforeCheckFile(context);
-                        detector.run(context);
-                        detector.afterCheckFile(context);
-                    }
-                }
-            }
-        }
-    }
-
-    /** True if execution has been canceled */
-    boolean isCanceled() {
-        return mCanceled;
-    }
-
-    /**
-     * Map from VM class name to corresponding super class VM name, if available.
-     * This map is typically null except <b>during</b> class processing.
-     */
-    private Map<String, String> mSuperClassMap;
-
-    /**
-     * Returns the super class for the given class name,
-     * which should be in VM format (e.g. java/lang/Integer, not java.lang.Integer).
-     * If the super class is not known, returns null. This can happen if
-     * the given class is not a known class according to the project or its
-     * libraries, for example because it refers to one of the core libraries which
-     * are not analyzed by lint.
-     *
-     * @param name the fully qualified class name
-     * @return the corresponding super class name (in VM format), or null if not known
-     */
-    @Nullable
-    public String getSuperClass(@NonNull String name) {
-        if (mSuperClassMap == null) {
-            throw new IllegalStateException("Only callable during ClassScanner#checkClass");
-        }
-        assert name.indexOf('.') == -1 : "Use VM signatures, e.g. java/lang/Integer";
-
-        String superClass = mSuperClassMap.get(name);
-        if (superClass == null && mCurrentProject != null) {
-            if ("java/lang/Object".equals(name)) {  //$NON-NLS-1$
-                return null;
-            }
-            superClass = mClient.getSuperClass(mCurrentProject, name);
-            if (superClass != null) {
-                mSuperClassMap.put(name, superClass);
-            }
-        }
-
-        return superClass;
-    }
-
-    /**
-     * Returns true if the given class is a subclass of the given super class.
-     *
-     * @param classNode the class to check whether it is a subclass of the given
-     *            super class name
-     * @param superClassName the fully qualified super class name (in VM format,
-     *            e.g. java/lang/Integer, not java.lang.Integer.
-     * @return true if the given class is a subclass of the given super class
-     */
-    public boolean isSubclassOf(@NonNull ClassNode classNode, @NonNull String superClassName) {
-        if (superClassName.equals(classNode.superName)) {
-            return true;
-        }
-
-        if (mCurrentProject != null) {
-            Boolean isSub = mClient.isSubclassOf(mCurrentProject, classNode.name, superClassName);
-            if (isSub != null) {
-                return isSub.booleanValue();
-            }
-        }
-
-        String className = classNode.name;
-        while (className != null) {
-            if (className.equals(superClassName)) {
-                return true;
-            }
-            className = getSuperClass(className);
-        }
-
-        return false;
-    }
-    @Nullable
-    private static List<Detector> union(
-            @Nullable List<Detector> list1,
-            @Nullable List<Detector> list2) {
-        if (list1 == null) {
-            return list2;
-        } else if (list2 == null) {
-            return list1;
-        } else {
-            // Use set to pick out unique detectors, since it's possible for there to be overlap,
-            // e.g. the DuplicateIdDetector registers both a cross-resource issue and a
-            // single-file issue, so it shows up on both scope lists:
-            Set<Detector> set = new HashSet<Detector>(list1.size() + list2.size());
-            if (list1 != null) {
-                set.addAll(list1);
-            }
-            if (list2 != null) {
-                set.addAll(list2);
-            }
-
-            return new ArrayList<Detector>(set);
-        }
-    }
-
-    /** Check the classes in this project (and if applicable, in any library projects */
-    private void checkClasses(Project project, Project main) {
-        List<File> files = project.getSubset();
-        if (files != null) {
-            checkIndividualClassFiles(project, main, files);
-            return;
-        }
-
-        // We need to read in all the classes up front such that we can initialize
-        // the parent chains (such that for example for a virtual dispatch, we can
-        // also check the super classes).
-
-        List<File> libraries = project.getJavaLibraries();
-        List<ClassEntry> libraryEntries;
-        if (!libraries.isEmpty()) {
-            libraryEntries = new ArrayList<ClassEntry>(64);
-            findClasses(libraryEntries, libraries);
-            Collections.sort(libraryEntries);
-        } else {
-            libraryEntries = Collections.emptyList();
-        }
-
-        List<File> classFolders = project.getJavaClassFolders();
-        List<ClassEntry> classEntries;
-        if (classFolders.isEmpty()) {
-            String message = String.format("No .class files were found in project \"%1$s\", "
-                    + "so none of the classfile based checks could be run. "
-                    + "Does the project need to be built first?", project.getName());
-            Location location = Location.create(project.getDir());
-            mClient.report(new Context(this, project, main, project.getDir()),
-                    IssueRegistry.LINT_ERROR,
-                    project.getConfiguration().getSeverity(IssueRegistry.LINT_ERROR),
-                    location, message, null);
-            classEntries = Collections.emptyList();
-        } else {
-            classEntries = new ArrayList<ClassEntry>(64);
-            findClasses(classEntries, classFolders);
-            Collections.sort(classEntries);
-        }
-
-        if (getPhase() == 1) {
-            mSuperClassMap = getSuperMap(libraryEntries, classEntries);
-        }
-
-        // Actually run the detectors. Libraries should be called before the
-        // main classes.
-        runClassDetectors(Scope.JAVA_LIBRARIES, libraryEntries, project, main);
-
-        if (mCanceled) {
-            return;
-        }
-
-        runClassDetectors(Scope.CLASS_FILE, classEntries, project, main);
-        runClassDetectors(Scope.ALL_CLASS_FILES, classEntries, project, main);
-    }
-
-    private void checkIndividualClassFiles(
-            @NonNull Project project,
-            @Nullable Project main,
-            @NonNull List<File> files) {
-        List<ClassEntry> entries = new ArrayList<ClassEntry>(files.size());
-
-        List<File> classFolders = project.getJavaClassFolders();
-        if (!classFolders.isEmpty()) {
-            for (File file : files) {
-                String path = file.getPath();
-                if (file.isFile() && path.endsWith(DOT_CLASS)) {
-                    try {
-                        byte[] bytes = mClient.readBytes(file);
-                        if (bytes != null) {
-                            for (File dir : classFolders) {
-                                if (path.startsWith(dir.getPath())) {
-                                    entries.add(new ClassEntry(file, null /* jarFile*/, dir,
-                                            bytes));
-                                    break;
-                                }
-                            }
-                        }
-                    } catch (IOException e) {
-                        mClient.log(e, null);
-                        continue;
-                    }
-
-                    if (mCanceled) {
-                        return;
-                    }
-                }
-            }
-
-            if (!entries.isEmpty()) {
-                Collections.sort(entries);
-                // No superclass info available on individual lint runs, unless
-                // the client can provide it
-                mSuperClassMap = Maps.newHashMap();
-                runClassDetectors(Scope.CLASS_FILE, entries, project, main);
-            }
-        }
-    }
-
-    /**
-     * Stack of {@link ClassNode} nodes for outer classes of the currently
-     * processed class, including that class itself. Populated by
-     * {@link #runClassDetectors(Scope, List, Project, Project)} and used by
-     * {@link #getOuterClassNode(ClassNode)}
-     */
-    private Deque<ClassNode> mOuterClasses;
-
-    private void runClassDetectors(Scope scope, List<ClassEntry> entries,
-            Project project, Project main) {
-        if (mScope.contains(scope)) {
-            List<Detector> classDetectors = mScopeDetectors.get(scope);
-            if (classDetectors != null && !classDetectors.isEmpty() && !entries.isEmpty()) {
-                AsmVisitor visitor = new AsmVisitor(mClient, classDetectors);
-
-                String sourceContents = null;
-                String sourceName = "";
-                mOuterClasses = new ArrayDeque<ClassNode>();
-                for (ClassEntry entry : entries) {
-                    ClassReader reader;
-                    ClassNode classNode;
-                    try {
-                        reader = new ClassReader(entry.bytes);
-                        classNode = new ClassNode();
-                        reader.accept(classNode, 0 /* flags */);
-                    } catch (Throwable t) {
-                        mClient.log(null, "Error processing %1$s: broken class file?",
-                                entry.path());
-                        continue;
-                    }
-
-                    ClassNode peek;
-                    while ((peek = mOuterClasses.peek()) != null) {
-                        if (classNode.name.startsWith(peek.name)) {
-                            break;
-                        } else {
-                            mOuterClasses.pop();
-                        }
-                    }
-                    mOuterClasses.push(classNode);
-
-                    if (isSuppressed(null, classNode)) {
-                        // Class was annotated with suppress all -- no need to look any further
-                        continue;
-                    }
-
-                    if (sourceContents != null) {
-                        // Attempt to reuse the source buffer if initialized
-                        // This means making sure that the source files
-                        //    foo/bar/MyClass and foo/bar/MyClass$Bar
-                        //    and foo/bar/MyClass$3 and foo/bar/MyClass$3$1 have the same prefix.
-                        String newName = classNode.name;
-                        int newRootLength = newName.indexOf('$');
-                        if (newRootLength == -1) {
-                            newRootLength = newName.length();
-                        }
-                        int oldRootLength = sourceName.indexOf('$');
-                        if (oldRootLength == -1) {
-                            oldRootLength = sourceName.length();
-                        }
-                        if (newRootLength != oldRootLength ||
-                                !sourceName.regionMatches(0, newName, 0, newRootLength)) {
-                            sourceContents = null;
-                        }
-                    }
-
-                    ClassContext context = new ClassContext(this, project, main,
-                            entry.file, entry.jarFile, entry.binDir, entry.bytes,
-                            classNode, scope == Scope.JAVA_LIBRARIES /*fromLibrary*/,
-                            sourceContents);
-
-                    try {
-                        visitor.runClassDetectors(context);
-                    } catch (Exception e) {
-                        mClient.log(e, null);
-                    }
-
-                    if (mCanceled) {
-                        return;
-                    }
-
-                    sourceContents = context.getSourceContents(false/*read*/);
-                    sourceName = classNode.name;
-                }
-
-                mOuterClasses = null;
-            }
-        }
-    }
-
-    /** Returns the outer class node of the given class node
-     * @param classNode the inner class node
-     * @return the outer class node */
-    public ClassNode getOuterClassNode(@NonNull ClassNode classNode) {
-        String outerName = classNode.outerClass;
-
-        Iterator<ClassNode> iterator = mOuterClasses.iterator();
-        while (iterator.hasNext()) {
-            ClassNode node = iterator.next();
-            if (outerName != null) {
-                if (node.name.equals(outerName)) {
-                    return node;
-                }
-            } else if (node == classNode) {
-                return iterator.hasNext() ? iterator.next() : null;
-            }
-        }
-
-        return null;
-    }
-
-    private Map<String, String> getSuperMap(List<ClassEntry> libraryEntries,
-            List<ClassEntry> classEntries) {
-        int size = libraryEntries.size() + classEntries.size();
-        Map<String, String> map = new HashMap<String, String>(size);
-
-        SuperclassVisitor visitor = new SuperclassVisitor(map);
-        addSuperClasses(visitor, libraryEntries);
-        addSuperClasses(visitor, classEntries);
-
-        return map;
-    }
-
-    private void addSuperClasses(SuperclassVisitor visitor, List<ClassEntry> entries) {
-        for (ClassEntry entry : entries) {
-            try {
-                ClassReader reader = new ClassReader(entry.bytes);
-                int flags = ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG
-                        | ClassReader.SKIP_FRAMES;
-                reader.accept(visitor, flags);
-            } catch (Throwable t) {
-                mClient.log(null, "Error processing %1$s: broken class file?", entry.path());
-            }
-        }
-    }
-
-    /** Visitor skimming classes and initializing a map of super classes */
-    private static class SuperclassVisitor extends ClassVisitor {
-        private final Map<String, String> mMap;
-
-        public SuperclassVisitor(Map<String, String> map) {
-            super(ASM4);
-            mMap = map;
-        }
-
-        @Override
-        public void visit(int version, int access, String name, String signature, String superName,
-                String[] interfaces) {
-            if (superName != null) {
-                mMap.put(name, superName);
-            }
-        }
-    }
-
-    private void findClasses(
-            @NonNull List<ClassEntry> entries,
-            @NonNull List<File> classPath) {
-        for (File classPathEntry : classPath) {
-            if (classPathEntry.getName().endsWith(DOT_JAR)) {
-                File jarFile = classPathEntry;
-                if (!jarFile.exists()) {
-                    continue;
-                }
-                ZipInputStream zis = null;
-                try {
-                    FileInputStream fis = new FileInputStream(jarFile);
-                    zis = new ZipInputStream(fis);
-                    ZipEntry entry = zis.getNextEntry();
-                    while (entry != null) {
-                        String name = entry.getName();
-                        if (name.endsWith(DOT_CLASS)) {
-                            try {
-                                byte[] bytes = ByteStreams.toByteArray(zis);
-                                if (bytes != null) {
-                                    File file = new File(entry.getName());
-                                    entries.add(new ClassEntry(file, jarFile, jarFile, bytes));
-                                }
-                            } catch (Exception e) {
-                                mClient.log(e, null);
-                                continue;
-                            }
-                        }
-
-                        if (mCanceled) {
-                            return;
-                        }
-
-                        entry = zis.getNextEntry();
-                    }
-                } catch (IOException e) {
-                    mClient.log(e, "Could not read jar file contents from %1$s", jarFile);
-                } finally {
-                    Closeables.closeQuietly(zis);
-                }
-
-                continue;
-            } else if (classPathEntry.isDirectory()) {
-                File binDir = classPathEntry;
-                List<File> classFiles = new ArrayList<File>();
-                addClassFiles(binDir, classFiles);
-
-                for (File file : classFiles) {
-                    try {
-                        byte[] bytes = mClient.readBytes(file);
-                        if (bytes != null) {
-                            entries.add(new ClassEntry(file, null /* jarFile*/, binDir, bytes));
-                        }
-                    } catch (IOException e) {
-                        mClient.log(e, null);
-                        continue;
-                    }
-
-                    if (mCanceled) {
-                        return;
-                    }
-                }
-            } else {
-                mClient.log(null, "Ignoring class path entry %1$s", classPathEntry);
-            }
-        }
-    }
-
-    private static void addClassFiles(@NonNull File dir, @NonNull List<File> classFiles) {
-        // Process the resource folder
-        File[] files = dir.listFiles();
-        if (files != null && files.length > 0) {
-            for (File file : files) {
-                if (file.isFile() && file.getName().endsWith(DOT_CLASS)) {
-                    classFiles.add(file);
-                } else if (file.isDirectory()) {
-                    // Recurse
-                    addClassFiles(file, classFiles);
-                }
-            }
-        }
-    }
-
-    private void checkJava(
-            @NonNull Project project,
-            @Nullable Project main,
-            @NonNull List<File> sourceFolders,
-            @NonNull List<Detector> checks) {
-        IJavaParser javaParser = mClient.getJavaParser();
-        if (javaParser == null) {
-            mClient.log(null, "No java parser provided to lint: not running Java checks");
-            return;
-        }
-
-        assert !checks.isEmpty();
-
-        // Gather all Java source files in a single pass; more efficient.
-        List<File> sources = new ArrayList<File>(100);
-        for (File folder : sourceFolders) {
-            gatherJavaFiles(folder, sources);
-        }
-        if (!sources.isEmpty()) {
-            JavaVisitor visitor = new JavaVisitor(javaParser, checks);
-            for (File file : sources) {
-                JavaContext context = new JavaContext(this, project, main, file);
-                fireEvent(EventType.SCANNING_FILE, context);
-                visitor.visitFile(context, file);
-                if (mCanceled) {
-                    return;
-                }
-            }
-        }
-    }
-
-    private void checkIndividualJavaFiles(
-            @NonNull Project project,
-            @Nullable Project main,
-            @NonNull List<Detector> checks,
-            @NonNull List<File> files) {
-
-        IJavaParser javaParser = mClient.getJavaParser();
-        if (javaParser == null) {
-            mClient.log(null, "No java parser provided to lint: not running Java checks");
-            return;
-        }
-
-        JavaVisitor visitor = new JavaVisitor(javaParser, checks);
-
-        for (File file : files) {
-            if (file.isFile() && file.getPath().endsWith(DOT_JAVA)) {
-                JavaContext context = new JavaContext(this, project, main, file);
-                fireEvent(EventType.SCANNING_FILE, context);
-                visitor.visitFile(context, file);
-                if (mCanceled) {
-                    return;
-                }
-            }
-        }
-    }
-
-    private static void gatherJavaFiles(@NonNull File dir, @NonNull List<File> result) {
-        File[] files = dir.listFiles();
-        if (files != null) {
-            for (File file : files) {
-                if (file.isFile() && file.getName().endsWith(".java")) { //$NON-NLS-1$
-                    result.add(file);
-                } else if (file.isDirectory()) {
-                    gatherJavaFiles(file, result);
-                }
-            }
-        }
-    }
-
-    private ResourceFolderType mCurrentFolderType;
-    private List<ResourceXmlDetector> mCurrentXmlDetectors;
-    private XmlVisitor mCurrentVisitor;
-
-    @Nullable
-    private XmlVisitor getVisitor(
-            @NonNull ResourceFolderType type,
-            @NonNull List<ResourceXmlDetector> checks) {
-        if (type != mCurrentFolderType) {
-            mCurrentFolderType = type;
-
-            // Determine which XML resource detectors apply to the given folder type
-            List<ResourceXmlDetector> applicableChecks =
-                    new ArrayList<ResourceXmlDetector>(checks.size());
-            for (ResourceXmlDetector check : checks) {
-                if (check.appliesTo(type)) {
-                    applicableChecks.add(check);
-                }
-            }
-
-            // If the list of detectors hasn't changed, then just use the current visitor!
-            if (mCurrentXmlDetectors != null && mCurrentXmlDetectors.equals(applicableChecks)) {
-                return mCurrentVisitor;
-            }
-
-            if (applicableChecks.isEmpty()) {
-                mCurrentVisitor = null;
-                return null;
-            }
-
-            IDomParser parser = mClient.getDomParser();
-            if (parser != null) {
-                mCurrentVisitor = new XmlVisitor(parser, applicableChecks);
-            }
-        }
-
-        return mCurrentVisitor;
-    }
-
-    private void checkResFolder(
-            @NonNull Project project,
-            @Nullable Project main,
-            @NonNull File res,
-            @NonNull List<ResourceXmlDetector> checks) {
-        assert res.isDirectory();
-        File[] resourceDirs = res.listFiles();
-        if (resourceDirs == null) {
-            return;
-        }
-
-        // Sort alphabetically such that we can process related folder types at the
-        // same time
-
-        Arrays.sort(resourceDirs);
-        for (File dir : resourceDirs) {
-            ResourceFolderType type = ResourceFolderType.getFolderType(dir.getName());
-            if (type != null) {
-                checkResourceFolder(project, main, dir, type, checks);
-            }
-
-            if (mCanceled) {
-                return;
-            }
-        }
-    }
-
-    private void checkResourceFolder(
-            @NonNull Project project,
-            @Nullable Project main,
-            @NonNull File dir,
-            @NonNull ResourceFolderType type,
-            @NonNull List<ResourceXmlDetector> checks) {
-        // Process the resource folder
-        File[] xmlFiles = dir.listFiles();
-        if (xmlFiles != null && xmlFiles.length > 0) {
-            XmlVisitor visitor = getVisitor(type, checks);
-            if (visitor != null) { // if not, there are no applicable rules in this folder
-                for (File file : xmlFiles) {
-                    if (LintUtils.isXmlFile(file)) {
-                        XmlContext context = new XmlContext(this, project, main, file, type);
-                        fireEvent(EventType.SCANNING_FILE, context);
-                        visitor.visitFile(context, file);
-                        if (mCanceled) {
-                            return;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /** Checks individual resources */
-    private void checkIndividualResources(
-            @NonNull Project project,
-            @Nullable Project main,
-            @NonNull List<ResourceXmlDetector> xmlDetectors,
-            @NonNull List<File> files) {
-        for (File file : files) {
-            if (file.isDirectory()) {
-                // Is it a resource folder?
-                ResourceFolderType type = ResourceFolderType.getFolderType(file.getName());
-                if (type != null && new File(file.getParentFile(), RES_FOLDER).exists()) {
-                    // Yes.
-                    checkResourceFolder(project, main, file, type, xmlDetectors);
-                } else if (file.getName().equals(RES_FOLDER)) { // Is it the res folder?
-                    // Yes
-                    checkResFolder(project, main, file, xmlDetectors);
-                } else {
-                    mClient.log(null, "Unexpected folder %1$s; should be project, " +
-                            "\"res\" folder or resource folder", file.getPath());
-                    continue;
-                }
-            } else if (file.isFile() && LintUtils.isXmlFile(file)) {
-                // Yes, find out its resource type
-                String folderName = file.getParentFile().getName();
-                ResourceFolderType type = ResourceFolderType.getFolderType(folderName);
-                if (type != null) {
-                    XmlVisitor visitor = getVisitor(type, xmlDetectors);
-                    if (visitor != null) {
-                        XmlContext context = new XmlContext(this, project, main, file, type);
-                        fireEvent(EventType.SCANNING_FILE, context);
-                        visitor.visitFile(context, file);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Adds a listener to be notified of lint progress
-     *
-     * @param listener the listener to be added
-     */
-    public void addLintListener(@NonNull LintListener listener) {
-        if (mListeners == null) {
-            mListeners = new ArrayList<LintListener>(1);
-        }
-        mListeners.add(listener);
-    }
-
-    /**
-     * Removes a listener such that it is no longer notified of progress
-     *
-     * @param listener the listener to be removed
-     */
-    public void removeLintListener(@NonNull LintListener listener) {
-        mListeners.remove(listener);
-        if (mListeners.isEmpty()) {
-            mListeners = null;
-        }
-    }
-
-    /** Notifies listeners, if any, that the given event has occurred */
-    private void fireEvent(@NonNull LintListener.EventType type, @Nullable Context context) {
-        if (mListeners != null) {
-            for (LintListener listener : mListeners) {
-                listener.update(this, type, context);
-            }
-        }
-    }
-
-    /**
-     * Wrapper around the lint client. This sits in the middle between a
-     * detector calling for example {@link LintClient#report} and
-     * the actual embedding tool, and performs filtering etc such that detectors
-     * and lint clients don't have to make sure they check for ignored issues or
-     * filtered out warnings.
-     */
-    private class LintClientWrapper extends LintClient {
-        @NonNull
-        private final LintClient mDelegate;
-
-        public LintClientWrapper(@NonNull LintClient delegate) {
-            mDelegate = delegate;
-        }
-
-        @Override
-        public void report(
-                @NonNull Context context,
-                @NonNull Issue issue,
-                @NonNull Severity severity,
-                @Nullable Location location,
-                @NonNull String message,
-                @Nullable Object data) {
-            assert mCurrentProject != null;
-            if (!mCurrentProject.getReportIssues()) {
-                return;
-            }
-
-            Configuration configuration = context.getConfiguration();
-            if (!configuration.isEnabled(issue)) {
-                if (issue != IssueRegistry.PARSER_ERROR && issue != IssueRegistry.LINT_ERROR) {
-                    mDelegate.log(null, "Incorrect detector reported disabled issue %1$s",
-                            issue.toString());
-                }
-                return;
-            }
-
-            if (configuration.isIgnored(context, issue, location, message, data)) {
-                return;
-            }
-
-            if (severity == Severity.IGNORE) {
-                return;
-            }
-
-            mDelegate.report(context, issue, severity, location, message, data);
-        }
-
-        // Everything else just delegates to the embedding lint client
-
-        @Override
-        @NonNull
-        public Configuration getConfiguration(@NonNull Project project) {
-            return mDelegate.getConfiguration(project);
-        }
-
-
-        @Override
-        public void log(@NonNull Severity severity, @Nullable Throwable exception,
-                @Nullable String format, @Nullable Object... args) {
-            mDelegate.log(exception, format, args);
-        }
-
-        @Override
-        @NonNull
-        public String readFile(@NonNull File file) {
-            return mDelegate.readFile(file);
-        }
-
-        @Override
-        @NonNull
-        public byte[] readBytes(@NonNull File file) throws IOException {
-            return mDelegate.readBytes(file);
-        }
-
-        @Override
-        @NonNull
-        public List<File> getJavaSourceFolders(@NonNull Project project) {
-            return mDelegate.getJavaSourceFolders(project);
-        }
-
-        @Override
-        @NonNull
-        public List<File> getJavaClassFolders(@NonNull Project project) {
-            return mDelegate.getJavaClassFolders(project);
-        }
-
-        @NonNull
-        @Override
-        public List<File> getJavaLibraries(@NonNull Project project) {
-            return mDelegate.getJavaLibraries(project);
-        }
-
-        @Override
-        @NonNull
-        public List<File> getResourceFolders(@NonNull Project project) {
-            return mDelegate.getResourceFolders(project);
-        }
-
-        @Override
-        @Nullable
-        public IDomParser getDomParser() {
-            return mDelegate.getDomParser();
-        }
-
-        @Override
-        @NonNull
-        public Class<? extends Detector> replaceDetector(
-                @NonNull Class<? extends Detector> detectorClass) {
-            return mDelegate.replaceDetector(detectorClass);
-        }
-
-        @Override
-        @NonNull
-        public SdkInfo getSdkInfo(@NonNull Project project) {
-            return mDelegate.getSdkInfo(project);
-        }
-
-        @Override
-        @NonNull
-        public Project getProject(@NonNull File dir, @NonNull File referenceDir) {
-            return mDelegate.getProject(dir, referenceDir);
-        }
-
-        @Override
-        @Nullable
-        public IJavaParser getJavaParser() {
-            return mDelegate.getJavaParser();
-        }
-
-        @Override
-        public File findResource(@NonNull String relativePath) {
-            return mDelegate.findResource(relativePath);
-        }
-
-        @Override
-        @Nullable
-        public File getCacheDir(boolean create) {
-            return mDelegate.getCacheDir(create);
-        }
-
-        @Override
-        @NonNull
-        protected ClassPathInfo getClassPath(@NonNull Project project) {
-            return mDelegate.getClassPath(project);
-        }
-
-        @Override
-        public void log(@Nullable Throwable exception, @Nullable String format,
-                @Nullable Object... args) {
-            mDelegate.log(exception, format, args);
-        }
-
-        @Override
-        @Nullable
-        public File getSdkHome() {
-            return mDelegate.getSdkHome();
-        }
-
-        @Override
-        @NonNull
-        public IAndroidTarget[] getTargets() {
-            return mDelegate.getTargets();
-        }
-
-        @Override
-        public int getHighestKnownApiLevel() {
-            return mDelegate.getHighestKnownApiLevel();
-        }
-
-        @Override
-        @Nullable
-        public String getSuperClass(@NonNull Project project, @NonNull String name) {
-            return mDelegate.getSuperClass(project, name);
-        }
-
-        @Override
-        @Nullable
-        public Boolean isSubclassOf(@NonNull Project project, @NonNull String name,
-                @NonNull String superClassName) {
-            return mDelegate.isSubclassOf(project, name, superClassName);
-        }
-
-        @Override
-        @NonNull
-        public String getProjectName(@NonNull Project project) {
-            return mDelegate.getProjectName(project);
-        }
-    }
-
-    /**
-     * Requests another pass through the data for the given detector. This is
-     * typically done when a detector needs to do more expensive computation,
-     * but it only wants to do this once it <b>knows</b> that an error is
-     * present, or once it knows more specifically what to check for.
-     *
-     * @param detector the detector that should be included in the next pass.
-     *            Note that the lint runner may refuse to run more than a couple
-     *            of runs.
-     * @param scope the scope to be revisited. This must be a subset of the
-     *       current scope ({@link #getScope()}, and it is just a performance hint;
-     *       in particular, the detector should be prepared to be called on other
-     *       scopes as well (since they may have been requested by other detectors).
-     *       You can pall null to indicate "all".
-     */
-    public void requestRepeat(@NonNull Detector detector, @Nullable EnumSet<Scope> scope) {
-        if (mRepeatingDetectors == null) {
-            mRepeatingDetectors = new ArrayList<Detector>();
-        }
-        mRepeatingDetectors.add(detector);
-
-        if (scope != null) {
-            if (mRepeatScope == null) {
-                mRepeatScope = scope;
-            } else {
-                mRepeatScope = EnumSet.copyOf(mRepeatScope);
-                mRepeatScope.addAll(scope);
-            }
-        } else {
-            mRepeatScope = Scope.ALL;
-        }
-    }
-
-    // Unfortunately, ASMs nodes do not extend a common DOM node type with parent
-    // pointers, so we have to have multiple methods which pass in each type
-    // of node (class, method, field) to be checked.
-
-    /**
-     * Returns whether the given issue is suppressed in the given method.
-     *
-     * @param issue the issue to be checked, or null to just check for "all"
-     * @param classNode the class containing the issue
-     * @param method the method containing the issue
-     * @param instruction the instruction within the method, if any
-     * @return true if there is a suppress annotation covering the specific
-     *         issue on this method
-     */
-    public boolean isSuppressed(
-            @Nullable Issue issue,
-            @NonNull ClassNode classNode,
-            @NonNull MethodNode method,
-            @Nullable AbstractInsnNode instruction) {
-        if (method.invisibleAnnotations != null) {
-            @SuppressWarnings("unchecked")
-            List<AnnotationNode> annotations = method.invisibleAnnotations;
-            return isSuppressed(issue, annotations);
-        }
-
-        // Initializations of fields end up placed in generated methods (<init>
-        // for members and <clinit> for static fields).
-        if (instruction != null && method.name.charAt(0) == '<') {
-            AbstractInsnNode next = LintUtils.getNextInstruction(instruction);
-            if (next != null && next.getType() == AbstractInsnNode.FIELD_INSN) {
-                FieldInsnNode fieldRef = (FieldInsnNode) next;
-                FieldNode field = findField(classNode, fieldRef.owner, fieldRef.name);
-                if (field != null && isSuppressed(issue, field)) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    @Nullable
-    private FieldNode findField(ClassNode classNode, String owner, String name) {
-        while (classNode != null) {
-            if (owner.equals(classNode.name)) {
-                @SuppressWarnings("rawtypes") // ASM API
-                List fieldList = classNode.fields;
-                for (Object f : fieldList) {
-                    FieldNode field = (FieldNode) f;
-                    if (field.name.equals(name)) {
-                        return field;
-                    }
-                }
-                return null;
-            }
-            classNode = getOuterClassNode(classNode);
-        }
-        return null;
-    }
-
-    /**
-     * Returns whether the given issue is suppressed for the given field.
-     *
-     * @param issue the issue to be checked, or null to just check for "all"
-     * @param field the field potentially annotated with a suppress annotation
-     * @return true if there is a suppress annotation covering the specific
-     *         issue on this field
-     */
-    public boolean isSuppressed(@Nullable Issue issue, @NonNull FieldNode field) {
-        if (field.invisibleAnnotations != null) {
-            @SuppressWarnings("unchecked")
-            List<AnnotationNode> annotations = field.invisibleAnnotations;
-            return isSuppressed(issue, annotations);
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns whether the given issue is suppressed in the given class.
-     *
-     * @param issue the issue to be checked, or null to just check for "all"
-     * @param classNode the class containing the issue
-     * @return true if there is a suppress annotation covering the specific
-     *         issue in this class
-     */
-    public boolean isSuppressed(@Nullable Issue issue, @NonNull ClassNode classNode) {
-        if (classNode.invisibleAnnotations != null) {
-            @SuppressWarnings("unchecked")
-            List<AnnotationNode> annotations = classNode.invisibleAnnotations;
-            return isSuppressed(issue, annotations);
-        }
-
-        return false;
-    }
-
-    private static boolean isSuppressed(@Nullable Issue issue, List<AnnotationNode> annotations) {
-        for (AnnotationNode annotation : annotations) {
-            String desc = annotation.desc;
-
-            // We could obey @SuppressWarnings("all") too, but no need to look for it
-            // because that annotation only has source retention.
-
-            if (desc.endsWith(SUPPRESS_LINT_VMSIG)) {
-                if (annotation.values != null) {
-                    for (int i = 0, n = annotation.values.size(); i < n; i += 2) {
-                        String key = (String) annotation.values.get(i);
-                        if (key.equals("value")) {   //$NON-NLS-1$
-                            Object value = annotation.values.get(i + 1);
-                            if (value instanceof String) {
-                                String id = (String) value;
-                                if (id.equalsIgnoreCase(SUPPRESS_ALL) ||
-                                        issue != null && id.equalsIgnoreCase(issue.getId())) {
-                                    return true;
-                                }
-                            } else if (value instanceof List) {
-                                @SuppressWarnings("rawtypes")
-                                List list = (List) value;
-                                for (Object v : list) {
-                                    if (v instanceof String) {
-                                        String id = (String) v;
-                                        if (id.equalsIgnoreCase(SUPPRESS_ALL) || (issue != null
-                                                && id.equalsIgnoreCase(issue.getId()))) {
-                                            return true;
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns whether the given issue is suppressed in the given parse tree node.
-     *
-     * @param issue the issue to be checked, or null to just check for "all"
-     * @param scope the AST node containing the issue
-     * @return true if there is a suppress annotation covering the specific
-     *         issue in this class
-     */
-    public boolean isSuppressed(@NonNull Issue issue, @Nullable Node scope) {
-        while (scope != null) {
-            Class<? extends Node> type = scope.getClass();
-            // The Lombok AST uses a flat hierarchy of node type implementation classes
-            // so no need to do instanceof stuff here.
-            if (type == VariableDefinition.class) {
-                // Variable
-                VariableDefinition declaration = (VariableDefinition) scope;
-                if (isSuppressed(issue, declaration.astModifiers())) {
-                    return true;
-                }
-            } else if (type == MethodDeclaration.class) {
-                // Method
-                // Look for annotations on the method
-                MethodDeclaration declaration = (MethodDeclaration) scope;
-                if (isSuppressed(issue, declaration.astModifiers())) {
-                    return true;
-                }
-            } else if (type == ConstructorDeclaration.class) {
-                // Constructor
-                // Look for annotations on the method
-                ConstructorDeclaration declaration = (ConstructorDeclaration) scope;
-                if (isSuppressed(issue, declaration.astModifiers())) {
-                    return true;
-                }
-            } else if (type == ClassDeclaration.class) {
-                // Class
-                ClassDeclaration declaration = (ClassDeclaration) scope;
-                if (isSuppressed(issue, declaration.astModifiers())) {
-                    return true;
-                }
-            }
-
-            scope = scope.getParent();
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true if the given AST modifier has a suppress annotation for the
-     * given issue (which can be null to check for the "all" annotation)
-     *
-     * @param issue the issue to be checked
-     * @param modifiers the modifier to check
-     * @return true if the issue or all issues should be suppressed for this
-     *         modifier
-     */
-    private static boolean isSuppressed(@Nullable Issue issue, @Nullable Modifiers modifiers) {
-        if (modifiers == null) {
-            return false;
-        }
-        StrictListAccessor<Annotation, Modifiers> annotations = modifiers.astAnnotations();
-        if (annotations == null) {
-            return false;
-        }
-
-        Iterator<Annotation> iterator = annotations.iterator();
-        while (iterator.hasNext()) {
-            Annotation annotation = iterator.next();
-            TypeReference t = annotation.astAnnotationTypeReference();
-            String typeName = t.getTypeName();
-            if (typeName.endsWith(SUPPRESS_LINT)
-                    || typeName.endsWith("SuppressWarnings")) {     //$NON-NLS-1$
-                StrictListAccessor<AnnotationElement, Annotation> values =
-                        annotation.astElements();
-                if (values != null) {
-                    Iterator<AnnotationElement> valueIterator = values.iterator();
-                    while (valueIterator.hasNext()) {
-                        AnnotationElement element = valueIterator.next();
-                        AnnotationValue valueNode = element.astValue();
-                        if (valueNode == null) {
-                            continue;
-                        }
-                        if (valueNode instanceof StringLiteral) {
-                            StringLiteral literal = (StringLiteral) valueNode;
-                            String value = literal.astValue();
-                            if (value.equalsIgnoreCase(SUPPRESS_ALL) ||
-                                    issue != null && issue.getId().equalsIgnoreCase(value)) {
-                                return true;
-                            }
-                        } else if (valueNode instanceof ArrayInitializer) {
-                            ArrayInitializer array = (ArrayInitializer) valueNode;
-                            StrictListAccessor<Expression, ArrayInitializer> expressions =
-                                    array.astExpressions();
-                            if (expressions == null) {
-                                continue;
-                            }
-                            Iterator<Expression> arrayIterator = expressions.iterator();
-                            while (arrayIterator.hasNext()) {
-                                Expression arrayElement = arrayIterator.next();
-                                if (arrayElement instanceof StringLiteral) {
-                                    String value = ((StringLiteral) arrayElement).astValue();
-                                    if (value.equalsIgnoreCase(SUPPRESS_ALL) || (issue != null
-                                            && issue.getId().equalsIgnoreCase(value))) {
-                                        return true;
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns whether the given issue is suppressed in the given XML DOM node.
-     *
-     * @param issue the issue to be checked, or null to just check for "all"
-     * @param node the DOM node containing the issue
-     * @return true if there is a suppress annotation covering the specific
-     *         issue in this class
-     */
-    public boolean isSuppressed(@NonNull Issue issue, @Nullable org.w3c.dom.Node node) {
-        if (node instanceof Attr) {
-            node = ((Attr) node).getOwnerElement();
-        }
-        while (node != null) {
-            if (node.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
-                Element element = (Element) node;
-                if (element.hasAttributeNS(TOOLS_URI, ATTR_IGNORE)) {
-                    String ignore = element.getAttributeNS(TOOLS_URI, ATTR_IGNORE);
-                    if (ignore.indexOf(',') == -1) {
-                        if (ignore.equalsIgnoreCase(SUPPRESS_ALL) || (issue != null
-                                && issue.getId().equalsIgnoreCase(ignore))) {
-                            return true;
-                        }
-                    } else {
-                        for (String id : ignore.split(",")) { //$NON-NLS-1$
-                            if (id.equalsIgnoreCase(SUPPRESS_ALL) || (issue != null
-                                    && issue.getId().equalsIgnoreCase(id))) {
-                                return true;
-                            }
-                        }
-                    }
-                }
-            }
-
-            node = node.getParentNode();
-        }
-
-        return false;
-    }
-
-    /** A pending class to be analyzed by {@link #checkClasses} */
-    @VisibleForTesting
-    static class ClassEntry implements Comparable<ClassEntry> {
-        public final File file;
-        public final File jarFile;
-        public final File binDir;
-        public final byte[] bytes;
-
-        public ClassEntry(File file, File jarFile, File binDir, byte[] bytes) {
-            super();
-            this.file = file;
-            this.jarFile = jarFile;
-            this.binDir = binDir;
-            this.bytes = bytes;
-        }
-
-        public String path() {
-            if (jarFile != null) {
-                return jarFile.getPath() + ':' + file.getPath();
-            } else {
-                return file.getPath();
-            }
-        }
-
-        @Override
-        public int compareTo(ClassEntry other) {
-            String p1 = file.getPath();
-            String p2 = other.file.getPath();
-            int m1 = p1.length();
-            int m2 = p2.length();
-            int m = Math.min(m1, m2);
-
-            for (int i = 0; i < m; i++) {
-                char c1 = p1.charAt(i);
-                char c2 = p2.charAt(i);
-                if (c1 != c2) {
-                    // Sort Foo$Bar.class *after* Foo.class, even though $ < .
-                    if (c1 == '.' && c2 == '$') {
-                        return -1;
-                    }
-                    if (c1 == '$' && c2 == '.') {
-                        return 1;
-                    }
-                    return c1 - c2;
-                }
-            }
-
-            return (m == m1) ? -1 : 1;
-        }
-
-        @Override
-        public String toString() {
-            return file.getPath();
-        }
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/LintListener.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/LintListener.java
deleted file mode 100644
index 8195d36..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/LintListener.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Context;
-import com.google.common.annotations.Beta;
-
-/**
- * Interface implemented by listeners to be notified of lint events
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public interface LintListener {
-    /** The various types of events provided to lint listeners */
-    enum EventType {
-        /** A lint check is about to begin */
-        STARTING,
-
-        /** Lint is about to check the given project, see {@link Context#getProject()} */
-        SCANNING_PROJECT,
-
-        /** Lint is about to check the given library project, see {@link Context#getProject()} */
-        SCANNING_LIBRARY_PROJECT,
-
-        /** Lint is about to check the given file, see {@link Context#file} */
-        SCANNING_FILE,
-
-        /** A new pass was initiated */
-        NEW_PHASE,
-
-        /** The lint check was canceled */
-        CANCELED,
-
-        /** The lint check is done */
-        COMPLETED,
-    }
-
-    /**
-     * Notifies listeners that the event of the given type has occurred.
-     * Additional information, such as the file being scanned, or the project
-     * being scanned, is available in the {@link Context} object (except for the
-     * {@link EventType#STARTING}, {@link EventType#CANCELED} or
-     * {@link EventType#COMPLETED} events which are fired outside of project
-     * contexts.)
-     *
-     * @param driver the driver running through the checks
-     * @param type the type of event that occurred
-     * @param context the context providing additional information
-     */
-    void update(@NonNull LintDriver driver, @NonNull EventType type,
-            @Nullable Context context);
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/OtherFileVisitor.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/OtherFileVisitor.java
deleted file mode 100644
index adc36de..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/OtherFileVisitor.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Project;
-import com.android.tools.lint.detector.api.Scope;
-import com.google.common.collect.Lists;
-
-import java.io.File;
-import java.util.*;
-
-import static com.android.SdkConstants.FD_ASSETS;
-import static com.android.tools.lint.detector.api.Detector.OtherFileScanner;
-
-/**
- * Visitor for "other" files: files that aren't java sources,
- * XML sources, etc -- or which should have custom handling in some
- * other way.
- */
-class OtherFileVisitor {
-    @NonNull
-    private final List<Detector> mDetectors;
-
-    @NonNull
-    private Map<Scope, List<File>> mFiles = new EnumMap<Scope, List<File>>(Scope.class);
-
-    OtherFileVisitor(@NonNull List<Detector> detectors) {
-        mDetectors = detectors;
-    }
-
-    /** Analyze other files in the given project */
-    void scan(
-            @NonNull LintDriver driver,
-            @NonNull Project project,
-            @Nullable Project main) {
-        // Collect all project files
-        File projectFolder = project.getDir();
-
-        EnumSet<Scope> scopes = EnumSet.noneOf(Scope.class);
-        for (Detector detector : mDetectors) {
-            OtherFileScanner fileScanner = (OtherFileScanner) detector;
-            EnumSet<Scope> applicable = fileScanner.getApplicableFiles();
-            if (applicable.contains(Scope.OTHER)) {
-                scopes = Scope.ALL;
-                break;
-            }
-            scopes.addAll(applicable);
-        }
-
-        if (scopes.contains(Scope.RESOURCE_FILE)) {
-            List<File> files = Lists.newArrayListWithExpectedSize(100);
-            for (File res : project.getResourceFolders()) {
-                collectFiles(files, res);
-            }
-            File assets = new File(projectFolder, FD_ASSETS);
-            if (assets.exists()) {
-                collectFiles(files, assets);
-            }
-            if (!files.isEmpty()) {
-                mFiles.put(Scope.RESOURCE_FILE, files);
-            }
-        }
-
-        if (scopes.contains(Scope.JAVA_FILE)) {
-            List<File> files = Lists.newArrayListWithExpectedSize(100);
-            for (File srcFolder : project.getJavaSourceFolders()) {
-                collectFiles(files, srcFolder);
-            }
-            mFiles.put(Scope.JAVA_FILE, files);
-        }
-
-        if (scopes.contains(Scope.CLASS_FILE)) {
-            List<File> files = Lists.newArrayListWithExpectedSize(100);
-            for (File classFolder : project.getJavaClassFolders()) {
-                collectFiles(files, classFolder);
-            }
-            mFiles.put(Scope.JAVA_FILE, files);
-        }
-
-        if (scopes.contains(Scope.MANIFEST)) {
-            File manifestFile = project.getManifestFile();
-            if (manifestFile != null) {
-                mFiles.put(Scope.MANIFEST, Collections.<File>singletonList(manifestFile));
-            }
-        }
-
-        for (Map.Entry<Scope, List<File>> entry : mFiles.entrySet()) {
-            Scope scope = entry.getKey();
-            List<File> files = entry.getValue();
-            List<Detector> applicable = new ArrayList<Detector>(mDetectors.size());
-            for (Detector detector : mDetectors) {
-                OtherFileScanner fileScanner = (OtherFileScanner) detector;
-                EnumSet<Scope> appliesTo = fileScanner.getApplicableFiles();
-                if (appliesTo.contains(Scope.OTHER) || appliesTo.contains(scope)) {
-                    applicable.add(detector);
-                }
-            }
-            if (!applicable.isEmpty()) {
-                for (File file : files) {
-                    Context context = new Context(driver, project, main, file);
-                    for (Detector detector : mDetectors) {
-                        detector.beforeCheckFile(context);
-                        detector.run(context);
-                        detector.afterCheckFile(context);
-                    }
-                    if (driver.isCanceled()) {
-                        return;
-                    }
-                }
-            }
-        }
-    }
-
-    private static void collectFiles(List<File> files, File file) {
-        if (file.isDirectory()) {
-            File[] children = file.listFiles();
-            if (children != null) {
-                for (File child : children) {
-                    collectFiles(files, child);
-                }
-            }
-        } else {
-            files.add(file);
-        }
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/SdkInfo.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/SdkInfo.java
deleted file mode 100644
index 8b3d1e9..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/SdkInfo.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.google.common.annotations.Beta;
-
-/**
- * Information about SDKs
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public abstract class SdkInfo {
-    /**
-     * Returns true if the given child view is the same class or a sub class of
-     * the given parent view class
-     *
-     * @param parentViewFqcn the fully qualified class name of the parent view
-     * @param childViewFqcn the fully qualified class name of the child view
-     * @return true if the child view is a sub view of (or the same class as)
-     *         the parent view
-     */
-    public boolean isSubViewOf(@NonNull String parentViewFqcn, @NonNull String childViewFqcn) {
-        while (!childViewFqcn.equals("android.view.View")) { //$NON-NLS-1$
-            if (parentViewFqcn.equals(childViewFqcn)) {
-                return true;
-            }
-            String parent = getParentViewClass(childViewFqcn);
-            if (parent == null) {
-                // Unknown view - err on the side of caution
-                return true;
-            }
-            childViewFqcn = parent;
-        }
-
-        return false;
-    }
-
-
-    /**
-     * Returns the fully qualified name of the parent view, or null if the view
-     * is the root android.view.View class.
-     *
-     * @param fqcn the fully qualified class name of the view
-     * @return the fully qualified class name of the parent view, or null
-     */
-    @Nullable
-    public abstract String getParentViewClass(@NonNull String fqcn);
-
-    /**
-     * Returns the class name of the parent view, or null if the view is the
-     * root android.view.View class. This is the same as the
-     * {@link #getParentViewClass(String)} but without the package.
-     *
-     * @param name the view class name to look up the parent for (not including
-     *            package)
-     * @return the view name of the parent
-     */
-    @Nullable
-    public abstract String getParentViewName(@NonNull String name);
-
-    /**
-     * Returns true if the given widget name is a layout
-     *
-     * @param tag the XML tag for the view
-     * @return true if the given tag corresponds to a layout
-     */
-    public boolean isLayout(@NonNull String tag) {
-        return tag.endsWith("Layout"); //$NON-NLS-1$
-    }
-
-    // TODO: Add access to resource resolution here.
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/XmlVisitor.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/XmlVisitor.java
deleted file mode 100644
index 2e64118..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/client/api/XmlVisitor.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.client.api;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Detector.XmlScanner;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.annotations.Beta;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.RandomAccess;
-
-/**
- * Specialized visitor for running detectors on an XML document.
- * It operates in two phases:
- * <ol>
- *   <li> First, it computes a set of maps where it generates a map from each
- *        significant element name, and each significant attribute name, to a list
- *        of detectors to consult for that element or attribute name.
- *        The set of element names or attribute names (or both) that a detector
- *        is interested in is provided by the detectors themselves.
- *   <li> Second, it iterates over the document a single time. For each element and
- *        attribute it looks up the list of interested detectors, and runs them.
- * </ol>
- * It also notifies all the detectors before and after the document is processed
- * such that they can do pre- and post-processing.
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-class XmlVisitor {
-    private final Map<String, List<Detector.XmlScanner>> mElementToCheck =
-            new HashMap<String, List<Detector.XmlScanner>>();
-    private final Map<String, List<Detector.XmlScanner>> mAttributeToCheck =
-            new HashMap<String, List<Detector.XmlScanner>>();
-    private final List<Detector.XmlScanner> mDocumentDetectors =
-            new ArrayList<Detector.XmlScanner>();
-    private final List<Detector.XmlScanner> mAllElementDetectors =
-            new ArrayList<Detector.XmlScanner>();
-    private final List<Detector.XmlScanner> mAllAttributeDetectors =
-            new ArrayList<Detector.XmlScanner>();
-    private final List<? extends Detector> mAllDetectors;
-    private final IDomParser mParser;
-
-    // Really want this:
-    //<T extends List<Detector> & Detector.XmlScanner> XmlVisitor(IDomParser parser,
-    //    T xmlDetectors) {
-    // but it makes client code tricky and ugly.
-    XmlVisitor(@NonNull IDomParser parser, @NonNull List<? extends Detector> xmlDetectors) {
-        mParser = parser;
-        mAllDetectors = xmlDetectors;
-
-        // TODO: Check appliesTo() for files, and find a quick way to enable/disable
-        // rules when running through a full project!
-        for (Detector detector : xmlDetectors) {
-            Detector.XmlScanner xmlDetector = (XmlScanner) detector;
-            Collection<String> attributes = xmlDetector.getApplicableAttributes();
-            if (attributes == XmlScanner.ALL) {
-                mAllAttributeDetectors.add(xmlDetector);
-            }  else if (attributes != null) {
-                for (String attribute : attributes) {
-                    List<Detector.XmlScanner> list = mAttributeToCheck.get(attribute);
-                    if (list == null) {
-                        list = new ArrayList<Detector.XmlScanner>();
-                        mAttributeToCheck.put(attribute, list);
-                    }
-                    list.add(xmlDetector);
-                }
-            }
-            Collection<String> elements = xmlDetector.getApplicableElements();
-            if (elements == XmlScanner.ALL) {
-                mAllElementDetectors.add(xmlDetector);
-            } else if (elements != null) {
-                for (String element : elements) {
-                    List<Detector.XmlScanner> list = mElementToCheck.get(element);
-                    if (list == null) {
-                        list = new ArrayList<Detector.XmlScanner>();
-                        mElementToCheck.put(element, list);
-                    }
-                    list.add(xmlDetector);
-                }
-            }
-
-            if ((attributes == null || (attributes.isEmpty()
-                    && attributes != XmlScanner.ALL))
-                  && (elements == null || (elements.isEmpty()
-                  && elements != XmlScanner.ALL))) {
-                mDocumentDetectors.add(xmlDetector);
-            }
-        }
-    }
-
-    void visitFile(@NonNull XmlContext context, @NonNull File file) {
-        assert LintUtils.isXmlFile(file);
-        context.parser = mParser;
-
-        try {
-            if (context.document == null) {
-                context.document = mParser.parseXml(context);
-                if (context.document == null) {
-                    // No need to log this; the parser should be reporting
-                    // a full warning (such as IssueRegistry#PARSER_ERROR)
-                    // with details, location, etc.
-                    return;
-                }
-                if (context.document.getDocumentElement() == null) {
-                    // Ignore empty documents
-                    return;
-                }
-            }
-
-            for (Detector check : mAllDetectors) {
-                check.beforeCheckFile(context);
-            }
-
-            for (Detector.XmlScanner check : mDocumentDetectors) {
-                check.visitDocument(context, context.document);
-            }
-
-            if (!mElementToCheck.isEmpty() || !mAttributeToCheck.isEmpty()
-                    || !mAllAttributeDetectors.isEmpty() || !mAllElementDetectors.isEmpty()) {
-                visitElement(context, context.document.getDocumentElement());
-            }
-
-            for (Detector check : mAllDetectors) {
-                check.afterCheckFile(context);
-            }
-        } finally {
-            if (context.document != null) {
-                mParser.dispose(context, context.document);
-                context.document = null;
-            }
-        }
-    }
-
-    private void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        List<Detector.XmlScanner> elementChecks = mElementToCheck.get(element.getTagName());
-        if (elementChecks != null) {
-            assert elementChecks instanceof RandomAccess;
-            for (XmlScanner check : elementChecks) {
-                check.visitElement(context, element);
-            }
-        }
-        if (!mAllElementDetectors.isEmpty()) {
-            for (XmlScanner check : mAllElementDetectors) {
-                check.visitElement(context, element);
-            }
-        }
-
-        if (!mAttributeToCheck.isEmpty() || !mAllAttributeDetectors.isEmpty()) {
-            NamedNodeMap attributes = element.getAttributes();
-            for (int i = 0, n = attributes.getLength(); i < n; i++) {
-                Attr attribute = (Attr) attributes.item(i);
-                String name = attribute.getLocalName();
-                if (name == null) {
-                    name = attribute.getName();
-                }
-                List<Detector.XmlScanner> list = mAttributeToCheck.get(name);
-                if (list != null) {
-                    for (XmlScanner check : list) {
-                        check.visitAttribute(context, attribute);
-                    }
-                }
-                if (!mAllAttributeDetectors.isEmpty()) {
-                    for (XmlScanner check : mAllAttributeDetectors) {
-                        check.visitAttribute(context, attribute);
-                    }
-                }
-            }
-        }
-
-        // Visit children
-        NodeList childNodes = element.getChildNodes();
-        for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-            Node child = childNodes.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                visitElement(context, (Element) child);
-            }
-        }
-
-        // Post hooks
-        if (elementChecks != null) {
-            for (XmlScanner check : elementChecks) {
-                check.visitElementAfter(context, element);
-            }
-        }
-        if (!mAllElementDetectors.isEmpty()) {
-            for (XmlScanner check : mAllElementDetectors) {
-                check.visitElementAfter(context, element);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Category.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Category.java
deleted file mode 100644
index c267420..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Category.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.google.common.annotations.Beta;
-
-/**
- * A category is a container for related issues.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public final class Category implements Comparable<Category> {
-    private final String mName;
-    private final int mPriority;
-    private final Category mParent;
-
-    /**
-     * Creates a new {@link Category}.
-     *
-     * @param parent the name of a parent category, or null
-     * @param name the name of the category
-     * @param priority a sorting priority, with higher being more important
-     */
-    private Category(
-            @Nullable Category parent,
-            @NonNull String name,
-            int priority) {
-        mParent = parent;
-        mName = name;
-        mPriority = priority;
-    }
-
-    /**
-     * Creates a new top level {@link Category} with the given sorting priority.
-     *
-     * @param name the name of the category
-     * @param priority a sorting priority, with higher being more important
-     * @return a new category
-     */
-    @NonNull
-    public static Category create(@NonNull String name, int priority) {
-        return new Category(null, name, priority);
-    }
-
-    /**
-     * Creates a new top level {@link Category} with the given sorting priority.
-     *
-     * @param parent the name of a parent category, or null
-     * @param name the name of the category
-     * @param priority a sorting priority, with higher being more important
-     * @return a new category
-     */
-    @NonNull
-    public static Category create(@Nullable Category parent, @NonNull String name, int priority) {
-        return new Category(parent, name, priority);
-    }
-
-    /**
-     * Returns the parent category, or null if this is a top level category
-     *
-     * @return the parent category, or null if this is a top level category
-     */
-    public Category getParent() {
-        return mParent;
-    }
-
-    /**
-     * Returns the name of this category
-     *
-     * @return the name of this category
-     */
-    public String getName() {
-        return mName;
-    }
-
-    /**
-     * Returns a full name for this category. For a top level category, this is just
-     * the {@link #getName()} value, but for nested categories it will include the parent
-     * names as well.
-     *
-     * @return a full name for this category
-     */
-    public String getFullName() {
-        if (mParent != null) {
-            return mParent.getFullName() + ':' + mName;
-        } else {
-            return mName;
-        }
-    }
-
-    @Override
-    public int compareTo(Category other) {
-        if (other.mPriority == mPriority) {
-            if (mParent == other) {
-                return 1;
-            } else if (other.mParent == this) {
-                return -1;
-            }
-        }
-        return other.mPriority - mPriority;
-    }
-
-    /** Issues related to running lint itself */
-    public static final Category LINT = create("Lint", 110);
-
-    /** Issues related to correctness */
-    public static final Category CORRECTNESS = create("Correctness", 100);
-
-    /** Issues related to security */
-    public static final Category SECURITY = create("Security", 90);
-
-    /** Issues related to performance */
-    public static final Category PERFORMANCE = create("Performance", 80);
-
-    /** Issues related to usability */
-    public static final Category USABILITY = create("Usability", 70);
-
-    /** Issues related to accessibility */
-    public static final Category A11Y = create("Accessibility", 60);
-
-    /** Issues related to internationalization */
-    public static final Category I18N = create("Internationalization", 50);
-
-    // Sub categories
-
-    /** Issues related to icons */
-    public static final Category ICONS = create(USABILITY, "Icons", 73);
-
-    /** Issues related to typography */
-    public static final Category TYPOGRAPHY = create(USABILITY, "Typography", 76);
-
-    /** Issues related to messages/strings */
-    public static final Category MESSAGES = create(CORRECTNESS, "Messages", 95);
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/ClassContext.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/ClassContext.java
deleted file mode 100644
index 161f088..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/ClassContext.java
+++ /dev/null
@@ -1,682 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import static com.android.SdkConstants.CONSTRUCTOR_NAME;
-import static com.android.SdkConstants.DOT_CLASS;
-import static com.android.SdkConstants.DOT_JAVA;
-import static com.android.tools.lint.detector.api.Location.SearchDirection.BACKWARD;
-import static com.android.tools.lint.detector.api.Location.SearchDirection.EOL_BACKWARD;
-import static com.android.tools.lint.detector.api.Location.SearchDirection.FORWARD;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.client.api.LintDriver;
-import com.android.tools.lint.detector.api.Location.SearchDirection;
-import com.android.tools.lint.detector.api.Location.SearchHints;
-import com.google.common.annotations.Beta;
-import com.google.common.base.Splitter;
-
-import org.objectweb.asm.Type;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.FieldNode;
-import org.objectweb.asm.tree.LineNumberNode;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * A {@link Context} used when checking .class files.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public class ClassContext extends Context {
-    private final File mBinDir;
-    /** The class file DOM root node */
-    private final ClassNode mClassNode;
-    /** The class file byte data */
-    private final byte[] mBytes;
-    /** The source file, if known/found */
-    private File mSourceFile;
-    /** The contents of the source file, if source file is known/found */
-    private String mSourceContents;
-    /** Whether we've searched for the source file (used to avoid repeated failed searches) */
-    private boolean mSearchedForSource;
-    /** If the file is a relative path within a jar file, this is the jar file, otherwise null */
-    private final File mJarFile;
-    /** Whether this class is part of a library (rather than corresponding to one of the
-     * source files in this project */
-    private final boolean mFromLibrary;
-
-    /**
-     * Construct a new {@link ClassContext}
-     *
-     * @param driver the driver running through the checks
-     * @param project the project containing the file being checked
-     * @param main the main project if this project is a library project, or
-     *            null if this is not a library project. The main project is the
-     *            root project of all library projects, not necessarily the
-     *            directly including project.
-     * @param file the file being checked
-     * @param jarFile If the file is a relative path within a jar file, this is
-     *            the jar file, otherwise null
-     * @param binDir the root binary directory containing this .class file.
-     * @param bytes the bytecode raw data
-     * @param classNode the bytecode object model
-     * @param fromLibrary whether this class is from a library rather than part
-     *            of this project
-     * @param sourceContents initial contents of the Java source, if known, or
-     *            null
-     */
-    public ClassContext(
-            @NonNull LintDriver driver,
-            @NonNull Project project,
-            @Nullable Project main,
-            @NonNull File file,
-            @Nullable File jarFile,
-            @NonNull File binDir,
-            @NonNull byte[] bytes,
-            @NonNull ClassNode classNode,
-            boolean fromLibrary,
-            @Nullable String sourceContents) {
-        super(driver, project, main, file);
-        mJarFile = jarFile;
-        mBinDir = binDir;
-        mBytes = bytes;
-        mClassNode = classNode;
-        mFromLibrary = fromLibrary;
-        mSourceContents = sourceContents;
-    }
-
-    /**
-     * Returns the raw bytecode data for this class file
-     *
-     * @return the byte array containing the bytecode data
-     */
-    @NonNull
-    public byte[] getBytecode() {
-        return mBytes;
-    }
-
-    /**
-     * Returns the bytecode object model
-     *
-     * @return the bytecode object model, never null
-     */
-    @NonNull
-    public ClassNode getClassNode() {
-        return mClassNode;
-    }
-
-    /**
-     * Returns the jar file, if any. If this is null, the .class file is a real file
-     * on disk, otherwise it represents a relative path within the jar file.
-     *
-     * @return the jar file, or null
-     */
-    @Nullable
-    public File getJarFile() {
-        return mJarFile;
-    }
-
-    /**
-     * Returns whether this class is part of a library (not this project).
-     *
-     * @return true if this class is part of a library
-     */
-    public boolean isFromClassLibrary() {
-        return mFromLibrary;
-    }
-
-    /**
-     * Returns the source file for this class file, if possible.
-     *
-     * @return the source file, or null
-     */
-    @Nullable
-    public File getSourceFile() {
-        if (mSourceFile == null && !mSearchedForSource) {
-            mSearchedForSource = true;
-
-            String source = mClassNode.sourceFile;
-            if (source == null) {
-                source = file.getName();
-                if (source.endsWith(DOT_CLASS)) {
-                    source = source.substring(0, source.length() - DOT_CLASS.length()) + DOT_JAVA;
-                }
-                int index = source.indexOf('$');
-                if (index != -1) {
-                    source = source.substring(0, index) + DOT_JAVA;
-                }
-            }
-            if (source != null) {
-                if (mJarFile != null) {
-                    String relative = file.getParent() + File.separator + source;
-                    List<File> sources = getProject().getJavaSourceFolders();
-                    for (File dir : sources) {
-                        File sourceFile = new File(dir, relative);
-                        if (sourceFile.exists()) {
-                            mSourceFile = sourceFile;
-                            break;
-                        }
-                    }
-                } else {
-                    // Determine package
-                    String topPath = mBinDir.getPath();
-                    String parentPath = file.getParentFile().getPath();
-                    if (parentPath.startsWith(topPath)) {
-                        int start = topPath.length() + 1;
-                        String relative = start > parentPath.length() ? // default package?
-                                "" : parentPath.substring(start);
-                        List<File> sources = getProject().getJavaSourceFolders();
-                        for (File dir : sources) {
-                            File sourceFile = new File(dir, relative + File.separator + source);
-                            if (sourceFile.exists()) {
-                                mSourceFile = sourceFile;
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return mSourceFile;
-    }
-
-    /**
-     * Returns the contents of the source file for this class file, if found.
-     *
-     * @return the source contents, or ""
-     */
-    @NonNull
-    public String getSourceContents() {
-        if (mSourceContents == null) {
-            File sourceFile = getSourceFile();
-            if (sourceFile != null) {
-                mSourceContents = getClient().readFile(mSourceFile);
-            }
-
-            if (mSourceContents == null) {
-                mSourceContents = "";
-            }
-        }
-
-        return mSourceContents;
-    }
-
-    /**
-     * Returns the contents of the source file for this class file, if found. If
-     * {@code read} is false, do not read the source contents if it has not
-     * already been read. (This is primarily intended for the lint
-     * infrastructure; most client code would call {@link #getSourceContents()}
-     * .)
-     *
-     * @param read whether to read the source contents if it has not already
-     *            been initialized
-     * @return the source contents, which will never be null if {@code read} is
-     *         true, or null if {@code read} is false and the source contents
-     *         hasn't already been read.
-     */
-    @Nullable
-    public String getSourceContents(boolean read) {
-        if (read) {
-            return getSourceContents();
-        } else {
-            return mSourceContents;
-        }
-    }
-
-    /**
-     * Returns a location for the given source line number in this class file's
-     * source file, if available.
-     *
-     * @param line the line number (1-based, which is what ASM uses)
-     * @param patternStart optional pattern to search for in the source for
-     *            range start
-     * @param patternEnd optional pattern to search for in the source for range
-     *            end
-     * @param hints additional hints about the pattern search (provided
-     *            {@code patternStart} is non null)
-     * @return a location, never null
-     */
-    @NonNull
-    public Location getLocationForLine(int line, @Nullable String patternStart,
-            @Nullable String patternEnd, @Nullable SearchHints hints) {
-        File sourceFile = getSourceFile();
-        if (sourceFile != null) {
-            // ASM line numbers are 1-based, and lint line numbers are 0-based
-            if (line != -1) {
-                return Location.create(sourceFile, getSourceContents(), line - 1,
-                        patternStart, patternEnd, hints);
-            } else {
-                return Location.create(sourceFile);
-            }
-        }
-
-        return Location.create(file);
-    }
-
-    /**
-     * Reports an issue.
-     * <p>
-     * Detectors should only call this method if an error applies to the whole class
-     * scope and there is no specific method or field that applies to the error.
-     * If so, use
-     * {@link #report(Issue, MethodNode, AbstractInsnNode, Location, String, Object)} or
-     * {@link #report(Issue, FieldNode, Location, String, Object)}, such that
-     * suppress annotations are checked.
-     *
-     * @param issue the issue to report
-     * @param location the location of the issue, or null if not known
-     * @param message the message for this warning
-     * @param data any associated data, or null
-     */
-    @Override
-    public void report(
-            @NonNull Issue issue,
-            @Nullable Location location,
-            @NonNull String message,
-            @Nullable Object data) {
-        if (mDriver.isSuppressed(issue, mClassNode)) {
-            return;
-        }
-        ClassNode curr = mClassNode;
-        while (curr != null) {
-            ClassNode prev = curr;
-            curr = mDriver.getOuterClassNode(curr);
-            if (curr != null) {
-                if (prev.outerMethod != null) {
-                    @SuppressWarnings("rawtypes") // ASM API
-                    List methods = curr.methods;
-                    for (Object m : methods) {
-                        MethodNode method = (MethodNode) m;
-                        if (method.name.equals(prev.outerMethod)
-                                && method.desc.equals(prev.outerMethodDesc)) {
-                            // Found the outer method for this anonymous class; continue
-                            // reporting on it (which will also work its way up the parent
-                            // class hierarchy)
-                            if (method != null && mDriver.isSuppressed(issue, mClassNode, method,
-                                    null)) {
-                                return;
-                            }
-                            break;
-                        }
-                    }
-                }
-                if (mDriver.isSuppressed(issue, curr)) {
-                    return;
-                }
-            }
-        }
-
-        super.report(issue, location, message, data);
-    }
-
-    // Unfortunately, ASMs nodes do not extend a common DOM node type with parent
-    // pointers, so we have to have multiple methods which pass in each type
-    // of node (class, method, field) to be checked.
-
-    /**
-     * Reports an issue applicable to a given method node.
-     *
-     * @param issue the issue to report
-     * @param method the method scope the error applies to. The lint
-     *            infrastructure will check whether there are suppress
-     *            annotations on this method (or its enclosing class) and if so
-     *            suppress the warning without involving the client.
-     * @param instruction the instruction within the method the error applies
-     *            to. You cannot place annotations on individual method
-     *            instructions (for example, annotations on local variables are
-     *            allowed, but are not kept in the .class file). However, this
-     *            instruction is needed to handle suppressing errors on field
-     *            initializations; in that case, the errors may be reported in
-     *            the {@code <clinit>} method, but the annotation is found not
-     *            on that method but for the {@link FieldNode}'s.
-     * @param location the location of the issue, or null if not known
-     * @param message the message for this warning
-     * @param data any associated data, or null
-     */
-    public void report(
-            @NonNull Issue issue,
-            @Nullable MethodNode method,
-            @Nullable AbstractInsnNode instruction,
-            @Nullable Location location,
-            @NonNull String message,
-            @Nullable Object data) {
-        if (method != null && mDriver.isSuppressed(issue, mClassNode, method, instruction)) {
-            return;
-        }
-        report(issue, location, message, data); // also checks the class node
-    }
-
-    /**
-     * Reports an issue applicable to a given method node.
-     *
-     * @param issue the issue to report
-     * @param field the scope the error applies to. The lint infrastructure
-     *    will check whether there are suppress annotations on this field (or its enclosing
-     *    class) and if so suppress the warning without involving the client.
-     * @param location the location of the issue, or null if not known
-     * @param message the message for this warning
-     * @param data any associated data, or null
-     */
-    public void report(
-            @NonNull Issue issue,
-            @Nullable FieldNode field,
-            @Nullable Location location,
-            @NonNull String message,
-            @Nullable Object data) {
-        if (field != null && mDriver.isSuppressed(issue, field)) {
-            return;
-        }
-        report(issue, location, message, data); // also checks the class node
-    }
-
-    /**
-     * Finds the line number closest to the given node
-     *
-     * @param node the instruction node to get a line number for
-     * @return the closest line number, or -1 if not known
-     */
-    public static int findLineNumber(@NonNull AbstractInsnNode node) {
-        AbstractInsnNode curr = node;
-
-        // First search backwards
-        while (curr != null) {
-            if (curr.getType() == AbstractInsnNode.LINE) {
-                return ((LineNumberNode) curr).line;
-            }
-            curr = curr.getPrevious();
-        }
-
-        // Then search forwards
-        curr = node;
-        while (curr != null) {
-            if (curr.getType() == AbstractInsnNode.LINE) {
-                return ((LineNumberNode) curr).line;
-            }
-            curr = curr.getNext();
-        }
-
-        return -1;
-    }
-
-    /**
-     * Finds the line number closest to the given method declaration
-     *
-     * @param node the method node to get a line number for
-     * @return the closest line number, or -1 if not known
-     */
-    public static int findLineNumber(@NonNull MethodNode node) {
-        if (node.instructions != null && node.instructions.size() > 0) {
-            return findLineNumber(node.instructions.get(0));
-        }
-
-        return -1;
-    }
-
-    /**
-     * Finds the line number closest to the given class declaration
-     *
-     * @param node the method node to get a line number for
-     * @return the closest line number, or -1 if not known
-     */
-    public static int findLineNumber(@NonNull ClassNode node) {
-        if (node.methods != null && !node.methods.isEmpty()) {
-            MethodNode firstMethod = getFirstRealMethod(node);
-            if (firstMethod != null) {
-                return findLineNumber(firstMethod);
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Returns a location for the given {@link ClassNode}, where class node is
-     * either the top level class, or an inner class, in the current context.
-     *
-     * @param classNode the class in the current context
-     * @return a location pointing to the class declaration, or as close to it
-     *         as possible
-     */
-    @NonNull
-    public Location getLocation(@NonNull ClassNode classNode) {
-        // Attempt to find a proper location for this class. This is tricky
-        // since classes do not have line number entries in the class file; we need
-        // to find a method, look up the corresponding line number then search
-        // around it for a suitable tag, such as the class name.
-        String pattern;
-        if (isAnonymousClass(classNode.name)) {
-            pattern = classNode.superName;
-        } else {
-            pattern = classNode.name;
-        }
-        int index = pattern.lastIndexOf('$');
-        if (index != -1) {
-            pattern = pattern.substring(index + 1);
-        }
-        index = pattern.lastIndexOf('/');
-        if (index != -1) {
-            pattern = pattern.substring(index + 1);
-        }
-
-        return getLocationForLine(findLineNumber(classNode), pattern, null,
-                SearchHints.create(BACKWARD).matchJavaSymbol());
-    }
-
-    @Nullable
-    private static MethodNode getFirstRealMethod(@NonNull ClassNode classNode) {
-        // Return the first method in the class for line number purposes. Skip <init>,
-        // since it's typically not located near the real source of the method.
-        if (classNode.methods != null) {
-            @SuppressWarnings("rawtypes") // ASM API
-            List methods = classNode.methods;
-            for (Object m : methods) {
-                MethodNode method = (MethodNode) m;
-                if (method.name.charAt(0) != '<') {
-                    return method;
-                }
-            }
-
-            if (!classNode.methods.isEmpty()) {
-                return (MethodNode) classNode.methods.get(0);
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a location for the given {@link MethodNode}.
-     *
-     * @param methodNode the class in the current context
-     * @param classNode the class containing the method
-     * @return a location pointing to the class declaration, or as close to it
-     *         as possible
-     */
-    @NonNull
-    public Location getLocation(@NonNull MethodNode methodNode,
-            @NonNull ClassNode classNode) {
-        // Attempt to find a proper location for this class. This is tricky
-        // since classes do not have line number entries in the class file; we need
-        // to find a method, look up the corresponding line number then search
-        // around it for a suitable tag, such as the class name.
-        String pattern;
-        SearchDirection searchMode;
-        if (methodNode.name.equals(CONSTRUCTOR_NAME)) {
-            searchMode = EOL_BACKWARD;
-            if (isAnonymousClass(classNode.name)) {
-                pattern = classNode.superName.substring(classNode.superName.lastIndexOf('/') + 1);
-            } else {
-                pattern = classNode.name.substring(classNode.name.lastIndexOf('$') + 1);
-            }
-        } else {
-            searchMode = BACKWARD;
-            pattern = methodNode.name;
-        }
-
-        return getLocationForLine(findLineNumber(methodNode), pattern, null,
-                SearchHints.create(searchMode).matchJavaSymbol());
-    }
-
-    /**
-     * Returns a location for the given {@link AbstractInsnNode}.
-     *
-     * @param instruction the instruction to look up the location for
-     * @return a location pointing to the instruction, or as close to it
-     *         as possible
-     */
-    @NonNull
-    public Location getLocation(@NonNull AbstractInsnNode instruction) {
-        SearchHints hints = SearchHints.create(FORWARD).matchJavaSymbol();
-        String pattern = null;
-        if (instruction instanceof MethodInsnNode) {
-            MethodInsnNode call = (MethodInsnNode) instruction;
-            if (call.name.equals(CONSTRUCTOR_NAME)) {
-                pattern = call.owner;
-                hints = hints.matchConstructor();
-            } else {
-                pattern = call.name;
-            }
-            int index = pattern.lastIndexOf('$');
-            if (index != -1) {
-                pattern = pattern.substring(index + 1);
-            }
-            index = pattern.lastIndexOf('/');
-            if (index != -1) {
-                pattern = pattern.substring(index + 1);
-            }
-        }
-
-        int line = findLineNumber(instruction);
-        return getLocationForLine(line, pattern, null, hints);
-    }
-
-    private static boolean isAnonymousClass(@NonNull String fqcn) {
-        int lastIndex = fqcn.lastIndexOf('$');
-        if (lastIndex != -1 && lastIndex < fqcn.length() - 1) {
-            if (Character.isDigit(fqcn.charAt(lastIndex + 1))) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Converts from a VM owner name (such as foo/bar/Foo$Baz) to a
-     * fully qualified class name (such as foo.bar.Foo.Baz).
-     *
-     * @param owner the owner name to convert
-     * @return the corresponding fully qualified class name
-     */
-    @NonNull
-    public static String getFqcn(@NonNull String owner) {
-        return owner.replace('/', '.').replace('$','.');
-    }
-
-    /**
-     * Computes a user-readable type signature from the given class owner, name
-     * and description. For example, for owner="foo/bar/Foo$Baz", name="foo",
-     * description="(I)V", it returns "void foo.bar.Foo.Bar#foo(int)".
-     *
-     * @param owner the class name
-     * @param name the method name
-     * @param desc the method description
-     * @return a user-readable string
-     */
-    public static String createSignature(String owner, String name, String desc) {
-        StringBuilder sb = new StringBuilder(100);
-
-        if (desc != null) {
-            Type returnType = Type.getReturnType(desc);
-            sb.append(getTypeString(returnType));
-            sb.append(' ');
-        }
-
-        if (owner != null) {
-            sb.append(getFqcn(owner));
-        }
-        if (name != null) {
-            sb.append('#');
-            sb.append(name);
-            if (desc != null) {
-                Type[] argumentTypes = Type.getArgumentTypes(desc);
-                if (argumentTypes != null && argumentTypes.length > 0) {
-                    sb.append('(');
-                    boolean first = true;
-                    for (Type type : argumentTypes) {
-                        if (first) {
-                            first = false;
-                        } else {
-                            sb.append(", ");
-                        }
-                        sb.append(getTypeString(type));
-                    }
-                    sb.append(')');
-                }
-            }
-        }
-
-        return sb.toString();
-    }
-
-    private static String getTypeString(Type type) {
-        String s = type.getClassName();
-        if (s.startsWith("java.lang.")) {           //$NON-NLS-1$
-            s = s.substring("java.lang.".length()); //$NON-NLS-1$
-        }
-
-        return s;
-    }
-
-    /**
-     * Computes the internal class name of the given fully qualified class name.
-     * For example, it converts foo.bar.Foo.Bar into foo/bar/Foo$Bar
-     *
-     * @param fqcn the fully qualified class name
-     * @return the internal class name
-     */
-    @NonNull
-    public static String getInternalName(@NonNull String fqcn) {
-        if (fqcn.indexOf('.') == -1) {
-            return fqcn;
-        }
-
-        StringBuilder sb = new StringBuilder(fqcn.length());
-        String prev = null;
-        for (String part : Splitter.on('.').split(fqcn)) {
-            if (prev != null) {
-                if (Character.isUpperCase(prev.charAt(0))) {
-                    sb.append('$');
-                } else {
-                    sb.append('/');
-                }
-            }
-            sb.append(part);
-            prev = part;
-        }
-
-        return sb.toString();
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Context.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Context.java
deleted file mode 100644
index a379dd0..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Context.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.client.api.Configuration;
-import com.android.tools.lint.client.api.LintClient;
-import com.android.tools.lint.client.api.LintDriver;
-import com.android.tools.lint.client.api.SdkInfo;
-import com.google.common.annotations.Beta;
-import com.google.common.base.Splitter;
-
-import java.io.File;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Context passed to the detectors during an analysis run. It provides
- * information about the file being analyzed, it allows shared properties (so
- * the detectors can share results), etc.
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public class Context {
-    /**
-     * The file being checked. Note that this may not always be to a concrete
-     * file. For example, in the {@link Detector#beforeCheckProject(Context)}
-     * method, the context file is the directory of the project.
-     */
-    public final File file;
-
-    /** The driver running through the checks */
-    protected final LintDriver mDriver;
-
-    /** The project containing the file being checked */
-    @NonNull
-    private final Project mProject;
-
-    /**
-     * The "main" project. For normal projects, this is the same as {@link #mProject},
-     * but for library projects, it's the root project that includes (possibly indirectly)
-     * the various library projects and their library projects.
-     * <p>
-     * Note that this is a property on the {@link Context}, not the
-     * {@link Project}, since a library project can be included from multiple
-     * different top level projects, so there isn't <b>one</b> main project,
-     * just one per main project being analyzed with its library projects.
-     */
-    private final Project mMainProject;
-
-    /** The current configuration controlling which checks are enabled etc */
-    private final Configuration mConfiguration;
-
-    /** The contents of the file */
-    private String mContents;
-
-    /**
-     * Whether the lint job has been canceled.
-     * <p>
-     * Slow-running detectors should check this flag via
-     * {@link AtomicBoolean#get()} and abort if canceled
-     */
-    @NonNull
-    public final AtomicBoolean canceled = new AtomicBoolean();
-
-    /** Map of properties to share results between detectors */
-    private Map<String, Object> mProperties;
-
-    /**
-     * Construct a new {@link Context}
-     *
-     * @param driver the driver running through the checks
-     * @param project the project containing the file being checked
-     * @param main the main project if this project is a library project, or
-     *            null if this is not a library project. The main project is
-     *            the root project of all library projects, not necessarily the
-     *            directly including project.
-     * @param file the file being checked
-     */
-    public Context(
-            @NonNull LintDriver driver,
-            @NonNull Project project,
-            @Nullable Project main,
-            @NonNull File file) {
-        this.file = file;
-
-        mDriver = driver;
-        mProject = project;
-        mMainProject = main;
-        mConfiguration = project.getConfiguration();
-    }
-
-    /**
-     * Returns the scope for the lint job
-     *
-     * @return the scope, never null
-     */
-    @NonNull
-    public EnumSet<Scope> getScope() {
-        return mDriver.getScope();
-    }
-
-    /**
-     * Returns the configuration for this project.
-     *
-     * @return the configuration, never null
-     */
-    @NonNull
-    public Configuration getConfiguration() {
-        return mConfiguration;
-    }
-
-    /**
-     * Returns the project containing the file being checked
-     *
-     * @return the project, never null
-     */
-    @NonNull
-    public Project getProject() {
-        return mProject;
-    }
-
-    /**
-     * Returns the main project if this project is a library project, or self
-     * if this is not a library project. The main project is the root project
-     * of all library projects, not necessarily the directly including project.
-     *
-     * @return the main project, never null
-     */
-    @NonNull
-    public Project getMainProject() {
-        return mMainProject != null ? mMainProject : mProject;
-    }
-
-    /**
-     * Returns the lint client requesting the lint check
-     *
-     * @return the client, never null
-     */
-    @NonNull
-    public LintClient getClient() {
-        return mDriver.getClient();
-    }
-
-    /**
-     * Returns the driver running through the lint checks
-     *
-     * @return the driver
-     */
-    @NonNull
-    public LintDriver getDriver() {
-        return mDriver;
-    }
-
-    /**
-     * Returns the contents of the file. This may not be the contents of the
-     * file on disk, since it delegates to the {@link LintClient}, which in turn
-     * may decide to return the current edited contents of the file open in an
-     * editor.
-     *
-     * @return the contents of the given file, or null if an error occurs.
-     */
-    @Nullable
-    public String getContents() {
-        if (mContents == null) {
-            mContents = mDriver.getClient().readFile(file);
-        }
-
-        return mContents;
-    }
-
-    /**
-     * Returns the value of the given named property, or null.
-     *
-     * @param name the name of the property
-     * @return the corresponding value, or null
-     */
-    @Nullable
-    public Object getProperty(String name) {
-        if (mProperties == null) {
-            return null;
-        }
-
-        return mProperties.get(name);
-    }
-
-    /**
-     * Sets the value of the given named property.
-     *
-     * @param name the name of the property
-     * @param value the corresponding value
-     */
-    public void setProperty(@NonNull String name, @Nullable Object value) {
-        if (value == null) {
-            if (mProperties != null) {
-                mProperties.remove(name);
-            }
-        } else {
-            if (mProperties == null) {
-                mProperties = new HashMap<String, Object>();
-            }
-            mProperties.put(name, value);
-        }
-    }
-
-    /**
-     * Gets the SDK info for the current project.
-     *
-     * @return the SDK info for the current project, never null
-     */
-    @NonNull
-    public SdkInfo getSdkInfo() {
-        return mProject.getSdkInfo();
-    }
-
-    // ---- Convenience wrappers  ---- (makes the detector code a bit leaner)
-
-    /**
-     * Returns false if the given issue has been disabled. Convenience wrapper
-     * around {@link Configuration#getSeverity(Issue)}.
-     *
-     * @param issue the issue to check
-     * @return false if the issue has been disabled
-     */
-    public boolean isEnabled(@NonNull Issue issue) {
-        return mConfiguration.isEnabled(issue);
-    }
-
-    /**
-     * Reports an issue. Convenience wrapper around {@link LintClient#report}
-     *
-     * @param issue the issue to report
-     * @param location the location of the issue, or null if not known
-     * @param message the message for this warning
-     * @param data any associated data, or null
-     */
-    public void report(
-            @NonNull Issue issue,
-            @Nullable Location location,
-            @NonNull String message,
-            @Nullable Object data) {
-        Configuration configuration = mConfiguration;
-
-        // If this error was computed for a context where the context corresponds to
-        // a project instead of a file, the actual error may be in a different project (e.g.
-        // a library project), so adjust the configuration as necessary.
-        if (location != null && location.getFile() != null) {
-            Project project = mDriver.findProjectFor(location.getFile());
-            if (project != null) {
-                configuration = project.getConfiguration();
-            }
-        }
-
-        // If an error occurs in a library project, but you've disabled that check in the
-        // main project, disable it in the library project too. (In some cases you don't
-        // control the lint.xml of a library project, and besides, if you're not interested in
-        // a check for your main project you probably don't care about it in the library either.)
-        if (configuration != mConfiguration
-                && mConfiguration.getSeverity(issue) == Severity.IGNORE) {
-            return;
-        }
-
-        Severity severity = configuration.getSeverity(issue);
-        if (severity == Severity.IGNORE) {
-            return;
-        }
-
-        mDriver.getClient().report(this, issue, severity, location, message, data);
-    }
-
-    /**
-     * Send an exception to the log. Convenience wrapper around {@link LintClient#log}.
-     *
-     * @param exception the exception, possibly null
-     * @param format the error message using {@link String#format} syntax, possibly null
-     * @param args any arguments for the format string
-     */
-    public void log(
-            @Nullable Throwable exception,
-            @Nullable String format,
-            @Nullable Object... args) {
-        mDriver.getClient().log(exception, format, args);
-    }
-
-    /**
-     * Returns the current phase number. The first pass is numbered 1. Only one pass
-     * will be performed, unless a {@link Detector} calls {@link #requestRepeat}.
-     *
-     * @return the current phase, usually 1
-     */
-    public int getPhase() {
-        return mDriver.getPhase();
-    }
-
-    /**
-     * Requests another pass through the data for the given detector. This is
-     * typically done when a detector needs to do more expensive computation,
-     * but it only wants to do this once it <b>knows</b> that an error is
-     * present, or once it knows more specifically what to check for.
-     *
-     * @param detector the detector that should be included in the next pass.
-     *            Note that the lint runner may refuse to run more than a couple
-     *            of runs.
-     * @param scope the scope to be revisited. This must be a subset of the
-     *       current scope ({@link #getScope()}, and it is just a performance hint;
-     *       in particular, the detector should be prepared to be called on other
-     *       scopes as well (since they may have been requested by other detectors).
-     *       You can pall null to indicate "all".
-     */
-    public void requestRepeat(@NonNull Detector detector, @Nullable EnumSet<Scope> scope) {
-        mDriver.requestRepeat(detector, scope);
-    }
-
-    /** Pattern for version qualifiers */
-    private static final Pattern VERSION_PATTERN = Pattern.compile("^v(\\d+)$"); //$NON-NLS-1$
-
-    private static File sCachedFolder = null;
-    private static int sCachedFolderVersion = -1;
-
-    /**
-     * Returns the folder version. For example, for the file values-v14/foo.xml,
-     * it returns 14.
-     *
-     * @return the folder version, or -1 if no specific version was specified
-     */
-    public int getFolderVersion() {
-        return getFolderVersion(file);
-    }
-
-    /**
-     * Returns the folder version of the given file. For example, for the file values-v14/foo.xml,
-     * it returns 14.
-     *
-     * @param file the file to be checked
-     * @return the folder version, or -1 if no specific version was specified
-     */
-    public static int getFolderVersion(File file) {
-        File parent = file.getParentFile();
-        if (parent.equals(sCachedFolder)) {
-            return sCachedFolderVersion;
-        }
-
-        sCachedFolder = parent;
-        sCachedFolderVersion = -1;
-
-        for (String qualifier : Splitter.on('-').split(parent.getName())) {
-            Matcher matcher = VERSION_PATTERN.matcher(qualifier);
-            if (matcher.matches()) {
-                sCachedFolderVersion = Integer.parseInt(matcher.group(1));
-                break;
-            }
-        }
-
-        return sCachedFolderVersion;
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/DefaultPosition.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/DefaultPosition.java
deleted file mode 100644
index 72c8ee7..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/DefaultPosition.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.google.common.annotations.Beta;
-
-/**
- * A simple offset-based position *
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public class DefaultPosition extends Position {
-    /** The line number (0-based where the first line is line 0) */
-    private final int mLine;
-
-    /**
-     * The column number (where the first character on the line is 0), or -1 if
-     * unknown
-     */
-    private final int mColumn;
-
-    /** The character offset */
-    private final int mOffset;
-
-    /**
-     * Creates a new {@link DefaultPosition}
-     *
-     * @param line the 0-based line number, or -1 if unknown
-     * @param column the 0-based column number, or -1 if unknown
-     * @param offset the offset, or -1 if unknown
-     */
-    public DefaultPosition(int line, int column, int offset) {
-        mLine = line;
-        mColumn = column;
-        mOffset = offset;
-    }
-
-    @Override
-    public int getLine() {
-        return mLine;
-    }
-
-    @Override
-    public int getOffset() {
-        return mOffset;
-    }
-
-    @Override
-    public int getColumn() {
-        return mColumn;
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Detector.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Detector.java
deleted file mode 100644
index a3412cf..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Detector.java
+++ /dev/null
@@ -1,611 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.client.api.LintDriver;
-import com.google.common.annotations.Beta;
-import lombok.ast.AstVisitor;
-import lombok.ast.MethodInvocation;
-import lombok.ast.Node;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.List;
-
-/**
- * A detector is able to find a particular problem. It might also be thought of as enforcing
- * a rule, but "rule" is a bit overloaded in ADT terminology since ViewRules are used in
- * the Rules API to allow views to specify designtime behavior in the graphical layout editor.
- * <p>
- * Each detector provides information about the issues it can find, such as an explanation
- * of how to fix the issue, the priority, the category, etc. It also has an id which is
- * used to persistently identify a particular type of error.
- * <p>
- * Detectors will be called in a predefined order:
- * <ol>
- *   <li> Manifest file
- *   <li> Resource files, in alphabetical order by resource type
- *        (therefore, "layout" is checked before "values", "values-de" is checked before
- *        "values-en" but after "values", and so on.
- *   <li> Java sources
- *   <li> Java classes
- *   <li> Proguard files
- * </ol>
- * If a detector needs information when processing a file type that comes from a type of
- * file later in the order above, they can request a second phase; see
- * {@link LintDriver#requestRepeat}.
- * <p>
- * NOTE: Detectors might be constructed just once and shared between lint runs, so
- * any per-detector state should be initialized and reset via the before/after
- * methods.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public abstract class Detector {
-    /** Specialized interface for detectors that scan Java source file parse trees */
-    public interface JavaScanner  {
-        /**
-         * Create a parse tree visitor to process the parse tree. All
-         * {@link JavaScanner} detectors must provide a visitor, unless they
-         * either return true from {@link #appliesToResourceRefs()} or return
-         * non null from {@link #getApplicableMethodNames()}.
-         * <p>
-         * If you return specific AST node types from
-         * {@link #getApplicableNodeTypes()}, then the visitor will <b>only</b>
-         * be called for the specific requested node types. This is more
-         * efficient, since it allows many detectors that apply to only a small
-         * part of the AST (such as method call nodes) to share iteration of the
-         * majority of the parse tree.
-         * <p>
-         * If you return null from {@link #getApplicableNodeTypes()}, then your
-         * visitor will be called from the top and all node types visited.
-         * <p>
-         * Note that a new visitor is created for each separate compilation
-         * unit, so you can store per file state in the visitor.
-         *
-         * @param context the {@link Context} for the file being analyzed
-         * @return a visitor, or null.
-         */
-        @Nullable
-        AstVisitor createJavaVisitor(@NonNull JavaContext context);
-
-        /**
-         * Return the types of AST nodes that the visitor returned from
-         * {@link #createJavaVisitor(JavaContext)} should visit. See the
-         * documentation for {@link #createJavaVisitor(JavaContext)} for details
-         * on how the shared visitor is used.
-         * <p>
-         * If you return null from this method, then the visitor will process
-         * the full tree instead.
-         * <p>
-         * Note that for the shared visitor, the return codes from the visit
-         * methods are ignored: returning true will <b>not</b> prune iteration
-         * of the subtree, since there may be other node types interested in the
-         * children. If you need to ensure that your visitor only processes a
-         * part of the tree, use a full visitor instead. See the
-         * OverdrawDetector implementation for an example of this.
-         *
-         * @return the list of applicable node types (AST node classes), or null
-         */
-        @Nullable
-        List<Class<? extends Node>> getApplicableNodeTypes();
-
-        /**
-         * Return the list of method names this detector is interested in, or
-         * null. If this method returns non-null, then any AST nodes that match
-         * a method call in the list will be passed to the
-         * {@link #visitMethod(JavaContext, AstVisitor, MethodInvocation)}
-         * method for processing. The visitor created by
-         * {@link #createJavaVisitor(JavaContext)} is also passed to that
-         * method, although it can be null.
-         * <p>
-         * This makes it easy to write detectors that focus on some fixed calls.
-         * For example, the StringFormatDetector uses this mechanism to look for
-         * "format" calls, and when found it looks around (using the AST's
-         * {@link Node#getParent()} method) to see if it's called on
-         * a String class instance, and if so do its normal processing. Note
-         * that since it doesn't need to do any other AST processing, that
-         * detector does not actually supply a visitor.
-         *
-         * @return a set of applicable method names, or null.
-         */
-        @Nullable
-        List<String> getApplicableMethodNames();
-
-        /**
-         * Method invoked for any method calls found that matches any names
-         * returned by {@link #getApplicableMethodNames()}. This also passes
-         * back the visitor that was created by
-         * {@link #createJavaVisitor(JavaContext)}, but a visitor is not
-         * required. It is intended for detectors that need to do additional AST
-         * processing, but also want the convenience of not having to look for
-         * method names on their own.
-         *
-         * @param context the context of the lint request
-         * @param visitor the visitor created from
-         *            {@link #createJavaVisitor(JavaContext)}, or null
-         * @param node the {@link MethodInvocation} node for the invoked method
-         */
-        void visitMethod(
-                @NonNull JavaContext context,
-                @Nullable AstVisitor visitor,
-                @NonNull MethodInvocation node);
-
-        /**
-         * Returns whether this detector cares about Android resource references
-         * (such as {@code R.layout.main} or {@code R.string.app_name}). If it
-         * does, then the visitor will look for these patterns, and if found, it
-         * will invoke {@link #visitResourceReference} passing the resource type
-         * and resource name. It also passes the visitor, if any, that was
-         * created by {@link #createJavaVisitor(JavaContext)}, such that a
-         * detector can do more than just look for resources.
-         *
-         * @return true if this detector wants to be notified of R resource
-         *         identifiers found in the code.
-         */
-        boolean appliesToResourceRefs();
-
-        /**
-         * Called for any resource references (such as {@code R.layout.main}
-         * found in Java code, provided this detector returned {@code true} from
-         * {@link #appliesToResourceRefs()}.
-         *
-         * @param context the lint scanning context
-         * @param visitor the visitor created from
-         *            {@link #createJavaVisitor(JavaContext)}, or null
-         * @param node the variable reference for the resource
-         * @param type the resource type, such as "layout" or "string"
-         * @param name the resource name, such as "main" from
-         *            {@code R.layout.main}
-         * @param isFramework whether the resource is a framework resource
-         *            (android.R) or a local project resource (R)
-         */
-        void visitResourceReference(
-                @NonNull JavaContext context,
-                @Nullable AstVisitor visitor,
-                @NonNull Node node,
-                @NonNull String type,
-                @NonNull String name,
-                boolean isFramework);
-    }
-
-    /** Specialized interface for detectors that scan Java class files */
-    public interface ClassScanner  {
-        /**
-         * Checks the given class' bytecode for issues.
-         *
-         * @param context the context of the lint check, pointing to for example
-         *            the file
-         * @param classNode the root class node
-         */
-        void checkClass(@NonNull ClassContext context, @NonNull ClassNode classNode);
-
-        /**
-         * Returns the list of node types (corresponding to the constants in the
-         * {@link AbstractInsnNode} class) that this scanner applies to. The
-         * {@link #checkInstruction(ClassContext, ClassNode, MethodNode, AbstractInsnNode)}
-         * method will be called for each match.
-         *
-         * @return an array containing all the node types this detector should be
-         *         called for, or null if none.
-         */
-        @Nullable
-        int[] getApplicableAsmNodeTypes();
-
-        /**
-         * Process a given instruction node, and register lint issues if
-         * applicable.
-         *
-         * @param context the context of the lint check, pointing to for example
-         *            the file
-         * @param classNode the root class node
-         * @param method the method node containing the call
-         * @param instruction the actual instruction
-         */
-        void checkInstruction(@NonNull ClassContext context, @NonNull ClassNode classNode,
-                @NonNull MethodNode method, @NonNull AbstractInsnNode instruction);
-
-        /**
-         * Return the list of method call names (in VM format, e.g. "<init>" for
-         * constructors, etc) for method calls this detector is interested in,
-         * or null. T his will be used to dispatch calls to
-         * {@link #checkCall(ClassContext, ClassNode, MethodNode, MethodInsnNode)}
-         * for only the method calls in owners that the detector is interested
-         * in.
-         * <p>
-         * <b>NOTE</b>: If you return non null from this method, then <b>only</b>
-         * {@link #checkCall(ClassContext, ClassNode, MethodNode, MethodInsnNode)}
-         * will be called if a suitable method is found;
-         * {@link #checkClass(ClassContext, ClassNode)} will not be called under
-         * any circumstances.
-         * <p>
-         * This makes it easy to write detectors that focus on some fixed calls,
-         * and allows lint to make a single pass over the bytecode over a class,
-         * and efficiently dispatch method calls to any detectors that are
-         * interested in it. Without this, each new lint check interested in a
-         * single method, would be doing a complete pass through all the
-         * bytecode instructions of the class via the
-         * {@link #checkClass(ClassContext, ClassNode)} method, which would make
-         * each newly added lint check make lint slower. Now a single dispatch
-         * map is used instead, and for each encountered call in the single
-         * dispatch, it looks up in the map which if any detectors are
-         * interested in the given call name, and dispatches to each one in
-         * turn.
-         *
-         * @return a list of applicable method names, or null.
-         */
-        @Nullable
-        List<String> getApplicableCallNames();
-
-        /**
-         * Just like {@link Detector#getApplicableCallNames()}, but for the owner
-         * field instead. The
-         * {@link #checkCall(ClassContext, ClassNode, MethodNode, MethodInsnNode)}
-         * method will be called for all {@link MethodInsnNode} instances where the
-         * owner field matches any of the members returned in this node.
-         * <p>
-         * Note that if your detector provides both a name and an owner, the
-         * method will be called for any nodes matching either the name <b>or</b>
-         * the owner, not only where they match <b>both</b>. Note also that it will
-         * be called twice - once for the name match, and (at least once) for the owner
-         * match.
-         *
-         * @return a list of applicable owner names, or null.
-         */
-        @Nullable
-        List<String> getApplicableCallOwners();
-
-        /**
-         * Process a given method call node, and register lint issues if
-         * applicable. This is similar to the
-         * {@link #checkInstruction(ClassContext, ClassNode, MethodNode, AbstractInsnNode)}
-         * method, but has the additional advantage that it is only called for known
-         * method names or method owners, according to
-         * {@link #getApplicableCallNames()} and {@link #getApplicableCallOwners()}.
-         *
-         * @param context the context of the lint check, pointing to for example
-         *            the file
-         * @param classNode the root class node
-         * @param method the method node containing the call
-         * @param call the actual method call node
-         */
-        void checkCall(@NonNull ClassContext context, @NonNull ClassNode classNode,
-                @NonNull MethodNode method, @NonNull MethodInsnNode call);
-    }
-
-    /** Specialized interface for detectors that scan XML files */
-    public interface XmlScanner {
-        /**
-         * Visit the given document. The detector is responsible for its own iteration
-         * through the document.
-         * @param context information about the document being analyzed
-         * @param document the document to examine
-         */
-        void visitDocument(@NonNull XmlContext context, @NonNull Document document);
-
-        /**
-         * Visit the given element.
-         * @param context information about the document being analyzed
-         * @param element the element to examine
-         */
-        void visitElement(@NonNull XmlContext context, @NonNull Element element);
-
-        /**
-         * Visit the given element after its children have been analyzed.
-         * @param context information about the document being analyzed
-         * @param element the element to examine
-         */
-        void visitElementAfter(@NonNull XmlContext context, @NonNull Element element);
-
-        /**
-         * Visit the given attribute.
-         * @param context information about the document being analyzed
-         * @param attribute the attribute node to examine
-         */
-        void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute);
-
-        /**
-         * Returns the list of elements that this detector wants to analyze. If non
-         * null, this detector will be called (specifically, the
-         * {@link #visitElement} method) for each matching element in the document.
-         * <p>
-         * If this method returns null, and {@link #getApplicableAttributes()} also returns
-         * null, then the {@link #visitDocument} method will be called instead.
-         *
-         * @return a collection of elements, or null, or the special
-         *         {@link XmlScanner#ALL} marker to indicate that every single
-         *         element should be analyzed.
-         */
-        @Nullable
-        Collection<String> getApplicableElements();
-
-        /**
-         * Returns the list of attributes that this detector wants to analyze. If non
-         * null, this detector will be called (specifically, the
-         * {@link #visitAttribute} method) for each matching attribute in the document.
-         * <p>
-         * If this method returns null, and {@link #getApplicableElements()} also returns
-         * null, then the {@link #visitDocument} method will be called instead.
-         *
-         * @return a collection of attributes, or null, or the special
-         *         {@link XmlScanner#ALL} marker to indicate that every single
-         *         attribute should be analyzed.
-         */
-        @Nullable
-        Collection<String> getApplicableAttributes();
-
-        /**
-         * Special marker collection returned by {@link #getApplicableElements()} or
-         * {@link #getApplicableAttributes()} to indicate that the check should be
-         * invoked on all elements or all attributes
-         */
-        @NonNull
-        List<String> ALL = new ArrayList<String>(0); // NOT Collections.EMPTY!
-        // We want to distinguish this from just an *empty* list returned by the caller!
-    }
-
-    /** Specialized interface for detectors that scan other files */
-    public interface OtherFileScanner {
-        /**
-         * Returns the set of files this scanner wants to consider.  If this includes
-         * {@link Scope#OTHER} then all source files will be checked. Note that the
-         * set of files will not just include files of the indicated type, but all files
-         * within the relevant source folder. For example, returning {@link Scope#JAVA_FILE}
-         * will not just return {@code .java} files, but also other resource files such as
-         * {@code .html} and other files found within the Java source folders.
-         * <p>
-         * Lint will call the {@link #run(Context)}} method when the file should be checked.
-         *
-         * @return set of scopes that define the types of source files the
-         *    detector wants to consider
-         */
-        @NonNull
-        EnumSet<Scope> getApplicableFiles();
-    }
-
-    /**
-     * Runs the detector. This method will not be called for certain specialized
-     * detectors, such as {@link XmlScanner} and {@link JavaScanner}, where
-     * there are specialized analysis methods instead such as
-     * {@link XmlScanner#visitElement(XmlContext, Element)}.
-     *
-     * @param context the context describing the work to be done
-     */
-    public void run(@NonNull Context context) {
-    }
-
-    /**
-     * Returns true if this detector applies to the given file
-     *
-     * @param context the context to check
-     * @param file the file in the context to check
-     * @return true if this detector applies to the given context and file
-     */
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return false;
-    }
-
-    /**
-     * Analysis is about to begin, perform any setup steps.
-     *
-     * @param context the context for the check referencing the project, lint
-     *            client, etc
-     */
-    public void beforeCheckProject(@NonNull Context context) {
-    }
-
-    /**
-     * Analysis has just been finished for the whole project, perform any
-     * cleanup or report issues that require project-wide analysis.
-     *
-     * @param context the context for the check referencing the project, lint
-     *            client, etc
-     */
-    public void afterCheckProject(@NonNull Context context) {
-    }
-
-    /**
-     * Analysis is about to begin for the given library project, perform any setup steps.
-     *
-     * @param context the context for the check referencing the project, lint
-     *            client, etc
-     */
-    public void beforeCheckLibraryProject(@NonNull Context context) {
-    }
-
-    /**
-     * Analysis has just been finished for the given library project, perform any
-     * cleanup or report issues that require library-project-wide analysis.
-     *
-     * @param context the context for the check referencing the project, lint
-     *            client, etc
-     */
-    public void afterCheckLibraryProject(@NonNull Context context) {
-    }
-
-    /**
-     * Analysis is about to be performed on a specific file, perform any setup
-     * steps.
-     * <p>
-     * Note: When this method is called at the beginning of checking an XML
-     * file, the context is guaranteed to be an instance of {@link XmlContext},
-     * and similarly for a Java source file, the context will be a
-     * {@link JavaContext} and so on.
-     *
-     * @param context the context for the check referencing the file to be
-     *            checked, the project, etc.
-     */
-    public void beforeCheckFile(@NonNull Context context) {
-    }
-
-    /**
-     * Analysis has just been finished for a specific file, perform any cleanup
-     * or report issues found
-     * <p>
-     * Note: When this method is called at the end of checking an XML
-     * file, the context is guaranteed to be an instance of {@link XmlContext},
-     * and similarly for a Java source file, the context will be a
-     * {@link JavaContext} and so on.
-     *
-     * @param context the context for the check referencing the file to be
-     *            checked, the project, etc.
-     */
-    public void afterCheckFile(@NonNull Context context) {
-    }
-
-    /**
-     * Returns the expected speed of this detector
-     *
-     * @return the expected speed of this detector
-     */
-    @NonNull
-    public Speed getSpeed() {
-        return Speed.NORMAL;
-    }
-
-    // ---- Dummy implementations to make implementing XmlScanner easier: ----
-
-    @SuppressWarnings("javadoc")
-    public void visitDocument(@NonNull XmlContext context, @NonNull Document document) {
-        // This method must be overridden if your detector does
-        // not return something from getApplicableElements or
-        // getApplicableAttributes
-        assert false;
-    }
-
-    @SuppressWarnings("javadoc")
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        // This method must be overridden if your detector returns
-        // tag names from getApplicableElements
-        assert false;
-    }
-
-    @SuppressWarnings("javadoc")
-    public void visitElementAfter(@NonNull XmlContext context, @NonNull Element element) {
-    }
-
-    @SuppressWarnings("javadoc")
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        // This method must be overridden if your detector returns
-        // attribute names from getApplicableAttributes
-        assert false;
-    }
-
-    @SuppressWarnings("javadoc")
-    @Nullable
-    public Collection<String> getApplicableElements() {
-        return null;
-    }
-
-    @Nullable
-    @SuppressWarnings("javadoc")
-    public Collection<String> getApplicableAttributes() {
-        return null;
-    }
-
-    // ---- Dummy implementations to make implementing JavaScanner easier: ----
-
-    @Nullable @SuppressWarnings("javadoc")
-    public List<String> getApplicableMethodNames() {
-        return null;
-    }
-
-    @Nullable @SuppressWarnings("javadoc")
-    public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
-        return null;
-    }
-
-    @Nullable @SuppressWarnings("javadoc")
-    public List<Class<? extends Node>> getApplicableNodeTypes() {
-        return null;
-    }
-
-    @SuppressWarnings("javadoc")
-    public void visitMethod(@NonNull JavaContext context, @Nullable AstVisitor visitor,
-            @NonNull MethodInvocation node) {
-    }
-
-    @SuppressWarnings("javadoc")
-    public boolean appliesToResourceRefs() {
-        return false;
-    }
-
-    @SuppressWarnings("javadoc")
-    public void visitResourceReference(@NonNull JavaContext context, @Nullable AstVisitor visitor,
-            @NonNull Node node, @NonNull String type, @NonNull String name,
-            boolean isFramework) {
-    }
-
-    // ---- Dummy implementations to make implementing a ClassScanner easier: ----
-
-    @SuppressWarnings("javadoc")
-    public void checkClass(@NonNull ClassContext context, @NonNull ClassNode classNode) {
-    }
-
-    @SuppressWarnings("javadoc")
-    @Nullable
-    public List<String> getApplicableCallNames() {
-        return null;
-    }
-
-    @SuppressWarnings("javadoc")
-    @Nullable
-    public List<String> getApplicableCallOwners() {
-        return null;
-    }
-
-    @SuppressWarnings("javadoc")
-    public void checkCall(@NonNull ClassContext context, @NonNull ClassNode classNode,
-            @NonNull MethodNode method, @NonNull MethodInsnNode call) {
-    }
-
-    @SuppressWarnings("javadoc")
-    @Nullable
-    public int[] getApplicableAsmNodeTypes() {
-        return null;
-    }
-
-    @SuppressWarnings("javadoc")
-    public void checkInstruction(@NonNull ClassContext context, @NonNull ClassNode classNode,
-            @NonNull MethodNode method, @NonNull AbstractInsnNode instruction) {
-    }
-
-    // ---- Dummy implementations to make implementing an OtherFileScanner easier: ----
-
-    public boolean appliesToFolder(@NonNull Scope scope, @Nullable ResourceFolderType folderType) {
-        return false;
-    }
-
-    @NonNull
-    public EnumSet<Scope> getApplicableFiles() {
-        return Scope.OTHER_SCOPE;
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Issue.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Issue.java
deleted file mode 100644
index e5856b9..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Issue.java
+++ /dev/null
@@ -1,552 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.client.api.Configuration;
-import com.android.tools.lint.client.api.IssueRegistry;
-import com.google.common.annotations.Beta;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.List;
-
-
-/**
- * An issue is a potential bug in an Android application. An issue is discovered
- * by a {@link Detector}, and has an associated {@link Severity}.
- * <p>
- * Issues and detectors are separate classes because a detector can discover
- * multiple different issues as it's analyzing code, and we want to be able to
- * different severities for different issues, the ability to suppress one but
- * not other issues from the same detector, and so on.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public final class Issue implements Comparable<Issue> {
-    private static final String HTTP_PREFIX = "http://"; //$NON-NLS-1$
-
-    private final String mId;
-    private final String mDescription;
-    private final String mExplanation;
-    private final Category mCategory;
-    private final int mPriority;
-    private final Severity mSeverity;
-    private String mMoreInfoUrl;
-    private boolean mEnabledByDefault = true;
-    private final EnumSet<Scope> mScope;
-    private List<EnumSet<Scope>> mAnalysisScopes;
-    private final Class<? extends Detector> mClass;
-
-    // Use factory methods
-    private Issue(
-            @NonNull String id,
-            @NonNull String description,
-            @NonNull String explanation,
-            @NonNull Category category,
-            int priority,
-            @NonNull Severity severity,
-            @NonNull Class<? extends Detector> detectorClass,
-            @NonNull EnumSet<Scope> scope) {
-        super();
-        mId = id;
-        mDescription = description;
-        mExplanation = explanation;
-        mCategory = category;
-        mPriority = priority;
-        mSeverity = severity;
-        mClass = detectorClass;
-        mScope = scope;
-    }
-
-    /**
-     * Creates a new issue
-     *
-     * @param id the fixed id of the issue
-     * @param description the quick summary of the issue (one line)
-     * @param explanation a full explanation of the issue, with suggestions for
-     *            how to fix it
-     * @param category the associated category, if any
-     * @param priority the priority, a number from 1 to 10 with 10 being most
-     *            important/severe
-     * @param severity the default severity of the issue
-     * @param detectorClass the class of the detector to find this issue
-     * @param scope the scope of files required to analyze this issue
-     * @return a new {@link Issue}
-     */
-    @NonNull
-    public static Issue create(
-            @NonNull String id,
-            @NonNull String description,
-            @NonNull String explanation,
-            @NonNull Category category,
-            int priority,
-            @NonNull Severity severity,
-            @NonNull Class<? extends Detector> detectorClass,
-            @NonNull EnumSet<Scope> scope) {
-        return new Issue(id, description, explanation, category, priority, severity,
-                detectorClass, scope);
-    }
-
-    /**
-     * Returns the unique id of this issue. These should not change over time
-     * since they are used to persist the names of issues suppressed by the user
-     * etc. It is typically a single camel-cased word.
-     *
-     * @return the associated fixed id, never null and always unique
-     */
-    @NonNull
-    public String getId() {
-        return mId;
-    }
-
-    /**
-     * Briefly (one line) describes the kinds of checks performed by this rule
-     *
-     * @return a quick summary of the issue, never null
-     */
-    @NonNull
-    public String getDescription() {
-        return mDescription;
-    }
-
-    /**
-     * Describes the error found by this rule, e.g.
-     * "Buttons must define contentDescriptions". Preferably the explanation
-     * should also contain a description of how the problem should be solved.
-     * Additional info can be provided via {@link #getMoreInfo()}.
-     * <p>
-     * Note that the text may contain some simple markup, such as *'s around sentences
-     * for bold text, and back quotes (`) for code fragments. You can obtain
-     * the text without this markup by calling {@link #getExplanationAsSimpleText()},
-     * and you can obtain the text as annotated HTML by calling
-     * {@link #getExplanationAsHtml()}.
-     *
-     * @return an explanation of the issue, never null.
-     */
-    @NonNull
-    public String getExplanation() {
-        return mExplanation;
-    }
-
-    /**
-     * Like {@link #getExplanation()}, but returns the text as properly escaped
-     * and marked up HTML, where http URLs are linked, where words with asterisks
-     * such as *this* are shown in bold, etc.
-     *
-     * @return the explanation of the issue, never null
-     */
-    @NonNull
-    public String getExplanationAsHtml() {
-        return convertMarkup(mExplanation, true /* html */);
-    }
-
-    /**
-     * Like {@link #getExplanation()}, but returns the text as properly escaped
-     * and marked up HTML, where http URLs are linked, where words with asterisks
-     * such as *this* are shown in bold, etc.
-     *
-     * @return the explanation of the issue, never null
-     */
-    @NonNull
-    public String getExplanationAsSimpleText() {
-        return convertMarkup(mExplanation, false /* not html = text */);
-    }
-
-    /**
-     * The primary category of the issue
-     *
-     * @return the primary category of the issue, never null
-     */
-    @NonNull
-    public Category getCategory() {
-        return mCategory;
-    }
-
-    /**
-     * Returns a priority, in the range 1-10, with 10 being the most severe and
-     * 1 the least
-     *
-     * @return a priority from 1 to 10
-     */
-    public int getPriority() {
-        return mPriority;
-    }
-
-    /**
-     * Returns the default severity of the issues found by this detector (some
-     * tools may allow the user to specify custom severities for detectors).
-     * <p>
-     * Note that even though the normal way for an issue to be disabled is for
-     * the {@link Configuration} to return {@link Severity#IGNORE}, there is a
-     * {@link #isEnabledByDefault()} method which can be used to turn off issues
-     * by default. This is done rather than just having the severity as the only
-     * attribute on the issue such that an issue can be configured with an
-     * appropriate severity (such as {@link Severity#ERROR}) even when issues
-     * are disabled by default for example because they are experimental or not
-     * yet stable.
-     *
-     * @return the severity of the issues found by this detector
-     */
-    @NonNull
-    public Severity getDefaultSeverity() {
-        return mSeverity;
-    }
-
-    /**
-     * Returns a link (a URL string) to more information, or null
-     *
-     * @return a link to more information, or null
-     */
-    @Nullable
-    public String getMoreInfo() {
-        return mMoreInfoUrl;
-    }
-
-    /**
-     * Returns whether this issue should be enabled by default, unless the user
-     * has explicitly disabled it.
-     *
-     * @return true if this issue should be enabled by default
-     */
-    public boolean isEnabledByDefault() {
-        return mEnabledByDefault;
-    }
-
-    /**
-     * Returns the scope required to analyze the code to detect this issue.
-     * This is determined by the detectors which reports the issue.
-     *
-     * @return the required scope
-     */
-    @NonNull
-    public EnumSet<Scope> getScope() {
-        return mScope;
-    }
-
-    /**
-     * Sorts the detectors alphabetically by id. This is intended to make it
-     * convenient to store settings for detectors in a fixed order. It is not
-     * intended as the order to be shown to the user; for that, a tool embedding
-     * lint might consider the priorities, categories, severities etc of the
-     * various detectors.
-     *
-     * @param other the {@link Issue} to compare this issue to
-     */
-    @Override
-    public int compareTo(Issue other) {
-        return getId().compareTo(other.getId());
-    }
-
-    /**
-     * Sets a more info URL string
-     *
-     * @param moreInfoUrl url string
-     * @return this, for constructor chaining
-     */
-    @NonNull
-    public Issue setMoreInfo(@NonNull String moreInfoUrl) {
-        mMoreInfoUrl = moreInfoUrl;
-        return this;
-    }
-
-    /**
-     * Sets whether this issue is enabled by default.
-     *
-     * @param enabledByDefault whether the issue should be enabled by default
-     * @return this, for constructor chaining
-     */
-    @NonNull
-    public Issue setEnabledByDefault(boolean enabledByDefault) {
-        mEnabledByDefault = enabledByDefault;
-        return this;
-    }
-
-    /**
-     * Returns the sets of scopes required to analyze this issue, or null if all
-     * scopes named by {@link Issue#getScope()} are necessary. Note that only
-     * <b>one</b> match out of this collection is required, not all, and that
-     * the scope set returned by {@link #getScope()} does not have to be returned
-     * by this method, but is always implied to be included.
-     * <p>
-     * The scopes returned by {@link Issue#getScope()} list all the various
-     * scopes that are <b>affected</b> by this issue, meaning the detector
-     * should consider it. Frequently, the detector must analyze all these
-     * scopes in order to properly decide whether an issue is found. For
-     * example, the unused resource detector needs to consider both the XML
-     * resource files and the Java source files in order to decide if a resource
-     * is unused. If it analyzes just the Java files for example, it might
-     * incorrectly conclude that a resource is unused because it did not
-     * discover a resource reference in an XML file.
-     * <p>
-     * However, there are other issues where the issue can occur in a variety of
-     * files, but the detector can consider each in isolation. For example, the
-     * API checker is affected by both XML files and Java class files (detecting
-     * both layout constructor references in XML layout files as well as code
-     * references in .class files). It doesn't have to analyze both; it is
-     * capable of incrementally analyzing just an XML file, or just a class
-     * file, without considering the other.
-     * <p>
-     * The required scope list provides a list of scope sets that can be used to
-     * analyze this issue. For each scope set, all the scopes must be matched by
-     * the incremental analysis, but any one of the scope sets can be analyzed
-     * in isolation.
-     * <p>
-     * The required scope list is not required to include the full scope set
-     * returned by {@link #getScope()}; that set is always assumed to be
-     * included.
-     * <p>
-     * NOTE: You would normally call {@link #isAdequate(EnumSet)} rather
-     * than calling this method directly.
-     *
-     * @return a list of required scopes, or null.
-     */
-    @Nullable
-    public Collection<EnumSet<Scope>> getAnalysisScopes() {
-        return mAnalysisScopes;
-    }
-
-    /**
-     * Sets the collection of scopes that are allowed to be analyzed independently.
-     * See the {@link #getAnalysisScopes()} method for a full explanation.
-     * Note that you usually want to just call {@link #addAnalysisScope(EnumSet)}
-     * instead of constructing a list up front and passing it in here. This
-     * method exists primarily such that commonly used share sets of analysis
-     * scopes can be reused and set directly.
-     *
-     * @param required the collection of scopes
-     * @return this, for constructor chaining
-     */
-    public Issue setAnalysisScopes(@Nullable List<EnumSet<Scope>> required) {
-        mAnalysisScopes = required;
-
-        return this;
-    }
-
-    /**
-     * Returns true if the given scope is adequate for analyzing this issue.
-     * This looks through the analysis scopes (see
-     * {@link #addAnalysisScope(EnumSet)}) and if the scope passed in fully
-     * covers at least one of them, or if it covers the scope of the issue
-     * itself (see {@link #getScope()}, which should be a superset of all the
-     * analysis scopes) returns true.
-     * <p>
-     * The scope set returned by {@link Issue#getScope()} lists all the various
-     * scopes that are <b>affected</b> by this issue, meaning the detector
-     * should consider it. Frequently, the detector must analyze all these
-     * scopes in order to properly decide whether an issue is found. For
-     * example, the unused resource detector needs to consider both the XML
-     * resource files and the Java source files in order to decide if a resource
-     * is unused. If it analyzes just the Java files for example, it might
-     * incorrectly conclude that a resource is unused because it did not
-     * discover a resource reference in an XML file.
-     * <p>
-     * However, there are other issues where the issue can occur in a variety of
-     * files, but the detector can consider each in isolation. For example, the
-     * API checker is affected by both XML files and Java class files (detecting
-     * both layout constructor references in XML layout files as well as code
-     * references in .class files). It doesn't have to analyze both; it is
-     * capable of incrementally analyzing just an XML file, or just a class
-     * file, without considering the other.
-     * <p>
-     * An issue can register additional scope sets that can are adequate
-     * for analyzing the issue, by calling {@link #addAnalysisScope(EnumSet)}.
-     * This method returns true if the given scope matches one or more analysis
-     * scope, or the overall scope.
-     *
-     * @param scope the scope available for analysis
-     * @return true if this issue can be analyzed with the given available scope
-     */
-    public boolean isAdequate(@NonNull EnumSet<Scope> scope) {
-        if (scope.containsAll(mScope)) {
-            return true;
-        }
-
-        if (mAnalysisScopes != null) {
-            for (EnumSet<Scope> analysisScope : mAnalysisScopes) {
-                if (mScope.containsAll(analysisScope)) {
-                    return true;
-                }
-            }
-        }
-
-        if (this == IssueRegistry.LINT_ERROR || this == IssueRegistry.PARSER_ERROR) {
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Adds a scope set that can be analyzed independently to uncover this issue.
-     * See the {@link #getAnalysisScopes()} method for a full explanation.
-     * Note that the {@link #getScope()} does not have to be added here; it is
-     * always considered an analysis scope.
-     *
-     * @param scope the additional scope which can analyze this issue independently
-     * @return this, for constructor chaining
-     */
-    public Issue addAnalysisScope(@Nullable EnumSet<Scope> scope) {
-        if (mAnalysisScopes == null) {
-            mAnalysisScopes = new ArrayList<EnumSet<Scope>>(2);
-        }
-        mAnalysisScopes.add(scope);
-
-        return this;
-    }
-
-    /**
-     * Returns the class of the detector to use to find this issue
-     *
-     * @return the class of the detector to use to find this issue
-     */
-    @NonNull
-    public Class<? extends Detector> getDetectorClass() {
-        return mClass;
-    }
-
-    @Override
-    public String toString() {
-        return mId;
-    }
-
-    /**
-     * Converts the given markup text to HTML or text, depending on the.
-     * <p>
-     * This will recognize the following formatting conventions:
-     * <ul>
-     * <li>HTTP urls (http://...)
-     * <li>Sentences immediately surrounded by * will be shown as bold.
-     * <li>Sentences immediately surrounded by ` will be shown using monospace
-     * fonts
-     * </ul>
-     * Furthermore, newlines are converted to br's when converting newlines.
-     * Note: It does not insert {@code <html>} tags around the fragment for HTML output.
-     * <p>
-     * TODO: Consider switching to the restructured text format -
-     *  http://docutils.sourceforge.net/docs/user/rst/quickstart.html
-     *
-     * @param text the text to be formatted
-     * @param html whether to convert into HTML or text
-     * @return the corresponding HTML or text properly formatted
-     */
-    @NonNull
-    public static String convertMarkup(@NonNull String text, boolean html) {
-        StringBuilder sb = new StringBuilder(3 * text.length() / 2);
-
-        char prev = 0;
-        int flushIndex = 0;
-        int n = text.length();
-        for (int i = 0; i < n; i++) {
-            char c = text.charAt(i);
-            if ((c == '*' || c == '`' && i < n - 1)) {
-                // Scout ahead for range end
-                if (!Character.isLetterOrDigit(prev)
-                        && !Character.isWhitespace(text.charAt(i + 1))) {
-                    // Found * or ~ immediately before a letter, and not in the middle of a word
-                    // Find end
-                    int end = text.indexOf(c, i + 1);
-                    if (end != -1 && (end == n - 1 || !Character.isLetter(text.charAt(end + 1)))) {
-                        if (i > flushIndex) {
-                            appendEscapedText(sb, text, html, flushIndex, i);
-                        }
-                        if (html) {
-                            String tag = c == '*' ? "b" : "code"; //$NON-NLS-1$ //$NON-NLS-2$
-                            sb.append('<').append(tag).append('>');
-                            appendEscapedText(sb, text, html, i + 1, end);
-                            sb.append('<').append('/').append(tag).append('>');
-                        } else {
-                            appendEscapedText(sb, text, html, i + 1, end);
-                        }
-                        flushIndex = end + 1;
-                        i = flushIndex - 1; // -1: account for the i++ in the loop
-                    }
-                }
-            } else if (html && c == 'h' && i < n - 1 && text.charAt(i + 1) == 't'
-                    && text.startsWith(HTTP_PREFIX, i) && !Character.isLetterOrDigit(prev)) {
-                // Find url end
-                int end = i + HTTP_PREFIX.length();
-                while (end < n) {
-                    char d = text.charAt(end);
-                    if (Character.isWhitespace(d)) {
-                        break;
-                    }
-                    end++;
-                }
-                char last = text.charAt(end - 1);
-                if (last == '.' || last == ')' || last == '!') {
-                    end--;
-                }
-                if (end > i + HTTP_PREFIX.length()) {
-                    if (i > flushIndex) {
-                        appendEscapedText(sb, text, html, flushIndex, i);
-                    }
-
-                    String url = text.substring(i, end);
-                    sb.append("<a href=\"");        //$NON-NLS-1$
-                    sb.append(url);
-                    sb.append('"').append('>');
-                    sb.append(url);
-                    sb.append("</a>");              //$NON-NLS-1$
-
-                    flushIndex = end;
-                    i = flushIndex - 1; // -1: account for the i++ in the loop
-                }
-            }
-            prev = c;
-        }
-
-        if (flushIndex < n) {
-            appendEscapedText(sb, text, html, flushIndex, n);
-        }
-
-        return sb.toString();
-    }
-
-    private static void appendEscapedText(StringBuilder sb, String text, boolean html,
-            int start, int end) {
-        if (html) {
-            for (int i = start; i < end; i++) {
-                char c = text.charAt(i);
-                if (c == '<') {
-                    sb.append("&lt;");                                   //$NON-NLS-1$
-                } else if (c == '&') {
-                    sb.append("&amp;");                                  //$NON-NLS-1$
-                } else if (c == '\n') {
-                    sb.append("<br/>\n");
-                } else {
-                    if (c > 255) {
-                        sb.append("&#");                                 //$NON-NLS-1$
-                        sb.append(Integer.toString(c));
-                        sb.append(';');
-                    } else {
-                        sb.append(c);
-                    }
-                }
-            }
-        } else {
-            for (int i = start; i < end; i++) {
-                char c = text.charAt(i);
-                sb.append(c);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/JavaContext.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/JavaContext.java
deleted file mode 100644
index d91f423..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/JavaContext.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.client.api.IJavaParser;
-import com.android.tools.lint.client.api.LintDriver;
-
-import java.io.File;
-
-import lombok.ast.ConstructorDeclaration;
-import lombok.ast.MethodDeclaration;
-import lombok.ast.Node;
-
-/**
- * A {@link Context} used when checking Java files.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-public class JavaContext extends Context {
-    /** The parse tree */
-    public Node compilationUnit;
-    /** The parser which produced the parse tree */
-    public IJavaParser parser;
-
-    /**
-     * Constructs a {@link JavaContext} for running lint on the given file, with
-     * the given scope, in the given project reporting errors to the given
-     * client.
-     *
-     * @param driver the driver running through the checks
-     * @param project the project to run lint on which contains the given file
-     * @param main the main project if this project is a library project, or
-     *            null if this is not a library project. The main project is
-     *            the root project of all library projects, not necessarily the
-     *            directly including project.
-     * @param file the file to be analyzed
-     */
-    public JavaContext(
-            @NonNull LintDriver driver,
-            @NonNull Project project,
-            @Nullable Project main,
-            @NonNull File file) {
-        super(driver, project, main, file);
-    }
-
-    /**
-     * Returns a location for the given node
-     *
-     * @param node the AST node to get a location for
-     * @return a location for the given node
-     */
-    @NonNull
-    public Location getLocation(@NonNull Node node) {
-        if (parser != null) {
-            return parser.getLocation(this, node);
-        }
-
-        return new Location(file, null, null);
-    }
-
-    @Override
-    public void report(@NonNull Issue issue, @Nullable Location location,
-            @NonNull String message, @Nullable Object data) {
-        if (mDriver.isSuppressed(issue, compilationUnit)) {
-            return;
-        }
-        super.report(issue, location, message, data);
-    }
-
-    /**
-     * Reports an issue applicable to a given AST node. The AST node is used as the
-     * scope to check for suppress lint annotations.
-     *
-     * @param issue the issue to report
-     * @param scope the AST node scope the error applies to. The lint infrastructure
-     *    will check whether there are suppress annotations on this node (or its enclosing
-     *    nodes) and if so suppress the warning without involving the client.
-     * @param location the location of the issue, or null if not known
-     * @param message the message for this warning
-     * @param data any associated data, or null
-     */
-    public void report(
-            @NonNull Issue issue,
-            @Nullable Node scope,
-            @Nullable Location location,
-            @NonNull String message,
-            @Nullable Object data) {
-        if (scope != null && mDriver.isSuppressed(issue, scope)) {
-            return;
-        }
-        super.report(issue, location, message, data);
-    }
-
-
-    @Nullable
-    public static Node findSurroundingMethod(Node scope) {
-        while (scope != null) {
-            Class<? extends Node> type = scope.getClass();
-            // The Lombok AST uses a flat hierarchy of node type implementation classes
-            // so no need to do instanceof stuff here.
-            if (type == MethodDeclaration.class || type == ConstructorDeclaration.class) {
-                return scope;
-            }
-
-            scope = scope.getParent();
-        }
-
-        return null;
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/LayoutDetector.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/LayoutDetector.java
deleted file mode 100644
index b24c1a9..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/LayoutDetector.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_PADDING;
-import static com.android.SdkConstants.ATTR_PADDING_BOTTOM;
-import static com.android.SdkConstants.ATTR_PADDING_LEFT;
-import static com.android.SdkConstants.ATTR_PADDING_RIGHT;
-import static com.android.SdkConstants.ATTR_PADDING_TOP;
-import static com.android.SdkConstants.VALUE_FILL_PARENT;
-import static com.android.SdkConstants.VALUE_MATCH_PARENT;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.google.common.annotations.Beta;
-
-import org.w3c.dom.Element;
-
-/**
- * Abstract class specifically intended for layout detectors which provides some
- * common utility methods shared by layout detectors.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public abstract class LayoutDetector extends ResourceXmlDetector {
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.LAYOUT;
-    }
-
-    private static boolean isFillParent(@NonNull Element element, @NonNull String dimension) {
-        String width = element.getAttributeNS(ANDROID_URI, dimension);
-        return width.equals(VALUE_MATCH_PARENT) || width.equals(VALUE_FILL_PARENT);
-    }
-
-    protected static boolean isWidthFillParent(@NonNull Element element) {
-        return isFillParent(element, ATTR_LAYOUT_WIDTH);
-    }
-
-    protected static boolean isHeightFillParent(@NonNull Element element) {
-        return isFillParent(element, ATTR_LAYOUT_HEIGHT);
-    }
-
-    protected boolean hasPadding(@NonNull Element root) {
-        return root.hasAttributeNS(ANDROID_URI, ATTR_PADDING)
-                || root.hasAttributeNS(ANDROID_URI, ATTR_PADDING_LEFT)
-                || root.hasAttributeNS(ANDROID_URI, ATTR_PADDING_RIGHT)
-                || root.hasAttributeNS(ANDROID_URI, ATTR_PADDING_TOP)
-                || root.hasAttributeNS(ANDROID_URI, ATTR_PADDING_BOTTOM);
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/LintUtils.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/LintUtils.java
deleted file mode 100644
index 9dec569..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/LintUtils.java
+++ /dev/null
@@ -1,798 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import static com.android.SdkConstants.ANDROID_MANIFEST_XML;
-import static com.android.SdkConstants.BIN_FOLDER;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.resources.FolderTypeRelationship;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-import com.android.tools.lint.client.api.LintClient;
-import com.android.utils.PositionXmlParser;
-import com.google.common.annotations.Beta;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Iterables;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.FieldNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.List;
-
-import lombok.ast.ImportDeclaration;
-
-
-/**
- * Useful utility methods related to lint.
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public class LintUtils {
-    // Utility class, do not instantiate
-    private LintUtils() {
-    }
-
-    /**
-     * Format a list of strings, and cut of the list at {@code maxItems} if the
-     * number of items are greater.
-     *
-     * @param strings the list of strings to print out as a comma separated list
-     * @param maxItems the maximum number of items to print
-     * @return a comma separated list
-     */
-    @NonNull
-    public static String formatList(@NonNull List<String> strings, int maxItems) {
-        StringBuilder sb = new StringBuilder(20 * strings.size());
-
-        for (int i = 0, n = strings.size(); i < n; i++) {
-            if (sb.length() > 0) {
-                sb.append(", "); //$NON-NLS-1$
-            }
-            sb.append(strings.get(i));
-
-            if (maxItems > 0 && i == maxItems - 1 && n > maxItems) {
-                sb.append(String.format("... (%1$d more)", n - i - 1));
-                break;
-            }
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Determine if the given type corresponds to a resource that has a unique
-     * file
-     *
-     * @param type the resource type to check
-     * @return true if the given type corresponds to a file-type resource
-     */
-    public static boolean isFileBasedResourceType(@NonNull ResourceType type) {
-        List<ResourceFolderType> folderTypes = FolderTypeRelationship.getRelatedFolders(type);
-        for (ResourceFolderType folderType : folderTypes) {
-            if (folderType != ResourceFolderType.VALUES) {
-                if (type == ResourceType.ID) {
-                    return false;
-                }
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Returns true if the given file represents an XML file
-     *
-     * @param file the file to be checked
-     * @return true if the given file is an xml file
-     */
-    public static boolean isXmlFile(@NonNull File file) {
-        String string = file.getName();
-        return string.regionMatches(true, string.length() - DOT_XML.length(),
-                DOT_XML, 0, DOT_XML.length());
-    }
-
-    /**
-     * Case insensitive ends with
-     *
-     * @param string the string to be tested whether it ends with the given
-     *            suffix
-     * @param suffix the suffix to check
-     * @return true if {@code string} ends with {@code suffix},
-     *         case-insensitively.
-     */
-    public static boolean endsWith(@NonNull String string, @NonNull String suffix) {
-        return string.regionMatches(true /* ignoreCase */, string.length() - suffix.length(),
-                suffix, 0, suffix.length());
-    }
-
-    /**
-     * Case insensitive starts with
-     *
-     * @param string the string to be tested whether it starts with the given prefix
-     * @param prefix the prefix to check
-     * @param offset the offset to start checking with
-     * @return true if {@code string} starts with {@code prefix},
-     *         case-insensitively.
-     */
-    public static boolean startsWith(@NonNull String string, @NonNull String prefix, int offset) {
-        return string.regionMatches(true /* ignoreCase */, offset, prefix, 0, prefix.length());
-    }
-
-    /**
-     * Returns the basename of the given filename, unless it's a dot-file such as ".svn".
-     *
-     * @param fileName the file name to extract the basename from
-     * @return the basename (the filename without the file extension)
-     */
-    public static String getBaseName(@NonNull String fileName) {
-        int extension = fileName.indexOf('.');
-        if (extension > 0) {
-            return fileName.substring(0, extension);
-        } else {
-            return fileName;
-        }
-    }
-
-    /**
-     * Returns the children elements of the given node
-     *
-     * @param node the parent node
-     * @return a list of element children, never null
-     */
-    @NonNull
-    public static List<Element> getChildren(@NonNull Node node) {
-        NodeList childNodes = node.getChildNodes();
-        List<Element> children = new ArrayList<Element>(childNodes.getLength());
-        for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-            Node child = childNodes.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                children.add((Element) child);
-            }
-        }
-
-        return children;
-    }
-
-    /**
-     * Returns the <b>number</b> of children of the given node
-     *
-     * @param node the parent node
-     * @return the count of element children
-     */
-    public static int getChildCount(@NonNull Node node) {
-        NodeList childNodes = node.getChildNodes();
-        int childCount = 0;
-        for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-            Node child = childNodes.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                childCount++;
-            }
-        }
-
-        return childCount;
-    }
-
-    /**
-     * Returns true if the given element is the root element of its document
-     *
-     * @param element the element to test
-     * @return true if the element is the root element
-     */
-    public static boolean isRootElement(Element element) {
-        return element == element.getOwnerDocument().getDocumentElement();
-    }
-
-    /**
-     * Returns the given id without an {@code @id/} or {@code @+id} prefix
-     *
-     * @param id the id to strip
-     * @return the stripped id, never null
-     */
-    @NonNull
-    public static String stripIdPrefix(@Nullable String id) {
-        if (id == null) {
-            return "";
-        } else if (id.startsWith(NEW_ID_PREFIX)) {
-            return id.substring(NEW_ID_PREFIX.length());
-        } else if (id.startsWith(ID_PREFIX)) {
-            return id.substring(ID_PREFIX.length());
-        }
-
-        return id;
-    }
-
-    /**
-     * Returns true if the given two id references match. This is similar to
-     * String equality, but it also considers "{@code @+id/foo == @id/foo}.
-     *
-     * @param id1 the first id to compare
-     * @param id2 the second id to compare
-     * @return true if the two id references refer to the same id
-     */
-    public static boolean idReferencesMatch(String id1, String id2) {
-        if (id1.startsWith(NEW_ID_PREFIX)) {
-            if (id2.startsWith(NEW_ID_PREFIX)) {
-                return id1.equals(id2);
-            } else {
-                assert id2.startsWith(ID_PREFIX);
-                return ((id1.length() - id2.length())
-                            == (NEW_ID_PREFIX.length() - ID_PREFIX.length()))
-                        && id1.regionMatches(NEW_ID_PREFIX.length(), id2,
-                                ID_PREFIX.length(),
-                                id2.length() - ID_PREFIX.length());
-            }
-        } else {
-            assert id1.startsWith(ID_PREFIX);
-            if (id2.startsWith(ID_PREFIX)) {
-                return id1.equals(id2);
-            } else {
-                assert id2.startsWith(NEW_ID_PREFIX);
-                return (id2.length() - id1.length()
-                            == (NEW_ID_PREFIX.length() - ID_PREFIX.length()))
-                        && id2.regionMatches(NEW_ID_PREFIX.length(), id1,
-                                ID_PREFIX.length(),
-                                id1.length() - ID_PREFIX.length());
-            }
-        }
-    }
-
-    /**
-     * Computes the edit distance (number of insertions, deletions or substitutions
-     * to edit one string into the other) between two strings. In particular,
-     * this will compute the Levenshtein distance.
-     * <p>
-     * See http://en.wikipedia.org/wiki/Levenshtein_distance for details.
-     *
-     * @param s the first string to compare
-     * @param t the second string to compare
-     * @return the edit distance between the two strings
-     */
-    public static int editDistance(@NonNull String s, @NonNull String t) {
-        int m = s.length();
-        int n = t.length();
-        int[][] d = new int[m + 1][n + 1];
-        for (int i = 0; i <= m; i++) {
-            d[i][0] = i;
-        }
-        for (int j = 0; j <= n; j++) {
-            d[0][j] = j;
-        }
-        for (int j = 1; j <= n; j++) {
-            for (int i = 1; i <= m; i++) {
-                if (s.charAt(i - 1) == t.charAt(j - 1)) {
-                    d[i][j] = d[i - 1][j - 1];
-                } else {
-                    int deletion = d[i - 1][j] + 1;
-                    int insertion = d[i][j - 1] + 1;
-                    int substitution = d[i - 1][j - 1] + 1;
-                    d[i][j] = Math.min(deletion, Math.min(insertion, substitution));
-                }
-            }
-        }
-
-        return d[m][n];
-    }
-
-    /**
-     * Returns true if assertions are enabled
-     *
-     * @return true if assertions are enabled
-     */
-    @SuppressWarnings("all")
-    public static boolean assertionsEnabled() {
-        boolean assertionsEnabled = false;
-        assert assertionsEnabled = true; // Intentional side-effect
-        return assertionsEnabled;
-    }
-
-    /**
-     * Returns the layout resource name for the given layout file
-     *
-     * @param layoutFile the file pointing to the layout
-     * @return the layout resource name, not including the {@code @layout}
-     *         prefix
-     */
-    public static String getLayoutName(File layoutFile) {
-        String name = layoutFile.getName();
-        int dotIndex = name.indexOf('.');
-        if (dotIndex != -1) {
-            name = name.substring(0, dotIndex);
-        }
-        return name;
-    }
-
-    /**
-     * Splits the given path into its individual parts, attempting to be
-     * tolerant about path separators (: or ;). It can handle possibly ambiguous
-     * paths, such as {@code c:\foo\bar:\other}, though of course these are to
-     * be avoided if possible.
-     *
-     * @param path the path variable to split, which can use both : and ; as
-     *            path separators.
-     * @return the individual path components as an Iterable of strings
-     */
-    public static Iterable<String> splitPath(String path) {
-        if (path.indexOf(';') != -1) {
-            return Splitter.on(';').omitEmptyStrings().trimResults().split(path);
-        }
-
-        List<String> combined = new ArrayList<String>();
-        Iterables.addAll(combined, Splitter.on(':').omitEmptyStrings().trimResults().split(path));
-        for (int i = 0, n = combined.size(); i < n; i++) {
-            String p = combined.get(i);
-            if (p.length() == 1 && i < n - 1 && Character.isLetter(p.charAt(0))
-                    // Technically, Windows paths do not have to have a \ after the :,
-                    // which means it would be using the current directory on that drive,
-                    // but that's unlikely to be the case in a path since it would have
-                    // unpredictable results
-                    && !combined.get(i+1).isEmpty() && combined.get(i+1).charAt(0) == '\\') {
-                combined.set(i, p + ':' + combined.get(i+1));
-                combined.remove(i+1);
-                n--;
-                continue;
-            }
-        }
-
-        return combined;
-    }
-
-    /**
-     * Computes the shared parent among a set of files (which may be null).
-     *
-     * @param files the set of files to be checked
-     * @return the closest common ancestor file, or null if none was found
-     */
-    @Nullable
-    public static File getCommonParent(@NonNull List<File> files) {
-        int fileCount = files.size();
-        if (fileCount == 0) {
-            return null;
-        } else if (fileCount == 1) {
-            return files.get(0);
-        } else if (fileCount == 2) {
-            return getCommonParent(files.get(0), files.get(1));
-        } else {
-            File common = files.get(0);
-            for (int i = 1; i < fileCount; i++) {
-                common = getCommonParent(common, files.get(i));
-                if (common == null) {
-                    return null;
-                }
-            }
-
-            return common;
-        }
-    }
-
-    /**
-     * Computes the closest common parent path between two files.
-     *
-     * @param file1 the first file to be compared
-     * @param file2 the second file to be compared
-     * @return the closest common ancestor file, or null if the two files have
-     *         no common parent
-     */
-    @Nullable
-    public static File getCommonParent(@NonNull File file1, @NonNull File file2) {
-        if (file1.equals(file2)) {
-            return file1;
-        } else if (file1.getPath().startsWith(file2.getPath())) {
-            return file2;
-        } else if (file2.getPath().startsWith(file1.getPath())) {
-            return file1;
-        } else {
-            // Dumb and simple implementation
-            File first = file1.getParentFile();
-            while (first != null) {
-                File second = file2.getParentFile();
-                while (second != null) {
-                    if (first.equals(second)) {
-                        return first;
-                    }
-                    second = second.getParentFile();
-                }
-
-                first = first.getParentFile();
-            }
-        }
-        return null;
-    }
-
-    private static final String UTF_8 = "UTF-8";                 //$NON-NLS-1$
-    private static final String UTF_16 = "UTF_16";               //$NON-NLS-1$
-    private static final String UTF_16LE = "UTF_16LE";           //$NON-NLS-1$
-
-    /**
-     * Returns the encoded String for the given file. This is usually the
-     * same as {@code Files.toString(file, Charsets.UTF8}, but if there's a UTF byte order mark
-     * (for UTF8, UTF_16 or UTF_16LE), use that instead.
-     *
-     * @param client the client to use for I/O operations
-     * @param file the file to read from
-     * @return the string
-     * @throws IOException if the file cannot be read properly
-     */
-    @NonNull
-    public static String getEncodedString(
-            @NonNull LintClient client,
-            @NonNull File file) throws IOException {
-        byte[] bytes = client.readBytes(file);
-        if (endsWith(file.getName(), DOT_XML)) {
-            return PositionXmlParser.getXmlString(bytes);
-        }
-
-        return getEncodedString(bytes);
-    }
-
-    /**
-     * Returns the String corresponding to the given data. This is usually the
-     * same as {@code new String(data)}, but if there's a UTF byte order mark
-     * (for UTF8, UTF_16 or UTF_16LE), use that instead.
-     * <p>
-     * NOTE: For XML files, there is the additional complication that there
-     * could be a {@code encoding=} attribute in the prologue. For those files,
-     * use {@link PositionXmlParser#getXmlString(byte[])} instead.
-     *
-     * @param data the byte array to construct the string from
-     * @return the string
-     */
-    @NonNull
-    public static String getEncodedString(@Nullable byte[] data) {
-        if (data == null) {
-            return "";
-        }
-
-        int offset = 0;
-        String defaultCharset = UTF_8;
-        String charset = null;
-        // Look for the byte order mark, to see if we need to remove bytes from
-        // the input stream (and to determine whether files are big endian or little endian) etc
-        // for files which do not specify the encoding.
-        // See http://unicode.org/faq/utf_bom.html#BOM for more.
-        if (data.length > 4) {
-            if (data[0] == (byte)0xef && data[1] == (byte)0xbb && data[2] == (byte)0xbf) {
-                // UTF-8
-                defaultCharset = charset = UTF_8;
-                offset += 3;
-            } else if (data[0] == (byte)0xfe && data[1] == (byte)0xff) {
-                //  UTF-16, big-endian
-                defaultCharset = charset = UTF_16;
-                offset += 2;
-            } else if (data[0] == (byte)0x0 && data[1] == (byte)0x0
-                    && data[2] == (byte)0xfe && data[3] == (byte)0xff) {
-                // UTF-32, big-endian
-                defaultCharset = charset = "UTF_32";    //$NON-NLS-1$
-                offset += 4;
-            } else if (data[0] == (byte)0xff && data[1] == (byte)0xfe
-                    && data[2] == (byte)0x0 && data[3] == (byte)0x0) {
-                // UTF-32, little-endian. We must check for this *before* looking for
-                // UTF_16LE since UTF_32LE has the same prefix!
-                defaultCharset = charset = "UTF_32LE";  //$NON-NLS-1$
-                offset += 4;
-            } else if (data[0] == (byte)0xff && data[1] == (byte)0xfe) {
-                //  UTF-16, little-endian
-                defaultCharset = charset = UTF_16LE;
-                offset += 2;
-            }
-        }
-        int length = data.length - offset;
-
-        // Guess encoding by searching for an encoding= entry in the first line.
-        boolean seenOddZero = false;
-        boolean seenEvenZero = false;
-        for (int lineEnd = offset; lineEnd < data.length; lineEnd++) {
-            if (data[lineEnd] == 0) {
-                if ((lineEnd - offset) % 2 == 0) {
-                    seenEvenZero = true;
-                } else {
-                    seenOddZero = true;
-                }
-            } else if (data[lineEnd] == '\n' || data[lineEnd] == '\r') {
-                break;
-            }
-        }
-
-        if (charset == null) {
-            charset = seenOddZero ? UTF_16LE : seenEvenZero ? UTF_16 : UTF_8;
-        }
-
-        String text = null;
-        try {
-            text = new String(data, offset, length, charset);
-        } catch (UnsupportedEncodingException e) {
-            try {
-                if (charset != defaultCharset) {
-                    text = new String(data, offset, length, defaultCharset);
-                }
-            } catch (UnsupportedEncodingException u) {
-                // Just use the default encoding below
-            }
-        }
-        if (text == null) {
-            text = new String(data, offset, length);
-        }
-        return text;
-    }
-
-    /**
-     * Returns true if the given class node represents a static inner class.
-     *
-     * @param classNode the inner class to be checked
-     * @return true if the class node represents an inner class that is static
-     */
-    public static boolean isStaticInnerClass(@NonNull ClassNode classNode) {
-        // Note: We can't just filter out static inner classes like this:
-        //     (classNode.access & Opcodes.ACC_STATIC) != 0
-        // because the static flag only appears on methods and fields in the class
-        // file. Instead, look for the synthetic this pointer.
-
-        @SuppressWarnings("rawtypes") // ASM API
-        List fieldList = classNode.fields;
-        for (Object f : fieldList) {
-            FieldNode field = (FieldNode) f;
-            if (field.name.startsWith("this$") && (field.access & Opcodes.ACC_SYNTHETIC) != 0) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Returns the previous opcode prior to the given node, ignoring label and
-     * line number nodes
-     *
-     * @param node the node to look up the previous opcode for
-     * @return the previous opcode, or {@link Opcodes#NOP} if no previous node
-     *         was found
-     */
-    public static int getPrevOpcode(@NonNull AbstractInsnNode node) {
-        AbstractInsnNode prev = getPrevInstruction(node);
-        if (prev != null) {
-            return prev.getOpcode();
-        } else {
-            return Opcodes.NOP;
-        }
-    }
-
-    /**
-     * Returns the previous instruction prior to the given node, ignoring label
-     * and line number nodes.
-     *
-     * @param node the node to look up the previous instruction for
-     * @return the previous instruction, or null if no previous node was found
-     */
-    @Nullable
-    public static AbstractInsnNode getPrevInstruction(@NonNull AbstractInsnNode node) {
-        AbstractInsnNode prev = node;
-        while (true) {
-            prev = prev.getPrevious();
-            if (prev == null) {
-                return null;
-            } else {
-                int type = prev.getType();
-                if (type != AbstractInsnNode.LINE && type != AbstractInsnNode.LABEL
-                        && type != AbstractInsnNode.FRAME) {
-                    return prev;
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the next opcode after to the given node, ignoring label and line
-     * number nodes
-     *
-     * @param node the node to look up the next opcode for
-     * @return the next opcode, or {@link Opcodes#NOP} if no next node was found
-     */
-    public static int getNextOpcode(@NonNull AbstractInsnNode node) {
-        AbstractInsnNode next = getNextInstruction(node);
-        if (next != null) {
-            return next.getOpcode();
-        } else {
-            return Opcodes.NOP;
-        }
-    }
-
-    /**
-     * Returns the next instruction after to the given node, ignoring label and
-     * line number nodes.
-     *
-     * @param node the node to look up the next node for
-     * @return the next instruction, or null if no next node was found
-     */
-    @Nullable
-    public static AbstractInsnNode getNextInstruction(@NonNull AbstractInsnNode node) {
-        AbstractInsnNode next = node;
-        while (true) {
-            next = next.getNext();
-            if (next == null) {
-                return null;
-            } else {
-                int type = next.getType();
-                if (type != AbstractInsnNode.LINE && type != AbstractInsnNode.LABEL
-                        && type != AbstractInsnNode.FRAME) {
-                    return next;
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns true if the given directory represents an Android project
-     * directory. Note: This doesn't necessarily mean it's an Eclipse directory,
-     * only that it looks like it contains a logical Android project -- one
-     * including a manifest file, a resource folder, etc.
-     *
-     * @param dir the directory to check
-     * @return true if the directory looks like an Android project
-     */
-    public static boolean isProjectDir(@NonNull File dir) {
-        boolean hasManifest = new File(dir, ANDROID_MANIFEST_XML).exists();
-        if (hasManifest) {
-            // Special case: the bin/ folder can also contain a copy of the
-            // manifest file, but this is *not* a project directory
-            if (dir.getName().equals(BIN_FOLDER)) {
-                // ...unless of course it just *happens* to be a project named bin, in
-                // which case we peek at its parent to see if this is the case
-                dir = dir.getParentFile();
-                if (dir != null && isProjectDir(dir)) {
-                    // Yes, it's a bin/ directory inside a real project: ignore this dir
-                    return false;
-                }
-            }
-        } else if (Project.isAospFrameworksProject(dir)) {
-            // Hardcoded AOSP support for the frameworks project
-            return true;
-        }
-
-        return hasManifest;
-    }
-
-    /**
-     * Look up the locale and region from the given parent folder name and
-     * return it as a combined string, such as "en", "en-rUS", etc, or null if
-     * no language is specified.
-     *
-     * @param folderName the folder name
-     * @return the locale+region string or null
-     */
-    @Nullable
-    public static String getLocaleAndRegion(@NonNull String folderName) {
-         if (folderName.equals("values")) { //$NON-NLS-1$
-            return null;
-         }
-
-         String locale = null;
-
-         for (String qualifier : Splitter.on('-').split(folderName)) {
-            int qualifierLength = qualifier.length();
-            if (qualifierLength == 2) {
-                 char first = qualifier.charAt(0);
-                char second = qualifier.charAt(1);
-                 if (first >= 'a' && first <= 'z' && second >= 'a' && second <= 'z') {
-                    locale = qualifier;
-                }
-            } else if (qualifierLength == 3 && qualifier.charAt(0) == 'r' && locale != null) {
-                char first = qualifier.charAt(1);
-                char second = qualifier.charAt(2);
-                if (first >= 'A' && first <= 'Z' && second >= 'A' && second <= 'Z') {
-                    return locale + '-' + qualifier;
-                }
-                break;
-             }
-         }
-
-         return locale;
-     }
-
-    /**
-     * Returns true if the given class (specified by a fully qualified class
-     * name) name is imported in the given compilation unit either through a fully qualified
-     * import or by a wildcard import.
-     *
-     * @param compilationUnit the compilation unit
-     * @param fullyQualifiedName the fully qualified class name
-     * @return true if the given imported name refers to the given fully
-     *         qualified name
-     */
-    public static boolean isImported(
-            @NonNull lombok.ast.Node compilationUnit,
-            @NonNull String fullyQualifiedName) {
-        int dotIndex = fullyQualifiedName.lastIndexOf('.');
-        int dotLength = fullyQualifiedName.length() - dotIndex;
-
-        boolean imported = false;
-        for (lombok.ast.Node rootNode : compilationUnit.getChildren()) {
-            if (rootNode instanceof ImportDeclaration) {
-                ImportDeclaration importDeclaration = (ImportDeclaration) rootNode;
-                String fqn = importDeclaration.asFullyQualifiedName();
-                if (fqn.equals(fullyQualifiedName)) {
-                    return true;
-                } else if (fullyQualifiedName.regionMatches(dotIndex, fqn,
-                        fqn.length() - dotLength, dotLength)) {
-                    // This import is importing the class name using some other prefix, so there
-                    // fully qualified class name cannot be imported under that name
-                    return false;
-                } else if (importDeclaration.astStarImport()
-                        && fqn.regionMatches(0, fqn, 0, dotIndex + 1)) {
-                    imported = true;
-                    // but don't break -- keep searching in case there's a non-wildcard
-                    // import of the specific class name, e.g. if we're looking for
-                    // android.content.SharedPreferences.Editor, don't match on the following:
-                    //   import android.content.SharedPreferences.*;
-                    //   import foo.bar.Editor;
-                }
-            }
-        }
-
-        return imported;
-    }
-
-    /**
-     * Returns the applicable build code (for
-     * {@code android.os.Build.VERSION_CODES}) for the corresponding API level,
-     * or null if it's unknown.
-     *
-     * @param api the API level to look up a version code for
-     * @return the corresponding build code field name, or null
-     */
-    @Nullable
-    public static String getBuildCode(int api) {
-        // See http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
-        switch (api) {
-            case 1:  return "BASE"; //$NON-NLS-1$
-            case 2:  return "BASE_1_1"; //$NON-NLS-1$
-            case 3:  return "CUPCAKE"; //$NON-NLS-1$
-            case 4:  return "DONUT"; //$NON-NLS-1$
-            case 5:  return "ECLAIR"; //$NON-NLS-1$
-            case 6:  return "ECLAIR_0_1"; //$NON-NLS-1$
-            case 7:  return "ECLAIR_MR1"; //$NON-NLS-1$
-            case 8:  return "FROYO"; //$NON-NLS-1$
-            case 9:  return "GINGERBREAD"; //$NON-NLS-1$
-            case 10: return "GINGERBREAD_MR1"; //$NON-NLS-1$
-            case 11: return "HONEYCOMB"; //$NON-NLS-1$
-            case 12: return "HONEYCOMB_MR1"; //$NON-NLS-1$
-            case 13: return "HONEYCOMB_MR2"; //$NON-NLS-1$
-            case 14: return "ICE_CREAM_SANDWICH"; //$NON-NLS-1$
-            case 15: return "ICE_CREAM_SANDWICH_MR1"; //$NON-NLS-1$
-            case 16: return "JELLY_BEAN"; //$NON-NLS-1$
-            case 17: return "JELLY_BEAN_MR1"; //$NON-NLS-1$
-            // If you add more versions here, also update AdtUtils#getAndroidName and
-            // SdkConstants#HIGHEST_KNOWN_API
-        }
-
-        return null;
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Location.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Location.java
deleted file mode 100644
index 34116d0..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Location.java
+++ /dev/null
@@ -1,722 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.google.common.annotations.Beta;
-
-import java.io.File;
-
-/**
- * Location information for a warning
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public class Location {
-    private static final String SUPER_KEYWORD = "super"; //$NON-NLS-1$
-
-    private final File mFile;
-    private final Position mStart;
-    private final Position mEnd;
-    private String mMessage;
-    private Location mSecondary;
-    private Object mClientData;
-
-    /**
-     * (Private constructor, use one of the factory methods
-     * {@link Location#create(File)},
-     * {@link Location#create(File, Position, Position)}, or
-     * {@link Location#create(File, String, int, int)}.
-     * <p>
-     * Constructs a new location range for the given file, from start to end. If
-     * the length of the range is not known, end may be null.
-     *
-     * @param file the associated file (but see the documentation for
-     *            {@link #getFile()} for more information on what the file
-     *            represents)
-     * @param start the starting position, or null
-     * @param end the ending position, or null
-     */
-    protected Location(@NonNull File file, @Nullable Position start, @Nullable Position end) {
-        super();
-        mFile = file;
-        mStart = start;
-        mEnd = end;
-    }
-
-    /**
-     * Returns the file containing the warning. Note that the file *itself* may
-     * not yet contain the error. When editing a file in the IDE for example,
-     * the tool could generate warnings in the background even before the
-     * document is saved. However, the file is used as a identifying token for
-     * the document being edited, and the IDE integration can map this back to
-     * error locations in the editor source code.
-     *
-     * @return the file handle for the location
-     */
-    @NonNull
-    public File getFile() {
-        return mFile;
-    }
-
-    /**
-     * The start position of the range
-     *
-     * @return the start position of the range, or null
-     */
-    @Nullable
-    public Position getStart() {
-        return mStart;
-    }
-
-    /**
-     * The end position of the range
-     *
-     * @return the start position of the range, may be null for an empty range
-     */
-    @Nullable
-    public Position getEnd() {
-        return mEnd;
-    }
-
-    /**
-     * Returns a secondary location associated with this location (if
-     * applicable), or null.
-     *
-     * @return a secondary location or null
-     */
-    @Nullable
-    public Location getSecondary() {
-        return mSecondary;
-    }
-
-    /**
-     * Sets a secondary location for this location.
-     *
-     * @param secondary a secondary location associated with this location
-     */
-    public void setSecondary(@Nullable Location secondary) {
-        mSecondary = secondary;
-    }
-
-    /**
-     * Sets a custom message for this location. This is typically used for
-     * secondary locations, to describe the significance of this alternate
-     * location. For example, for a duplicate id warning, the primary location
-     * might say "This is a duplicate id", pointing to the second occurrence of
-     * id declaration, and then the secondary location could point to the
-     * original declaration with the custom message "Originally defined here".
-     *
-     * @param message the message to apply to this location
-     */
-    public void setMessage(@NonNull String message) {
-        mMessage = message;
-    }
-
-    /**
-     * Returns the custom message for this location, if any. This is typically
-     * used for secondary locations, to describe the significance of this
-     * alternate location. For example, for a duplicate id warning, the primary
-     * location might say "This is a duplicate id", pointing to the second
-     * occurrence of id declaration, and then the secondary location could point
-     * to the original declaration with the custom message
-     * "Originally defined here".
-     *
-     * @return the custom message for this location, or null
-     */
-    @Nullable
-    public String getMessage() {
-        return mMessage;
-    }
-
-    /**
-     * Sets the client data associated with this location. This is an optional
-     * field which can be used by the creator of the {@link Location} to store
-     * temporary state associated with the location.
-     *
-     * @param clientData the data to store with this location
-     */
-    public void setClientData(@Nullable Object clientData) {
-        mClientData = clientData;
-    }
-
-    /**
-     * Returns the client data associated with this location - an optional field
-     * which can be used by the creator of the {@link Location} to store
-     * temporary state associated with the location.
-     *
-     * @return the data associated with this location
-     */
-    @Nullable
-    public Object getClientData() {
-        return mClientData;
-    }
-
-    @Override
-    public String toString() {
-        return "Location [file=" + mFile + ", start=" + mStart + ", end=" + mEnd + ", message="
-                + mMessage + ']';
-    }
-
-    /**
-     * Creates a new location for the given file
-     *
-     * @param file the file to create a location for
-     * @return a new location
-     */
-    @NonNull
-    public static Location create(@NonNull File file) {
-        return new Location(file, null /*start*/, null /*end*/);
-    }
-
-    /**
-     * Creates a new location for the given file and starting and ending
-     * positions.
-     *
-     * @param file the file containing the positions
-     * @param start the starting position
-     * @param end the ending position
-     * @return a new location
-     */
-    @NonNull
-    public static Location create(
-            @NonNull File file,
-            @NonNull Position start,
-            @Nullable Position end) {
-        return new Location(file, start, end);
-    }
-
-    /**
-     * Creates a new location for the given file, with the given contents, for
-     * the given offset range.
-     *
-     * @param file the file containing the location
-     * @param contents the current contents of the file
-     * @param startOffset the starting offset
-     * @param endOffset the ending offset
-     * @return a new location
-     */
-    @NonNull
-    public static Location create(
-            @NonNull File file,
-            @Nullable String contents,
-            int startOffset,
-            int endOffset) {
-        if (startOffset < 0 || endOffset < startOffset) {
-            throw new IllegalArgumentException("Invalid offsets");
-        }
-
-        if (contents == null) {
-            return new Location(file,
-                    new DefaultPosition(-1, -1, startOffset),
-                    new DefaultPosition(-1, -1, endOffset));
-        }
-
-        int size = contents.length();
-        endOffset = Math.min(endOffset, size);
-        startOffset = Math.min(startOffset, endOffset);
-        Position start = null;
-        int line = 0;
-        int lineOffset = 0;
-        char prev = 0;
-        for (int offset = 0; offset <= size; offset++) {
-            if (offset == startOffset) {
-                start = new DefaultPosition(line, offset - lineOffset, offset);
-            }
-            if (offset == endOffset) {
-                Position end = new DefaultPosition(line, offset - lineOffset, offset);
-                return new Location(file, start, end);
-            }
-            char c = contents.charAt(offset);
-            if (c == '\n') {
-                lineOffset = offset + 1;
-                if (prev != '\r') {
-                    line++;
-                }
-            } else if (c == '\r') {
-                line++;
-                lineOffset = offset + 1;
-            }
-            prev = c;
-        }
-        return create(file);
-    }
-
-    /**
-     * Creates a new location for the given file, with the given contents, for
-     * the given line number.
-     *
-     * @param file the file containing the location
-     * @param contents the current contents of the file
-     * @param line the line number (0-based) for the position
-     * @return a new location
-     */
-    @NonNull
-    public static Location create(@NonNull File file, @NonNull String contents, int line) {
-        return create(file, contents, line, null, null, null);
-    }
-
-    /**
-     * Creates a new location for the given file, with the given contents, for
-     * the given line number.
-     *
-     * @param file the file containing the location
-     * @param contents the current contents of the file
-     * @param line the line number (0-based) for the position
-     * @param patternStart an optional pattern to search for from the line
-     *            match; if found, adjust the column and offsets to begin at the
-     *            pattern start
-     * @param patternEnd an optional pattern to search for behind the start
-     *            pattern; if found, adjust the end offset to match the end of
-     *            the pattern
-     * @param hints optional additional information regarding the pattern search
-     * @return a new location
-     */
-    @NonNull
-    public static Location create(@NonNull File file, @NonNull String contents, int line,
-            @Nullable String patternStart, @Nullable String patternEnd,
-            @Nullable SearchHints hints) {
-        int currentLine = 0;
-        int offset = 0;
-        while (currentLine < line) {
-            offset = contents.indexOf('\n', offset);
-            if (offset == -1) {
-                return create(file);
-            }
-            currentLine++;
-            offset++;
-        }
-
-        if (line == currentLine) {
-            if (patternStart != null) {
-                SearchDirection direction = SearchDirection.NEAREST;
-                if (hints != null) {
-                    direction = hints.mDirection;
-                }
-
-                int index;
-                if (direction == SearchDirection.BACKWARD) {
-                    index = findPreviousMatch(contents, offset, patternStart, hints);
-                    line = adjustLine(contents, line, offset, index);
-                } else if (direction == SearchDirection.EOL_BACKWARD) {
-                    int lineEnd = contents.indexOf('\n', offset);
-                    if (lineEnd == -1) {
-                        lineEnd = contents.length();
-                    }
-
-                    index = findPreviousMatch(contents, lineEnd, patternStart, hints);
-                    line = adjustLine(contents, line, offset, index);
-                } else if (direction == SearchDirection.FORWARD) {
-                    index = findNextMatch(contents, offset, patternStart, hints);
-                    line = adjustLine(contents, line, offset, index);
-                } else {
-                    assert direction == SearchDirection.NEAREST;
-
-                    int before = findPreviousMatch(contents, offset, patternStart, hints);
-                    int after = findNextMatch(contents, offset, patternStart, hints);
-
-                    if (before == -1) {
-                        index = after;
-                        line = adjustLine(contents, line, offset, index);
-                    } else if (after == -1) {
-                        index = before;
-                        line = adjustLine(contents, line, offset, index);
-                    } else if (offset - before < after - offset) {
-                        index = before;
-                        line = adjustLine(contents, line, offset, index);
-                    } else {
-                        index = after;
-                        line = adjustLine(contents, line, offset, index);
-                    }
-                }
-
-                if (index != -1) {
-                    int lineStart = contents.lastIndexOf('\n', index);
-                    if (lineStart == -1) {
-                        lineStart = 0;
-                    } else {
-                        lineStart++; // was pointing to the previous line's CR, not line start
-                    }
-                    int column = index - lineStart;
-                    if (patternEnd != null) {
-                        int end = contents.indexOf(patternEnd, offset + patternStart.length());
-                        if (end != -1) {
-                            return new Location(file, new DefaultPosition(line, column, index),
-                                    new DefaultPosition(line, -1, end + patternEnd.length()));
-                        }
-                    } else if (hints != null && (hints.isJavaSymbol() || hints.isWholeWord())) {
-                        if (hints.isConstructor() && contents.startsWith(SUPER_KEYWORD, index)) {
-                            patternStart = SUPER_KEYWORD;
-                        }
-                        return new Location(file, new DefaultPosition(line, column, index),
-                                new DefaultPosition(line, column + patternStart.length(),
-                                        index + patternStart.length()));
-                    }
-                    return new Location(file, new DefaultPosition(line, column, index),
-                            new DefaultPosition(line, column, index + patternStart.length()));
-                }
-            }
-
-            Position position = new DefaultPosition(line, -1, offset);
-            return new Location(file, position, position);
-        }
-
-        return create(file);
-    }
-
-    private static int findPreviousMatch(@NonNull String contents, int offset, String pattern,
-            @Nullable SearchHints hints) {
-        while (true) {
-            int index = contents.lastIndexOf(pattern, offset);
-            if (index == -1) {
-                return -1;
-            } else {
-                if (isMatch(contents, index, pattern, hints)) {
-                    return index;
-                } else {
-                    offset = index - pattern.length();
-                }
-            }
-        }
-    }
-
-    private static int findNextMatch(@NonNull String contents, int offset, String pattern,
-            @Nullable SearchHints hints) {
-        int constructorIndex = -1;
-        if (hints != null && hints.isConstructor()) {
-            // Special condition: See if the call is referenced as "super" instead.
-            assert hints.isWholeWord();
-            int index = contents.indexOf(SUPER_KEYWORD, offset);
-            if (index != -1 && isMatch(contents, index, SUPER_KEYWORD, hints)) {
-                constructorIndex = index;
-            }
-        }
-
-        while (true) {
-            int index = contents.indexOf(pattern, offset);
-            if (index == -1) {
-                return constructorIndex;
-            } else {
-                if (isMatch(contents, index, pattern, hints)) {
-                    if (constructorIndex != -1) {
-                        return Math.min(constructorIndex, index);
-                    }
-                    return index;
-                } else {
-                    offset = index + pattern.length();
-                }
-            }
-        }
-    }
-
-    private static boolean isMatch(@NonNull String contents, int offset, String pattern,
-            @Nullable SearchHints hints) {
-        if (!contents.startsWith(pattern, offset)) {
-            return false;
-        }
-
-        if (hints != null) {
-            char prevChar = offset > 0 ? contents.charAt(offset - 1) : 0;
-            int lastIndex = offset + pattern.length() - 1;
-            char nextChar = lastIndex < contents.length() - 1 ? contents.charAt(lastIndex + 1) : 0;
-
-            if (hints.isWholeWord() && (Character.isLetter(prevChar)
-                    || Character.isLetter(nextChar))) {
-                return false;
-
-            }
-
-            if (hints.isJavaSymbol()) {
-                if (Character.isJavaIdentifierPart(prevChar)
-                        || Character.isJavaIdentifierPart(nextChar)) {
-                    return false;
-                }
-
-                if (prevChar == '"') {
-                    return false;
-                }
-
-                // TODO: Additional validation to see if we're in a comment, string, etc.
-                // This will require lexing from the beginning of the buffer.
-            }
-
-            if (hints.isConstructor() && SUPER_KEYWORD.equals(pattern)) {
-                // Only looking for super(), not super.x, so assert that the next
-                // non-space character is (
-                int index = lastIndex + 1;
-                while (index < contents.length() - 1) {
-                    char c = contents.charAt(index);
-                    if (c == '(') {
-                        break;
-                    } else if (!Character.isWhitespace(c)) {
-                        return false;
-                    }
-                    index++;
-                }
-            }
-        }
-
-        return true;
-    }
-
-    private static int adjustLine(String doc, int line, int offset, int newOffset) {
-        if (newOffset == -1) {
-            return line;
-        }
-
-        if (newOffset < offset) {
-            return line - countLines(doc, newOffset, offset);
-        } else {
-            return line + countLines(doc, offset, newOffset);
-        }
-    }
-
-    private static int countLines(String doc, int start, int end) {
-        int lines = 0;
-        for (int offset = start; offset < end; offset++) {
-            char c = doc.charAt(offset);
-            if (c == '\n') {
-                lines++;
-            }
-        }
-
-        return lines;
-    }
-
-    /**
-     * Reverses the secondary location list initiated by the given location
-     *
-     * @param location the first location in the list
-     * @return the first location in the reversed list
-     */
-    public static Location reverse(Location location) {
-        Location next = location.getSecondary();
-        location.setSecondary(null);
-        while (next != null) {
-            Location nextNext = next.getSecondary();
-            next.setSecondary(location);
-            location = next;
-            next = nextNext;
-        }
-
-        return location;
-    }
-
-    /**
-     * A {@link Handle} is a reference to a location. The point of a location
-     * handle is to be able to create them cheaply, and then resolve them into
-     * actual locations later (if needed). This makes it possible to for example
-     * delay looking up line numbers, for locations that are offset based.
-     */
-    public interface Handle {
-        /**
-         * Compute a full location for the given handle
-         *
-         * @return create a location for this handle
-         */
-        @NonNull
-        Location resolve();
-
-        /**
-         * Sets the client data associated with this location. This is an optional
-         * field which can be used by the creator of the {@link Location} to store
-         * temporary state associated with the location.
-         *
-         * @param clientData the data to store with this location
-         */
-        void setClientData(@Nullable Object clientData);
-
-        /**
-         * Returns the client data associated with this location - an optional field
-         * which can be used by the creator of the {@link Location} to store
-         * temporary state associated with the location.
-         *
-         * @return the data associated with this location
-         */
-        @Nullable
-        Object getClientData();
-    }
-
-    /** A default {@link Handle} implementation for simple file offsets */
-    public static class DefaultLocationHandle implements Handle {
-        private final File mFile;
-        private final String mContents;
-        private final int mStartOffset;
-        private final int mEndOffset;
-        private Object mClientData;
-
-        /**
-         * Constructs a new {@link DefaultLocationHandle}
-         *
-         * @param context the context pointing to the file and its contents
-         * @param startOffset the start offset within the file
-         * @param endOffset the end offset within the file
-         */
-        public DefaultLocationHandle(@NonNull Context context, int startOffset, int endOffset) {
-            mFile = context.file;
-            mContents = context.getContents();
-            mStartOffset = startOffset;
-            mEndOffset = endOffset;
-        }
-
-        @Override
-        @NonNull
-        public Location resolve() {
-            return create(mFile, mContents, mStartOffset, mEndOffset);
-        }
-
-        @Override
-        public void setClientData(@Nullable Object clientData) {
-            mClientData = clientData;
-        }
-
-        @Override
-        @Nullable
-        public Object getClientData() {
-            return mClientData;
-        }
-    }
-
-    /**
-     * Whether to look forwards, or backwards, or in both directions, when
-     * searching for a pattern in the source code to determine the right
-     * position range for a given symbol.
-     * <p>
-     * When dealing with bytecode for example, there are only line number entries
-     * within method bodies, so when searching for the method declaration, we should only
-     * search backwards from the first line entry in the method.
-     */
-    public enum SearchDirection {
-        /** Only search forwards */
-        FORWARD,
-
-        /** Only search backwards */
-        BACKWARD,
-
-        /** Search backwards from the current end of line (normally it's the beginning of
-         * the current line) */
-        EOL_BACKWARD,
-
-        /**
-         * Search both forwards and backwards from the given line, and prefer
-         * the match that is closest
-         */
-        NEAREST,
-    }
-
-    /**
-     * Extra information pertaining to finding a symbol in a source buffer,
-     * used by {@link Location#create(File, String, int, String, String, SearchHints)}
-     */
-    public static class SearchHints {
-        /**
-         * the direction to search for the nearest match in (provided
-         * {@code patternStart} is non null)
-         */
-        @NonNull
-        private final SearchDirection mDirection;
-
-        /** Whether the matched pattern should be a whole word */
-        private boolean mWholeWord;
-
-        /**
-         * Whether the matched pattern should be a Java symbol (so for example,
-         * a match inside a comment or string literal should not be used)
-         */
-        private boolean mJavaSymbol;
-
-        /**
-         * Whether the matched pattern corresponds to a constructor; if so, look for
-         * some other possible source aliases too, such as "super".
-         */
-        private boolean mConstructor;
-
-        private SearchHints(@NonNull SearchDirection direction) {
-            super();
-            mDirection = direction;
-        }
-
-        /**
-         * Constructs a new {@link SearchHints} object
-         *
-         * @param direction the direction to search in for the pattern
-         * @return a new @link SearchHints} object
-         */
-        @NonNull
-        public static SearchHints create(@NonNull SearchDirection direction) {
-            return new SearchHints(direction);
-        }
-
-        /**
-         * Indicates that pattern matches should apply to whole words only
-
-         * @return this, for constructor chaining
-         */
-        @NonNull
-        public SearchHints matchWholeWord() {
-            mWholeWord = true;
-
-            return this;
-        }
-
-        /** @return true if the pattern match should be for whole words only */
-        public boolean isWholeWord() {
-            return mWholeWord;
-        }
-
-        /**
-         * Indicates that pattern matches should apply to Java symbols only
-         *
-         * @return this, for constructor chaining
-         */
-        @NonNull
-        public SearchHints matchJavaSymbol() {
-            mJavaSymbol = true;
-            mWholeWord = true;
-
-            return this;
-        }
-
-        /** @return true if the pattern match should be for Java symbols only */
-        public boolean isJavaSymbol() {
-            return mJavaSymbol;
-        }
-
-        /**
-         * Indicates that pattern matches should apply to constructors. If so, look for
-         * some other possible source aliases too, such as "super".
-         *
-         * @return this, for constructor chaining
-         */
-        @NonNull
-        public SearchHints matchConstructor() {
-            mConstructor = true;
-            mWholeWord = true;
-            mJavaSymbol = true;
-
-            return this;
-        }
-
-        /** @return true if the pattern match should be for a constructor */
-        public boolean isConstructor() {
-            return mConstructor;
-        }
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Position.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Position.java
deleted file mode 100644
index 6407cc9..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Position.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.google.common.annotations.Beta;
-
-/**
- * Information about a position in a file/document.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public abstract class Position {
-    /**
-     * Returns the line number (0-based where the first line is line 0)
-     *
-     * @return the 0-based line number
-     */
-    public abstract int getLine();
-
-    /**
-     * The character offset
-     *
-     * @return the 0-based character offset
-     */
-    public abstract int getOffset();
-
-    /**
-     * Returns the column number (where the first character on the line is 0),
-     * or -1 if unknown
-     *
-     * @return the 0-based column number
-     */
-    public abstract int getColumn();
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Project.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Project.java
deleted file mode 100644
index 968b9b1..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Project.java
+++ /dev/null
@@ -1,929 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import static com.android.SdkConstants.ANDROID_LIBRARY;
-import static com.android.SdkConstants.ANDROID_LIBRARY_REFERENCE_FORMAT;
-import static com.android.SdkConstants.ANDROID_MANIFEST_XML;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_MIN_SDK_VERSION;
-import static com.android.SdkConstants.ATTR_PACKAGE;
-import static com.android.SdkConstants.ATTR_TARGET_SDK_VERSION;
-import static com.android.SdkConstants.PROGUARD_CONFIG;
-import static com.android.SdkConstants.PROJECT_PROPERTIES;
-import static com.android.SdkConstants.RES_FOLDER;
-import static com.android.SdkConstants.TAG_USES_SDK;
-import static com.android.SdkConstants.VALUE_TRUE;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.client.api.CircularDependencyException;
-import com.android.tools.lint.client.api.Configuration;
-import com.android.tools.lint.client.api.LintClient;
-import com.android.tools.lint.client.api.SdkInfo;
-import com.google.common.annotations.Beta;
-import com.google.common.base.Charsets;
-import com.google.common.io.Closeables;
-import com.google.common.io.Files;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Properties;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A project contains information about an Android project being scanned for
- * Lint errors.
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public class Project {
-    private final LintClient mClient;
-    private final File mDir;
-    private final File mReferenceDir;
-    private Configuration mConfiguration;
-    private String mPackage;
-    private int mMinSdk = 1;
-    private int mTargetSdk = -1;
-    private int mBuildSdk = -1;
-    private boolean mLibrary;
-    private String mName;
-    private String mProguardPath;
-    private boolean mMergeManifests;
-
-    /** The SDK info, if any */
-    private SdkInfo mSdkInfo;
-
-    /**
-     * If non null, specifies a non-empty list of specific files under this
-     * project which should be checked.
-     */
-    private List<File> mFiles;
-    private List<File> mJavaSourceFolders;
-    private List<File> mJavaClassFolders;
-    private List<File> mJavaLibraries;
-    private List<Project> mDirectLibraries;
-    private List<Project> mAllLibraries;
-    private boolean mReportIssues = true;
-
-    /**
-     * Creates a new {@link Project} for the given directory.
-     *
-     * @param client the tool running the lint check
-     * @param dir the root directory of the project
-     * @param referenceDir See {@link #getReferenceDir()}.
-     * @return a new {@link Project}
-     */
-    @NonNull
-    public static Project create(
-            @NonNull LintClient client,
-            @NonNull File dir,
-            @NonNull File referenceDir) {
-        return new Project(client, dir, referenceDir);
-    }
-
-    /** Creates a new Project. Use one of the factory methods to create. */
-    private Project(
-            @NonNull LintClient client,
-            @NonNull File dir,
-            @NonNull File referenceDir) {
-        mClient = client;
-        mDir = dir;
-        mReferenceDir = referenceDir;
-
-        try {
-            // Read properties file and initialize library state
-            Properties properties = new Properties();
-            File propFile = new File(dir, PROJECT_PROPERTIES);
-            if (propFile.exists()) {
-                @SuppressWarnings("resource") // Eclipse doesn't know about Closeables.closeQuietly
-                BufferedInputStream is = new BufferedInputStream(new FileInputStream(propFile));
-                try {
-                    properties.load(is);
-                    String value = properties.getProperty(ANDROID_LIBRARY);
-                    mLibrary = VALUE_TRUE.equals(value);
-                    mProguardPath = properties.getProperty(PROGUARD_CONFIG);
-                    mMergeManifests = VALUE_TRUE.equals(properties.getProperty(
-                            "manifestmerger.enabled")); //$NON-NLS-1$
-                    String target = properties.getProperty("target"); //$NON-NLS-1$
-                    if (target != null) {
-                        int index = target.lastIndexOf('-');
-                        if (index == -1) {
-                            index = target.lastIndexOf(':');
-                        }
-                        if (index != -1) {
-                            String versionString = target.substring(index + 1);
-                            try {
-                                mBuildSdk = Integer.parseInt(versionString);
-                            } catch (NumberFormatException nufe) {
-                                mClient.log(Severity.WARNING, null,
-                                        "Unexpected build target format: %1$s", target);
-                            }
-                        }
-                    }
-
-                    for (int i = 1; i < 1000; i++) {
-                        String key = String.format(ANDROID_LIBRARY_REFERENCE_FORMAT, i);
-                        String library = properties.getProperty(key);
-                        if (library == null || library.isEmpty()) {
-                            // No holes in the numbering sequence is allowed
-                            break;
-                        }
-
-                        File libraryDir = new File(dir, library).getCanonicalFile();
-
-                        if (mDirectLibraries == null) {
-                            mDirectLibraries = new ArrayList<Project>();
-                        }
-
-                        // Adjust the reference dir to be a proper prefix path of the
-                        // library dir
-                        File libraryReferenceDir = referenceDir;
-                        if (!libraryDir.getPath().startsWith(referenceDir.getPath())) {
-                            // Symlinks etc might have been resolved, so do those to
-                            // the reference dir as well
-                            libraryReferenceDir = libraryReferenceDir.getCanonicalFile();
-                            if (!libraryDir.getPath().startsWith(referenceDir.getPath())) {
-                                File file = libraryReferenceDir;
-                                while (file != null && !file.getPath().isEmpty()) {
-                                    if (libraryDir.getPath().startsWith(file.getPath())) {
-                                        libraryReferenceDir = file;
-                                        break;
-                                    }
-                                    file = file.getParentFile();
-                                }
-                            }
-                        }
-
-                        try {
-                            Project libraryPrj = client.getProject(libraryDir, libraryReferenceDir);
-                            mDirectLibraries.add(libraryPrj);
-                            // By default, we don't report issues in inferred library projects.
-                            // The driver will set report = true for those library explicitly
-                            // requested.
-                            libraryPrj.setReportIssues(false);
-                        } catch (CircularDependencyException e) {
-                            e.setProject(this);
-                            e.setLocation(Location.create(propFile));
-                            throw e;
-                        }
-                    }
-                } finally {
-                    Closeables.closeQuietly(is);
-                }
-            }
-        } catch (IOException ioe) {
-            client.log(ioe, "Initializing project state");
-        }
-
-        if (mDirectLibraries != null) {
-            mDirectLibraries = Collections.unmodifiableList(mDirectLibraries);
-        } else {
-            mDirectLibraries = Collections.emptyList();
-        }
-    }
-
-    @Override
-    public String toString() {
-        return "Project [dir=" + mDir + ']';
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((mDir == null) ? 0 : mDir.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(@Nullable Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        Project other = (Project) obj;
-        if (mDir == null) {
-            if (other.mDir != null)
-                return false;
-        } else if (!mDir.equals(other.mDir))
-            return false;
-        return true;
-    }
-
-    /**
-     * Adds the given file to the list of files which should be checked in this
-     * project. If no files are added, the whole project will be checked.
-     *
-     * @param file the file to be checked
-     */
-    public void addFile(@NonNull File file) {
-        if (mFiles == null) {
-            mFiles = new ArrayList<File>();
-        }
-        mFiles.add(file);
-    }
-
-    /**
-     * The list of files to be checked in this project. If null, the whole
-     * project should be checked.
-     *
-     * @return the subset of files to be checked, or null for the whole project
-     */
-    @Nullable
-    public List<File> getSubset() {
-        return mFiles;
-    }
-
-    /**
-     * Returns the list of source folders for Java source files
-     *
-     * @return a list of source folders to search for .java files
-     */
-    @NonNull
-    public List<File> getJavaSourceFolders() {
-        if (mJavaSourceFolders == null) {
-            if (isAospFrameworksProject(mDir)) {
-                return Collections.singletonList(new File(mDir, "java")); //$NON-NLS-1$
-            }
-            if (isAospBuildEnvironment()) {
-                String top = getAospTop();
-                if (mDir.getAbsolutePath().startsWith(top)) {
-                    mJavaSourceFolders = getAospJavaSourcePath();
-                    return mJavaSourceFolders;
-                }
-            }
-
-            mJavaSourceFolders = mClient.getJavaSourceFolders(this);
-        }
-
-        return mJavaSourceFolders;
-    }
-
-    /**
-     * Returns the list of output folders for class files
-     * @return a list of output folders to search for .class files
-     */
-    @NonNull
-    public List<File> getJavaClassFolders() {
-        if (mJavaClassFolders == null) {
-            if (isAospFrameworksProject(mDir)) {
-                File top = mDir.getParentFile().getParentFile().getParentFile();
-                if (top != null) {
-                    File out = new File(top, "out");
-                    if (out.exists()) {
-                        String relative =
-                            "target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar";
-                        File jar = new File(out, relative.replace('/', File.separatorChar));
-                        if (jar.exists()) {
-                            mJavaClassFolders = Collections.singletonList(jar);
-                            return mJavaClassFolders;
-                        }
-                    }
-                }
-            }
-            if (isAospBuildEnvironment()) {
-                String top = getAospTop();
-                if (mDir.getAbsolutePath().startsWith(top)) {
-                    mJavaClassFolders = getAospJavaClassPath();
-                    return mJavaClassFolders;
-                }
-            }
-
-            mJavaClassFolders = mClient.getJavaClassFolders(this);
-        }
-        return mJavaClassFolders;
-    }
-
-    /**
-     * Returns the list of Java libraries (typically .jar files) that this
-     * project depends on. Note that this refers to jar libraries, not Android
-     * library projects which are processed in a separate pass with their own
-     * source and class folders.
-     *
-     * @return a list of .jar files (or class folders) that this project depends
-     *         on.
-     */
-    @NonNull
-    public List<File> getJavaLibraries() {
-        if (mJavaLibraries == null) {
-            // AOSP builds already merge libraries and class folders into
-            // the single classes.jar file, so these have already been processed
-            // in getJavaClassFolders.
-
-            mJavaLibraries = mClient.getJavaLibraries(this);
-        }
-
-        return mJavaLibraries;
-    }
-
-    /**
-     * Returns the resource folder.
-     *
-     * @return a file pointing to the resource folder, or null if the project
-     *         does not contain any resources
-     */
-    @NonNull
-    public List<File> getResourceFolders() {
-        List<File> folders = mClient.getResourceFolders(this);
-
-        if (folders.size() == 1 && isAospFrameworksProject(mDir)) {
-            // No manifest file for this project: just init the manifest values here
-            mMinSdk = mTargetSdk = SdkConstants.HIGHEST_KNOWN_API;
-            File folder = new File(folders.get(0), RES_FOLDER);
-            if (!folder.exists()) {
-                folders = Collections.emptyList();
-            }
-        }
-
-        return folders;
-    }
-
-    /**
-     * Returns the relative path of a given file relative to the user specified
-     * directory (which is often the project directory but sometimes a higher up
-     * directory when a directory tree is being scanned
-     *
-     * @param file the file under this project to check
-     * @return the path relative to the reference directory (often the project directory)
-     */
-    @NonNull
-    public String getDisplayPath(@NonNull File file) {
-       String path = file.getPath();
-       String referencePath = mReferenceDir.getPath();
-       if (path.startsWith(referencePath)) {
-           int length = referencePath.length();
-           if (path.length() > length && path.charAt(length) == File.separatorChar) {
-               length++;
-           }
-
-           return path.substring(length);
-       }
-
-       return path;
-    }
-
-    /**
-     * Returns the relative path of a given file within the current project.
-     *
-     * @param file the file under this project to check
-     * @return the path relative to the project
-     */
-    @NonNull
-    public String getRelativePath(@NonNull File file) {
-       String path = file.getPath();
-       String referencePath = mDir.getPath();
-       if (path.startsWith(referencePath)) {
-           int length = referencePath.length();
-           if (path.length() > length && path.charAt(length) == File.separatorChar) {
-               length++;
-           }
-
-           return path.substring(length);
-       }
-
-       return path;
-    }
-
-    /**
-     * Returns the project root directory
-     *
-     * @return the dir
-     */
-    @NonNull
-    public File getDir() {
-        return mDir;
-    }
-
-    /**
-     * Returns the original user supplied directory where the lint search
-     * started. For example, if you run lint against {@code /tmp/foo}, and it
-     * finds a project to lint in {@code /tmp/foo/dev/src/project1}, then the
-     * {@code dir} is {@code /tmp/foo/dev/src/project1} and the
-     * {@code referenceDir} is {@code /tmp/foo/}.
-     *
-     * @return the reference directory, never null
-     */
-    @NonNull
-    public File getReferenceDir() {
-        return mReferenceDir;
-    }
-
-    /**
-     * Gets the configuration associated with this project
-     *
-     * @return the configuration associated with this project
-     */
-    @NonNull
-    public Configuration getConfiguration() {
-        if (mConfiguration == null) {
-            mConfiguration = mClient.getConfiguration(this);
-        }
-        return mConfiguration;
-    }
-
-    /**
-     * Returns the application package specified by the manifest
-     *
-     * @return the application package, or null if unknown
-     */
-    @Nullable
-    public String getPackage() {
-        //assert !mLibrary; // Should call getPackage on the master project, not the library
-        // Assertion disabled because you might be running lint on a standalone library project.
-
-        return mPackage;
-    }
-
-    /**
-     * Returns the minimum API level requested by the manifest, or -1 if not
-     * specified
-     *
-     * @return the minimum API level or -1 if unknown
-     */
-    public int getMinSdk() {
-        //assert !mLibrary; // Should call getMinSdk on the master project, not the library
-        // Assertion disabled because you might be running lint on a standalone library project.
-
-        return mMinSdk;
-    }
-
-    /**
-     * Returns the target API level specified by the manifest, or -1 if not
-     * specified
-     *
-     * @return the target API level or -1 if unknown
-     */
-    public int getTargetSdk() {
-        //assert !mLibrary; // Should call getTargetSdk on the master project, not the library
-        // Assertion disabled because you might be running lint on a standalone library project.
-
-        return mTargetSdk;
-    }
-
-    /**
-     * Returns the target API used to build the project, or -1 if not known
-     *
-     * @return the build target API or -1 if unknown
-     */
-    public int getBuildSdk() {
-        return mBuildSdk;
-    }
-
-    /**
-     * Initialized the manifest state from the given manifest model
-     *
-     * @param document the DOM document for the manifest XML document
-     */
-    public void readManifest(@NonNull Document document) {
-        Element root = document.getDocumentElement();
-        if (root == null) {
-            return;
-        }
-
-        mPackage = root.getAttribute(ATTR_PACKAGE);
-
-        // Initialize minSdk and targetSdk
-        NodeList usesSdks = root.getElementsByTagName(TAG_USES_SDK);
-        if (usesSdks.getLength() > 0) {
-            Element element = (Element) usesSdks.item(0);
-
-            String minSdk = null;
-            if (element.hasAttributeNS(ANDROID_URI, ATTR_MIN_SDK_VERSION)) {
-                minSdk = element.getAttributeNS(ANDROID_URI, ATTR_MIN_SDK_VERSION);
-            }
-            if (minSdk != null) {
-                try {
-                    mMinSdk = Integer.valueOf(minSdk);
-                } catch (NumberFormatException e) {
-                    mMinSdk = 1;
-                }
-            }
-
-            String targetSdk = null;
-            if (element.hasAttributeNS(ANDROID_URI, ATTR_TARGET_SDK_VERSION)) {
-                targetSdk = element.getAttributeNS(ANDROID_URI, ATTR_TARGET_SDK_VERSION);
-            } else if (minSdk != null) {
-                targetSdk = minSdk;
-            }
-            if (targetSdk != null) {
-                try {
-                    mTargetSdk = Integer.valueOf(targetSdk);
-                } catch (NumberFormatException e) {
-                    // TODO: Handle codenames?
-                    mTargetSdk = -1;
-                }
-            }
-        } else if (isAospBuildEnvironment()) {
-            extractAospMinSdkVersion();
-        }
-    }
-
-    /**
-     * Returns true if this project is an Android library project
-     *
-     * @return true if this project is an Android library project
-     */
-    public boolean isLibrary() {
-        return mLibrary;
-    }
-
-    /**
-     * Returns the list of library projects referenced by this project
-     *
-     * @return the list of library projects referenced by this project, never
-     *         null
-     */
-    @NonNull
-    public List<Project> getDirectLibraries() {
-        return mDirectLibraries;
-    }
-
-    /**
-     * Returns the transitive closure of the library projects for this project
-     *
-     * @return the transitive closure of the library projects for this project
-     */
-    @NonNull
-    public List<Project> getAllLibraries() {
-        if (mAllLibraries == null) {
-            if (mDirectLibraries.isEmpty()) {
-                return mDirectLibraries;
-            }
-
-            List<Project> all = new ArrayList<Project>();
-            addLibraryProjects(all);
-            mAllLibraries = all;
-        }
-
-        return mAllLibraries;
-    }
-
-    /**
-     * Adds this project's library project and their library projects
-     * recursively into the given collection of projects
-     *
-     * @param collection the collection to add the projects into
-     */
-    private void addLibraryProjects(@NonNull Collection<Project> collection) {
-        for (Project library : mDirectLibraries) {
-            collection.add(library);
-            // Recurse
-            library.addLibraryProjects(collection);
-        }
-    }
-
-    /**
-     * Gets the SDK info for the current project.
-     *
-     * @return the SDK info for the current project, never null
-     */
-    @NonNull
-    public SdkInfo getSdkInfo() {
-        if (mSdkInfo == null) {
-            mSdkInfo = mClient.getSdkInfo(this);
-        }
-
-        return mSdkInfo;
-    }
-
-    /**
-     * Gets the path to the manifest file in this project, if it exists
-     *
-     * @return the path to the manifest file, or null if it does not exist
-     */
-    @Nullable
-    public File getManifestFile() {
-        File manifestFile = new File(mDir, ANDROID_MANIFEST_XML);
-        if (manifestFile.exists()) {
-            return manifestFile;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the proguard path configured for this project, or null if ProGuard is
-     * not configured.
-     *
-     * @return the proguard path, or null
-     */
-    @Nullable
-    public String getProguardPath() {
-        return mProguardPath;
-    }
-
-    /**
-     * Returns the name of the project
-     *
-     * @return the name of the project, never null
-     */
-    @NonNull
-    public String getName() {
-        if (mName == null) {
-            mName = mClient.getProjectName(this);
-        }
-
-        return mName;
-    }
-
-    /**
-     * Sets the name of the project
-     *
-     * @param name the name of the project, never null
-     */
-    public void setName(@NonNull String name) {
-        assert !name.isEmpty();
-        mName = name;
-    }
-
-    /**
-     * Sets whether lint should report issues in this project. See
-     * {@link #getReportIssues()} for a full description of what that means.
-     *
-     * @param reportIssues whether lint should report issues in this project
-     */
-    public void setReportIssues(boolean reportIssues) {
-        mReportIssues = reportIssues;
-    }
-
-    /**
-     * Returns whether lint should report issues in this project.
-     * <p>
-     * If a user specifies a project and its library projects for analysis, then
-     * those library projects are all "included", and all errors found in all
-     * the projects are reported. But if the user is only running lint on the
-     * main project, we shouldn't report errors in any of the library projects.
-     * We still need to <b>consider</b> them for certain types of checks, such
-     * as determining whether resources found in the main project are unused, so
-     * the detectors must still get a chance to look at these projects. The
-     * {@code #getReportIssues()} attribute is used for this purpose.
-     *
-     * @return whether lint should report issues in this project
-     */
-    public boolean getReportIssues() {
-        return mReportIssues;
-    }
-
-    /**
-     * Sets whether manifest merging is in effect.
-     *
-     * @param merging whether manifest merging is in effect
-     */
-    public void setMergingManifests(boolean merging) {
-        mMergeManifests = merging;
-    }
-
-    /**
-     * Returns whether manifest merging is in effect
-     *
-     * @return true if manifests in library projects should be merged into main projects
-     */
-    public boolean isMergingManifests() {
-        return mMergeManifests;
-    }
-
-
-    // ---------------------------------------------------------------------------
-    // Support for running lint on the AOSP source tree itself
-
-    private static Boolean sAospBuild;
-
-    /** Is lint running in an AOSP build environment */
-    private static boolean isAospBuildEnvironment() {
-        if (sAospBuild == null) {
-            sAospBuild = getAospTop() != null;
-        }
-
-        return sAospBuild.booleanValue();
-    }
-
-    /**
-     * Is this the frameworks AOSP project? Needs some hardcoded support since
-     * it doesn't have a manifest file, etc.
-     *
-     * @param dir the project directory to check
-     * @return true if this looks like the frameworks/base/core project
-     */
-    static boolean isAospFrameworksProject(@NonNull File dir) {
-        if (!dir.getPath().endsWith("core")) { //$NON-NLS-1$
-            return false;
-        }
-
-        File parent = dir.getParentFile();
-        if (parent == null || !parent.getName().equals("base")) { //$NON-NLS-1$
-            return false;
-        }
-
-        parent = parent.getParentFile();
-        if (parent == null || !parent.getName().equals("frameworks")) { //$NON-NLS-1$
-            return false;
-        }
-
-        return true;
-    }
-
-    /** Get the root AOSP dir, if any */
-    private static String getAospTop() {
-        return System.getenv("ANDROID_BUILD_TOP");   //$NON-NLS-1$
-    }
-
-    /** Get the host out directory in AOSP, if any */
-    private static String getAospHostOut() {
-        return System.getenv("ANDROID_HOST_OUT");    //$NON-NLS-1$
-    }
-
-    /** Get the product out directory in AOSP, if any */
-    private static String getAospProductOut() {
-        return System.getenv("ANDROID_PRODUCT_OUT"); //$NON-NLS-1$
-    }
-
-    private List<File> getAospJavaSourcePath() {
-        List<File> sources = new ArrayList<File>(2);
-        // Normal sources
-        File src = new File(mDir, "src"); //$NON-NLS-1$
-        if (src.exists()) {
-            sources.add(src);
-        }
-
-        // Generates sources
-        for (File dir : getIntermediateDirs()) {
-            File classes = new File(dir, "src"); //$NON-NLS-1$
-            if (classes.exists()) {
-                sources.add(classes);
-            }
-        }
-
-        if (sources.isEmpty()) {
-            mClient.log(null,
-                    "Warning: Could not find sources or generated sources for project %1$s",
-                    getName());
-        }
-
-        return sources;
-    }
-
-    private List<File> getAospJavaClassPath() {
-        List<File> classDirs = new ArrayList<File>(1);
-
-        for (File dir : getIntermediateDirs()) {
-            File classes = new File(dir, "classes"); //$NON-NLS-1$
-            if (classes.exists()) {
-                classDirs.add(classes);
-            } else {
-                classes = new File(dir, "classes.jar"); //$NON-NLS-1$
-                if (classes.exists()) {
-                    classDirs.add(classes);
-                }
-            }
-        }
-
-        if (classDirs.isEmpty()) {
-            mClient.log(null,
-                    "No bytecode found: Has the project been built? (%1$s)", getName());
-        }
-
-        return classDirs;
-    }
-
-    /** Find the _intermediates directories for a given module name */
-    private List<File> getIntermediateDirs() {
-        // See build/core/definitions.mk and in particular the "intermediates-dir-for" definition
-        List<File> intermediates = new ArrayList<File>();
-
-        // TODO: Look up the module name, e.g. LOCAL_MODULE. However,
-        // some Android.mk files do some complicated things with it - and most
-        // projects use the same module name as the directory name.
-        String moduleName = mDir.getName();
-
-        String top = getAospTop();
-        final String[] outFolders = new String[] {
-            top + "/out/host/common/obj",             //$NON-NLS-1$
-            top + "/out/target/common/obj",           //$NON-NLS-1$
-            getAospHostOut() + "/obj",                //$NON-NLS-1$
-            getAospProductOut() + "/obj"              //$NON-NLS-1$
-        };
-        final String[] moduleClasses = new String[] {
-                "APPS",                //$NON-NLS-1$
-                "JAVA_LIBRARIES",      //$NON-NLS-1$
-        };
-
-        for (String out : outFolders) {
-            assert new File(out.replace('/', File.separatorChar)).exists() : out;
-            for (String moduleClass : moduleClasses) {
-                String path = out + '/' + moduleClass + '/' + moduleName
-                        + "_intermediates"; //$NON-NLS-1$
-                File file = new File(path.replace('/', File.separatorChar));
-                if (file.exists()) {
-                    intermediates.add(file);
-                }
-            }
-        }
-
-        return intermediates;
-    }
-
-    private void extractAospMinSdkVersion() {
-        // Is the SDK level specified by a Makefile?
-        boolean found = false;
-        File makefile = new File(mDir, "Android.mk"); //$NON-NLS-1$
-        if (makefile.exists()) {
-            try {
-                List<String> lines = Files.readLines(makefile, Charsets.UTF_8);
-                Pattern p = Pattern.compile("LOCAL_SDK_VERSION\\s*:=\\s*(.*)"); //$NON-NLS-1$
-                for (String line : lines) {
-                    line = line.trim();
-                    Matcher matcher = p.matcher(line);
-                    if (matcher.matches()) {
-                        found = true;
-                        String version = matcher.group(1);
-                        if (version.equals("current")) { //$NON-NLS-1$
-                            mMinSdk = findCurrentAospVersion();
-                        } else {
-                            try {
-                                mMinSdk = Integer.valueOf(version);
-                            } catch (NumberFormatException e) {
-                                // Codename - just use current
-                                mMinSdk = findCurrentAospVersion();
-                            }
-                        }
-                        break;
-                    }
-                }
-            } catch (IOException ioe) {
-                mClient.log(ioe, null);
-            }
-        }
-
-        if (!found) {
-            mMinSdk = findCurrentAospVersion();
-        }
-    }
-
-    /** Cache for {@link #findCurrentAospVersion()} */
-    private static int sCurrentVersion;
-
-    /** In an AOSP build environment, identify the currently built image version, if available */
-    private static int findCurrentAospVersion() {
-        if (sCurrentVersion < 1) {
-            File apiDir = new File(getAospTop(), "frameworks/base/api" //$NON-NLS-1$
-                    .replace('/', File.separatorChar));
-            File[] apiFiles = apiDir.listFiles();
-            if (apiFiles == null) {
-                sCurrentVersion = 1;
-                return sCurrentVersion;
-            }
-            int max = 1;
-            for (File apiFile : apiFiles) {
-                String name = apiFile.getName();
-                int index = name.indexOf('.');
-                if (index > 0) {
-                    String base = name.substring(0, index);
-                    if (Character.isDigit(base.charAt(0))) {
-                        try {
-                            int version = Integer.parseInt(base);
-                            if (version > max) {
-                                max = version;
-                            }
-                        } catch (NumberFormatException nufe) {
-                            // pass
-                        }
-                    }
-                }
-            }
-            sCurrentVersion = max;
-        }
-
-        return sCurrentVersion;
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/ResourceXmlDetector.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/ResourceXmlDetector.java
deleted file mode 100644
index 68685c6..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/ResourceXmlDetector.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.google.common.annotations.Beta;
-
-import java.io.File;
-
-/**
- * Specialized detector intended for XML resources. Detectors that apply to XML
- * resources should extend this detector instead since it provides special
- * iteration hooks that are more efficient.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public abstract class ResourceXmlDetector extends Detector implements Detector.XmlScanner {
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return LintUtils.isXmlFile(file);
-    }
-
-    /**
-     * Returns whether this detector applies to the given folder type. This
-     * allows the detectors to be pruned from iteration, so for example when we
-     * are analyzing a string value file we don't need to look up detectors
-     * related to layout.
-     *
-     * @param folderType the folder type to be visited
-     * @return true if this detector can apply to resources in folders of the
-     *         given type
-     */
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return true;
-    }
-
-    @Override
-    public void run(@NonNull Context context) {
-        // The infrastructure should never call this method on an xml detector since
-        // it will run the various visitors instead
-        assert false;
-    }
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Scope.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Scope.java
deleted file mode 100644
index 0e33f1b..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Scope.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.android.annotations.NonNull;
-import com.google.common.annotations.Beta;
-
-import java.util.EnumSet;
-
-/**
- * The scope of a detector is the set of files a detector must consider when
- * performing its analysis. This can be used to determine when issues are
- * potentially obsolete, whether a detector should re-run on a file save, etc.
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public enum Scope {
-    /**
-     * The analysis only considers a single XML resource file at a time.
-     * <p>
-     * Issues which are only affected by a single resource file can be checked
-     * for incrementally when a file is edited.
-     */
-    RESOURCE_FILE,
-
-    /**
-     * The analysis considers <b>all</b> the resource file. This scope must not
-     * be used in conjunction with {@link #RESOURCE_FILE}; an issue scope is
-     * either considering just a single resource file or all the resources, not
-     * both.
-     */
-    ALL_RESOURCE_FILES,
-
-    /**
-     * The analysis only considers a single Java source file at a time.
-     * <p>
-     * Issues which are only affected by a single Java source file can be
-     * checked for incrementally when a Java source file is edited.
-     */
-    JAVA_FILE,
-
-    /**
-     * The analysis considers <b>all</b> the Java source files together.
-     * <p>
-     * This flag is mutually exclusive with {@link #JAVA_FILE}.
-     */
-    ALL_JAVA_FILES,
-
-    /**
-     * The analysis only considers a single Java class file at a time.
-     * <p>
-     * Issues which are only affected by a single Java class file can be checked
-     * for incrementally when a Java source file is edited and then recompiled.
-     */
-    CLASS_FILE,
-
-    /**
-     * The analysis considers <b>all</b> the Java class files together.
-     * <p>
-     * This flag is mutually exclusive with {@link #CLASS_FILE}.
-     */
-    ALL_CLASS_FILES,
-
-    /** The analysis considers the manifest file */
-    MANIFEST,
-
-    /** The analysis considers the Proguard configuration file */
-    PROGUARD_FILE,
-
-    /**
-     * The analysis considers classes in the libraries for this project. These
-     * will be analyzed before the classes themselves.
-     */
-    JAVA_LIBRARIES,
-
-    /**
-     * Scope for other files. Issues that specify a custom scope will be called unconditionally.
-     * This will call {@link Detector#run(Context)}} on the detectors unconditionally.
-     */
-    OTHER;
-
-    /**
-     * Returns true if the given scope set corresponds to scanning a single file
-     * rather than a whole project
-     *
-     * @param scopes the scope set to check
-     * @return true if the scope set references a single file
-     */
-    public static boolean checkSingleFile(@NonNull EnumSet<Scope> scopes) {
-        int size = scopes.size();
-        if (size == 2) {
-            // When single checking a Java source file, we check both its Java source
-            // and the associated class files
-            return scopes.contains(JAVA_FILE) && scopes.contains(CLASS_FILE);
-        } else {
-            return size == 1 &&
-                (scopes.contains(JAVA_FILE)
-                        || scopes.contains(CLASS_FILE)
-                        || scopes.contains(RESOURCE_FILE)
-                        || scopes.contains(PROGUARD_FILE)
-                        || scopes.contains(MANIFEST));
-        }
-    }
-
-    /**
-     * Returns the intersection of two scope sets
-     *
-     * @param scope1 the first set to intersect
-     * @param scope2 the second set to intersect
-     * @return the intersection of the two sets
-     */
-    @NonNull
-    public static EnumSet<Scope> intersect(
-            @NonNull EnumSet<Scope> scope1,
-            @NonNull EnumSet<Scope> scope2) {
-        EnumSet<Scope> scope = EnumSet.copyOf(scope1);
-        scope.retainAll(scope2);
-
-        return scope;
-    }
-
-    /** All scopes: running lint on a project will check these scopes */
-    public static final EnumSet<Scope> ALL = EnumSet.allOf(Scope.class);
-    /** Scope-set used for detectors which are affected by a single resource file */
-    public static final EnumSet<Scope> RESOURCE_FILE_SCOPE = EnumSet.of(RESOURCE_FILE);
-    /** Scope-set used for detectors which scan all resources */
-    public static final EnumSet<Scope> ALL_RESOURCES_SCOPE = EnumSet.of(ALL_RESOURCE_FILES);
-    /** Scope-set used for detectors which are affected by a single Java source file */
-    public static final EnumSet<Scope> JAVA_FILE_SCOPE = EnumSet.of(JAVA_FILE);
-    /** Scope-set used for detectors which are affected by a single Java class file */
-    public static final EnumSet<Scope> CLASS_FILE_SCOPE = EnumSet.of(CLASS_FILE);
-    /** Scope-set used for detectors which are affected by the manifest only */
-    public static final EnumSet<Scope> MANIFEST_SCOPE = EnumSet.of(MANIFEST);
-    /** Scope-set used for detectors which correspond to some other context */
-    public static final EnumSet<Scope> OTHER_SCOPE = EnumSet.of(OTHER);
-}
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Severity.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Severity.java
deleted file mode 100644
index f74e6b5..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Severity.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.android.annotations.NonNull;
-import com.google.common.annotations.Beta;
-
-/**
- * Severity of an issue found by lint
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public enum Severity {
-    /**
-     * Fatal: Use sparingly because a warning marked as fatal will be
-     * considered critical and will abort Export APK etc in ADT
-     */
-    @NonNull
-    FATAL("Fatal"),
-
-    /**
-     * Errors: The issue is known to be a real error that must be addressed.
-     */
-    @NonNull
-    ERROR("Error"),
-
-    /**
-     * Warning: Probably a problem.
-     */
-    @NonNull
-    WARNING("Warning"),
-
-    /**
-     * Information only: Might not be a problem, but the check has found
-     * something interesting to say about the code.
-     */
-    @NonNull
-    INFORMATIONAL("Information"),
-
-    /**
-     * Ignore: The user doesn't want to see this issue
-     */
-    @NonNull
-    IGNORE("Ignore");
-
-    @NonNull
-    private final String mDisplay;
-
-    Severity(@NonNull String display) {
-        mDisplay = display;
-    }
-
-    /**
-     * Returns a description of this severity suitable for display to the user
-     *
-     * @return a description of the severity
-     */
-    @NonNull
-    public String getDescription() {
-        return mDisplay;
-    }
-}
\ No newline at end of file
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Speed.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Speed.java
deleted file mode 100644
index c68dab0..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/Speed.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.android.annotations.NonNull;
-import com.google.common.annotations.Beta;
-
-/**
- * Enum which describes the different computation speeds of various detectors
- * <p>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public enum Speed {
-    /** The detector can run very quickly */
-    FAST("Fast"),
-
-    /** The detector runs reasonably fast */
-    NORMAL("Normal"),
-
-    /** The detector might take a long time to run */
-    SLOW("Slow");
-
-    private final String mDisplayName;
-
-    Speed(@NonNull String displayName) {
-        mDisplayName = displayName;
-    }
-
-    /**
-     * Returns the user-visible description of the speed of the given
-     * detector
-     *
-     * @return the description of the speed to display to the user
-     */
-    @NonNull
-    public String getDisplayName() {
-        return mDisplayName;
-    }
-}
\ No newline at end of file
diff --git a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/XmlContext.java b/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/XmlContext.java
deleted file mode 100644
index 34d6816..0000000
--- a/lint/libs/lint_api/src/main/java/com/android/tools/lint/detector/api/XmlContext.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.detector.api;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.client.api.IDomParser;
-import com.android.tools.lint.client.api.LintDriver;
-import com.google.common.annotations.Beta;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-import java.io.File;
-
-/**
- * A {@link Context} used when checking XML files.
- * <p/>
- * <b>NOTE: This is not a public or final API; if you rely on this be prepared
- * to adjust your code for the next tools release.</b>
- */
-@Beta
-public class XmlContext extends Context {
-    /** The XML parser */
-    public IDomParser parser;
-    /** The XML document */
-    public Document document;
-    private final ResourceFolderType mFolderType;
-
-    /**
-     * Construct a new {@link XmlContext}
-     *
-     * @param driver the driver running through the checks
-     * @param project the project containing the file being checked
-     * @param main the main project if this project is a library project, or
-     *            null if this is not a library project. The main project is
-     *            the root project of all library projects, not necessarily the
-     *            directly including project.
-     * @param file the file being checked
-     * @param folderType the {@link ResourceFolderType} of this file, if any
-     */
-    public XmlContext(
-            @NonNull LintDriver driver,
-            @NonNull Project project,
-            @Nullable Project main,
-            @NonNull File file,
-            @Nullable ResourceFolderType folderType) {
-        super(driver, project, main, file);
-        mFolderType = folderType;
-    }
-
-    /**
-     * Returns the location for the given node, which may be an element or an attribute.
-     *
-     * @param node the node to look up the location for
-     * @return the location for the node
-     */
-    @NonNull
-    public Location getLocation(@NonNull Node node) {
-        if (parser != null) {
-            return parser.getLocation(this, node);
-        }
-
-        return Location.create(file);
-    }
-
-    /**
-     * Creates a new location within an XML text node
-     *
-     * @param textNode the text node
-     * @param begin the start offset within the text node (inclusive)
-     * @param end the end offset within the text node (exclusive)
-     * @return a new location
-     */
-    @NonNull
-    public Location getLocation(@NonNull Node textNode, int begin, int end) {
-        assert textNode.getNodeType() == Node.TEXT_NODE;
-        if (parser != null) {
-            return parser.getLocation(this, textNode, begin, end);
-        }
-
-        return Location.create(file);
-    }
-
-
-    /**
-     * Reports an issue applicable to a given DOM node. The DOM node is used as the
-     * scope to check for suppress lint annotations.
-     *
-     * @param issue the issue to report
-     * @param scope the DOM node scope the error applies to. The lint infrastructure
-     *    will check whether there are suppress directives on this node (or its enclosing
-     *    nodes) and if so suppress the warning without involving the client.
-     * @param location the location of the issue, or null if not known
-     * @param message the message for this warning
-     * @param data any associated data, or null
-     */
-    public void report(
-            @NonNull Issue issue,
-            @Nullable Node scope,
-            @Nullable Location location,
-            @NonNull String message,
-            @Nullable Object data) {
-        if (scope != null && mDriver.isSuppressed(issue, scope)) {
-            return;
-        }
-        super.report(issue, location, message, data);
-    }
-
-    @Override
-    public void report(
-            @NonNull Issue issue,
-            @Nullable Location location,
-            @NonNull String message,
-            @Nullable Object data) {
-        // Warn if clients use the non-scoped form? No, there are cases where an
-        //  XML detector's error isn't applicable to one particular location (or it's
-        //  not feasible to compute it cheaply)
-        //mDriver.getClient().log(null, "Warning: Issue " + issue
-        //        + " was reported without a scope node: Can't be suppressed.");
-
-        // For now just check the document root itself
-        if (document != null && mDriver.isSuppressed(issue, document)) {
-            return;
-        }
-
-        super.report(issue, location, message, data);
-    }
-
-    /**
-     * Returns the resource folder type of this XML file, if any.
-     *
-     * @return the resource folder type or null
-     */
-    @Nullable
-    public ResourceFolderType getResourceFolderType() {
-        return mFolderType;
-    }
-}
diff --git a/lint/libs/lint_checks/Android.mk b/lint/libs/lint_checks/Android.mk
index 30fc979..1382715 100644
--- a/lint/libs/lint_checks/Android.mk
+++ b/lint/libs/lint_checks/Android.mk
@@ -1,13 +1,27 @@
 # Copyright 2011 The Android Open Source Project
 #
+# Licensed 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.
+
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
+# The lint_checks code has moved to tools/base/lint_checks.
+# The rule below uses the prebuilt lint_checks.jar.
+#
+# If you want to run the tests, cd to tools/base/lint_checks
+# and run ./gradlew :lint_checks:test
 # Only compile source java files in this lib.
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_JAVA_RESOURCE_DIRS := src/main/java
 
-# If the dependency list is changed, etc/manifest.txt
 LOCAL_JAVA_LIBRARIES := \
 	common \
 	sdklib \
@@ -22,5 +36,8 @@
 LOCAL_MODULE := lint_checks
 LOCAL_MODULE_TAGS := optional
 
-include $(BUILD_HOST_JAVA_LIBRARY)
+LOCAL_PREBUILT_JAVA_LIBRARIES := \
+	../../../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
+
+include $(BUILD_HOST_PREBUILT)
 
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/AccessibilityDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/AccessibilityDetector.java
deleted file mode 100644
index 4d069cc..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/AccessibilityDetector.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_CONTENT_DESCRIPTION;
-import static com.android.SdkConstants.ATTR_HINT;
-import static com.android.SdkConstants.ATTR_IMPORTANT_FOR_ACCESSIBILITY;
-import static com.android.SdkConstants.IMAGE_BUTTON;
-import static com.android.SdkConstants.IMAGE_VIEW;
-import static com.android.SdkConstants.VALUE_NO;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Check which looks for accessibility problems like missing content descriptions
- * <p>
- * TODO: Resolve styles and don't warn where styles are defining the content description
- * (though this seems unusual; content descriptions are not typically generic enough to
- * put in styles)
- */
-public class AccessibilityDetector extends LayoutDetector {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "ContentDescription", //$NON-NLS-1$
-            "Ensures that image widgets provide a contentDescription",
-            "Non-textual widgets like ImageViews and ImageButtons should use the " +
-            "`contentDescription` attribute to specify a textual description of " +
-            "the widget such that screen readers and other accessibility tools " +
-            "can adequately describe the user interface.\n" +
-            "\n" +
-            "Note that elements in application screens that are purely decorative " +
-            "and do not provide any content or enable a user action should not " +
-            "have accessibility content descriptions. In this case, just suppress the " +
-            "lint warning with a tools:ignore=\"ContentDescription\" attribute.\n" +
-            "\n" +
-            "Note that for text fields, you should not set both the `hint` and the " +
-            "`contentDescription` attributes since the hint will never be shown. Just " +
-            "set the `hint`. See " +
-            "http://developer.android.com/guide/topics/ui/accessibility/checklist.html#special-cases.",
-
-            Category.A11Y,
-            3,
-            Severity.WARNING,
-            AccessibilityDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new {@link AccessibilityDetector} */
-    public AccessibilityDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                IMAGE_BUTTON,
-                IMAGE_VIEW
-        );
-    }
-
-    @Override
-    @Nullable
-    public Collection<String> getApplicableAttributes() {
-        return Collections.singletonList(ATTR_CONTENT_DESCRIPTION);
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        Element element = attribute.getOwnerElement();
-        if (element.hasAttributeNS(ANDROID_URI, ATTR_HINT)) {
-            context.report(ISSUE, element, context.getLocation(attribute),
-                    "Do not set both contentDescription and hint: the contentDescription " +
-                    "will mask the hint", null);
-        }
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        if (!element.hasAttributeNS(ANDROID_URI, ATTR_CONTENT_DESCRIPTION)) {
-            // Ignore views that are explicitly not important for accessibility
-            if (VALUE_NO.equals(element.getAttributeNS(ANDROID_URI,
-                    ATTR_IMPORTANT_FOR_ACCESSIBILITY))) {
-                return;
-            }
-            context.report(ISSUE, element, context.getLocation(element),
-                    "[Accessibility] Missing contentDescription attribute on image", null);
-        } else {
-            Attr attributeNode = element.getAttributeNodeNS(ANDROID_URI, ATTR_CONTENT_DESCRIPTION);
-            String attribute = attributeNode.getValue();
-            if (attribute.isEmpty() || attribute.equals("TODO")) { //$NON-NLS-1$
-                context.report(ISSUE, attributeNode, context.getLocation(attributeNode),
-                        "[Accessibility] Empty contentDescription attribute on image", null);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/AlwaysShowActionDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/AlwaysShowActionDetector.java
deleted file mode 100644
index 34a3f10..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/AlwaysShowActionDetector.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ATTR_SHOW_AS_ACTION;
-import static com.android.SdkConstants.VALUE_ALWAYS;
-import static com.android.SdkConstants.VALUE_IF_ROOM;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector.JavaScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.Node;
-import lombok.ast.Select;
-
-/**
- * Check which looks for usage of showAsAction="always" in menus (or
- * MenuItem.SHOW_AS_ACTION_ALWAYS in code), which is usually a style guide violation.
- * (Use ifRoom instead).
- */
-public class AlwaysShowActionDetector extends ResourceXmlDetector implements JavaScanner {
-
-
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "AlwaysShowAction", //$NON-NLS-1$
-            "Checks for uses of showAsAction=\"always\" and suggests showAsAction=\"ifRoom\" " +
-                "instead",
-
-            "Using `showAsAction=\"always\"` in menu XML, or `MenuItem.SHOW_AS_ACTION_ALWAYS` in " +
-            "Java code is usually a deviation from the user interface style guide." +
-            "Use `ifRoom` or the corresponding `MenuItem.SHOW_AS_ACTION_IF_ROOM` instead.\n" +
-            "\n" +
-            "If `always` is used sparingly there are usually no problems and behavior is " +
-            "roughly equivalent to `ifRoom` but with preference over other `ifRoom` " +
-            "items. Using it more than twice in the same menu is a bad idea.\n" +
-            "\n" +
-            "This check looks for menu XML files that contain more than two `always` " +
-            "actions, or some `always` actions and no `ifRoom` actions. In Java code, " +
-            "it looks for projects that contain references to `MenuItem.SHOW_AS_ACTION_ALWAYS` " +
-            "and no references to `MenuItem.SHOW_AS_ACTION_IF_ROOM`.",
-
-            Category.USABILITY,
-            3,
-            Severity.WARNING,
-            AlwaysShowActionDetector.class,
-            EnumSet.of(Scope.RESOURCE_FILE, Scope.JAVA_FILE)).setMoreInfo(
-                    "http://developer.android.com/design/patterns/actionbar.html"); //$NON-NLS-1$
-
-    /** List of showAsAction attributes appearing in the current menu XML file */
-    private List<Attr> mFileAttributes;
-    /** If at least one location has been marked ignore in this file, ignore all */
-    private boolean mIgnoreFile;
-    /** List of locations of MenuItem.SHOW_AS_ACTION_ALWAYS references in Java code */
-    private List<Location> mAlwaysFields;
-    /** True if references to MenuItem.SHOW_AS_ACTION_IF_ROOM were found */
-    private boolean mHasIfRoomRefs;
-
-    /** Constructs a new {@link AlwaysShowActionDetector} */
-    public AlwaysShowActionDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.MENU;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return Collections.singletonList(ATTR_SHOW_AS_ACTION);
-    }
-
-    @Override
-    public void beforeCheckFile(@NonNull Context context) {
-        mFileAttributes = null;
-    }
-
-    @Override
-    public void afterCheckFile(@NonNull Context context) {
-        if (mIgnoreFile) {
-            mFileAttributes = null;
-            return;
-        }
-        if (mFileAttributes != null) {
-            assert context instanceof XmlContext; // mFileAttributes is only set in XML files
-
-            List<Attr> always = new ArrayList<Attr>();
-            List<Attr> ifRoom = new ArrayList<Attr>();
-            for (Attr attribute : mFileAttributes) {
-                String value = attribute.getValue();
-                if (value.equals(VALUE_ALWAYS)) {
-                    always.add(attribute);
-                } else if (value.equals(VALUE_IF_ROOM)) {
-                    ifRoom.add(attribute);
-                } else if (value.indexOf('|') != -1) {
-                    String[] flags = value.split("\\|"); //$NON-NLS-1$
-                    for (String flag : flags) {
-                        if (flag.equals(VALUE_ALWAYS)) {
-                            always.add(attribute);
-                            break;
-                        } else if (flag.equals(VALUE_IF_ROOM)) {
-                            ifRoom.add(attribute);
-                            break;
-                        }
-                    }
-                }
-            }
-
-            if (!always.isEmpty() && mFileAttributes.size() > 1) {
-                // Complain if you're using more than one "always", or if you're
-                // using "always" and aren't using "ifRoom" at all (and provided you
-                // have more than a single item)
-                if (always.size() > 2 || ifRoom.isEmpty()) {
-                    XmlContext xmlContext = (XmlContext) context;
-                    Location location = null;
-                    for (int i = always.size() - 1; i >= 0; i--) {
-                        Location next = location;
-                        location = xmlContext.getLocation(always.get(i));
-                        if (next != null) {
-                            location.setSecondary(next);
-                        }
-                    }
-                    context.report(ISSUE, location,
-                            "Prefer \"ifRoom\" instead of \"always\"", null);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (mAlwaysFields != null && !mHasIfRoomRefs) {
-            for (Location location : mAlwaysFields) {
-                context.report(ISSUE, location,
-                        "Prefer \"SHOW_AS_ACTION_IF_ROOM\" instead of \"SHOW_AS_ACTION_ALWAYS\"",
-                        null);
-            }
-        }
-    }
-
-    // ---- Implements XmlScanner ----
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        if (context.getDriver().isSuppressed(ISSUE, attribute)) {
-            mIgnoreFile = true;
-            return;
-        }
-
-        if (mFileAttributes == null) {
-            mFileAttributes = new ArrayList<Attr>();
-        }
-        mFileAttributes.add(attribute);
-    }
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    public
-    List<Class<? extends Node>> getApplicableNodeTypes() {
-        return Collections.<Class<? extends Node>>singletonList(Select.class);
-    }
-
-    @Override
-    public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
-        return new FieldAccessChecker(context);
-    }
-
-    private class FieldAccessChecker extends ForwardingAstVisitor {
-        private final JavaContext mContext;
-
-        public FieldAccessChecker(JavaContext context) {
-            mContext = context;
-        }
-
-        @Override
-        public boolean visitSelect(Select node) {
-            String description = node.astIdentifier().getDescription();
-            boolean isIfRoom = description.equals("SHOW_AS_ACTION_IF_ROOM"); //$NON-NLS-1$
-            boolean isAlways = description.equals("SHOW_AS_ACTION_ALWAYS");  //$NON-NLS-1$
-            if ((isIfRoom || isAlways)
-                    && node.astOperand().toString().equals("MenuItem")) { //$NON-NLS-1$
-                if (isAlways) {
-                    if (mContext.getDriver().isSuppressed(ISSUE, node)) {
-                        return super.visitSelect(node);
-                    }
-                    if (mAlwaysFields == null) {
-                        mAlwaysFields = new ArrayList<Location>();
-                    }
-                    mAlwaysFields.add(mContext.getLocation(node));
-                } else {
-                    mHasIfRoomRefs = true;
-                }
-            }
-
-            return super.visitSelect(node);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/AnnotationDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/AnnotationDetector.java
deleted file mode 100644
index f091269..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/AnnotationDetector.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.FQCN_SUPPRESS_LINT;
-import static com.android.SdkConstants.SUPPRESS_LINT;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.client.api.IssueRegistry;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import lombok.ast.Annotation;
-import lombok.ast.AnnotationElement;
-import lombok.ast.AnnotationValue;
-import lombok.ast.ArrayInitializer;
-import lombok.ast.AstVisitor;
-import lombok.ast.Block;
-import lombok.ast.ConstructorDeclaration;
-import lombok.ast.Expression;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.MethodDeclaration;
-import lombok.ast.Modifiers;
-import lombok.ast.Node;
-import lombok.ast.Select;
-import lombok.ast.StrictListAccessor;
-import lombok.ast.StringLiteral;
-import lombok.ast.TypeBody;
-import lombok.ast.VariableDefinition;
-import lombok.ast.VariableDefinitionEntry;
-
-/**
- * Checks annotations to make sure they are valid
- */
-public class AnnotationDetector extends Detector implements Detector.JavaScanner {
-    /** Placing SuppressLint on a local variable doesn't work for class-file based checks */
-    public static final Issue ISSUE = Issue.create(
-            "LocalSuppress", //$NON-NLS-1$
-            "Looks for @SuppressLint annotations in locations where it doesn't work for class based checks",
-
-            "The `@SuppressAnnotation` is used to suppress Lint warnings in Java files. However, " +
-            "while many lint checks analyzes the Java source code, where they can find " +
-            "annotations on (for example) local variables, some checks are analyzing the " +
-            "`.class` files. And in class files, annotations only appear on classes, fields " +
-            "and methods. Annotations placed on local variables disappear. If you attempt " +
-            "to suppress a lint error for a class-file based lint check, the suppress " +
-            "annotation not work. You must move the annotation out to the surrounding method.",
-
-            Category.CORRECTNESS,
-            3,
-            Severity.ERROR,
-            AnnotationDetector.class,
-            Scope.JAVA_FILE_SCOPE);
-
-    /** Constructs a new {@link AnnotationDetector} check */
-    public AnnotationDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return true;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    public List<Class<? extends Node>> getApplicableNodeTypes() {
-        return Collections.<Class<? extends Node>>singletonList(Annotation.class);
-    }
-
-    @Override
-    public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
-        return new AnnotationChecker(context);
-    }
-
-    private static class AnnotationChecker extends ForwardingAstVisitor {
-        private final JavaContext mContext;
-
-        public AnnotationChecker(JavaContext context) {
-            mContext = context;
-        }
-
-        @Override
-        public boolean visitAnnotation(Annotation node) {
-            String type = node.astAnnotationTypeReference().getTypeName();
-            if (SUPPRESS_LINT.equals(type) || FQCN_SUPPRESS_LINT.equals(type)) {
-                Node parent = node.getParent();
-                if (parent instanceof Modifiers) {
-                    parent = parent.getParent();
-                    if (parent instanceof VariableDefinition) {
-                        for (AnnotationElement element : node.astElements()) {
-                            AnnotationValue valueNode = element.astValue();
-                            if (valueNode == null) {
-                                continue;
-                            }
-                            if (valueNode instanceof StringLiteral) {
-                                StringLiteral literal = (StringLiteral) valueNode;
-                                String id = literal.astValue();
-                                if (!checkId(node, id)) {
-                                    return super.visitAnnotation(node);
-                                }
-                            } else if (valueNode instanceof ArrayInitializer) {
-                                ArrayInitializer array = (ArrayInitializer) valueNode;
-                                StrictListAccessor<Expression, ArrayInitializer> expressions =
-                                        array.astExpressions();
-                                if (expressions == null) {
-                                    continue;
-                                }
-                                Iterator<Expression> arrayIterator = expressions.iterator();
-                                while (arrayIterator.hasNext()) {
-                                    Expression arrayElement = arrayIterator.next();
-                                    if (arrayElement instanceof StringLiteral) {
-                                        String id = ((StringLiteral) arrayElement).astValue();
-                                        if (!checkId(node, id)) {
-                                            return super.visitAnnotation(node);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-
-            return super.visitAnnotation(node);
-        }
-
-        private boolean checkId(Annotation node, String id) {
-            IssueRegistry registry = mContext.getDriver().getRegistry();
-            Issue issue = registry.getIssue(id);
-            // Special-case the ApiDetector issue, since it does both source file analysis
-            // only on field references, and class file analysis on the rest, so we allow
-            // annotations outside of methods only on fields
-            if (issue != null && !issue.getScope().contains(Scope.JAVA_FILE)
-                    || issue == ApiDetector.UNSUPPORTED) {
-                // Ensure that this isn't a field
-                Node parent = node.getParent();
-                while (parent != null) {
-                    if (parent instanceof MethodDeclaration
-                            || parent instanceof ConstructorDeclaration
-                            || parent instanceof Block) {
-                        break;
-                    } else if (parent instanceof TypeBody) { // It's a field
-                        return true;
-                    } else if (issue == ApiDetector.UNSUPPORTED
-                            && parent instanceof VariableDefinition) {
-                        VariableDefinition definition = (VariableDefinition) parent;
-                        for (VariableDefinitionEntry entry : definition.astVariables()) {
-                            Expression initializer = entry.astInitializer();
-                            if (initializer instanceof Select) {
-                                return true;
-                            }
-                        }
-                    }
-                    parent = parent.getParent();
-                    if (parent == null) {
-                        return true;
-                    }
-                }
-
-                // This issue doesn't have AST access: annotations are not
-                // available for local variables or parameters
-                mContext.report(ISSUE,mContext.getLocation(node), String.format(
-                    "The @SuppressLint annotation cannot be used on a local " +
-                    "variable with the lint check '%1$s': move out to the " +
-                    "surrounding method", id),
-                    null);
-                return false;
-            }
-
-            return true;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/Api.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/Api.java
deleted file mode 100644
index ca84b27..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/Api.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-
-import org.xml.sax.SAXException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-/**
- * Main entry point for API description.
- *
- * To create the {@link Api}, use {@link #parseApi(File)}
- *
- */
-public class Api {
-
-    /**
-     * Parses simplified API file.
-     * @param apiFile the file to read
-     * @return a new ApiInfo
-     */
-    public static Api parseApi(File apiFile) {
-        FileInputStream fileInputStream = null;
-        try {
-            fileInputStream = new FileInputStream(apiFile);
-            SAXParserFactory parserFactory = SAXParserFactory.newInstance();
-            SAXParser parser = parserFactory.newSAXParser();
-            ApiParser apiParser = new ApiParser();
-            parser.parse(fileInputStream, apiParser);
-            return new Api(apiParser.getClasses());
-        } catch (ParserConfigurationException e) {
-            e.printStackTrace();
-        } catch (SAXException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            if (fileInputStream != null) {
-                try {
-                    fileInputStream.close();
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private final Map<String, ApiClass> mClasses;
-
-    private Api(Map<String, ApiClass> classes) {
-        mClasses = new HashMap<String, ApiClass>(classes);
-    }
-
-    ApiClass getClass(String fqcn) {
-        return mClasses.get(fqcn);
-    }
-
-    Map<String, ApiClass> getClasses() {
-        return Collections.unmodifiableMap(mClasses);
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ApiClass.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ApiClass.java
deleted file mode 100644
index 3e0fb9d..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ApiClass.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.CONSTRUCTOR_NAME;
-
-import com.android.annotations.Nullable;
-import com.android.utils.Pair;
-import com.google.common.collect.Lists;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Represents a class and its methods/fields.
- *
- * {@link #getSince()} gives the API level it was introduced.
- *
- * {@link #getMethod} returns when the method was introduced.
- * {@link #getField} returns when the field was introduced.
- */
-public class ApiClass {
-
-    private final String mName;
-    private final int mSince;
-
-    private final List<Pair<String, Integer>> mSuperClasses = Lists.newArrayList();
-    private final List<Pair<String, Integer>> mInterfaces = Lists.newArrayList();
-
-    private final Map<String, Integer> mFields = new HashMap<String, Integer>();
-    private final Map<String, Integer> mMethods = new HashMap<String, Integer>();
-
-    ApiClass(String name, int since) {
-        mName = name;
-        mSince = since;
-    }
-
-    /**
-     * Returns the name of the class.
-     * @return the name of the class
-     */
-    String getName() {
-        return mName;
-    }
-
-    /**
-     * Returns when the class was introduced.
-     * @return the api level the class was introduced.
-     */
-    int getSince() {
-        return mSince;
-    }
-
-    /**
-     * Returns when a field was added, or null if it doesn't exist.
-     * @param name the name of the field.
-     * @param info the corresponding info
-     */
-    Integer getField(String name, Api info) {
-        // The field can come from this class or from a super class or an interface
-        // The value can never be lower than this introduction of this class.
-        // When looking at super classes and interfaces, it can never be lower than when the
-        // super class or interface was added as a super class or interface to this class.
-        // Look at all the values and take the lowest.
-        // For instance:
-        // This class A is introduced in 5 with super class B.
-        // In 10, the interface C was added.
-        // Looking for SOME_FIELD we get the following:
-        // Present in A in API 15
-        // Present in B in API 11
-        // Present in C in API 7.
-        // The answer is 10, which is when C became an interface
-        int min = Integer.MAX_VALUE;
-        Integer i = mFields.get(name);
-        if (i != null) {
-            min = i;
-        }
-
-        // now look at the super classes
-        for (Pair<String, Integer> superClassPair : mSuperClasses) {
-            ApiClass superClass = info.getClass(superClassPair.getFirst());
-            if (superClass != null) {
-                i = superClass.getField(name, info);
-                if (i != null) {
-                    int tmp = superClassPair.getSecond() > i ? superClassPair.getSecond() : i;
-                    if (tmp < min) {
-                        min = tmp;
-                    }
-                }
-            }
-        }
-
-        // now look at the interfaces
-        for (Pair<String, Integer> superClassPair : mInterfaces) {
-            ApiClass superClass = info.getClass(superClassPair.getFirst());
-            if (superClass != null) {
-                i = superClass.getField(name, info);
-                if (i != null) {
-                    int tmp = superClassPair.getSecond() > i ? superClassPair.getSecond() : i;
-                    if (tmp < min) {
-                        min = tmp;
-                    }
-                }
-            }
-        }
-
-        return min;
-    }
-
-    /**
-     * Returns when a method was added, or null if it doesn't exist. This goes through the super
-     * class to find method only present there.
-     * @param methodSignature the method signature
-     */
-    int getMethod(String methodSignature, Api info) {
-        // The method can come from this class or from a super class.
-        // The value can never be lower than this introduction of this class.
-        // When looking at super classes, it can never be lower than when the super class became
-        // a super class of this class.
-        // Look at all the values and take the lowest.
-        // For instance:
-        // This class A is introduced in 5 with super class B.
-        // In 10, the super class changes to C.
-        // Looking for foo() we get the following:
-        // Present in A in API 15
-        // Present in B in API 11
-        // Present in C in API 7.
-        // The answer is 10, which is when C became the super class.
-        int min = Integer.MAX_VALUE;
-        Integer i = mMethods.get(methodSignature);
-        if (i != null) {
-            min = i;
-
-            // Constructors aren't inherited
-            if (methodSignature.startsWith(CONSTRUCTOR_NAME)) {
-                return i;
-            }
-        }
-
-        // now look at the super classes
-        for (Pair<String, Integer> superClassPair : mSuperClasses) {
-            ApiClass superClass = info.getClass(superClassPair.getFirst());
-            if (superClass != null) {
-                i = superClass.getMethod(methodSignature, info);
-                if (i != null) {
-                    int tmp = superClassPair.getSecond() > i ? superClassPair.getSecond() : i;
-                    if (tmp < min) {
-                        min = tmp;
-                    }
-                }
-            }
-        }
-
-        // now look at the interfaces classes
-        for (Pair<String, Integer> interfacePair : mInterfaces) {
-            ApiClass superClass = info.getClass(interfacePair.getFirst());
-            if (superClass != null) {
-                i = superClass.getMethod(methodSignature, info);
-                if (i != null) {
-                    int tmp = interfacePair.getSecond() > i ? interfacePair.getSecond() : i;
-                    if (tmp < min) {
-                        min = tmp;
-                    }
-                }
-            }
-        }
-
-        return min;
-    }
-
-    void addField(String name, int since) {
-        Integer i = mFields.get(name);
-        if (i == null || i.intValue() > since) {
-            mFields.put(name, Integer.valueOf(since));
-        }
-    }
-
-    void addMethod(String name, int since) {
-        // Strip off the method type at the end to ensure that the code which
-        // produces inherited methods doesn't get confused and end up multiple entries.
-        // For example, java/nio/Buffer has the method "array()Ljava/lang/Object;",
-        // and the subclass java/nio/ByteBuffer has the method "array()[B". We want
-        // the lookup on mMethods to associate the ByteBuffer array method to be
-        // considered overriding the Buffer method.
-        int index = name.indexOf(')');
-        if (index != -1) {
-            name = name.substring(0, index + 1);
-        }
-
-        Integer i = mMethods.get(name);
-        if (i == null || i.intValue() > since) {
-            mMethods.put(name, Integer.valueOf(since));
-        }
-    }
-
-    void addSuperClass(String superClass, int since) {
-        addToArray(mSuperClasses, superClass, since);
-    }
-
-    void addInterface(String interfaceClass, int since) {
-        addToArray(mInterfaces, interfaceClass, since);
-    }
-
-    void addToArray(List<Pair<String, Integer>> list, String name, int value) {
-        // check if we already have that name (at a lower level)
-        for (Pair<String, Integer> pair : list) {
-            if (name.equals(pair.getFirst())) {
-                return;
-            }
-        }
-
-        list.add(Pair.of(name, Integer.valueOf(value)));
-
-    }
-
-    @Nullable
-    public String getPackage() {
-        int index = mName.lastIndexOf('/');
-        if (index != -1) {
-            return mName.substring(0, index);
-        }
-
-        return null;
-    }
-
-    @Override
-    public String toString() {
-        return mName;
-    }
-
-    /**
-     * Returns the set of all methods, including inherited
-     * ones.
-     *
-     * @param info the api to look up super classes from
-     * @return a set containing all the members fields
-     */
-    Set<String> getAllMethods(Api info) {
-        Set<String> members = new HashSet<String>(100);
-        addAllMethods(info, members, true /*includeConstructors*/);
-
-        return members;
-    }
-
-    private void addAllMethods(Api info, Set<String> set, boolean includeConstructors) {
-        if (!includeConstructors) {
-            for (String method : mMethods.keySet()) {
-                if (!method.startsWith(CONSTRUCTOR_NAME)) {
-                    set.add(method);
-                }
-            }
-        } else {
-            for (String method : mMethods.keySet()) {
-                set.add(method);
-            }
-        }
-
-        for (Pair<String, Integer> superClass : mSuperClasses) {
-            ApiClass clz = info.getClass(superClass.getFirst());
-            assert clz != null : superClass.getSecond();
-            if (clz != null) {
-                clz.addAllMethods(info, set, false);
-            }
-        }
-
-        // Get methods from implemented interfaces as well;
-        for (Pair<String, Integer> superClass : mInterfaces) {
-            ApiClass clz = info.getClass(superClass.getFirst());
-            assert clz != null : superClass.getSecond();
-            if (clz != null) {
-                clz.addAllMethods(info, set, false);
-            }
-        }
-    }
-
-    /**
-     * Returns the set of all fields, including inherited
-     * ones.
-     *
-     * @param info the api to look up super classes from
-     * @return a set containing all the fields
-     */
-    Set<String> getAllFields(Api info) {
-        Set<String> members = new HashSet<String>(100);
-        addAllFields(info, members);
-
-        return members;
-    }
-
-    private void addAllFields(Api info, Set<String> set) {
-        for (String field : mFields.keySet()) {
-            set.add(field);
-        }
-
-        for (Pair<String, Integer> superClass : mSuperClasses) {
-            ApiClass clz = info.getClass(superClass.getFirst());
-            assert clz != null : superClass.getSecond();
-            if (clz != null) {
-                clz.addAllFields(info, set);
-            }
-        }
-
-        // Get methods from implemented interfaces as well;
-        for (Pair<String, Integer> superClass : mInterfaces) {
-            ApiClass clz = info.getClass(superClass.getFirst());
-            assert clz != null : superClass.getSecond();
-            if (clz != null) {
-                clz.addAllFields(info, set);
-            }
-        }
-    }
-
-    /* This code can be used to scan through all the fields and look for fields
-       that have moved to a higher class:
-            Field android/view/MotionEvent#CREATOR has api=1 but parent android/view/InputEvent provides it as 9
-            Field android/provider/ContactsContract$CommonDataKinds$Organization#PHONETIC_NAME has api=5 but parent android/provider/ContactsContract$ContactNameColumns provides it as 11
-            Field android/widget/ListView#CHOICE_MODE_MULTIPLE has api=1 but parent android/widget/AbsListView provides it as 11
-            Field android/widget/ListView#CHOICE_MODE_NONE has api=1 but parent android/widget/AbsListView provides it as 11
-            Field android/widget/ListView#CHOICE_MODE_SINGLE has api=1 but parent android/widget/AbsListView provides it as 11
-            Field android/view/KeyEvent#CREATOR has api=1 but parent android/view/InputEvent provides it as 9
-       This is used for example in the ApiDetector to filter out warnings which result
-       when people follow Eclipse's advice to replace
-            ListView.CHOICE_MODE_MULTIPLE
-       references with
-            AbsListView.CHOICE_MODE_MULTIPLE
-       since the latter has API=11 and the former has API=1; since the constant is unchanged
-       between the two, and the literal is copied into the class, using the AbsListView
-       reference works.
-    public void checkFields(Api info) {
-        fieldLoop:
-        for (String field : mFields.keySet()) {
-            Integer since = getField(field, info);
-            if (since == null || since == Integer.MAX_VALUE) {
-                continue;
-            }
-
-            for (Pair<String, Integer> superClass : mSuperClasses) {
-                ApiClass clz = info.getClass(superClass.getFirst());
-                assert clz != null : superClass.getSecond();
-                if (clz != null) {
-                    Integer superSince = clz.getField(field, info);
-                    if (superSince == Integer.MAX_VALUE) {
-                        continue;
-                    }
-
-                    if (superSince != null && superSince > since) {
-                        String declaredIn = clz.findFieldDeclaration(info, field);
-                        System.out.println("Field " + getName() + "#" + field + " has api="
-                                + since + " but parent " + declaredIn + " provides it as "
-                                + superSince);
-                        continue fieldLoop;
-                    }
-                }
-            }
-
-            // Get methods from implemented interfaces as well;
-            for (Pair<String, Integer> superClass : mInterfaces) {
-                ApiClass clz = info.getClass(superClass.getFirst());
-                assert clz != null : superClass.getSecond();
-                if (clz != null) {
-                    Integer superSince = clz.getField(field, info);
-                    if (superSince == Integer.MAX_VALUE) {
-                        continue;
-                    }
-                    if (superSince != null && superSince > since) {
-                        String declaredIn = clz.findFieldDeclaration(info, field);
-                        System.out.println("Field " + getName() + "#" + field + " has api="
-                                + since + " but parent " + declaredIn + " provides it as "
-                                + superSince);
-                        continue fieldLoop;
-                    }
-                }
-            }
-        }
-    }
-
-    private String findFieldDeclaration(Api info, String name) {
-        if (mFields.containsKey(name)) {
-            return getName();
-        }
-        for (Pair<String, Integer> superClass : mSuperClasses) {
-            ApiClass clz = info.getClass(superClass.getFirst());
-            assert clz != null : superClass.getSecond();
-            if (clz != null) {
-                String declaredIn = clz.findFieldDeclaration(info, name);
-                if (declaredIn != null) {
-                    return declaredIn;
-                }
-            }
-        }
-
-        // Get methods from implemented interfaces as well;
-        for (Pair<String, Integer> superClass : mInterfaces) {
-            ApiClass clz = info.getClass(superClass.getFirst());
-            assert clz != null : superClass.getSecond();
-            if (clz != null) {
-                String declaredIn = clz.findFieldDeclaration(info, name);
-                if (declaredIn != null) {
-                    return declaredIn;
-                }
-            }
-        }
-
-        return null;
-    }
-    */
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ApiDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ApiDetector.java
deleted file mode 100644
index 936f882..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ApiDetector.java
+++ /dev/null
@@ -1,1535 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.ANDROID_THEME_PREFIX;
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_TARGET_API;
-import static com.android.SdkConstants.CONSTRUCTOR_NAME;
-import static com.android.SdkConstants.PREFIX_ANDROID;
-import static com.android.SdkConstants.R_CLASS;
-import static com.android.SdkConstants.TAG_ITEM;
-import static com.android.SdkConstants.TAG_STYLE;
-import static com.android.SdkConstants.TARGET_API;
-import static com.android.SdkConstants.TOOLS_URI;
-import static com.android.SdkConstants.VIEW_TAG;
-import static com.android.tools.lint.detector.api.ClassContext.getFqcn;
-import static com.android.tools.lint.detector.api.ClassContext.getInternalName;
-import static com.android.tools.lint.detector.api.LintUtils.getNextInstruction;
-import static com.android.tools.lint.detector.api.Location.SearchDirection.BACKWARD;
-import static com.android.tools.lint.detector.api.Location.SearchDirection.FORWARD;
-import static com.android.tools.lint.detector.api.Location.SearchDirection.NEAREST;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.client.api.LintDriver;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.DefaultPosition;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Location.SearchHints;
-import com.android.tools.lint.detector.api.Position;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.android.utils.Pair;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.AnnotationNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.FieldInsnNode;
-import org.objectweb.asm.tree.InsnList;
-import org.objectweb.asm.tree.IntInsnNode;
-import org.objectweb.asm.tree.LdcInsnNode;
-import org.objectweb.asm.tree.LocalVariableNode;
-import org.objectweb.asm.tree.LookupSwitchInsnNode;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import lombok.ast.Annotation;
-import lombok.ast.AnnotationElement;
-import lombok.ast.AnnotationValue;
-import lombok.ast.AstVisitor;
-import lombok.ast.BinaryExpression;
-import lombok.ast.Case;
-import lombok.ast.ClassDeclaration;
-import lombok.ast.ConstructorDeclaration;
-import lombok.ast.ConstructorInvocation;
-import lombok.ast.Expression;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.If;
-import lombok.ast.ImportDeclaration;
-import lombok.ast.IntegralLiteral;
-import lombok.ast.MethodDeclaration;
-import lombok.ast.MethodInvocation;
-import lombok.ast.Modifiers;
-import lombok.ast.Select;
-import lombok.ast.StrictListAccessor;
-import lombok.ast.StringLiteral;
-import lombok.ast.SuperConstructorInvocation;
-import lombok.ast.Switch;
-import lombok.ast.TypeReference;
-import lombok.ast.VariableDefinition;
-import lombok.ast.VariableDefinitionEntry;
-import lombok.ast.VariableReference;
-
-/**
- * Looks for usages of APIs that are not supported in all the versions targeted
- * by this application (according to its minimum API requirement in the manifest).
- */
-public class ApiDetector extends ResourceXmlDetector
-        implements Detector.ClassScanner, Detector.JavaScanner {
-    /**
-     * Whether we flag variable, field, parameter and return type declarations of a type
-     * not yet available. It appears Dalvik is very forgiving and doesn't try to preload
-     * classes until actually needed, so there is no need to flag these, and in fact,
-     * patterns used for supporting new and old versions sometimes declares these methods
-     * and only conditionally end up actually accessing methods and fields, so only check
-     * method and field accesses.
-     */
-    private static final boolean CHECK_DECLARATIONS = false;
-
-    private static final boolean AOSP_BUILD = System.getenv("ANDROID_BUILD_TOP") != null; //$NON-NLS-1$
-
-    /** Accessing an unsupported API */
-    public static final Issue UNSUPPORTED = Issue.create("NewApi", //$NON-NLS-1$
-            "Finds API accesses to APIs that are not supported in all targeted API versions",
-
-            "This check scans through all the Android API calls in the application and " +
-            "warns about any calls that are not available on *all* versions targeted " +
-            "by this application (according to its minimum SDK attribute in the manifest).\n"
-            +
-            "\n" +
-            "If you really want to use this API and don't need to support older devices just "
-            +
-            "set the `minSdkVersion` in your `AndroidManifest.xml` file." +
-            "\n" +
-            "If your code is *deliberately* accessing newer APIs, and you have ensured " +
-            "(e.g. with conditional execution) that this code will only ever be called on a "
-            +
-            "supported platform, then you can annotate your class or method with the " +
-            "`@TargetApi` annotation specifying the local minimum SDK to apply, such as " +
-            "`@TargetApi(11)`, such that this check considers 11 rather than your manifest "
-            +
-            "file's minimum SDK as the required API level.\n" +
-            "\n" +
-            "If you are deliberately setting `android:` attributes in style definitions, " +
-            "make sure you place this in a `values-v11` folder in order to avoid running " +
-            "into runtime conflicts on certain devices where manufacturers have added " +
-            "custom attributes whose ids conflict with the new ones on later platforms.\n" +
-            "\n" +
-            "Similarly, you can use tools:targetApi=\"11\" in an XML file to indicate that "
-            +
-            "the element will only be inflated in an adequate context.",
-            Category.CORRECTNESS,
-            6,
-            Severity.ERROR,
-            ApiDetector.class,
-            EnumSet.of(Scope.CLASS_FILE, Scope.RESOURCE_FILE, Scope.MANIFEST))
-            .addAnalysisScope(Scope.RESOURCE_FILE_SCOPE)
-            .addAnalysisScope(Scope.CLASS_FILE_SCOPE);
-
-    /** Accessing an inlined API on older platforms */
-    public static final Issue INLINED = Issue.create("InlinedApi", //$NON-NLS-1$
-            "Finds inlined fields that may or may not work on older platforms",
-
-            "This check scans through all the Android API field references in the application " +
-            "and flags certain constants, such as static final integers and Strings, " +
-            "which were introduced in later versions. These will actually be copied " +
-            "into the class files rather than being referenced, which means that " +
-            "the value is available even when running on older devices. In some " +
-            "cases that's fine, and in other cases it can result in a runtime " +
-            "crash or incorrect behavior. It depends on the context, so consider " +
-            "the code carefully and device whether it's safe and can be suppressed " +
-            "or whether the code needs tbe guarded.\n" +
-            "\n" +
-            "If you really want to use this API and don't need to support older devices just "
-            +
-            "set the `minSdkVersion` in your `AndroidManifest.xml` file." +
-            "\n" +
-            "If your code is *deliberately* accessing newer APIs, and you have ensured " +
-            "(e.g. with conditional execution) that this code will only ever be called on a "
-            +
-            "supported platform, then you can annotate your class or method with the " +
-            "`@TargetApi` annotation specifying the local minimum SDK to apply, such as " +
-            "`@TargetApi(11)`, such that this check considers 11 rather than your manifest "
-            +
-            "file's minimum SDK as the required API level.\n",
-            Category.CORRECTNESS,
-            6,
-            Severity.WARNING,
-            ApiDetector.class,
-            EnumSet.of(Scope.JAVA_FILE))
-            .addAnalysisScope(Scope.JAVA_FILE_SCOPE);
-
-    /** Accessing an unsupported API */
-    public static final Issue OVERRIDE = Issue.create("Override", //$NON-NLS-1$
-            "Finds method declarations that will accidentally override methods in later versions",
-
-            "Suppose you are building against Android API 8, and you've subclassed Activity. " +
-            "In your subclass you add a new method called `isDestroyed`(). At some later point, " +
-            "a method of the same name and signature is added to Android. Your method will " +
-            "now override the Android method, and possibly break its contract. Your method " +
-            "is not calling `super.isDestroyed()`, since your compilation target doesn't " +
-            "know about the method.\n" +
-            "\n" +
-            "The above scenario is what this lint detector looks for. The above example is " +
-            "real, since `isDestroyed()` was added in API 17, but it will be true for *any* " +
-            "method you have added to a subclass of an Android class where your build target " +
-            "is lower than the version the method was introduced in.\n" +
-            "\n" +
-            "To fix this, either rename your method, or if you are really trying to augment " +
-            "the builtin method if available, switch to a higher build target where you can " +
-            "deliberately add `@Override` on your overriding method, and call `super` if " +
-            "appropriate etc.\n",
-            Category.CORRECTNESS,
-            6,
-            Severity.ERROR,
-            ApiDetector.class,
-            Scope.CLASS_FILE_SCOPE);
-
-    private static final String TARGET_API_VMSIG = '/' + TARGET_API + ';';
-    private static final String SWITCH_TABLE_PREFIX = "$SWITCH_TABLE$";  //$NON-NLS-1$
-    private static final String ORDINAL_METHOD = "ordinal"; //$NON-NLS-1$
-
-    protected ApiLookup mApiDatabase;
-    private int mMinApi = -1;
-    private Map<String, List<Pair<String, Location>>> mPendingFields;
-
-    /** Constructs a new API check */
-    public ApiDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.SLOW;
-    }
-
-    @Override
-    public void beforeCheckProject(@NonNull Context context) {
-        mApiDatabase = ApiLookup.get(context.getClient());
-        // We can't look up the minimum API required by the project here:
-        // The manifest file hasn't been processed yet in the -before- project hook.
-        // For now it's initialized lazily in getMinSdk(Context), but the
-        // lint infrastructure should be fixed to parse manifest file up front.
-    }
-
-    // ---- Implements XmlScanner ----
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return true;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return ALL;
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return ALL;
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        if (mApiDatabase == null) {
-            return;
-        }
-
-        String value = attribute.getValue();
-
-        String owner = null;
-        String name = null;
-
-        String prefix;
-        if (value.startsWith(ANDROID_PREFIX)) {
-            prefix = ANDROID_PREFIX;
-        } else if (value.startsWith(ANDROID_THEME_PREFIX)) {
-            prefix = ANDROID_THEME_PREFIX;
-        } else if (value.startsWith(PREFIX_ANDROID) && ATTR_NAME.equals(attribute.getName())
-            && TAG_ITEM.equals(attribute.getOwnerElement().getTagName())
-            && attribute.getOwnerElement().getParentNode() != null
-            && TAG_STYLE.equals(attribute.getOwnerElement().getParentNode().getNodeName())) {
-            owner = "android/R$attr"; //$NON-NLS-1$
-            name = value.substring(PREFIX_ANDROID.length());
-            prefix = PREFIX_ANDROID;
-        } else {
-            return;
-        }
-
-        if (owner == null) {
-            // Convert @android:type/foo into android/R$type and "foo"
-            int index = value.indexOf('/', prefix.length());
-            if (index != -1) {
-                owner = "android/R$"    //$NON-NLS-1$
-                        + value.substring(prefix.length(), index);
-                name = value.substring(index + 1);
-                if (name.indexOf('.') != -1) {
-                    name = name.replace('.', '_');
-                }
-            } else {
-                return;
-            }
-        }
-        assert name != null; // Eclipse can't infer this
-        int api = mApiDatabase.getFieldVersion(owner, name);
-        int minSdk = getMinSdk(context);
-        if (api > minSdk && api > context.getFolderVersion()
-                && api > getLocalMinSdk(attribute.getOwnerElement())) {
-            // Don't complain about resource references in the tools namespace,
-            // such as for example "tools:layout="@android:layout/list_content",
-            // used only for designtime previews
-            if (TOOLS_URI.equals(attribute.getNamespaceURI())) {
-                return;
-            }
-
-            Location location = context.getLocation(attribute);
-            String message = String.format(
-                    "%1$s requires API level %2$d (current min is %3$d)",
-                    value, api, minSdk);
-            context.report(UNSUPPORTED, attribute, location, message, null);
-        }
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        if (mApiDatabase == null) {
-            return;
-        }
-
-        String tag = element.getTagName();
-
-        ResourceFolderType folderType = context.getResourceFolderType();
-        if (folderType != ResourceFolderType.LAYOUT) {
-            if (element.getParentNode().getNodeType() != Node.ELEMENT_NODE) {
-                // Root node
-                return;
-            }
-            NodeList childNodes = element.getChildNodes();
-            for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-                Node textNode = childNodes.item(i);
-                if (textNode.getNodeType() == Node.TEXT_NODE) {
-                    String text = textNode.getNodeValue();
-                    if (text.indexOf(ANDROID_PREFIX) != -1) {
-                        text = text.trim();
-                        // Convert @android:type/foo into android/R$type and "foo"
-                        int index = text.indexOf('/', ANDROID_PREFIX.length());
-                        if (index != -1) {
-                            String owner = "android/R$"    //$NON-NLS-1$
-                                    + text.substring(ANDROID_PREFIX.length(), index);
-                            String name = text.substring(index + 1);
-                            if (name.indexOf('.') != -1) {
-                                name = name.replace('.', '_');
-                            }
-                            int api = mApiDatabase.getFieldVersion(owner, name);
-                            int minSdk = getMinSdk(context);
-                            if (api > minSdk && api > context.getFolderVersion()
-                                    && api > getLocalMinSdk(element)) {
-                                Location location = context.getLocation(textNode);
-                                String message = String.format(
-                                        "%1$s requires API level %2$d (current min is %3$d)",
-                                        text, api, minSdk);
-                                context.report(UNSUPPORTED, element, location, message, null);
-                            }
-                        }
-                    }
-                }
-            }
-        } else if (folderType == ResourceFolderType.LAYOUT) {
-            if (VIEW_TAG.equals(tag)) {
-                tag = element.getAttribute(ATTR_CLASS);
-                if (tag == null || tag.isEmpty()) {
-                    return;
-                }
-            }
-
-            // Check widgets to make sure they're available in this version of the SDK.
-            if (tag.indexOf('.') != -1 ||
-                    folderType != ResourceFolderType.LAYOUT) {
-                // Custom views aren't in the index
-                return;
-            }
-            // TODO: Consider other widgets outside of android.widget.*
-            int api = mApiDatabase.getCallVersion("android/widget/" + tag,  //$NON-NLS-1$
-                    CONSTRUCTOR_NAME,
-                    // Not all views provided this constructor right away, for example,
-                    // LinearLayout added it in API 11 yet LinearLayout is much older:
-                    // "(Landroid/content/Context;Landroid/util/AttributeSet;I)V"); //$NON-NLS-1$
-                    "(Landroid/content/Context;)"); //$NON-NLS-1$
-            int minSdk = getMinSdk(context);
-            if (api > minSdk && api > context.getFolderVersion()
-                    && api > getLocalMinSdk(element)) {
-                Location location = context.getLocation(element);
-                String message = String.format(
-                        "View requires API level %1$d (current min is %2$d): <%3$s>",
-                        api, minSdk, tag);
-                context.report(UNSUPPORTED, element, location, message, null);
-            }
-        }
-    }
-
-    protected int getMinSdk(Context context) {
-        if (mMinApi == -1) {
-            mMinApi = context.getMainProject().getMinSdk();
-        }
-
-        return mMinApi;
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @SuppressWarnings("rawtypes") // ASM API
-    @Override
-    public void checkClass(@NonNull final ClassContext context, @NonNull ClassNode classNode) {
-        if (mApiDatabase == null) {
-            return;
-        }
-
-        if (AOSP_BUILD && classNode.name.startsWith("android/support/")) { //$NON-NLS-1$
-            return;
-        }
-
-        // Requires util package (add prebuilts/tools/common/asm-tools/asm-debug-all-4.0.jar)
-        //classNode.accept(new TraceClassVisitor(new PrintWriter(System.out)));
-
-        int classMinSdk = getClassMinSdk(context, classNode);
-        if (classMinSdk == -1) {
-            classMinSdk = getMinSdk(context);
-        }
-
-        List methodList = classNode.methods;
-        if (methodList.isEmpty()) {
-            return;
-        }
-
-        boolean checkCalls = context.isEnabled(UNSUPPORTED);
-        boolean checkMethods = context.isEnabled(OVERRIDE)
-                && context.getMainProject().getBuildSdk() >= 1;
-        String frameworkParent = null;
-        if (checkMethods) {
-            LintDriver driver = context.getDriver();
-            String owner = classNode.superName;
-            while (owner != null) {
-                // For virtual dispatch, walk up the inheritance chain checking
-                // each inherited method
-                if (owner.startsWith("android/")           //$NON-NLS-1$
-                        || owner.startsWith("java/")       //$NON-NLS-1$
-                        || owner.startsWith("javax/")) {   //$NON-NLS-1$
-                    frameworkParent = owner;
-                    break;
-                }
-                owner = driver.getSuperClass(owner);
-            }
-            if (frameworkParent == null) {
-                checkMethods = false;
-            }
-        }
-
-        for (Object m : methodList) {
-            MethodNode method = (MethodNode) m;
-
-            int minSdk = getLocalMinSdk(method.invisibleAnnotations);
-            if (minSdk == -1) {
-                minSdk = classMinSdk;
-            }
-
-            InsnList nodes = method.instructions;
-
-            if (checkMethods && Character.isJavaIdentifierStart(method.name.charAt(0))) {
-                int buildSdk = context.getMainProject().getBuildSdk();
-                String name = method.name;
-                assert frameworkParent != null;
-                int api = mApiDatabase.getCallVersion(frameworkParent, name, method.desc);
-                if (api > buildSdk && buildSdk != -1) {
-                    // TODO: Don't complain if it's annotated with @Override; that means
-                    // somehow the build target isn't correct.
-                    String fqcn;
-                    String owner = classNode.name;
-                    if (CONSTRUCTOR_NAME.equals(name)) {
-                        fqcn = "new " + ClassContext.getFqcn(owner); //$NON-NLS-1$
-                    } else {
-                        fqcn = ClassContext.getFqcn(owner) + '#' + name;
-                    }
-                    String message = String.format(
-                            "This method is not overriding anything with the current build " +
-                            "target, but will in API level %1$d (current target is %2$d): %3$s",
-                            api, buildSdk, fqcn);
-
-                    Location location = context.getLocation(method, classNode);
-                    context.report(OVERRIDE, method, null, location, message, null);
-                }
-            }
-
-            if (!checkCalls) {
-                continue;
-            }
-
-            if (CHECK_DECLARATIONS) {
-                // Check types in parameter list and types of local variables
-                List localVariables = method.localVariables;
-                if (localVariables != null) {
-                    for (Object v : localVariables) {
-                        LocalVariableNode var = (LocalVariableNode) v;
-                        String desc = var.desc;
-                        if (desc.charAt(0) == 'L') {
-                            // "Lpackage/Class;" => "package/Bar"
-                            String className = desc.substring(1, desc.length() - 1);
-                            int api = mApiDatabase.getClassVersion(className);
-                            if (api > minSdk) {
-                                String fqcn = ClassContext.getFqcn(className);
-                                String message = String.format(
-                                    "Class requires API level %1$d (current min is %2$d): %3$s",
-                                    api, minSdk, fqcn);
-                                report(context, message, var.start, method,
-                                        className.substring(className.lastIndexOf('/') + 1), null,
-                                        SearchHints.create(NEAREST).matchJavaSymbol());
-                            }
-                        }
-                    }
-                }
-
-                // Check return type
-                // The parameter types are already handled as local variables so we can skip
-                // right to the return type.
-                // Check types in parameter list
-                String signature = method.desc;
-                if (signature != null) {
-                    int args = signature.indexOf(')');
-                    if (args != -1 && signature.charAt(args + 1) == 'L') {
-                        String type = signature.substring(args + 2, signature.length() - 1);
-                        int api = mApiDatabase.getClassVersion(type);
-                        if (api > minSdk) {
-                            String fqcn = ClassContext.getFqcn(type);
-                            String message = String.format(
-                                "Class requires API level %1$d (current min is %2$d): %3$s",
-                                api, minSdk, fqcn);
-                            AbstractInsnNode first = nodes.size() > 0 ? nodes.get(0) : null;
-                            report(context, message, first, method, method.name, null,
-                                    SearchHints.create(BACKWARD).matchJavaSymbol());
-                        }
-                    }
-                }
-            }
-
-            for (int i = 0, n = nodes.size(); i < n; i++) {
-                AbstractInsnNode instruction = nodes.get(i);
-                int type = instruction.getType();
-                if (type == AbstractInsnNode.METHOD_INSN) {
-                    MethodInsnNode node = (MethodInsnNode) instruction;
-                    String name = node.name;
-                    String owner = node.owner;
-                    String desc = node.desc;
-
-                    // No need to check methods in this local class; we know they
-                    // won't be an API match
-                    if (node.getOpcode() == Opcodes.INVOKEVIRTUAL
-                            && owner.equals(classNode.name)) {
-                        owner = classNode.superName;
-                    }
-
-                    boolean checkingSuperClass = false;
-                    while (owner != null) {
-                        int api = mApiDatabase.getCallVersion(owner, name, desc);
-                        if (api > minSdk) {
-                            if (method.name.startsWith(SWITCH_TABLE_PREFIX)) {
-                                // We're in a compiler-generated method to generate an
-                                // array indexed by enum ordinal values to enum values. The enum
-                                // itself must be requiring a higher API number than is
-                                // currently used, but the call site for the switch statement
-                                // will also be referencing it, so no need to report these
-                                // calls.
-                                break;
-                            }
-
-                            if (!checkingSuperClass
-                                    && node.getOpcode() == Opcodes.INVOKEVIRTUAL
-                                    && methodDefinedLocally(classNode, name, desc)) {
-                                break;
-                            }
-
-                            String fqcn;
-                            if (CONSTRUCTOR_NAME.equals(name)) {
-                                fqcn = "new " + ClassContext.getFqcn(owner); //$NON-NLS-1$
-                            } else {
-                                fqcn = ClassContext.getFqcn(owner) + '#' + name;
-                            }
-                            String message = String.format(
-                                    "Call requires API level %1$d (current min is %2$d): %3$s",
-                                    api, minSdk, fqcn);
-
-                            if (name.equals(ORDINAL_METHOD)
-                                    && instruction.getNext() != null
-                                    && instruction.getNext().getNext() != null
-                                    && instruction.getNext().getOpcode() == Opcodes.IALOAD
-                                    && instruction.getNext().getNext().getOpcode()
-                                        == Opcodes.TABLESWITCH) {
-                                message = String.format(
-                                    "Enum for switch requires API level %1$d " +
-                                    "(current min is %2$d): %3$s",
-                                    api, minSdk, ClassContext.getFqcn(owner));
-                            }
-
-                            report(context, message, node, method, name, null,
-                                    SearchHints.create(FORWARD).matchJavaSymbol());
-                        }
-
-                        // For virtual dispatch, walk up the inheritance chain checking
-                        // each inherited method
-                        if (owner.startsWith("android/")           //$NON-NLS-1$
-                                || owner.startsWith("javax/")) {   //$NON-NLS-1$
-                            // The API map has already inlined all inherited methods
-                            // so no need to keep checking up the chain
-                            owner = null;
-                        } else if (owner.startsWith("java/")) {    //$NON-NLS-1$
-                            if (owner.equals(LocaleDetector.DATE_FORMAT_OWNER)) {
-                                checkSimpleDateFormat(context, method, node, minSdk);
-                            }
-                            // Already inlined; see comment above
-                            owner = null;
-                        } else if (node.getOpcode() == Opcodes.INVOKEVIRTUAL) {
-                            owner = context.getDriver().getSuperClass(owner);
-                        } else if (node.getOpcode() == Opcodes.INVOKESTATIC && api == -1) {
-                            // Inherit through static classes as well
-                            owner = context.getDriver().getSuperClass(owner);
-                        } else {
-                            owner = null;
-                        }
-
-                        checkingSuperClass = true;
-                    }
-                } else if (type == AbstractInsnNode.FIELD_INSN) {
-                    FieldInsnNode node = (FieldInsnNode) instruction;
-                    String name = node.name;
-                    String owner = node.owner;
-                    int api = mApiDatabase.getFieldVersion(owner, name);
-                    if (api > minSdk) {
-                        if (method.name.startsWith(SWITCH_TABLE_PREFIX)) {
-                            checkSwitchBlock(context, classNode, node, method, name, owner,
-                                    api, minSdk);
-                            continue;
-                        }
-                        String fqcn = ClassContext.getFqcn(owner) + '#' + name;
-                        if (mPendingFields != null) {
-                            mPendingFields.remove(fqcn);
-                        }
-                        String message = String.format(
-                                "Field requires API level %1$d (current min is %2$d): %3$s",
-                                api, minSdk, fqcn);
-                        report(context, message, node, method, name, null,
-                                SearchHints.create(FORWARD).matchJavaSymbol());
-                    }
-                } else if (type == AbstractInsnNode.LDC_INSN) {
-                    LdcInsnNode node = (LdcInsnNode) instruction;
-                    if (node.cst instanceof Type) {
-                        Type t = (Type) node.cst;
-                        String className = t.getInternalName();
-
-                        int api = mApiDatabase.getClassVersion(className);
-                        if (api > minSdk) {
-                            String fqcn = ClassContext.getFqcn(className);
-                            String message = String.format(
-                                    "Class requires API level %1$d (current min is %2$d): %3$s",
-                                    api, minSdk, fqcn);
-                            report(context, message, node, method,
-                                    className.substring(className.lastIndexOf('/') + 1), null,
-                                    SearchHints.create(FORWARD).matchJavaSymbol());
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private static void checkSimpleDateFormat(ClassContext context, MethodNode method,
-            MethodInsnNode node, int minSdk) {
-        if (minSdk >= 9) {
-            // Already OK
-            return;
-        }
-        if (node.name.equals(CONSTRUCTOR_NAME) && !node.desc.equals("()V")) { //$NON-NLS-1$
-            // Check first argument
-            AbstractInsnNode prev = LintUtils.getPrevInstruction(node);
-            if (prev != null && !node.desc.equals("(Ljava/lang/String;)V")) { //$NON-NLS-1$
-                prev = LintUtils.getPrevInstruction(prev);
-            }
-            if (prev != null && prev.getOpcode() == Opcodes.LDC) {
-                LdcInsnNode ldc = (LdcInsnNode) prev;
-                Object cst = ldc.cst;
-                if (cst instanceof String) {
-                    String pattern = (String) cst;
-                    boolean isEscaped = false;
-                    for (int i = 0; i < pattern.length(); i++) {
-                        char c = pattern.charAt(i);
-                        if (c == '\'') {
-                            isEscaped = !isEscaped;
-                        } else  if (!isEscaped && (c == 'L' || c == 'c')) {
-                            String message = String.format(
-                                    "The pattern character '%1$c' requires API level 9 (current " +
-                                    "min is %2$d) : \"%3$s\"", c, minSdk, pattern);
-                            report(context, message, node, method, pattern, null,
-                                    SearchHints.create(FORWARD));
-                            return;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    @SuppressWarnings("rawtypes") // ASM API
-    private static boolean methodDefinedLocally(ClassNode classNode, String name, String desc) {
-        List methodList = classNode.methods;
-        for (Object m : methodList) {
-            MethodNode method = (MethodNode) m;
-            if (name.equals(method.name) && desc.equals(method.desc)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    @SuppressWarnings("rawtypes") // ASM API
-    private static void checkSwitchBlock(ClassContext context, ClassNode classNode,
-            FieldInsnNode field, MethodNode method, String name, String owner, int api,
-            int minSdk) {
-        // Switch statements on enums are tricky. The compiler will generate a method
-        // which returns an array of the enum constants, indexed by their ordinal() values.
-        // However, we only want to complain if the code is actually referencing one of
-        // the non-available enum fields.
-        //
-        // For the android.graphics.PorterDuff.Mode enum for example, the first few items
-        // in the array are populated like this:
-        //
-        //   L0
-        //    ALOAD 0
-        //    GETSTATIC android/graphics/PorterDuff$Mode.ADD : Landroid/graphics/PorterDuff$Mode;
-        //    INVOKEVIRTUAL android/graphics/PorterDuff$Mode.ordinal ()I
-        //    ICONST_1
-        //    IASTORE
-        //   L1
-        //    GOTO L3
-        //   L2
-        //   FRAME FULL [[I] [java/lang/NoSuchFieldError]
-        //    POP
-        //   L3
-        //   FRAME SAME
-        //    ALOAD 0
-        //    GETSTATIC android/graphics/PorterDuff$Mode.CLEAR : Landroid/graphics/PorterDuff$Mode;
-        //    INVOKEVIRTUAL android/graphics/PorterDuff$Mode.ordinal ()I
-        //    ICONST_2
-        //    IASTORE
-        //    ...
-        // So if we for example find that the "ADD" field isn't accessible, since it requires
-        // API 11, we need to
-        //   (1) First find out what its ordinal number is. We can look at the following
-        //       instructions to discover this; it's the "ICONST_1" and "IASTORE" instructions.
-        //       (After ICONST_5 it moves on to BIPUSH 6, BIPUSH 7, etc.)
-        //   (2) Find the corresponding *usage* of this switch method. For the above enum,
-        //       the switch ordinal lookup method will be called
-        //         "$SWITCH_TABLE$android$graphics$PorterDuff$Mode" with desc "()[I".
-        //       This means we will be looking for an invocation in some other method which looks
-        //       like this:
-        //         INVOKESTATIC (current class).$SWITCH_TABLE$android$graphics$PorterDuff$Mode ()[I
-        //       (obviously, it can be invoked more than once)
-        //       Note that it can be used more than once in this class and all sites should be
-        //       checked!
-        //   (3) Look up the corresponding table switch, which should look something like this:
-        //        INVOKESTATIC (current class).$SWITCH_TABLE$android$graphics$PorterDuff$Mode ()[I
-        //        ALOAD 0
-        //        INVOKEVIRTUAL android/graphics/PorterDuff$Mode.ordinal ()I
-        //        IALOAD
-        //        LOOKUPSWITCH
-        //          2: L1
-        //          11: L2
-        //          default: L3
-        //       Here we need to see if the LOOKUPSWITCH instruction is referencing our target
-        //       case. Above we were looking for the "ADD" case which had ordinal 1. Since this
-        //       isn't explicitly referenced, we can ignore this field reference.
-        AbstractInsnNode next = field.getNext();
-        if (next == null || next.getOpcode() != Opcodes.INVOKEVIRTUAL) {
-            return;
-        }
-        next = next.getNext();
-        if (next == null) {
-            return;
-        }
-        int ordinal;
-        switch (next.getOpcode()) {
-            case Opcodes.ICONST_0: ordinal = 0; break;
-            case Opcodes.ICONST_1: ordinal = 1; break;
-            case Opcodes.ICONST_2: ordinal = 2; break;
-            case Opcodes.ICONST_3: ordinal = 3; break;
-            case Opcodes.ICONST_4: ordinal = 4; break;
-            case Opcodes.ICONST_5: ordinal = 5; break;
-            case Opcodes.BIPUSH: {
-                IntInsnNode iin = (IntInsnNode) next;
-                ordinal = iin.operand;
-                break;
-            }
-            default:
-                return;
-        }
-
-        // Find usages of this call site
-        List methodList = classNode.methods;
-        for (Object m : methodList) {
-            InsnList nodes = ((MethodNode) m).instructions;
-            for (int i = 0, n = nodes.size(); i < n; i++) {
-                AbstractInsnNode instruction = nodes.get(i);
-                if (instruction.getOpcode() != Opcodes.INVOKESTATIC){
-                    continue;
-                }
-                MethodInsnNode node = (MethodInsnNode) instruction;
-                if (node.name.equals(method.name)
-                        && node.desc.equals(method.desc)
-                        && node.owner.equals(classNode.name)) {
-                    // Find lookup switch
-                    AbstractInsnNode target = getNextInstruction(node);
-                    while (target != null) {
-                        if (target.getOpcode() == Opcodes.LOOKUPSWITCH) {
-                            LookupSwitchInsnNode lookup = (LookupSwitchInsnNode) target;
-                            @SuppressWarnings("unchecked") // ASM API
-                            List<Integer> keys = lookup.keys;
-                            if (keys != null && keys.contains(ordinal)) {
-                                String fqcn = ClassContext.getFqcn(owner) + '#' + name;
-                                String message = String.format(
-                                        "Enum value requires API level %1$d " +
-                                        "(current min is %2$d): %3$s",
-                                        api, minSdk, fqcn);
-                                report(context, message, lookup, (MethodNode) m, name, null,
-                                        SearchHints.create(FORWARD).matchJavaSymbol());
-
-                                // Break out of the inner target search only; the switch
-                                // statement could be used in other places in this class as
-                                // well and we want to report all problematic usages.
-                                break;
-                            }
-                        }
-                        target = getNextInstruction(target);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Return the {@code @TargetApi} level to use for the given {@code classNode};
-     * this will be the {@code @TargetApi} annotation on the class, or any outer
-     * methods (for anonymous inner classes) or outer classes (for inner classes)
-     * of the given class.
-     */
-    private static int getClassMinSdk(ClassContext context, ClassNode classNode) {
-        int classMinSdk = getLocalMinSdk(classNode.invisibleAnnotations);
-        if (classMinSdk != -1) {
-            return classMinSdk;
-        }
-
-        LintDriver driver = context.getDriver();
-        while (classNode != null) {
-            ClassNode prev = classNode;
-            classNode = driver.getOuterClassNode(classNode);
-            if (classNode != null) {
-                // TODO: Should this be "curr" instead?
-                if (prev.outerMethod != null) {
-                    @SuppressWarnings("rawtypes") // ASM API
-                    List methods = classNode.methods;
-                    for (Object m : methods) {
-                        MethodNode method = (MethodNode) m;
-                        if (method.name.equals(prev.outerMethod)
-                                && method.desc.equals(prev.outerMethodDesc)) {
-                            // Found the outer method for this anonymous class; check method
-                            // annotations on it, then continue up the class hierarchy
-                            int methodMinSdk = getLocalMinSdk(method.invisibleAnnotations);
-                            if (methodMinSdk != -1) {
-                                return methodMinSdk;
-                            }
-
-                            break;
-                        }
-                    }
-                }
-
-                classMinSdk = getLocalMinSdk(classNode.invisibleAnnotations);
-                if (classMinSdk != -1) {
-                    return classMinSdk;
-                }
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Returns the minimum SDK to use according to the given annotation list, or
-     * -1 if no annotation was found.
-     *
-     * @param annotations a list of annotation nodes from ASM
-     * @return the API level to use for this node, or -1
-     */
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    private static int getLocalMinSdk(List annotations) {
-        if (annotations != null) {
-            for (AnnotationNode annotation : (List<AnnotationNode>)annotations) {
-                String desc = annotation.desc;
-                if (desc.endsWith(TARGET_API_VMSIG)) {
-                    if (annotation.values != null) {
-                        for (int i = 0, n = annotation.values.size(); i < n; i += 2) {
-                            String key = (String) annotation.values.get(i);
-                            if (key.equals("value")) {  //$NON-NLS-1$
-                                Object value = annotation.values.get(i + 1);
-                                if (value instanceof Integer) {
-                                    return ((Integer) value).intValue();
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Returns the minimum SDK to use in the given element context, or -1 if no
-     * {@code tools:targetApi} attribute was found.
-     *
-     * @param element the element to look at, including parents
-     * @return the API level to use for this element, or -1
-     */
-    private static int getLocalMinSdk(@NonNull Element element) {
-        while (element != null) {
-            String targetApi = element.getAttributeNS(TOOLS_URI, ATTR_TARGET_API);
-            if (targetApi != null && !targetApi.isEmpty()) {
-                if (Character.isDigit(targetApi.charAt(0))) {
-                    try {
-                        return Integer.parseInt(targetApi);
-                    } catch (NumberFormatException nufe) {
-                        break;
-                    }
-                }
-
-                for (int api = 1; api <= SdkConstants.HIGHEST_KNOWN_API; api++) {
-                    String code = LintUtils.getBuildCode(api);
-                    if (code != null && code.equalsIgnoreCase(targetApi)) {
-                        return api;
-                    }
-                }
-            }
-
-            Node parent = element.getParentNode();
-            if (parent != null && parent.getNodeType() == Node.ELEMENT_NODE) {
-                element = (Element) parent;
-            } else {
-                break;
-            }
-        }
-
-        return -1;
-    }
-
-    private static void report(final ClassContext context, String message, AbstractInsnNode node,
-            MethodNode method, String patternStart, String patternEnd, SearchHints hints) {
-        int lineNumber = node != null ? ClassContext.findLineNumber(node) : -1;
-
-        // If looking for a constructor, the string we'll see in the source is not the
-        // method name (<init>) but the class name
-        if (patternStart != null && patternStart.equals(CONSTRUCTOR_NAME)
-                && node instanceof MethodInsnNode) {
-            if (hints != null) {
-                hints = hints.matchConstructor();
-            }
-            patternStart = ((MethodInsnNode) node).owner;
-        }
-
-        if (patternStart != null) {
-            int index = patternStart.lastIndexOf('$');
-            if (index != -1) {
-                patternStart = patternStart.substring(index + 1);
-            }
-            index = patternStart.lastIndexOf('/');
-            if (index != -1) {
-                patternStart = patternStart.substring(index + 1);
-            }
-        }
-
-        Location location = context.getLocationForLine(lineNumber, patternStart, patternEnd,
-                hints);
-        context.report(UNSUPPORTED, method, node, location, message, null);
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (mPendingFields != null) {
-            for (List<Pair<String, Location>> list : mPendingFields.values()) {
-                for (Pair<String, Location> pair : list) {
-                    String message = pair.getFirst();
-                    Location location = pair.getSecond();
-                    context.report(INLINED, location, message, null);
-                }
-            }
-        }
-
-        super.afterCheckProject(context);
-    }
-
-// ---- Implements JavaScanner ----
-
-    @Nullable
-    @Override
-    public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
-        return new ApiVisitor(context);
-    }
-
-    @Nullable
-    @Override
-    public List<Class<? extends lombok.ast.Node>> getApplicableNodeTypes() {
-        List<Class<? extends lombok.ast.Node>> types =
-                new ArrayList<Class<? extends lombok.ast.Node>>(2);
-        types.add(ImportDeclaration.class);
-        types.add(Select.class);
-        types.add(MethodDeclaration.class);
-        types.add(ConstructorDeclaration.class);
-        types.add(VariableDefinitionEntry.class);
-        types.add(VariableReference.class);
-        return types;
-    }
-
-    private final class ApiVisitor extends ForwardingAstVisitor {
-        private JavaContext mContext;
-        private Map<String, String> mClassToImport = Maps.newHashMap();
-        private List<String> mStarImports;
-        private Set<String> mLocalVars;
-        private lombok.ast.Node mCurrentMethod;
-        private Set<String> mFields;
-        private List<String> mStaticStarImports;
-
-        private ApiVisitor(JavaContext context) {
-            mContext = context;
-        }
-
-        @Override
-        public boolean visitImportDeclaration(ImportDeclaration node) {
-            if (node.astStarImport()) {
-                // Similarly, if you're inheriting from a constants class, figure out
-                // how that works... :=(
-                String fqcn = node.asFullyQualifiedName();
-                int strip = fqcn.lastIndexOf('*');
-                if (strip != -1) {
-                    strip = fqcn.lastIndexOf('.', strip);
-                    if (strip != -1) {
-                        String pkgName = getInternalName(fqcn.substring(0, strip));
-                        if (ApiLookup.isRelevantOwner(pkgName)) {
-                            if (node.astStaticImport()) {
-                                if (mStaticStarImports == null) {
-                                    mStaticStarImports = Lists.newArrayList();
-                                }
-                                mStaticStarImports.add(pkgName);
-                            } else {
-                                if (mStarImports == null) {
-                                    mStarImports = Lists.newArrayList();
-                                }
-                                mStarImports.add(pkgName);
-                            }
-                        }
-                    }
-                }
-            } else if (node.astStaticImport()) {
-                String fqcn = node.asFullyQualifiedName();
-                String fieldName = getInternalName(fqcn);
-                int index = fieldName.lastIndexOf('$');
-                if (index != -1) {
-                    String owner = fieldName.substring(0, index);
-                    String name = fieldName.substring(index + 1);
-                    checkField(node, name, owner);
-                }
-            } else {
-                // Store in map -- if it's "one of ours"
-                // Use override detector's map for that purpose
-                String fqcn = node.asFullyQualifiedName();
-
-                int last = fqcn.lastIndexOf('.');
-                if (last != -1) {
-                    String className = fqcn.substring(last + 1);
-                    mClassToImport.put(className, fqcn);
-                }
-            }
-
-            return super.visitImportDeclaration(node);
-        }
-
-        @Override
-        public boolean visitSelect(Select node) {
-            boolean result = super.visitSelect(node);
-
-            if (node.getParent() instanceof Select) {
-                // We only want to look at the leaf expressions; e.g. if you have
-                // "foo.bar.baz" we only care about the select foo.bar.baz, not foo.bar
-                return result;
-            }
-
-            // See if this corresponds to a field reference. We assume it's a field if
-            // it's a select (x.y) and either the identifier y is capitalized (e.g.
-            // foo.VIEW_MASK) or if it's a member of an R class (R.id.foo).
-            String name = node.astIdentifier().astValue();
-            boolean isField = Character.isUpperCase(name.charAt(0));
-            if (!isField) {
-                // See if there's an R class
-                Select current = node;
-                while (current != null) {
-                    Expression operand = current.astOperand();
-                    if (operand instanceof Select) {
-                        current = (Select) operand;
-                        if (R_CLASS.equals(current.astIdentifier().astValue())) {
-                            isField = true;
-                            break;
-                        }
-                    } else if (operand instanceof VariableReference) {
-                        VariableReference reference = (VariableReference) operand;
-                        if (R_CLASS.equals(reference.astIdentifier().astValue())) {
-                            isField = true;
-                        }
-                        break;
-                    } else {
-                        break;
-                    }
-                }
-            }
-
-            if (isField) {
-                Expression operand = node.astOperand();
-                if (operand.getClass() == Select.class) {
-                    // Possibly a fully qualified name in place
-                    String cls = operand.toString();
-
-                    // See if it's an imported class with an inner class
-                    // (e.g. Manifest.permission.FIELD)
-                    if (Character.isUpperCase(cls.charAt(0))) {
-                        int firstDot = cls.indexOf('.');
-                        if (firstDot != -1) {
-                            String base = cls.substring(0, firstDot);
-                            String fqcn = mClassToImport.get(base);
-                            if (fqcn != null) {
-                                // Yes imported
-                                String owner = getInternalName(fqcn + cls.substring(firstDot));
-                                checkField(node, name, owner);
-                                return result;
-                            }
-
-                            // Might be a star import: have to iterate and check here
-                            if (mStarImports != null) {
-                                for (String packagePrefix : mStarImports) {
-                                    String owner = getInternalName(packagePrefix + '/' + cls);
-                                    if (checkField(node, name, owner)) {
-                                        mClassToImport.put(name, owner);
-                                        return result;
-                                    }
-                                }
-                            }
-                        }
-                    }
-
-                    // See if it's a fully qualified reference in place
-                    String owner = getInternalName(cls);
-                    checkField(node, name, owner);
-                    return result;
-                } else if (operand.getClass() == VariableReference.class) {
-                    String className = ((VariableReference) operand).astIdentifier().astValue();
-                    // Not a FQCN that we care about: look in imports
-                    String fqcn = mClassToImport.get(className);
-                    if (fqcn != null) {
-                        // Yes imported
-                        String owner = getInternalName(fqcn);
-                        checkField(node, name, owner);
-                        return result;
-                    }
-
-                    if (Character.isUpperCase(className.charAt(0))) {
-                        // Might be a star import: have to iterate and check here
-                        if (mStarImports != null) {
-                            for (String packagePrefix : mStarImports) {
-                                String owner = getInternalName(packagePrefix) + '/' + className;
-                                if (checkField(node, name, owner)) {
-                                    mClassToImport.put(name, owner);
-                                    return result;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            return result;
-        }
-
-        @Override
-        public boolean visitVariableReference(VariableReference node) {
-            boolean result = super.visitVariableReference(node);
-
-            if (node.getParent() != null) {
-                lombok.ast.Node parent = node.getParent();
-                Class<? extends lombok.ast.Node> parentClass = parent.getClass();
-                if (parentClass == Select.class
-                        || parentClass == Switch.class // look up on the switch expression type
-                        || parentClass == Case.class
-                        || parentClass == ConstructorInvocation.class
-                        || parentClass == SuperConstructorInvocation.class
-                        || parentClass == AnnotationElement.class) {
-                    return result;
-                }
-
-                if (parent instanceof MethodInvocation &&
-                        ((MethodInvocation) parent).astOperand() == node) {
-                    return result;
-                } else if (parent instanceof BinaryExpression) {
-                    BinaryExpression expression = (BinaryExpression) parent;
-                    if (expression.astLeft() == node) {
-                        return result;
-                    }
-                }
-            }
-
-            String name = node.astIdentifier().astValue();
-            if (Character.isUpperCase(name.charAt(0))
-                    && (mLocalVars == null || !mLocalVars.contains(name))
-                    && (mFields == null || !mFields.contains(name))) {
-                // Potential field reference: check it
-                if (mStaticStarImports != null) {
-                    for (String owner : mStaticStarImports) {
-                        if (checkField(node, name, owner)) {
-                            break;
-                        }
-                    }
-                }
-            }
-
-            return result;
-        }
-
-        @Override
-        public boolean visitVariableDefinitionEntry(VariableDefinitionEntry node) {
-            if (mCurrentMethod != null) {
-                if (mLocalVars == null) {
-                    mLocalVars = Sets.newHashSet();
-                }
-                mLocalVars.add(node.astName().astValue());
-            } else {
-                if (mFields == null) {
-                    mFields = Sets.newHashSet();
-                }
-                mFields.add(node.astName().astValue());
-            }
-            return super.visitVariableDefinitionEntry(node);
-        }
-
-        @Override
-        public boolean visitMethodDeclaration(MethodDeclaration node) {
-            mLocalVars = null;
-            mCurrentMethod = node;
-            return super.visitMethodDeclaration(node);
-        }
-
-        @Override
-        public boolean visitConstructorDeclaration(ConstructorDeclaration node) {
-            mLocalVars = null;
-            mCurrentMethod = node;
-            return super.visitConstructorDeclaration(node);
-        }
-
-        @Override
-        public void endVisit(lombok.ast.Node node) {
-            if (node == mCurrentMethod) {
-                mCurrentMethod = null;
-            }
-            super.endVisit(node);
-        }
-
-        /**
-         * Checks a Java source field reference. Returns true if the field is known
-         * regardless of whether it's an invalid field or not
-         */
-        private boolean checkField(
-                @NonNull lombok.ast.Node node,
-                @NonNull String name,
-                @NonNull String owner) {
-            int api = mApiDatabase.getFieldVersion(owner, name);
-            if (api != -1) {
-                int minSdk = getMinSdk(mContext);
-                if (api > minSdk
-                        && api > getLocalMinSdk(node)) {
-                    if (isBenignConstantUsage(node, name, owner)) {
-                        return true;
-                    }
-
-                    Location location = mContext.getLocation(node);
-                    String fqcn = getFqcn(owner) + '#' + name;
-
-                    if (node instanceof ImportDeclaration) {
-                        // Replace import statement location range with just
-                        // the identifier part
-                        ImportDeclaration d = (ImportDeclaration) node;
-                        int startOffset = d.astParts().first().getPosition().getStart();
-                        Position start = location.getStart();
-                        int startColumn = start.getColumn();
-                        int startLine = start.getLine();
-                        start = new DefaultPosition(startLine,
-                                startColumn + startOffset - start.getOffset(), startOffset);
-                        int fqcnLength = fqcn.length();
-                        Position end = new DefaultPosition(startLine,
-                                start.getColumn() + fqcnLength,
-                                start.getOffset() + fqcnLength);
-                        location = Location.create(location.getFile(), start, end);
-                    }
-
-                    String message = String.format(
-                            "Field requires API level %1$d (current min is %2$d): %3$s",
-                            api, minSdk, fqcn);
-
-                    LintDriver driver = mContext.getDriver();
-                    if (driver.isSuppressed(INLINED, node)) {
-                        return true;
-                    }
-
-                    // Also allow to suppress these issues with NewApi, since some
-                    // fields used to get identified that way
-                    if (driver.isSuppressed(UNSUPPORTED, node)) {
-                        return true;
-                    }
-
-                    // We can't report the issue right away; we don't yet know if
-                    // this is an actual inlined (static primitive or String) yet.
-                    // So just make a note of it, and report these after the project
-                    // checking has finished; any fields that aren't inlined will be
-                    // cleared when they're noticed by the class check.
-                    if (mPendingFields == null) {
-                        mPendingFields = Maps.newHashMapWithExpectedSize(20);
-                    }
-                    List<Pair<String, Location>> list = mPendingFields.get(fqcn);
-                    if (list == null) {
-                        list = new ArrayList<Pair<String, Location>>();
-                        mPendingFields.put(fqcn, list);
-                    }
-                    list.add(Pair.of(message, location));
-                }
-
-                return true;
-            }
-
-            return false;
-        }
-
-        /**
-         * Checks whether the given instruction is a benign usage of a constant defined
-         * in a later version of Android than the application's {@code minSdkVersion}.
-         *
-         * @param node the instruction to check
-         * @param name the name of the constant
-         * @param owner the field owner
-         * @return true if the given usage is safe on older versions than the introduction
-         * level of the constant
-         */
-        public boolean isBenignConstantUsage(
-                @NonNull lombok.ast.Node node,
-                @NonNull String name,
-                @NonNull String owner) {
-            if (owner.equals("android/os/Build$VERSION_CODES")) {     //$NON-NLS-1$
-                // These constants are required for compilation, not execution
-                // and valid code checks it even on older platforms
-                return true;
-            }
-            if (owner.equals("android/view/ViewGroup$LayoutParams")   //$NON-NLS-1$
-                    && name.equals("MATCH_PARENT")) {                 //$NON-NLS-1$
-                return true;
-            }
-            if (owner.equals("android/widget/AbsListView")            //$NON-NLS-1$
-                && ((name.equals("CHOICE_MODE_NONE")                  //$NON-NLS-1$
-                    || name.equals("CHOICE_MODE_MULTIPLE")            //$NON-NLS-1$
-                    || name.equals("CHOICE_MODE_SINGLE")))) {         //$NON-NLS-1$
-                // android.widget.ListView#CHOICE_MODE_MULTIPLE and friends have API=1,
-                // but in API 11 it was moved up to the parent class AbsListView.
-                // Referencing AbsListView#CHOICE_MODE_MULTIPLE technically requires API 11,
-                // but the constant is the same as the older version, so accept this without
-                // warning.
-                return true;
-            }
-
-            // It's okay to reference the constant as a case constant (since that
-            // code path won't be taken) or in a condition of an if statement
-            lombok.ast.Node curr = node.getParent();
-            boolean usedInExpression = false;
-            while (curr != null) {
-                Class<? extends lombok.ast.Node> nodeType = curr.getClass();
-                if (nodeType == Case.class) {
-                    return true;
-                } else if (nodeType == BinaryExpression.class) {
-                    usedInExpression = true;
-                } else if (nodeType == If.class) {
-                    return usedInExpression;
-                }
-                curr = curr.getParent();
-            }
-
-            return false;
-        }
-
-        /**
-         * Returns the minimum SDK to use according to the given AST node, or null
-         * if no {@code TargetApi} annotations were found
-         *
-         * @return the API level to use for this node, or -1
-         */
-        public int getLocalMinSdk(@Nullable lombok.ast.Node scope) {
-            while (scope != null) {
-                Class<? extends lombok.ast.Node> type = scope.getClass();
-                // The Lombok AST uses a flat hierarchy of node type implementation classes
-                // so no need to do instanceof stuff here.
-                if (type == VariableDefinition.class) {
-                    // Variable
-                    VariableDefinition declaration = (VariableDefinition) scope;
-                    int targetApi = getLocalMinSdk(declaration.astModifiers());
-                    if (targetApi != -1) {
-                        return targetApi;
-                    }
-                } else if (type == MethodDeclaration.class) {
-                    // Method
-                    // Look for annotations on the method
-                    MethodDeclaration declaration = (MethodDeclaration) scope;
-                    int targetApi = getLocalMinSdk(declaration.astModifiers());
-                    if (targetApi != -1) {
-                        return targetApi;
-                    }
-                } else if (type == ConstructorDeclaration.class) {
-                    // Constructor
-                    // Look for annotations on the method
-                    ConstructorDeclaration declaration = (ConstructorDeclaration) scope;
-                    int targetApi = getLocalMinSdk(declaration.astModifiers());
-                    if (targetApi != -1) {
-                        return targetApi;
-                    }
-                } else if (type == ClassDeclaration.class) {
-                    // Class
-                    ClassDeclaration declaration = (ClassDeclaration) scope;
-                    int targetApi = getLocalMinSdk(declaration.astModifiers());
-                    if (targetApi != -1) {
-                        return targetApi;
-                    }
-                }
-
-                scope = scope.getParent();
-            }
-
-            return -1;
-        }
-
-        /**
-         * Returns true if the given AST modifier has a suppress annotation for the
-         * given issue (which can be null to check for the "all" annotation)
-         *
-         * @param modifiers the modifier to check
-         * @return true if the issue or all issues should be suppressed for this
-         *         modifier
-         */
-        private int getLocalMinSdk(@Nullable Modifiers modifiers) {
-            if (modifiers == null) {
-                return -1;
-            }
-            StrictListAccessor<Annotation, Modifiers> annotations = modifiers.astAnnotations();
-            if (annotations == null) {
-                return -1;
-            }
-
-            Iterator<Annotation> iterator = annotations.iterator();
-            while (iterator.hasNext()) {
-                Annotation annotation = iterator.next();
-                TypeReference t = annotation.astAnnotationTypeReference();
-                String typeName = t.getTypeName();
-                if (typeName.endsWith(TARGET_API)) {
-                    StrictListAccessor<AnnotationElement, Annotation> values =
-                            annotation.astElements();
-                    if (values != null) {
-                        Iterator<AnnotationElement> valueIterator = values.iterator();
-                        while (valueIterator.hasNext()) {
-                            AnnotationElement element = valueIterator.next();
-                            AnnotationValue valueNode = element.astValue();
-                            if (valueNode == null) {
-                                continue;
-                            }
-                            if (valueNode instanceof IntegralLiteral) {
-                                IntegralLiteral literal = (IntegralLiteral) valueNode;
-                                return literal.astIntValue();
-                            } else if (valueNode instanceof StringLiteral) {
-                                String value = ((StringLiteral) valueNode).astValue();
-                                return codeNameToApi(value);
-                            } else if (valueNode instanceof Select) {
-                                Select select = (Select) valueNode;
-                                String codename = select.astIdentifier().astValue();
-                                return codeNameToApi(codename);
-                            } else if (valueNode instanceof VariableReference) {
-                                VariableReference reference = (VariableReference) valueNode;
-                                String codename = reference.astIdentifier().astValue();
-                                return codeNameToApi(codename);
-                            }
-                        }
-                    }
-                }
-            }
-
-            return -1;
-        }
-    }
-
-    private static int codeNameToApi(String codename) {
-        for (int api = 1; api <= SdkConstants.HIGHEST_KNOWN_API; api++) {
-            String code = LintUtils.getBuildCode(api);
-            if (code != null && code.equalsIgnoreCase(codename)) {
-                return api;
-            }
-        }
-
-        return -1;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ApiLookup.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ApiLookup.java
deleted file mode 100644
index 6a4de6e..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ApiLookup.java
+++ /dev/null
@@ -1,971 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_PKG;
-import static com.android.SdkConstants.DOT_XML;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.tools.lint.client.api.LintClient;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.google.common.base.Charsets;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.io.Files;
-import com.google.common.primitives.UnsignedBytes;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.lang.ref.WeakReference;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel.MapMode;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Database for API checking: Allows quick lookup of a given class, method or field
- * to see which API level it was introduced in.
- * <p>
- * This class is optimized for quick bytecode lookup used in conjunction with the
- * ASM library: It has lookup methods that take internal JVM signatures, and for a method
- * call for example it processes the owner, name and description parameters separately
- * the way they are provided from ASM.
- * <p>
- * The {@link Api} class provides access to the full Android API along with version
- * information, initialized from an XML file. This lookup class adds a binary cache around
- * the API to make initialization faster and to require fewer objects. It creates
- * a binary cache data structure, which fits in a single byte array, which means that
- * to open the database you can just read in the byte array and go. On one particular
- * machine, this takes about 30-50 ms versus 600-800ms for the full parse. It also
- * helps memory by placing everything in a compact byte array instead of needing separate
- * strings (2 bytes per character in a char[] for the 25k method entries, 11k field entries
- * and 6k class entries) - and it also avoids the same number of Map.Entry objects.
- * When creating the memory data structure it performs a few other steps to help memory:
- * <ul>
- * <li> It stores the strings as single bytes, since all the JVM signatures are in ASCII
- * <li> It strips out the method return types (which takes the binary size down from
- *      about 4.7M to 4.0M)
- * <li> It strips out all APIs that have since=1, since the lookup only needs to find
- *      classes, methods and fields that have an API level *higher* than 1. This drops
- *      the memory use down from 4.0M to 1.7M.
- * </ul>
- */
-public class ApiLookup {
-    /** Relative path to the api-versions.xml database file within the Lint installation */
-    private static final String XML_FILE_PATH = "platform-tools/api/api-versions.xml"; //$NON-NLS-1$
-    private static final String FILE_HEADER = "API database used by Android lint\000";
-    private static final int BINARY_FORMAT_VERSION = 5;
-    private static final boolean DEBUG_FORCE_REGENERATE_BINARY = false;
-    private static final boolean DEBUG_SEARCH = false;
-    private static final boolean WRITE_STATS = false;
-    /** Default size to reserve for each API entry when creating byte buffer to build up data */
-    private static final int BYTES_PER_ENTRY = 36;
-
-    private final LintClient mClient;
-    private final File mXmlFile;
-    private final File mBinaryFile;
-    private final Api mInfo;
-    private byte[] mData;
-    private int[] mIndices;
-    private int mClassCount;
-    private String[] mJavaPackages;
-
-    private static WeakReference<ApiLookup> sInstance =
-            new WeakReference<ApiLookup>(null);
-
-    /**
-     * Returns an instance of the API database
-     *
-     * @param client the client to associate with this database - used only for
-     *            logging. The database object may be shared among repeated invocations,
-     *            and in that case client used will be the one originally passed in.
-     *            In other words, this parameter may be ignored if the client created
-     *            is not new.
-     * @return a (possibly shared) instance of the API database, or null
-     *         if its data can't be found
-     */
-    public static ApiLookup get(LintClient client) {
-        synchronized (ApiLookup.class) {
-            ApiLookup db = sInstance.get();
-            if (db == null) {
-                File file = client.findResource(XML_FILE_PATH);
-                if (file == null) {
-                    // AOSP build environment?
-                    String build = System.getenv("ANDROID_BUILD_TOP");   //$NON-NLS-1$
-                    if (build != null) {
-                        file = new File(build, "development/sdk/api-versions.xml" //$NON-NLS-1$
-                                .replace('/', File.separatorChar));
-                    }
-                }
-
-                if (file == null || !file.exists()) {
-                    client.log(null, "Fatal error: No API database found at %1$s", file);
-                    return null;
-                } else {
-                    db = get(client, file);
-                }
-                sInstance = new WeakReference<ApiLookup>(db);
-            }
-
-            return db;
-        }
-    }
-
-    @VisibleForTesting
-    static String getCacheFileName(String xmlFileName) {
-        if (LintUtils.endsWith(xmlFileName, DOT_XML)) {
-            xmlFileName = xmlFileName.substring(0, xmlFileName.length() - DOT_XML.length());
-        }
-
-        // Incorporate version number in the filename to avoid upgrade filename
-        // conflicts on Windows (such as issue #26663)
-        return xmlFileName + '-' + BINARY_FORMAT_VERSION + ".bin"; //$NON-NLS-1$
-    }
-
-    /**
-     * Returns an instance of the API database
-     *
-     * @param client the client to associate with this database - used only for
-     *            logging
-     * @param xmlFile the XML file containing configuration data to use for this
-     *            database
-     * @return a (possibly shared) instance of the API database, or null
-     *         if its data can't be found
-     */
-    private static ApiLookup get(LintClient client, File xmlFile) {
-        if (!xmlFile.exists()) {
-            client.log(null, "The API database file %1$s does not exist", xmlFile);
-            return null;
-        }
-
-        File cacheDir = client.getCacheDir(true/*create*/);
-        if (cacheDir == null) {
-            cacheDir = xmlFile.getParentFile();
-        }
-
-        File binaryData = new File(cacheDir, getCacheFileName(xmlFile.getName()));
-
-        if (DEBUG_FORCE_REGENERATE_BINARY) {
-            System.err.println("\nTemporarily regenerating binary data unconditionally \nfrom "
-                    + xmlFile + "\nto " + binaryData);
-            if (!createCache(client, xmlFile, binaryData)) {
-                return null;
-            }
-        } else if (!binaryData.exists() || binaryData.lastModified() < xmlFile.lastModified()
-               || binaryData.length() == 0) {
-            if (!createCache(client, xmlFile, binaryData)) {
-                return null;
-            }
-        }
-
-        if (!binaryData.exists()) {
-            client.log(null, "The API database file %1$s does not exist", binaryData);
-            return null;
-        }
-
-        return new ApiLookup(client, xmlFile, binaryData, null);
-    }
-
-    private static boolean createCache(LintClient client, File xmlFile, File binaryData) {
-        long begin = 0;
-        if (WRITE_STATS) {
-            begin = System.currentTimeMillis();
-        }
-
-        Api info = Api.parseApi(xmlFile);
-
-        if (WRITE_STATS) {
-            long end = System.currentTimeMillis();
-            System.out.println("Reading XML data structures took " + (end - begin) + " ms)");
-        }
-
-        if (info != null) {
-            try {
-                writeDatabase(binaryData, info);
-                return true;
-            } catch (IOException ioe) {
-                client.log(ioe, "Can't write API cache file");
-            }
-        }
-
-        return false;
-    }
-
-    /** Use one of the {@link #get} factory methods instead */
-    private ApiLookup(
-            @NonNull LintClient client,
-            @NonNull File xmlFile,
-            @Nullable File binaryFile,
-            @Nullable Api info) {
-        mClient = client;
-        mXmlFile = xmlFile;
-        mBinaryFile = binaryFile;
-        mInfo = info;
-
-        if (binaryFile != null) {
-            readData();
-        }
-    }
-
-    /**
-     * Database format:
-     * <pre>
-     * 1. A file header, which is the exact contents of {@link #FILE_HEADER} encoded
-     *     as ASCII characters. The purpose of the header is to identify what the file
-     *     is for, for anyone attempting to open the file.
-     * 2. A file version number. If the binary file does not match the reader's expected
-     *     version, it can ignore it (and regenerate the cache from XML).
-     * 3. The number of classes [1 int]
-     * 4. The number of members (across all classes) [1 int].
-     * 5. The number of java/javax packages [1 int]
-     * 6. The java/javax package name table. Each item consists of a byte count for
-     *    the package string (as 1 byte) followed by the UTF-8 encoded bytes for each package.
-     *    These are in sorted order.
-     * 7. Class offset table (one integer per class, pointing to the byte offset in the
-     *      file (relative to the beginning of the file) where each class begins.
-     *      The classes are always sorted alphabetically by fully qualified name.
-     * 8. Member offset table (one integer per member, pointing to the byte offset in the
-     *      file (relative to the beginning of the file) where each member entry begins.
-     *      The members are always sorted alphabetically.
-     * 9. Class entry table. Each class entry consists of the fully qualified class name,
-     *       in JVM format (using / instead of . in package names and $ for inner classes),
-     *       followed by the byte 0 as a terminator, followed by the API version as a byte.
-     * 10. Member entry table. Each member entry consists of the class number (as a short),
-     *      followed by the JVM method/field signature, encoded as UTF-8, followed by a 0 byte
-     *      signature terminator, followed by the API level as a byte.
-     * <p>
-     * TODO: Pack the offsets: They increase by a small amount for each entry, so no need
-     * to spend 4 bytes on each. These will need to be processed when read back in anyway,
-     * so consider storing the offset -deltas- as single bytes and adding them up cumulatively
-     * in readData().
-     * </pre>
-     */
-    private void readData() {
-        if (!mBinaryFile.exists()) {
-            mClient.log(null, "%1$s does not exist", mBinaryFile);
-            return;
-        }
-        long start = System.currentTimeMillis();
-        try {
-            MappedByteBuffer buffer = Files.map(mBinaryFile, MapMode.READ_ONLY);
-            assert buffer.order() == ByteOrder.BIG_ENDIAN;
-
-            // First skip the header
-            byte[] expectedHeader = FILE_HEADER.getBytes(Charsets.US_ASCII);
-            buffer.rewind();
-            for (int offset = 0; offset < expectedHeader.length; offset++) {
-                if (expectedHeader[offset] != buffer.get()) {
-                    mClient.log(null, "Incorrect file header: not an API database cache " +
-                            "file, or a corrupt cache file");
-                    return;
-                }
-            }
-
-            // Read in the format number
-            if (buffer.get() != BINARY_FORMAT_VERSION) {
-                // Force regeneration of new binary data with up to date format
-                if (createCache(mClient, mXmlFile, mBinaryFile)) {
-                    readData(); // Recurse
-                }
-
-                return;
-            }
-
-            mClassCount = buffer.getInt();
-            int methodCount = buffer.getInt();
-
-            int javaPackageCount = buffer.getInt();
-            // Read in the Java packages
-            mJavaPackages = new String[javaPackageCount];
-            for (int i = 0; i < javaPackageCount; i++) {
-                int count = UnsignedBytes.toInt(buffer.get());
-                byte[] bytes = new byte[count];
-                buffer.get(bytes, 0, count);
-                mJavaPackages[i] = new String(bytes, Charsets.UTF_8);
-            }
-
-            // Read in the class table indices;
-            int count = mClassCount + methodCount;
-            int[] offsets = new int[count];
-
-            // Another idea: I can just store the DELTAS in the file (and add them up
-            // when reading back in) such that it takes just ONE byte instead of four!
-
-            for (int i = 0; i < count; i++) {
-                offsets[i] = buffer.getInt();
-            }
-
-            // No need to read in the rest -- we'll just keep the whole byte array in memory
-            // TODO: Make this code smarter/more efficient.
-            int size = buffer.limit();
-            byte[] b = new byte[size];
-            buffer.rewind();
-            buffer.get(b);
-            mData = b;
-            mIndices = offsets;
-
-            // TODO: We only need to keep the data portion here since we've initialized
-            // the offset array separately.
-            // TODO: Investigate (profile) accessing the byte buffer directly instead of
-            // accessing a byte array.
-        } catch (Throwable e) {
-            mClient.log(null, "Failure reading binary cache file %1$s", mBinaryFile.getPath());
-            mClient.log(null, "Please delete the file and restart the IDE/lint: %1$s",
-                    mBinaryFile.getPath());
-            mClient.log(e, null);
-        }
-        if (WRITE_STATS) {
-            long end = System.currentTimeMillis();
-            System.out.println("\nRead API database in " + (end - start)
-                    + " milliseconds.");
-            System.out.println("Size of data table: " + mData.length + " bytes ("
-                    + Integer.toString(mData.length / 1024) + "k)\n");
-        }
-    }
-
-    /** See the {@link #readData()} for documentation on the data format. */
-    private static void writeDatabase(File file, Api info) throws IOException {
-        /*
-         * 1. A file header, which is the exact contents of {@link FILE_HEADER} encoded
-         *     as ASCII characters. The purpose of the header is to identify what the file
-         *     is for, for anyone attempting to open the file.
-         * 2. A file version number. If the binary file does not match the reader's expected
-         *     version, it can ignore it (and regenerate the cache from XML).
-         */
-        Map<String, ApiClass> classMap = info.getClasses();
-        // Write the class table
-
-        List<String> classes = new ArrayList<String>(classMap.size());
-        Map<ApiClass, List<String>> memberMap =
-                Maps.newHashMapWithExpectedSize(classMap.size());
-        int memberCount = 0;
-        Set<String> javaPackageSet = Sets.newHashSetWithExpectedSize(70);
-        for (Map.Entry<String, ApiClass> entry : classMap.entrySet()) {
-            String className = entry.getKey();
-            ApiClass apiClass = entry.getValue();
-
-            if (className.startsWith("java/")               //$NON-NLS-1$
-                    || className.startsWith("javax/")) {    //$NON-NLS-1$
-                String pkg = apiClass.getPackage();
-                javaPackageSet.add(pkg);
-            }
-
-            if (!isRelevantOwner(className)) {
-                System.out.println("Warning: The isRelevantOwner method does not pass "
-                        + className);
-            }
-
-            Set<String> allMethods = apiClass.getAllMethods(info);
-            Set<String> allFields = apiClass.getAllFields(info);
-
-            // Strip out all members that have been supported since version 1.
-            // This makes the database *much* leaner (down from about 4M to about
-            // 1.7M), and this just fills the table with entries that ultimately
-            // don't help the API checker since it just needs to know if something
-            // requires a version *higher* than the minimum. If in the future the
-            // database needs to answer queries about whether a method is public
-            // or not, then we'd need to put this data back in.
-            List<String> members = new ArrayList<String>(allMethods.size() + allFields.size());
-            for (String member : allMethods) {
-
-                Integer since = apiClass.getMethod(member, info);
-                if (since == null) {
-                    assert false : className + ':' + member;
-                    since = 1;
-                }
-                if (since != 1) {
-                    members.add(member);
-                }
-            }
-
-            // Strip out all members that have been supported since version 1.
-            // This makes the database *much* leaner (down from about 4M to about
-            // 1.7M), and this just fills the table with entries that ultimately
-            // don't help the API checker since it just needs to know if something
-            // requires a version *higher* than the minimum. If in the future the
-            // database needs to answer queries about whether a method is public
-            // or not, then we'd need to put this data back in.
-            for (String member : allFields) {
-                Integer since = apiClass.getField(member, info);
-                if (since == null) {
-                    assert false : className + ':' + member;
-                    since = 1;
-                }
-                if (since != 1) {
-                    members.add(member);
-                }
-            }
-
-            // Only include classes that have one or more members requiring version 2 or higher:
-            if (!members.isEmpty()) {
-                classes.add(className);
-                memberMap.put(apiClass, members);
-                memberCount += members.size();
-            }
-        }
-        Collections.sort(classes);
-
-        List<String> javaPackages = Lists.newArrayList(javaPackageSet);
-        Collections.sort(javaPackages);
-        int javaPackageCount = javaPackages.size();
-
-        int entryCount = classMap.size() + memberCount;
-        int capacity = entryCount * BYTES_PER_ENTRY;
-        ByteBuffer buffer = ByteBuffer.allocate(capacity);
-        buffer.order(ByteOrder.BIG_ENDIAN);
-        //  1. A file header, which is the exact contents of {@link FILE_HEADER} encoded
-        //      as ASCII characters. The purpose of the header is to identify what the file
-        //      is for, for anyone attempting to open the file.
-
-        buffer.put(FILE_HEADER.getBytes(Charsets.US_ASCII));
-
-        //  2. A file version number. If the binary file does not match the reader's expected
-        //      version, it can ignore it (and regenerate the cache from XML).
-        buffer.put((byte) BINARY_FORMAT_VERSION);
-
-        //  3. The number of classes [1 int]
-        buffer.putInt(classes.size());
-
-        //  4. The number of members (across all classes) [1 int].
-        buffer.putInt(memberCount);
-
-        //  5. The number of Java packages [1 int].
-        buffer.putInt(javaPackageCount);
-
-        //  6. The Java package table. There are javaPackage.size() entries, where each entry
-        //     consists of a string length, as a byte, followed by the bytes in the package.
-        //     There is no terminating 0.
-        for (String pkg : javaPackages) {
-            byte[] bytes = pkg.getBytes(Charsets.UTF_8);
-            assert bytes.length < 255 : pkg;
-            buffer.put((byte) bytes.length);
-            buffer.put(bytes);
-        }
-
-        //  7. Class offset table (one integer per class, pointing to the byte offset in the
-        //       file (relative to the beginning of the file) where each class begins.
-        //       The classes are always sorted alphabetically by fully qualified name.
-        int classOffsetTable = buffer.position();
-
-        // Reserve enough room for the offset table here: we will backfill it with pointers
-        // as we're writing out the data structures below
-        for (int i = 0, n = classes.size(); i < n; i++) {
-            buffer.putInt(0);
-        }
-
-        //  8. Member offset table (one integer per member, pointing to the byte offset in the
-        //       file (relative to the beginning of the file) where each member entry begins.
-        //       The members are always sorted alphabetically.
-        int methodOffsetTable = buffer.position();
-        for (int i = 0, n = memberCount; i < n; i++) {
-            buffer.putInt(0);
-        }
-
-        int nextEntry = buffer.position();
-        int nextOffset = classOffsetTable;
-
-        // 9. Class entry table. Each class entry consists of the fully qualified class name,
-        //      in JVM format (using / instead of . in package names and $ for inner classes),
-        //      followed by the byte 0 as a terminator, followed by the API version as a byte.
-        for (String clz : classes) {
-            buffer.position(nextOffset);
-            buffer.putInt(nextEntry);
-            nextOffset = buffer.position();
-            buffer.position(nextEntry);
-            buffer.put(clz.getBytes(Charsets.UTF_8));
-            buffer.put((byte) 0);
-
-            ApiClass apiClass = classMap.get(clz);
-            assert apiClass != null : clz;
-            int since = apiClass.getSince();
-            assert since == UnsignedBytes.toInt((byte) since) : since; // make sure it fits
-            buffer.put((byte) since);
-
-            nextEntry = buffer.position();
-        }
-
-        //  10. Member entry table. Each member entry consists of the class number (as a short),
-        //       followed by the JVM method/field signature, encoded as UTF-8, followed by a 0 byte
-        //       signature terminator, followed by the API level as a byte.
-        assert nextOffset == methodOffsetTable;
-
-        for (int classNumber = 0, n = classes.size(); classNumber < n; classNumber++) {
-            String clz = classes.get(classNumber);
-            ApiClass apiClass = classMap.get(clz);
-            assert apiClass != null : clz;
-            List<String> members = memberMap.get(apiClass);
-            Collections.sort(members);
-
-            for (String member : members) {
-                buffer.position(nextOffset);
-                buffer.putInt(nextEntry);
-                nextOffset = buffer.position();
-                buffer.position(nextEntry);
-
-                Integer since;
-                if (member.indexOf('(') != -1) {
-                    since = apiClass.getMethod(member, info);
-                } else {
-                    since = apiClass.getField(member, info);
-                }
-                if (since == null) {
-                    assert false : clz + ':' + member;
-                    since = 1;
-                }
-
-                assert classNumber == (short) classNumber;
-                buffer.putShort((short) classNumber);
-                byte[] signature = member.getBytes(Charsets.UTF_8);
-                for (int i = 0; i < signature.length; i++) {
-                    // Make sure all signatures are really just simple ASCII
-                    byte b = signature[i];
-                    assert b == (b & 0x7f) : member;
-                    buffer.put(b);
-                    // Skip types on methods
-                    if (b == (byte) ')') {
-                        break;
-                    }
-                }
-                buffer.put((byte) 0);
-                int api = since;
-                assert api == UnsignedBytes.toInt((byte) api);
-                //assert api >= 1 && api < 0xFF; // max that fits in a byte
-                buffer.put((byte) api);
-                nextEntry = buffer.position();
-            }
-        }
-
-        int size = buffer.position();
-        assert size <= buffer.limit();
-        buffer.mark();
-
-        if (WRITE_STATS) {
-            System.out.println("Wrote " + classes.size() + " classes and "
-                    + memberCount + " member entries");
-            System.out.print("Actual binary size: " + size + " bytes");
-            System.out.println(String.format(" (%.1fM)", size/(1024*1024.f)));
-
-            System.out.println("Allocated size: " + (entryCount * BYTES_PER_ENTRY) + " bytes");
-            System.out.println("Required bytes per entry: " + (size/ entryCount) + " bytes");
-        }
-
-        // Now dump this out as a file
-        // There's probably an API to do this more efficiently; TODO: Look into this.
-        byte[] b = new byte[size];
-        buffer.rewind();
-        buffer.get(b);
-        if (file.exists()) {
-            file.delete();
-        }
-        FileOutputStream output = Files.newOutputStreamSupplier(file).getOutput();
-        output.write(b);
-        output.close();
-    }
-
-    // For debugging only
-    private String dumpEntry(int offset) {
-        if (DEBUG_SEARCH) {
-            StringBuilder sb = new StringBuilder(200);
-            for (int i = offset; i < mData.length; i++) {
-                if (mData[i] == 0) {
-                    break;
-                }
-                char c = (char) UnsignedBytes.toInt(mData[i]);
-                sb.append(c);
-            }
-
-            return sb.toString();
-        } else {
-            return "<disabled>"; //$NON-NLS-1$
-        }
-    }
-
-    private static int compare(byte[] data, int offset, byte terminator, String s, int max) {
-        int i = offset;
-        int j = 0;
-        for (; j < max; i++, j++) {
-            byte b = data[i];
-            char c = s.charAt(j);
-            // TODO: Check somewhere that the strings are purely in the ASCII range; if not
-            // they're not a match in the database
-            byte cb = (byte) c;
-            int delta = b - cb;
-            if (delta != 0) {
-                return delta;
-            }
-        }
-
-        return data[i] - terminator;
-    }
-
-    /**
-     * Quick determination whether a given class name is possibly interesting; this
-     * is a quick package prefix check to determine whether we need to consider
-     * the class at all. This let's us do less actual searching for the vast majority
-     * of APIs (in libraries, application code etc) that have nothing to do with the
-     * APIs in our packages.
-     * @param name the class name in VM format (e.g. using / instead of .)
-     * @return true if the owner is <b>possibly</b> relevant
-     */
-    public boolean isRelevantClass(String name) {
-        // TODO: Add quick switching here. This is tied to the database file so if
-        // we end up with unexpected prefixes there, this could break. For that reason,
-        // for now we consider everything relevant.
-        return true;
-    }
-
-    /**
-     * Returns the API version required by the given class reference,
-     * or -1 if this is not a known API class. Note that it may return -1
-     * for classes introduced in version 1; internally the database only
-     * stores version data for version 2 and up.
-     *
-     * @param className the internal name of the class, e.g. its
-     *            fully qualified name (as returned by Class.getName(), but with
-     *            '.' replaced by '/'.
-     * @return the minimum API version the method is supported for, or -1 if
-     *         it's unknown <b>or version 1</b>.
-     */
-    public int getClassVersion(@NonNull String className) {
-        if (!isRelevantClass(className)) {
-            return -1;
-        }
-
-        if (mData != null) {
-            int classNumber = findClass(className);
-            if (classNumber != -1) {
-                int offset = mIndices[classNumber];
-                while (mData[offset] != 0) {
-                    offset++;
-                }
-                offset++;
-                return UnsignedBytes.toInt(mData[offset]);
-            }
-        }  else {
-           ApiClass clz = mInfo.getClass(className);
-            if (clz != null) {
-                int since = clz.getSince();
-                if (since == Integer.MAX_VALUE) {
-                    since = -1;
-                }
-                return since;
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Returns the API version required by the given method call. The method is
-     * referred to by its {@code owner}, {@code name} and {@code desc} fields.
-     * If the method is unknown it returns -1. Note that it may return -1 for
-     * classes introduced in version 1; internally the database only stores
-     * version data for version 2 and up.
-     *
-     * @param owner the internal name of the method's owner class, e.g. its
-     *            fully qualified name (as returned by Class.getName(), but with
-     *            '.' replaced by '/'.
-     * @param name the method's name
-     * @param desc the method's descriptor - see {@link org.objectweb.asm.Type}
-     * @return the minimum API version the method is supported for, or -1 if
-     *         it's unknown <b>or version 1</b>.
-     */
-    public int getCallVersion(
-            @NonNull String owner,
-            @NonNull String name,
-            @NonNull String desc) {
-        if (!isRelevantClass(owner)) {
-            return -1;
-        }
-
-        if (mData != null) {
-            int classNumber = findClass(owner);
-            if (classNumber != -1) {
-                return findMember(classNumber, name, desc);
-            }
-        }  else {
-           ApiClass clz = mInfo.getClass(owner);
-            if (clz != null) {
-                String signature = name + desc;
-                int since = clz.getMethod(signature, mInfo);
-                if (since == Integer.MAX_VALUE) {
-                    since = -1;
-                }
-                return since;
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Returns the API version required to access the given field, or -1 if this
-     * is not a known API method. Note that it may return -1 for classes
-     * introduced in version 1; internally the database only stores version data
-     * for version 2 and up.
-     *
-     * @param owner the internal name of the method's owner class, e.g. its
-     *            fully qualified name (as returned by Class.getName(), but with
-     *            '.' replaced by '/'.
-     * @param name the method's name
-     * @return the minimum API version the method is supported for, or -1 if
-     *         it's unknown <b>or version 1</b>
-     */
-    public int getFieldVersion(
-            @NonNull String owner,
-            @NonNull String name) {
-        if (!isRelevantClass(owner)) {
-            return -1;
-        }
-
-        if (mData != null) {
-            int classNumber = findClass(owner);
-            if (classNumber != -1) {
-                return findMember(classNumber, name, null);
-            }
-        }  else {
-            ApiClass clz = mInfo.getClass(owner);
-            if (clz != null) {
-                int since = clz.getField(name, mInfo);
-                if (since == Integer.MAX_VALUE) {
-                    since = -1;
-                }
-                return since;
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Returns true if the given owner (in VM format) is relevant to the database.
-     * This allows quick filtering out of owners that won't return any data
-     * for the various {@code #getFieldVersion} etc methods.
-     *
-     * @param owner the owner to look up
-     * @return true if the owner might be relevant to the API database
-     */
-    public static boolean isRelevantOwner(@NonNull String owner) {
-        if (owner.startsWith("java")) {                   //$NON-NLS-1$ // includes javax/
-            return true;
-        }
-        if (owner.startsWith(ANDROID_PKG)) {
-            if (owner.startsWith("/support/", 7)) {       //$NON-NLS-1$
-                return false;
-            }
-            return true;
-        } else if (owner.startsWith("org/")) {            //$NON-NLS-1$
-            if (owner.startsWith("xml", 4)                //$NON-NLS-1$
-                    || owner.startsWith("w3c/", 4)        //$NON-NLS-1$
-                    || owner.startsWith("json/", 4)       //$NON-NLS-1$
-                    || owner.startsWith("apache/", 4)) {  //$NON-NLS-1$
-                return true;
-            }
-        } else if (owner.startsWith("com/")) {            //$NON-NLS-1$
-            if (owner.startsWith("google/", 4)            //$NON-NLS-1$
-                    || owner.startsWith("android/", 4)) { //$NON-NLS-1$
-                return true;
-            }
-        } else if (owner.startsWith("junit")              //$NON-NLS-1$
-                    || owner.startsWith("dalvik")) {      //$NON-NLS-1$
-            return true;
-        }
-
-        return false;
-    }
-
-
-    /**
-     * Returns true if the given owner (in VM format) is a valid Java package supported
-     * in any version of Android.
-     *
-     * @param owner the package, in VM format
-     * @return true if the package is included in one or more versions of Android
-     */
-    public boolean isValidJavaPackage(@NonNull String owner) {
-        int packageLength = owner.lastIndexOf('/');
-        if (packageLength == -1) {
-            return false;
-        }
-
-        // The index array contains class indexes from 0 to classCount and
-        //   member indices from classCount to mIndices.length.
-        int low = 0;
-        int high = mJavaPackages.length - 1;
-        while (low <= high) {
-            int middle = (low + high) >>> 1;
-            int offset = middle;
-
-            if (DEBUG_SEARCH) {
-                System.out.println("Comparing string " + owner + " with entry at " + offset
-                        + ": " + mJavaPackages[offset]);
-            }
-
-            // Compare the api info at the given index.
-            int compare = comparePackage(mJavaPackages[offset], owner, packageLength);
-            if (compare == 0) {
-                return true;
-            }
-
-            if (compare < 0) {
-                low = middle + 1;
-            } else if (compare > 0) {
-                high = middle - 1;
-            } else {
-                assert false; // compare == 0 already handled above
-                return false;
-            }
-        }
-
-        return false;
-    }
-
-    private static int comparePackage(String s1, String s2, int max) {
-        for (int i = 0; i < max; i++) {
-            if (i == s1.length()) {
-                return -1;
-            }
-            char c1 = s1.charAt(i);
-            char c2 = s2.charAt(i);
-            if (c1 != c2) {
-                return c1 - c2;
-            }
-        }
-
-        if (s1.length() > max) {
-            return 1;
-        }
-
-        return 0;
-    }
-
-    /** Returns the class number of the given class, or -1 if it is unknown */
-    private int findClass(@NonNull String owner) {
-        assert owner.indexOf('.') == -1 : "Should use / instead of . in owner: " + owner;
-
-        // The index array contains class indexes from 0 to classCount and
-        //   member indices from classCount to mIndices.length.
-        int low = 0;
-        int high = mClassCount - 1;
-        // Compare the api info at the given index.
-        int classNameLength = owner.length();
-        while (low <= high) {
-            int middle = (low + high) >>> 1;
-            int offset = mIndices[middle];
-
-            if (DEBUG_SEARCH) {
-                System.out.println("Comparing string " + owner + " with entry at " + offset
-                        + ": " + dumpEntry(offset));
-            }
-
-            int compare = compare(mData, offset, (byte) 0, owner, classNameLength);
-            if (compare == 0) {
-                return middle;
-            }
-
-            if (compare < 0) {
-                low = middle + 1;
-            } else if (compare > 0) {
-                high = middle - 1;
-            } else {
-                assert false; // compare == 0 already handled above
-                return -1;
-            }
-        }
-
-        return -1;
-    }
-
-    private int findMember(int classNumber, @NonNull String name, @Nullable String desc) {
-        // The index array contains class indexes from 0 to classCount and
-        // member indices from classCount to mIndices.length.
-        int low = mClassCount;
-        int high = mIndices.length - 1;
-        while (low <= high) {
-            int middle = (low + high) >>> 1;
-            int offset = mIndices[middle];
-
-            if (DEBUG_SEARCH) {
-                System.out.println("Comparing string " + (name + ';' + desc) +
-                        " with entry at " + offset + ": " + dumpEntry(offset));
-            }
-
-            // Check class number: read short. The byte data is always big endian.
-            int entryClass = (mData[offset++] & 0xFF) << 8 | (mData[offset++] & 0xFF);
-            int compare = entryClass - classNumber;
-            if (compare == 0) {
-                if (desc != null) {
-                    // Method
-                    int nameLength = name.length();
-                    compare = compare(mData, offset, (byte) '(', name, nameLength);
-                    if (compare == 0) {
-                        offset += nameLength;
-                        int argsEnd = desc.indexOf(')');
-                        // Only compare up to the ) -- after that we have a return value in the
-                        // input description, which isn't there in the database
-                        compare = compare(mData, offset, (byte) ')', desc, argsEnd);
-                        if (compare == 0) {
-                            offset += argsEnd + 1;
-
-                            if (mData[offset++] == 0) {
-                                // Yes, terminated argument list: get the API level
-                                return UnsignedBytes.toInt(mData[offset]);
-                            }
-                        }
-                    }
-                } else {
-                    // Field
-                    int nameLength = name.length();
-                    compare = compare(mData, offset, (byte) 0, name, nameLength);
-                    if (compare == 0) {
-                        offset += nameLength;
-                        if (mData[offset++] == 0) {
-                            // Yes, terminated argument list: get the API level
-                            return UnsignedBytes.toInt(mData[offset]);
-                        }
-                    }
-                }
-            }
-
-            if (compare < 0) {
-                low = middle + 1;
-            } else if (compare > 0) {
-                high = middle - 1;
-            } else {
-                assert false; // compare == 0 already handled above
-                return -1;
-            }
-        }
-
-        return -1;
-    }
-
-    /** Clears out any existing lookup instances */
-    @VisibleForTesting
-    static void dispose() {
-        sInstance.clear();
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ApiParser.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ApiParser.java
deleted file mode 100644
index b3c2f2a..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ApiParser.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Parser for the simplified XML API format version 1.
- */
-public class ApiParser extends DefaultHandler {
-
-    private static final String NODE_API = "api";
-    private static final String NODE_CLASS = "class";
-    private static final String NODE_FIELD = "field";
-    private static final String NODE_METHOD = "method";
-    private static final String NODE_EXTENDS = "extends";
-    private static final String NODE_IMPLEMENTS = "implements";
-
-    private static final String ATTR_NAME = "name";
-    private static final String ATTR_SINCE = "since";
-
-    private final Map<String, ApiClass> mClasses = new HashMap<String, ApiClass>();
-
-    private ApiClass mCurrentClass;
-
-    ApiParser() {
-    }
-
-    Map<String, ApiClass> getClasses() {
-        return mClasses;
-    }
-
-    @Override
-    public void startElement(String uri, String localName, String qName, Attributes attributes)
-            throws SAXException {
-
-        if (localName == null || localName.isEmpty()) {
-            localName = qName;
-        }
-
-        try {
-            if (NODE_API.equals(localName)) {
-                // do nothing.
-
-            } else if (NODE_CLASS.equals(localName)) {
-                String name = attributes.getValue(ATTR_NAME);
-                int since = Integer.parseInt(attributes.getValue(ATTR_SINCE));
-
-                mCurrentClass = addClass(name, since);
-
-            } else if (NODE_EXTENDS.equals(localName)) {
-                String name = attributes.getValue(ATTR_NAME);
-                int since = getSince(attributes);
-
-                mCurrentClass.addSuperClass(name, since);
-
-            } else if (NODE_IMPLEMENTS.equals(localName)) {
-                String name = attributes.getValue(ATTR_NAME);
-                int since = getSince(attributes);
-
-                mCurrentClass.addInterface(name, since);
-
-            } else if (NODE_METHOD.equals(localName)) {
-                String name = attributes.getValue(ATTR_NAME);
-                int since = getSince(attributes);
-
-                mCurrentClass.addMethod(name, since);
-
-            } else if (NODE_FIELD.equals(localName)) {
-                String name = attributes.getValue(ATTR_NAME);
-                int since = getSince(attributes);
-
-                mCurrentClass.addField(name, since);
-
-            }
-
-        } finally {
-            super.startElement(uri, localName, qName, attributes);
-        }
-    }
-
-    private ApiClass addClass(String name, int apiLevel) {
-        ApiClass theClass = mClasses.get(name);
-        if (theClass == null) {
-            theClass = new ApiClass(name, apiLevel);
-            mClasses.put(name, theClass);
-        }
-
-        return theClass;
-    }
-
-    private int getSince(Attributes attributes) {
-        int since = mCurrentClass.getSince();
-        String sinceAttr = attributes.getValue(ATTR_SINCE);
-
-        if (sinceAttr != null) {
-            since = Integer.parseInt(sinceAttr);
-        }
-
-        return since;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ArraySizeDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ArraySizeDetector.java
deleted file mode 100644
index 8bbcffb..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ArraySizeDetector.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.TAG_ARRAY;
-import static com.android.SdkConstants.TAG_INTEGER_ARRAY;
-import static com.android.SdkConstants.TAG_STRING_ARRAY;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.client.api.LintDriver;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.android.utils.Pair;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Checks for arrays with inconsistent item counts
- */
-public class ArraySizeDetector extends ResourceXmlDetector {
-
-    /** Are there differences in how many array elements are declared? */
-    public static final Issue INCONSISTENT = Issue.create(
-            "InconsistentArrays", //$NON-NLS-1$
-            "Checks for inconsistencies in the number of elements in arrays",
-            "When an array is translated in a different locale, it should normally have " +
-            "the same number of elements as the original array. When adding or removing " +
-            "elements to an array, it is easy to forget to update all the locales, and this " +
-            "lint warning finds inconsistencies like these.\n" +
-            "\n" +
-            "Note however that there may be cases where you really want to declare a " +
-            "different number of array items in each configuration (for example where " +
-            "the array represents available options, and those options differ for " +
-            "different layout orientations and so on), so use your own judgement to " +
-            "decide if this is really an error.\n" +
-            "\n" +
-            "You can suppress this error type if it finds false errors in your project.",
-            Category.CORRECTNESS,
-            7,
-            Severity.WARNING,
-            ArraySizeDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    private Multimap<File, Pair<String, Integer>> mFileToArrayCount;
-
-    /** Locations for each array name. Populated during phase 2, if necessary */
-    private Map<String, Location> mLocations;
-
-    /** Error messages for each array name. Populated during phase 2, if necessary */
-    private Map<String, String> mDescriptions;
-
-    /** Constructs a new {@link ArraySizeDetector} */
-    public ArraySizeDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.VALUES;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                TAG_ARRAY,
-                TAG_STRING_ARRAY,
-                TAG_INTEGER_ARRAY
-        );
-    }
-
-    @Override
-    public void beforeCheckProject(@NonNull Context context) {
-        if (context.getPhase() == 1) {
-            mFileToArrayCount = ArrayListMultimap.create(30, 5);
-        }
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (context.getPhase() == 1) {
-            // Check that all arrays for the same name have the same number of translations
-
-            Set<String> alreadyReported = new HashSet<String>();
-            Map<String, Integer> countMap = new HashMap<String, Integer>();
-            Map<String, File> fileMap = new HashMap<String, File>();
-
-            // Process the file in sorted file order to ensure stable output
-            List<File> keys = new ArrayList<File>(mFileToArrayCount.keySet());
-            Collections.sort(keys);
-
-            for (File file : keys) {
-                Collection<Pair<String, Integer>> pairs = mFileToArrayCount.get(file);
-                for (Pair<String, Integer> pair : pairs) {
-                    String name = pair.getFirst();
-
-                    if (alreadyReported.contains(name)) {
-                        continue;
-                    }
-                    Integer count = pair.getSecond();
-
-                    Integer current = countMap.get(name);
-                    if (current == null) {
-                        countMap.put(name, count);
-                        fileMap.put(name, file);
-                    } else if (!count.equals(current)) {
-                        alreadyReported.add(name);
-
-                        if (mLocations == null) {
-                            mLocations = new HashMap<String, Location>();
-                            mDescriptions = new HashMap<String, String>();
-                        }
-                        mLocations.put(name, null);
-
-                        String thisName = file.getParentFile().getName() + File.separator
-                                + file.getName();
-                        File otherFile = fileMap.get(name);
-                        String otherName = otherFile.getParentFile().getName() + File.separator
-                                + otherFile.getName();
-                        String message = String.format(
-                             "Array %1$s has an inconsistent number of items (%2$d in %3$s, %4$d in %5$s)",
-                             name, count, thisName, current, otherName);
-                         mDescriptions.put(name,  message);
-                    }
-                }
-            }
-
-            if (mLocations != null) {
-                // Request another scan through the resources such that we can
-                // gather the actual locations
-                context.getDriver().requestRepeat(this, Scope.ALL_RESOURCES_SCOPE);
-            }
-            mFileToArrayCount = null;
-        } else {
-            if (mLocations != null) {
-                List<String> names = new ArrayList<String>(mLocations.keySet());
-                Collections.sort(names);
-                for (String name : names) {
-                    Location location = mLocations.get(name);
-                    // We were prepending locations, but we want to prefer the base folders
-                    location = Location.reverse(location);
-
-                    // Make sure we still have a conflict, in case one or more of the
-                    // elements were marked with tools:ignore
-                    int count = -1;
-                    LintDriver driver = context.getDriver();
-                    boolean foundConflict = false;
-                    Location curr;
-                    for (curr = location; curr != null; curr = curr.getSecondary()) {
-                        Object clientData = curr.getClientData();
-                        if (clientData instanceof Node) {
-                            Node node = (Node) clientData;
-                            if (driver.isSuppressed(INCONSISTENT, node)) {
-                                continue;
-                            }
-                            int newCount = LintUtils.getChildCount(node);
-                            if (newCount != count) {
-                                if (count == -1) {
-                                    count = newCount; // first number encountered
-                                } else {
-                                    foundConflict = true;
-                                    break;
-                                }
-                            }
-                        } else {
-                            foundConflict = true;
-                            break;
-                        }
-                    }
-
-                    // Through one or more tools:ignore, there is no more conflict so
-                    // ignore this element
-                    if (!foundConflict) {
-                        continue;
-                    }
-
-                    String message = mDescriptions.get(name);
-                    context.report(INCONSISTENT, location, message, null);
-                }
-            }
-
-            mLocations = null;
-            mDescriptions = null;
-        }
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        int phase = context.getPhase();
-
-        Attr attribute = element.getAttributeNode(ATTR_NAME);
-        if (attribute == null || attribute.getValue().isEmpty()) {
-            if (phase != 1) {
-                return;
-            }
-            context.report(INCONSISTENT, element, context.getLocation(element),
-                String.format("Missing name attribute in %1$s declaration", element.getTagName()),
-                null);
-        } else {
-            String name = attribute.getValue();
-            if (phase == 1) {
-                if (context.getProject().getReportIssues()) {
-                    int childCount = LintUtils.getChildCount(element);
-                    mFileToArrayCount.put(context.file, Pair.of(name, childCount));
-                }
-            } else {
-                assert phase == 2;
-                if (mLocations.containsKey(name)) {
-                    if (context.getDriver().isSuppressed(INCONSISTENT, element)) {
-                        return;
-                    }
-                    Location location = context.getLocation(element);
-                    location.setClientData(element);
-                    location.setMessage(String.format("Declaration with array size (%1$d)",
-                                    LintUtils.getChildCount(element)));
-                    location.setSecondary(mLocations.get(name));
-                    mLocations.put(name, location);
-                }
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/BuiltinIssueRegistry.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/BuiltinIssueRegistry.java
deleted file mode 100644
index 90ebfd8..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/BuiltinIssueRegistry.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.tools.lint.detector.api.LintUtils.assertionsEnabled;
-import static com.android.tools.lint.detector.api.LintUtils.endsWith;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.prefs.AndroidLocation;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.tools.lint.client.api.IssueRegistry;
-import com.android.tools.lint.detector.api.Issue;
-import com.google.common.annotations.Beta;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.jar.Attributes;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-
-/** Registry which provides a list of checks to be performed on an Android project */
-public class BuiltinIssueRegistry extends IssueRegistry {
-    /** Folder name in the .android dir where additional detector jars are found */
-    private static final String LINT_FOLDER = "lint"; //$NON-NLS-1$
-
-    /**
-     * Manifest constant for declaring an issue provider. Example:
-     * Lint-Registry: foo.bar.CustomIssueRegistry
-     */
-    private static final String MF_LINT_REGISTRY = "Lint-Registry"; //$NON-NLS-1$
-
-    private static final List<Issue> sIssues;
-
-    static {
-        final int initialCapacity = 140;
-        List<Issue> issues = new ArrayList<Issue>(initialCapacity);
-
-        issues.add(AccessibilityDetector.ISSUE);
-        issues.add(LabelForDetector.ISSUE);
-        issues.add(MathDetector.ISSUE);
-        issues.add(FieldGetterDetector.ISSUE);
-        issues.add(SdCardDetector.ISSUE);
-        issues.add(ApiDetector.UNSUPPORTED);
-        issues.add(ApiDetector.INLINED);
-        issues.add(ApiDetector.OVERRIDE);
-        issues.add(InvalidPackageDetector.ISSUE);
-        issues.add(DuplicateIdDetector.CROSS_LAYOUT);
-        issues.add(DuplicateIdDetector.WITHIN_LAYOUT);
-        issues.add(DuplicateResourceDetector.ISSUE);
-        issues.add(WrongIdDetector.UNKNOWN_ID);
-        issues.add(WrongIdDetector.UNKNOWN_ID_LAYOUT);
-        issues.add(StateListDetector.ISSUE);
-        issues.add(StyleCycleDetector.ISSUE);
-        issues.add(InefficientWeightDetector.INEFFICIENT_WEIGHT);
-        issues.add(InefficientWeightDetector.NESTED_WEIGHTS);
-        issues.add(InefficientWeightDetector.BASELINE_WEIGHTS);
-        issues.add(InefficientWeightDetector.WRONG_0DP);
-        issues.add(InefficientWeightDetector.ORIENTATION);
-        issues.add(ScrollViewChildDetector.ISSUE);
-        issues.add(DeprecationDetector.ISSUE);
-        issues.add(ObsoleteLayoutParamsDetector.ISSUE);
-        issues.add(MergeRootFrameLayoutDetector.ISSUE);
-        issues.add(NestedScrollingWidgetDetector.ISSUE);
-        issues.add(ChildCountDetector.SCROLLVIEW_ISSUE);
-        issues.add(ChildCountDetector.ADAPTERVIEW_ISSUE);
-        issues.add(UseCompoundDrawableDetector.ISSUE);
-        issues.add(UselessViewDetector.USELESS_PARENT);
-        issues.add(UselessViewDetector.USELESS_LEAF);
-        issues.add(TooManyViewsDetector.TOO_MANY);
-        issues.add(TooManyViewsDetector.TOO_DEEP);
-        issues.add(GridLayoutDetector.ISSUE);
-        issues.add(OverrideDetector.ISSUE);
-        issues.add(OnClickDetector.ISSUE);
-        issues.add(ViewTagDetector.ISSUE);
-        issues.add(LocaleDetector.STRING_LOCALE);
-        issues.add(LocaleDetector.DATE_FORMAT);
-        issues.add(RegistrationDetector.ISSUE);
-        issues.add(MissingClassDetector.MISSING);
-        issues.add(MissingClassDetector.INSTANTIATABLE);
-        issues.add(MissingClassDetector.INNERCLASS);
-        issues.add(MissingIdDetector.ISSUE);
-        issues.add(WrongCaseDetector.WRONGCASE);
-        issues.add(HandlerDetector.ISSUE);
-        issues.add(FragmentDetector.ISSUE);
-        issues.add(TranslationDetector.EXTRA);
-        issues.add(TranslationDetector.MISSING);
-        issues.add(HardcodedValuesDetector.ISSUE);
-        issues.add(Utf8Detector.ISSUE);
-        issues.add(DosLineEndingDetector.ISSUE);
-        issues.add(CommentDetector.EASTEREGG);
-        issues.add(CommentDetector.STOPSHIP);
-        issues.add(ProguardDetector.WRONGKEEP);
-        issues.add(ProguardDetector.SPLITCONFIG);
-        issues.add(PxUsageDetector.PX_ISSUE);
-        issues.add(PxUsageDetector.DP_ISSUE);
-        issues.add(PxUsageDetector.IN_MM_ISSUE);
-        issues.add(PxUsageDetector.SMALL_SP_ISSUE);
-        issues.add(TextFieldDetector.ISSUE);
-        issues.add(TextViewDetector.ISSUE);
-        issues.add(TextViewDetector.SELECTABLE);
-        issues.add(UnusedResourceDetector.ISSUE);
-        issues.add(UnusedResourceDetector.ISSUE_IDS);
-        issues.add(ExtraTextDetector.ISSUE);
-        issues.add(PrivateResourceDetector.ISSUE);
-        issues.add(ArraySizeDetector.INCONSISTENT);
-        issues.add(HardcodedDebugModeDetector.ISSUE);
-        issues.add(ManifestOrderDetector.ORDER);
-        issues.add(ManifestOrderDetector.USES_SDK);
-        issues.add(ManifestOrderDetector.MULTIPLE_USES_SDK);
-        issues.add(ManifestOrderDetector.WRONG_PARENT);
-        issues.add(ManifestOrderDetector.DUPLICATE_ACTIVITY);
-        issues.add(ManifestOrderDetector.TARGET_NEWER);
-        issues.add(ManifestOrderDetector.ALLOW_BACKUP);
-        issues.add(ManifestOrderDetector.UNIQUE_PERMISSION);
-        issues.add(ManifestOrderDetector.SET_VERSION);
-        issues.add(ManifestOrderDetector.ILLEGAL_REFERENCE);
-        issues.add(SecurityDetector.EXPORTED_PROVIDER);
-        issues.add(SecurityDetector.EXPORTED_SERVICE);
-        issues.add(SecurityDetector.EXPORTED_RECEIVER);
-        issues.add(SecurityDetector.OPEN_PROVIDER);
-        issues.add(SecurityDetector.WORLD_READABLE);
-        issues.add(SecurityDetector.WORLD_WRITEABLE);
-        issues.add(SecureRandomDetector.ISSUE);
-        issues.add(IconDetector.GIF_USAGE);
-        issues.add(IconDetector.ICON_DENSITIES);
-        issues.add(IconDetector.ICON_MISSING_FOLDER);
-        issues.add(IconDetector.ICON_DIP_SIZE);
-        issues.add(IconDetector.ICON_EXPECTED_SIZE);
-        issues.add(IconDetector.ICON_LOCATION);
-        issues.add(IconDetector.DUPLICATES_NAMES);
-        issues.add(IconDetector.DUPLICATES_CONFIGURATIONS);
-        issues.add(IconDetector.ICON_NODPI);
-        issues.add(IconDetector.ICON_EXTENSION);
-        issues.add(IconDetector.ICON_COLORS);
-        issues.add(IconDetector.ICON_XML_AND_PNG);
-        issues.add(IconDetector.ICON_LAUNCHER_SHAPE);
-        issues.add(TypographyDetector.DASHES);
-        issues.add(TypographyDetector.QUOTES);
-        issues.add(TypographyDetector.FRACTIONS);
-        issues.add(TypographyDetector.ELLIPSIS);
-        issues.add(TypographyDetector.OTHER);
-        issues.add(ButtonDetector.ORDER);
-        issues.add(ButtonDetector.CASE);
-        issues.add(ButtonDetector.BACKBUTTON);
-        issues.add(ButtonDetector.STYLE);
-        issues.add(DetectMissingPrefix.MISSING_NAMESPACE);
-        issues.add(OverdrawDetector.ISSUE);
-        issues.add(StringFormatDetector.INVALID);
-        issues.add(StringFormatDetector.ARG_COUNT);
-        issues.add(StringFormatDetector.ARG_TYPES);
-        issues.add(TypoDetector.ISSUE);
-        issues.add(ViewTypeDetector.ISSUE);
-        issues.add(WrongImportDetector.ISSUE);
-        issues.add(WrongLocationDetector.ISSUE);
-        issues.add(ViewConstructorDetector.ISSUE);
-        issues.add(NamespaceDetector.CUSTOMVIEW);
-        issues.add(NamespaceDetector.UNUSED);
-        issues.add(NamespaceDetector.TYPO);
-        issues.add(AlwaysShowActionDetector.ISSUE);
-        issues.add(TitleDetector.ISSUE);
-        issues.add(ColorUsageDetector.ISSUE);
-        issues.add(JavaPerformanceDetector.PAINT_ALLOC);
-        issues.add(JavaPerformanceDetector.USE_VALUEOF);
-        issues.add(JavaPerformanceDetector.USE_SPARSEARRAY);
-        issues.add(WakelockDetector.ISSUE);
-        issues.add(CleanupDetector.RECYCLE_RESOURCE);
-        issues.add(CleanupDetector.COMMIT_FRAGMENT);
-        issues.add(SetJavaScriptEnabledDetector.ISSUE);
-        issues.add(ToastDetector.ISSUE);
-        issues.add(SharedPrefsDetector.ISSUE);
-        issues.add(CutPasteDetector.ISSUE);
-        issues.add(NonInternationalizedSmsDetector.ISSUE);
-        issues.add(PrivateKeyDetector.ISSUE);
-        issues.add(AnnotationDetector.ISSUE);
-        issues.add(SystemPermissionsDetector.ISSUE);
-        issues.add(RequiredAttributeDetector.ISSUE);
-        issues.add(WrongCallDetector.ISSUE);
-
-        assert initialCapacity >= issues.size() : issues.size();
-
-        addCustomIssues(issues);
-
-        sIssues = Collections.unmodifiableList(issues);
-
-        // Check that ids are unique
-        if (assertionsEnabled()) {
-            Set<String> ids = new HashSet<String>();
-            for (Issue issue : sIssues) {
-                String id = issue.getId();
-                assert !ids.contains(id) : "Duplicate id " + id; //$NON-NLS-1$
-                ids.add(id);
-            }
-        }
-    }
-
-    /**
-     * Constructs a new {@link BuiltinIssueRegistry}
-     */
-    public BuiltinIssueRegistry() {
-    }
-
-    @NonNull
-    @Override
-    public List<Issue> getIssues() {
-        return sIssues;
-    }
-
-    /**
-     * Add in custom issues registered by the user - via an environment variable
-     * or in the .android/lint directory.
-     */
-    private static void addCustomIssues(List<Issue> issues) {
-        // Look for additional detectors registered by the user, via
-        // (1) an environment variable (useful for build servers etc), and
-        // (2) via jar files in the .android/lint directory
-        Set<File> files = null;
-        try {
-            File lint = new File(AndroidLocation.getFolder() + File.separator + LINT_FOLDER);
-            if (lint.exists()) {
-                File[] list = lint.listFiles();
-                if (list != null) {
-                    for (File jarFile : list) {
-                        if (endsWith(jarFile.getName(), ".jar")) { //$NON-NLS-1$
-                            if (files == null) {
-                                files = new HashSet<File>();
-                            }
-                            files.add(jarFile);
-                            addIssuesFromJar(jarFile, issues);
-                        }
-                    }
-                }
-            }
-        } catch (AndroidLocationException e) {
-            // Ignore -- no android dir, so no rules to load.
-        }
-
-        String lintClassPath = System.getenv("ANDROID_LINT_JARS"); //$NON-NLS-1$
-        if (lintClassPath != null && !lintClassPath.isEmpty()) {
-            String[] paths = lintClassPath.split(File.pathSeparator);
-            for (String path : paths) {
-                File jarFile = new File(path);
-                if (jarFile.exists() && (files == null || !files.contains(jarFile))) {
-                    addIssuesFromJar(jarFile, issues);
-                }
-            }
-        }
-    }
-
-    /** Add the issues found in the given jar file into the given list of issues */
-    private static void addIssuesFromJar(File jarFile, List<Issue> issues) {
-        JarFile jarfile = null;
-        try {
-            jarfile = new JarFile(jarFile);
-            Manifest manifest = jarfile.getManifest();
-            Attributes attrs = manifest.getMainAttributes();
-            Object object = attrs.get(new Attributes.Name(MF_LINT_REGISTRY));
-            if (object instanceof String) {
-                String className = (String) object;
-
-                // Make a class loader for this jar
-                try {
-                    URL url = jarFile.toURI().toURL();
-                    URLClassLoader loader = new URLClassLoader(new URL[] { url },
-                            BuiltinIssueRegistry.class.getClassLoader());
-                    try {
-                        Class<?> registryClass = Class.forName(className, true, loader);
-                        IssueRegistry registry = (IssueRegistry) registryClass.newInstance();
-                        for (Issue issue : registry.getIssues()) {
-                            issues.add(issue);
-                        }
-                    } catch (Throwable e) {
-                        log(e);
-                    }
-                } catch (MalformedURLException e) {
-                    log(e);
-                }
-            }
-        } catch (IOException e) {
-            log(e);
-        } finally {
-            if (jarfile != null) {
-                try {
-                    jarfile.close();
-                } catch (IOException e) {
-                    // Nothing to be done
-                }
-            }
-        }
-    }
-
-    private static void log(Throwable e) {
-        // TODO: Where do we log this? There's no embedding tool context here. For now,
-        // just dump to the console so detector developers get some feedback on what went
-        // wrong.
-        e.printStackTrace();
-    }
-
-    private static Set<Issue> sAdtFixes;
-
-    /**
-     * Returns true if the given issue has an automatic IDE fix.
-     *
-     * @param tool the name of the tool to be checked
-     * @param issue the issue to be checked
-     * @return true if the given tool is known to have an automatic fix for the
-     *         given issue
-     */
-    @Beta
-    public boolean hasAutoFix(String tool, Issue issue) {
-        assert tool.equals("adt"); // This is not yet a generic facility;
-        // the primary purpose right now is to allow for example the HTML report
-        // to give a hint to the user that some fixes don't require manual work
-
-        return getIssuesWithFixes().contains(issue);
-    }
-
-    private static Set<Issue> getIssuesWithFixes() {
-        if (sAdtFixes == null) {
-            sAdtFixes = new HashSet<Issue>(25);
-            sAdtFixes.add(InefficientWeightDetector.INEFFICIENT_WEIGHT);
-            sAdtFixes.add(AccessibilityDetector.ISSUE);
-            sAdtFixes.add(InefficientWeightDetector.BASELINE_WEIGHTS);
-            sAdtFixes.add(HardcodedValuesDetector.ISSUE);
-            sAdtFixes.add(UselessViewDetector.USELESS_LEAF);
-            sAdtFixes.add(UselessViewDetector.USELESS_PARENT);
-            sAdtFixes.add(PxUsageDetector.PX_ISSUE);
-            sAdtFixes.add(TextFieldDetector.ISSUE);
-            sAdtFixes.add(SecurityDetector.EXPORTED_SERVICE);
-            sAdtFixes.add(DetectMissingPrefix.MISSING_NAMESPACE);
-            sAdtFixes.add(ScrollViewChildDetector.ISSUE);
-            sAdtFixes.add(ObsoleteLayoutParamsDetector.ISSUE);
-            sAdtFixes.add(TypographyDetector.DASHES);
-            sAdtFixes.add(TypographyDetector.ELLIPSIS);
-            sAdtFixes.add(TypographyDetector.FRACTIONS);
-            sAdtFixes.add(TypographyDetector.OTHER);
-            sAdtFixes.add(TypographyDetector.QUOTES);
-            sAdtFixes.add(UseCompoundDrawableDetector.ISSUE);
-            sAdtFixes.add(ApiDetector.UNSUPPORTED);
-            sAdtFixes.add(TypoDetector.ISSUE);
-            sAdtFixes.add(ManifestOrderDetector.ALLOW_BACKUP);
-            sAdtFixes.add(MissingIdDetector.ISSUE);
-            sAdtFixes.add(TranslationDetector.MISSING);
-            sAdtFixes.add(DosLineEndingDetector.ISSUE);
-        }
-
-        return sAdtFixes;
-    }
-
-    /**
-     * Reset the registry such that it recomputes its available issues.
-     * <p>
-     * NOTE: This is only intended for testing purposes.
-     */
-    @VisibleForTesting
-    public static void reset() {
-        IssueRegistry.reset();
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ButtonDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ButtonDetector.java
deleted file mode 100644
index e756e03..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ButtonDetector.java
+++ /dev/null
@@ -1,782 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_STRING_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_BACKGROUND;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_PARENT_LEFT;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_PARENT_RIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_TO_LEFT_OF;
-import static com.android.SdkConstants.ATTR_LAYOUT_TO_RIGHT_OF;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_ORIENTATION;
-import static com.android.SdkConstants.ATTR_STYLE;
-import static com.android.SdkConstants.ATTR_TEXT;
-import static com.android.SdkConstants.BUTTON;
-import static com.android.SdkConstants.LINEAR_LAYOUT;
-import static com.android.SdkConstants.RELATIVE_LAYOUT;
-import static com.android.SdkConstants.STRING_PREFIX;
-import static com.android.SdkConstants.TABLE_ROW;
-import static com.android.SdkConstants.TAG_STRING;
-import static com.android.SdkConstants.VALUE_SELECTABLE_ITEM_BACKGROUND;
-import static com.android.SdkConstants.VALUE_TRUE;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Check which looks at the order of buttons in dialogs and makes sure that
- * "the dismissive action of a dialog is always on the left whereas the affirmative actions
- * are on the right."
- * <p>
- * This only looks for the affirmative and dismissive actions named "OK" and "Cancel";
- * "Cancel" usually works, but the affirmative action often has many other names -- "Done",
- * "Send", "Go", etc.
- * <p>
- * TODO: Perhaps we should look for Yes/No dialogs and suggested they be rephrased as
- * Cancel/OK dialogs? Similarly, consider "Abort" a synonym for "Cancel" ?
- */
-public class ButtonDetector extends ResourceXmlDetector {
-    /** Name of cancel value ("Cancel") */
-    private static final String CANCEL_LABEL = "Cancel";
-    /** Name of OK value ("Cancel") */
-    private static final String OK_LABEL = "OK";
-    /** Name of Back value ("Back") */
-    private static final String BACK_LABEL = "Back";
-
-    /** Layout text attribute reference to {@code @android:string/ok} */
-    private static final String ANDROID_OK_RESOURCE =
-            ANDROID_STRING_PREFIX + "ok"; //$NON-NLS-1$
-    /** Layout text attribute reference to {@code @android:string/cancel} */
-    private static final String ANDROID_CANCEL_RESOURCE =
-            ANDROID_STRING_PREFIX + "cancel"; //$NON-NLS-1$
-
-    /** The main issue discovered by this detector */
-    public static final Issue ORDER = Issue.create(
-            "ButtonOrder", //$NON-NLS-1$
-            "Ensures the dismissive action of a dialog is on the left and affirmative on " +
-            "the right",
-
-            "According to the Android Design Guide,\n" +
-            "\n" +
-            "\"Action buttons are typically Cancel and/or OK, with OK indicating the preferred " +
-            "or most likely action. However, if the options consist of specific actions such " +
-            "as Close or Wait rather than a confirmation or cancellation of the action " +
-            "described in the content, then all the buttons should be active verbs. As a rule, " +
-            "the dismissive action of a dialog is always on the left whereas the affirmative " +
-            "actions are on the right.\"\n" +
-            "\n" +
-            "This check looks for button bars and buttons which look like cancel buttons, " +
-            "and makes sure that these are on the left.",
-
-            Category.USABILITY,
-            8,
-            Severity.WARNING,
-            ButtonDetector.class,
-            Scope.RESOURCE_FILE_SCOPE)
-            .setMoreInfo(
-                "http://developer.android.com/design/building-blocks/dialogs.html"); //$NON-NLS-1$
-
-    /** The main issue discovered by this detector */
-    public static final Issue STYLE = Issue.create(
-            "ButtonStyle", //$NON-NLS-1$
-            "Ensures that buttons in button bars are borderless",
-
-            "Button bars typically use a borderless style for the buttons. Set the " +
-            "`style=\"?android:attr/buttonBarButtonStyle\"` attribute " +
-            "on each of the buttons, and set `style=\"?android:attr/buttonBarStyle\"` on " +
-            "the parent layout",
-
-            Category.USABILITY,
-            5,
-            Severity.WARNING,
-            ButtonDetector.class,
-            Scope.RESOURCE_FILE_SCOPE)
-            .setMoreInfo(
-                "http://developer.android.com/design/building-blocks/buttons.html"); //$NON-NLS-1$
-
-    /** The main issue discovered by this detector */
-    public static final Issue BACKBUTTON = Issue.create(
-            "BackButton", //$NON-NLS-1$
-            "Looks for Back buttons, which are not common on the Android platform.",
-            // TODO: Look for ">" as label suffixes as well
-
-            "According to the Android Design Guide,\n" +
-            "\n" +
-            "\"Other platforms use an explicit back button with label to allow the user " +
-            "to navigate up the application's hierarchy. Instead, Android uses the main " +
-            "action bar's app icon for hierarchical navigation and the navigation bar's " +
-            "back button for temporal navigation.\"" +
-            "\n" +
-            "This check is not very sophisticated (it just looks for buttons with the " +
-            "label \"Back\"), so it is disabled by default to not trigger on common " +
-            "scenarios like pairs of Back/Next buttons to paginate through screens.",
-
-            Category.USABILITY,
-            6,
-            Severity.WARNING,
-            ButtonDetector.class,
-            Scope.RESOURCE_FILE_SCOPE)
-            .setEnabledByDefault(false)
-            .setMoreInfo(
-                "http://developer.android.com/design/patterns/pure-android.html"); //$NON-NLS-1$
-
-    /** The main issue discovered by this detector */
-    public static final Issue CASE = Issue.create(
-            "ButtonCase", //$NON-NLS-1$
-            "Ensures that Cancel/OK dialog buttons use the canonical capitalization",
-
-            "The standard capitalization for OK/Cancel dialogs is \"OK\" and \"Cancel\". " +
-            "To ensure that your dialogs use the standard strings, you can use " +
-            "the resource strings @android:string/ok and @android:string/cancel.",
-
-            Category.USABILITY,
-            2,
-            Severity.WARNING,
-            ButtonDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Set of resource names whose value was either OK or Cancel */
-    private Set<String> mApplicableResources;
-
-    /**
-     * Map of resource names we'd like resolved into strings in phase 2. The
-     * values should be filled in with the actual string contents.
-     */
-    private Map<String, String> mKeyToLabel;
-
-    /**
-     * Set of elements we've already warned about. If we've already complained
-     * about a cancel button, don't also report the OK button (since it's listed
-     * for the warnings on OK buttons).
-     */
-    private Set<Element> mIgnore;
-
-    /** Constructs a new {@link ButtonDetector} */
-    public ButtonDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(BUTTON, TAG_STRING);
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.LAYOUT || folderType == ResourceFolderType.VALUES;
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        int phase = context.getPhase();
-        if (phase == 1 && mApplicableResources != null) {
-            // We found resources for the string "Cancel"; perform a second pass
-            // where we check layout text attributes against these strings.
-            context.getDriver().requestRepeat(this, Scope.RESOURCE_FILE_SCOPE);
-        }
-    }
-
-    private static String stripLabel(String text) {
-        text = text.trim();
-        if (text.length() > 2
-                && (text.charAt(0) == '"' || text.charAt(0) == '\'')
-                && (text.charAt(0) == text.charAt(text.length() - 1))) {
-            text = text.substring(1, text.length() - 1);
-        }
-
-        return text;
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        // This detector works in two passes.
-        // In pass 1, it looks in layout files for hardcoded strings of "Cancel", or
-        // references to @string/cancel or @android:string/cancel.
-        // It also looks in values/ files for strings whose value is "Cancel",
-        // and if found, stores the corresponding keys in a map. (This is necessary
-        // since value files are processed after layout files).
-        // Then, if at the end of phase 1 any "Cancel" string resources were
-        // found in the value files, then it requests a *second* phase,
-        // where it looks only for <Button>'s whose text matches one of the
-        // cancel string resources.
-        int phase = context.getPhase();
-        String tagName = element.getTagName();
-        if (phase == 1 && tagName.equals(TAG_STRING)) {
-            NodeList childNodes = element.getChildNodes();
-            for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-                Node child = childNodes.item(i);
-                if (child.getNodeType() == Node.TEXT_NODE) {
-                    String text = child.getNodeValue();
-                    for (int j = 0, len = text.length(); j < len; j++) {
-                        char c = text.charAt(j);
-                        if (!Character.isWhitespace(c)) {
-                            if (c == '"' || c == '\'') {
-                                continue;
-                            }
-                            if (LintUtils.startsWith(text, CANCEL_LABEL, j)) {
-                                String label = stripLabel(text);
-                                if (label.equalsIgnoreCase(CANCEL_LABEL)) {
-                                    String name = element.getAttribute(ATTR_NAME);
-                                    foundResource(context, name, element);
-
-                                    if (!label.equals(CANCEL_LABEL)
-                                            && isEnglishResource(context)
-                                            && context.isEnabled(CASE)) {
-                                        assert label.equalsIgnoreCase(CANCEL_LABEL);
-                                        context.report(CASE, child, context.getLocation(child),
-                                            String.format(
-                                            "The standard Android way to capitalize %1$s " +
-                                            "is \"Cancel\" (tip: use @android:string/ok instead)",
-                                            label),  null);
-                                    }
-                                }
-                            } else if (LintUtils.startsWith(text, OK_LABEL, j)) {
-                                String label = stripLabel(text);
-                                if (label.equalsIgnoreCase(OK_LABEL)) {
-                                    String name = element.getAttribute(ATTR_NAME);
-                                    foundResource(context, name, element);
-
-                                    if (!label.equals(OK_LABEL)
-                                            && isEnglishResource(context)
-                                            && context.isEnabled(CASE)) {
-                                        assert text.trim().equalsIgnoreCase(OK_LABEL);
-                                        context.report(CASE, child, context.getLocation(child),
-                                            String.format(
-                                            "The standard Android way to capitalize %1$s " +
-                                            "is \"OK\" (tip: use @android:string/ok instead)",
-                                            label),  null);
-                                    }
-                                }
-                            } else if (LintUtils.startsWith(text, BACK_LABEL, j) &&
-                                    stripLabel(text).equalsIgnoreCase(BACK_LABEL)) {
-                                String name = element.getAttribute(ATTR_NAME);
-                                foundResource(context, name, element);
-                            }
-                            break;
-                        }
-                    }
-                }
-            }
-        } else if (tagName.equals(BUTTON)) {
-            if (phase == 1) {
-                if (isInButtonBar(element)
-                        && !element.hasAttribute(ATTR_STYLE)
-                        && !VALUE_SELECTABLE_ITEM_BACKGROUND.equals(
-                                element.getAttributeNS(ANDROID_URI, ATTR_BACKGROUND))
-                        && (context.getProject().getMinSdk() >= 11
-                            || context.getFolderVersion() >= 11)
-                        && context.isEnabled(STYLE)
-                        && !parentDefinesSelectableItem(element)) {
-                    context.report(STYLE, element, context.getLocation(element),
-                            "Buttons in button bars should be borderless; use " +
-                            "style=\"?android:attr/buttonBarButtonStyle\" (and " +
-                            "?android:attr/buttonBarStyle on the parent)",
-                            null);
-                }
-            }
-
-            String text = element.getAttributeNS(ANDROID_URI, ATTR_TEXT);
-            if (phase == 2) {
-                if (mApplicableResources.contains(text)) {
-                    String key = text;
-                    if (key.startsWith(STRING_PREFIX)) {
-                        key = key.substring(STRING_PREFIX.length());
-                    }
-                    String label = mKeyToLabel.get(key);
-                    boolean isCancel = CANCEL_LABEL.equalsIgnoreCase(label);
-                    if (isCancel) {
-                        if (isWrongCancelPosition(element)) {
-                            reportCancelPosition(context, element);
-                        }
-                    } else if (OK_LABEL.equalsIgnoreCase(label)) {
-                        if (isWrongOkPosition(element)) {
-                            reportOkPosition(context, element);
-                        }
-                    } else {
-                        assert BACK_LABEL.equalsIgnoreCase(label) : label + ':' + context.file;
-                        Location location = context.getLocation(element);
-                        if (context.isEnabled(BACKBUTTON)) {
-                            context.report(BACKBUTTON, element, location,
-                                "Back buttons are not standard on Android; see design guide's " +
-                                "navigation section", null);
-                        }
-                    }
-                }
-            } else if (text.equals(CANCEL_LABEL) || text.equals(ANDROID_CANCEL_RESOURCE)) {
-                if (isWrongCancelPosition(element)) {
-                    reportCancelPosition(context, element);
-                }
-            } else if (text.equals(OK_LABEL) || text.equals(ANDROID_OK_RESOURCE)) {
-                if (isWrongOkPosition(element)) {
-                    reportOkPosition(context, element);
-                }
-            }
-        }
-    }
-
-    private static boolean parentDefinesSelectableItem(Element element) {
-        String background = element.getAttributeNS(ANDROID_URI, ATTR_BACKGROUND);
-        if (VALUE_SELECTABLE_ITEM_BACKGROUND.equals(background)) {
-            return true;
-        }
-
-        Node parent = element.getParentNode();
-        if (parent != null && parent.getNodeType() == Node.ELEMENT_NODE) {
-            return parentDefinesSelectableItem((Element) parent);
-        }
-
-        return false;
-    }
-
-    /** Report the given OK button as being in the wrong position */
-    private void reportOkPosition(XmlContext context, Element element) {
-        report(context, element, false /*isCancel*/);
-    }
-
-    /** Report the given Cancel button as being in the wrong position */
-    private void reportCancelPosition(XmlContext context, Element element) {
-        report(context, element, true /*isCancel*/);
-    }
-
-
-    /** The Ok/Cancel detector only works with default and English locales currently.
-      * TODO: Add in patterns for other languages. We can use the
-     * @android:string/ok and @android:string/cancel localizations to look
-     * up the canonical ones. */
-    private static boolean isEnglishResource(XmlContext context) {
-        String folder = context.file.getParentFile().getName();
-        if (folder.indexOf('-') != -1) {
-            String[] qualifiers = folder.split("-"); //$NON-NLS-1$
-            for (String qualifier : qualifiers) {
-                if (qualifier.equals("en")) { //$NON-NLS-1$
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        // Default folder ("values") - may not be English but we'll consider matches
-        // on "OK", "Cancel" and "Back" as matches there
-        return true;
-    }
-
-    /**
-     * We've found a resource reference to some label we're interested in ("OK",
-     * "Cancel", "Back", ...). Record the corresponding name such that in the
-     * next pass through the layouts we can check the context (for OK/Cancel the
-     * button order etc).
-     */
-    private void foundResource(XmlContext context, String name, Element element) {
-        if (!isEnglishResource(context)) {
-            return;
-        }
-
-        if (!context.getProject().getReportIssues()) {
-            // If this is a library project not being analyzed, ignore it
-            return;
-        }
-
-        if (mApplicableResources == null) {
-            mApplicableResources = new HashSet<String>();
-        }
-
-        mApplicableResources.add(STRING_PREFIX + name);
-
-        // ALSO record all the other string resources in this file to pick up other
-        // labels. If you define "OK" in one resource file and "Cancel" in another
-        // this won't work, but that's probably not common and has lower overhead.
-        Node parentNode = element.getParentNode();
-
-        List<Element> items = LintUtils.getChildren(parentNode);
-        if (mKeyToLabel == null) {
-            mKeyToLabel = new HashMap<String, String>(items.size());
-        }
-        for (Element item : items) {
-            String itemName = item.getAttribute(ATTR_NAME);
-            NodeList childNodes = item.getChildNodes();
-            for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-                Node child = childNodes.item(i);
-                if (child.getNodeType() == Node.TEXT_NODE) {
-                    String text = stripLabel(child.getNodeValue());
-                    if (!text.isEmpty()) {
-                        mKeyToLabel.put(itemName, text);
-                        break;
-                    }
-                }
-            }
-        }
-    }
-
-    /** Report the given OK/Cancel button as being in the wrong position */
-    private void report(XmlContext context, Element element, boolean isCancel) {
-        if (!context.isEnabled(ORDER)) {
-            return;
-        }
-
-        if (mIgnore != null && mIgnore.contains(element)) {
-            return;
-        }
-
-        int target = context.getProject().getTargetSdk();
-        if (target < 14) {
-            // If you're only targeting pre-ICS UI's, this is not an issue
-            return;
-        }
-
-        boolean mustCreateIcsLayout = false;
-        if (context.getProject().getMinSdk() < 14) {
-            // If you're *also* targeting pre-ICS UIs, then this reverse button
-            // order is correct for layouts intended for pre-ICS and incorrect for
-            // ICS layouts.
-            //
-            // Therefore, we need to know if this layout is an ICS layout or
-            // a pre-ICS layout.
-            boolean isIcsLayout = context.getFolderVersion() >= 14;
-            if (!isIcsLayout) {
-                // This layout is not an ICS layout. However, there *must* also be
-                // an ICS layout here, or this button order will be wrong:
-                File res = context.file.getParentFile().getParentFile();
-                File[] resFolders = res.listFiles();
-                String fileName = context.file.getName();
-                if (resFolders != null) {
-                    for (File folder : resFolders) {
-                        String folderName = folder.getName();
-                        if (folderName.startsWith(SdkConstants.FD_RES_LAYOUT)
-                                && folderName.contains("-v14")) { //$NON-NLS-1$
-                            File layout = new File(folder, fileName);
-                            if (layout.exists()) {
-                                // Yes, a v14 specific layout is available so this pre-ICS
-                                // layout order is not a problem
-                                return;
-                            }
-                        }
-                    }
-                }
-                mustCreateIcsLayout = true;
-            }
-        }
-
-        List<Element> buttons = LintUtils.getChildren(element.getParentNode());
-
-        if (mIgnore == null) {
-            mIgnore = new HashSet<Element>();
-        }
-        for (Element button : buttons) {
-            // Mark all the siblings in the ignore list to ensure that we don't
-            // report *both* the Cancel and the OK button in "OK | Cancel"
-            mIgnore.add(button);
-        }
-
-        String message;
-        if (isCancel) {
-            message = "Cancel button should be on the left";
-        } else {
-            message = "OK button should be on the right";
-        }
-
-        if (mustCreateIcsLayout) {
-            message = String.format(
-                    "Layout uses the wrong button order for API >= 14: Create a " +
-                    "layout-v14/%1$s file with opposite order: %2$s",
-                    context.file.getName(), message);
-        }
-
-        // Show existing button order? We can only do that for LinearLayouts
-        // since in for example a RelativeLayout the order of the elements may
-        // not be the same as the visual order
-        String layout = element.getParentNode().getNodeName();
-        if (layout.equals(LINEAR_LAYOUT) || layout.equals(TABLE_ROW)) {
-            List<String> labelList = getLabelList(buttons);
-            String wrong = describeButtons(labelList);
-            sortButtons(labelList);
-            String right = describeButtons(labelList);
-            message += String.format(" (was \"%1$s\", should be \"%2$s\")", wrong, right);
-        }
-
-        Location location = context.getLocation(element);
-        context.report(ORDER, element, location, message, null);
-    }
-
-    /**
-     * Sort a list of label buttons into the expected order (Cancel on the left,
-     * OK on the right
-     */
-    private static void sortButtons(List<String> labelList) {
-        for (int i = 0, n = labelList.size(); i < n; i++) {
-            String label = labelList.get(i);
-            if (label.equalsIgnoreCase(CANCEL_LABEL) && i > 0) {
-                swap(labelList, 0, i);
-            } else if (label.equalsIgnoreCase(OK_LABEL) && i < n - 1) {
-                swap(labelList, n - 1, i);
-            }
-        }
-    }
-
-    /** Swaps the strings at positions i and j */
-    private static void swap(List<String> strings, int i, int j) {
-        if (i != j) {
-            String temp = strings.get(i);
-            strings.set(i, strings.get(j));
-            strings.set(j, temp);
-        }
-    }
-
-    /** Creates a display string for a list of button labels, such as "Cancel | OK" */
-    private static String describeButtons(List<String> labelList) {
-        StringBuilder sb = new StringBuilder(80);
-        for (String label : labelList) {
-            if (sb.length() > 0) {
-                sb.append(" | "); //$NON-NLS-1$
-            }
-            sb.append(label);
-        }
-
-        return sb.toString();
-    }
-
-    /** Returns the ordered list of button labels */
-    private List<String> getLabelList(List<Element> views) {
-        List<String> labels = new ArrayList<String>();
-
-        if (mIgnore == null) {
-            mIgnore = new HashSet<Element>();
-        }
-
-        for (Element view : views) {
-            if (view.getTagName().equals(BUTTON)) {
-                String text = view.getAttributeNS(ANDROID_URI, ATTR_TEXT);
-                String label = getLabel(text);
-                labels.add(label);
-
-                // Mark all the siblings in the ignore list to ensure that we don't
-                // report *both* the Cancel and the OK button in "OK | Cancel"
-                mIgnore.add(view);
-            }
-        }
-
-        return labels;
-    }
-
-    private String getLabel(String key) {
-        String label = null;
-        if (key.startsWith(ANDROID_STRING_PREFIX)) {
-            if (key.equals(ANDROID_OK_RESOURCE)) {
-                label = OK_LABEL;
-            } else if (key.equals(ANDROID_CANCEL_RESOURCE)) {
-                label = CANCEL_LABEL;
-            }
-        } else if (mKeyToLabel != null) {
-            if (key.startsWith(STRING_PREFIX)) {
-                label = mKeyToLabel.get(key.substring(STRING_PREFIX.length()));
-            }
-        }
-
-        if (label == null) {
-            label = key;
-        }
-
-        if (label.indexOf(' ') != -1 && label.indexOf('"') == -1) {
-            label = '"' + label + '"';
-        }
-
-        return label;
-    }
-
-    /** Is the cancel button in the wrong position? It has to be on the left. */
-    private boolean isWrongCancelPosition(Element element) {
-        return isWrongPosition(element, true /*isCancel*/);
-    }
-
-    /** Is the OK button in the wrong position? It has to be on the right. */
-    private boolean isWrongOkPosition(Element element) {
-        return isWrongPosition(element, false /*isCancel*/);
-    }
-
-    private static boolean isInButtonBar(Element element) {
-        assert element.getTagName().equals(BUTTON) : element.getTagName();
-        Node parentNode = element.getParentNode();
-        if (parentNode.getNodeType() != Node.ELEMENT_NODE) {
-            return false;
-        }
-        Element parent = (Element) parentNode;
-
-        String style = parent.getAttribute(ATTR_STYLE);
-        if (style != null && style.contains("buttonBarStyle")) { //$NON-NLS-1$
-            return true;
-        }
-
-        // Don't warn about single Cancel / OK buttons
-        if (LintUtils.getChildCount(parent) < 2) {
-            return false;
-        }
-
-        String layout = parent.getTagName();
-        if (layout.equals(LINEAR_LAYOUT) || layout.equals(TABLE_ROW)) {
-            String orientation = parent.getAttributeNS(ANDROID_URI, ATTR_ORIENTATION);
-            if (VALUE_VERTICAL.equals(orientation)) {
-                return false;
-            }
-        } else {
-            return false;
-        }
-
-        // Ensure that all the children are buttons
-        Node n = parent.getFirstChild();
-        while (n != null) {
-            if (n.getNodeType() == Node.ELEMENT_NODE) {
-                if (!BUTTON.equals(n.getNodeName())) {
-                    return false;
-                }
-            }
-            n = n.getNextSibling();
-        }
-
-        return true;
-    }
-
-    /** Is the given button in the wrong position? */
-    private static boolean isWrongPosition(Element element, boolean isCancel) {
-        Node parentNode = element.getParentNode();
-        if (parentNode.getNodeType() != Node.ELEMENT_NODE) {
-            return false;
-        }
-        Element parent = (Element) parentNode;
-
-        // Don't warn about single Cancel / OK buttons
-        if (LintUtils.getChildCount(parent) < 2) {
-            return false;
-        }
-
-        String layout = parent.getTagName();
-        if (layout.equals(LINEAR_LAYOUT) || layout.equals(TABLE_ROW)) {
-            String orientation = parent.getAttributeNS(ANDROID_URI, ATTR_ORIENTATION);
-            if (VALUE_VERTICAL.equals(orientation)) {
-                return false;
-            }
-
-            if (isCancel) {
-                Node n = element.getPreviousSibling();
-                while (n != null) {
-                    if (n.getNodeType() == Node.ELEMENT_NODE) {
-                        return true;
-                    }
-                    n = n.getPreviousSibling();
-                }
-            } else {
-                Node n = element.getNextSibling();
-                while (n != null) {
-                    if (n.getNodeType() == Node.ELEMENT_NODE) {
-                        return true;
-                    }
-                    n = n.getNextSibling();
-                }
-            }
-
-            return false;
-        } else if (layout.equals(RELATIVE_LAYOUT)) {
-            // In RelativeLayouts, look for attachments which look like a clear sign
-            // that the OK or Cancel buttons are out of order:
-            //   -- a left attachment on a Cancel button (where the left attachment
-            //      is a button; we don't want to complain if it's pointing to a spacer
-            //      or image or progress indicator etc)
-            //   -- a right-side parent attachment on a Cancel button (unless it's also
-            //      attached on the left, e.g. a cancel button stretching across the
-            //      layout)
-            // etc.
-            if (isCancel) {
-                if (element.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_TO_RIGHT_OF)
-                        && isButtonId(parent, element.getAttributeNS(ANDROID_URI,
-                                ATTR_LAYOUT_TO_RIGHT_OF))) {
-                    return true;
-                }
-                if (isTrue(element, ATTR_LAYOUT_ALIGN_PARENT_RIGHT) &&
-                        !isTrue(element, ATTR_LAYOUT_ALIGN_PARENT_LEFT)) {
-                    return true;
-                }
-            } else {
-                if (element.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_TO_LEFT_OF)
-                        && isButtonId(parent, element.getAttributeNS(ANDROID_URI,
-                                ATTR_LAYOUT_TO_RIGHT_OF))) {
-                    return true;
-                }
-                if (isTrue(element, ATTR_LAYOUT_ALIGN_PARENT_LEFT) &&
-                        !isTrue(element, ATTR_LAYOUT_ALIGN_PARENT_RIGHT)) {
-                    return true;
-                }
-            }
-
-            return false;
-        } else {
-            // TODO: Consider other button layouts - GridLayouts, custom views extending
-            // LinearLayout etc?
-            return false;
-        }
-    }
-
-    /**
-     * Returns true if the given attribute (in the Android namespace) is set to
-     * true on the given element
-     */
-    private static boolean isTrue(Element element, String attribute) {
-        return VALUE_TRUE.equals(element.getAttributeNS(ANDROID_URI, attribute));
-    }
-
-    /** Is the given target id the id of a {@code <Button>} within this RelativeLayout? */
-    private static boolean isButtonId(Element parent, String targetId) {
-        for (Element child : LintUtils.getChildren(parent)) {
-            String id = child.getAttributeNS(ANDROID_URI, ATTR_ID);
-            if (LintUtils.idReferencesMatch(id, targetId)) {
-                return child.getTagName().equals(BUTTON);
-            }
-        }
-        return false;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ChildCountDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ChildCountDetector.java
deleted file mode 100644
index bc1e30d..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ChildCountDetector.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.GRID_VIEW;
-import static com.android.SdkConstants.HORIZONTAL_SCROLL_VIEW;
-import static com.android.SdkConstants.LIST_VIEW;
-import static com.android.SdkConstants.REQUEST_FOCUS;
-import static com.android.SdkConstants.SCROLL_VIEW;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-/**
- * Check which makes sure that views have the expected number of declared
- * children (e.g. at most one in ScrollViews and none in AdapterViews)
- */
-public class ChildCountDetector extends LayoutDetector {
-
-    /** The main issue discovered by this detector */
-    public static final Issue SCROLLVIEW_ISSUE = Issue.create(
-            "ScrollViewCount", //$NON-NLS-1$
-            "Checks that ScrollViews have exactly one child widget",
-            "ScrollViews can only have one child widget. If you want more children, wrap them " +
-            "in a container layout.",
-            Category.CORRECTNESS,
-            8,
-            Severity.WARNING,
-            ChildCountDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** The main issue discovered by this detector */
-    public static final Issue ADAPTERVIEW_ISSUE = Issue.create(
-            "AdapterViewChildren", //$NON-NLS-1$
-            "Checks that AdapterViews do not define their children in XML",
-            "AdapterViews such as ListViews must be configured with data from Java code, " +
-            "such as a ListAdapter.",
-            Category.CORRECTNESS,
-            10,
-            Severity.WARNING,
-            ChildCountDetector.class,
-            Scope.RESOURCE_FILE_SCOPE).setMoreInfo(
-                "http://developer.android.com/reference/android/widget/AdapterView.html"); //$NON-NLS-1$
-
-    /** Constructs a new {@link ChildCountDetector} */
-    public ChildCountDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                SCROLL_VIEW,
-                HORIZONTAL_SCROLL_VIEW,
-                LIST_VIEW,
-                GRID_VIEW
-                // TODO: Shouldn't Spinner be in this list too? (Was not there in layoutopt)
-        );
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        int childCount = LintUtils.getChildCount(element);
-        String tagName = element.getTagName();
-        if (tagName.equals(SCROLL_VIEW) || tagName.equals(HORIZONTAL_SCROLL_VIEW)) {
-            if (childCount > 1 && getAccurateChildCount(element) > 1) {
-                context.report(SCROLLVIEW_ISSUE, element,
-                        context.getLocation(element), "A scroll view can have only one child",
-                        null);
-            }
-        } else {
-            // Adapter view
-            if (childCount > 0 && getAccurateChildCount(element) > 0) {
-                context.report(ADAPTERVIEW_ISSUE, element,
-                        context.getLocation(element),
-                        "A list/grid should have no children declared in XML", null);
-            }
-        }
-    }
-
-    /** Counts the number of children, but skips certain tags like {@code <requestFocus>} */
-    private static int getAccurateChildCount(Element element) {
-        NodeList childNodes = element.getChildNodes();
-        int childCount = 0;
-        for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-            Node child = childNodes.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE &&
-                    !REQUEST_FOCUS.equals(child.getNodeName())) {
-                childCount++;
-            }
-        }
-
-        return childCount;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/CleanupDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/CleanupDetector.java
deleted file mode 100644
index 1541d23..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/CleanupDetector.java
+++ /dev/null
@@ -1,540 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.objectweb.asm.tree.analysis.Analyzer;
-import org.objectweb.asm.tree.analysis.AnalyzerException;
-import org.objectweb.asm.tree.analysis.BasicValue;
-import org.objectweb.asm.tree.analysis.Frame;
-import org.objectweb.asm.tree.analysis.Interpreter;
-import org.objectweb.asm.tree.analysis.Value;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Checks for missing {@code recycle} calls on resources that encourage it, and
- * for missing {@code commit} calls on FragmentTransactions, etc.
- */
-public class CleanupDetector extends Detector implements ClassScanner {
-    /** Problems with missing recycle calls */
-    public static final Issue RECYCLE_RESOURCE = Issue.create(
-        "Recycle", //$NON-NLS-1$
-        "Looks for missing recycle() calls on resources",
-
-        "Many resources, such as TypedArrays, VelocityTrackers, etc., " +
-        "should be recycled (with a `recycle()` call) after use. This lint check looks " +
-        "for missing `recycle()` calls.",
-
-        Category.PERFORMANCE,
-        7,
-        Severity.WARNING,
-        CleanupDetector.class,
-        Scope.CLASS_FILE_SCOPE);
-
-    /** Problems with missing commit calls. */
-    public static final Issue COMMIT_FRAGMENT = Issue.create(
-            "CommitTransaction", //$NON-NLS-1$
-            "Looks for missing commit() calls on FragmentTransactions",
-
-            "After creating a `FragmentTransaction`, you typically need to commit it as well",
-
-            Category.CORRECTNESS,
-            7,
-            Severity.WARNING,
-            CleanupDetector.class,
-            Scope.CLASS_FILE_SCOPE);
-
-    // Target method names
-    private static final String RECYCLE = "recycle";                                  //$NON-NLS-1$
-    private static final String OBTAIN = "obtain";                                    //$NON-NLS-1$
-    private static final String OBTAIN_NO_HISTORY = "obtainNoHistory";                //$NON-NLS-1$
-    private static final String OBTAIN_ATTRIBUTES = "obtainAttributes";               //$NON-NLS-1$
-    private static final String OBTAIN_TYPED_ARRAY = "obtainTypedArray";              //$NON-NLS-1$
-    private static final String OBTAIN_STYLED_ATTRIBUTES = "obtainStyledAttributes";  //$NON-NLS-1$
-    private static final String BEGIN_TRANSACTION = "beginTransaction";               //$NON-NLS-1$
-    private static final String COMMIT = "commit";                                    //$NON-NLS-1$
-    private static final String COMMIT_ALLOWING_LOSS = "commitAllowingStateLoss";     //$NON-NLS-1$
-
-    // Target owners
-    private static final String VELOCITY_TRACKER_CLS = "android/view/VelocityTracker";//$NON-NLS-1$
-    private static final String TYPED_ARRAY_CLS = "android/content/res/TypedArray";   //$NON-NLS-1$
-    private static final String CONTEXT_CLS = "android/content/Context";              //$NON-NLS-1$
-    private static final String MOTION_EVENT_CLS = "android/view/MotionEvent";        //$NON-NLS-1$
-    private static final String HANDLER_CLS = "android/os/Handler";                   //$NON-NLS-1$
-    private static final String RESOURCES_CLS = "android/content/res/Resources";      //$NON-NLS-1$
-    private static final String PARCEL_CLS = "android/os/Parcel";                     //$NON-NLS-1$
-    private static final String FRAGMENT_MANAGER_CLS = "android/app/FragmentManager"; //$NON-NLS-1$
-    private static final String FRAGMENT_MANAGER_V4_CLS = "android/support/v4/app/FragmentManager";         //$NON-NLS-1$
-    private static final String FRAGMENT_TRANSACTION_CLS = "android/app/FragmentTransaction";               //$NON-NLS-1$
-    private static final String FRAGMENT_TRANSACTION_V4_CLS = "android/support/v4/app/FragmentTransaction"; //$NON-NLS-1$
-
-    // Target description signatures
-    private static final String TYPED_ARRAY_SIG = "Landroid/content/res/TypedArray;"; //$NON-NLS-1$
-
-    private boolean mObtainsTypedArray;
-    private boolean mRecyclesTypedArray;
-    private boolean mObtainsTracker;
-    private boolean mRecyclesTracker;
-    private boolean mObtainsMotionEvent;
-    private boolean mRecyclesMotionEvent;
-    private boolean mObtainsParcel;
-    private boolean mRecyclesParcel;
-    private boolean mObtainsTransaction;
-    private boolean mCommitsTransaction;
-
-    /** Constructs a new {@link CleanupDetector} */
-    public CleanupDetector() {
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        int phase = context.getDriver().getPhase();
-        if (phase == 1) {
-            if (mObtainsTypedArray && !mRecyclesTypedArray
-                    || mObtainsTracker && !mRecyclesTracker
-                    || mObtainsParcel && !mRecyclesParcel
-                    || mObtainsMotionEvent && !mRecyclesMotionEvent
-                    || mObtainsTransaction && !mCommitsTransaction) {
-                context.getDriver().requestRepeat(this, Scope.CLASS_FILE_SCOPE);
-            }
-        }
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @Override
-    @Nullable
-    public List<String> getApplicableCallNames() {
-        return Arrays.asList(
-                RECYCLE,
-                OBTAIN_STYLED_ATTRIBUTES,
-                OBTAIN,
-                OBTAIN_ATTRIBUTES,
-                OBTAIN_TYPED_ARRAY,
-                OBTAIN_NO_HISTORY,
-                BEGIN_TRANSACTION,
-                COMMIT,
-                COMMIT_ALLOWING_LOSS
-        );
-    }
-
-    @Override
-    public void checkCall(
-            @NonNull ClassContext context,
-            @NonNull ClassNode classNode,
-            @NonNull MethodNode method,
-            @NonNull MethodInsnNode call) {
-        String name = call.name;
-        String owner = call.owner;
-        String desc = call.desc;
-        int phase = context.getDriver().getPhase();
-        if (RECYCLE.equals(name) && desc.equals("()V")) { //$NON-NLS-1$
-            if (owner.equals(TYPED_ARRAY_CLS)) {
-                mRecyclesTypedArray = true;
-            } else if (owner.equals(VELOCITY_TRACKER_CLS)) {
-                mRecyclesTracker = true;
-            } else if (owner.equals(MOTION_EVENT_CLS)) {
-                mRecyclesMotionEvent = true;
-            } else if (owner.equals(PARCEL_CLS)) {
-                mRecyclesParcel = true;
-            }
-        } else if ((COMMIT.equals(name) || COMMIT_ALLOWING_LOSS.equals(name))
-                && desc.equals("()I")) { //$NON-NLS-1$
-            if (owner.equals(FRAGMENT_TRANSACTION_CLS)
-                    || owner.equals(FRAGMENT_TRANSACTION_V4_CLS)) {
-                mCommitsTransaction = true;
-            }
-        } else if (owner.equals(MOTION_EVENT_CLS)) {
-            if (OBTAIN.equals(name) || OBTAIN_NO_HISTORY.equals(name)) {
-                mObtainsMotionEvent = true;
-                if (phase == 2 && !mRecyclesMotionEvent) {
-                    context.report(RECYCLE_RESOURCE, method, call, context.getLocation(call),
-                            getErrorMessage(MOTION_EVENT_CLS),
-                            null);
-                } else if (phase == 1
-                        && checkMethodFlow(context, classNode, method, call, MOTION_EVENT_CLS)) {
-                    // Already reported error above; don't do global check
-                    mRecyclesMotionEvent = true;
-                }
-            }
-        } else if (OBTAIN.equals(name)) {
-            if (owner.equals(VELOCITY_TRACKER_CLS)) {
-                mObtainsTracker = true;
-                if (phase == 2 && !mRecyclesTracker) {
-                    context.report(RECYCLE_RESOURCE, method, call, context.getLocation(call),
-                            getErrorMessage(VELOCITY_TRACKER_CLS),
-                            null);
-                }
-            } else if (owner.equals(PARCEL_CLS)) {
-                mObtainsParcel = true;
-                if (phase == 2 && !mRecyclesParcel) {
-                    context.report(RECYCLE_RESOURCE, method, call, context.getLocation(call),
-                            getErrorMessage(PARCEL_CLS),
-                            null);
-                } else if (phase == 1
-                        && checkMethodFlow(context, classNode, method, call, PARCEL_CLS)) {
-                    // Already reported error above; don't do global check
-                    mRecyclesParcel = true;
-                }
-            }
-        } else if (OBTAIN_STYLED_ATTRIBUTES.equals(name)
-                || OBTAIN_ATTRIBUTES.equals(name)
-                || OBTAIN_TYPED_ARRAY.equals(name)) {
-            if ((owner.equals(CONTEXT_CLS) || owner.equals(RESOURCES_CLS))
-                    && desc.endsWith(TYPED_ARRAY_SIG)) {
-                mObtainsTypedArray = true;
-                if (phase == 2 && !mRecyclesTypedArray) {
-                    context.report(RECYCLE_RESOURCE, method, call, context.getLocation(call),
-                            getErrorMessage(TYPED_ARRAY_CLS),
-                            null);
-                } else if (phase == 1
-                        && checkMethodFlow(context, classNode, method, call, TYPED_ARRAY_CLS)) {
-                    // Already reported error above; don't do global check
-                    mRecyclesTypedArray = true;
-                }
-            }
-        } else if (BEGIN_TRANSACTION.equals(name)
-                && (owner.equals(FRAGMENT_MANAGER_CLS) || owner.equals(FRAGMENT_MANAGER_V4_CLS))) {
-            mObtainsTransaction = true;
-            if (phase == 2 && !mCommitsTransaction) {
-                context.report(COMMIT_FRAGMENT, method, call, context.getLocation(call),
-                    getErrorMessage(FRAGMENT_MANAGER_CLS), null);
-            } else if (phase == 1
-                    && checkMethodFlow(context, classNode, method, call,
-                    owner.equals(FRAGMENT_MANAGER_CLS)
-                            ? FRAGMENT_TRANSACTION_CLS : FRAGMENT_TRANSACTION_V4_CLS)) {
-                // Already reported error above; don't do global check
-                mCommitsTransaction = true;
-            }
-        }
-    }
-
-    /** Computes an error message for a missing recycle of the given type */
-    private static String getErrorMessage(String owner) {
-        if (FRAGMENT_TRANSACTION_CLS.equals(owner) || FRAGMENT_TRANSACTION_V4_CLS.equals(owner)) {
-            return "This transaction should be completed with a commit() call";
-        }
-        String className = owner.substring(owner.lastIndexOf('/') + 1);
-        return String.format("This %1$s should be recycled after use with #recycle()",
-                className);
-    }
-
-    /**
-     * Ensures that the given allocate call in the given method has a
-     * corresponding recycle method, also within the same method, OR, the
-     * allocated resource flows out of the method (either as a return value, or
-     * into a field, or into some other method (with some known exceptions; e.g.
-     * passing a MotionEvent into another MotionEvent's constructor is fine)
-     * <p>
-     * Returns true if an error was found
-     */
-    private static boolean checkMethodFlow(ClassContext context, ClassNode classNode,
-            MethodNode method, MethodInsnNode call, String recycleOwner) {
-        CleanupTracker interpreter = new CleanupTracker(context, method, call, recycleOwner);
-        ResourceAnalyzer analyzer = new ResourceAnalyzer(interpreter);
-        interpreter.setAnalyzer(analyzer);
-        try {
-            analyzer.analyze(classNode.name, method);
-            if (!interpreter.isCleanedUp() && !interpreter.isEscaped()) {
-                Location location = context.getLocation(call);
-                String message = getErrorMessage(recycleOwner);
-                Issue issue = call.owner.equals(FRAGMENT_MANAGER_CLS)
-                        ? COMMIT_FRAGMENT : RECYCLE_RESOURCE;
-                context.report(issue, method, call, location, message, null);
-                return true;
-            }
-        } catch (AnalyzerException e) {
-            context.log(e, null);
-        }
-
-        return false;
-    }
-
-    @VisibleForTesting
-    static boolean hasReturnType(String owner, String desc) {
-        int descLen = desc.length();
-        int ownerLen = owner.length();
-        if (descLen < ownerLen + 3) {
-            return false;
-        }
-        if (desc.charAt(descLen - 1) != ';') {
-            return false;
-        }
-        int typeBegin = descLen - 2 - ownerLen;
-        if (desc.charAt(typeBegin - 1) != ')' || desc.charAt(typeBegin) != 'L') {
-            return false;
-        }
-        return desc.regionMatches(typeBegin + 1, owner, 0, ownerLen);
-    }
-
-    /**
-     * ASM interpreter which tracks the instances of the allocated resource, and
-     * checks whether it is eventually passed to a {@code recycle()} call. If the
-     * value flows out of the method (to a field, or a method call), it will
-     * also consider the resource recycled.
-     */
-    private static class CleanupTracker extends Interpreter {
-        // Only identity matters, not value
-        private static final Value INSTANCE = BasicValue.INT_VALUE;
-        private static final Value RECYCLED = BasicValue.FLOAT_VALUE;
-        private static final Value UNKNOWN = BasicValue.UNINITIALIZED_VALUE;
-
-        private final ClassContext mContext;
-        private final MethodNode mMethod;
-        private final MethodInsnNode mObtainNode;
-        private boolean mIsCleanedUp;
-        private boolean mEscapes;
-        private final String mRecycleOwner;
-        private ResourceAnalyzer mAnalyzer;
-
-        public CleanupTracker(
-                @NonNull ClassContext context,
-                @NonNull MethodNode method,
-                @NonNull MethodInsnNode obtainNode,
-                @NonNull String recycleOwner) {
-            super(Opcodes.ASM4);
-            mContext = context;
-            mMethod = method;
-            mObtainNode = obtainNode;
-            mRecycleOwner = recycleOwner;
-        }
-
-        /**
-         * Sets the analyzer associated with the interpreter, such that it can
-         * get access to the execution frames
-         */
-        void setAnalyzer(ResourceAnalyzer analyzer) {
-            mAnalyzer = analyzer;
-        }
-
-        /**
-         * Returns whether a recycle call was found for the given method
-         *
-         * @return true if the resource was recycled
-         */
-        public boolean isCleanedUp() {
-            return mIsCleanedUp;
-        }
-
-        /**
-         * Returns whether the target resource escapes from the method, for
-         * example as a return value, or a field assignment, or getting passed
-         * to another method
-         *
-         * @return true if the resource escapes
-         */
-        public boolean isEscaped() {
-            return mEscapes;
-        }
-
-        @Override
-        public Value newOperation(AbstractInsnNode node) throws AnalyzerException {
-            return UNKNOWN;
-        }
-
-        @Override
-        public Value newValue(final Type type) {
-            if (type != null && type.getSort() == Type.VOID) {
-                return null;
-            } else {
-                return UNKNOWN;
-            }
-        }
-
-        @Override
-        public Value copyOperation(AbstractInsnNode node, Value value) throws AnalyzerException {
-            return value;
-        }
-
-        @Override
-        public Value binaryOperation(AbstractInsnNode node, Value value1, Value value2)
-                throws AnalyzerException {
-            if (node.getOpcode() == Opcodes.PUTFIELD) {
-                if (value2 == INSTANCE) {
-                    mEscapes = true;
-                }
-            }
-            return merge(value1, value2);
-        }
-
-        @Override
-        public Value naryOperation(AbstractInsnNode node, List values) throws AnalyzerException {
-            if (node == mObtainNode) {
-                return INSTANCE;
-            }
-
-            MethodInsnNode call = null;
-            if (node.getType() == AbstractInsnNode.METHOD_INSN) {
-                call = (MethodInsnNode) node;
-                if (node.getOpcode() == Opcodes.INVOKEVIRTUAL) {
-                    if (call.name.equals(RECYCLE) && call.owner.equals(mRecycleOwner)) {
-                        if (values != null && values.size() == 1 && values.get(0) == INSTANCE) {
-                            mIsCleanedUp = true;
-                            Frame frame = mAnalyzer.getCurrentFrame();
-                            if (frame != null) {
-                                int localSize = frame.getLocals();
-                                for (int i = 0; i < localSize; i++) {
-                                    Value local = frame.getLocal(i);
-                                    if (local == INSTANCE) {
-                                        frame.setLocal(i, RECYCLED);
-                                    }
-                                }
-                                int stackSize = frame.getStackSize();
-                                if (stackSize == 1 && frame.getStack(0) == INSTANCE) {
-                                    frame.pop();
-                                    frame.push(RECYCLED);
-                                }
-                            }
-                            return RECYCLED;
-                        }
-                    } else if ((call.name.equals(COMMIT) || call.name.equals(COMMIT_ALLOWING_LOSS))
-                            && call.owner.equals(mRecycleOwner)) {
-                        if (values != null && values.size() == 1 && values.get(0) == INSTANCE) {
-                            mIsCleanedUp = true;
-                            return INSTANCE;
-                        }
-                    } else if (call.owner.equals(mRecycleOwner)
-                            && hasReturnType(mRecycleOwner, call.desc)) {
-                        // Called method which returns self. This helps handle cases where you call
-                        //   createTransaction().method1().method2().method3().commit() -- if
-                        // method1, 2 and 3 all return "this" then the commit call is really
-                        // called on the createTransaction instance
-                        return INSTANCE;
-                    }
-                }
-            }
-
-            if (values != null && values.size() >= 1) {
-                // Skip the first element: method calls *on* the TypedArray are okay
-                int start = node.getOpcode() == Opcodes.INVOKESTATIC ? 0 : 1;
-                for (int i = 0, n = values.size(); i < n; i++) {
-                    Object v = values.get(i);
-                    if (v == INSTANCE && i >= start) {
-                        // Known special cases
-                        if (node.getOpcode() == Opcodes.INVOKESTATIC) {
-                            assert call != null;
-                            if (call.name.equals(OBTAIN) &&
-                                    call.owner.equals(MOTION_EVENT_CLS)) {
-                                return UNKNOWN;
-                            }
-                        }
-
-                        // Passing the instance to another method: could leak
-                        // the instance out of this method (for example calling
-                        // a method which recycles it on our behalf, or store it
-                        // in some holder which will recycle it later). In this
-                        // case, just assume that things are okay.
-                        mEscapes = true;
-                    } else if (v == RECYCLED && call != null) {
-                        Location location = mContext.getLocation(call);
-                        String message = String.format("This %1$s has already been recycled",
-                                mRecycleOwner.substring(mRecycleOwner.lastIndexOf('/') + 1));
-                        mContext.report(RECYCLE_RESOURCE, mMethod, call, location, message, null);
-                    }
-                }
-            }
-
-            return UNKNOWN;
-        }
-
-        @Override
-        public Value unaryOperation(AbstractInsnNode node, Value value) throws AnalyzerException {
-            return value;
-        }
-
-        @Override
-        public Value ternaryOperation(AbstractInsnNode node, Value value1, Value value2,
-                Value value3) throws AnalyzerException {
-            if (value1 == RECYCLED || value2 == RECYCLED || value3 == RECYCLED) {
-                return RECYCLED;
-            } else  if (value1 == INSTANCE || value2 == INSTANCE || value3 == INSTANCE) {
-                return INSTANCE;
-            }
-            return UNKNOWN;
-        }
-
-        @Override
-        public void returnOperation(AbstractInsnNode node, Value value1, Value value2)
-                throws AnalyzerException {
-            if (value1 == INSTANCE || value2 == INSTANCE) {
-                mEscapes = true;
-            }
-        }
-
-        @Override
-        public Value merge(Value value1, Value value2) {
-            if (value1 == RECYCLED || value2 == RECYCLED) {
-                return RECYCLED;
-            } else if (value1 == INSTANCE || value2 == INSTANCE) {
-                return INSTANCE;
-            }
-            return UNKNOWN;
-        }
-    }
-
-    private static class ResourceAnalyzer extends Analyzer {
-        private Frame mCurrent;
-        private Frame mFrame1;
-        private Frame mFrame2;
-
-        public ResourceAnalyzer(Interpreter interpreter) {
-            super(interpreter);
-        }
-
-        Frame getCurrentFrame() {
-            return mCurrent;
-        }
-
-        @Override
-        protected void init(String owner, MethodNode m) throws AnalyzerException {
-            mCurrent = mFrame2;
-            super.init(owner, m);
-        }
-
-        @Override
-        protected Frame newFrame(int nLocals, int nStack) {
-            // Stash the two most recent frame allocations. When init is called the second
-            // most recently seen frame is the current frame used during execution, which
-            // is where we need to replace INSTANCE with RECYCLED when the void
-            // recycle method is called.
-            Frame newFrame = super.newFrame(nLocals, nStack);
-            mFrame2 = mFrame1;
-            mFrame1 = newFrame;
-            return newFrame;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ColorUsageDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ColorUsageDetector.java
deleted file mode 100644
index 622af71..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ColorUsageDetector.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.RESOURCE_CLZ_COLOR;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import java.io.File;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.MethodInvocation;
-import lombok.ast.Node;
-import lombok.ast.Select;
-
-/**
- * Looks for cases where the code attempts to set a resource id, rather than
- * a resolved color, as the RGB int.
- */
-public class ColorUsageDetector extends Detector implements Detector.JavaScanner {
-    /** Attempting to set a resource id as a color */
-    public static final Issue ISSUE = Issue.create(
-            "ResourceAsColor", //$NON-NLS-1$
-            "Looks for calls to setColor where a resource id is passed instead of a " +
-            "resolved color",
-
-            "Methods that take a color in the form of an integer should be passed " +
-            "an RGB triple, not the actual color resource id. You must call " +
-            "`getResources().getColor(resource)` to resolve the actual color value first.",
-
-            Category.CORRECTNESS,
-            7,
-            Severity.ERROR,
-            ColorUsageDetector.class,
-            Scope.JAVA_FILE_SCOPE);
-
-    /** Constructs a new {@link ColorUsageDetector} check */
-    public ColorUsageDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return true;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    public boolean appliesToResourceRefs() {
-        return true;
-    }
-
-    @Override
-    public void visitResourceReference(@NonNull JavaContext context, @Nullable AstVisitor visitor,
-            @NonNull Node select, @NonNull String type, @NonNull String name, boolean isFramework) {
-        if (type.equals(RESOURCE_CLZ_COLOR)) {
-            while (select.getParent() instanceof Select) {
-                select = select.getParent();
-            }
-
-            // See if this method is being called on a setter
-            if (select.getParent() instanceof MethodInvocation) {
-                MethodInvocation call = (MethodInvocation) select.getParent();
-                String methodName = call.astName().astValue();
-                if (methodName.endsWith("Color")              //$NON-NLS-1$
-                        && methodName.startsWith("set")) {    //$NON-NLS-1$
-                    context.report(
-                            ISSUE, context.getLocation(select), String.format(
-                                "Should pass resolved color instead of resource id here: " +
-                                "getResources().getColor(%1$s)", select.toString()),
-                            null);
-                }
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/CommentDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/CommentDetector.java
deleted file mode 100644
index 6f07e77..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/CommentDetector.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.Comment;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.Node;
-
-/**
- * Looks for issues in Java comments
- */
-public class CommentDetector extends Detector implements Detector.JavaScanner {
-    private static final String STOPSHIP_COMMENT = "STOPSHIP"; //$NON-NLS-1$
-
-    /** Looks for hidden code */
-    public static final Issue EASTEREGG = Issue.create(
-            "EasterEgg", //$NON-NLS-1$
-            "Looks for hidden easter eggs",
-            "An \"easter egg\" is code deliberately hidden in the code, both from potential " +
-            "users and even from other developers. This lint check looks for code which " +
-            "looks like it may be hidden from sight.",
-            Category.SECURITY,
-            6,
-            Severity.WARNING,
-            CommentDetector.class,
-            Scope.JAVA_FILE_SCOPE).setEnabledByDefault(false);
-
-    /** Looks for special comment markers intended to stop shipping the code */
-    public static final Issue STOPSHIP = Issue.create(
-            "StopShip", //$NON-NLS-1$
-            "Looks for comment markers of the form \"STOPSHIP\" which indicates that code " +
-            "should not be released yet",
-
-            "Using the comment `// STOPSHIP` can be used to flag code that is incomplete but " +
-            "checked in. This comment marker can be used to indicate that the code should not " +
-            "be shipped until the issue is addressed, and lint will look for these.",
-            Category.CORRECTNESS,
-            10,
-            Severity.WARNING,
-            CommentDetector.class,
-            Scope.JAVA_FILE_SCOPE).setEnabledByDefault(false);
-
-    private static final String ESCAPE_STRING = "\\u002a\\u002f"; //$NON-NLS-1$
-
-    /** Lombok's AST only passes comment nodes for Javadoc so I need to do manual token scanning
-         instead */
-    private static final boolean USE_AST = false;
-
-
-    /** Constructs a new {@link CommentDetector} check */
-    public CommentDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return true;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.NORMAL;
-    }
-
-    @Override
-    public List<Class<? extends Node>> getApplicableNodeTypes() {
-        if (USE_AST) {
-            return Collections.<Class<? extends Node>>singletonList(Comment.class);
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
-        // Lombok does not generate comment nodes for block and line comments, only for
-        // javadoc comments!
-        if (USE_AST) {
-            return new CommentChecker(context);
-        } else {
-            String source = context.getContents();
-            if (source == null) {
-                return null;
-            }
-            // Process the Java source such that we pass tokens to it
-
-            for (int i = 0, n = source.length() - 1; i < n; i++) {
-                char c = source.charAt(i);
-                if (c == '\\') {
-                    i += 1;
-                } else if (c == '/') {
-                    char next = source.charAt(i + 1);
-                    if (next == '/') {
-                        // Line comment
-                        int start = i + 2;
-                        int end = source.indexOf('\n', start);
-                        if (end == -1) {
-                            end = n;
-                        }
-                        checkComment(context, source, 0, start, end);
-                    } else if (next == '*') {
-                        // Block comment
-                        int start = i + 2;
-                        int end = source.indexOf("*/", start);
-                        if (end == -1) {
-                            end = n;
-                        }
-                        checkComment(context, source, 0, start, end);
-                    }
-                }
-            }
-            return null;
-        }
-    }
-
-    private static class CommentChecker extends ForwardingAstVisitor {
-        private final JavaContext mContext;
-
-        public CommentChecker(JavaContext context) {
-            mContext = context;
-        }
-
-        @Override
-        public boolean visitComment(Comment node) {
-            String contents = node.astContent();
-            checkComment(mContext, contents, node.getPosition().getStart(), 0, contents.length());
-            return super.visitComment(node);
-        }
-    }
-
-    private static void checkComment(
-            @NonNull Context context,
-            @NonNull String source,
-            int offset,
-            int start,
-            int end) {
-        char prev = 0;
-        char c;
-        for (int i = start; i < end - 2; i++, prev = c) {
-            c = source.charAt(i);
-            if (prev == '\\') {
-                if (c == 'u' || c == 'U') {
-                    if (source.regionMatches(true, i - 1, ESCAPE_STRING,
-                            0, ESCAPE_STRING.length())) {
-                        Location location = Location.create(context.file, source,
-                                offset + i - 1, offset + i - 1 + ESCAPE_STRING.length());
-                        context.report(EASTEREGG, location,
-                                "Code might be hidden here; found unicode escape sequence " +
-                                "which is interpreted as comment end, compiled code follows",
-                                null);
-                    }
-                } else {
-                    i++;
-                }
-            } else if (prev == 'S' && c == 'T' &&
-                    source.regionMatches(i - 1, STOPSHIP_COMMENT, 0, STOPSHIP_COMMENT.length())) {
-                // TODO: Only flag this issue in release mode??
-                Location location = Location.create(context.file, source,
-                        offset + i - 1, offset + i - 1 + STOPSHIP_COMMENT.length());
-                context.report(STOPSHIP, location,
-                        "STOPSHIP comment found; points to code which must be fixed prior " +
-                        "to release",
-                        null);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ControlFlowGraph.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ControlFlowGraph.java
deleted file mode 100644
index cbafe28..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ControlFlowGraph.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.google.common.collect.Maps;
-
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.FrameNode;
-import org.objectweb.asm.tree.InsnList;
-import org.objectweb.asm.tree.LabelNode;
-import org.objectweb.asm.tree.LineNumberNode;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.objectweb.asm.tree.TryCatchBlockNode;
-import org.objectweb.asm.tree.analysis.Analyzer;
-import org.objectweb.asm.tree.analysis.AnalyzerException;
-import org.objectweb.asm.tree.analysis.BasicInterpreter;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A {@linkplain ControlFlowGraph} is a graph containing a node for each
- * instruction in a method, and an edge for each possible control flow; usually
- * just "next" for the instruction following the current instruction, but in the
- * case of a branch such as an "if", multiple edges to each successive location,
- * or with a "goto", a single edge to the jumped-to instruction.
- * <p>
- * It also adds edges for abnormal control flow, such as the possibility of a
- * method call throwing a runtime exception.
- */
-public class ControlFlowGraph {
-    /** Map from instructions to nodes */
-    private Map<AbstractInsnNode, Node> mNodeMap;
-
-    /**
-     * Creates a new {@link ControlFlowGraph} and populates it with the flow
-     * control for the given method. If the optional {@code initial} parameter is
-     * provided with an existing graph, then the graph is simply populated, not
-     * created. This allows subclassing of the graph instance, if necessary.
-     *
-     * @param initial usually null, but can point to an existing instance of a
-     *            {@link ControlFlowGraph} in which that graph is reused (but
-     *            populated with new edges)
-     * @param classNode the class containing the method to be analyzed
-     * @param method the method to be analyzed
-     * @return a {@link ControlFlowGraph} with nodes for the control flow in the
-     *         given method
-     * @throws AnalyzerException if the underlying bytecode library is unable to
-     *             analyze the method bytecode
-     */
-    @NonNull
-    public static ControlFlowGraph create(
-            @Nullable ControlFlowGraph initial,
-            @NonNull ClassNode classNode,
-            @NonNull MethodNode method) throws AnalyzerException {
-        final ControlFlowGraph graph = initial != null ? initial : new ControlFlowGraph();
-        final InsnList instructions = method.instructions;
-        graph.mNodeMap = Maps.newHashMapWithExpectedSize(instructions.size());
-
-        // Create a flow control graph using ASM4's analyzer. According to the ASM 4 guide
-        // (download.forge.objectweb.org/asm/asm4-guide.pdf) there are faster ways to construct
-        // it, but those require a lot more code.
-        Analyzer analyzer = new Analyzer(new BasicInterpreter()) {
-            @Override
-            protected void newControlFlowEdge(int insn, int successor) {
-                // Update the information as of whether the this object has been
-                // initialized at the given instruction.
-                AbstractInsnNode from = instructions.get(insn);
-                AbstractInsnNode to = instructions.get(successor);
-                graph.add(from, to);
-            }
-
-            @Override
-            protected boolean newControlFlowExceptionEdge(int insn, TryCatchBlockNode tcb) {
-                AbstractInsnNode from = instructions.get(insn);
-                graph.exception(from, tcb);
-                return super.newControlFlowExceptionEdge(insn, tcb);
-            }
-
-            @Override
-            protected boolean newControlFlowExceptionEdge(int insn, int successor) {
-                AbstractInsnNode from = instructions.get(insn);
-                AbstractInsnNode to = instructions.get(successor);
-                graph.exception(from, to);
-                return super.newControlFlowExceptionEdge(insn, successor);
-            }
-        };
-
-        analyzer.analyze(classNode.name, method);
-        return graph;
-    }
-
-    /** A {@link Node} is a node in the control flow graph for a method, pointing to
-     * the instruction and its possible successors */
-    public static class Node {
-        /** The instruction */
-        public final AbstractInsnNode instruction;
-        /** Any normal successors (e.g. following instruction, or goto or conditional flow) */
-        public final List<Node> successors = new ArrayList<Node>(2);
-        /** Any abnormal successors (e.g. the handler to go to following an exception) */
-        public final List<Node> exceptions = new ArrayList<Node>(1);
-
-        /** A tag for use during depth-first-search iteration of the graph etc */
-        public int visit;
-
-        /**
-         * Constructs a new control graph node
-         *
-         * @param instruction the instruction to associate with this node
-         */
-        public Node(@NonNull AbstractInsnNode instruction) {
-            this.instruction = instruction;
-        }
-
-        void addSuccessor(@NonNull Node node) {
-            if (!successors.contains(node)) {
-                successors.add(node);
-            }
-        }
-
-        void addExceptionPath(@NonNull Node node) {
-            if (!exceptions.contains(node)) {
-                exceptions.add(node);
-            }
-        }
-
-        /**
-         * Represents this instruction as a string, for debugging purposes
-         *
-         * @param includeAdjacent whether it should include a display of
-         *            adjacent nodes as well
-         * @return a string representation
-         */
-        @NonNull
-        public String toString(boolean includeAdjacent) {
-            StringBuilder sb = new StringBuilder(100);
-
-            sb.append(getId(instruction));
-            sb.append(':');
-
-            if (instruction instanceof LabelNode) {
-                //LabelNode l = (LabelNode) instruction;
-                //sb.append('L' + l.getLabel().getOffset() + ":");
-                //sb.append('L' + l.getLabel().info + ":");
-                sb.append("LABEL");
-            } else if (instruction instanceof LineNumberNode) {
-                sb.append("LINENUMBER ").append(((LineNumberNode)instruction).line);
-            } else if (instruction instanceof FrameNode) {
-                sb.append("FRAME");
-            } else {
-                int opcode = instruction.getOpcode();
-                // AbstractVisitor isn't available unless debug/util is included,
-                boolean printed = false;
-                try {
-                    Class<?> cls = Class.forName("org.objectweb.asm.util"); //$NON-NLS-1$
-                    Field field = cls.getField("OPCODES");
-                    String[] OPCODES = (String[]) field.get(null);
-                    printed = true;
-                    if (opcode > 0 && opcode <= OPCODES.length) {
-                        sb.append(OPCODES[opcode]);
-                        if (instruction.getType() == AbstractInsnNode.METHOD_INSN) {
-                            sb.append('(').append(((MethodInsnNode)instruction).name).append(')');
-                        }
-                    }
-                } catch (Throwable t) {
-                    // debug not installed: just do toString() on the instructions
-                }
-                if (!printed) {
-                    if (instruction.getType() == AbstractInsnNode.METHOD_INSN) {
-                        sb.append('(').append(((MethodInsnNode)instruction).name).append(')');
-                    } else {
-                        sb.append(instruction.toString());
-                    }
-                }
-            }
-
-            if (includeAdjacent) {
-                if (successors != null && !successors.isEmpty()) {
-                    sb.append(" Next:");
-                    for (Node successor : successors) {
-                        sb.append(' ');
-                        sb.append(successor.toString(false));
-                    }
-                }
-
-                if (exceptions != null && !exceptions.isEmpty()) {
-                    sb.append(" Exceptions:");
-                    for (Node exception : exceptions) {
-                        sb.append(' ');
-                        sb.append(exception.toString(false));
-                    }
-                }
-                sb.append('\n');
-            }
-
-            return sb.toString();
-        }
-    }
-
-    /** Adds an exception flow to this graph */
-    protected void add(@NonNull AbstractInsnNode from, @NonNull AbstractInsnNode to) {
-        getNode(from).addSuccessor(getNode(to));
-    }
-
-    /** Adds an exception flow to this graph */
-    protected void exception(@NonNull AbstractInsnNode from, @NonNull AbstractInsnNode to) {
-        // For now, these edges appear useless; we also get more specific
-        // information via the TryCatchBlockNode which we use instead.
-        //getNode(from).addExceptionPath(getNode(to));
-    }
-
-    /** Adds an exception try block node to this graph */
-    protected void exception(@NonNull AbstractInsnNode from, @NonNull TryCatchBlockNode tcb) {
-        // Add tcb's to all instructions in the range
-        LabelNode start = tcb.start;
-        LabelNode end = tcb.end; // exclusive
-
-        // Add exception edges for all method calls in the range
-        AbstractInsnNode curr = start;
-        Node handlerNode = getNode(tcb.handler);
-        while (curr != end && curr != null) {
-            if (curr.getType() == AbstractInsnNode.METHOD_INSN) {
-                // Method call; add exception edge to handler
-                if (tcb.type == null) {
-                    // finally block: not an exception path
-                    getNode(curr).addSuccessor(handlerNode);
-                }
-                getNode(curr).addExceptionPath(handlerNode);
-            }
-            curr = curr.getNext();
-        }
-    }
-
-    /**
-     * Looks up (and if necessary) creates a graph node for the given instruction
-     *
-     * @param instruction the instruction
-     * @return the control flow graph node corresponding to the given
-     *         instruction
-     */
-    @NonNull
-    public Node getNode(@NonNull AbstractInsnNode instruction) {
-        Node node = mNodeMap.get(instruction);
-        if (node == null) {
-            node = new Node(instruction);
-            mNodeMap.put(instruction, node);
-        }
-
-        return node;
-    }
-
-    /**
-     * Creates a human readable version of the graph
-     *
-     * @param start the starting instruction, or null if not known or to use the
-     *            first instruction
-     * @return a string version of the graph
-     */
-    @NonNull
-    public String toString(@Nullable Node start) {
-        StringBuilder sb = new StringBuilder(400);
-
-        AbstractInsnNode curr;
-        if (start != null) {
-            curr = start.instruction;
-        } else {
-            if (mNodeMap.isEmpty()) {
-                return "<empty>";
-            } else {
-                curr = mNodeMap.keySet().iterator().next();
-                while (curr.getPrevious() != null) {
-                    curr = curr.getPrevious();
-                }
-            }
-        }
-
-        while (curr != null) {
-            Node node = mNodeMap.get(curr);
-            if (node != null) {
-                sb.append(node.toString(true));
-            }
-            curr = curr.getNext();
-        }
-
-        return sb.toString();
-    }
-
-    @Override
-    public String toString() {
-        return toString(null);
-    }
-
-    // ---- For debugging only ----
-
-    private static Map<Object, String> sIds = null;
-    private static int sNextId = 1;
-    private static String getId(Object object) {
-        if (sIds == null) {
-            sIds = Maps.newHashMap();
-        }
-        String id = sIds.get(object);
-        if (id == null) {
-            id = Integer.toString(sNextId++);
-            sIds.put(object, id);
-        }
-        return id;
-    }
-}
-
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/CutPasteDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/CutPasteDetector.java
deleted file mode 100644
index 84fb6b6..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/CutPasteDetector.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.RESOURCE_CLZ_ID;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.google.common.collect.Maps;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import lombok.ast.ArrayAccess;
-import lombok.ast.AstVisitor;
-import lombok.ast.BinaryExpression;
-import lombok.ast.Cast;
-import lombok.ast.Expression;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.If;
-import lombok.ast.MethodInvocation;
-import lombok.ast.Node;
-import lombok.ast.Select;
-import lombok.ast.Statement;
-import lombok.ast.VariableDefinitionEntry;
-import lombok.ast.VariableReference;
-
-/**
- * Detector looking for cut & paste issues
- */
-public class CutPasteDetector extends Detector implements Detector.JavaScanner {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "CutPasteId", //$NON-NLS-1$
-            "Looks for code cut & paste mistakes in findViewById() calls",
-
-            "This lint check looks for cases where you have cut & pasted calls to " +
-            "`findViewById` but have forgotten to update the R.id field. It's possible " +
-            "that your code is simply (redundantly) looking up the field repeatedly, " +
-            "but lint cannot distinguish that from a case where you for example want to " +
-            "initialize fields `prev` and `next` and you cut & pasted `findViewById(R.id.prev)` " +
-            "and forgot to update the second initialization to `R.id.next`.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.WARNING,
-            CutPasteDetector.class,
-            Scope.JAVA_FILE_SCOPE);
-
-    private Node mLastMethod;
-    private Map<String, MethodInvocation> mIds;
-    private Map<String, String> mLhs;
-    private Map<String, String> mCallOperands;
-
-    /** Constructs a new {@link CutPasteDetector} check */
-    public CutPasteDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return true;
-    }
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    public List<String> getApplicableMethodNames() {
-        return Collections.singletonList("findViewById"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void visitMethod(@NonNull JavaContext context, @Nullable AstVisitor visitor,
-            @NonNull MethodInvocation call) {
-        String lhs = getLhs(call);
-        if (lhs == null) {
-            return;
-        }
-
-        Node method = JavaContext.findSurroundingMethod(call);
-        if (method == null) {
-            return;
-        } else if (method != mLastMethod) {
-            mIds = Maps.newHashMap();
-            mLhs = Maps.newHashMap();
-            mCallOperands = Maps.newHashMap();
-            mLastMethod = method;
-        }
-
-        String callOperand = call.astOperand() != null ? call.astOperand().toString() : "";
-
-        Expression first = call.astArguments().first();
-        if (first instanceof Select) {
-            Select select = (Select) first;
-            String id = select.astIdentifier().astValue();
-            Expression operand = select.astOperand();
-            if (operand instanceof Select) {
-                Select type = (Select) operand;
-                if (type.astIdentifier().astValue().equals(RESOURCE_CLZ_ID)) {
-                    if (mIds.containsKey(id)) {
-                        if (lhs.equals(mLhs.get(id))) {
-                            return;
-                        }
-                        if (!callOperand.equals(mCallOperands.get(id))) {
-                            return;
-                        }
-                        MethodInvocation earlierCall = mIds.get(id);
-                        if (!isReachableFrom(method, earlierCall, call)) {
-                            return;
-                        }
-                        Location location = context.getLocation(call);
-                        Location secondary = context.getLocation(earlierCall);
-                        secondary.setMessage("First usage here");
-                        location.setSecondary(secondary);
-                        context.report(ISSUE, call, location, String.format(
-                            "The id %1$s has already been looked up in this method; possible " +
-                            "cut & paste error?", first.toString()), null);
-                    } else {
-                        mIds.put(id, call);
-                        mLhs.put(id, lhs);
-                        mCallOperands.put(id, callOperand);
-                    }
-                }
-            }
-        }
-    }
-
-    @Nullable
-    private static String getLhs(@NonNull MethodInvocation call) {
-        Node parent = call.getParent();
-        if (parent instanceof Cast) {
-            parent = parent.getParent();
-        }
-
-        if (parent instanceof VariableDefinitionEntry) {
-            VariableDefinitionEntry vde = (VariableDefinitionEntry) parent;
-            return vde.astName().astValue();
-        } else if (parent instanceof BinaryExpression) {
-            BinaryExpression be = (BinaryExpression) parent;
-            Expression left = be.astLeft();
-            if (left instanceof VariableReference || left instanceof Select) {
-                return be.astLeft().toString();
-            } else if (left instanceof ArrayAccess) {
-                ArrayAccess aa = (ArrayAccess) left;
-                return aa.astOperand().toString();
-            }
-        }
-
-        return null;
-    }
-
-    private static boolean isReachableFrom(
-            @NonNull Node method,
-            @NonNull MethodInvocation from,
-            @NonNull MethodInvocation to) {
-        ReachableVisitor visitor = new ReachableVisitor(from, to);
-        method.accept(visitor);
-
-        return visitor.isReachable();
-    }
-
-    private static class ReachableVisitor extends ForwardingAstVisitor {
-        @NonNull private final MethodInvocation mFrom;
-        @NonNull private final MethodInvocation mTo;
-        private boolean mReachable;
-        private boolean mSeenEnd;
-
-        public ReachableVisitor(@NonNull MethodInvocation from, @NonNull MethodInvocation to) {
-            mFrom = from;
-            mTo = to;
-        }
-
-        boolean isReachable() {
-            return mReachable;
-        }
-
-        @Override
-        public boolean visitMethodInvocation(MethodInvocation node) {
-            if (node == mFrom) {
-                mReachable = true;
-            } else if (node == mTo) {
-                mSeenEnd = true;
-
-            }
-            return super.visitMethodInvocation(node);
-        }
-
-        @Override
-        public boolean visitIf(If node) {
-            Expression condition = node.astCondition();
-            Statement body = node.astStatement();
-            Statement elseBody = node.astElseStatement();
-            if (condition != null) {
-                condition.accept(this);
-            }
-            if (body != null) {
-                boolean wasReachable = mReachable;
-                body.accept(this);
-                mReachable = wasReachable;
-            }
-            if (elseBody != null) {
-                boolean wasReachable = mReachable;
-                elseBody.accept(this);
-                mReachable = wasReachable;
-            }
-
-            endVisit(node);
-
-            return false;
-        }
-
-        @Override
-        public boolean visitNode(Node node) {
-            return mSeenEnd;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DeprecationDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DeprecationDetector.java
deleted file mode 100644
index 6475a7a..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DeprecationDetector.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ABSOLUTE_LAYOUT;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_AUTO_TEXT;
-import static com.android.SdkConstants.ATTR_CAPITALIZE;
-import static com.android.SdkConstants.ATTR_EDITABLE;
-import static com.android.SdkConstants.ATTR_ENABLED;
-import static com.android.SdkConstants.ATTR_INPUT_METHOD;
-import static com.android.SdkConstants.ATTR_NUMERIC;
-import static com.android.SdkConstants.ATTR_PASSWORD;
-import static com.android.SdkConstants.ATTR_PHONE_NUMBER;
-import static com.android.SdkConstants.ATTR_SINGLE_LINE;
-import static com.android.SdkConstants.EDIT_TEXT;
-import static com.android.SdkConstants.VALUE_TRUE;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Check which looks for usage of deprecated tags, attributes, etc.
- */
-public class DeprecationDetector extends LayoutDetector {
-    /** Usage of deprecated views or attributes */
-    public static final Issue ISSUE = Issue.create(
-            "Deprecated", //$NON-NLS-1$
-            "Looks for usages of deprecated layouts, attributes, and so on.",
-            "Deprecated views, attributes and so on are deprecated because there " +
-            "is a better way to do something. Do it that new way. You've been warned.",
-            Category.CORRECTNESS,
-            2,
-            Severity.WARNING,
-            DeprecationDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new {@link DeprecationDetector} */
-    public DeprecationDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(
-                ABSOLUTE_LAYOUT
-        );
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return Arrays.asList(
-                // TODO: fill_parent is deprecated as of API 8.
-                // We could warn about it, but it will probably be very noisy
-                // and make people disable the deprecation check; let's focus on
-                // some older flags for now
-                //"fill_parent",
-
-                ATTR_EDITABLE,
-                ATTR_INPUT_METHOD,
-                ATTR_AUTO_TEXT,
-                ATTR_CAPITALIZE,
-
-                // This flag is still used a lot and is still properly handled by TextView
-                // so in the interest of not being too noisy and make people ignore all the
-                // output, keep quiet about this one -for now-.
-                //ATTR_SINGLE_LINE,
-
-                // This attribute is marked deprecated in android.R.attr but apparently
-                // using the suggested replacement of state_enabled doesn't work, see issue 27613
-                //ATTR_ENABLED,
-
-                ATTR_NUMERIC,
-                ATTR_PHONE_NUMBER,
-                ATTR_PASSWORD
-
-                // These attributes are also deprecated; not yet enabled until we
-                // know the API level to apply the deprecation for:
-
-                // "ignored as of ICS (but deprecated earlier)"
-                //"fadingEdge",
-
-                // "This attribute is not used by the Android operating system."
-                //"restoreNeedsApplication",
-
-                // "This will create a non-standard UI appearance, because the search bar UI is
-                // changing to use only icons for its buttons."
-                //"searchButtonText",
-
-        );
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        context.report(ISSUE, element, context.getLocation(element),
-                String.format("%1$s is deprecated", element.getTagName()), null);
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        if (!ANDROID_URI.equals(attribute.getNamespaceURI())) {
-            return;
-        }
-
-        String name = attribute.getLocalName();
-        String fix;
-        int minSdk = 1;
-        if (name.equals(ATTR_EDITABLE)) {
-            if (!EDIT_TEXT.equals(attribute.getOwnerElement().getTagName())) {
-                fix = "Use an <EditText> to make it editable";
-            } else {
-                if (VALUE_TRUE.equals(attribute.getValue())) {
-                    fix = "<EditText> is already editable";
-                } else {
-                    fix = "Use inputType instead";
-                }
-            }
-        } else if (name.equals(ATTR_ENABLED)) {
-            fix = "Use state_enabled instead";
-        } else if (name.equals(ATTR_SINGLE_LINE)) {
-            fix = "Use maxLines=\"1\" instead";
-        } else {
-            assert name.equals(ATTR_INPUT_METHOD)
-                || name.equals(ATTR_CAPITALIZE)
-                || name.equals(ATTR_NUMERIC)
-                || name.equals(ATTR_PHONE_NUMBER)
-                || name.equals(ATTR_PASSWORD)
-                || name.equals(ATTR_AUTO_TEXT);
-            fix = "Use inputType instead";
-            // The inputType attribute was introduced in API 3 so don't warn about
-            // deprecation if targeting older platforms
-            minSdk = 3;
-        }
-
-        if (context.getProject().getMinSdk() < minSdk) {
-            return;
-        }
-
-        context.report(ISSUE, attribute, context.getLocation(attribute),
-                String.format("%1$s is deprecated: %2$s",
-                        attribute.getName(), fix), null);
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DetectMissingPrefix.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DetectMissingPrefix.java
deleted file mode 100644
index 2b24732..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DetectMissingPrefix.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_PKG_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ATTR_CORE_APP;
-import static com.android.SdkConstants.ATTR_LAYOUT;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ATTR_PACKAGE;
-import static com.android.SdkConstants.ATTR_STYLE;
-import static com.android.SdkConstants.TOOLS_URI;
-import static com.android.SdkConstants.VIEW_TAG;
-import static com.android.SdkConstants.XMLNS_PREFIX;
-import static com.android.resources.ResourceFolderType.ANIM;
-import static com.android.resources.ResourceFolderType.ANIMATOR;
-import static com.android.resources.ResourceFolderType.COLOR;
-import static com.android.resources.ResourceFolderType.DRAWABLE;
-import static com.android.resources.ResourceFolderType.INTERPOLATOR;
-import static com.android.resources.ResourceFolderType.LAYOUT;
-import static com.android.resources.ResourceFolderType.MENU;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Detects layout attributes on builtin Android widgets that do not specify
- * a prefix but probably should.
- */
-public class DetectMissingPrefix extends LayoutDetector {
-
-    /** Attributes missing the android: prefix */
-    public static final Issue MISSING_NAMESPACE = Issue.create(
-            "MissingPrefix", //$NON-NLS-1$
-            "Detect XML attributes not using the Android namespace",
-            "Most Android views have attributes in the Android namespace. When referencing " +
-            "these attributes you *must* include the namespace prefix, or your attribute will " +
-            "be interpreted by `aapt` as just a custom attribute.\n" +
-            "\n" +
-            "Similarly, in manifest files, nearly all attributes should be in the `android:` " +
-            "namespace.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.ERROR,
-            DetectMissingPrefix.class,
-            EnumSet.of(Scope.MANIFEST, Scope.RESOURCE_FILE))
-            .addAnalysisScope(Scope.MANIFEST_SCOPE)
-            .addAnalysisScope(Scope.RESOURCE_FILE_SCOPE);
-
-    private static final Set<String> NO_PREFIX_ATTRS = new HashSet<String>();
-    static {
-        NO_PREFIX_ATTRS.add(ATTR_CLASS);
-        NO_PREFIX_ATTRS.add(ATTR_STYLE);
-        NO_PREFIX_ATTRS.add(ATTR_LAYOUT);
-        NO_PREFIX_ATTRS.add(ATTR_PACKAGE);
-        NO_PREFIX_ATTRS.add(ATTR_CORE_APP);
-    }
-
-    /** Constructs a new {@link DetectMissingPrefix} */
-    public DetectMissingPrefix() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == LAYOUT
-                || folderType == MENU
-                || folderType == DRAWABLE
-                || folderType == ANIM
-                || folderType == ANIMATOR
-                || folderType == COLOR
-                || folderType == INTERPOLATOR;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return ALL;
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        String uri = attribute.getNamespaceURI();
-        if (uri == null || uri.isEmpty()) {
-            String name = attribute.getName();
-            if (name == null) {
-                return;
-            }
-            if (NO_PREFIX_ATTRS.contains(name)) {
-                return;
-            }
-
-            Element element = attribute.getOwnerElement();
-            if (isCustomView(element) && context.getResourceFolderType() != null) {
-                return;
-            }
-
-            if (name.startsWith(XMLNS_PREFIX)) {
-                return;
-            }
-
-            context.report(MISSING_NAMESPACE, attribute,
-                    context.getLocation(attribute),
-                    "Attribute is missing the Android namespace prefix",
-                    null);
-        } else if (!ANDROID_URI.equals(uri)
-                && !TOOLS_URI.equals(uri)
-                && context.getResourceFolderType() == ResourceFolderType.LAYOUT
-                && !isCustomView(attribute.getOwnerElement())
-                && !attribute.getLocalName().startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)
-                // TODO: Consider not enforcing that the parent is a custom view
-                // too, though in that case we should filter out views that are
-                // layout params for the custom view parent:
-                // ....&& !attribute.getLocalName().startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)
-                && attribute.getOwnerElement().getParentNode().getNodeType() == Node.ELEMENT_NODE
-                && !isCustomView((Element) attribute.getOwnerElement().getParentNode())) {
-            context.report(MISSING_NAMESPACE, attribute,
-                    context.getLocation(attribute),
-                    String.format("Unexpected namespace prefix \"%1$s\" found for tag %2$s",
-                            attribute.getPrefix(), attribute.getOwnerElement().getTagName()),
-                            null);
-        }
-    }
-
-    private static boolean isCustomView(Element element) {
-        // If this is a custom view, the usage of custom attributes can be legitimate
-        String tag = element.getTagName();
-        if (tag.equals(VIEW_TAG)) {
-            // <view class="my.custom.view" ...>
-            return true;
-        }
-
-        return tag.indexOf('.') != -1 && !tag.startsWith(ANDROID_PKG_PREFIX);
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DosLineEndingDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DosLineEndingDetector.java
deleted file mode 100644
index 1a2a720..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DosLineEndingDetector.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Document;
-
-/**
- * Checks that the line endings in DOS files are consistent
- */
-public class DosLineEndingDetector extends LayoutDetector {
-    /** Detects mangled DOS line ending documents */
-    public static final Issue ISSUE = Issue.create(
-            "MangledCRLF", //$NON-NLS-1$
-            "Checks that files with DOS line endings are consistent",
-
-            "On Windows, line endings are typically recorded as carriage return plus " +
-            "newline: \\r\\n.\n" +
-            "\n" +
-            "This detector looks for invalid line endings with repeated carriage return " +
-            "characters (without newlines). Previous versions of the ADT plugin could " +
-            "accidentally introduce these into the file, and when editing the file, the " +
-            "editor could produce confusing visual artifacts.",
-
-            Category.CORRECTNESS,
-            2,
-            Severity.ERROR,
-            DosLineEndingDetector.class,
-            Scope.RESOURCE_FILE_SCOPE)
-            .setMoreInfo("https://bugs.eclipse.org/bugs/show_bug.cgi?id=375421"); //$NON-NLS-1$
-
-     /** Constructs a new {@link DosLineEndingDetector} */
-    public DosLineEndingDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.NORMAL;
-    }
-
-    @Override
-    public void visitDocument(@NonNull XmlContext context, @NonNull Document document) {
-        String contents = context.getContents();
-        if (contents == null) {
-            return;
-        }
-
-        // We could look for *consistency* and complain if you mix \n and \r\n too,
-        // but that isn't really a problem (most editors handle it) so let's
-        // not complain needlessly.
-
-        char prev =  0;
-        for (int i = 0, n = contents.length(); i < n; i++) {
-            char c = contents.charAt(i);
-            if (c == '\r' && prev == '\r') {
-                String message = "Incorrect line ending: found carriage return (\\r) without " +
-                        "corresponding newline (\\n)";
-
-                // Mark the whole line as the error range, since pointing just to the
-                // line ending makes the error invisible in IDEs and error reports etc
-                // Find the most recent non-blank line
-                boolean blankLine = true;
-                for (int index = i - 2; index < i; index++) {
-                    char d = contents.charAt(index);
-                    if (!Character.isWhitespace(d)) {
-                        blankLine = false;
-                    }
-                }
-
-                int lineBegin = i;
-                for (int index = i - 2; index >= 0; index--) {
-                    char d = contents.charAt(index);
-                    if (d == '\n') {
-                        lineBegin = index + 1;
-                        if (!blankLine) {
-                            break;
-                        }
-                    } else if (!Character.isWhitespace(d)) {
-                        blankLine = false;
-                    }
-                }
-
-                int lineEnd = Math.min(contents.length(), i + 1);
-                Location location = Location.create(context.file, contents, lineBegin, lineEnd);
-                context.report(ISSUE, document.getDocumentElement(), location, message, null);
-                return;
-            }
-            prev = c;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DuplicateIdDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DuplicateIdDetector.java
deleted file mode 100644
index de3e4d2..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DuplicateIdDetector.java
+++ /dev/null
@@ -1,673 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.io.File;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Checks for duplicate ids within a layout and within an included layout
- */
-public class DuplicateIdDetector extends LayoutDetector {
-    private Set<String> mIds;
-    private Map<File, Set<String>> mFileToIds;
-    private Map<File, List<String>> mIncludes;
-
-    // Data structures used for location collection in phase 2
-
-    // Map from include files to include names to pairs of message and location
-    // Map from file defining id, to the id to be defined, to a pair of location and message
-    private Multimap<File, Multimap<String, Occurrence>> mLocations;
-    private List<Occurrence> mErrors;
-
-    /** The main issue discovered by this detector */
-    public static final Issue WITHIN_LAYOUT = Issue.create(
-            "DuplicateIds", //$NON-NLS-1$
-            "Checks for duplicate ids within a single layout",
-            "Within a layout, id's should be unique since otherwise `findViewById()` can " +
-            "return an unexpected view.",
-            Category.CORRECTNESS,
-            7,
-            Severity.WARNING,
-            DuplicateIdDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** The main issue discovered by this detector */
-    public static final Issue CROSS_LAYOUT = Issue.create(
-            "DuplicateIncludedIds", //$NON-NLS-1$
-            "Checks for duplicate ids across layouts that are combined with include tags",
-            "It's okay for two independent layouts to use the same ids. However, if " +
-            "layouts are combined with include tags, then the id's need to be unique " +
-            "within any chain of included layouts, or `Activity#findViewById()` can " +
-            "return an unexpected view.",
-            Category.CORRECTNESS,
-            6,
-            Severity.WARNING,
-            DuplicateIdDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    /** Constructs a duplicate id check */
-    public DuplicateIdDetector() {
-    }
-
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.LAYOUT || folderType == ResourceFolderType.MENU;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return Collections.singletonList(ATTR_ID);
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(VIEW_INCLUDE);
-    }
-
-    @Override
-    public void beforeCheckFile(@NonNull Context context) {
-        if (context.getPhase() == 1) {
-            mIds = new HashSet<String>();
-        }
-    }
-
-    @Override
-    public void afterCheckFile(@NonNull Context context) {
-        if (context.getPhase() == 1) {
-            // Store this layout's set of ids for full project analysis in afterCheckProject
-            mFileToIds.put(context.file, mIds);
-
-            mIds = null;
-        }
-    }
-
-    @Override
-    public void beforeCheckProject(@NonNull Context context) {
-        if (context.getPhase() == 1) {
-            mFileToIds = new HashMap<File, Set<String>>();
-            mIncludes = new HashMap<File, List<String>>();
-        }
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (context.getPhase() == 1) {
-            // Look for duplicates
-            if (!mIncludes.isEmpty()) {
-                // Traverse all the include chains and ensure that there are no duplicates
-                // across.
-                if (context.isEnabled(CROSS_LAYOUT)
-                        && context.getScope().contains(Scope.ALL_RESOURCE_FILES)) {
-                    IncludeGraph graph = new IncludeGraph(context);
-                    graph.check();
-                }
-            }
-        } else {
-            assert context.getPhase() == 2;
-
-            if (mErrors != null) {
-                for (Occurrence occurrence : mErrors) {
-                    //assert location != null : occurrence;
-                    Location location = occurrence.location;
-                    if (location == null) {
-                        location = Location.create(occurrence.file);
-                    } else {
-                        Object clientData = location.getClientData();
-                        if (clientData instanceof Node) {
-                            Node node = (Node) clientData;
-                            if (context.getDriver().isSuppressed(CROSS_LAYOUT, node)) {
-                                continue;
-                            }
-                        }
-                    }
-
-                    List<Occurrence> sorted = new ArrayList<Occurrence>();
-                    Occurrence curr = occurrence.next;
-                    while (curr != null) {
-                        sorted.add(curr);
-                        curr = curr.next;
-                    }
-                    Collections.sort(sorted);
-                    Location prev = location;
-                    for (Occurrence o : sorted) {
-                        if (o.location != null) {
-                            prev.setSecondary(o.location);
-                            prev = o.location;
-                        }
-                    }
-
-                    context.report(CROSS_LAYOUT, location, occurrence.message, null);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        // Record include graph such that we can look for inter-layout duplicates after the
-        // project has been fully checked
-
-        String layout = element.getAttribute(ATTR_LAYOUT); // NOTE: Not in android: namespace
-        if (layout.startsWith(LAYOUT_RESOURCE_PREFIX)) { // Ignore @android:layout/ layouts
-            layout = layout.substring(LAYOUT_RESOURCE_PREFIX.length());
-
-            if (context.getPhase() == 1) {
-                if (!context.getProject().getReportIssues()) {
-                    // If this is a library project not being analyzed, ignore it
-                    return;
-                }
-
-                List<String> to = mIncludes.get(context.file);
-                if (to == null) {
-                    to = new ArrayList<String>();
-                    mIncludes.put(context.file, to);
-                }
-                to.add(layout);
-            } else {
-                assert context.getPhase() == 2;
-
-                Collection<Multimap<String, Occurrence>> maps = mLocations.get(context.file);
-                if (maps != null && !maps.isEmpty()) {
-                    for (Multimap<String, Occurrence> map : maps) {
-                        if (!maps.isEmpty()) {
-                            Collection<Occurrence> occurrences = map.get(layout);
-                            if (occurrences != null && !occurrences.isEmpty()) {
-                                for (Occurrence occurrence : occurrences) {
-                                    Location location = context.getLocation(element);
-                                    location.setClientData(element);
-                                    location.setMessage(occurrence.message);
-                                    location.setSecondary(occurrence.location);
-                                    occurrence.location = location;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        assert attribute.getName().equals(ATTR_ID) || attribute.getLocalName().equals(ATTR_ID);
-        String id = attribute.getValue();
-        if (context.getPhase() == 1) {
-            if (mIds.contains(id)) {
-                Location location = context.getLocation(attribute);
-
-                Attr first = findIdAttribute(attribute.getOwnerDocument(), id);
-                if (first != null && first != attribute) {
-                    Location secondLocation = context.getLocation(first);
-                    secondLocation.setMessage(String.format("%1$s originally defined here", id));
-                    location.setSecondary(secondLocation);
-                }
-
-                context.report(WITHIN_LAYOUT, attribute, location,
-                        String.format("Duplicate id %1$s, already defined earlier in this layout",
-                                id), null);
-            } else if (id.startsWith(NEW_ID_PREFIX)) {
-                // Skip id's on include tags
-                if (attribute.getOwnerElement().getTagName().equals(VIEW_INCLUDE)) {
-                    return;
-                }
-
-                mIds.add(id);
-            }
-        } else {
-            Collection<Multimap<String, Occurrence>> maps = mLocations.get(context.file);
-            if (maps != null && !maps.isEmpty()) {
-                for (Multimap<String, Occurrence> map : maps) {
-                    if (!maps.isEmpty()) {
-                        Collection<Occurrence> occurrences = map.get(id);
-                        if (occurrences != null && !occurrences.isEmpty()) {
-                            for (Occurrence occurrence : occurrences) {
-                                if (context.getDriver().isSuppressed(CROSS_LAYOUT, attribute)) {
-                                    return;
-                                }
-                                Location location = context.getLocation(attribute);
-                                location.setClientData(attribute);
-                                location.setMessage(occurrence.message);
-                                location.setSecondary(occurrence.location);
-                                occurrence.location = location;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /** Find the first id attribute with the given value below the given node */
-    private static Attr findIdAttribute(Node node, String targetValue) {
-        if (node.getNodeType() == Node.ELEMENT_NODE) {
-            Attr attribute = ((Element) node).getAttributeNodeNS(ANDROID_URI, ATTR_ID);
-            if (attribute != null && attribute.getValue().equals(targetValue)) {
-                return attribute;
-            }
-        }
-
-        NodeList children = node.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            Attr result = findIdAttribute(child, targetValue);
-            if (result != null) {
-                return result;
-            }
-        }
-
-        return null;
-    }
-
-    /** Include Graph Node */
-    private static class Layout {
-        private final File mFile;
-        private final Set<String> mIds;
-        private List<Layout> mIncludes;
-        private List<Layout> mIncludedBy;
-
-        Layout(File file, Set<String> ids) {
-            mFile = file;
-            mIds = ids;
-        }
-
-        Set<String> getIds() {
-            return mIds;
-        }
-
-        String getLayoutName() {
-            return LintUtils.getLayoutName(mFile);
-        }
-
-        String getDisplayName() {
-            return mFile.getParentFile().getName() + File.separator + mFile.getName();
-        }
-
-        void include(Layout target) {
-            if (mIncludes == null) {
-                mIncludes = new ArrayList<Layout>();
-            }
-            mIncludes.add(target);
-
-            if (target.mIncludedBy == null) {
-                target.mIncludedBy = new ArrayList<Layout>();
-            }
-            target.mIncludedBy.add(this);
-        }
-
-        boolean isIncluded() {
-            return mIncludedBy != null && !mIncludedBy.isEmpty();
-        }
-
-        File getFile() {
-            return mFile;
-        }
-
-        List<Layout> getIncludes() {
-            return mIncludes;
-        }
-
-        @Override
-        public String toString() {
-            return getDisplayName();
-        }
-    }
-
-    private class IncludeGraph {
-        private final Context mContext;
-        private final Map<File, Layout> mFileToLayout;
-
-        public IncludeGraph(Context context) {
-            mContext = context;
-
-            // Produce a DAG of the files to be included, and compute edges to all eligible
-            // includes.
-            // Then visit the DAG and whenever you find a duplicate emit a warning about the
-            // include path which reached it.
-            mFileToLayout = new HashMap<File, Layout>(2 * mIncludes.size());
-            for (File file : mIncludes.keySet()) {
-                if (!mFileToLayout.containsKey(file)) {
-                    mFileToLayout.put(file, new Layout(file, mFileToIds.get(file)));
-                }
-            }
-            for (File file : mFileToIds.keySet()) {
-                Set<String> ids = mFileToIds.get(file);
-                if (ids != null && !ids.isEmpty()) {
-                    if (!mFileToLayout.containsKey(file)) {
-                        mFileToLayout.put(file, new Layout(file, ids));
-                    }
-                }
-            }
-            Multimap<String, Layout> nameToLayout =
-                    ArrayListMultimap.create(mFileToLayout.size(), 4);
-            for (File file : mFileToLayout.keySet()) {
-                String name = LintUtils.getLayoutName(file);
-                nameToLayout.put(name, mFileToLayout.get(file));
-            }
-
-            // Build up the DAG
-            for (File file : mIncludes.keySet()) {
-                Layout from = mFileToLayout.get(file);
-                assert from != null : file;
-
-                List<String> includedLayouts = mIncludes.get(file);
-                for (String name : includedLayouts) {
-                    Collection<Layout> layouts = nameToLayout.get(name);
-                    if (layouts != null && !layouts.isEmpty()) {
-                        if (layouts.size() == 1) {
-                            from.include(layouts.iterator().next());
-                        } else {
-                            // See if we have an obvious match
-                            File folder = from.getFile().getParentFile();
-                            File candidate = new File(folder, name + DOT_XML);
-                            Layout candidateLayout = mFileToLayout.get(candidate);
-                            if (candidateLayout != null) {
-                                from.include(candidateLayout);
-                            } else if (mFileToIds.containsKey(candidate)) {
-                                // We had an entry in mFileToIds, but not a layout: this
-                                // means that the file exists, but had no includes or ids.
-                                // This can't be a valid match: there is a layout that we know
-                                // the include will pick, but it has no includes (to other layouts)
-                                // and no ids, so no need to look at it
-                                continue;
-                            } else {
-                                for (Layout to : layouts) {
-                                    // Decide if the two targets are compatible
-                                    if (isCompatible(from, to)) {
-                                        from.include(to);
-                                    }
-                                }
-                            }
-                        }
-                    } else {
-                        // The layout is including some layout which has no ids or other includes
-                        // so it's not relevant for a duplicate id search
-                        continue;
-                    }
-                }
-            }
-        }
-
-        /** Determine whether two layouts are compatible. They are not if they (for example)
-         * specify conflicting qualifiers such as {@code -land} and {@code -port}.
-         * @param from the include from
-         * @param to the include to
-         * @return true if the two are compatible */
-        boolean isCompatible(Layout from, Layout to) {
-            File fromFolder = from.mFile.getParentFile();
-            File toFolder = to.mFile.getParentFile();
-            if (fromFolder.equals(toFolder)) {
-                return true;
-            }
-
-            String[] fromQualifiers = fromFolder.getName().split("-"); //$NON-NLS-1$
-            String[] toQualifiers = toFolder.getName().split("-"); //$NON-NLS-1$
-
-            if (isPortrait(fromQualifiers) != isPortrait(toQualifiers)) {
-                return false;
-            }
-
-            return true;
-        }
-
-        private boolean isPortrait(String[] qualifiers) {
-            for (String qualifier : qualifiers) {
-                if (qualifier.equals("port")) { //$NON-NLS-1$
-                    return true;
-                } else if (qualifier.equals("land")) { //$NON-NLS-1$
-                    return false;
-                }
-            }
-
-            return true; // it's the default
-        }
-
-        public void check() {
-            // Visit the DAG, looking for conflicts
-            for (Layout layout : mFileToLayout.values()) {
-                if (!layout.isIncluded()) { // Only check from "root" nodes
-                    Deque<Layout> stack = new ArrayDeque<Layout>();
-                    getIds(layout, stack, new HashSet<Layout>());
-                }
-            }
-        }
-
-        /**
-         * Computes the cumulative set of ids used in a given layout. We can't
-         * just depth-first-search the graph and check the set of ids
-         * encountered along the way, because we need to detect when multiple
-         * includes contribute the same ids. For example, if a file is included
-         * more than once, that would result in duplicates.
-         */
-        private Set<String> getIds(Layout layout, Deque<Layout> stack, Set<Layout> seen) {
-            seen.add(layout);
-
-            Set<String> layoutIds = layout.getIds();
-            List<Layout> includes = layout.getIncludes();
-            if (includes != null) {
-                Set<String> ids = new HashSet<String>();
-                if (layoutIds != null) {
-                    ids.addAll(layoutIds);
-                }
-
-                stack.push(layout);
-
-                Multimap<String, Set<String>> nameToIds =
-                        ArrayListMultimap.create(includes.size(), 4);
-
-                for (Layout included : includes) {
-                    if (seen.contains(included)) {
-                        continue;
-                    }
-                    Set<String> includedIds = getIds(included, stack, seen);
-                    if (includedIds != null) {
-                        String layoutName = included.getLayoutName();
-
-                        idCheck:
-                        for (String id : includedIds) {
-                            if (ids.contains(id)) {
-                                Collection<Set<String>> idSets = nameToIds.get(layoutName);
-                                if (idSets != null) {
-                                    for (Set<String> siblingIds : idSets) {
-                                        if (siblingIds.contains(id)) {
-                                            // The id reference was added by a sibling,
-                                            // so no need to complain (again)
-                                            continue idCheck;
-                                        }
-                                    }
-                                }
-
-                                // Duplicate! Record location request for new phase.
-                                if (mLocations == null) {
-                                    mErrors = new ArrayList<Occurrence>();
-                                    mLocations = ArrayListMultimap.create();
-                                    mContext.getDriver().requestRepeat(DuplicateIdDetector.this,
-                                            Scope.ALL_RESOURCES_SCOPE);
-                                }
-
-                                Map<Layout, Occurrence> occurrences =
-                                        new HashMap<Layout, Occurrence>();
-                                findId(layout, id, new ArrayDeque<Layout>(), occurrences,
-                                        new HashSet<Layout>());
-                                assert occurrences.size() >= 2;
-
-                                // Stash a request to find the given include
-                                Collection<Occurrence> values = occurrences.values();
-                                List<Occurrence> sorted = new ArrayList<Occurrence>(values);
-                                Collections.sort(sorted);
-                                String msg = String.format(
-                                        "Duplicate id %1$s, defined or included multiple " +
-                                        "times in %2$s: %3$s",
-                                        id, layout.getDisplayName(),
-                                        sorted.toString());
-
-                                // Store location request for the <include> tag
-                                Occurrence primary = new Occurrence(layout.getFile(), msg, null);
-                                Multimap<String, Occurrence> m = ArrayListMultimap.create();
-                                m.put(layoutName, primary);
-                                mLocations.put(layout.getFile(), m);
-                                mErrors.add(primary);
-
-                                Occurrence prev = primary;
-
-                                // Now store all the included occurrences of the id
-                                for (Occurrence occurrence : values) {
-                                    if (occurrence.file.equals(layout.getFile())) {
-                                        occurrence.message = "Defined here";
-                                    } else {
-                                        occurrence.message = String.format(
-                                                "Defined here, included via %1$s",
-                                                occurrence.includePath);
-                                    }
-
-                                    m = ArrayListMultimap.create();
-                                    m.put(id, occurrence);
-                                    mLocations.put(occurrence.file, m);
-
-                                    // Link locations together
-                                    prev.next = occurrence;
-                                    prev = occurrence;
-                                }
-                            }
-                            ids.add(id);
-                        }
-
-                        // Store these ids such that on a conflict, we can tell when
-                        // an id was added by a single variation of this file
-                        nameToIds.put(layoutName, includedIds);
-                    }
-                }
-                Layout visited = stack.pop();
-                assert visited == layout;
-                return ids;
-            } else {
-                return layoutIds;
-            }
-        }
-
-        private void findId(Layout layout, String id, Deque<Layout> stack,
-                Map<Layout, Occurrence> occurrences, Set<Layout> seen) {
-            seen.add(layout);
-
-            Set<String> layoutIds = layout.getIds();
-            if (layoutIds != null && layoutIds.contains(id)) {
-                StringBuilder path = new StringBuilder(80);
-
-                if (!stack.isEmpty()) {
-                    Iterator<Layout> iterator = stack.descendingIterator();
-                    while (iterator.hasNext()) {
-                        path.append(iterator.next().getDisplayName());
-                        path.append(" => ");
-                    }
-                }
-                path.append(layout.getDisplayName());
-                path.append(" defines ");
-                path.append(id);
-
-                assert occurrences.get(layout) == null : id + ',' + layout;
-                occurrences.put(layout, new Occurrence(layout.getFile(), null, path.toString()));
-            }
-
-            List<Layout> includes = layout.getIncludes();
-            if (includes != null) {
-                stack.push(layout);
-                for (Layout included : includes) {
-                    if (!seen.contains(included)) {
-                        findId(included, id, stack, occurrences, seen);
-                    }
-                }
-                Layout visited = stack.pop();
-                assert visited == layout;
-            }
-        }
-    }
-
-    private static class Occurrence implements Comparable<Occurrence> {
-        public final File file;
-        public final String includePath;
-        public Occurrence next;
-        public Location location;
-        public String message;
-
-        public Occurrence(File file, String message, String includePath) {
-            this.file = file;
-            this.message = message;
-            this.includePath = includePath;
-        }
-
-        @Override
-        public String toString() {
-            return includePath != null ? includePath : message;
-        }
-
-        @Override
-        public int compareTo(Occurrence other) {
-            // First sort by length, then sort by name
-            int delta = toString().length() - other.toString().length();
-            if (delta != 0) {
-                return delta;
-            }
-
-            return toString().compareTo(other.toString());
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DuplicateResourceDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DuplicateResourceDetector.java
deleted file mode 100644
index 004303c..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/DuplicateResourceDetector.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_TYPE;
-import static com.android.SdkConstants.TAG_ITEM;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Location.Handle;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.android.utils.Pair;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * This detector identifies cases where a resource is defined multiple times in the
- * same resource folder
- */
-public class DuplicateResourceDetector extends ResourceXmlDetector {
-
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "DuplicateDefinition", //$NON-NLS-1$
-            "Discovers duplicate definitions of resources",
-
-            "You can define a resource multiple times in different resource folders; that's how " +
-            "string translations are done, for example. However, defining the same resource " +
-            "more than once in the same resource folder is likely an error, for example " +
-            "attempting to add a new resource without realizing that the name is already used, " +
-            "and so on.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.ERROR,
-            DuplicateResourceDetector.class,
-            Scope.ALL_RESOURCES_SCOPE).addAnalysisScope(Scope.RESOURCE_FILE_SCOPE);
-
-    private static final String PRODUCT = "product";   //$NON-NLS-1$
-    private Map<ResourceType, Set<String>> mTypeMap;
-    private Map<ResourceType, List<Pair<String, Location.Handle>>> mLocations;
-    private File mParent;
-
-    /** Constructs a new {@link DuplicateResourceDetector} */
-    public DuplicateResourceDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.NORMAL;
-    }
-
-    @Override
-    @Nullable
-    public Collection<String> getApplicableAttributes() {
-        return Collections.singletonList(ATTR_NAME);
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.VALUES;
-    }
-
-    @Override
-    public void beforeCheckFile(@NonNull Context context) {
-        File parent = context.file.getParentFile();
-        if (!parent.equals(mParent)) {
-            mParent = parent;
-            mTypeMap = Maps.newEnumMap(ResourceType.class);
-            mLocations = Maps.newEnumMap(ResourceType.class);
-        }
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        Element element = attribute.getOwnerElement();
-
-        if (element.hasAttribute(PRODUCT)) {
-            return;
-        }
-
-        String tag = element.getTagName();
-        String typeString = tag;
-        if (tag.equals(TAG_ITEM)) {
-            typeString = element.getAttribute(ATTR_TYPE);
-        }
-        ResourceType type = ResourceType.getEnum(typeString);
-        if (type == null) {
-            return;
-        }
-
-        if (type == ResourceType.ATTR
-                && element.getParentNode().getNodeName().equals(
-                        ResourceType.DECLARE_STYLEABLE.getName())) {
-            return;
-        }
-
-        Set<String> names = mTypeMap.get(type);
-        if (names == null) {
-            names = Sets.newHashSetWithExpectedSize(40);
-            mTypeMap.put(type, names);
-        }
-
-        String name = attribute.getValue();
-        if (names.contains(name)) {
-            String message = String.format("%1$s has already been defined in this folder",
-                    name);
-            Location location = context.getLocation(attribute);
-            List<Pair<String, Handle>> list = mLocations.get(type);
-            for (Pair<String, Handle> pair : list) {
-                if (name.equals(pair.getFirst())) {
-                    Location secondary = pair.getSecond().resolve();
-                    secondary.setMessage("Previously defined here");
-                    location.setSecondary(secondary);
-                }
-            }
-            context.report(ISSUE, attribute, location, message, null);
-        } else {
-            names.add(name);
-            List<Pair<String, Handle>> list = mLocations.get(type);
-            if (list == null) {
-                list = Lists.newArrayList();
-                mLocations.put(type, list);
-            }
-            Location.Handle handle = context.parser.createLocationHandle(context, attribute);
-            list.add(Pair.of(name, handle));
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ExtraTextDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ExtraTextDetector.java
deleted file mode 100644
index e0781db..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ExtraTextDetector.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.DefaultPosition;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Position;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Check which looks for invalid resources. Aapt already performs some validation,
- * such as making sure that resource references point to resources that exist, but this
- * detector looks for additional issues.
- */
-public class ExtraTextDetector extends ResourceXmlDetector {
-    private boolean mFoundText;
-
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "ExtraText", //$NON-NLS-1$
-            "Looks for extraneous text in layout files",
-            "Layout resource files should only contain elements and attributes. Any XML " +
-            "text content found in the file is likely accidental (and potentially " +
-            "dangerous if the text resembles XML and the developer believes the text " +
-            "to be functional)",
-            Category.CORRECTNESS,
-            3,
-            Severity.WARNING,
-            ExtraTextDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new detector */
-    public ExtraTextDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.LAYOUT
-                || folderType == ResourceFolderType.MENU
-                || folderType == ResourceFolderType.ANIM
-                || folderType == ResourceFolderType.ANIMATOR
-                || folderType == ResourceFolderType.DRAWABLE
-                || folderType == ResourceFolderType.COLOR;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public void visitDocument(@NonNull XmlContext context, @NonNull Document document) {
-        mFoundText = false;
-        visitNode(context, document);
-    }
-
-    private void visitNode(XmlContext context, Node node) {
-        short nodeType = node.getNodeType();
-        if (nodeType == Node.TEXT_NODE && !mFoundText) {
-            String text = node.getNodeValue();
-            for (int i = 0, n = text.length(); i < n; i++) {
-                char c = text.charAt(i);
-                if (!Character.isWhitespace(c)) {
-                    String snippet = text.trim();
-                    int maxLength = 100;
-                    if (snippet.length() > maxLength) {
-                        snippet = snippet.substring(0, maxLength) + "...";
-                    }
-                    Location location = context.getLocation(node);
-                    if (i > 0) {
-                        // Adjust the error position to point to the beginning of
-                        // the text rather than the beginning of the text node
-                        // (which is often the newline at the end of the previous
-                        // line and the indentation)
-                        Position start = location.getStart();
-                        if (start != null) {
-                            int line = start.getLine();
-                            int column = start.getColumn();
-                            int offset = start.getOffset();
-
-                            for (int j = 0; j < i; j++) {
-                                offset++;
-
-                                if (text.charAt(j) == '\n') {
-                                    if (line != -1) {
-                                        line++;
-                                    }
-                                    if (column != -1) {
-                                        column = 0;
-                                    }
-                                } else if (column != -1) {
-                                    column++;
-                                }
-                            }
-
-                            start = new DefaultPosition(line, column, offset);
-                            location = Location.create(context.file, start, location.getEnd());
-                        }
-                    }
-                    context.report(ISSUE, node, location,
-                            String.format("Unexpected text found in layout file: \"%1$s\"",
-                                    snippet), null);
-                    mFoundText = true;
-                    break;
-                }
-            }
-        }
-
-        // Visit children
-        NodeList childNodes = node.getChildNodes();
-        for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-            Node child = childNodes.item(i);
-            visitNode(context, child);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/FieldGetterDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/FieldGetterDetector.java
deleted file mode 100644
index 04841ab..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/FieldGetterDetector.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.google.common.collect.Maps;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.FieldInsnNode;
-import org.objectweb.asm.tree.InsnList;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.objectweb.asm.tree.VarInsnNode;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Looks for getter calls within the same class that could be replaced by
- * direct field references instead.
- */
-public class FieldGetterDetector extends Detector implements Detector.ClassScanner {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "FieldGetter", //$NON-NLS-1$
-            "Suggests replacing uses of getters with direct field access within a class",
-
-            "Accessing a field within the class that defines a getter for that field is " +
-            "at least 3 times faster than calling the getter. For simple getters that do " +
-            "nothing other than return the field, you might want to just reference the " +
-            "local field directly instead.\n" +
-            "\n" +
-            "NOTE: As of Android 2.3 (Gingerbread), this optimization is performed " +
-            "automatically by Dalvik, so there is no need to change your code; this is " +
-            "only relevant if you are targeting older versions of Android.",
-
-            Category.PERFORMANCE,
-            4,
-            Severity.WARNING,
-            FieldGetterDetector.class,
-            Scope.CLASS_FILE_SCOPE).
-            // This is a micro-optimization: not enabled by default
-            setEnabledByDefault(false).setMoreInfo(
-           "http://developer.android.com/guide/practices/design/performance.html#internal_get_set"); //$NON-NLS-1$
-    private ArrayList<Entry> mPendingCalls;
-
-    /** Constructs a new {@link FieldGetterDetector} check */
-    public FieldGetterDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @Override
-    public int[] getApplicableAsmNodeTypes() {
-        return new int[] { AbstractInsnNode.METHOD_INSN };
-    }
-
-    @Override
-    public void checkInstruction(@NonNull ClassContext context, @NonNull ClassNode classNode,
-            @NonNull MethodNode method, @NonNull AbstractInsnNode instruction) {
-        // As of Gingerbread/API 9, Dalvik performs this optimization automatically
-        if (context.getProject().getMinSdk() >= 9) {
-            return;
-        }
-
-        if ((method.access & Opcodes.ACC_STATIC) != 0) {
-            // Not an instance method
-            return;
-        }
-
-        if (instruction.getOpcode() != Opcodes.INVOKEVIRTUAL) {
-            return;
-        }
-
-        MethodInsnNode node = (MethodInsnNode) instruction;
-        String name = node.name;
-        String owner = node.owner;
-
-        AbstractInsnNode prev = LintUtils.getPrevInstruction(instruction);
-        if (prev == null || prev.getOpcode() != Opcodes.ALOAD) {
-            return;
-        }
-        VarInsnNode prevVar = (VarInsnNode) prev;
-        if (prevVar.var != 0) { // Not on "this", variable 0 in instance methods?
-            return;
-        }
-
-        if (((name.startsWith("get") && name.length() > 3     //$NON-NLS-1$
-                && Character.isUpperCase(name.charAt(3)))
-            || (name.startsWith("is") && name.length() > 2    //$NON-NLS-1$
-                && Character.isUpperCase(name.charAt(2))))
-                && owner.equals(classNode.name)) {
-            // Calling a potential getter method on self. We now need to
-            // investigate the method body of the getter call and make sure
-            // it's really a plain getter, not just a method which happens
-            // to have a method name like a getter, or a method which not
-            // only returns a field but possibly computes it or performs
-            // other initialization or side effects. This is done in a
-            // second pass over the bytecode, initiated by the finish()
-            // method.
-            if (mPendingCalls == null) {
-                mPendingCalls = new ArrayList<Entry>();
-            }
-
-            mPendingCalls.add(new Entry(name, node, method));
-        }
-
-        super.checkInstruction(context, classNode, method, instruction);
-    }
-
-    @Override
-    public void afterCheckFile(@NonNull Context c) {
-        ClassContext context = (ClassContext) c;
-
-        if (mPendingCalls != null) {
-            Set<String> names = new HashSet<String>(mPendingCalls.size());
-            for (Entry entry : mPendingCalls) {
-                names.add(entry.name);
-            }
-
-            Map<String, String> getters = checkMethods(context.getClassNode(), names);
-            if (!getters.isEmpty()) {
-                for (String getter : getters.keySet()) {
-                    for (Entry entry : mPendingCalls) {
-                        String name = entry.name;
-                        // There can be more than one reference to the same name:
-                        // one for each call site
-                        if (name.equals(getter)) {
-                            Location location = context.getLocation(entry.call);
-                            String fieldName = getters.get(getter);
-                            if (fieldName == null) {
-                                fieldName = "";
-                            }
-                            context.report(ISSUE, entry.method, entry.call, location,
-                                String.format(
-                                "Calling getter method %1$s() on self is " +
-                                "slower than field access (%2$s)", getter, fieldName), fieldName);
-                        }
-                    }
-                }
-            }
-        }
-
-        mPendingCalls = null;
-    }
-
-    // Holder class for getters to be checked
-    private static class Entry {
-        public final String name;
-        public final MethodNode method;
-        public final MethodInsnNode call;
-
-        public Entry(String name, MethodInsnNode call, MethodNode method) {
-            super();
-            this.name = name;
-            this.call = call;
-            this.method = method;
-        }
-    }
-
-    // Validate that these getter methods are really just simple field getters
-    // like these int and String getters:
-    // public int getFoo();
-    //   Code:
-    //    0:   aload_0
-    //    1:   getfield    #21; //Field mFoo:I
-    //    4:   ireturn
-    //
-    // public java.lang.String getBar();
-    //   Code:
-    //    0:   aload_0
-    //    1:   getfield    #25; //Field mBar:Ljava/lang/String;
-    //    4:   areturn
-    //
-    // Returns a map of valid getters as keys, and if the field name is found, the field name
-    // for each getter as its value.
-    private static Map<String, String> checkMethods(ClassNode classNode, Set<String> names) {
-        Map<String, String> validGetters = Maps.newHashMap();
-        @SuppressWarnings("rawtypes")
-        List methods = classNode.methods;
-        String fieldName = null;
-        checkMethod:
-        for (Object methodObject : methods) {
-            MethodNode method = (MethodNode) methodObject;
-            if (names.contains(method.name)
-                    && method.desc.startsWith("()")) { //$NON-NLS-1$ // (): No arguments
-                InsnList instructions = method.instructions;
-                int mState = 1;
-                for (AbstractInsnNode curr = instructions.getFirst();
-                        curr != null;
-                        curr = curr.getNext()) {
-                    switch (curr.getOpcode()) {
-                        case -1:
-                            // Skip label and line number nodes
-                            continue;
-                        case Opcodes.ALOAD:
-                            if (mState == 1) {
-                                fieldName = null;
-                                mState = 2;
-                            } else {
-                                continue checkMethod;
-                            }
-                            break;
-                        case Opcodes.GETFIELD:
-                            if (mState == 2) {
-                                FieldInsnNode field = (FieldInsnNode) curr;
-                                fieldName = field.name;
-                                mState = 3;
-                            } else {
-                                continue checkMethod;
-                            }
-                            break;
-                        case Opcodes.ARETURN:
-                        case Opcodes.FRETURN:
-                        case Opcodes.IRETURN:
-                        case Opcodes.DRETURN:
-                        case Opcodes.LRETURN:
-                        case Opcodes.RETURN:
-                            if (mState == 3) {
-                                validGetters.put(method.name, fieldName);
-                            }
-                            continue checkMethod;
-                        default:
-                            continue checkMethod;
-                    }
-                }
-            }
-        }
-
-        return validGetters;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/FragmentDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/FragmentDetector.java
deleted file mode 100644
index f6ebcd6..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/FragmentDetector.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.CONSTRUCTOR_NAME;
-import static com.android.SdkConstants.FRAGMENT;
-import static com.android.SdkConstants.FRAGMENT_V4;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.client.api.LintDriver;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.MethodNode;
-
-import java.util.List;
-
-/**
- * Checks that Fragment subclasses can be instantiated via
- * {link {@link Class#newInstance()}}: the class is public, static, and has
- * a public null constructor.
- * <p>
- * This helps track down issues like
- *   http://stackoverflow.com/questions/8058809/fragment-activity-crashes-on-screen-rotate
- * (and countless duplicates)
- */
-public class FragmentDetector extends Detector implements ClassScanner {
-    private static final String FRAGMENT_NAME_SUFFIX = "Fragment";              //$NON-NLS-1$
-
-    /** Are fragment subclasses instantiatable? */
-    public static final Issue ISSUE = Issue.create(
-        "ValidFragment", //$NON-NLS-1$
-        "Ensures that Fragment subclasses can be instantiated",
-
-        "From the Fragment documentation:\n" +
-        "*Every* fragment must have an empty constructor, so it can be instantiated when " +
-        "restoring its activity's state. It is strongly recommended that subclasses do not " +
-        "have other constructors with parameters, since these constructors will not be " +
-        "called when the fragment is re-instantiated; instead, arguments can be supplied " +
-        "by the caller with `setArguments(Bundle)` and later retrieved by the Fragment " +
-        "with `getArguments()`.",
-
-        Category.CORRECTNESS,
-        6,
-        Severity.ERROR,
-        FragmentDetector.class,
-        Scope.CLASS_FILE_SCOPE).setMoreInfo(
-        "http://developer.android.com/reference/android/app/Fragment.html#Fragment()"); //$NON-NLS-1$
-
-
-    /** Constructs a new {@link FragmentDetector} */
-    public FragmentDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @Override
-    public void checkClass(@NonNull ClassContext context, @NonNull ClassNode classNode) {
-        if ((classNode.access & Opcodes.ACC_ABSTRACT) != 0) {
-            // Ignore abstract classes since they are clearly (and by definition) not intended to
-            // be instantiated. We're looking for accidental non-static or missing constructor
-            // scenarios here.
-            return;
-        }
-
-        LintDriver driver = context.getDriver();
-
-        if (!(driver.isSubclassOf(classNode, FRAGMENT)
-                || driver.isSubclassOf(classNode, FRAGMENT_V4))) {
-            if (!context.getScope().contains(Scope.ALL_JAVA_FILES)) {
-                // Single file checking: Just check that it looks like a fragment class
-                // (since we don't have a full superclass map)
-                if (!classNode.name.endsWith(FRAGMENT_NAME_SUFFIX) ||
-                        classNode.superName == null) {
-                    return;
-                }
-            } else {
-                return;
-            }
-        }
-
-        if ((classNode.access & Opcodes.ACC_PUBLIC) == 0) {
-            context.report(ISSUE, context.getLocation(classNode), String.format(
-                    "This fragment class should be public (%1$s)",
-                        ClassContext.createSignature(classNode.name, null, null)),
-                    null);
-            return;
-        }
-
-        if (classNode.name.indexOf('$') != -1 && !LintUtils.isStaticInnerClass(classNode)) {
-            context.report(ISSUE, context.getLocation(classNode), String.format(
-                    "This fragment inner class should be static (%1$s)",
-                        ClassContext.createSignature(classNode.name, null, null)),
-                    null);
-            return;
-        }
-
-        boolean hasDefaultConstructor = false;
-        @SuppressWarnings("rawtypes") // ASM API
-        List methodList = classNode.methods;
-        for (Object m : methodList) {
-            MethodNode method = (MethodNode) m;
-            if (method.name.equals(CONSTRUCTOR_NAME)) {
-                if (method.desc.equals("()V")) { //$NON-NLS-1$
-                    // The constructor must be public
-                    if ((method.access & Opcodes.ACC_PUBLIC) != 0) {
-                        hasDefaultConstructor = true;
-                    } else {
-                        context.report(ISSUE, context.getLocation(method, classNode),
-                                "The default constructor must be public",
-                                null);
-                        // Also mark that we have a constructor so we don't complain again
-                        // below since we've already emitted a more specific error related
-                        // to the default constructor
-                        hasDefaultConstructor = true;
-                    }
-                } else if (!method.desc.contains("()")) { //$NON-NLS-1$
-                    context.report(ISSUE, context.getLocation(method, classNode),
-                            // TODO: Use separate issue for this which isn't an error
-                        "Avoid non-default constructors in fragments: use a default constructor " +
-                        "plus Fragment#setArguments(Bundle) instead",
-                        null);
-                }
-            }
-        }
-
-        if (!hasDefaultConstructor) {
-            context.report(ISSUE, context.getLocation(classNode), String.format(
-                    "This fragment should provide a default constructor (a public " +
-                    "constructor with no arguments) (%1$s)",
-                        ClassContext.createSignature(classNode.name, null, null)),
-                    null);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/GridLayoutDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/GridLayoutDetector.java
deleted file mode 100644
index c348502..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/GridLayoutDetector.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_COLUMN_COUNT;
-import static com.android.SdkConstants.ATTR_LAYOUT_COLUMN;
-import static com.android.SdkConstants.ATTR_LAYOUT_ROW;
-import static com.android.SdkConstants.ATTR_ROW_COUNT;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Check which looks for potential errors in declarations of GridLayouts, such as specifying
- * row/column numbers outside the declared dimensions of the grid.
- */
-public class GridLayoutDetector extends LayoutDetector {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "GridLayout", //$NON-NLS-1$
-            "Checks for potential GridLayout errors like declaring rows and columns outside " +
-            "the declared grid dimensions",
-            "Declaring a layout_row or layout_column that falls outside the declared size " +
-            "of a GridLayout's `rowCount` or `columnCount` is usually an unintentional error.",
-            Category.CORRECTNESS,
-            4,
-            Severity.FATAL,
-            GridLayoutDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new {@link GridLayoutDetector} check */
-    public GridLayoutDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(
-                "GridLayout" //$NON-NLS-1$
-        );
-    }
-
-    private static int getInt(Element element, String attribute, int defaultValue) {
-        String valueString = element.getAttributeNS(ANDROID_URI, attribute);
-        if (valueString != null && !valueString.isEmpty()) {
-            try {
-                return Integer.decode(valueString);
-            } catch (NumberFormatException nufe) {
-                // Ignore - error in user's XML
-            }
-        }
-
-        return defaultValue;
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        int declaredRowCount = getInt(element, ATTR_ROW_COUNT, -1);
-        int declaredColumnCount = getInt(element, ATTR_COLUMN_COUNT, -1);
-
-        if (declaredColumnCount != -1 || declaredRowCount != -1) {
-            for (Element child : LintUtils.getChildren(element)) {
-                if (declaredColumnCount != -1) {
-                    int column = getInt(child, ATTR_LAYOUT_COLUMN, -1);
-                    if (column >= declaredColumnCount) {
-                        Attr node = child.getAttributeNodeNS(ANDROID_URI, ATTR_LAYOUT_COLUMN);
-                        context.report(ISSUE, node, context.getLocation(node),
-                                String.format("Column attribute (%1$d) exceeds declared grid column count (%2$d)",
-                                        column, declaredColumnCount), null);
-                    }
-                }
-                if (declaredRowCount != -1) {
-                    int row = getInt(child, ATTR_LAYOUT_ROW, -1);
-                    if (row > declaredRowCount) {
-                        Attr node = child.getAttributeNodeNS(ANDROID_URI, ATTR_LAYOUT_ROW);
-                        context.report(ISSUE, node, context.getLocation(node),
-                                String.format("Row attribute (%1$d) exceeds declared grid row count (%2$d)",
-                                        row, declaredRowCount), null);
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/HandlerDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/HandlerDetector.java
deleted file mode 100644
index cfe8f0b..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/HandlerDetector.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import org.objectweb.asm.tree.ClassNode;
-
-/**
- * Checks that Handler implementations are top level classes or static.
- * See the corresponding check in the android.os.Handler source code.
- */
-public class HandlerDetector extends Detector implements ClassScanner {
-
-    /** Potentially leaking handlers */
-    public static final Issue ISSUE = Issue.create(
-        "HandlerLeak", //$NON-NLS-1$
-        "Ensures that Handler classes do not hold on to a reference to an outer class",
-
-        "In Android, Handler classes should be static or leaks might occur. " +
-        "Messages enqueued on the application thread's MessageQueue also retain their " +
-        "target Handler. If the Handler is an inner class, its outer class will be " +
-        "retained as well. To avoid leaking the outer class, declare the Handler as a " +
-        "static nested class with a WeakReference to its outer class.",
-
-        Category.PERFORMANCE,
-        4,
-        Severity.WARNING,
-        HandlerDetector.class,
-        Scope.CLASS_FILE_SCOPE);
-
-    /** Constructs a new {@link HandlerDetector} */
-    public HandlerDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @Override
-    public void checkClass(@NonNull ClassContext context, @NonNull ClassNode classNode) {
-        if (classNode.name.indexOf('$') == -1) {
-            return;
-        }
-
-        if (context.getDriver().isSubclassOf(classNode, "android/os/Handler") //$NON-NLS-1$
-                && !LintUtils.isStaticInnerClass(classNode)) {
-            Location location = context.getLocation(classNode);
-            context.report(ISSUE, location, String.format(
-                    "This Handler class should be static or leaks might occur (%1$s)",
-                        ClassContext.createSignature(classNode.name, null, null)),
-                    null);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/HardcodedDebugModeDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/HardcodedDebugModeDetector.java
deleted file mode 100644
index fd678ca..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/HardcodedDebugModeDetector.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_MANIFEST_XML;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_DEBUGGABLE;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Checks for hardcoded debug mode in manifest files
- */
-public class HardcodedDebugModeDetector extends Detector implements Detector.XmlScanner {
-
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "HardcodedDebugMode", //$NON-NLS-1$
-            "Checks for hardcoded values of android:debuggable in the manifest",
-
-            "It's best to leave out the `android:debuggable` attribute from the manifest. " +
-            "If you do, then the tools will automatically insert `android:debuggable=true` when " +
-            "building an APK to debug on an emulator or device. And when you perform a " +
-            "release build, such as Exporting APK, it will automatically set it to `false`.\n" +
-            "\n" +
-            "If on the other hand you specify a specific value in the manifest file, then " +
-            "the tools will always use it. This can lead to accidentally publishing " +
-            "your app with debug information.",
-
-            Category.SECURITY,
-            5,
-            Severity.WARNING,
-            HardcodedDebugModeDetector.class,
-            Scope.MANIFEST_SCOPE);
-
-    /** Constructs a new {@link HardcodedDebugModeDetector} check */
-    public HardcodedDebugModeDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return file.getName().equals(ANDROID_MANIFEST_XML);
-    }
-
-    // ---- Implements Detector.XmlScanner ----
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return Collections.singleton(ATTR_DEBUGGABLE);
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        if (attribute.getNamespaceURI().equals(ANDROID_URI)) {
-        //if (attribute.getOwnerElement().getTagName().equals(TAG_APPLICATION)) {
-            context.report(ISSUE, attribute, context.getLocation(attribute),
-                    "Avoid hardcoding the debug mode; leaving it out allows debug and " +
-                    "release builds to automatically assign one", null);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/HardcodedValuesDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/HardcodedValuesDetector.java
deleted file mode 100644
index 11cc19d..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/HardcodedValuesDetector.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_CONTENT_DESCRIPTION;
-import static com.android.SdkConstants.ATTR_HINT;
-import static com.android.SdkConstants.ATTR_LABEL;
-import static com.android.SdkConstants.ATTR_PROMPT;
-import static com.android.SdkConstants.ATTR_TEXT;
-import static com.android.SdkConstants.ATTR_TITLE;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-/**
- * Check which looks at the children of ScrollViews and ensures that they fill/match
- * the parent width instead of setting wrap_content.
- */
-public class HardcodedValuesDetector extends LayoutDetector {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "HardcodedText", //$NON-NLS-1$
-            "Looks for hardcoded text attributes which should be converted to resource lookup",
-            "Hardcoding text attributes directly in layout files is bad for several reasons:\n" +
-            "\n" +
-            "* When creating configuration variations (for example for landscape or portrait)" +
-            "you have to repeat the actual text (and keep it up to date when making changes)\n" +
-            "\n" +
-            "* The application cannot be translated to other languages by just adding new " +
-            "translations for existing string resources.\n" +
-            "\n" +
-            "In Eclipse there is a quickfix to automatically extract this hardcoded string into " +
-            "a resource lookup.",
-
-            Category.I18N,
-            5,
-            Severity.WARNING,
-            HardcodedValuesDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    // TODO: Add additional issues here, such as hardcoded colors, hardcoded sizes, etc
-
-    /** Constructs a new {@link HardcodedValuesDetector} */
-    public HardcodedValuesDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return Arrays.asList(
-                // Layouts
-                ATTR_TEXT,
-                ATTR_CONTENT_DESCRIPTION,
-                ATTR_HINT,
-                ATTR_LABEL,
-                ATTR_PROMPT,
-
-                // Menus
-                ATTR_TITLE
-        );
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.LAYOUT || folderType == ResourceFolderType.MENU;
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        String value = attribute.getValue();
-        if (!value.isEmpty() && (value.charAt(0) != '@' && value.charAt(0) != '?')) {
-            // Make sure this is really one of the android: attributes
-            if (!ANDROID_URI.equals(attribute.getNamespaceURI())) {
-                return;
-            }
-
-            context.report(ISSUE, attribute, context.getLocation(attribute),
-                    String.format("[I18N] Hardcoded string \"%1$s\", should use @string resource",
-                            value), null);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/IconDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/IconDetector.java
deleted file mode 100644
index 7f26c96..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/IconDetector.java
+++ /dev/null
@@ -1,1906 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_MANIFEST_XML;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ICON;
-import static com.android.SdkConstants.DOT_9PNG;
-import static com.android.SdkConstants.DOT_GIF;
-import static com.android.SdkConstants.DOT_JPEG;
-import static com.android.SdkConstants.DOT_JPG;
-import static com.android.SdkConstants.DOT_PNG;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.DRAWABLE_FOLDER;
-import static com.android.SdkConstants.DRAWABLE_HDPI;
-import static com.android.SdkConstants.DRAWABLE_LDPI;
-import static com.android.SdkConstants.DRAWABLE_MDPI;
-import static com.android.SdkConstants.DRAWABLE_PREFIX;
-import static com.android.SdkConstants.DRAWABLE_XHDPI;
-import static com.android.SdkConstants.MENU_TYPE;
-import static com.android.SdkConstants.R_CLASS;
-import static com.android.SdkConstants.R_DRAWABLE_PREFIX;
-import static com.android.SdkConstants.TAG_ACTIVITY;
-import static com.android.SdkConstants.TAG_APPLICATION;
-import static com.android.SdkConstants.TAG_ITEM;
-import static com.android.SdkConstants.TAG_PROVIDER;
-import static com.android.SdkConstants.TAG_RECEIVER;
-import static com.android.SdkConstants.TAG_SERVICE;
-import static com.android.tools.lint.detector.api.LintUtils.endsWith;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Project;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
-
-import org.w3c.dom.Element;
-
-import java.awt.Dimension;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import javax.imageio.ImageIO;
-import javax.imageio.ImageReader;
-import javax.imageio.stream.ImageInputStream;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.ConstructorInvocation;
-import lombok.ast.Expression;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.MethodDeclaration;
-import lombok.ast.MethodInvocation;
-import lombok.ast.Node;
-import lombok.ast.Select;
-import lombok.ast.StrictListAccessor;
-import lombok.ast.TypeReference;
-import lombok.ast.TypeReferencePart;
-import lombok.ast.VariableReference;
-
-/**
- * Checks for common icon problems, such as wrong icon sizes, placing icons in the
- * density independent drawable folder, etc.
- */
-public class IconDetector extends ResourceXmlDetector implements Detector.JavaScanner {
-
-    private static final boolean INCLUDE_LDPI;
-    static {
-        boolean includeLdpi = false;
-
-        String value = System.getenv("ANDROID_LINT_INCLUDE_LDPI"); //$NON-NLS-1$
-        if (value != null) {
-            includeLdpi = Boolean.valueOf(value);
-        }
-        INCLUDE_LDPI = includeLdpi;
-    }
-
-    /** Pattern for the expected density folders to be found in the project */
-    private static final Pattern DENSITY_PATTERN = Pattern.compile(
-            "^drawable-(nodpi|xhdpi|hdpi|mdpi"            //$NON-NLS-1$
-                + (INCLUDE_LDPI ? "|ldpi" : "") + ")$");  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-    private static final String[] REQUIRED_DENSITIES = INCLUDE_LDPI
-            ? new String[] { DRAWABLE_LDPI, DRAWABLE_MDPI, DRAWABLE_HDPI, DRAWABLE_XHDPI }
-            : new String[] { DRAWABLE_MDPI, DRAWABLE_HDPI, DRAWABLE_XHDPI };
-
-    private static final String[] DENSITY_QUALIFIERS =
-        new String[] {
-            "-ldpi",  //$NON-NLS-1$
-            "-mdpi",  //$NON-NLS-1$
-            "-hdpi",  //$NON-NLS-1$
-            "-xhdpi"  //$NON-NLS-1$
-    };
-
-    /** Scope needed to detect the types of icons (which involves scanning .java files,
-     * the manifest, menu files etc to see how icons are used
-     */
-    private static final EnumSet<Scope> ICON_TYPE_SCOPE = EnumSet.of(Scope.ALL_RESOURCE_FILES,
-            Scope.JAVA_FILE, Scope.MANIFEST);
-
-    /** Wrong icon size according to published conventions */
-    public static final Issue ICON_EXPECTED_SIZE = Issue.create(
-            "IconExpectedSize", //$NON-NLS-1$
-            "Ensures that launcher icons, notification icons etc have the correct size",
-            "There are predefined sizes (for each density) for launcher icons. You " +
-            "should follow these conventions to make sure your icons fit in with the " +
-            "overall look of the platform.",
-            Category.ICONS,
-            5,
-            Severity.WARNING,
-            IconDetector.class,
-            ICON_TYPE_SCOPE)
-            // Still some potential false positives:
-            .setEnabledByDefault(false)
-            .setMoreInfo(
-            "http://developer.android.com/design/style/iconography.html"); //$NON-NLS-1$
-
-    /** Inconsistent dip size across densities */
-    public static final Issue ICON_DIP_SIZE = Issue.create(
-            "IconDipSize", //$NON-NLS-1$
-            "Ensures that icons across densities provide roughly the same density-independent size",
-            "Checks the all icons which are provided in multiple densities, all compute to " +
-            "roughly the same density-independent pixel (`dip`) size. This catches errors where " +
-            "images are either placed in the wrong folder, or icons are changed to new sizes " +
-            "but some folders are forgotten.",
-            Category.ICONS,
-            5,
-            Severity.WARNING,
-            IconDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    /** Images in res/drawable folder */
-    public static final Issue ICON_LOCATION = Issue.create(
-            "IconLocation", //$NON-NLS-1$
-            "Ensures that images are not defined in the density-independent drawable folder",
-            "The res/drawable folder is intended for density-independent graphics such as " +
-            "shapes defined in XML. For bitmaps, move it to `drawable-mdpi` and consider " +
-            "providing higher and lower resolution versions in `drawable-ldpi`, `drawable-hdpi` " +
-            "and `drawable-xhdpi`. If the icon *really* is density independent (for example " +
-            "a solid color) you can place it in `drawable-nodpi`.",
-            Category.ICONS,
-            5,
-            Severity.WARNING,
-            IconDetector.class,
-            Scope.ALL_RESOURCES_SCOPE).setMoreInfo(
-            "http://developer.android.com/guide/practices/screens_support.html"); //$NON-NLS-1$
-
-    /** Missing density versions of image */
-    public static final Issue ICON_DENSITIES = Issue.create(
-            "IconDensities", //$NON-NLS-1$
-            "Ensures that icons provide custom versions for all supported densities",
-            "Icons will look best if a custom version is provided for each of the " +
-            "major screen density classes (low, medium, high, extra high). " +
-            "This lint check identifies icons which do not have complete coverage " +
-            "across the densities.\n" +
-            "\n" +
-            "Low density is not really used much anymore, so this check ignores " +
-            "the ldpi density. To force lint to include it, set the environment " +
-            "variable `ANDROID_LINT_INCLUDE_LDPI=true`. For more information on " +
-            "current density usage, see " +
-            "http://developer.android.com/resources/dashboard/screens.html",
-            Category.ICONS,
-            4,
-            Severity.WARNING,
-            IconDetector.class,
-            Scope.ALL_RESOURCES_SCOPE).setMoreInfo(
-            "http://developer.android.com/guide/practices/screens_support.html"); //$NON-NLS-1$
-
-    /** Missing density folders */
-    public static final Issue ICON_MISSING_FOLDER = Issue.create(
-            "IconMissingDensityFolder", //$NON-NLS-1$
-            "Ensures that all the density folders are present",
-            "Icons will look best if a custom version is provided for each of the " +
-            "major screen density classes (low, medium, high, extra high). " +
-            "This lint check identifies folders which are missing, such as `drawable-hdpi`." +
-            "\n" +
-            "Low density is not really used much anymore, so this check ignores " +
-            "the ldpi density. To force lint to include it, set the environment " +
-            "variable `ANDROID_LINT_INCLUDE_LDPI=true`. For more information on " +
-            "current density usage, see " +
-            "http://developer.android.com/resources/dashboard/screens.html",
-            Category.ICONS,
-            3,
-            Severity.WARNING,
-            IconDetector.class,
-            Scope.ALL_RESOURCES_SCOPE).setMoreInfo(
-            "http://developer.android.com/guide/practices/screens_support.html"); //$NON-NLS-1$
-
-    /** Using .gif bitmaps */
-    public static final Issue GIF_USAGE = Issue.create(
-            "GifUsage", //$NON-NLS-1$
-            "Checks for images using the GIF file format which is discouraged",
-            "The `.gif` file format is discouraged. Consider using `.png` (preferred) " +
-            "or `.jpg` (acceptable) instead.",
-            Category.ICONS,
-            5,
-            Severity.WARNING,
-            IconDetector.class,
-            Scope.ALL_RESOURCES_SCOPE).setMoreInfo(
-            "http://developer.android.com/guide/topics/resources/drawable-resource.html#Bitmap"); //$NON-NLS-1$
-
-    /** Duplicated icons across different names */
-    public static final Issue DUPLICATES_NAMES = Issue.create(
-            "IconDuplicates", //$NON-NLS-1$
-            "Finds duplicated icons under different names",
-            "If an icon is repeated under different names, you can consolidate and just " +
-            "use one of the icons and delete the others to make your application smaller. " +
-            "However, duplicated icons usually are not intentional and can sometimes point " +
-            "to icons that were accidentally overwritten or accidentally not updated.",
-            Category.ICONS,
-            3,
-            Severity.WARNING,
-            IconDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    /** Duplicated contents across configurations for a given name */
-    public static final Issue DUPLICATES_CONFIGURATIONS = Issue.create(
-            "IconDuplicatesConfig", //$NON-NLS-1$
-            "Finds icons that have identical bitmaps across various configuration parameters",
-            "If an icon is provided under different configuration parameters such as " +
-            "`drawable-hdpi` or `-v11`, they should typically be different. This detector " +
-            "catches cases where the same icon is provided in different configuration folder " +
-            "which is usually not intentional.",
-            Category.ICONS,
-            5,
-            Severity.WARNING,
-            IconDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    /** Icons appearing in both -nodpi and a -Ndpi folder */
-    public static final Issue ICON_NODPI = Issue.create(
-            "IconNoDpi", //$NON-NLS-1$
-            "Finds icons that appear in both a -nodpi folder and a dpi folder",
-            "Bitmaps that appear in `drawable-nodpi` folders will not be scaled by the " +
-            "Android framework. If a drawable resource of the same name appears *both* in " +
-            "a `-nodpi` folder as well as a dpi folder such as `drawable-hdpi`, then " +
-            "the behavior is ambiguous and probably not intentional. Delete one or the " +
-            "other, or use different names for the icons.",
-            Category.ICONS,
-            7,
-            Severity.WARNING,
-            IconDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    /** Icons appearing as both drawable xml files and bitmaps */
-    public static final Issue ICON_XML_AND_PNG = Issue.create(
-            "IconXmlAndPng", //$NON-NLS-1$
-            "Finds icons that appear both as a drawable .xml file and as bitmaps",
-            "If a drawable resource appears as an .xml file in the drawable/ folder, " +
-            "it's usually not intentional for it to also appear as a bitmap using the " +
-            "same name; generally you expect the drawable XML file to define states " +
-            "and each state has a corresponding drawable bitmap.",
-            Category.ICONS,
-            7,
-            Severity.WARNING,
-            IconDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    /** Wrong filename according to the format */
-    public static final Issue ICON_EXTENSION = Issue.create(
-            "IconExtension", //$NON-NLS-1$
-            "Checks that the icon file extension matches the actual image format in the file",
-
-            "Ensures that icons have the correct file extension (e.g. a .png file is " +
-            "really in the PNG format and not for example a GIF file named .png.)",
-            Category.ICONS,
-            3,
-            Severity.WARNING,
-            IconDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    /** Wrong filename according to the format */
-    public static final Issue ICON_COLORS = Issue.create(
-            "IconColors", //$NON-NLS-1$
-            "Checks that icons follow the recommended visual style",
-
-            "Notification icons and Action Bar icons should only white and shades of gray. " +
-            "See the Android Design Guide for more details. " +
-            "Note that the way Lint decides whether an icon is an action bar icon or " +
-            "a notification icon is based on the filename prefix: `ic_menu_` for " +
-            "action bar icons, `ic_stat_` for notification icons etc. These correspond " +
-            "to the naming conventions documented in " +
-            "http://developer.android.com/guide/practices/ui_guidelines/icon_design.html",
-            Category.ICONS,
-            6,
-            Severity.WARNING,
-            IconDetector.class,
-            ICON_TYPE_SCOPE).setMoreInfo(
-                "http://developer.android.com/design/style/iconography.html"); //$NON-NLS-1$
-
-    /** Wrong launcher icon shape */
-    public static final Issue ICON_LAUNCHER_SHAPE = Issue.create(
-            "IconLauncherShape", //$NON-NLS-1$
-            "Checks that launcher icons follow the recommended visual style",
-
-            "According to the Android Design Guide " +
-            "(http://developer.android.com/design/style/iconography.html) " +
-            "your launcher icons should \"use a distinct silhouette\", " +
-            "a \"three-dimensional, front view, with a slight perspective as if viewed " +
-            "from above, so that users perceive some depth.\"\n" +
-            "\n" +
-            "The unique silhouette implies that your launcher icon should not be a filled " +
-            "square.",
-            Category.ICONS,
-            6,
-            Severity.WARNING,
-            IconDetector.class,
-            ICON_TYPE_SCOPE).setMoreInfo(
-                "http://developer.android.com/design/style/iconography.html"); //$NON-NLS-1$
-
-    /** Constructs a new {@link IconDetector} check */
-    public IconDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.SLOW;
-    }
-
-    @Override
-    public void beforeCheckProject(@NonNull Context context) {
-        mLauncherIcons = null;
-        mActionBarIcons = null;
-        mNotificationIcons = null;
-    }
-
-    @Override
-    public void afterCheckLibraryProject(@NonNull Context context) {
-        if (!context.getProject().getReportIssues()) {
-            // If this is a library project not being analyzed, ignore it
-            return;
-        }
-
-        checkResourceFolder(context, context.getProject());
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        checkResourceFolder(context, context.getProject());
-    }
-
-    private void checkResourceFolder(Context context, @NonNull Project project) {
-        List<File> resourceFolders = project.getResourceFolders();
-        for (File res : resourceFolders) {
-            File[] folders = res.listFiles();
-            if (folders != null) {
-                boolean checkFolders = context.isEnabled(ICON_DENSITIES)
-                        || context.isEnabled(ICON_MISSING_FOLDER)
-                        || context.isEnabled(ICON_NODPI)
-                        || context.isEnabled(ICON_XML_AND_PNG);
-                boolean checkDipSizes = context.isEnabled(ICON_DIP_SIZE);
-                boolean checkDuplicates = context.isEnabled(DUPLICATES_NAMES)
-                         || context.isEnabled(DUPLICATES_CONFIGURATIONS);
-
-                Map<File, Dimension> pixelSizes = null;
-                Map<File, Long> fileSizes = null;
-                if (checkDipSizes || checkDuplicates) {
-                    pixelSizes = new HashMap<File, Dimension>();
-                    fileSizes = new HashMap<File, Long>();
-                }
-                Map<File, Set<String>> folderToNames = new HashMap<File, Set<String>>();
-                Map<File, Set<String>> nonDpiFolderNames = new HashMap<File, Set<String>>();
-                for (File folder : folders) {
-                    String folderName = folder.getName();
-                    if (folderName.startsWith(DRAWABLE_FOLDER)) {
-                        File[] files = folder.listFiles();
-                        if (files != null) {
-                            checkDrawableDir(context, folder, files, pixelSizes, fileSizes);
-
-                            if (checkFolders && DENSITY_PATTERN.matcher(folderName).matches()) {
-                                Set<String> names = new HashSet<String>(files.length);
-                                for (File f : files) {
-                                    String name = f.getName();
-                                    if (isDrawableFile(name)) {
-                                        names.add(name);
-                                    }
-                                }
-                                folderToNames.put(folder, names);
-                            } else if (checkFolders) {
-                                Set<String> names = new HashSet<String>(files.length);
-                                for (File f : files) {
-                                    String name = f.getName();
-                                    if (isDrawableFile(name)) {
-                                        names.add(name);
-                                    }
-                                }
-                                nonDpiFolderNames.put(folder, names);
-                            }
-                        }
-                    }
-                }
-
-                if (checkDipSizes) {
-                    checkDipSizes(context, pixelSizes);
-                }
-
-                if (checkDuplicates) {
-                    checkDuplicates(context, pixelSizes, fileSizes);
-                }
-
-                if (checkFolders && !folderToNames.isEmpty()) {
-                    checkDensities(context, res, folderToNames, nonDpiFolderNames);
-                }
-            }
-        }
-    }
-
-    private static boolean isDrawableFile(String name) {
-        // endsWith(name, DOT_PNG) is also true for endsWith(name, DOT_9PNG)
-        return endsWith(name, DOT_PNG)|| endsWith(name, DOT_JPG) || endsWith(name, DOT_GIF)
-                || endsWith(name, DOT_XML) || endsWith(name, DOT_JPEG);
-    }
-
-    // This method looks for duplicates in the assets. This uses two pieces of information
-    // (file sizes and image dimensions) to quickly reject candidates, such that it only
-    // needs to check actual file contents on a small subset of the available files.
-    private static void checkDuplicates(Context context, Map<File, Dimension> pixelSizes,
-            Map<File, Long> fileSizes) {
-        Map<Long, Set<File>> sameSizes = new HashMap<Long, Set<File>>();
-        Map<Long, File> seenSizes = new HashMap<Long, File>(fileSizes.size());
-        for (Map.Entry<File, Long> entry : fileSizes.entrySet()) {
-            File file = entry.getKey();
-            Long size = entry.getValue();
-            if (seenSizes.containsKey(size)) {
-                Set<File> set = sameSizes.get(size);
-                if (set == null) {
-                    set = new HashSet<File>();
-                    set.add(seenSizes.get(size));
-                    sameSizes.put(size, set);
-                }
-                set.add(file);
-            } else {
-                seenSizes.put(size, file);
-            }
-        }
-
-        if (sameSizes.isEmpty()) {
-            return;
-        }
-
-        // Now go through the files that have the same size and check to see if we can
-        // split them apart based on image dimensions
-        // Note: we may not have file sizes on all the icons; in particular,
-        // we don't have file sizes for ninepatch files.
-        Collection<Set<File>> candidateLists = sameSizes.values();
-        for (Set<File> candidates : candidateLists) {
-            Map<Dimension, Set<File>> sameDimensions = new HashMap<Dimension, Set<File>>(
-                    candidates.size());
-            List<File> noSize = new ArrayList<File>();
-            for (File file : candidates) {
-                Dimension dimension = pixelSizes.get(file);
-                if (dimension != null) {
-                    Set<File> set = sameDimensions.get(dimension);
-                    if (set == null) {
-                        set = new HashSet<File>();
-                        sameDimensions.put(dimension, set);
-                    }
-                    set.add(file);
-                } else {
-                    noSize.add(file);
-                }
-            }
-
-
-            // Files that we have no dimensions for must be compared against everything
-            Collection<Set<File>> sets = sameDimensions.values();
-            if (!noSize.isEmpty()) {
-                if (!sets.isEmpty()) {
-                    for (Set<File> set : sets) {
-                        set.addAll(noSize);
-                    }
-                } else {
-                    // Must just test the noSize elements against themselves
-                    HashSet<File> noSizeSet = new HashSet<File>(noSize);
-                    sets = Collections.<Set<File>>singletonList(noSizeSet);
-                }
-            }
-
-            // Map from file to actual byte contents of the file.
-            // We store this in a map such that for repeated files, such as noSize files
-            // which can appear in multiple buckets, we only need to read them once
-            Map<File, byte[]> fileContents = new HashMap<File, byte[]>();
-
-            // Now we're ready for the final check where we actually check the
-            // bits. We have to partition the files into buckets of files that
-            // are identical.
-            for (Set<File> set : sets) {
-                if (set.size() < 2) {
-                    continue;
-                }
-
-                // Read all files in this set and store in map
-                for (File file : set) {
-                    byte[] bits = fileContents.get(file);
-                    if (bits == null) {
-                        try {
-                            bits = context.getClient().readBytes(file);
-                            fileContents.put(file, bits);
-                        } catch (IOException e) {
-                            context.log(e, null);
-                        }
-                    }
-                }
-
-                // Map where the key file is known to be equal to the value file.
-                // After we check individual files for equality this will be used
-                // to look for transitive equality.
-                Map<File, File> equal = new HashMap<File, File>();
-
-                // Now go and compare all the files. This isn't an efficient algorithm
-                // but the number of candidates should be very small
-
-                List<File> files = new ArrayList<File>(set);
-                Collections.sort(files);
-                for (int i = 0; i < files.size() - 1; i++) {
-                    for (int j = i + 1; j < files.size(); j++) {
-                        File file1 = files.get(i);
-                        File file2 = files.get(j);
-                        byte[] contents1 = fileContents.get(file1);
-                        byte[] contents2 = fileContents.get(file2);
-                        if (contents1 == null || contents2 == null) {
-                            // File couldn't be read: ignore
-                            continue;
-                        }
-                        if (contents1.length != contents2.length) {
-                            // Sizes differ: not identical.
-                            // This shouldn't happen since we've already partitioned based
-                            // on File.length(), but just make sure here since the file
-                            // system could have lied, or cached a value that has changed
-                            // if the file was just overwritten
-                            continue;
-                        }
-                        boolean same = true;
-                        for (int k = 0; k < contents1.length; k++) {
-                            if (contents1[k] != contents2[k]) {
-                                same = false;
-                                break;
-                            }
-                        }
-                        if (same) {
-                            equal.put(file1, file2);
-                        }
-                    }
-                }
-
-                if (!equal.isEmpty()) {
-                    Map<File, Set<File>> partitions = new HashMap<File, Set<File>>();
-                    List<Set<File>> sameSets = new ArrayList<Set<File>>();
-                    for (Map.Entry<File, File> entry : equal.entrySet()) {
-                        File file1 = entry.getKey();
-                        File file2 = entry.getValue();
-                        Set<File> set1 = partitions.get(file1);
-                        Set<File> set2 = partitions.get(file2);
-                        if (set1 != null) {
-                            set1.add(file2);
-                        } else if (set2 != null) {
-                            set2.add(file1);
-                        } else {
-                            set = new HashSet<File>();
-                            sameSets.add(set);
-                            set.add(file1);
-                            set.add(file2);
-                            partitions.put(file1, set);
-                            partitions.put(file2, set);
-                        }
-                    }
-
-                    // We've computed the partitions of equal files. Now sort them
-                    // for stable output.
-                    List<List<File>> lists = new ArrayList<List<File>>();
-                    for (Set<File> same : sameSets) {
-                        assert !same.isEmpty();
-                        ArrayList<File> sorted = new ArrayList<File>(same);
-                        Collections.sort(sorted);
-                        lists.add(sorted);
-                    }
-                    // Sort overall partitions by the first item in each list
-                    Collections.sort(lists, new Comparator<List<File>>() {
-                        @Override
-                        public int compare(List<File> list1, List<File> list2) {
-                            return list1.get(0).compareTo(list2.get(0));
-                        }
-                    });
-
-                    for (List<File> sameFiles : lists) {
-                        Location location = null;
-                        boolean sameNames = true;
-                        String lastName = null;
-                        for (File file : sameFiles) {
-                             if (lastName != null && !lastName.equals(file.getName())) {
-                                sameNames = false;
-                            }
-                            lastName = file.getName();
-                            // Chain locations together
-                            Location linkedLocation = location;
-                            location = Location.create(file);
-                            location.setSecondary(linkedLocation);
-                        }
-
-                        if (sameNames) {
-                            StringBuilder sb = new StringBuilder(sameFiles.size() * 16);
-                            for (File file : sameFiles) {
-                                if (sb.length() > 0) {
-                                    sb.append(", "); //$NON-NLS-1$
-                                }
-                                sb.append(file.getParentFile().getName());
-                            }
-                            String message = String.format(
-                                "The %1$s icon has identical contents in the following configuration folders: %2$s",
-                                        lastName, sb.toString());
-                                context.report(DUPLICATES_CONFIGURATIONS, location, message, null);
-                        } else {
-                            StringBuilder sb = new StringBuilder(sameFiles.size() * 16);
-                            for (File file : sameFiles) {
-                                if (sb.length() > 0) {
-                                    sb.append(", "); //$NON-NLS-1$
-                                }
-                                sb.append(file.getName());
-                            }
-                            String message = String.format(
-                                "The following unrelated icon files have identical contents: %1$s",
-                                        sb.toString());
-                                context.report(DUPLICATES_NAMES, location, message, null);
-                        }
-                    }
-                }
-            }
-        }
-
-    }
-
-    // This method checks the given map from resource file to pixel dimensions for each
-    // such image and makes sure that the normalized dip sizes across all the densities
-    // are mostly the same.
-    private static void checkDipSizes(Context context, Map<File, Dimension> pixelSizes) {
-        // Partition up the files such that I can look at a series by name. This
-        // creates a map from filename (such as foo.png) to a list of files
-        // providing that icon in various folders: drawable-mdpi/foo.png, drawable-hdpi/foo.png
-        // etc.
-        Map<String, List<File>> nameToFiles = new HashMap<String, List<File>>();
-        for (File file : pixelSizes.keySet()) {
-            String name = file.getName();
-            List<File> list = nameToFiles.get(name);
-            if (list == null) {
-                list = new ArrayList<File>();
-                nameToFiles.put(name, list);
-            }
-            list.add(file);
-        }
-
-        ArrayList<String> names = new ArrayList<String>(nameToFiles.keySet());
-        Collections.sort(names);
-
-        // We have to partition the files further because it's possible for the project
-        // to have different configurations for an icon, such as this:
-        //   drawable-large-hdpi/foo.png, drawable-large-mdpi/foo.png,
-        //   drawable-hdpi/foo.png, drawable-mdpi/foo.png,
-        //    drawable-hdpi-v11/foo.png and drawable-mdpi-v11/foo.png.
-        // In this case we don't want to compare across categories; we want to
-        // ensure that the drawable-large-{density} icons are consistent,
-        // that the drawable-{density}-v11 icons are consistent, and that
-        // the drawable-{density} icons are consistent.
-
-        // Map from name to list of map from parent folder to list of files
-        Map<String, Map<String, List<File>>> configMap =
-                new HashMap<String, Map<String,List<File>>>();
-        for (Map.Entry<String, List<File>> entry : nameToFiles.entrySet()) {
-            String name = entry.getKey();
-            List<File> files = entry.getValue();
-            for (File file : files) {
-                String parentName = file.getParentFile().getName();
-                // Strip out the density part
-                int index = -1;
-                for (String qualifier : DENSITY_QUALIFIERS) {
-                    index = parentName.indexOf(qualifier);
-                    if (index != -1) {
-                        parentName = parentName.substring(0, index)
-                                + parentName.substring(index + qualifier.length());
-                        break;
-                    }
-                }
-                if (index == -1) {
-                    // No relevant qualifier found in the parent directory name,
-                    // e.g. it's just "drawable" or something like "drawable-nodpi".
-                    continue;
-                }
-
-                Map<String, List<File>> folderMap = configMap.get(name);
-                if (folderMap == null) {
-                    folderMap = new HashMap<String,List<File>>();
-                    configMap.put(name, folderMap);
-                }
-                // Map from name to a map from parent folder to files
-                List<File> list = folderMap.get(parentName);
-                if (list == null) {
-                    list = new ArrayList<File>();
-                    folderMap.put(parentName, list);
-                }
-                list.add(file);
-            }
-        }
-
-        for (String name : names) {
-            //List<File> files = nameToFiles.get(name);
-            Map<String, List<File>> configurations = configMap.get(name);
-            if (configurations == null) {
-                // Nothing in this configuration: probably only found in drawable/ or
-                // drawable-nodpi etc directories.
-                continue;
-            }
-
-            for (Map.Entry<String, List<File>> entry : configurations.entrySet()) {
-                List<File> files = entry.getValue();
-
-                // Ensure that all the dip sizes are *roughly* the same
-                Map<File, Dimension> dipSizes = new HashMap<File, Dimension>();
-                int dipWidthSum = 0; // Incremental computation of average
-                int dipHeightSum = 0; // Incremental computation of average
-                int count = 0;
-                for (File file : files) {
-                    float factor = getMdpiScalingFactor(file.getParentFile().getName());
-                    if (factor > 0) {
-                        Dimension size = pixelSizes.get(file);
-                        if (size == null) {
-                            continue;
-                        }
-                        Dimension dip = new Dimension(
-                                Math.round(size.width / factor),
-                                Math.round(size.height / factor));
-                        dipWidthSum += dip.width;
-                        dipHeightSum += dip.height;
-                        dipSizes.put(file, dip);
-                        count++;
-                    }
-                }
-                if (count == 0) {
-                    // Icons in drawable/ and drawable-nodpi/
-                    continue;
-                }
-                int meanWidth = dipWidthSum / count;
-                int meanHeight = dipHeightSum / count;
-
-                // Compute standard deviation?
-                int squareWidthSum = 0;
-                int squareHeightSum = 0;
-                for (Dimension size : dipSizes.values()) {
-                    squareWidthSum += (size.width - meanWidth) * (size.width - meanWidth);
-                    squareHeightSum += (size.height - meanHeight) * (size.height - meanHeight);
-                }
-                double widthStdDev = Math.sqrt(squareWidthSum / count);
-                double heightStdDev = Math.sqrt(squareHeightSum / count);
-
-                if (widthStdDev > meanWidth / 10 || heightStdDev > meanHeight) {
-                    Location location = null;
-                    StringBuilder sb = new StringBuilder(100);
-
-                    // Sort entries by decreasing dip size
-                    List<Map.Entry<File, Dimension>> entries =
-                            new ArrayList<Map.Entry<File,Dimension>>();
-                    for (Map.Entry<File, Dimension> entry2 : dipSizes.entrySet()) {
-                        entries.add(entry2);
-                    }
-                    Collections.sort(entries,
-                            new Comparator<Map.Entry<File, Dimension>>() {
-                        @Override
-                        public int compare(Entry<File, Dimension> e1,
-                                Entry<File, Dimension> e2) {
-                            Dimension d1 = e1.getValue();
-                            Dimension d2 = e2.getValue();
-                            if (d1.width != d2.width) {
-                                return d2.width - d1.width;
-                            }
-
-                            return d2.height - d1.height;
-                        }
-                    });
-                    for (Map.Entry<File, Dimension> entry2 : entries) {
-                        if (sb.length() > 0) {
-                            sb.append(", ");
-                        }
-                        File file = entry2.getKey();
-
-                        // Chain locations together
-                        Location linkedLocation = location;
-                        location = Location.create(file);
-                        location.setSecondary(linkedLocation);
-                        Dimension dip = entry2.getValue();
-                        Dimension px = pixelSizes.get(file);
-                        String fileName = file.getParentFile().getName() + File.separator
-                                + file.getName();
-                        sb.append(String.format("%1$s: %2$dx%3$d dp (%4$dx%5$d px)",
-                                fileName, dip.width, dip.height, px.width, px.height));
-                    }
-                    String message = String.format(
-                        "The image %1$s varies significantly in its density-independent (dip) " +
-                        "size across the various density versions: %2$s",
-                            name, sb.toString());
-                    context.report(ICON_DIP_SIZE, location, message, null);
-                }
-            }
-        }
-    }
-
-    private static void checkDensities(Context context, File res,
-            Map<File, Set<String>> folderToNames,
-            Map<File, Set<String>> nonDpiFolderNames) {
-        // TODO: Is there a way to look at the manifest and figure out whether
-        // all densities are expected to be needed?
-        // Note: ldpi is probably not needed; it has very little usage
-        // (about 2%; http://developer.android.com/resources/dashboard/screens.html)
-        // TODO: Use the matrix to check out if we can eliminate densities based
-        // on the target screens?
-
-        Set<String> definedDensities = new HashSet<String>();
-        for (File f : folderToNames.keySet()) {
-            definedDensities.add(f.getName());
-        }
-
-        // Look for missing folders -- if you define say drawable-mdpi then you
-        // should also define -hdpi and -xhdpi.
-        if (context.isEnabled(ICON_MISSING_FOLDER)) {
-            List<String> missing = new ArrayList<String>();
-            for (String density : REQUIRED_DENSITIES) {
-                if (!definedDensities.contains(density)) {
-                    missing.add(density);
-                }
-            }
-            if (!missing.isEmpty()) {
-                context.report(
-                    ICON_MISSING_FOLDER,
-                    Location.create(res),
-                    String.format("Missing density variation folders in %1$s: %2$s",
-                            context.getProject().getDisplayPath(res),
-                            LintUtils.formatList(missing, -1)),
-                    null);
-            }
-        }
-
-        if (context.isEnabled(ICON_NODPI)) {
-            Set<String> noDpiNames = new HashSet<String>();
-            for (Map.Entry<File, Set<String>> entry : folderToNames.entrySet()) {
-                if (isNoDpiFolder(entry.getKey())) {
-                    noDpiNames.addAll(entry.getValue());
-                }
-            }
-            if (!noDpiNames.isEmpty()) {
-                // Make sure that none of the nodpi names appear in a non-nodpi folder
-                Set<String> inBoth = new HashSet<String>();
-                List<File> files = new ArrayList<File>();
-                for (Map.Entry<File, Set<String>> entry : folderToNames.entrySet()) {
-                    File folder = entry.getKey();
-                    String folderName = folder.getName();
-                    if (!isNoDpiFolder(folder)) {
-                        assert DENSITY_PATTERN.matcher(folderName).matches();
-                        Set<String> overlap = nameIntersection(noDpiNames, entry.getValue());
-                        inBoth.addAll(overlap);
-                        for (String name : overlap) {
-                            files.add(new File(folder, name));
-                        }
-                    }
-                }
-
-                if (!inBoth.isEmpty()) {
-                    List<String> list = new ArrayList<String>(inBoth);
-                    Collections.sort(list);
-
-                    // Chain locations together
-                    Collections.sort(files);
-                    Location location = null;
-                    for (File file : files) {
-                        Location linkedLocation = location;
-                        location = Location.create(file);
-                        location.setSecondary(linkedLocation);
-                    }
-
-                    context.report(ICON_NODPI, location,
-                        String.format(
-                            "The following images appear in both -nodpi and in a density folder: %1$s",
-                            LintUtils.formatList(list,
-                                    context.getDriver().isAbbreviating() ? 10 : -1)),
-                        null);
-                }
-            }
-        }
-
-        if (context.isEnabled(ICON_XML_AND_PNG)) {
-            Map<File, Set<String>> folderMap = Maps.newHashMap(folderToNames);
-            folderMap.putAll(nonDpiFolderNames);
-            Set<String> xmlNames = Sets.newHashSetWithExpectedSize(100);
-            Set<String> bitmapNames = Sets.newHashSetWithExpectedSize(100);
-
-            for (Map.Entry<File, Set<String>> entry : folderMap.entrySet()) {
-                Set<String> names = entry.getValue();
-                for (String name : names) {
-                    if (endsWith(name, DOT_XML)) {
-                        xmlNames.add(name);
-                    } else if (isDrawableFile(name)) {
-                        bitmapNames.add(name);
-                    }
-                }
-            }
-            if (!xmlNames.isEmpty() && !bitmapNames.isEmpty()) {
-                // Make sure that none of the nodpi names appear in a non-nodpi folder
-                Set<String> overlap = nameIntersection(xmlNames, bitmapNames);
-                if (!overlap.isEmpty()) {
-                    Multimap<String, File> map = ArrayListMultimap.create();
-                    Set<String> bases = Sets.newHashSetWithExpectedSize(overlap.size());
-                    for (String name : overlap) {
-                        bases.add(LintUtils.getBaseName(name));
-                    }
-
-                    for (String base : bases) {
-                        for (Map.Entry<File, Set<String>> entry : folderMap.entrySet()) {
-                            File folder = entry.getKey();
-                            for (String n : entry.getValue()) {
-                                if (base.equals(LintUtils.getBaseName(n))) {
-                                    map.put(base, new File(folder, n));
-                                }
-                            }
-                        }
-                    }
-                    List<String> sorted = new ArrayList<String>(map.keySet());
-                    Collections.sort(sorted);
-                    for (String name : sorted) {
-                        List<File> lists = Lists.newArrayList(map.get(name));
-                        Collections.sort(lists);
-
-                        // Chain locations together
-                        Location location = null;
-                        for (File file : lists) {
-                            Location linkedLocation = location;
-                            location = Location.create(file);
-                            location.setSecondary(linkedLocation);
-                        }
-
-                        List<String> fileNames = Lists.newArrayList();
-                        boolean seenXml = false;
-                        boolean seenNonXml = false;
-                        for (File f : lists) {
-                            boolean isXml = endsWith(f.getPath(), DOT_XML);
-                            if (isXml && !seenXml) {
-                                fileNames.add(context.getProject().getDisplayPath(f));
-                                seenXml = true;
-                            } else if (!isXml && !seenNonXml) {
-                                fileNames.add(context.getProject().getDisplayPath(f));
-                                seenNonXml = true;
-                            }
-                        }
-
-                        context.report(ICON_XML_AND_PNG, location,
-                            String.format(
-                                "The following images appear both as density independent .xml files and as bitmap files: %1$s",
-                                LintUtils.formatList(fileNames,
-                                        context.getDriver().isAbbreviating() ? 10 : -1)),
-                            null);
-                    }
-                }
-            }
-        }
-
-        if (context.isEnabled(ICON_DENSITIES)) {
-            // Look for folders missing some of the specific assets
-            Set<String> allNames = new HashSet<String>();
-            for (Entry<File,Set<String>> entry : folderToNames.entrySet()) {
-                if (!isNoDpiFolder(entry.getKey())) {
-                    Set<String> names = entry.getValue();
-                    allNames.addAll(names);
-                }
-            }
-
-            for (Map.Entry<File, Set<String>> entry : folderToNames.entrySet()) {
-                File file = entry.getKey();
-                if (isNoDpiFolder(file)) {
-                    continue;
-                }
-                Set<String> names = entry.getValue();
-                if (names.size() != allNames.size()) {
-                    List<String> delta = new ArrayList<String>(nameDifferences(allNames,  names));
-                    if (delta.isEmpty()) {
-                        continue;
-                    }
-                    Collections.sort(delta);
-                    String foundIn = "";
-                    if (delta.size() == 1) {
-                        // Produce list of where the icon is actually defined
-                        List<String> defined = new ArrayList<String>();
-                        String name = delta.get(0);
-                        for (Map.Entry<File, Set<String>> e : folderToNames.entrySet()) {
-                            if (e.getValue().contains(name)) {
-                                defined.add(e.getKey().getName());
-                            }
-                        }
-                        if (!defined.isEmpty()) {
-                            foundIn = String.format(" (found in %1$s)",
-                                    LintUtils.formatList(defined,
-                                            context.getDriver().isAbbreviating() ? 5 : -1));
-                        }
-                    }
-
-                    context.report(ICON_DENSITIES, Location.create(file),
-                            String.format(
-                                    "Missing the following drawables in %1$s: %2$s%3$s",
-                                    file.getName(),
-                                    LintUtils.formatList(delta,
-                                            context.getDriver().isAbbreviating() ? 5 : -1),
-                                    foundIn),
-                            null);
-                }
-            }
-        }
-    }
-
-    /**
-     * Compute the difference in names between a and b. This is not just
-     * Sets.difference(a, b) because we want to make the comparisons <b>without
-     * file extensions</b> and return the result <b>with</b>..
-     */
-    private static Set<String> nameDifferences(Set<String> a, Set<String> b) {
-        Set<String> names1 = new HashSet<String>(a.size());
-        for (String s : a) {
-            names1.add(LintUtils.getBaseName(s));
-        }
-        Set<String> names2 = new HashSet<String>(b.size());
-        for (String s : b) {
-            names2.add(LintUtils.getBaseName(s));
-        }
-
-        names1.removeAll(names2);
-
-        if (!names1.isEmpty()) {
-            // Map filenames back to original filenames with extensions
-            Set<String> result = new HashSet<String>(names1.size());
-            for (String s : a) {
-                if (names1.contains(LintUtils.getBaseName(s))) {
-                    result.add(s);
-                }
-            }
-            for (String s : b) {
-                if (names1.contains(LintUtils.getBaseName(s))) {
-                    result.add(s);
-                }
-            }
-
-            return result;
-        }
-
-        return Collections.emptySet();
-    }
-
-    /**
-     * Compute the intersection in names between a and b. This is not just
-     * Sets.intersection(a, b) because we want to make the comparisons <b>without
-     * file extensions</b> and return the result <b>with</b>.
-     */
-    private static Set<String> nameIntersection(Set<String> a, Set<String> b) {
-        Set<String> names1 = new HashSet<String>(a.size());
-        for (String s : a) {
-            names1.add(LintUtils.getBaseName(s));
-        }
-        Set<String> names2 = new HashSet<String>(b.size());
-        for (String s : b) {
-            names2.add(LintUtils.getBaseName(s));
-        }
-
-        names1.retainAll(names2);
-
-        if (!names1.isEmpty()) {
-            // Map filenames back to original filenames with extensions
-            Set<String> result = new HashSet<String>(names1.size());
-            for (String s : a) {
-                if (names1.contains(LintUtils.getBaseName(s))) {
-                    result.add(s);
-                }
-            }
-            for (String s : b) {
-                if (names1.contains(LintUtils.getBaseName(s))) {
-                    result.add(s);
-                }
-            }
-
-            return result;
-        }
-
-        return Collections.emptySet();
-    }
-
-    private static boolean isNoDpiFolder(File file) {
-        return file.getName().contains("-nodpi");
-    }
-
-    private Map<File, BufferedImage> mImageCache;
-
-    @Nullable
-    private BufferedImage getImage(@Nullable File file) throws IOException {
-        if (mImageCache == null) {
-            mImageCache = Maps.newHashMap();
-        } else {
-            BufferedImage image = mImageCache.get(file);
-            if (image != null) {
-                return image;
-            }
-        }
-
-        BufferedImage image = ImageIO.read(file);
-        mImageCache.put(file, image);
-
-        return image;
-    }
-
-    private void checkDrawableDir(Context context, File folder, File[] files,
-            Map<File, Dimension> pixelSizes, Map<File, Long> fileSizes) {
-        if (folder.getName().equals(DRAWABLE_FOLDER)
-                && context.isEnabled(ICON_LOCATION) &&
-                // If supporting older versions than Android 1.6, it's not an error
-                // to include bitmaps in drawable/
-                context.getProject().getMinSdk() >= 4) {
-            for (File file : files) {
-                String name = file.getName();
-                if (name.endsWith(DOT_XML)) {
-                    // pass - most common case, avoids checking other extensions
-                } else if (endsWith(name, DOT_PNG)
-                        || endsWith(name, DOT_JPG)
-                        || endsWith(name, DOT_JPEG)
-                        || endsWith(name, DOT_GIF)) {
-                    context.report(ICON_LOCATION,
-                        Location.create(file),
-                        String.format("Found bitmap drawable res/drawable/%1$s in " +
-                                "densityless folder",
-                                file.getName()),
-                        null);
-                }
-            }
-        }
-
-        if (context.isEnabled(GIF_USAGE)) {
-            for (File file : files) {
-                String name = file.getName();
-                if (endsWith(name, DOT_GIF)) {
-                    context.report(GIF_USAGE, Location.create(file),
-                            "Using the .gif format for bitmaps is discouraged",
-                            null);
-                }
-            }
-        }
-
-        if (context.isEnabled(ICON_EXTENSION)) {
-            for (File file : files) {
-                String path = file.getPath();
-                if (isDrawableFile(path) && !endsWith(path, DOT_XML)) {
-                    checkExtension(context, file);
-                }
-            }
-        }
-
-        if (context.isEnabled(ICON_COLORS)) {
-            for (File file : files) {
-                String name = file.getName();
-
-                if (isDrawableFile(name)
-                        && !endsWith(name, DOT_XML)
-                        && !endsWith(name, DOT_9PNG)) {
-                    String baseName = getBaseName(name);
-                    boolean isActionBarIcon = isActionBarIcon(context, baseName, file);
-                    if (isActionBarIcon || isNotificationIcon(baseName)) {
-                        Dimension size = checkColor(context, file, isActionBarIcon);
-
-                        // Store dimension for size check if we went to the trouble of reading image
-                        if (size != null && pixelSizes != null) {
-                            pixelSizes.put(file, size);
-                        }
-                    }
-                }
-            }
-        }
-
-        if (context.isEnabled(ICON_LAUNCHER_SHAPE)) {
-            // Look up launcher icon name
-            for (File file : files) {
-                String name = file.getName();
-                if (isLauncherIcon(getBaseName(name))
-                        && !endsWith(name, DOT_XML)
-                        && !endsWith(name, DOT_9PNG)) {
-                    checkLauncherShape(context, file);
-                }
-            }
-        }
-
-        // Check icon sizes
-        if (context.isEnabled(ICON_EXPECTED_SIZE)) {
-            checkExpectedSizes(context, folder, files);
-        }
-
-        if (pixelSizes != null || fileSizes != null) {
-            for (File file : files) {
-                // TODO: Combine this check with the check for expected sizes such that
-                // I don't check file sizes twice!
-                String fileName = file.getName();
-
-                if (endsWith(fileName, DOT_PNG) || endsWith(fileName, DOT_JPG)
-                        || endsWith(fileName, DOT_JPEG)) {
-                    // Only scan .png files (except 9-patch png's) and jpg files for
-                    // dip sizes. Duplicate checks can also be performed on ninepatch files.
-                    if (pixelSizes != null && !endsWith(fileName, DOT_9PNG)
-                            && !pixelSizes.containsKey(file)) { // already read by checkColor?
-                        Dimension size = getSize(file);
-                        pixelSizes.put(file, size);
-                    }
-                    if (fileSizes != null) {
-                        fileSizes.put(file, file.length());
-                    }
-                }
-            }
-        }
-
-        mImageCache = null;
-    }
-
-    /**
-     * Check that launcher icons do not fill every pixel in the image
-     */
-    private void checkLauncherShape(Context context, File file) {
-        try {
-            BufferedImage image = getImage(file);
-            if (image != null) {
-                // TODO: see if the shape is rectangular but inset from outer rectangle; if so
-                // that's probably not right either!
-                for (int y = 0, height = image.getHeight(); y < height; y++) {
-                    for (int x = 0, width = image.getWidth(); x < width; x++) {
-                        int rgb = image.getRGB(x, y);
-                        if ((rgb & 0xFF000000) == 0) {
-                            return;
-                        }
-                    }
-                }
-
-                String message = "Launcher icons should not fill every pixel of their square " +
-                                 "region; see the design guide for details";
-                context.report(ICON_LAUNCHER_SHAPE, Location.create(file),
-                        message, null);
-            }
-        } catch (IOException e) {
-            // Pass: ignore files we can't read
-        }
-    }
-
-    /**
-     * Check whether the icons in the file are okay. Also return the image size
-     * if known (for use by other checks)
-     */
-    private Dimension checkColor(Context context, File file, boolean isActionBarIcon) {
-        int folderVersion = Context.getFolderVersion(file);
-        if (isActionBarIcon) {
-            if (folderVersion != -1 && folderVersion < 11
-                    || !isAndroid30(context, folderVersion)) {
-                return null;
-            }
-        } else {
-            if (folderVersion != -1 && folderVersion < 9
-                    || !isAndroid23(context, folderVersion)
-                        && !isAndroid30(context, folderVersion)) {
-                return null;
-            }
-        }
-
-        // TODO: This only checks icons that are known to be using the Holo style.
-        // However, if the user has minSdk < 11 as well as targetSdk > 11, we should
-        // also check that they actually include a -v11 or -v14 folder with proper
-        // icons, since the below won't flag the older icons.
-        try {
-            BufferedImage image = getImage(file);
-            if (image != null) {
-                if (isActionBarIcon) {
-                    checkPixels:
-                    for (int y = 0, height = image.getHeight(); y < height; y++) {
-                        for (int x = 0, width = image.getWidth(); x < width; x++) {
-                            int rgb = image.getRGB(x, y);
-                            if ((rgb & 0xFF000000) != 0) { // else: transparent
-                                int r = (rgb & 0xFF0000) >>> 16;
-                                int g = (rgb & 0x00FF00) >>> 8;
-                                int b = (rgb & 0x0000FF);
-                                if (r != g || r != b) {
-                                    String message = "Action Bar icons should use a single gray "
-                                        + "color (#333333 for light themes (with 60%/30% "
-                                        + "opacity for enabled/disabled), and #FFFFFF with "
-                                        + "opacity 80%/30% for dark themes";
-                                    context.report(ICON_COLORS, Location.create(file),
-                                            message, null);
-                                    break checkPixels;
-                                }
-                            }
-                        }
-                    }
-                } else {
-                    if (folderVersion >= 11 || isAndroid30(context, folderVersion)) {
-                        // Notification icons. Should be white as of API 14
-                        checkPixels:
-                        for (int y = 0, height = image.getHeight(); y < height; y++) {
-                            for (int x = 0, width = image.getWidth(); x < width; x++) {
-                                int rgb = image.getRGB(x, y);
-                                if ((rgb & 0xFF000000) != 0
-                                        && rgb != 0xFFFFFFFF) {
-                                    int r = (rgb & 0xFF0000) >>> 16;
-                                    int g = (rgb & 0x00FF00) >>> 8;
-                                    int b = (rgb & 0x0000FF);
-                                    if (r == g && r == b) {
-                                        // If the pixel is not white, it might be because of
-                                        // anti-aliasing. In that case, at least one neighbor
-                                        // should be of a different color
-                                        if (x < width - 1 && rgb != image.getRGB(x + 1, y)) {
-                                            continue;
-                                        }
-                                        if (x > 0 && rgb != image.getRGB(x - 1, y)) {
-                                            continue;
-                                        }
-                                        if (y < height - 1 && rgb != image.getRGB(x, y + 1)) {
-                                            continue;
-                                        }
-                                        if (y > 0 && rgb != image.getRGB(x, y - 1)) {
-                                            continue;
-                                        }
-                                    }
-
-                                    String message = "Notification icons must be entirely white";
-                                    context.report(ICON_COLORS, Location.create(file),
-                                            message, null);
-                                    break checkPixels;
-                                }
-                            }
-                        }
-                    } else {
-                        // As of API 9, should be gray.
-                        checkPixels:
-                            for (int y = 0, height = image.getHeight(); y < height; y++) {
-                                for (int x = 0, width = image.getWidth(); x < width; x++) {
-                                    int rgb = image.getRGB(x, y);
-                                    if ((rgb & 0xFF000000) != 0) { // else: transparent
-                                        int r = (rgb & 0xFF0000) >>> 16;
-                                        int g = (rgb & 0x00FF00) >>> 8;
-                                        int b = (rgb & 0x0000FF);
-                                        if (r != g || r != b) {
-                                            String message = "Notification icons should not use "
-                                                    + "colors";
-                                            context.report(ICON_COLORS, Location.create(file),
-                                                    message, null);
-                                            break checkPixels;
-                                        }
-                                    }
-                                }
-                            }
-                    }
-                }
-
-                return new Dimension(image.getWidth(), image.getHeight());
-            }
-        } catch (IOException e) {
-            // Pass: ignore files we can't read
-        }
-
-        return null;
-    }
-
-    private static void checkExtension(Context context, File file) {
-        try {
-            ImageInputStream input = ImageIO.createImageInputStream(file);
-            if (input != null) {
-                try {
-                    Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
-                    while (readers.hasNext()) {
-                        ImageReader reader = readers.next();
-                        try {
-                            reader.setInput(input);
-
-                            // Check file extension
-                            String formatName = reader.getFormatName();
-                            if (formatName != null && !formatName.isEmpty()) {
-                                String path = file.getPath();
-                                int index = path.lastIndexOf('.');
-                                String extension = path.substring(index+1).toLowerCase(Locale.US);
-
-                                if (!formatName.equalsIgnoreCase(extension)) {
-                                    if (endsWith(path, DOT_JPG)
-                                            && formatName.equals("JPEG")) { //$NON-NLS-1$
-                                        return;
-                                    }
-                                    String message = String.format(
-                                            "Misleading file extension; named .%1$s but the " +
-                                            "file format is %2$s", extension, formatName);
-                                    Location location = Location.create(file);
-                                    context.report(ICON_EXTENSION, location, message, null);
-                                }
-                                break;
-                            }
-                        } finally {
-                            reader.dispose();
-                        }
-                    }
-                } finally {
-                    if (input != null) {
-                        input.close();
-                    }
-                }
-            }
-        } catch (IOException e) {
-            // Pass -- we can't handle all image types, warn about those we can
-        }
-    }
-
-    private static String getBaseName(String name) {
-        String baseName = name;
-        int index = baseName.indexOf('.');
-        if (index != -1) {
-            baseName = baseName.substring(0, index);
-        }
-
-        return baseName;
-    }
-
-    private void checkExpectedSizes(Context context, File folder, File[] files) {
-        if (files == null || files.length == 0) {
-            return;
-        }
-
-        String folderName = folder.getName();
-        int folderVersion = Context.getFolderVersion(files[0]);
-
-        for (File file : files) {
-            String name = file.getName();
-
-            // TODO: Look up exact app icon from the manifest rather than simply relying on
-            // the naming conventions described here:
-            //  http://developer.android.com/guide/practices/ui_guidelines/icon_design.html#design-tips
-            // See if we can figure out other types of icons from usage too.
-
-            String baseName = getBaseName(name);
-
-            if (isLauncherIcon(baseName)) {
-                // Launcher icons
-                checkSize(context, folderName, file, 48, 48, true /*exact*/);
-            } else if (isActionBarIcon(baseName)) {
-                checkSize(context, folderName, file, 32, 32, true /*exact*/);
-            } else if (name.startsWith("ic_dialog_")) { //$NON-NLS-1$
-                // Dialog
-                checkSize(context, folderName, file, 32, 32, true /*exact*/);
-            } else if (name.startsWith("ic_tab_")) { //$NON-NLS-1$
-                // Tab icons
-                checkSize(context, folderName, file, 32, 32, true /*exact*/);
-            } else if (isNotificationIcon(baseName)) {
-                // Notification icons
-                if (isAndroid30(context, folderVersion)) {
-                    checkSize(context, folderName, file, 24, 24, true /*exact*/);
-                } else if (isAndroid23(context, folderVersion)) {
-                    checkSize(context, folderName, file, 16, 25, false /*exact*/);
-                } else {
-                    // Android 2.2 or earlier
-                    // TODO: Should this be done for each folder size?
-                    checkSize(context, folderName, file, 25, 25, true /*exact*/);
-                }
-            } else if (name.startsWith("ic_menu_")) { //$NON-NLS-1$
-                if (isAndroid30(context, folderVersion)) {
-                 // Menu icons (<=2.3 only: Replaced by action bar icons (ic_action_ in 3.0).
-                 // However the table halfway down the page on
-                 // http://developer.android.com/guide/practices/ui_guidelines/icon_design.html
-                 // and the README in the icon template download says that convention is ic_menu
-                    checkSize(context, folderName, file, 32, 32, true);
-                } else if (isAndroid23(context, folderVersion)) {
-                    // The icon should be 32x32 inside the transparent image; should
-                    // we check that this is mostly the case (a few pixels are allowed to
-                    // overlap for anti-aliasing etc)
-                    checkSize(context, folderName, file, 48, 48, true /*exact*/);
-                } else {
-                    // Android 2.2 or earlier
-                    // TODO: Should this be done for each folder size?
-                    checkSize(context, folderName, file, 48, 48, true /*exact*/);
-                }
-            }
-            // TODO: ListView icons?
-        }
-    }
-
-    /**
-     * Is this drawable folder for an Android 3.0 drawable? This will be the
-     * case if it specifies -v11+, or if the minimum SDK version declared in the
-     * manifest is at least 11.
-     */
-    private static boolean isAndroid30(Context context, int folderVersion) {
-        return folderVersion >= 11 || context.getMainProject().getMinSdk() >= 11;
-    }
-
-    /**
-     * Is this drawable folder for an Android 2.3 drawable? This will be the
-     * case if it specifies -v9 or -v10, or if the minimum SDK version declared in the
-     * manifest is 9 or 10 (and it does not specify some higher version like -v11
-     */
-    private static boolean isAndroid23(Context context, int folderVersion) {
-        if (isAndroid30(context, folderVersion)) {
-            return false;
-        }
-
-        if (folderVersion == 9 || folderVersion == 10) {
-            return true;
-        }
-
-        int minSdk = context.getMainProject().getMinSdk();
-
-        return minSdk == 9 || minSdk == 10;
-    }
-
-    private static float getMdpiScalingFactor(String folderName) {
-        // Can't do startsWith(DRAWABLE_MDPI) because the folder could
-        // be something like "drawable-sw600dp-mdpi".
-        if (folderName.contains("-mdpi")) {            //$NON-NLS-1$
-            return 1.0f;
-        } else if (folderName.contains("-hdpi")) {     //$NON-NLS-1$
-            return 1.5f;
-        } else if (folderName.contains("-xhdpi")) {    //$NON-NLS-1$
-            return 2.0f;
-        } else if (folderName.contains("-ldpi")) {     //$NON-NLS-1$
-            return 0.75f;
-        } else {
-            return 0f;
-        }
-    }
-
-    private static void checkSize(Context context, String folderName, File file,
-            int mdpiWidth, int mdpiHeight, boolean exactMatch) {
-        String fileName = file.getName();
-        // Only scan .png files (except 9-patch png's) and jpg files
-        if (!((endsWith(fileName, DOT_PNG) && !endsWith(fileName, DOT_9PNG)) ||
-                endsWith(fileName, DOT_JPG) || endsWith(fileName, DOT_JPEG))) {
-            return;
-        }
-
-        int width;
-        int height;
-        // Use 3:4:6:8 scaling ratio to look up the other expected sizes
-        if (folderName.startsWith(DRAWABLE_MDPI)) {
-            width = mdpiWidth;
-            height = mdpiHeight;
-        } else if (folderName.startsWith(DRAWABLE_HDPI)) {
-            // Perform math using floating point; if we just do
-            //   width = mdpiWidth * 3 / 2;
-            // then for mdpiWidth = 25 (as in notification icons on pre-GB) we end up
-            // with width = 37, instead of 38 (with floating point rounding we get 37.5 = 38)
-            width = Math.round(mdpiWidth * 3.f / 2);
-            height = Math.round(mdpiHeight * 3f / 2);
-        } else if (folderName.startsWith(DRAWABLE_XHDPI)) {
-            width = mdpiWidth * 2;
-            height = mdpiHeight * 2;
-        } else if (folderName.startsWith(DRAWABLE_LDPI)) {
-            width = Math.round(mdpiWidth * 3f / 4);
-            height = Math.round(mdpiHeight * 3f / 4);
-        } else {
-            return;
-        }
-
-        Dimension size = getSize(file);
-        if (size != null) {
-            if (exactMatch && size.width != width || size.height != height) {
-                context.report(
-                        ICON_EXPECTED_SIZE,
-                    Location.create(file),
-                    String.format(
-                        "Incorrect icon size for %1$s: expected %2$dx%3$d, but was %4$dx%5$d",
-                        folderName + File.separator + file.getName(),
-                        width, height, size.width, size.height),
-                    null);
-            } else if (!exactMatch && size.width > width || size.height > height) {
-                context.report(
-                        ICON_EXPECTED_SIZE,
-                    Location.create(file),
-                    String.format(
-                        "Incorrect icon size for %1$s: icon size should be at most %2$dx%3$d, but was %4$dx%5$d",
-                        folderName + File.separator + file.getName(),
-                        width, height, size.width, size.height),
-                    null);
-            }
-        }
-    }
-
-    private static Dimension getSize(File file) {
-        try {
-            ImageInputStream input = ImageIO.createImageInputStream(file);
-            if (input != null) {
-                try {
-                    Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
-                    if (readers.hasNext()) {
-                        ImageReader reader = readers.next();
-                        try {
-                            reader.setInput(input);
-                            return new Dimension(reader.getWidth(0), reader.getHeight(0));
-                        } finally {
-                            reader.dispose();
-                        }
-                    }
-                } finally {
-                    if (input != null) {
-                        input.close();
-                    }
-                }
-            }
-
-            // Fallback: read the image using the normal means
-            BufferedImage image = ImageIO.read(file);
-            if (image != null) {
-                return new Dimension(image.getWidth(), image.getHeight());
-            } else {
-                return null;
-            }
-        } catch (IOException e) {
-            // Pass -- we can't handle all image types, warn about those we can
-            return null;
-        }
-    }
-
-
-    private Set<String> mActionBarIcons;
-    private Set<String> mNotificationIcons;
-    private Set<String> mLauncherIcons;
-    private Multimap<String, String> mMenuToIcons;
-
-    private boolean isLauncherIcon(String name) {
-        assert name.indexOf('.') == -1; // Should supply base name
-
-        // Naming convention
-        if (name.startsWith("ic_launcher")) { //$NON-NLS-1$
-            return true;
-        }
-        return mLauncherIcons != null && mLauncherIcons.contains(name);
-    }
-
-    private boolean isNotificationIcon(String name) {
-        assert name.indexOf('.') == -1; // Should supply base name
-
-        // Naming convention
-        if (name.startsWith("ic_stat_")) { //$NON-NLS-1$
-            return true;
-        }
-
-        return mNotificationIcons != null && mNotificationIcons.contains(name);
-    }
-
-    private boolean isActionBarIcon(String name) {
-        assert name.indexOf('.') == -1; // Should supply base name
-
-        // Naming convention
-        if (name.startsWith("ic_action_")) { //$NON-NLS-1$
-            return true;
-        }
-
-        // Naming convention
-
-        return mActionBarIcons != null && mActionBarIcons.contains(name);
-    }
-
-    private boolean isActionBarIcon(Context context, String name, File file) {
-        if (isActionBarIcon(name)) {
-            return true;
-        }
-
-        // As of Android 3.0 ic_menu_ are action icons
-        if (file != null && name.startsWith("ic_menu_") //$NON-NLS-1$
-                && isAndroid30(context, Context.getFolderVersion(file))) {
-            // Naming convention
-            return true;
-        }
-
-        return false;
-    }
-
-    // XML detector: Skim manifest and menu files
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return file.getName().equals(ANDROID_MANIFEST_XML);
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.MENU;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                // Manifest
-                TAG_APPLICATION,
-                TAG_ACTIVITY,
-                TAG_SERVICE,
-                TAG_PROVIDER,
-                TAG_RECEIVER,
-
-                // Menu
-                TAG_ITEM
-        );
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        String icon = element.getAttributeNS(ANDROID_URI, ATTR_ICON);
-        if (icon != null && icon.startsWith(DRAWABLE_PREFIX)) {
-            icon = icon.substring(DRAWABLE_PREFIX.length());
-
-            String tagName = element.getTagName();
-            if (tagName.equals(TAG_ITEM)) {
-                if (mMenuToIcons == null) {
-                    mMenuToIcons = ArrayListMultimap.create();
-                }
-                String menu = getBaseName(context.file.getName());
-                mMenuToIcons.put(menu, icon);
-            } else {
-                // Manifest tags: launcher icons
-                if (mLauncherIcons == null) {
-                    mLauncherIcons = Sets.newHashSet();
-                }
-                mLauncherIcons.add(icon);
-            }
-        }
-    }
-
-
-    // ---- Implements JavaScanner ----
-
-    private static final String NOTIFICATION_CLASS = "Notification";              //$NON-NLS-1$
-    private static final String NOTIFICATION_COMPAT_CLASS = "NotificationCompat"; //$NON-NLS-1$
-    private static final String BUILDER_CLASS = "Builder";                        //$NON-NLS-1$
-    private static final String SET_SMALL_ICON = "setSmallIcon";                  //$NON-NLS-1$
-    private static final String ON_CREATE_OPTIONS_MENU = "onCreateOptionsMenu";   //$NON-NLS-1$
-
-    @Override
-    @Nullable
-    public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
-        return new NotificationFinder();
-    }
-
-    @Override
-    @Nullable
-    public List<Class<? extends Node>> getApplicableNodeTypes() {
-        List<Class<? extends Node>> types = new ArrayList<Class<? extends Node>>(3);
-        types.add(MethodDeclaration.class);
-        types.add(ConstructorInvocation.class);
-        return types;
-    }
-
-    private final class NotificationFinder extends ForwardingAstVisitor {
-        @Override
-        public boolean visitMethodDeclaration(MethodDeclaration node) {
-            if (ON_CREATE_OPTIONS_MENU.equals(node.astMethodName().astValue())) {
-                // Gather any R.menu references found in this method
-                node.accept(new MenuFinder());
-            }
-
-            return super.visitMethodDeclaration(node);
-        }
-
-        @Override
-        public boolean visitConstructorInvocation(ConstructorInvocation node) {
-            TypeReference reference = node.astTypeReference();
-            StrictListAccessor<TypeReferencePart, TypeReference> parts = reference.astParts();
-            String typeName = parts.last().astIdentifier().astValue();
-            if (NOTIFICATION_CLASS.equals(typeName)) {
-                StrictListAccessor<Expression, ConstructorInvocation> args = node.astArguments();
-                if (args.size() == 3) {
-                    if (args.first() instanceof Select && handleSelect((Select) args.first())) {
-                        return super.visitConstructorInvocation(node);
-                    }
-
-                    Node method = StringFormatDetector.getParentMethod(node);
-                    if (method != null) {
-                        // Must track local types
-                        String name = StringFormatDetector.getResourceForFirstArg(method, node);
-                        if (name != null) {
-                            if (mNotificationIcons == null) {
-                                mNotificationIcons = Sets.newHashSet();
-                            }
-                            mNotificationIcons.add(name);
-                        }
-                    }
-                }
-            } else if (BUILDER_CLASS.equals(typeName)) {
-                boolean isBuilder = false;
-                if (parts.size() == 1) {
-                    isBuilder = true;
-                } else if (parts.size() == 2) {
-                    String clz = parts.first().astIdentifier().astValue();
-                    if (NOTIFICATION_CLASS.equals(clz) || NOTIFICATION_COMPAT_CLASS.equals(clz)) {
-                        isBuilder = true;
-                    }
-                }
-                if (isBuilder) {
-                    Node method = StringFormatDetector.getParentMethod(node);
-                    if (method != null) {
-                        SetIconFinder finder = new SetIconFinder();
-                        method.accept(finder);
-                    }
-                }
-            }
-
-            return super.visitConstructorInvocation(node);
-        }
-    }
-
-    private boolean handleSelect(Select select) {
-        if (select.toString().startsWith(R_DRAWABLE_PREFIX)) {
-            String name = select.astIdentifier().astValue();
-            if (mNotificationIcons == null) {
-                mNotificationIcons = Sets.newHashSet();
-            }
-            mNotificationIcons.add(name);
-
-            return true;
-        }
-
-        return false;
-    }
-
-    private final class SetIconFinder extends ForwardingAstVisitor {
-        @Override
-        public boolean visitMethodInvocation(MethodInvocation node) {
-            if (SET_SMALL_ICON.equals(node.astName().astValue())) {
-                StrictListAccessor<Expression,MethodInvocation> arguments = node.astArguments();
-                if (arguments.size() == 1 && arguments.first() instanceof Select) {
-                    handleSelect((Select) arguments.first());
-                }
-            }
-            return super.visitMethodInvocation(node);
-        }
-    }
-
-    private final class MenuFinder extends ForwardingAstVisitor {
-        @Override
-        public boolean visitSelect(Select node) {
-            // R.type.name
-            if (node.astOperand() instanceof Select) {
-                Select select = (Select) node.astOperand();
-                if (select.astOperand() instanceof VariableReference) {
-                    VariableReference reference = (VariableReference) select.astOperand();
-                    if (reference.astIdentifier().astValue().equals(R_CLASS)) {
-                        String type = select.astIdentifier().astValue();
-
-                        if (type.equals(MENU_TYPE)) {
-                            String name = node.astIdentifier().astValue();
-                            // Reclassify icons in the given menu as action bar icons
-                            if (mMenuToIcons != null) {
-                                Collection<String> icons = mMenuToIcons.get(name);
-                                if (icons != null) {
-                                    if (mActionBarIcons == null) {
-                                        mActionBarIcons = Sets.newHashSet();
-                                    }
-                                    mActionBarIcons.addAll(icons);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-
-            return super.visitSelect(node);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/InefficientWeightDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/InefficientWeightDetector.java
deleted file mode 100644
index 0608de1..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/InefficientWeightDetector.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_BASELINE_ALIGNED;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_ORIENTATION;
-import static com.android.SdkConstants.ATTR_STYLE;
-import static com.android.SdkConstants.LINEAR_LAYOUT;
-import static com.android.SdkConstants.RADIO_GROUP;
-import static com.android.SdkConstants.VALUE_FILL_PARENT;
-import static com.android.SdkConstants.VALUE_MATCH_PARENT;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-import static com.android.SdkConstants.VIEW;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.client.api.SdkInfo;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.IdentityHashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Checks whether a layout_weight is declared inefficiently.
- */
-public class InefficientWeightDetector extends LayoutDetector {
-
-    /** Can a weight be replaced with 0dp instead for better performance? */
-    public static final Issue INEFFICIENT_WEIGHT = Issue.create(
-            "InefficientWeight", //$NON-NLS-1$
-            "Looks for inefficient weight declarations in LinearLayouts",
-            "When only a single widget in a LinearLayout defines a weight, it is more " +
-            "efficient to assign a width/height of `0dp` to it since it will absorb all " +
-            "the remaining space anyway. With a declared width/height of `0dp` it " +
-            "does not have to measure its own size first.",
-            Category.PERFORMANCE,
-            3,
-            Severity.WARNING,
-            InefficientWeightDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Are weights nested? */
-    public static final Issue NESTED_WEIGHTS = Issue.create(
-            "NestedWeights", //$NON-NLS-1$
-            "Looks for nested layout weights, which are costly",
-            "Layout weights require a widget to be measured twice. When a LinearLayout with " +
-            "non-zero weights is nested inside another LinearLayout with non-zero weights, " +
-            "then the number of measurements increase exponentially.",
-            Category.PERFORMANCE,
-            3,
-            Severity.WARNING,
-            InefficientWeightDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Should a LinearLayout set android:baselineAligned? */
-    public static final Issue BASELINE_WEIGHTS = Issue.create(
-            "DisableBaselineAlignment", //$NON-NLS-1$
-            "Looks for LinearLayouts which should set android:baselineAligned=false",
-            "When a LinearLayout is used to distribute the space proportionally between " +
-            "nested layouts, the baseline alignment property should be turned off to " +
-            "make the layout computation faster.",
-            Category.PERFORMANCE,
-            3,
-            Severity.WARNING,
-            InefficientWeightDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Using 0dp on the wrong dimension */
-    public static final Issue WRONG_0DP = Issue.create(
-            "Suspicious0dp", //$NON-NLS-1$
-            "Looks for 0dp as the width in a vertical LinearLayout or as the height in a " +
-            "horizontal",
-
-            "Using 0dp as the width in a horizontal LinearLayout with weights is a useful " +
-            "trick to ensure that only the weights (and not the intrinsic sizes) are used " +
-            "when sizing the children.\n" +
-            "\n" +
-            "However, if you use 0dp for the opposite dimension, the view will be invisible. " +
-            "This can happen if you change the orientation of a layout without also flipping " +
-            "the 0dp dimension in all the children.",
-            Category.CORRECTNESS,
-            6,
-            Severity.ERROR,
-            InefficientWeightDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Missing explicit orientation */
-    public static final Issue ORIENTATION = Issue.create(
-            "Orientation", //$NON-NLS-1$
-            "Checks that LinearLayouts with multiple children set the orientation",
-
-            "The default orientation of a LinearLayout is horizontal. It's pretty easy to "
-            + "believe that the layout is vertical, add multiple children to it, and wonder "
-            + "why only the first child is visible (when the subsequent children are "
-            + "off screen to the right). This lint rule helps pinpoint this issue by "
-            + "warning whenever a LinearLayout is used with an implicit orientation "
-            + "and multiple children.",
-
-            Category.CORRECTNESS,
-            2,
-            Severity.ERROR,
-            InefficientWeightDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /**
-     * Map from element to whether that element has a non-zero linear layout
-     * weight or has an ancestor which does
-     */
-    private final Map<Node, Boolean> mInsideWeight = new IdentityHashMap<Node, Boolean>();
-
-    /** Constructs a new {@link InefficientWeightDetector} */
-    public InefficientWeightDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(LINEAR_LAYOUT);
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        List<Element> children = LintUtils.getChildren(element);
-        // See if there is exactly one child with a weight
-        boolean multipleWeights = false;
-        Element weightChild = null;
-        boolean checkNesting = context.isEnabled(NESTED_WEIGHTS);
-        for (Element child : children) {
-            if (child.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_WEIGHT)) {
-                if (weightChild != null) {
-                    // More than one child defining a weight!
-                    multipleWeights = true;
-                } else if (!multipleWeights) {
-                    weightChild = child;
-                }
-
-                if (checkNesting) {
-                    mInsideWeight.put(child, Boolean.TRUE);
-
-                    Boolean inside = mInsideWeight.get(element);
-                    if (inside == null) {
-                        mInsideWeight.put(element, Boolean.FALSE);
-                    } else if (inside) {
-                        Attr sizeNode = child.getAttributeNodeNS(ANDROID_URI, ATTR_LAYOUT_WEIGHT);
-                        context.report(NESTED_WEIGHTS, sizeNode,
-                                context.getLocation(sizeNode),
-                                "Nested weights are bad for performance", null);
-                        // Don't warn again
-                        checkNesting = false;
-                    }
-                }
-            }
-        }
-
-        String orientation = element.getAttributeNS(ANDROID_URI, ATTR_ORIENTATION);
-        if (children.size() >= 2 && (orientation == null || orientation.isEmpty())
-                && context.isEnabled(ORIENTATION)) {
-            // See if at least one of the children, except the last one, sets layout_width
-            // to match_parent (or fill_parent), in an implicitly horizontal layout, since
-            // that might mean the last child won't be visible. This is a source of confusion
-            // for new Android developers.
-            boolean maxWidthSet = false;
-            Iterator<Element> iterator = children.iterator();
-            while (iterator.hasNext()) {
-                Element child = iterator.next();
-                if (!iterator.hasNext()) { // Don't check the last one
-                    break;
-                }
-                String width = child.getAttributeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH);
-                if (VALUE_MATCH_PARENT.equals(width) || VALUE_FILL_PARENT.equals(width)) {
-                    // Also check that weights are not set here; this affects the computation
-                    // a bit and the child may not fill up the whole linear layout
-                    if (!child.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_WEIGHT)) {
-                        maxWidthSet = true;
-                        break;
-                    }
-                }
-            }
-            if (maxWidthSet && !element.hasAttribute(ATTR_STYLE)) {
-                String message = "Wrong orientation? No orientation specified, and the default "
-                        + "is horizontal, yet this layout has multiple children where at "
-                        + "least one has layout_width=\"match_parent\"";
-                context.report(ORIENTATION, element, context.getLocation(element), message, null);
-            }
-        }
-
-        if (context.isEnabled(BASELINE_WEIGHTS) && weightChild != null
-                && !VALUE_VERTICAL.equals(orientation)
-                && !element.hasAttributeNS(ANDROID_URI, ATTR_BASELINE_ALIGNED)) {
-            // See if all the children are layouts
-            boolean allChildrenAreLayouts = !children.isEmpty();
-            SdkInfo sdkInfo = context.getClient().getSdkInfo(context.getProject());
-            for (Element child : children) {
-                String tagName = child.getTagName();
-                if (!(sdkInfo.isLayout(tagName)
-                        // RadioGroup is a layout, but one which possibly should be base aligned
-                        && !tagName.equals(RADIO_GROUP)
-                        // Consider <fragment> tags as layouts for the purposes of this check
-                        || VIEW_FRAGMENT.equals(tagName)
-                        // Ditto for <include> tags
-                        || VIEW_INCLUDE.equals(tagName))) {
-                    allChildrenAreLayouts = false;
-                }
-            }
-            if (allChildrenAreLayouts) {
-                context.report(BASELINE_WEIGHTS,
-                        element,
-                        context.getLocation(element),
-                        "Set android:baselineAligned=\"false\" on this element for better performance",
-                        null);
-            }
-        }
-
-        if (context.isEnabled(INEFFICIENT_WEIGHT)
-                && weightChild != null && !multipleWeights) {
-            String dimension;
-            if (VALUE_VERTICAL.equals(orientation)) {
-                dimension = ATTR_LAYOUT_HEIGHT;
-            } else {
-                dimension = ATTR_LAYOUT_WIDTH;
-            }
-            Attr sizeNode = weightChild.getAttributeNodeNS(ANDROID_URI, dimension);
-            String size = sizeNode != null ? sizeNode.getValue() : "(undefined)";
-            if (!size.startsWith("0")) { //$NON-NLS-1$
-                String msg = String.format(
-                        "Use a %1$s of 0dip instead of %2$s for better performance",
-                        dimension, size);
-                context.report(INEFFICIENT_WEIGHT,
-                        weightChild,
-                        context.getLocation(sizeNode != null ? sizeNode : weightChild), msg, null);
-
-            }
-        }
-
-        if (context.isEnabled(WRONG_0DP)) {
-            checkWrong0Dp(context, element, children);
-        }
-    }
-
-    private static void checkWrong0Dp(XmlContext context, Element element,
-                                      List<Element> children) {
-        boolean isVertical = false;
-        String orientation = element.getAttributeNS(ANDROID_URI, ATTR_ORIENTATION);
-        if (VALUE_VERTICAL.equals(orientation)) {
-            isVertical = true;
-        }
-
-        for (Element child : children) {
-            String tagName = child.getTagName();
-            if (tagName.equals(VIEW)) {
-                // Might just used for spacing
-                return;
-            }
-            if (tagName.indexOf('.') != -1 || tagName.equals(VIEW_TAG)) {
-                // Custom views might perform their own dynamic sizing or ignore the layout
-                // attributes all together
-                return;
-            }
-
-            boolean hasWeight = child.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_WEIGHT);
-
-            Attr widthNode = child.getAttributeNodeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH);
-            Attr heightNode = child.getAttributeNodeNS(ANDROID_URI, ATTR_LAYOUT_HEIGHT);
-
-            boolean noWidth = false;
-            boolean noHeight = false;
-            if (widthNode != null && widthNode.getValue().startsWith("0")) { //$NON-NLS-1$
-                noWidth = true;
-            }
-            if (heightNode != null && heightNode.getValue().startsWith("0")) { //$NON-NLS-1$
-                noHeight = true;
-            } else if (!noWidth) {
-                return;
-            }
-
-            // If you're specifying 0dp for both the width and height you are probably
-            // trying to hide it deliberately
-            if (noWidth && noHeight) {
-                return;
-            }
-            assert noWidth || noHeight;
-
-            if (noWidth) {
-                assert widthNode != null;
-                if (!hasWeight) {
-                    context.report(WRONG_0DP, widthNode, context.getLocation(widthNode),
-                        "Suspicious size: this will make the view invisible, should be " +
-                        "used with layout_weight", null);
-                } else if (isVertical) {
-                    context.report(WRONG_0DP, widthNode, context.getLocation(widthNode),
-                        "Suspicious size: this will make the view invisible, probably " +
-                        "intended for layout_height", null);
-                }
-            } else {
-                assert noHeight;
-                assert heightNode != null;
-                if (!hasWeight) {
-                    context.report(WRONG_0DP, widthNode, context.getLocation(heightNode),
-                        "Suspicious size: this will make the view invisible, should be " +
-                        "used with layout_weight", null);
-                } else if (!isVertical) {
-                    context.report(WRONG_0DP, widthNode, context.getLocation(heightNode),
-                        "Suspicious size: this will make the view invisible, probably " +
-                        "intended for layout_width", null);
-                }
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/InvalidPackageDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/InvalidPackageDetector.java
deleted file mode 100644
index 048f6ae..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/InvalidPackageDetector.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.google.common.collect.Sets;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.FieldInsnNode;
-import org.objectweb.asm.tree.InsnList;
-import org.objectweb.asm.tree.LdcInsnNode;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-
-import java.io.File;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Set;
-
-import lombok.ast.libs.org.parboiled.google.collect.Lists;
-
-/**
- * Looks for usages of Java packages that are not included in Android.
- */
-public class InvalidPackageDetector extends Detector implements Detector.ClassScanner {
-    /** Accessing an invalid package */
-    public static final Issue ISSUE = Issue.create("InvalidPackage", //$NON-NLS-1$
-            "Finds API accesses to APIs that are not supported in Android",
-
-            "This check scans through libraries looking for calls to APIs that are not included " +
-            "in Android.\n" +
-            "\n" +
-            "When you create Android projects, the classpath is set up such that you can only " +
-            "access classes in the API packages that are included in Android. However, if you " +
-            "add other projects to your libs/ folder, there is no guarantee that those .jar " +
-            "files were built with an Android specific classpath, and in particular, they " +
-            "could be accessing unsupported APIs such as java.applet.\n" +
-            "\n" +
-            "This check scans through library jars and looks for references to API packages " +
-            "that are not included in Android and flags these. This is only an error if your " +
-            "code calls one of the library classes which wind up referencing the unsupported " +
-            "package.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.ERROR,
-            InvalidPackageDetector.class,
-            EnumSet.of(Scope.JAVA_LIBRARIES));
-
-    private static final String JAVA_PKG_PREFIX = "java/";    //$NON-NLS-1$
-    private static final String JAVAX_PKG_PREFIX = "javax/";  //$NON-NLS-1$
-
-    private ApiLookup mApiDatabase;
-
-    /**
-     * List of candidates that are potential package violations. These are
-     * recorded as candidates rather than flagged immediately such that we can
-     * filter out hits for classes that are also defined as libraries (possibly
-     * encountered later in the library traversal).
-     */
-    private List<Candidate> mCandidates;
-    /**
-     * Set of Java packages defined in the libraries; this means that if the
-     * user has added libraries in this package namespace (such as the
-     * null annotations jars) we don't flag these.
-     */
-    private final Set<String> mJavaxLibraryClasses = Sets.newHashSetWithExpectedSize(64);
-
-    /** Constructs a new package check */
-    public InvalidPackageDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.SLOW;
-    }
-
-    @Override
-    public void beforeCheckProject(@NonNull Context context) {
-        mApiDatabase = ApiLookup.get(context.getClient());
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @SuppressWarnings("rawtypes") // ASM API
-    @Override
-    public void checkClass(@NonNull final ClassContext context, @NonNull ClassNode classNode) {
-        if (!context.isFromClassLibrary() || shouldSkip(context.file)) {
-            return;
-        }
-
-        if (mApiDatabase == null) {
-            return;
-        }
-
-        if (classNode.name.startsWith(JAVAX_PKG_PREFIX)) {
-            mJavaxLibraryClasses.add(classNode.name);
-        }
-
-        List methodList = classNode.methods;
-        for (Object m : methodList) {
-            MethodNode method = (MethodNode) m;
-
-            InsnList nodes = method.instructions;
-
-            // Check return type
-            // The parameter types are already handled as local variables so we can skip
-            // right to the return type.
-            // Check types in parameter list
-            String signature = method.desc;
-            if (signature != null) {
-                int args = signature.indexOf(')');
-                if (args != -1 && signature.charAt(args + 1) == 'L') {
-                    String type = signature.substring(args + 2, signature.length() - 1);
-                    if (isInvalidPackage(type)) {
-                        AbstractInsnNode first = nodes.size() > 0 ? nodes.get(0) : null;
-                        record(context, method, first, type);
-                    }
-                }
-            }
-
-            for (int i = 0, n = nodes.size(); i < n; i++) {
-                AbstractInsnNode instruction = nodes.get(i);
-                int type = instruction.getType();
-                if (type == AbstractInsnNode.METHOD_INSN) {
-                    MethodInsnNode node = (MethodInsnNode) instruction;
-                    String owner = node.owner;
-
-                    // No need to check methods in this local class; we know they
-                    // won't be an API match
-                    if (node.getOpcode() == Opcodes.INVOKEVIRTUAL
-                            && owner.equals(classNode.name)) {
-                        owner = classNode.superName;
-                    }
-
-                    while (owner != null) {
-                        if (isInvalidPackage(owner)) {
-                            record(context, method, instruction, owner);
-                        }
-
-                        // For virtual dispatch, walk up the inheritance chain checking
-                        // each inherited method
-                        if (owner.startsWith("android/")           //$NON-NLS-1$
-                                || owner.startsWith(JAVA_PKG_PREFIX)
-                                || owner.startsWith(JAVAX_PKG_PREFIX)) {
-                            owner = null;
-                        } else if (node.getOpcode() == Opcodes.INVOKEVIRTUAL) {
-                            owner = context.getDriver().getSuperClass(owner);
-                        } else if (node.getOpcode() == Opcodes.INVOKESTATIC) {
-                            // Inherit through static classes as well
-                            owner = context.getDriver().getSuperClass(owner);
-                        } else {
-                            owner = null;
-                        }
-                    }
-                } else if (type == AbstractInsnNode.FIELD_INSN) {
-                    FieldInsnNode node = (FieldInsnNode) instruction;
-                    String owner = node.owner;
-                    if (isInvalidPackage(owner)) {
-                        record(context, method, instruction, owner);
-                    }
-                } else if (type == AbstractInsnNode.LDC_INSN) {
-                    LdcInsnNode node = (LdcInsnNode) instruction;
-                    if (node.cst instanceof Type) {
-                        Type t = (Type) node.cst;
-                        String className = t.getInternalName();
-                        if (isInvalidPackage(className)) {
-                            record(context, method, instruction, className);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private boolean isInvalidPackage(String owner) {
-        if (owner.startsWith(JAVA_PKG_PREFIX)
-                || owner.startsWith(JAVAX_PKG_PREFIX)) {
-            return !mApiDatabase.isValidJavaPackage(owner);
-        }
-
-        return false;
-    }
-
-    private void record(ClassContext context, MethodNode method,
-            AbstractInsnNode instruction, String owner) {
-        if (owner.indexOf('$') != -1) {
-            // Don't report inner classes too; there will pretty much always be an outer class
-            // reference as well
-            return;
-        }
-
-        if (mCandidates == null) {
-            mCandidates = Lists.newArrayList();
-        }
-        mCandidates.add(new Candidate(owner, context.getClassNode().name, context.getJarFile()));
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (mCandidates == null) {
-            return;
-        }
-
-        for (Candidate candidate : mCandidates) {
-            String type = candidate.mClass;
-            if (mJavaxLibraryClasses.contains(type)) {
-                continue;
-            }
-            File jarFile = candidate.mJarFile;
-            String referencedIn = candidate.mReferencedIn;
-
-            Location location = Location.create(jarFile);
-            Object pkg = getPackageName(type);
-            String message = String.format(
-                    "Invalid package reference in library; not included in Android: %1$s. " +
-                    "Referenced from %2$s.", pkg, ClassContext.getFqcn(referencedIn));
-            context.report(ISSUE, location, message, null);
-        }
-    }
-
-    private static Object getPackageName(String owner) {
-        String pkg = owner;
-        int index = pkg.lastIndexOf('/');
-        if (index != -1) {
-            pkg = pkg.substring(0, index);
-        }
-
-        return ClassContext.getFqcn(pkg);
-    }
-
-    private static boolean shouldSkip(File file) {
-        // No need to do work on this library, which is included in pretty much all new ADT
-        // projects
-        if (file.getPath().endsWith("android-support-v4.jar")) { //$NON-NLS-1$
-            return true;
-        }
-
-        return false;
-    }
-
-    private static class Candidate {
-        private final String mReferencedIn;
-        private final File mJarFile;
-        private final String mClass;
-
-        public Candidate(String className, String referencedIn, File jarFile) {
-            mClass = className;
-            mReferencedIn = referencedIn;
-            mJarFile = jarFile;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/JavaPerformanceDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/JavaPerformanceDetector.java
deleted file mode 100644
index b161699..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/JavaPerformanceDetector.java
+++ /dev/null
@@ -1,565 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.google.common.collect.Sets;
-import com.google.common.collect.Sets.SetView;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.BinaryExpression;
-import lombok.ast.BinaryOperator;
-import lombok.ast.ConstructorInvocation;
-import lombok.ast.Expression;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.If;
-import lombok.ast.MethodDeclaration;
-import lombok.ast.MethodInvocation;
-import lombok.ast.Node;
-import lombok.ast.Select;
-import lombok.ast.StrictListAccessor;
-import lombok.ast.This;
-import lombok.ast.Throw;
-import lombok.ast.TypeReference;
-import lombok.ast.TypeReferencePart;
-import lombok.ast.UnaryExpression;
-import lombok.ast.VariableDefinition;
-import lombok.ast.VariableReference;
-
-/**
- * Looks for performance issues in Java files, such as memory allocations during
- * drawing operations and using HashMap instead of SparseArray.
- */
-public class JavaPerformanceDetector extends Detector implements Detector.JavaScanner {
-    /** Allocating objects during a paint method */
-    public static final Issue PAINT_ALLOC = Issue.create(
-            "DrawAllocation", //$NON-NLS-1$
-            "Looks for memory allocations within drawing code",
-
-            "You should avoid allocating objects during a drawing or layout operation. These " +
-            "are called frequently, so a smooth UI can be interrupted by garbage collection " +
-            "pauses caused by the object allocations.\n" +
-            "\n" +
-            "The way this is generally handled is to allocate the needed objects up front " +
-            "and to reuse them for each drawing operation.\n" +
-            "\n" +
-            "Some methods allocate memory on your behalf (such as `Bitmap.create`), and these " +
-            "should be handled in the same way.",
-
-            Category.PERFORMANCE,
-            9,
-            Severity.WARNING,
-            JavaPerformanceDetector.class,
-            Scope.JAVA_FILE_SCOPE);
-
-    /** Using HashMaps where SparseArray would be better */
-    public static final Issue USE_SPARSEARRAY = Issue.create(
-            "UseSparseArrays", //$NON-NLS-1$
-            "Looks for opportunities to replace HashMaps with the more efficient SparseArray",
-
-            "For maps where the keys are of type integer, it's typically more efficient to " +
-            "use the Android `SparseArray` API. This check identifies scenarios where you might " +
-            "want to consider using `SparseArray` instead of `HashMap` for better performance.\n" +
-            "\n" +
-            "This is *particularly* useful when the value types are primitives like ints, " +
-            "where you can use `SparseIntArray` and avoid auto-boxing the values from `int` to " +
-            "`Integer`.\n" +
-            "\n" +
-            "If you need to construct a `HashMap` because you need to call an API outside of " +
-            "your control which requires a `Map`, you can suppress this warning using for " +
-            "example the `@SuppressLint` annotation.",
-
-            Category.PERFORMANCE,
-            4,
-            Severity.WARNING,
-            JavaPerformanceDetector.class,
-            Scope.JAVA_FILE_SCOPE);
-
-    /** Using {@code new Integer()} instead of the more efficient {@code Integer.valueOf} */
-    public static final Issue USE_VALUEOF = Issue.create(
-            "UseValueOf", //$NON-NLS-1$
-            "Looks for usages of \"new\" for wrapper classes which should use \"valueOf\" instead",
-
-            "You should not call the constructor for wrapper classes directly, such as" +
-            "`new Integer(42)`. Instead, call the `valueOf` factory method, such as " +
-            "`Integer.valueOf(42)`. This will typically use less memory because common integers " +
-            "such as 0 and 1 will share a single instance.",
-
-            Category.PERFORMANCE,
-            4,
-            Severity.WARNING,
-            JavaPerformanceDetector.class,
-            Scope.JAVA_FILE_SCOPE);
-
-    static final String ON_MEASURE = "onMeasure";                           //$NON-NLS-1$
-    static final String ON_DRAW = "onDraw";                                 //$NON-NLS-1$
-    static final String ON_LAYOUT = "onLayout";                             //$NON-NLS-1$
-    private static final String INT = "int";                                //$NON-NLS-1$
-    private static final String INTEGER = "Integer";                        //$NON-NLS-1$
-    private static final String BOOL = "boolean";                           //$NON-NLS-1$
-    private static final String BOOLEAN = "Boolean";                        //$NON-NLS-1$
-    private static final String LONG = "Long";                              //$NON-NLS-1$
-    private static final String CHARACTER = "Character";                    //$NON-NLS-1$
-    private static final String DOUBLE = "Double";                          //$NON-NLS-1$
-    private static final String FLOAT = "Float";                            //$NON-NLS-1$
-    private static final String HASH_MAP = "HashMap";                       //$NON-NLS-1$
-    private static final String SPARSE_ARRAY = "SparseArray";               //$NON-NLS-1$
-    private static final String CANVAS = "Canvas";                          //$NON-NLS-1$
-    private static final String LAYOUT = "layout";                          //$NON-NLS-1$
-
-    /** Constructs a new {@link JavaPerformanceDetector} check */
-    public JavaPerformanceDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return true;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    public List<Class<? extends Node>> getApplicableNodeTypes() {
-        List<Class<? extends Node>> types = new ArrayList<Class<? extends Node>>(3);
-        types.add(ConstructorInvocation.class);
-        types.add(MethodDeclaration.class);
-        types.add(MethodInvocation.class);
-        return types;
-    }
-
-    @Override
-    public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
-        return new PerformanceVisitor(context);
-    }
-
-    private static class PerformanceVisitor extends ForwardingAstVisitor {
-        private final JavaContext mContext;
-        private final boolean mCheckMaps;
-        private final boolean mCheckAllocations;
-        private final boolean mCheckValueOf;
-        /** Whether allocations should be "flagged" in the current method */
-        private boolean mFlagAllocations;
-
-        public PerformanceVisitor(JavaContext context) {
-            mContext = context;
-
-            mCheckAllocations = context.isEnabled(PAINT_ALLOC);
-            mCheckMaps = context.isEnabled(USE_SPARSEARRAY);
-            mCheckValueOf = context.isEnabled(USE_VALUEOF);
-        }
-
-        @Override
-        public boolean visitMethodDeclaration(MethodDeclaration node) {
-            mFlagAllocations = isBlockedAllocationMethod(node);
-
-            return super.visitMethodDeclaration(node);
-        }
-
-        @Override
-        public boolean visitConstructorInvocation(ConstructorInvocation node) {
-            String typeName = null;
-            if (mCheckMaps) {
-                TypeReference reference = node.astTypeReference();
-                typeName = reference.astParts().last().astIdentifier().astValue();
-                // TODO: Should we handle factory method constructions of HashMaps as well,
-                // e.g. via Guava? This is a bit trickier since we need to infer the type
-                // arguments from the calling context.
-                if (typeName.equals(HASH_MAP)) {
-                    checkHashMap(node, reference);
-                } else if (typeName.equals(SPARSE_ARRAY)) {
-                    checkSparseArray(node, reference);
-                }
-            }
-
-            if (mCheckValueOf) {
-                if (typeName == null) {
-                    TypeReference reference = node.astTypeReference();
-                    typeName = reference.astParts().last().astIdentifier().astValue();
-                }
-                if ((typeName.equals(INTEGER)
-                        || typeName.equals(BOOLEAN)
-                        || typeName.equals(FLOAT)
-                        || typeName.equals(CHARACTER)
-                        || typeName.equals(LONG)
-                        || typeName.equals(DOUBLE))
-                        && node.astTypeReference().astParts().size() == 1
-                        && node.astArguments().size() == 1) {
-                    String argument = node.astArguments().first().toString();
-                    mContext.report(USE_VALUEOF, node, mContext.getLocation(node),
-                            String.format("Use %1$s.valueOf(%2$s) instead", typeName, argument),
-                            null);
-                }
-            }
-
-            if (mFlagAllocations && !(node.getParent() instanceof Throw) && mCheckAllocations) {
-                // Make sure we're still inside the method declaration that marked
-                // mInDraw as true, in case we've left it and we're in a static
-                // block or something:
-                Node method = node;
-                while (method != null) {
-                    if (method instanceof MethodDeclaration) {
-                        break;
-                    }
-                    method = method.getParent();
-                }
-                if (method != null && isBlockedAllocationMethod(((MethodDeclaration) method))
-                        && !isLazilyInitialized(node)) {
-                    reportAllocation(node);
-                }
-            }
-
-            return super.visitConstructorInvocation(node);
-        }
-
-        private void reportAllocation(Node node) {
-            mContext.report(PAINT_ALLOC, node, mContext.getLocation(node),
-                "Avoid object allocations during draw/layout operations (preallocate and " +
-                "reuse instead)", null);
-        }
-
-        @Override
-        public boolean visitMethodInvocation(MethodInvocation node) {
-            if (mFlagAllocations && node.astOperand() != null) {
-                // Look for forbidden methods
-                String methodName = node.astName().astValue();
-                if (methodName.equals("createBitmap")                              //$NON-NLS-1$
-                        || methodName.equals("createScaledBitmap")) {              //$NON-NLS-1$
-                    String operand = node.astOperand().toString();
-                    if (operand.equals("Bitmap")                                   //$NON-NLS-1$
-                            || operand.equals("android.graphics.Bitmap")) {        //$NON-NLS-1$
-                        if (!isLazilyInitialized(node)) {
-                            reportAllocation(node);
-                        }
-                    }
-                } else if (methodName.startsWith("decode")) {                      //$NON-NLS-1$
-                    // decodeFile, decodeByteArray, ...
-                    String operand = node.astOperand().toString();
-                    if (operand.equals("BitmapFactory")                            //$NON-NLS-1$
-                            || operand.equals("android.graphics.BitmapFactory")) { //$NON-NLS-1$
-                        if (!isLazilyInitialized(node)) {
-                            reportAllocation(node);
-                        }
-                    }
-                } else if (methodName.equals("getClipBounds")) {                   //$NON-NLS-1$
-                    if (node.astArguments().isEmpty()) {
-                        mContext.report(PAINT_ALLOC, node, mContext.getLocation(node),
-                                "Avoid object allocations during draw operations: Use " +
-                                "Canvas.getClipBounds(Rect) instead of Canvas.getClipBounds() " +
-                                "which allocates a temporary Rect", null);
-                    }
-                }
-            }
-
-            return super.visitMethodInvocation(node);
-        }
-
-        /**
-         * Check whether the given invocation is done as a lazy initialization,
-         * e.g. {@code if (foo == null) foo = new Foo();}.
-         * <p>
-         * This tries to also handle the scenario where the check is on some
-         * <b>other</b> variable - e.g.
-         * <pre>
-         *    if (foo == null) {
-         *        foo == init1();
-         *        bar = new Bar();
-         *    }
-         * </pre>
-         * or
-         * <pre>
-         *    if (!initialized) {
-         *        initialized = true;
-         *        bar = new Bar();
-         *    }
-         * </pre>
-         */
-        private static boolean isLazilyInitialized(Node node) {
-            Node curr = node.getParent();
-            while (curr != null) {
-                if (curr instanceof MethodDeclaration) {
-                    return false;
-                } else if (curr instanceof If) {
-                    If ifNode = (If) curr;
-                    // See if the if block represents a lazy initialization:
-                    // compute all variable names seen in the condition
-                    // (e.g. for "if (foo == null || bar != foo)" the result is "foo,bar"),
-                    // and then compute all variables assigned to in the if body,
-                    // and if there is an overlap, we'll consider the whole if block
-                    // guarded (so lazily initialized and an allocation we won't complain
-                    // about.)
-                    List<String> assignments = new ArrayList<String>();
-                    AssignmentTracker visitor = new AssignmentTracker(assignments);
-                    ifNode.astStatement().accept(visitor);
-                    if (!assignments.isEmpty()) {
-                        List<String> references = new ArrayList<String>();
-                        addReferencedVariables(references, ifNode.astCondition());
-                        if (!references.isEmpty()) {
-                            SetView<String> intersection = Sets.intersection(
-                                    new HashSet<String>(assignments),
-                                    new HashSet<String>(references));
-                            return !intersection.isEmpty();
-                        }
-                    }
-                    return false;
-
-                }
-                curr = curr.getParent();
-            }
-
-            return false;
-        }
-
-        /** Adds any variables referenced in the given expression into the given list */
-        private static void addReferencedVariables(Collection<String> variables,
-                Expression expression) {
-            if (expression instanceof BinaryExpression) {
-                BinaryExpression binary = (BinaryExpression) expression;
-                addReferencedVariables(variables, binary.astLeft());
-                addReferencedVariables(variables, binary.astRight());
-            } else if (expression instanceof UnaryExpression) {
-                UnaryExpression unary = (UnaryExpression) expression;
-                addReferencedVariables(variables, unary.astOperand());
-            } else if (expression instanceof VariableReference) {
-                VariableReference reference = (VariableReference) expression;
-                variables.add(reference.astIdentifier().astValue());
-            } else if (expression instanceof Select) {
-                Select select = (Select) expression;
-                if (select.astOperand() instanceof This) {
-                    variables.add(select.astIdentifier().astValue());
-                }
-            }
-        }
-
-        /**
-         * Returns whether the given method declaration represents a method
-         * where allocating objects is not allowed for performance reasons
-         */
-        private static boolean isBlockedAllocationMethod(MethodDeclaration node) {
-            return isOnDrawMethod(node) || isOnMeasureMethod(node) || isOnLayoutMethod(node)
-                    || isLayoutMethod(node);
-        }
-
-        /**
-         * Returns true if this method looks like it's overriding android.view.View's
-         * {@code protected void onDraw(Canvas canvas)}
-         */
-        private static boolean isOnDrawMethod(MethodDeclaration node) {
-            if (ON_DRAW.equals(node.astMethodName().astValue())) {
-                StrictListAccessor<VariableDefinition, MethodDeclaration> parameters =
-                        node.astParameters();
-                if (parameters != null && parameters.size() == 1) {
-                    VariableDefinition arg0 = parameters.first();
-                    TypeReferencePart type = arg0.astTypeReference().astParts().last();
-                    String typeName = type.getTypeName();
-                    if (typeName.equals(CANVAS)) {
-                        return true;
-                    }
-                }
-            }
-
-            return false;
-        }
-
-        /**
-         * Returns true if this method looks like it's overriding
-         * android.view.View's
-         * {@code protected void onLayout(boolean changed, int left, int top,
-         *      int right, int bottom)}
-         */
-        private static boolean isOnLayoutMethod(MethodDeclaration node) {
-            if (ON_LAYOUT.equals(node.astMethodName().astValue())) {
-                StrictListAccessor<VariableDefinition, MethodDeclaration> parameters =
-                        node.astParameters();
-                if (parameters != null && parameters.size() == 5) {
-                    Iterator<VariableDefinition> iterator = parameters.iterator();
-                    if (!iterator.hasNext()) {
-                        return false;
-                    }
-
-                    // Ensure that the argument list matches boolean, int, int, int, int
-                    TypeReferencePart type = iterator.next().astTypeReference().astParts().last();
-                    if (!type.getTypeName().equals(BOOL) || !iterator.hasNext()) {
-                        return false;
-                    }
-                    for (int i = 0; i < 4; i++) {
-                        type = iterator.next().astTypeReference().astParts().last();
-                        if (!type.getTypeName().equals(INT)) {
-                            return false;
-                        }
-                        if (!iterator.hasNext()) {
-                            return i == 3;
-                        }
-                    }
-                }
-            }
-
-            return false;
-        }
-
-        /**
-         * Returns true if this method looks like it's overriding android.view.View's
-         * {@code protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)}
-         */
-        private static boolean isOnMeasureMethod(MethodDeclaration node) {
-            if (ON_MEASURE.equals(node.astMethodName().astValue())) {
-                StrictListAccessor<VariableDefinition, MethodDeclaration> parameters =
-                        node.astParameters();
-                if (parameters != null && parameters.size() == 2) {
-                    VariableDefinition arg0 = parameters.first();
-                    VariableDefinition arg1 = parameters.last();
-                    TypeReferencePart type1 = arg0.astTypeReference().astParts().last();
-                    TypeReferencePart type2 = arg1.astTypeReference().astParts().last();
-                    return INT.equals(type1.getTypeName()) && INT.equals(type2.getTypeName());
-                }
-            }
-
-            return false;
-        }
-
-        /**
-         * Returns true if this method looks like it's overriding android.view.View's
-         * {@code public void layout(int l, int t, int r, int b)}
-         */
-        private static boolean isLayoutMethod(MethodDeclaration node) {
-            if (LAYOUT.equals(node.astMethodName().astValue())) {
-                StrictListAccessor<VariableDefinition, MethodDeclaration> parameters =
-                        node.astParameters();
-                if (parameters != null && parameters.size() == 4) {
-                    Iterator<VariableDefinition> iterator = parameters.iterator();
-                    for (int i = 0; i < 4; i++) {
-                        if (!iterator.hasNext()) {
-                            return false;
-                        }
-                        VariableDefinition next = iterator.next();
-                        TypeReferencePart type = next.astTypeReference().astParts().last();
-                        if (!INT.equals(type.getTypeName())) {
-                            return false;
-                        }
-                    }
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-
-        /**
-         * Checks whether the given constructor call and type reference refers
-         * to a HashMap constructor call that is eligible for replacement by a
-         * SparseArray call instead
-         */
-        private void checkHashMap(ConstructorInvocation node, TypeReference reference) {
-            // reference.hasTypeArguments returns false where it should not
-            StrictListAccessor<TypeReference, TypeReference> types = reference.getTypeArguments();
-            if (types != null && types.size() == 2) {
-                TypeReference first = types.first();
-                if (first.getTypeName().equals(INTEGER)) {
-                    String valueType = types.last().getTypeName();
-                    if (valueType.equals(INTEGER)) {
-                        mContext.report(USE_SPARSEARRAY, node, mContext.getLocation(node),
-                            "Use new SparseIntArray(...) instead for better performance",
-                            null);
-                    } else if (valueType.equals(BOOLEAN)) {
-                        mContext.report(USE_SPARSEARRAY, node, mContext.getLocation(node),
-                                "Use new SparseBooleanArray(...) instead for better performance",
-                                null);
-                    } else if (valueType.equals(LONG) && mContext.getProject().getMinSdk() >= 17) {
-                        mContext.report(USE_SPARSEARRAY, node, mContext.getLocation(node),
-                                "Use new SparseLongArray(...) instead for better performance",
-                                null);
-                    } else {
-                        mContext.report(USE_SPARSEARRAY, node, mContext.getLocation(node),
-                            String.format(
-                                "Use new SparseArray<%1$s>(...) instead for better performance",
-                              valueType),
-                            null);
-                    }
-                }
-            }
-        }
-
-        private void checkSparseArray(ConstructorInvocation node, TypeReference reference) {
-            // reference.hasTypeArguments returns false where it should not
-            StrictListAccessor<TypeReference, TypeReference> types = reference.getTypeArguments();
-            if (types != null && types.size() == 1) {
-                TypeReference first = types.first();
-                String valueType = first.getTypeName();
-                if (valueType.equals(INTEGER)) {
-                    mContext.report(USE_SPARSEARRAY, node, mContext.getLocation(node),
-                        "Use new SparseIntArray(...) instead for better performance",
-                        null);
-                } else if (valueType.equals(BOOLEAN)) {
-                    mContext.report(USE_SPARSEARRAY, node, mContext.getLocation(node),
-                            "Use new SparseBooleanArray(...) instead for better performance",
-                            null);
-                } else if (valueType.equals(LONG) && mContext.getProject().getMinSdk() >= 17) {
-                    mContext.report(USE_SPARSEARRAY, node, mContext.getLocation(node),
-                            "Use new SparseLongArray(...) instead for better performance",
-                            null);
-                }
-            }
-        }
-    }
-
-    /** Visitor which records variable names assigned into */
-    private static class AssignmentTracker extends ForwardingAstVisitor {
-        private final Collection<String> mVariables;
-
-        public AssignmentTracker(Collection<String> variables) {
-            mVariables = variables;
-        }
-
-        @Override
-        public boolean visitBinaryExpression(BinaryExpression node) {
-            BinaryOperator operator = node.astOperator();
-            if (operator == BinaryOperator.ASSIGN || operator == BinaryOperator.OR_ASSIGN) {
-                Expression left = node.astLeft();
-                String variable;
-                if (left instanceof Select && ((Select) left).astOperand() instanceof This) {
-                    variable = ((Select) left).astIdentifier().astValue();
-                } else {
-                    variable = left.toString();
-                }
-                mVariables.add(variable);
-            }
-
-            return super.visitBinaryExpression(node);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/LabelForDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/LabelForDetector.java
deleted file mode 100644
index 283e244..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/LabelForDetector.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_HINT;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LABEL_FOR;
-import static com.android.SdkConstants.AUTO_COMPLETE_TEXT_VIEW;
-import static com.android.SdkConstants.EDIT_TEXT;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.MULTI_AUTO_COMPLETE_TEXT_VIEW;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.tools.lint.detector.api.LintUtils.stripIdPrefix;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.collect.Sets;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Detector which finds unlabeled text fields
- */
-public class LabelForDetector extends LayoutDetector {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "LabelFor", //$NON-NLS-1$
-            "Ensures that text fields are marked with a labelFor attribute",
-            "Text fields should be labelled with a `labelFor` attribute, " +
-            "provided your `minSdkVersion` is at least 17.\n" +
-            "\n" +
-            "If your view is labeled but by a label in a different layout which " +
-            "includes this one, just suppress this warning from lint.",
-            Category.A11Y,
-            2,
-            Severity.WARNING,
-            LabelForDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    private Set<String> mLabels;
-    private List<Element> mTextFields;
-
-    /** Constructs a new {@link LabelForDetector} */
-    public LabelForDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    @Nullable
-    public Collection<String> getApplicableAttributes() {
-        return Collections.singletonList(ATTR_LABEL_FOR);
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                EDIT_TEXT,
-                AUTO_COMPLETE_TEXT_VIEW,
-                MULTI_AUTO_COMPLETE_TEXT_VIEW
-        );
-    }
-
-    @Override
-    public void afterCheckFile(@NonNull Context context) {
-        if (mTextFields != null) {
-            if (mLabels == null) {
-                mLabels = Collections.emptySet();
-            }
-
-            for (Element element : mTextFields) {
-                if (element.hasAttributeNS(ANDROID_URI, ATTR_HINT)) {
-                    continue;
-                }
-                String id = element.getAttributeNS(ANDROID_URI, ATTR_ID);
-                boolean missing = true;
-                if (mLabels.contains(id)) {
-                    missing = false;
-                } else if (id.startsWith(NEW_ID_PREFIX)) {
-                    missing = !mLabels.contains(ID_PREFIX + stripIdPrefix(id));
-                } else if (id.startsWith(ID_PREFIX)) {
-                    missing = !mLabels.contains(NEW_ID_PREFIX + stripIdPrefix(id));
-                }
-
-                if (missing) {
-                    XmlContext xmlContext = (XmlContext) context;
-                    Location location = xmlContext.getLocation(element);
-                    String message;
-                    if (id == null || id.isEmpty()) {
-                        message = "No label views point to this text field with a " +
-                                "labelFor attribute";
-                    } else {
-                        message = String.format("No label views point to this text field with " +
-                                "an android:labelFor=\"@+id/%1$s\" attribute", id);
-                    }
-                    xmlContext.report(ISSUE, element, location, message, null);
-                }
-
-            }
-        }
-
-        mLabels = null;
-        mTextFields = null;
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        if (mLabels == null) {
-            mLabels = Sets.newHashSet();
-        }
-        mLabels.add(attribute.getValue());
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        // NOTE: This should NOT be checking *minSdkVersion*, but *targetSdkVersion*
-        // or even buildTarget instead. However, there's a risk that this will flag
-        // way too much and make the rule annoying until API 17 support becomes
-        // more widespread, so for now limit the check to those projects *really*
-        // working with 17.  When API 17 reaches a certain amount of adoption, change
-        // this to flag all apps supporting 17, including those supporting earlier
-        // versions as well.
-        if (context.getMainProject().getMinSdk() < 17) {
-            return;
-        }
-
-        if (mTextFields == null) {
-            mTextFields = new ArrayList<Element>();
-        }
-        mTextFields.add(element);
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/LocaleDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/LocaleDetector.java
deleted file mode 100644
index 3bde211..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/LocaleDetector.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.CONSTRUCTOR_NAME;
-import static com.android.SdkConstants.FORMAT_METHOD;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.InsnList;
-import org.objectweb.asm.tree.LdcInsnNode;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.objectweb.asm.tree.analysis.Analyzer;
-import org.objectweb.asm.tree.analysis.AnalyzerException;
-import org.objectweb.asm.tree.analysis.Frame;
-import org.objectweb.asm.tree.analysis.SourceInterpreter;
-import org.objectweb.asm.tree.analysis.SourceValue;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-
-/**
- * Checks for errors related to locale handling
- */
-public class LocaleDetector extends Detector implements ClassScanner {
-    /** Calling risky convenience methods */
-    public static final Issue STRING_LOCALE = Issue.create(
-            "DefaultLocale", //$NON-NLS-1$
-            "Finds calls to locale-ambiguous String manipulation methods",
-
-            "Calling `String#toLowerCase()` or `#toUpperCase()` *without specifying an " +
-            "explicit locale* is a common source of bugs. The reason for that is that those " +
-            "methods will use the current locale on the user's device, and even though the " +
-            "code appears to work correctly when you are developing the app, it will fail " +
-            "in some locales. For example, in the Turkish locale, the uppercase replacement " +
-            "for `i` is *not* `I`.\n" +
-            "\n" +
-            "If you want the methods to just perform ASCII replacement, for example to convert " +
-            "an enum name, call `String#toUpperCase(Locale.US)` instead. If you really want to " +
-            "use the current locale, call `String#toUpperCase(Locale.getDefault())` instead.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.WARNING,
-            LocaleDetector.class,
-            EnumSet.of(Scope.ALL_RESOURCE_FILES, Scope.CLASS_FILE)).setMoreInfo(
-             "http://developer.android.com/reference/java/util/Locale.html#default_locale"); //$NON-NLS-1$
-
-    /** Constructing SimpleDateFormat without an explicit locale */
-    public static final Issue DATE_FORMAT = Issue.create(
-            "SimpleDateFormat", //$NON-NLS-1$
-            "Using SimpleDateFormat directly without an explicit locale",
-
-            "Almost all callers should use `getDateInstance()`, `getDateTimeInstance()`, or " +
-            "`getTimeInstance()` to get a ready-made instance of SimpleDateFormat suitable " +
-            "for the user's locale. The main reason you'd create an instance this class " +
-            "directly is because you need to format/parse a specific machine-readable format, " +
-            "in which case you almost certainly want to explicitly ask for US to ensure that " +
-            "you get ASCII digits (rather than, say, Arabic digits).\n" +
-            "\n" +
-            "Therefore, you should either use the form of the SimpleDateFormat constructor " +
-            "where you pass in an explicit locale, such as Locale.US, or use one of the " +
-            "get instance methods, or suppress this error if really know what you are doing.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.WARNING,
-            LocaleDetector.class,
-            Scope.CLASS_FILE_SCOPE).setMoreInfo(
-             "http://developer.android.com/reference/java/text/SimpleDateFormat.html"); //$NON-NLS-1$
-
-    static final String DATE_FORMAT_OWNER = "java/text/SimpleDateFormat"; //$NON-NLS-1$
-    private static final String STRING_OWNER = "java/lang/String";                //$NON-NLS-1$
-
-    /** Constructs a new {@link LocaleDetector} */
-    public LocaleDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @Override
-    @Nullable
-    public List<String> getApplicableCallNames() {
-        return Arrays.asList(
-                "toLowerCase", //$NON-NLS-1$
-                "toUpperCase", //$NON-NLS-1$
-                FORMAT_METHOD
-        );
-    }
-
-    @Override
-    @Nullable
-    public List<String> getApplicableCallOwners() {
-        return Collections.singletonList(DATE_FORMAT_OWNER);
-    }
-
-    @Override
-    public void checkCall(@NonNull ClassContext context, @NonNull ClassNode classNode,
-            @NonNull MethodNode method, @NonNull MethodInsnNode call) {
-        String owner = call.owner;
-        String desc = call.desc;
-        String name = call.name;
-        if (owner.equals(DATE_FORMAT_OWNER)) {
-            if (!name.equals(CONSTRUCTOR_NAME)) {
-                return;
-            }
-            if (desc.equals("(Ljava/lang/String;Ljava/text/DateFormatSymbols;)V")   //$NON-NLS-1$
-                    || desc.equals("()V")                                           //$NON-NLS-1$
-                    || desc.equals("(Ljava/lang/String;)V")) {                      //$NON-NLS-1$
-                Location location = context.getLocation(call);
-                String message =
-                    "To get local formatting use getDateInstance(), getDateTimeInstance(), " +
-                    "or getTimeInstance(), or use new SimpleDateFormat(String template, " +
-                    "Locale locale) with for example Locale.US for ASCII dates.";
-                context.report(DATE_FORMAT, method, call, location, message, null);
-            }
-            return;
-        } else if (!owner.equals(STRING_OWNER)) {
-            return;
-        }
-
-        if (name.equals(FORMAT_METHOD)) {
-            // Only check the non-locale version of String.format
-            if (!desc.equals("(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;")) { //$NON-NLS-1$
-                return;
-            }
-            // Find the formatting string
-            Analyzer analyzer = new Analyzer(new SourceInterpreter() {
-                @Override
-                public SourceValue newOperation(AbstractInsnNode insn) {
-                    if (insn.getOpcode() == Opcodes.LDC) {
-                        Object cst = ((LdcInsnNode) insn).cst;
-                        if (cst instanceof String) {
-                            return new StringValue(1, (String) cst);
-                        }
-                    }
-                    return super.newOperation(insn);
-                }
-            });
-            try {
-                Frame[] frames = analyzer.analyze(classNode.name, method);
-                InsnList instructions = method.instructions;
-                Frame frame = frames[instructions.indexOf(call)];
-                if (frame.getStackSize() == 0) {
-                    return;
-                }
-                SourceValue stackValue = (SourceValue) frame.getStack(0);
-                if (stackValue instanceof StringValue) {
-                    String format = ((StringValue) stackValue).getString();
-                    if (format != null && StringFormatDetector.isLocaleSpecific(format)) {
-                        Location location = context.getLocation(call);
-                        String message =
-                            "Implicitly using the default locale is a common source of bugs: " +
-                            "Use String.format(Locale, ...) instead";
-                        context.report(STRING_LOCALE, method, call, location, message, null);
-                    }
-                }
-            } catch (AnalyzerException e) {
-                context.log(e, null);
-            }
-        } else {
-            if (desc.equals("()Ljava/lang/String;")) {   //$NON-NLS-1$
-                Location location = context.getLocation(call);
-                String message = String.format(
-                    "Implicitly using the default locale is a common source of bugs: " +
-                    "Use %1$s(Locale) instead", name);
-                context.report(STRING_LOCALE, method, call, location, message, null);
-            }
-        }
-    }
-
-    private static class StringValue extends SourceValue {
-        private final String mString;
-
-        StringValue(int size, String string) {
-            super(size);
-            mString = string;
-        }
-
-        String getString() {
-            return mString;
-        }
-
-        @Override
-        public int getSize() {
-            return 1;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ManifestOrderDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ManifestOrderDetector.java
deleted file mode 100644
index 83fac97..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ManifestOrderDetector.java
+++ /dev/null
@@ -1,557 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_MANIFEST_XML;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_MIN_SDK_VERSION;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_PACKAGE;
-import static com.android.SdkConstants.ATTR_TARGET_SDK_VERSION;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.TAG_ACTIVITY;
-import static com.android.SdkConstants.TAG_APPLICATION;
-import static com.android.SdkConstants.TAG_PERMISSION;
-import static com.android.SdkConstants.TAG_PROVIDER;
-import static com.android.SdkConstants.TAG_RECEIVER;
-import static com.android.SdkConstants.TAG_SERVICE;
-import static com.android.SdkConstants.TAG_USES_LIBRARY;
-import static com.android.SdkConstants.TAG_USES_PERMISSION;
-import static com.android.SdkConstants.TAG_USES_SDK;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.collect.Maps;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Checks for issues in AndroidManifest files such as declaring elements in the
- * wrong order.
- */
-public class ManifestOrderDetector extends Detector implements Detector.XmlScanner {
-
-    /** Wrong order of elements in the manifest */
-    public static final Issue ORDER = Issue.create(
-            "ManifestOrder", //$NON-NLS-1$
-            "Checks for manifest problems like <uses-sdk> after the <application> tag",
-            "The <application> tag should appear after the elements which declare " +
-            "which version you need, which features you need, which libraries you " +
-            "need, and so on. In the past there have been subtle bugs (such as " +
-            "themes not getting applied correctly) when the `<application>` tag appears " +
-            "before some of these other elements, so it's best to order your " +
-            "manifest in the logical dependency order.",
-            Category.CORRECTNESS,
-            5,
-            Severity.WARNING,
-            ManifestOrderDetector.class,
-            Scope.MANIFEST_SCOPE);
-
-    /** Missing a {@code <uses-sdk>} element */
-    public static final Issue USES_SDK = Issue.create(
-            "UsesMinSdkAttributes", //$NON-NLS-1$
-            "Checks that the minimum SDK and target SDK attributes are defined",
-
-            "The manifest should contain a `<uses-sdk>` element which defines the " +
-            "minimum API Level required for the application to run, " +
-            "as well as the target version (the highest API level you have tested " +
-            "the version for.)",
-
-            Category.CORRECTNESS,
-            9,
-            Severity.WARNING,
-            ManifestOrderDetector.class,
-            Scope.MANIFEST_SCOPE).setMoreInfo(
-            "http://developer.android.com/guide/topics/manifest/uses-sdk-element.html"); //$NON-NLS-1$
-
-    /** Using a targetSdkVersion that isn't recent */
-    public static final Issue TARGET_NEWER = Issue.create(
-            "OldTargetApi", //$NON-NLS-1$
-            "Checks that the manifest specifies a targetSdkVersion that is recent",
-
-            "When your application runs on a version of Android that is more recent than your " +
-            "`targetSdkVersion` specifies that it has been tested with, various compatibility " +
-            "modes kick in. This ensures that your application continues to work, but it may " +
-            "look out of place. For example, if the `targetSdkVersion` is less than 14, your " +
-            "app may get an option button in the UI.\n" +
-            "\n" +
-            "To fix this issue, set the `targetSdkVersion` to the highest available value. Then " +
-            "test your app to make sure everything works correctly. You may want to consult " +
-            "the compatibility notes to see what changes apply to each version you are adding " +
-            "support for: " +
-            "http://developer.android.com/reference/android/os/Build.VERSION_CODES.html",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.WARNING,
-            ManifestOrderDetector.class,
-            Scope.MANIFEST_SCOPE).setMoreInfo(
-            "http://developer.android.com/reference/android/os/Build.VERSION_CODES.html"); //$NON-NLS-1$
-
-    /** Using multiple {@code <uses-sdk>} elements */
-    public static final Issue MULTIPLE_USES_SDK = Issue.create(
-            "MultipleUsesSdk", //$NON-NLS-1$
-            "Checks that the <uses-sdk> element appears at most once",
-
-            "The `<uses-sdk>` element should appear just once; the tools will *not* merge the " +
-            "contents of all the elements so if you split up the attributes across multiple " +
-            "elements, only one of them will take effect. To fix this, just merge all the " +
-            "attributes from the various elements into a single <uses-sdk> element.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.FATAL,
-            ManifestOrderDetector.class,
-            Scope.MANIFEST_SCOPE).setMoreInfo(
-            "http://developer.android.com/guide/topics/manifest/uses-sdk-element.html"); //$NON-NLS-1$
-
-    /** Missing a {@code <uses-sdk>} element */
-    public static final Issue WRONG_PARENT = Issue.create(
-            "WrongManifestParent", //$NON-NLS-1$
-            "Checks that various manifest elements are declared in the right place",
-
-            "The `<uses-library>` element should be defined as a direct child of the " +
-            "`<application>` tag, not the `<manifest>` tag or an `<activity>` tag. Similarly, " +
-            "a `<uses-sdk>` tag much be declared at the root level, and so on. This check " +
-            "looks for incorrect declaration locations in the manifest, and complains " +
-            "if an element is found in the wrong place.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.FATAL,
-            ManifestOrderDetector.class,
-            Scope.MANIFEST_SCOPE).setMoreInfo(
-            "http://developer.android.com/guide/topics/manifest/manifest-intro.html"); //$NON-NLS-1$
-
-    /** Missing a {@code <uses-sdk>} element */
-    public static final Issue DUPLICATE_ACTIVITY = Issue.create(
-            "DuplicateActivity", //$NON-NLS-1$
-            "Checks that an activity is registered only once in the manifest",
-
-            "An activity should only be registered once in the manifest. If it is " +
-            "accidentally registered more than once, then subtle errors can occur, " +
-            "since attribute declarations from the two elements are not merged, so " +
-            "you may accidentally remove previous declarations.",
-
-            Category.CORRECTNESS,
-            5,
-            Severity.ERROR,
-            ManifestOrderDetector.class,
-            Scope.MANIFEST_SCOPE);
-
-    /** Not explicitly defining allowBackup */
-    public static final Issue ALLOW_BACKUP = Issue.create(
-            "AllowBackup", //$NON-NLS-1$
-            "Ensure that allowBackup is explicitly set in the application's manifest",
-
-            "The allowBackup attribute determines if an application's data can be backed up " +
-            "and restored. It is documented at " +
-            "http://developer.android.com/reference/android/R.attr.html#allowBackup\n" +
-            "\n" +
-            "By default, this flag is set to `true`. When this flag is set to `true`, " +
-            "application data can be backed up and restored by the user using `adb backup` " +
-            "and `adb restore`.\n" +
-            "\n" +
-            "This may have security consequences for an application. `adb backup` allows " +
-            "users who have enabled USB debugging to copy application data off of the " +
-            "device. Once backed up, all application data can be read by the user. " +
-            "`adb restore` allows creation of application data from a source specified " +
-            "by the user. Following a restore, applications should not assume that the " +
-            "data, file permissions, and directory permissions were created by the " +
-            "application itself.\n" +
-            "\n" +
-            "Setting `allowBackup=\"false\"` opts an application out of both backup and " +
-            "restore.\n" +
-            "\n" +
-            "To fix this warning, decide whether your application should support backup, " +
-            "and explicitly set `android:allowBackup=(true|false)\"`",
-
-            Category.SECURITY,
-            3,
-            Severity.WARNING,
-            ManifestOrderDetector.class,
-            Scope.MANIFEST_SCOPE).setMoreInfo(
-            "http://developer.android.com/reference/android/R.attr.html#allowBackup");
-
-    /** Conflicting permission names */
-    public static final Issue UNIQUE_PERMISSION = Issue.create(
-            "UniquePermission", //$NON-NLS-1$
-            "Checks that permission names are unique",
-
-            "The unqualified names or your permissions must be unique. The reason for this " +
-            "is that at build time, the `aapt` tool will generate a class named `Manifest` " +
-            "which contains a field for each of your permissions. These fields are named " +
-            "using your permission unqualified names (i.e. the name portion after the last " +
-            "dot).\n" +
-            "\n" +
-            "If more than one permission maps to the same field name, that field will " +
-            "arbitrarily name just one of them.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.ERROR,
-            ManifestOrderDetector.class,
-            Scope.MANIFEST_SCOPE);
-
-    /** Using a resource for attributes that do not allow it */
-    public static final Issue SET_VERSION = Issue.create(
-            "MissingVersion", //$NON-NLS-1$
-            "Checks that the application name and version are set",
-
-            "You should define the version information for your application.\n" +
-            "`android:versionCode`: An integer value that represents the version of the " +
-            "application code, relative to other versions.\n" +
-            "\n" +
-            "`android:versionName`: A string value that represents the release version of " +
-            "the application code, as it should be shown to users.",
-
-            Category.CORRECTNESS,
-            2,
-            Severity.WARNING,
-            ManifestOrderDetector.class,
-            Scope.MANIFEST_SCOPE).setMoreInfo(
-            "http://developer.android.com/tools/publishing/versioning.html#appversioning");
-
-    /** Using a resource for attributes that do not allow it */
-    public static final Issue ILLEGAL_REFERENCE = Issue.create(
-            "IllegalResourceRef", //$NON-NLS-1$
-            "Checks for resource references where only literals are allowed",
-
-            "For the `versionCode` attribute, you have to specify an actual integer " +
-            "literal; you cannot use an indirection with a `@dimen/name` resource. " +
-            "Similarly, the `versionName` attribute should be an actual string, not " +
-            "a string resource url.",
-
-            Category.CORRECTNESS,
-            8,
-            Severity.WARNING,
-            ManifestOrderDetector.class,
-            Scope.MANIFEST_SCOPE);
-
-    /** Constructs a new {@link ManifestOrderDetector} check */
-    public ManifestOrderDetector() {
-    }
-
-    private boolean mSeenApplication;
-
-    /** Number of times we've seen the <uses-sdk> element */
-    private int mSeenUsesSdk;
-
-    /** Activities we've encountered */
-    private final Set<String> mActivities = new HashSet<String>();
-
-    /** Permission basenames */
-    private Map<String, String> mPermissionNames;
-
-    /** Package declared in the manifest */
-    private String mPackage;
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return file.getName().equals(ANDROID_MANIFEST_XML);
-    }
-
-    @Override
-    public void beforeCheckFile(@NonNull Context context) {
-        mSeenApplication = false;
-        mSeenUsesSdk = 0;
-    }
-
-    @Override
-    public void afterCheckFile(@NonNull Context context) {
-        XmlContext xmlContext = (XmlContext) context;
-        Element element = xmlContext.document.getDocumentElement();
-        if (element != null) {
-            checkDocumentElement(xmlContext, element);
-        }
-
-        if (mSeenUsesSdk == 0 && context.isEnabled(USES_SDK)) {
-            context.report(USES_SDK, Location.create(context.file),
-                    "Manifest should specify a minimum API level with " +
-                    "<uses-sdk android:minSdkVersion=\"?\" />; if it really supports " +
-                    "all versions of Android set it to 1.", null);
-        }
-    }
-
-    private void checkDocumentElement(XmlContext context, Element element) {
-        Attr codeNode = element.getAttributeNodeNS(ANDROID_URI, "versionCode");//$NON-NLS-1$
-        if (codeNode != null && codeNode.getValue().startsWith(PREFIX_RESOURCE_REF)
-                && context.isEnabled(ILLEGAL_REFERENCE)) {
-            context.report(ILLEGAL_REFERENCE, element, context.getLocation(element),
-                    "The android:versionCode cannot be a resource url, it must be "
-                            + "a literal integer", null);
-        } else if (codeNode == null && context.isEnabled(SET_VERSION)) {
-            context.report(SET_VERSION, element, context.getLocation(element),
-                    "Should set android:versionCode to specify the application version", null);
-        }
-        Attr nameNode = element.getAttributeNodeNS(ANDROID_URI, "versionName");//$NON-NLS-1$
-        if (nameNode != null && nameNode.getValue().startsWith(PREFIX_RESOURCE_REF)
-                && context.isEnabled(ILLEGAL_REFERENCE)) {
-            context.report(ILLEGAL_REFERENCE, element, context.getLocation(element),
-                    "The android:versionName cannot be a resource url, it must be "
-                            + "a literal string", null);
-        } else if (nameNode == null && context.isEnabled(SET_VERSION)) {
-            context.report(SET_VERSION, element, context.getLocation(element),
-                    "Should set android:versionName to specify the application version", null);
-        }
-    }
-
-    // ---- Implements Detector.XmlScanner ----
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                TAG_APPLICATION,
-                TAG_USES_PERMISSION,
-                TAG_PERMISSION,
-                "permission-tree",         //$NON-NLS-1$
-                "permission-group",        //$NON-NLS-1$
-                TAG_USES_SDK,
-                "uses-configuration",      //$NON-NLS-1$
-                "uses-feature",            //$NON-NLS-1$
-                "supports-screens",        //$NON-NLS-1$
-                "compatible-screens",      //$NON-NLS-1$
-                "supports-gl-texture",     //$NON-NLS-1$
-                TAG_USES_LIBRARY,
-                TAG_ACTIVITY,
-                TAG_SERVICE,
-                TAG_PROVIDER,
-                TAG_RECEIVER
-        );
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        String tag = element.getTagName();
-        Node parentNode = element.getParentNode();
-
-        if (tag.equals(TAG_USES_LIBRARY) || tag.equals(TAG_ACTIVITY) || tag.equals(TAG_SERVICE)
-                || tag.equals(TAG_PROVIDER) || tag.equals(TAG_RECEIVER)) {
-            if (!TAG_APPLICATION.equals(parentNode.getNodeName())
-                    && context.isEnabled(WRONG_PARENT)) {
-                context.report(WRONG_PARENT, element, context.getLocation(element),
-                        String.format(
-                        "The <%1$s> element must be a direct child of the <application> element",
-                        tag), null);
-            }
-
-            if (tag.equals(TAG_ACTIVITY)) {
-                Attr nameNode = element.getAttributeNodeNS(ANDROID_URI, ATTR_NAME);
-                if (nameNode != null) {
-                    String name = nameNode.getValue();
-                    if (!name.isEmpty()) {
-                        if (name.charAt(0) == '.') {
-                            name = getPackage(element) + name;
-                        } else if (name.indexOf('.') == -1) {
-                            name = getPackage(element) + '.' + name;
-                        }
-                        if (mActivities.contains(name)) {
-                            String message = String.format(
-                                    "Duplicate registration for activity %1$s", name);
-                            context.report(DUPLICATE_ACTIVITY, element,
-                                    context.getLocation(nameNode), message, null);
-                        } else {
-                            mActivities.add(name);
-                        }
-                    }
-                }
-            }
-
-            return;
-        }
-
-        if (parentNode != element.getOwnerDocument().getDocumentElement()
-                && context.isEnabled(WRONG_PARENT)) {
-            context.report(WRONG_PARENT, element, context.getLocation(element),
-                    String.format(
-                    "The <%1$s> element must be a direct child of the " +
-                    "<manifest> root element", tag), null);
-        }
-
-        if (tag.equals(TAG_USES_SDK)) {
-            mSeenUsesSdk++;
-
-            if (mSeenUsesSdk == 2) { // Only warn when we encounter the first one
-                Location location = context.getLocation(element);
-
-                // Link up *all* encountered locations in the document
-                NodeList elements = element.getOwnerDocument().getElementsByTagName(TAG_USES_SDK);
-                Location secondary = null;
-                for (int i = elements.getLength() - 1; i >= 0; i--) {
-                    Element e = (Element) elements.item(i);
-                    if (e != element) {
-                        Location l = context.getLocation(e);
-                        l.setSecondary(secondary);
-                        l.setMessage("Also appears here");
-                        secondary = l;
-                    }
-                }
-                location.setSecondary(secondary);
-
-                if (context.isEnabled(MULTIPLE_USES_SDK)) {
-                    context.report(MULTIPLE_USES_SDK, element, location,
-                        "There should only be a single <uses-sdk> element in the manifest:" +
-                        " merge these together", null);
-                }
-                return;
-            }
-
-            if (!element.hasAttributeNS(ANDROID_URI, ATTR_MIN_SDK_VERSION)) {
-                if (context.isEnabled(USES_SDK)) {
-                    context.report(USES_SDK, element, context.getLocation(element),
-                        "<uses-sdk> tag should specify a minimum API level with " +
-                        "android:minSdkVersion=\"?\"", null);
-                }
-            } else {
-                Attr codeNode = element.getAttributeNodeNS(ANDROID_URI, ATTR_MIN_SDK_VERSION);
-                if (codeNode != null && codeNode.getValue().startsWith(PREFIX_RESOURCE_REF)
-                        && context.isEnabled(ILLEGAL_REFERENCE)) {
-                    context.report(ILLEGAL_REFERENCE, element, context.getLocation(element),
-                            "The android:minSdkVersion cannot be a resource url, it must be "
-                                    + "a literal integer (or string if a preview codename)", null);
-                }
-            }
-
-            if (!element.hasAttributeNS(ANDROID_URI, ATTR_TARGET_SDK_VERSION)) {
-                // Warn if not setting target SDK -- but only if the min SDK is somewhat
-                // old so there's some compatibility stuff kicking in (such as the menu
-                // button etc)
-                if (context.isEnabled(USES_SDK)) {
-                    context.report(USES_SDK, element, context.getLocation(element),
-                        "<uses-sdk> tag should specify a target API level (the " +
-                        "highest verified version; when running on later versions, " +
-                        "compatibility behaviors may be enabled) with " +
-                        "android:targetSdkVersion=\"?\"", null);
-                }
-            } else if (context.isEnabled(TARGET_NEWER)){
-                String target = element.getAttributeNS(ANDROID_URI, ATTR_TARGET_SDK_VERSION);
-                try {
-                    int api = Integer.parseInt(target);
-                    if (api < context.getClient().getHighestKnownApiLevel()) {
-                        context.report(TARGET_NEWER, element, context.getLocation(element),
-                                "Not targeting the latest versions of Android; compatibility " +
-                                "modes apply. Consider testing and updating this version. " +
-                                "Consult the android.os.Build.VERSION_CODES javadoc for details.",
-                                null);
-                    }
-                } catch (NumberFormatException nufe) {
-                    // Ignore: AAPT will enforce this.
-                }
-            }
-
-            Attr nameNode = element.getAttributeNodeNS(ANDROID_URI, ATTR_TARGET_SDK_VERSION);
-            if (nameNode != null && nameNode.getValue().startsWith(PREFIX_RESOURCE_REF)
-                    && context.isEnabled(ILLEGAL_REFERENCE)) {
-                context.report(ILLEGAL_REFERENCE, element, context.getLocation(element),
-                        "The android:targetSdkVersion cannot be a resource url, it must be "
-                                + "a literal integer (or string if a preview codename)", null);
-            }
-        }
-        if (tag.equals(TAG_PERMISSION)) {
-            Attr nameNode = element.getAttributeNodeNS(ANDROID_URI, ATTR_NAME);
-            if (nameNode != null) {
-                String name = nameNode.getValue();
-                String base = name.substring(name.lastIndexOf('.') + 1);
-                if (mPermissionNames == null) {
-                    mPermissionNames = Maps.newHashMap();
-                } else if (mPermissionNames.containsKey(base)) {
-                    String prevName = mPermissionNames.get(base);
-                    Location location = context.getLocation(nameNode);
-                    NodeList siblings = element.getParentNode().getChildNodes();
-                    for (int i = 0, n = siblings.getLength(); i < n; i++) {
-                        Node node = siblings.item(i);
-                        if (node == element) {
-                            break;
-                        } else if (node.getNodeType() == Node.ELEMENT_NODE) {
-                            Element sibling = (Element) node;
-                            String suffix = '.' + base;
-                            if (sibling.getTagName().equals(TAG_PERMISSION)) {
-                                String b = element.getAttributeNS(ANDROID_URI, ATTR_NAME);
-                                if (b.endsWith(suffix)) {
-                                    Location prevLocation = context.getLocation(node);
-                                    prevLocation.setMessage("Previous permission here");
-                                    location.setSecondary(prevLocation);
-                                    break;
-                                }
-
-                            }
-                        }
-                    }
-
-                    String message = String.format("Permission name %1$s is not unique " +
-                            "(appears in both %2$s and %3$s)", base, prevName, name);
-                    context.report(UNIQUE_PERMISSION, element, location, message, null);
-                }
-
-                mPermissionNames.put(base, name);
-            }
-        }
-
-        if (tag.equals(TAG_APPLICATION)) {
-            mSeenApplication = true;
-            if (!element.hasAttributeNS(ANDROID_URI, SdkConstants.ATTR_ALLOW_BACKUP)
-                    && context.isEnabled(ALLOW_BACKUP)
-                    && context.getMainProject().getMinSdk() >= 4) {
-                context.report(ALLOW_BACKUP, element, context.getLocation(element),
-                            "Should explicitly set android:allowBackup to true or " +
-                            "false (it's true by default, and that can have some security " +
-                            "implications for the application's data)", null);
-            }
-        } else if (mSeenApplication) {
-            if (context.isEnabled(ORDER)) {
-                context.report(ORDER, element, context.getLocation(element),
-                    String.format("<%1$s> tag appears after <application> tag", tag), null);
-            }
-
-            // Don't complain for *every* element following the <application> tag
-            mSeenApplication = false;
-        }
-    }
-
-    private String getPackage(Element element) {
-        if (mPackage == null) {
-            mPackage = element.getOwnerDocument().getDocumentElement().getAttribute(ATTR_PACKAGE);
-        }
-
-        return mPackage;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/MathDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/MathDetector.java
deleted file mode 100644
index 8709852..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/MathDetector.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Looks for usages of {@link java.lang.Math} methods which can be replaced with
- * {@code android.util.FloatMath} methods to avoid casting.
- */
-public class MathDetector extends Detector implements Detector.ClassScanner {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "FloatMath", //$NON-NLS-1$
-            "Suggests replacing android.util.FloatMath calls with java.lang.Math",
-
-            "In older versions of Android, using android.util.FloatMath was recommended " +
-            "for performance reasons when operating on floats. However, on modern hardware " +
-            "doubles are just as fast as float (though they take more memory), and in " +
-            "recent versions of Android, FloatMath is actually slower than using java.lang.Math " +
-            "due to the way the JIT optimizes java.lang.Math. Therefore, you should use " +
-            "Math instead of FloatMath if you are only targeting Froyo and above.",
-
-            Category.PERFORMANCE,
-            3,
-            Severity.WARNING,
-            MathDetector.class,
-            Scope.CLASS_FILE_SCOPE).setMoreInfo(
-               "http://developer.android.com/guide/practices/design/performance.html#avoidfloat"); //$NON-NLS-1$
-
-    /** Constructs a new {@link MathDetector} check */
-    public MathDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @Override
-    @Nullable
-    public List<String> getApplicableCallNames() {
-        return Arrays.asList(
-                "sin",   //$NON-NLS-1$
-                "cos",   //$NON-NLS-1$
-                "ceil",  //$NON-NLS-1$
-                "sqrt",  //$NON-NLS-1$
-                "floor"  //$NON-NLS-1$
-        );
-    }
-
-    @Override
-    public void checkCall(@NonNull ClassContext context, @NonNull ClassNode classNode,
-            @NonNull MethodNode method, @NonNull MethodInsnNode call) {
-        String owner = call.owner;
-
-        if (owner.equals("android/util/FloatMath")  //$NON-NLS-1$
-                && context.getProject().getMinSdk() >= 8) {
-            String message = String.format(
-                    "Use java.lang.Math#%1$s instead of android.util.FloatMath#%1$s() " +
-                    "since it is faster as of API 8", call.name);
-            context.report(ISSUE, method, call, context.getLocation(call), message, null /*data*/);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/MergeRootFrameLayoutDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/MergeRootFrameLayoutDetector.java
deleted file mode 100644
index 1b76c03..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/MergeRootFrameLayoutDetector.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_BACKGROUND;
-import static com.android.SdkConstants.ATTR_FOREGROUND;
-import static com.android.SdkConstants.ATTR_LAYOUT;
-import static com.android.SdkConstants.ATTR_LAYOUT_GRAVITY;
-import static com.android.SdkConstants.DOT_JAVA;
-import static com.android.SdkConstants.FRAME_LAYOUT;
-import static com.android.SdkConstants.LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.R_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Location.Handle;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.android.utils.Pair;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.Expression;
-import lombok.ast.MethodInvocation;
-import lombok.ast.Select;
-import lombok.ast.StrictListAccessor;
-
-/**
- * Checks whether a root FrameLayout can be replaced with a {@code <merge>} tag.
- */
-public class MergeRootFrameLayoutDetector extends LayoutDetector implements Detector.JavaScanner {
-    /**
-     * Set of layouts that we want to enable the warning for. We only warn for
-     * {@code <FrameLayout>}'s that are the root of a layout included from
-     * another layout, or directly referenced via a {@code setContentView} call.
-     */
-    private Set<String> mWhitelistedLayouts;
-
-    /**
-     * Set of pending [layout, location] pairs where the given layout is a
-     * FrameLayout that perhaps should be replaced by a {@code <merge>} tag (if
-     * the layout is included or set as the content view. This must be processed
-     * after the whole project has been scanned since the set of includes etc
-     * can be encountered after the included layout.
-     */
-    private List<Pair<String, Location.Handle>> mPending;
-
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "MergeRootFrame", //$NON-NLS-1$
-            "Checks whether a root <FrameLayout> can be replaced with a <merge> tag",
-            "If a `<FrameLayout>` is the root of a layout and does not provide background " +
-            "or padding etc, it can often be replaced with a `<merge>` tag which is slightly " +
-            "more efficient. Note that this depends on context, so make sure you understand " +
-            "how the `<merge>` tag works before proceeding.",
-            Category.PERFORMANCE,
-            4,
-            Severity.WARNING,
-            MergeRootFrameLayoutDetector.class,
-            EnumSet.of(Scope.ALL_RESOURCE_FILES, Scope.JAVA_FILE)).setMoreInfo(
-            "http://android-developers.blogspot.com/2009/03/android-layout-tricks-3-optimize-by.html"); //$NON-NLS-1$
-
-    /** Constructs a new {@link MergeRootFrameLayoutDetector} */
-    public MergeRootFrameLayoutDetector() {
-    }
-
-    @Override
-    @NonNull
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return LintUtils.isXmlFile(file) || LintUtils.endsWith(file.getName(), DOT_JAVA);
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (mPending != null && mWhitelistedLayouts != null) {
-            // Process all the root FrameLayouts that are eligible, and generate
-            // suggestions for <merge> replacements for any layouts that are included
-            // from other layouts
-            for (Pair<String, Handle> pair : mPending) {
-                String layout = pair.getFirst();
-                if (mWhitelistedLayouts.contains(layout)) {
-                    Handle handle = pair.getSecond();
-
-                    Object clientData = handle.getClientData();
-                    if (clientData instanceof Node) {
-                        if (context.getDriver().isSuppressed(ISSUE, (Node) clientData)) {
-                            return;
-                        }
-                    }
-
-                    Location location = handle.resolve();
-                    context.report(ISSUE, location,
-                            "This <FrameLayout> can be replaced with a <merge> tag", null);
-                }
-            }
-        }
-    }
-
-    // Implements XmlScanner
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(VIEW_INCLUDE, FRAME_LAYOUT);
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        String tag = element.getTagName();
-        if (tag.equals(VIEW_INCLUDE)) {
-            String layout = element.getAttribute(ATTR_LAYOUT); // NOTE: Not in android: namespace
-            if (layout.startsWith(LAYOUT_RESOURCE_PREFIX)) { // Ignore @android:layout/ layouts
-                layout = layout.substring(LAYOUT_RESOURCE_PREFIX.length());
-                whiteListLayout(layout);
-            }
-        } else {
-            assert tag.equals(FRAME_LAYOUT);
-            if (LintUtils.isRootElement(element) &&
-                ((isWidthFillParent(element) && isHeightFillParent(element)) ||
-                        !element.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_GRAVITY))
-                    && !element.hasAttributeNS(ANDROID_URI, ATTR_BACKGROUND)
-                    && !element.hasAttributeNS(ANDROID_URI, ATTR_FOREGROUND)
-                    && !hasPadding(element)) {
-                String layout = LintUtils.getLayoutName(context.file);
-                Handle handle = context.parser.createLocationHandle(context, element);
-                handle.setClientData(element);
-
-                if (!context.getProject().getReportIssues()) {
-                    // If this is a library project not being analyzed, ignore it
-                    return;
-                }
-
-                if (mPending == null) {
-                    mPending = new ArrayList<Pair<String,Handle>>();
-                }
-                mPending.add(Pair.of(layout, handle));
-            }
-        }
-    }
-
-    private void whiteListLayout(String layout) {
-        if (mWhitelistedLayouts == null) {
-            mWhitelistedLayouts = new HashSet<String>();
-        }
-        mWhitelistedLayouts.add(layout);
-    }
-
-    // Implements JavaScanner
-
-    @Override
-    public List<String> getApplicableMethodNames() {
-        return Collections.singletonList("setContentView"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void visitMethod(
-            @NonNull JavaContext context,
-            @Nullable AstVisitor visitor,
-            @NonNull MethodInvocation node) {
-        StrictListAccessor<Expression, MethodInvocation> argumentList = node.astArguments();
-        if (argumentList != null && argumentList.size() == 1) {
-            Expression argument = argumentList.first();
-            if (argument instanceof Select) {
-                String expression = argument.toString();
-                if (expression.startsWith(R_LAYOUT_RESOURCE_PREFIX)) {
-                    whiteListLayout(expression.substring(R_LAYOUT_RESOURCE_PREFIX.length()));
-                }
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/MissingClassDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/MissingClassDetector.java
deleted file mode 100644
index 8002c40..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/MissingClassDetector.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_PKG_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_PACKAGE;
-import static com.android.SdkConstants.CONSTRUCTOR_NAME;
-import static com.android.SdkConstants.TAG_ACTIVITY;
-import static com.android.SdkConstants.TAG_APPLICATION;
-import static com.android.SdkConstants.TAG_PROVIDER;
-import static com.android.SdkConstants.TAG_RECEIVER;
-import static com.android.SdkConstants.TAG_SERVICE;
-import static com.android.SdkConstants.TAG_STRING;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Location.Handle;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.android.utils.SdkUtils;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Checks to ensure that classes referenced in the manifest actually exist and are included
- *
- */
-public class MissingClassDetector extends LayoutDetector implements ClassScanner {
-    /** Manifest-referenced classes missing from the project or libraries */
-    public static final Issue MISSING = Issue.create(
-        "MissingRegistered", //$NON-NLS-1$
-        "Ensures that classes referenced in the manifest are present in the project or libraries",
-
-        "If a class is referenced in the manifest, it must also exist in the project (or in one " +
-        "of the libraries included by the project. This check helps uncover typos in " +
-        "registration names, or attempts to rename or move classes without updating the " +
-        "manifest file properly.",
-
-        Category.CORRECTNESS,
-        8,
-        Severity.ERROR,
-        MissingClassDetector.class,
-        EnumSet.of(Scope.MANIFEST, Scope.CLASS_FILE, Scope.JAVA_LIBRARIES, Scope.RESOURCE_FILE))
-        .setMoreInfo("http://developer.android.com/guide/topics/manifest/manifest-intro.html"); //$NON-NLS-1$
-
-    /** Are activity, service, receiver etc subclasses instantiatable? */
-    public static final Issue INSTANTIATABLE = Issue.create(
-        "Instantiatable", //$NON-NLS-1$
-        "Ensures that classes registered in the manifest file are instantiatable",
-
-        "Activities, services, broadcast receivers etc. registered in the manifest file " +
-        "must be \"instantiatable\" by the system, which means that the class must be " +
-        "public, it must have an empty public constructor, and if it's an inner class, " +
-        "it must be a static inner class.",
-
-        Category.CORRECTNESS,
-        6,
-        Severity.WARNING,
-        MissingClassDetector.class,
-        Scope.CLASS_FILE_SCOPE);
-
-    /** Is the right character used for inner class separators? */
-    public static final Issue INNERCLASS = Issue.create(
-        "InnerclassSeparator", //$NON-NLS-1$
-        "Ensures that inner classes are referenced using '$' instead of '.' in class names",
-
-        "When you reference an inner class in a manifest file, you must use '$' instead of '.' " +
-        "as the separator character, i.e. Outer$Inner instead of Outer.Inner.\n" +
-        "\n" +
-        "(If you get this warning for a class which is not actually an inner class, it's " +
-        "because you are using uppercase characters in your package name, which is not " +
-        "conventional.)",
-
-        Category.CORRECTNESS,
-        3,
-        Severity.WARNING,
-        MissingClassDetector.class,
-        Scope.MANIFEST_SCOPE);
-
-    private Map<String, Location.Handle> mReferencedClasses;
-    private Set<String> mCustomViews;
-    private boolean mHaveClasses;
-
-    /** Constructs a new {@link MissingClassDetector} */
-    public MissingClassDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements XmlScanner ----
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return ALL;
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.VALUES || folderType == ResourceFolderType.LAYOUT;
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        String pkg = null;
-        Node classNameNode;
-        String className;
-        String tag = element.getTagName();
-        ResourceFolderType folderType = context.getResourceFolderType();
-        if (folderType == ResourceFolderType.VALUES) {
-            if (!tag.equals(TAG_STRING)) {
-                return;
-            }
-            Attr attr = element.getAttributeNode(ATTR_NAME);
-            if (attr == null) {
-                return;
-            }
-            className = attr.getValue();
-            classNameNode = attr;
-        } else if (folderType == ResourceFolderType.LAYOUT) {
-            if (tag.indexOf('.') > 0) {
-                className = tag;
-                classNameNode = element;
-            } else if (tag.equals(VIEW_FRAGMENT) || tag.equals(VIEW_TAG)) {
-                Attr attr = element.getAttributeNodeNS(ANDROID_URI, ATTR_NAME);
-                if (attr == null) {
-                    attr = element.getAttributeNode(ATTR_CLASS);
-                }
-                if (attr == null) {
-                    return;
-                }
-                className = attr.getValue();
-                classNameNode = attr;
-            } else {
-                return;
-            }
-        } else {
-            // Manifest file
-            if (TAG_APPLICATION.equals(tag)
-                    || TAG_ACTIVITY.equals(tag)
-                    || TAG_SERVICE.equals(tag)
-                    || TAG_RECEIVER.equals(tag)
-                    || TAG_PROVIDER.equals(tag)) {
-                Element root = element.getOwnerDocument().getDocumentElement();
-                pkg = root.getAttribute(ATTR_PACKAGE);
-                Attr attr = element.getAttributeNodeNS(ANDROID_URI, ATTR_NAME);
-                if (attr == null) {
-                    return;
-                }
-                className = attr.getValue();
-                classNameNode = attr;
-            } else {
-                return;
-            }
-        }
-        if (className.isEmpty()) {
-            return;
-        }
-
-        String fqcn;
-        int dotIndex = className.indexOf('.');
-        if (dotIndex <= 0) {
-            if (pkg == null) {
-                return; // value file
-            }
-            if (dotIndex == 0) {
-                fqcn = pkg + className;
-            } else {
-                // According to the <activity> manifest element documentation, this is not
-                // valid ( http://developer.android.com/guide/topics/manifest/activity-element.html )
-                // but it appears in manifest files and appears to be supported by the runtime
-                // so handle this in code as well:
-                fqcn = pkg + '.' + className;
-            }
-        } else { // else: the class name is already a fully qualified class name
-            fqcn = className;
-            // Only look for fully qualified tracker names in analytics files
-            if (folderType == ResourceFolderType.VALUES
-                    && !SdkUtils.endsWith(context.file.getPath(), "analytics.xml")) { //$NON-NLS-1$
-                return;
-            }
-        }
-
-        String signature = ClassContext.getInternalName(fqcn);
-        if (signature.isEmpty() || signature.startsWith(ANDROID_PKG_PREFIX)) {
-            return;
-        }
-
-        if (!context.getProject().getReportIssues()) {
-            // If this is a library project not being analyzed, ignore it
-            return;
-        }
-
-        Handle handle = null;
-        if (!context.getDriver().isSuppressed(MISSING, element)) {
-            if (mReferencedClasses == null) {
-                mReferencedClasses = Maps.newHashMapWithExpectedSize(16);
-                mCustomViews = Sets.newHashSetWithExpectedSize(8);
-            }
-
-            handle = context.parser.createLocationHandle(context, element);
-            mReferencedClasses.put(signature, handle);
-            if (folderType == ResourceFolderType.LAYOUT && !tag.equals(VIEW_FRAGMENT)) {
-                mCustomViews.add(ClassContext.getInternalName(className));
-            }
-        }
-
-        if (signature.indexOf('$') != -1 && pkg != null) {
-            if (className.indexOf('$') == -1 && className.indexOf('.', 1) > 0) {
-                boolean haveUpperCase = false;
-                for (int i = 0, n = pkg.length(); i < n; i++) {
-                    if (Character.isUpperCase(pkg.charAt(i))) {
-                        haveUpperCase = true;
-                        break;
-                    }
-                }
-                if (!haveUpperCase) {
-                    String message = "Use '$' instead of '.' for inner classes " +
-                            "(or use only lowercase letters in package names)";
-                    Location location = context.getLocation(classNameNode);
-                    context.report(INNERCLASS, element, location, message, null);
-                }
-            }
-
-            // The internal name contains a $ which means it's an inner class.
-            // The conversion from fqcn to internal name is a bit ambiguous:
-            // "a.b.C.D" usually means "inner class D in class C in package a.b".
-            // However, it can (see issue 31592) also mean class D in package "a.b.C".
-            // To make sure we don't falsely complain that foo/Bar$Baz doesn't exist,
-            // in case the user has actually created a package named foo/Bar and a proper
-            // class named Baz, we register *both* into the reference map.
-            // When generating errors we'll look for these an rip them back out if
-            // it looks like one of the two variations have been seen.
-            if (handle != null) {
-                signature = signature.replace('$', '/');
-                mReferencedClasses.put(signature, handle);
-            }
-        }
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (!context.getProject().isLibrary() && mHaveClasses
-                && mReferencedClasses != null && !mReferencedClasses.isEmpty()
-                && context.getDriver().getScope().contains(Scope.CLASS_FILE)) {
-            List<String> classes = new ArrayList<String>(mReferencedClasses.keySet());
-            Collections.sort(classes);
-            for (String owner : classes) {
-                Location.Handle handle = mReferencedClasses.get(owner);
-                String fqcn = ClassContext.getFqcn(owner);
-
-                String signature = ClassContext.getInternalName(fqcn);
-                if (!signature.equals(owner)) {
-                    if (!mReferencedClasses.containsKey(signature)) {
-                        continue;
-                    }
-                } else {
-                    signature = signature.replace('$', '/');
-                    if (!mReferencedClasses.containsKey(signature)) {
-                        continue;
-                    }
-                }
-                mReferencedClasses.remove(owner);
-
-                // Ignore usages of platform libraries
-                if (owner.startsWith("android/")) { //$NON-NLS-1$
-                    continue;
-                }
-
-                String message = String.format(
-                        "Class referenced in the manifest, %1$s, was not found in the " +
-                                "project or the libraries", fqcn);
-                Location location = handle.resolve();
-                File parentFile = location.getFile().getParentFile();
-                if (parentFile != null) {
-                    String parent = parentFile.getName();
-                    ResourceFolderType type = ResourceFolderType.getFolderType(parent);
-                    if (type == ResourceFolderType.LAYOUT) {
-                        message = String.format(
-                            "Class referenced in the layout file, %1$s, was not found in "
-                                + "the project or the libraries", fqcn);
-                    } else if (type == ResourceFolderType.VALUES) {
-                        message = String.format(
-                                "Class referenced in the analytics file, %1$s, was not "
-                                        + "found in the project or the libraries", fqcn);
-                    }
-                }
-
-                context.report(MISSING, location, message, null);
-            }
-        }
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @Override
-    public void checkClass(@NonNull ClassContext context, @NonNull ClassNode classNode) {
-        if (!mHaveClasses && !context.isFromClassLibrary()
-                && context.getProject() == context.getMainProject()) {
-            mHaveClasses = true;
-        }
-        String curr = classNode.name;
-        if (mReferencedClasses != null && mReferencedClasses.containsKey(curr)) {
-            boolean isCustomView = mCustomViews.contains(curr);
-            mReferencedClasses.remove(curr);
-
-            // Ensure that the class is public, non static and has a null constructor!
-
-            if ((classNode.access & Opcodes.ACC_PUBLIC) == 0) {
-                context.report(INSTANTIATABLE, context.getLocation(classNode), String.format(
-                        "This class should be public (%1$s)",
-                            ClassContext.createSignature(classNode.name, null, null)),
-                        null);
-                return;
-            }
-
-            if (classNode.name.indexOf('$') != -1 && !LintUtils.isStaticInnerClass(classNode)) {
-                context.report(INSTANTIATABLE, context.getLocation(classNode), String.format(
-                        "This inner class should be static (%1$s)",
-                            ClassContext.createSignature(classNode.name, null, null)),
-                        null);
-                return;
-            }
-
-            boolean hasDefaultConstructor = false;
-            @SuppressWarnings("rawtypes") // ASM API
-            List methodList = classNode.methods;
-            for (Object m : methodList) {
-                MethodNode method = (MethodNode) m;
-                if (method.name.equals(CONSTRUCTOR_NAME)) {
-                    if (method.desc.equals("()V")) { //$NON-NLS-1$
-                        // The constructor must be public
-                        if ((method.access & Opcodes.ACC_PUBLIC) != 0) {
-                            hasDefaultConstructor = true;
-                        } else {
-                            context.report(INSTANTIATABLE, context.getLocation(method, classNode),
-                                    "The default constructor must be public",
-                                    null);
-                            // Also mark that we have a constructor so we don't complain again
-                            // below since we've already emitted a more specific error related
-                            // to the default constructor
-                            hasDefaultConstructor = true;
-                        }
-                    }
-                }
-            }
-
-            if (!hasDefaultConstructor && !isCustomView && !context.isFromClassLibrary()
-                    && context.getProject().getReportIssues()) {
-                context.report(INSTANTIATABLE, context.getLocation(classNode), String.format(
-                        "This class should provide a default constructor (a public " +
-                        "constructor with no arguments) (%1$s)",
-                            ClassContext.createSignature(classNode.name, null, null)),
-                        null);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/MissingIdDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/MissingIdDetector.java
deleted file mode 100644
index 1b79600..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/MissingIdDetector.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_TAG;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Element;
-
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Check which looks for missing id's in views where they are probably needed
- */
-public class MissingIdDetector extends LayoutDetector {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "MissingId", //$NON-NLS-1$
-            "Ensures that XML tags like <fragment> specify an id or tag attribute",
-
-            "If you do not specify an android:id or an android:tag attribute on a " +
-            "<fragment> element, then if the activity is restarted (for example for " +
-            "an orientation rotation) you may lose state. From the fragment " +
-            "documentation:\n" +
-            "\n" +
-            "\"Each fragment requires a unique identifier that the system can use " +
-            "to restore the fragment if the activity is restarted (and which you can " +
-            "use to capture the fragment to perform transactions, such as remove it). " +
-            "* Supply the android:id attribute with a unique ID.\n" +
-            "* Supply the android:tag attribute with a unique string.\n" +
-            "If you provide neither of the previous two, the system uses the ID of the " +
-            "container view.",
-
-            Category.CORRECTNESS,
-            5,
-            Severity.WARNING,
-            MissingIdDetector.class,
-            Scope.RESOURCE_FILE_SCOPE)
-            .setMoreInfo("http://developer.android.com/guide/components/fragments.html"); //$NON-NLS-1$
-
-    /** Constructs a new {@link MissingIdDetector} */
-    public MissingIdDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(VIEW_FRAGMENT);
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        if (!element.hasAttributeNS(ANDROID_URI, ATTR_ID) &&
-                !element.hasAttributeNS(ANDROID_URI, ATTR_TAG)) {
-            context.report(ISSUE, element, context.getLocation(element),
-                "This <fragment> tag should specify an id or a tag to preserve state " +
-                "across activity restarts", null);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/NamespaceDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/NamespaceDetector.java
deleted file mode 100644
index 0b6ab02..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/NamespaceDetector.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.AUTO_URI;
-import static com.android.SdkConstants.URI_PREFIX;
-import static com.android.SdkConstants.XMLNS_PREFIX;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Checks for various issues related to XML namespaces
- */
-public class NamespaceDetector extends LayoutDetector {
-    /** Typos in the namespace */
-    public static final Issue TYPO = Issue.create(
-            "NamespaceTypo", //$NON-NLS-1$
-            "Looks for misspellings in namespace declarations",
-
-            "Accidental misspellings in namespace declarations can lead to some very " +
-            "obscure error messages. This check looks for potential misspellings to " +
-            "help track these down.",
-            Category.CORRECTNESS,
-            8,
-            Severity.WARNING,
-            NamespaceDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Unused namespace declarations */
-    public static final Issue UNUSED = Issue.create(
-            "UnusedNamespace", //$NON-NLS-1$
-            "Finds unused namespaces in XML documents",
-
-            "Unused namespace declarations take up space and require processing that is not " +
-            "necessary",
-
-            Category.PERFORMANCE,
-            1,
-            Severity.WARNING,
-            NamespaceDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Using custom namespace attributes in a library project */
-    public static final Issue CUSTOMVIEW = Issue.create(
-            "LibraryCustomView", //$NON-NLS-1$
-            "Flags custom attributes in libraries, which must use the res-auto-namespace instead",
-
-            "When using a custom view with custom attributes in a library project, the layout " +
-            "must use the special namespace " + AUTO_URI + " instead of a URI which includes " +
-            "the library project's own package. This will be used to automatically adjust the " +
-            "namespace of the attributes when the library resources are merged into the " +
-            "application project.",
-            Category.CORRECTNESS,
-            6,
-            Severity.ERROR,
-            NamespaceDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Prefix relevant for custom namespaces */
-    private static final String XMLNS_ANDROID = "xmlns:android";                    //$NON-NLS-1$
-    private static final String XMLNS_A = "xmlns:a";                                //$NON-NLS-1$
-
-    private Map<String, Attr> mUnusedNamespaces;
-    private boolean mCheckUnused;
-
-  /** Constructs a new {@link NamespaceDetector} */
-    public NamespaceDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public void visitDocument(@NonNull XmlContext context, @NonNull Document document) {
-        boolean haveCustomNamespace = false;
-        Element root = document.getDocumentElement();
-        NamedNodeMap attributes = root.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Node item = attributes.item(i);
-            if (item.getNodeName().startsWith(XMLNS_PREFIX)) {
-                String value = item.getNodeValue();
-
-                if (!value.equals(ANDROID_URI)) {
-                    Attr attribute = (Attr) item;
-
-                    if (value.startsWith(URI_PREFIX)) {
-                        haveCustomNamespace = true;
-                        if (mUnusedNamespaces == null) {
-                            mUnusedNamespaces = new HashMap<String, Attr>();
-                        }
-                        mUnusedNamespaces.put(item.getNodeName().substring(XMLNS_PREFIX.length()),
-                                attribute);
-                    } else if (!value.startsWith("http://")) { //$NON-NLS-1$
-                        context.report(TYPO, attribute, context.getLocation(attribute),
-                                "Suspicious namespace: should start with http://", null);
-
-                        continue;
-                    }
-
-                    String name = attribute.getName();
-                    if (!name.equals(XMLNS_ANDROID) && !name.equals(XMLNS_A)) {
-                        // See if it looks like a typo
-                        int resIndex = value.indexOf("/res/"); //$NON-NLS-1$
-                        if (resIndex != -1 && value.length() + 5 > URI_PREFIX.length()) {
-                            String urlPrefix = value.substring(0, resIndex + 5);
-                            if (!urlPrefix.equals(URI_PREFIX) &&
-                                    LintUtils.editDistance(URI_PREFIX, urlPrefix) <= 3) {
-                                String correctUri = URI_PREFIX + value.substring(resIndex + 5);
-                                context.report(TYPO, attribute, context.getLocation(attribute),
-                                        String.format(
-                                            "Possible typo in URL: was \"%1$s\", should " +
-                                            "probably be \"%2$s\"",
-                                            value, correctUri),
-                                            null);
-                            }
-                        }
-                        continue;
-                    }
-
-                    if (!context.isEnabled(TYPO)) {
-                        continue;
-                    }
-
-                    if (name.equals(XMLNS_A)) {
-                        // For the "android" prefix we always assume that the namespace prefix
-                        // should be our expected prefix, but for the "a" prefix we make sure
-                        // that it's at least "close"; if you're bound it to something completely
-                        // different, don't complain.
-                        if (LintUtils.editDistance(ANDROID_URI, value) > 4) {
-                            continue;
-                        }
-                    }
-
-                    if (value.equalsIgnoreCase(ANDROID_URI)) {
-                        context.report(TYPO, attribute, context.getLocation(attribute),
-                                String.format(
-                                    "URI is case sensitive: was \"%1$s\", expected \"%2$s\"",
-                                    value, ANDROID_URI), null);
-                    } else {
-                        context.report(TYPO, attribute, context.getLocation(attribute),
-                                String.format(
-                                    "Unexpected namespace URI bound to the \"android\" " +
-                                    "prefix, was %1$s, expected %2$s", value, ANDROID_URI),
-                                null);
-                    }
-                }
-            }
-        }
-
-        if (haveCustomNamespace) {
-          boolean checkCustomAttrs = context.isEnabled(CUSTOMVIEW) && context.getProject().isLibrary();
-            mCheckUnused = context.isEnabled(UNUSED);
-
-            if (checkCustomAttrs) {
-                checkCustomNamespace(context, root);
-            }
-            checkElement(context, root);
-
-            if (mCheckUnused && !mUnusedNamespaces.isEmpty()) {
-                for (Map.Entry<String, Attr> entry : mUnusedNamespaces.entrySet()) {
-                    String prefix = entry.getKey();
-                    Attr attribute = entry.getValue();
-                    context.report(UNUSED, attribute, context.getLocation(attribute),
-                            String.format("Unused namespace %1$s", prefix), null);
-                }
-            }
-        }
-    }
-
-    private static void checkCustomNamespace(XmlContext context, Element element) {
-        NamedNodeMap attributes = element.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Attr attribute = (Attr) attributes.item(i);
-            if (attribute.getName().startsWith(XMLNS_PREFIX)) {
-                String uri = attribute.getValue();
-                if (uri != null && !uri.isEmpty() && uri.startsWith(URI_PREFIX)
-                        && !uri.equals(ANDROID_URI)) {
-                    context.report(CUSTOMVIEW, attribute, context.getLocation(attribute),
-                        "When using a custom namespace attribute in a library project, " +
-                        "use the namespace \"" + AUTO_URI + "\" instead.", null);
-                }
-            }
-        }
-    }
-
-    private void checkElement(XmlContext context, Node node) {
-        if (node.getNodeType() == Node.ELEMENT_NODE) {
-            if (mCheckUnused) {
-                NamedNodeMap attributes = node.getAttributes();
-                for (int i = 0, n = attributes.getLength(); i < n; i++) {
-                    Attr attribute = (Attr) attributes.item(i);
-                    String prefix = attribute.getPrefix();
-                    if (prefix != null) {
-                        mUnusedNamespaces.remove(prefix);
-                    }
-                }
-            }
-
-            NodeList childNodes = node.getChildNodes();
-            for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-                checkElement(context, childNodes.item(i));
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/NestedScrollingWidgetDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/NestedScrollingWidgetDetector.java
deleted file mode 100644
index 4650a8f..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/NestedScrollingWidgetDetector.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.GALLERY;
-import static com.android.SdkConstants.GRID_VIEW;
-import static com.android.SdkConstants.HORIZONTAL_SCROLL_VIEW;
-import static com.android.SdkConstants.LIST_VIEW;
-import static com.android.SdkConstants.SCROLL_VIEW;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-/**
- * Checks whether a root FrameLayout can be replaced with a {@code <merge>} tag.
- */
-public class NestedScrollingWidgetDetector extends LayoutDetector {
-    private int mVisitingHorizontalScroll;
-    private int mVisitingVerticalScroll;
-
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "NestedScrolling", //$NON-NLS-1$
-            "Checks whether a scrolling widget has any nested scrolling widgets within",
-            // TODO: Better description!
-            "A scrolling widget such as a `ScrollView` should not contain any nested " +
-            "scrolling widgets since this has various usability issues",
-            Category.CORRECTNESS,
-            7,
-            Severity.WARNING,
-            NestedScrollingWidgetDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new {@link NestedScrollingWidgetDetector} */
-    public NestedScrollingWidgetDetector() {
-    }
-
-    @Override
-    public void beforeCheckFile(@NonNull Context context) {
-        mVisitingHorizontalScroll = 0;
-        mVisitingVerticalScroll = 0;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                SCROLL_VIEW,
-                LIST_VIEW,
-                GRID_VIEW,
-                // Horizontal
-                GALLERY,
-                HORIZONTAL_SCROLL_VIEW
-        );
-    }
-
-    private Element findOuterScrollingWidget(Node node, boolean vertical) {
-        Collection<String> applicableElements = getApplicableElements();
-        while (node != null) {
-            if (node instanceof Element) {
-                Element element = (Element) node;
-                String tagName = element.getTagName();
-                if (applicableElements.contains(tagName)
-                        && vertical == isVerticalScroll(element)) {
-                    return element;
-                }
-            }
-
-            node = node.getParentNode();
-        }
-
-        return null;
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        boolean vertical = isVerticalScroll(element);
-        if (vertical) {
-            mVisitingVerticalScroll++;
-        } else {
-            mVisitingHorizontalScroll++;
-        }
-
-        if (mVisitingHorizontalScroll > 1 || mVisitingVerticalScroll > 1) {
-            Element parent = findOuterScrollingWidget(element.getParentNode(), vertical);
-            if (parent != null) {
-                String format;
-                if (mVisitingVerticalScroll > 1) {
-                    format = "The vertically scrolling %1$s should not contain another " +
-                            "vertically scrolling widget (%2$s)";
-                } else {
-                    format = "The horizontally scrolling %1$s should not contain another " +
-                            "horizontally scrolling widget (%2$s)";
-                }
-                String msg = String.format(format, parent.getTagName(), element.getTagName());
-                context.report(ISSUE, element, context.getLocation(element), msg, null);
-            }
-        }
-    }
-
-    @Override
-    public void visitElementAfter(@NonNull XmlContext context, @NonNull Element element) {
-        if (isVerticalScroll(element)) {
-            mVisitingVerticalScroll--;
-            assert mVisitingVerticalScroll >= 0;
-        } else {
-            mVisitingHorizontalScroll--;
-            assert mVisitingHorizontalScroll >= 0;
-        }
-    }
-
-    private static boolean isVerticalScroll(Element element) {
-        String view = element.getTagName();
-        if (view.equals(GALLERY) || view.equals(HORIZONTAL_SCROLL_VIEW)) {
-            return false;
-        } else {
-            // This method should only be called with one of the 5 widget types
-            // listed in getApplicableElements
-            assert view.equals(SCROLL_VIEW) || view.equals(LIST_VIEW) || view.equals(GRID_VIEW);
-            return true;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/NonInternationalizedSmsDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/NonInternationalizedSmsDetector.java
deleted file mode 100644
index 3ee7e82..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/NonInternationalizedSmsDetector.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.Expression;
-import lombok.ast.MethodInvocation;
-import lombok.ast.StrictListAccessor;
-import lombok.ast.StringLiteral;
-
-/** Detector looking for text messages sent to an unlocalized phone number. */
-public class NonInternationalizedSmsDetector extends Detector implements Detector.JavaScanner {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "UnlocalizedSms", //$NON-NLS-1$
-            "Looks for code sending text messages to unlocalized phone numbers",
-
-            "SMS destination numbers must start with a country code or the application code " +
-            "must ensure that the SMS is only sent when the user is in the same country as " +
-            "the receiver.",
-
-            Category.CORRECTNESS,
-            5,
-            Severity.WARNING,
-            NonInternationalizedSmsDetector.class,
-            Scope.JAVA_FILE_SCOPE);
-
-
-    /** Constructs a new {@link NonInternationalizedSmsDetector} check */
-    public NonInternationalizedSmsDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return true;
-    }
-
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    public List<String> getApplicableMethodNames() {
-      List<String> methodNames = new ArrayList<String>(2);
-      methodNames.add("sendTextMessage");  //$NON-NLS-1$
-      methodNames.add("sendMultipartTextMessage");  //$NON-NLS-1$
-      return methodNames;
-    }
-
-    @Override
-    public void visitMethod(@NonNull JavaContext context, @Nullable AstVisitor visitor,
-            @NonNull MethodInvocation node) {
-        assert node.astName().astValue().equals("sendTextMessage") ||  //$NON-NLS-1$
-            node.astName().astValue().equals("sendMultipartTextMessage");  //$NON-NLS-1$
-        if (node.astOperand() == null) {
-            // "sendTextMessage"/"sendMultipartTextMessage" in the code with no operand
-            return;
-        }
-
-        StrictListAccessor<Expression, MethodInvocation> args = node.astArguments();
-        if (args.size() == 5) {
-            Expression destinationAddress = args.first();
-            if (destinationAddress instanceof StringLiteral) {
-                String number = ((StringLiteral) destinationAddress).astValue();
-
-                if (!number.startsWith("+")) {  //$NON-NLS-1$
-                   context.report(ISSUE, context.getLocation(destinationAddress),
-                       "To make sure the SMS can be sent by all users, please start the SMS number " +
-                       "with a + and a country code or restrict the code invocation to people in the country " +
-                       "you are targeting.",
-                       null);
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ObsoleteLayoutParamsDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ObsoleteLayoutParamsDetector.java
deleted file mode 100644
index 559a7ad..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ObsoleteLayoutParamsDetector.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ABSOLUTE_LAYOUT;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT;
-import static com.android.SdkConstants.ATTR_LAYOUT_ABOVE;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_BASELINE;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_BOTTOM;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_LEFT;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_PARENT_BOTTOM;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_PARENT_LEFT;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_PARENT_RIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_PARENT_TOP;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_RIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_TOP;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_WITH_PARENT_MISSING;
-import static com.android.SdkConstants.ATTR_LAYOUT_BELOW;
-import static com.android.SdkConstants.ATTR_LAYOUT_CENTER_HORIZONTAL;
-import static com.android.SdkConstants.ATTR_LAYOUT_CENTER_IN_PARENT;
-import static com.android.SdkConstants.ATTR_LAYOUT_CENTER_VERTICAL;
-import static com.android.SdkConstants.ATTR_LAYOUT_COLUMN;
-import static com.android.SdkConstants.ATTR_LAYOUT_COLUMN_SPAN;
-import static com.android.SdkConstants.ATTR_LAYOUT_GRAVITY;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_MARGIN;
-import static com.android.SdkConstants.ATTR_LAYOUT_MARGIN_BOTTOM;
-import static com.android.SdkConstants.ATTR_LAYOUT_MARGIN_LEFT;
-import static com.android.SdkConstants.ATTR_LAYOUT_MARGIN_RIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_MARGIN_TOP;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ATTR_LAYOUT_ROW;
-import static com.android.SdkConstants.ATTR_LAYOUT_ROW_SPAN;
-import static com.android.SdkConstants.ATTR_LAYOUT_SPAN;
-import static com.android.SdkConstants.ATTR_LAYOUT_TO_LEFT_OF;
-import static com.android.SdkConstants.ATTR_LAYOUT_TO_RIGHT_OF;
-import static com.android.SdkConstants.ATTR_LAYOUT_WEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_LAYOUT_X;
-import static com.android.SdkConstants.ATTR_LAYOUT_Y;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.GRID_LAYOUT;
-import static com.android.SdkConstants.LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.LINEAR_LAYOUT;
-import static com.android.SdkConstants.RELATIVE_LAYOUT;
-import static com.android.SdkConstants.TABLE_ROW;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-import static com.android.SdkConstants.VIEW_MERGE;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.client.api.IDomParser;
-import com.android.tools.lint.client.api.SdkInfo;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Location.Handle;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.android.utils.Pair;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Looks for layout params on views that are "obsolete" - may have made sense
- * when the view was added but there is a different layout parent now which does
- * not use the given layout params.
- */
-public class ObsoleteLayoutParamsDetector extends LayoutDetector {
-    /** Usage of deprecated views or attributes */
-    public static final Issue ISSUE = Issue.create(
-            "ObsoleteLayoutParam", //$NON-NLS-1$
-            "Looks for layout params that are not valid for the given parent layout",
-            "The given layout_param is not defined for the given layout, meaning it has no " +
-            "effect. This usually happens when you change the parent layout or move view " +
-            "code around without updating the layout params. This will cause useless " +
-            "attribute processing at runtime, and is misleading for others reading the " +
-            "layout so the parameter should be removed.",
-            Category.PERFORMANCE,
-            6,
-            Severity.WARNING,
-            ObsoleteLayoutParamsDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /**
-     * Set of layout parameter names that are considered valid no matter what so
-     * no other checking is necessary - such as layout_width and layout_height.
-     */
-    private static final Set<String> VALID = new HashSet<String>(10);
-
-    /**
-     * Mapping from a layout parameter name (local name only) to the defining
-     * ViewGroup. Note that it's possible for the same name to be defined by
-     * multiple ViewGroups - but it turns out this is extremely rare (the only
-     * examples are layout_column defined by both TableRow and GridLayout, and
-     * layout_gravity defined by many layouts) so rather than handle this with
-     * every single layout attribute pointing to a list, this is just special
-     * cased instead.
-     */
-    private static final Map<String, String> PARAM_TO_VIEW = new HashMap<String, String>(28);
-
-    static {
-        // Available (mostly) everywhere: No check
-        VALID.add(ATTR_LAYOUT_WIDTH);
-        VALID.add(ATTR_LAYOUT_HEIGHT);
-
-        // The layout_gravity isn't "global" but it's defined on many of the most
-        // common layouts (FrameLayout, LinearLayout and GridLayout) so we don't
-        // currently check for it. In order to do this we'd need to make the map point
-        // to lists rather than individual layouts or we'd need a bunch of special cases
-        // like the one done for layout_column below.
-        VALID.add(ATTR_LAYOUT_GRAVITY);
-
-        // From ViewGroup.MarginLayoutParams
-        VALID.add(ATTR_LAYOUT_MARGIN_LEFT);
-        VALID.add(ATTR_LAYOUT_MARGIN_RIGHT);
-        VALID.add(ATTR_LAYOUT_MARGIN_TOP);
-        VALID.add(ATTR_LAYOUT_MARGIN_BOTTOM);
-        VALID.add(ATTR_LAYOUT_MARGIN);
-
-        // Absolute Layout
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_X, ABSOLUTE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_Y, ABSOLUTE_LAYOUT);
-
-        // Linear Layout
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_WEIGHT, LINEAR_LAYOUT);
-
-        // Grid Layout
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_COLUMN, GRID_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_COLUMN_SPAN, GRID_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ROW, GRID_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ROW_SPAN, GRID_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ROW_SPAN, GRID_LAYOUT);
-
-        // Table Layout
-        // ATTR_LAYOUT_COLUMN is defined for both GridLayout and TableLayout,
-        // so we don't want to do
-        //    PARAM_TO_VIEW.put(ATTR_LAYOUT_COLUMN, TABLE_ROW);
-        // here since it would wipe out the above GridLayout registration.
-        // Since this is the only case where there is a conflict (in addition to layout_gravity
-        // which is defined in many places), rather than making the map point to lists
-        // this specific case is just special cased below, look for ATTR_LAYOUT_COLUMN.
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_SPAN, TABLE_ROW);
-
-        // Relative Layout
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ALIGN_LEFT, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ALIGN_RIGHT, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ALIGN_TOP, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ALIGN_BOTTOM, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ALIGN_PARENT_TOP, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ALIGN_PARENT_BOTTOM, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ALIGN_PARENT_LEFT, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ALIGN_PARENT_RIGHT, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ALIGN_WITH_PARENT_MISSING, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ALIGN_BASELINE, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_CENTER_IN_PARENT, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_CENTER_VERTICAL, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_CENTER_HORIZONTAL, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_TO_RIGHT_OF, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_TO_LEFT_OF, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_BELOW, RELATIVE_LAYOUT);
-        PARAM_TO_VIEW.put(ATTR_LAYOUT_ABOVE, RELATIVE_LAYOUT);
-    }
-
-    /**
-     * Map from an included layout to all the including contexts (each including
-     * context is a pair of a file containing the include to the parent tag at
-     * the included location)
-     */
-    private Map<String, List<Pair<File, String>>> mIncludes;
-
-    /**
-     * List of pending include checks. When a layout parameter attribute is
-     * found on a root element, or on a child of a {@code merge} root tag, then
-     * we want to check across layouts whether the including context (the parent
-     * of the include tag) is valid for this attribute. We cannot check this
-     * immediately because we are processing the layouts in an arbitrary order
-     * so the included layout may be seen before the including layout and so on.
-     * Therefore, we stash these attributes to be checked after we're done. Each
-     * pair is a pair of an attribute name to be checked, and the file that
-     * attribute is referenced in.
-     */
-    private final List<Pair<String, Location.Handle>> mPending =
-            new ArrayList<Pair<String,Location.Handle>>();
-
-    /** Constructs a new {@link ObsoleteLayoutParamsDetector} */
-    public ObsoleteLayoutParamsDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(VIEW_INCLUDE);
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return ALL;
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        String name = attribute.getLocalName();
-        if (name != null && name.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)
-                && ANDROID_URI.equals(attribute.getNamespaceURI())) {
-            if (VALID.contains(name)) {
-                return;
-            }
-
-            String parent = PARAM_TO_VIEW.get(name);
-            if (parent != null) {
-                Element viewElement = attribute.getOwnerElement();
-                Node layoutNode = viewElement.getParentNode();
-                if (layoutNode == null || layoutNode.getNodeType() != Node.ELEMENT_NODE) {
-                    // This is a layout attribute on a root element; this presumably means
-                    // that this layout is included so check the included layouts to make
-                    // sure at least one included context is valid for this layout_param.
-                    // We can't do that yet since we may be processing the include tag to
-                    // this layout after the layout itself. Instead, stash a work order...
-                    if (context.getScope().contains(Scope.ALL_RESOURCE_FILES)) {
-                        IDomParser parser = context.parser;
-                        Location.Handle handle = parser.createLocationHandle(context, attribute);
-                        handle.setClientData(attribute);
-                        mPending.add(Pair.of(name, handle));
-                    }
-
-                    return;
-                }
-
-                String parentTag = ((Element) layoutNode).getTagName();
-                if (parentTag.equals(VIEW_MERGE)) {
-                    // This is a merge which means we need to check the including contexts,
-                    // wherever they are. This has to be done after all the files have been
-                    // scanned since we are not processing the files in any particular order.
-                    if (context.getScope().contains(Scope.ALL_RESOURCE_FILES)) {
-                        IDomParser parser = context.parser;
-                        Location.Handle handle = parser.createLocationHandle(context, attribute);
-                        handle.setClientData(attribute);
-                        mPending.add(Pair.of(name, handle));
-                    }
-
-                    return;
-                }
-
-                if (!isValidParamForParent(context, name, parent, parentTag)) {
-                    if (name.equals(ATTR_LAYOUT_COLUMN)
-                            && isValidParamForParent(context, name, TABLE_ROW, parentTag)) {
-                        return;
-                    }
-                    context.report(ISSUE, attribute, context.getLocation(attribute),
-                            String.format("Invalid layout param in a %1$s: %2$s", parentTag, name),
-                            null);
-                }
-            } else {
-                // We could warn about unknown layout params but this might be brittle if
-                // new params are added or if people write custom ones; this is just a log
-                // for us to track these and update the check as necessary:
-                //context.client.log(null,
-                //    String.format("Unrecognized layout param '%1$s'", name));
-            }
-        }
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        String layout = element.getAttribute(ATTR_LAYOUT);
-        if (layout.startsWith(LAYOUT_RESOURCE_PREFIX)) { // Ignore @android:layout/ layouts
-            layout = layout.substring(LAYOUT_RESOURCE_PREFIX.length());
-
-            Node parent = element.getParentNode();
-            if (parent.getNodeType() == Node.ELEMENT_NODE) {
-                String tag = parent.getNodeName();
-                if (tag.indexOf('.') == -1 && !tag.equals(VIEW_MERGE)) {
-                    if (!context.getProject().getReportIssues()) {
-                        // If this is a library project not being analyzed, ignore it
-                        return;
-                    }
-
-                    if (mIncludes == null) {
-                        mIncludes = new HashMap<String, List<Pair<File, String>>>();
-                    }
-                    List<Pair<File, String>> includes = mIncludes.get(layout);
-                    if (includes == null) {
-                        includes = new ArrayList<Pair<File, String>>();
-                        mIncludes.put(layout, includes);
-                    }
-                    includes.add(Pair.of(context.file, tag));
-                }
-            }
-        }
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (mIncludes == null) {
-            return;
-        }
-
-        for (Pair<String, Location.Handle> pending : mPending) {
-            Handle handle = pending.getSecond();
-            Location location = handle.resolve();
-            File file = location.getFile();
-            String layout = file.getName();
-            if (layout.endsWith(DOT_XML)) {
-                layout = layout.substring(0, layout.length() - DOT_XML.length());
-            }
-
-            List<Pair<File, String>> includes = mIncludes.get(layout);
-            if (includes == null) {
-                // Nobody included this file
-                continue;
-            }
-
-            String name = pending.getFirst();
-            String parent = PARAM_TO_VIEW.get(name);
-            if (parent == null) {
-                continue;
-            }
-
-            boolean isValid = false;
-            for (Pair<File, String> include : includes) {
-                String parentTag = include.getSecond();
-                if (isValidParamForParent(context, name, parent, parentTag)) {
-                    isValid = true;
-                    break;
-                } else if (!isValid && name.equals(ATTR_LAYOUT_COLUMN)
-                        && isValidParamForParent(context, name, TABLE_ROW, parentTag)) {
-                    isValid = true;
-                    break;
-                }
-            }
-
-            if (!isValid) {
-                Object clientData = handle.getClientData();
-                if (clientData instanceof Node) {
-                    if (context.getDriver().isSuppressed(ISSUE, (Node) clientData)) {
-                        return;
-                    }
-                }
-
-                StringBuilder sb = new StringBuilder(40);
-                for (Pair<File, String> include : includes) {
-                    if (sb.length() > 0) {
-                        sb.append(", "); //$NON-NLS-1$
-                    }
-                    File from = include.getFirst();
-                    String parentTag = include.getSecond();
-                    sb.append(String.format("included from within a %1$s in %2$s",
-                            parentTag,
-                            from.getParentFile().getName() + File.separator + from.getName()));
-                }
-                String message = String.format("Invalid layout param '%1$s' (%2$s)",
-                            name, sb.toString());
-                // TODO: Compute applicable scope node
-                context.report(ISSUE, location, message, null);
-            }
-        }
-    }
-
-    /**
-     * Checks whether the given layout parameter name is valid for the given
-     * parent tag assuming it has the given current parent tag
-     */
-    private static boolean isValidParamForParent(Context context, String name, String parent,
-            String parentTag) {
-        if (parentTag.indexOf('.') != -1 || parentTag.equals(VIEW_TAG)) {
-            // Custom tag: We don't know whether it extends one of the builtin
-            // types where the layout param is valid, so don't complain
-            return true;
-        }
-
-        SdkInfo sdk = context.getSdkInfo();
-
-        if (!parentTag.equals(parent)) {
-            String tag = sdk.getParentViewName(parentTag);
-            while (tag != null) {
-                if (tag.equals(parent)) {
-                    return true;
-                }
-                tag = sdk.getParentViewName(tag);
-            }
-
-            return false;
-        }
-
-        return true;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/OnClickDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/OnClickDetector.java
deleted file mode 100644
index 2a07a86..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/OnClickDetector.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ATTR_ON_CLICK;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.client.api.LintDriver;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Location.Handle;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.base.Joiner;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Checks for missing onClick handlers
- */
-public class OnClickDetector extends LayoutDetector implements ClassScanner {
-    /** Missing onClick handlers */
-    public static final Issue ISSUE = Issue.create(
-            "OnClick", //$NON-NLS-1$
-            "Ensures that onClick attribute values refer to real methods",
-
-            "The `onClick` attribute value should be the name of a method in this View's context " +
-            "to invoke when the view is clicked. This name must correspond to a public method " +
-            "that takes exactly one parameter of type `View`.\n" +
-            "\n" +
-            "Must be a string value, using '\\;' to escape characters such as '\\n' or " +
-            "'\\uxxxx' for a unicode character.",
-            Category.CORRECTNESS,
-            10,
-            Severity.ERROR,
-            OnClickDetector.class,
-            EnumSet.of(Scope.ALL_RESOURCE_FILES, Scope.CLASS_FILE));
-
-    private Map<String, Location.Handle> mNames;
-    private Map<String, List<String>> mSimilar;
-    private boolean mHaveBytecode;
-
-    /** Constructs a new {@link OnClickDetector} */
-    public OnClickDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (mNames != null && !mNames.isEmpty() && mHaveBytecode) {
-            List<String> names = new ArrayList<String>(mNames.keySet());
-            Collections.sort(names);
-            LintDriver driver = context.getDriver();
-            for (String name : names) {
-                Handle handle = mNames.get(name);
-
-                Object clientData = handle.getClientData();
-                if (clientData instanceof Node) {
-                    if (driver.isSuppressed(ISSUE, (Node) clientData)) {
-                        continue;
-                    }
-                }
-
-                Location location = handle.resolve();
-                String message = String.format(
-                    "Corresponding method handler 'public void %1$s(android.view.View)' not found",
-                    name);
-                List<String> similar = mSimilar != null ? mSimilar.get(name) : null;
-                if (similar != null) {
-                    Collections.sort(similar);
-                  message += String.format(" (did you mean %1$s ?)", Joiner.on(", ").join(similar));
-                }
-                context.report(ISSUE, location, message, null);
-            }
-        }
-    }
-
-    // ---- Implements XmlScanner ----
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return Collections.singletonList(ATTR_ON_CLICK);
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        String value = attribute.getValue();
-        if (value.isEmpty() || value.trim().isEmpty()) {
-            context.report(ISSUE, attribute, context.getLocation(attribute),
-                    "onClick attribute value cannot be empty", null);
-        } else if (!value.equals(value.trim())) {
-            context.report(ISSUE, attribute, context.getLocation(attribute),
-                    "There should be no whitespace around attribute values", null);
-        } else if (!value.startsWith(PREFIX_RESOURCE_REF)) { // Not resolved
-            if (!context.getProject().getReportIssues()) {
-                // If this is a library project not being analyzed, ignore it
-                return;
-            }
-
-            if (mNames == null) {
-                mNames = new HashMap<String, Location.Handle>();
-            }
-            Handle handle = context.parser.createLocationHandle(context, attribute);
-            handle.setClientData(attribute);
-
-            // Replace unicode characters with the actual value since that's how they
-            // appear in the ASM signatures
-            if (value.contains("\\u")) { //$NON-NLS-1$
-                Pattern pattern = Pattern.compile("\\\\u(\\d\\d\\d\\d)"); //$NON-NLS-1$
-                Matcher matcher = pattern.matcher(value);
-                StringBuilder sb = new StringBuilder(value.length());
-                int remainder = 0;
-                while (matcher.find()) {
-                    sb.append(value.substring(0, matcher.start()));
-                    String unicode = matcher.group(1);
-                    int hex = Integer.parseInt(unicode, 16);
-                    sb.append((char) hex);
-                    remainder = matcher.end();
-                }
-                sb.append(value.substring(remainder));
-                value = sb.toString();
-            }
-
-            mNames.put(value, handle);
-        }
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @SuppressWarnings("rawtypes")
-    @Override
-    public void checkClass(@NonNull ClassContext context, @NonNull ClassNode classNode) {
-        if (mNames == null) {
-            // No onClick attributes in the XML files
-            return;
-        }
-
-        mHaveBytecode = true;
-
-        List methodList = classNode.methods;
-        for (Object m : methodList) {
-            MethodNode method = (MethodNode) m;
-            boolean rightArguments = method.desc.equals("(Landroid/view/View;)V"); //$NON-NLS-1$
-            if (!mNames.containsKey(method.name)) {
-                if (rightArguments) {
-                    // See if there's a possible typo instead
-                    for (String n : mNames.keySet()) {
-                        if (LintUtils.editDistance(n, method.name) <= 2) {
-                            recordSimilar(n, classNode, method);
-                            break;
-                        }
-                    }
-                }
-                continue;
-            }
-
-            // TODO: Validate class hierarchy: should extend a context method
-            // Longer term, also validate that it's in a layout that corresponds to
-            // the given activity
-
-            if (rightArguments){
-                // Found: remove from list to be checked
-                mNames.remove(method.name);
-
-                // Make sure the method is public
-                if ((method.access & Opcodes.ACC_PUBLIC) == 0) {
-                    Location location = context.getLocation(method, classNode);
-                    String message = String.format(
-                            "On click handler %1$s(View) must be public",
-                            method.name);
-                    context.report(ISSUE, location, message, null);
-                } else if ((method.access & Opcodes.ACC_STATIC) != 0) {
-                    Location location = context.getLocation(method, classNode);
-                    String message = String.format(
-                            "On click handler %1$s(View) should not be static",
-                            method.name);
-                    context.report(ISSUE, location, message, null);
-                }
-
-                if (mNames.isEmpty()) {
-                    mNames = null;
-                    return;
-                }
-            }
-        }
-    }
-
-    private void recordSimilar(String name, ClassNode classNode, MethodNode method) {
-        if (mSimilar == null) {
-            mSimilar = new HashMap<String, List<String>>();
-        }
-        List<String> list = mSimilar.get(name);
-        if (list == null) {
-            list = new ArrayList<String>();
-            mSimilar.put(name, list);
-        }
-
-        String signature = ClassContext.createSignature(classNode.name, method.name, method.desc);
-        list.add(signature);
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/OverdrawDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/OverdrawDetector.java
deleted file mode 100644
index e73a4b5..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/OverdrawDetector.java
+++ /dev/null
@@ -1,560 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_BACKGROUND;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_PARENT;
-import static com.android.SdkConstants.ATTR_THEME;
-import static com.android.SdkConstants.ATTR_TILE_MODE;
-import static com.android.SdkConstants.DOT_JAVA;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.DRAWABLE_PREFIX;
-import static com.android.SdkConstants.NULL_RESOURCE;
-import static com.android.SdkConstants.STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.TAG_ACTIVITY;
-import static com.android.SdkConstants.TAG_APPLICATION;
-import static com.android.SdkConstants.TAG_BITMAP;
-import static com.android.SdkConstants.TAG_STYLE;
-import static com.android.SdkConstants.TRANSPARENT_COLOR;
-import static com.android.SdkConstants.VALUE_DISABLED;
-import static com.android.tools.lint.detector.api.LintUtils.endsWith;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Project;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.android.utils.Pair;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.ClassDeclaration;
-import lombok.ast.CompilationUnit;
-import lombok.ast.Expression;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.MethodInvocation;
-import lombok.ast.Select;
-import lombok.ast.StrictListAccessor;
-import lombok.ast.VariableReference;
-
-/**
- * Check which looks for overdraw problems where view areas are painted and then
- * painted over, meaning that the bottom paint operation is a waste of time.
- */
-public class OverdrawDetector extends LayoutDetector implements Detector.JavaScanner {
-    private static final String R_STYLE_PREFIX = "R.style.";    //$NON-NLS-1$
-    private static final String SET_THEME = "setTheme";         //$NON-NLS-1$
-
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "Overdraw", //$NON-NLS-1$
-            "Looks for overdraw issues (where a view is painted only to be fully painted over)",
-            "If you set a background drawable on a root view, then you should use a " +
-            "custom theme where the theme background is null. Otherwise, the theme background " +
-            "will be painted first, only to have your custom background completely cover it; " +
-            "this is called \"overdraw\".\n" +
-            "\n" +
-            "NOTE: This detector relies on figuring out which layouts are associated with " +
-            "which activities based on scanning the Java code, and it's currently doing that " +
-            "using an inexact pattern matching algorithm. Therefore, it can incorrectly " +
-            "conclude which activity the layout is associated with and then wrongly complain " +
-            "that a background-theme is hidden.\n" +
-            "\n" +
-            "If you want your custom background on multiple pages, then you should consider " +
-            "making a custom theme with your custom background and just using that theme " +
-            "instead of a root element background.\n" +
-            "\n" +
-            "Of course it's possible that your custom drawable is translucent and you want " +
-            "it to be mixed with the background. However, you will get better performance " +
-            "if you pre-mix the background with your drawable and use that resulting image or " +
-            "color as a custom theme background instead.\n",
-
-            Category.PERFORMANCE,
-            3,
-            Severity.WARNING,
-            OverdrawDetector.class,
-            EnumSet.of(Scope.MANIFEST, Scope.JAVA_FILE, Scope.ALL_RESOURCE_FILES));
-
-    /** Mapping from FQN activity names to theme names registered in the manifest */
-    private Map<String, String> mActivityToTheme;
-
-    /** The default theme declared in the manifest, or null */
-    private String mManifestTheme;
-
-    /** Mapping from layout name (not including {@code @layout/} prefix) to activity FQN */
-    private Map<String, List<String>> mLayoutToActivity;
-
-    /** List of theme names registered in the project which have blank backgrounds */
-    private List<String> mBlankThemes;
-
-    /** Set of activities registered in the manifest. We will limit the Java analysis to
-     * these. */
-    private Set<String> mActivities;
-
-    /** List of drawable resources that are not flagged for overdraw (XML drawables
-     * except for {@code <bitmap>} drawables without tiling) */
-    private List<String> mValidDrawables;
-
-    /**
-     * List of pairs of (location, background drawable) corresponding to root elements
-     * in layouts that define a given background drawable. These should be checked to
-     * see if they are painting on top of a non-transparent theme.
-     */
-    private List<Pair<Location, String>> mRootAttributes;
-
-    /** Constructs a new {@link OverdrawDetector} */
-    public OverdrawDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        // Look in layouts for drawable resources
-        return super.appliesTo(folderType)
-                // and in resource files for theme definitions
-                || folderType == ResourceFolderType.VALUES
-                // and in drawable files for bitmap tiling modes
-                || folderType == ResourceFolderType.DRAWABLE;
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return LintUtils.isXmlFile(file) || LintUtils.endsWith(file.getName(), DOT_JAVA);
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    /** Is the given theme a "blank" theme (one not painting its background) */
-    private boolean isBlankTheme(String name) {
-        if (name.startsWith("@android:style/Theme_")) {               //$NON-NLS-1$
-            if (name.contains("NoFrame")                              //$NON-NLS-1$
-                    || name.contains("Theme_Wallpaper")               //$NON-NLS-1$
-                    || name.contains("Theme_Holo_Wallpaper")          //$NON-NLS-1$
-                    || name.contains("Theme_Translucent")             //$NON-NLS-1$
-                    || name.contains("Theme_Dialog_NoFrame")          //$NON-NLS-1$
-                    || name.contains("Theme_Holo_Dialog_Alert")       //$NON-NLS-1$
-                    || name.contains("Theme_Holo_Light_Dialog_Alert") //$NON-NLS-1$
-                    || name.contains("Theme_Dialog_Alert")            //$NON-NLS-1$
-                    || name.contains("Theme_Panel")                   //$NON-NLS-1$
-                    || name.contains("Theme_Light_Panel")             //$NON-NLS-1$
-                    || name.contains("Theme_Holo_Panel")              //$NON-NLS-1$
-                    || name.contains("Theme_Holo_Light_Panel")) {     //$NON-NLS-1$
-                return true;
-            }
-        }
-
-        if (mBlankThemes != null && mBlankThemes.contains(name)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (mRootAttributes != null) {
-            for (Pair<Location, String> pair : mRootAttributes) {
-                Location location = pair.getFirst();
-
-                Object clientData = location.getClientData();
-                if (clientData instanceof Node) {
-                    if (context.getDriver().isSuppressed(ISSUE, (Node) clientData)) {
-                        return;
-                    }
-                }
-
-                String layoutName = location.getFile().getName();
-                if (endsWith(layoutName, DOT_XML)) {
-                    layoutName = layoutName.substring(0, layoutName.length() - DOT_XML.length());
-                }
-
-                String theme = getTheme(context, layoutName);
-                if (theme == null || !isBlankTheme(theme)) {
-                    String drawable = pair.getSecond();
-                    String message = String.format(
-                            "Possible overdraw: Root element paints background %1$s with " +
-                            "a theme that also paints a background (inferred theme is %2$s)",
-                            drawable, theme);
-                    // TODO: Compute applicable scope node
-                    context.report(ISSUE, location, message, null);
-                }
-
-            }
-        }
-    }
-
-    /** Return the theme to be used for the given layout */
-    private String getTheme(Context context, String layoutName) {
-        if (mActivityToTheme != null && mLayoutToActivity != null) {
-            List<String> activities = mLayoutToActivity.get(layoutName);
-            if (activities != null) {
-                for (String activity : activities) {
-                   String theme = mActivityToTheme.get(activity);
-                    if (theme != null) {
-                        return theme;
-                    }
-                }
-            }
-        }
-
-        if (mManifestTheme != null) {
-            return mManifestTheme;
-        }
-
-        Project project = context.getMainProject();
-        int apiLevel = project.getTargetSdk();
-        if (apiLevel == -1) {
-            apiLevel = project.getMinSdk();
-        }
-
-        if (apiLevel >= 11) {
-            return "@android:style/Theme.Holo"; //$NON-NLS-1$
-        } else {
-            return "@android:style/Theme"; //$NON-NLS-1$
-        }
-    }
-
-    // ---- Implements XmlScanner ----
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        // Only consider the root element's background
-        if (attribute.getOwnerDocument().getDocumentElement() == attribute.getOwnerElement()) {
-            // If the drawable is a non-repeated pattern then the overdraw might be
-            // intentional since the image isn't covering the whole screen
-            String background = attribute.getValue();
-            if (mValidDrawables != null && mValidDrawables.contains(background)) {
-                return;
-            }
-
-            if (background.equals(TRANSPARENT_COLOR)) {
-                return;
-            }
-
-            if (background.startsWith("@android:drawable/")) { //$NON-NLS-1$
-                // We haven't had a chance to study the builtin drawables the way we
-                // check the project local ones in scanBitmap() and beforeCheckFile(),
-                // but many of these are not bitmaps, so ignore these
-                return;
-            }
-
-            String name = context.file.getName();
-            if (name.contains("list_") || name.contains("_item")) { //$NON-NLS-1$ //$NON-NLS-2$
-                // Canonical list_item layout name: don't warn about these, it's
-                // pretty common to want to paint custom list item backgrounds
-                return;
-            }
-
-            if (!context.getProject().getReportIssues()) {
-                // If this is a library project not being analyzed, ignore it
-                return;
-            }
-
-            Location location = context.getLocation(attribute);
-            location.setClientData(attribute);
-            if (mRootAttributes == null) {
-                mRootAttributes = new ArrayList<Pair<Location,String>>();
-            }
-            mRootAttributes.add(Pair.of(location, attribute.getValue()));
-        }
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return Collections.singletonList(
-                // Layouts: Look for background attributes on root elements for possible overdraw
-                ATTR_BACKGROUND
-        );
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                // Manifest: Look at theme registrations
-                TAG_ACTIVITY,
-                TAG_APPLICATION,
-
-                // Resource files: Look at theme definitions
-                TAG_STYLE,
-
-                // Bitmaps
-                TAG_BITMAP
-        );
-    }
-
-    @Override
-    public void beforeCheckFile(@NonNull Context context) {
-        if (endsWith(context.file.getName(), DOT_XML)) {
-            // Drawable XML files should not be considered for overdraw, except for <bitmap>'s.
-            // The bitmap elements are handled in the scanBitmap() method; it will clear
-            // out anything added by this method.
-            File parent = context.file.getParentFile();
-            ResourceFolderType type = ResourceFolderType.getFolderType(parent.getName());
-            if (type == ResourceFolderType.DRAWABLE) {
-                if (mValidDrawables == null) {
-                    mValidDrawables = new ArrayList<String>();
-                }
-                String resource = getDrawableResource(context.file);
-                mValidDrawables.add(resource);
-            }
-        }
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        String tag = element.getTagName();
-        if (tag.equals(TAG_STYLE)) {
-            scanTheme(element);
-        } else if (tag.equals(TAG_ACTIVITY)) {
-            scanActivity(context, element);
-        } else if (tag.equals(TAG_APPLICATION)) {
-            if (element.hasAttributeNS(ANDROID_URI, ATTR_THEME)) {
-                mManifestTheme = element.getAttributeNS(ANDROID_URI, ATTR_THEME);
-            }
-        } else if (tag.equals(TAG_BITMAP)) {
-            scanBitmap(context, element);
-        }
-    }
-
-    private static String getDrawableResource(File drawableFile) {
-        String resource = drawableFile.getName();
-        if (endsWith(resource, DOT_XML)) {
-            resource = resource.substring(0, resource.length() - DOT_XML.length());
-        }
-        return DRAWABLE_PREFIX + resource;
-    }
-
-    private void scanBitmap(Context context, Element element) {
-        String tileMode = element.getAttributeNS(ANDROID_URI, ATTR_TILE_MODE);
-        if (!(tileMode.equals(VALUE_DISABLED) || tileMode.isEmpty())) {
-            if (mValidDrawables != null) {
-                String resource = getDrawableResource(context.file);
-                mValidDrawables.remove(resource);
-            }
-        }
-    }
-
-    private void scanActivity(Context context, Element element) {
-        String name = element.getAttributeNS(ANDROID_URI, ATTR_NAME);
-        if (name.indexOf('$') != -1) {
-            name = name.replace('$', '.');
-        }
-        if (name.startsWith(".")) {  //$NON-NLS-1$
-            String pkg = context.getProject().getPackage();
-            if (pkg != null && !pkg.isEmpty()) {
-                name = pkg + name;
-            }
-        }
-
-        if (mActivities == null) {
-            mActivities = new HashSet<String>();
-        }
-        mActivities.add(name);
-
-        String theme = element.getAttributeNS(ANDROID_URI, ATTR_THEME);
-        if (theme != null && !theme.isEmpty()) {
-            if (mActivityToTheme == null) {
-                mActivityToTheme = new HashMap<String, String>();
-            }
-            mActivityToTheme.put(name, theme.replace('.', '_'));
-        }
-    }
-
-    private void scanTheme(Element element) {
-        // Look for theme definitions, and record themes that provide a null background.
-        String styleName = element.getAttribute(ATTR_NAME);
-        String parent = element.getAttribute(ATTR_PARENT);
-        if (parent == null) {
-            // Eclipse DOM workaround
-            parent = "";
-        }
-
-        if (parent.isEmpty()) {
-            int index = styleName.lastIndexOf('.');
-            if (index != -1) {
-                parent = styleName.substring(0, index);
-            }
-        }
-        parent = parent.replace('.', '_');
-
-        String resource = STYLE_RESOURCE_PREFIX + styleName.replace('.', '_');
-
-        NodeList items = element.getChildNodes();
-        for (int i = 0, n = items.getLength(); i < n; i++) {
-            if (items.item(i).getNodeType() == Node.ELEMENT_NODE) {
-                Element item = (Element) items.item(i);
-                String name = item.getAttribute(ATTR_NAME);
-                if (name.equals("android:windowBackground")) {      //$NON-NLS-1$
-                    NodeList textNodes = item.getChildNodes();
-                    for (int j = 0, m = textNodes.getLength(); j < m; j++) {
-                        Node textNode = textNodes.item(j);
-                        if (textNode.getNodeType() == Node.TEXT_NODE) {
-                            String text = textNode.getNodeValue();
-                            String trim = text.trim();
-                            if (!trim.isEmpty()) {
-                                if (trim.equals(NULL_RESOURCE)
-                                        || trim.equals(TRANSPARENT_COLOR)
-                                        || mValidDrawables != null
-                                            && mValidDrawables.contains(trim)) {
-                                    if (mBlankThemes == null) {
-                                        mBlankThemes = new ArrayList<String>();
-                                    }
-                                    mBlankThemes.add(resource);
-                                }
-                            }
-                        }
-                    }
-
-                    return;
-                }
-            }
-        }
-
-        if (isBlankTheme(parent)) {
-            if (mBlankThemes == null) {
-                mBlankThemes = new ArrayList<String>();
-            }
-            mBlankThemes.add(resource);
-        }
-    }
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    public List<Class<? extends lombok.ast.Node>> getApplicableNodeTypes() {
-        // This detector does not specify specific node types; this means
-        // that the infrastructure will run the full visitor on the compilation
-        // unit rather than on individual nodes. This is important since this
-        // detector relies on pruning (if it gets to a class declaration that is
-        // not an activity, it skips everything inside).
-        return null;
-    }
-
-    @Override
-    public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
-        if (!context.getProject().getReportIssues()) {
-            return null;
-        }
-        return new OverdrawVisitor();
-    }
-
-    private class OverdrawVisitor extends ForwardingAstVisitor {
-        private static final String ACTIVITY = "Activity"; //$NON-NLS-1$
-        private String mClassFqn;
-
-        @Override
-        public boolean visitClassDeclaration(ClassDeclaration node) {
-            String name = node.getDescription();
-
-            if (mActivities != null && mActivities.contains(mClassFqn) || name.endsWith(ACTIVITY)
-                    || node.astExtending() != null &&
-                        node.astExtending().getDescription().endsWith(ACTIVITY)) {
-                String packageName = "";
-                if (node.getParent() instanceof CompilationUnit) {
-                    CompilationUnit compilationUnit = (CompilationUnit) node.getParent();
-                    packageName = compilationUnit.astPackageDeclaration().getPackageName();
-                }
-                mClassFqn = (!packageName.isEmpty() ? (packageName + '.') : "") + name;
-
-                return false;
-            }
-
-            return true; // Done: No need to look inside this class
-        }
-
-        // Store R.layout references in activity classes in a map mapping back layouts
-        // to activities
-        @Override
-        public boolean visitSelect(Select node) {
-            if (node.astIdentifier().astValue().equals("layout") //$NON-NLS-1$
-                    && node.astOperand() instanceof VariableReference
-                    && ((VariableReference) node.astOperand()).astIdentifier().astValue()
-                        .equals("R")                             //$NON-NLS-1$
-                    && node.getParent() instanceof Select) {
-                String layout = ((Select) node.getParent()).astIdentifier().astValue();
-                if (mLayoutToActivity == null) {
-                    mLayoutToActivity = new HashMap<String, List<String>>();
-                }
-                List<String> list = mLayoutToActivity.get(layout);
-                if (list == null) {
-                    list = new ArrayList<String>();
-                    mLayoutToActivity.put(layout, list);
-                }
-                list.add(mClassFqn);
-            }
-
-            return false;
-        }
-
-
-        // Look for setTheme(R.style.whatever) and register as a theme registration
-        // for the current activity
-        @Override
-        public boolean visitMethodInvocation(MethodInvocation node) {
-            if (node.astName().astValue().equals(SET_THEME)) {
-                // Look at argument
-                StrictListAccessor<Expression, MethodInvocation> args = node.astArguments();
-                if (args.size() == 1) {
-                    Expression arg = args.first();
-                    if (arg instanceof Select) {
-                        String resource = arg.toString();
-                        if (resource.startsWith(R_STYLE_PREFIX)) {
-                            if (mActivityToTheme == null) {
-                                mActivityToTheme = new HashMap<String, String>();
-                            }
-                            String name = ((Select) arg).astIdentifier().astValue();
-                            mActivityToTheme.put(mClassFqn, STYLE_RESOURCE_PREFIX + name);
-                        }
-                    }
-                }
-            }
-
-            return false;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/OverrideDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/OverrideDetector.java
deleted file mode 100644
index 15e2245..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/OverrideDetector.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.CONSTRUCTOR_NAME;
-import static org.objectweb.asm.Opcodes.ACC_PRIVATE;
-import static org.objectweb.asm.Opcodes.ACC_PROTECTED;
-import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
-import static org.objectweb.asm.Opcodes.ACC_STATIC;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.client.api.LintDriver;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.collect.Sets.SetView;
-
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.MethodNode;
-
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-/**
- * Checks for accidental overrides
- */
-public class OverrideDetector extends Detector implements ClassScanner {
-    /** Accidental overrides */
-    public static final Issue ISSUE = Issue.create(
-            "DalvikOverride", //$NON-NLS-1$
-            "Looks for methods treated as overrides by Dalvik",
-
-            "The Android virtual machine will treat a package private method in one " +
-            "class as overriding a package private method in its super class, even if " +
-            "they are in separate packages. This may be surprising, but for compatibility " +
-            "reasons the behavior has not been changed (yet).\n" +
-            "\n" +
-            "If you really did intend for this method to override the other, make the " +
-            "method `protected` instead.\n" +
-            "\n" +
-            "If you did *not* intend the override, consider making the method private, or " +
-            "changing its name or signature.",
-
-            Category.CORRECTNESS,
-            7,
-            Severity.ERROR,
-            OverrideDetector.class,
-            EnumSet.of(Scope.ALL_CLASS_FILES));
-
-    /** map from owner class name to JVM signatures for its package private methods  */
-    private final Map<String, Set<String>> mPackagePrivateMethods = Maps.newHashMap();
-
-    /** Map from owner to signature to super class being overridden */
-    private Map<String, Map<String, String>> mErrors;
-
-    /**
-     * Map from owner to signature to corresponding location. When there are
-     * errors a single error can have locations for both the overriding and
-     * overridden methods.
-     */
-    private Map<String, Map<String, Location>> mLocations;
-
-    /** Constructs a new {@link OverrideDetector} */
-    public OverrideDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.NORMAL;
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        // Process the check in two passes:
-        //
-        // In the first pass, gather the full set of package private methods for
-        // each class.
-        // When all classes have been processed at the end of the first pass,
-        // find out whether any of the methods are potentially overriding those
-        // in its super classes.
-        //
-        // If so, request a second pass. In the second pass, we gather full locations
-        // for both the base and overridden method calls, and store these.
-        // If the location is found to be in a suppressed context, remove that error
-        // entry.
-        //
-        // At the end of the second pass, we generate the errors, combining locations
-        // from both the overridden and overriding methods.
-        if (context.getPhase() == 1) {
-            Set<String> classes = mPackagePrivateMethods.keySet();
-            LintDriver driver = context.getDriver();
-            for (String owner : classes) {
-                Set<String> methods = mPackagePrivateMethods.get(owner);
-                String superClass = driver.getSuperClass(owner);
-                int packageIndex = owner.lastIndexOf('/');
-                while (superClass != null) {
-                    int superPackageIndex = superClass.lastIndexOf('/');
-
-                    // Only compare methods that differ in packages
-                    if (packageIndex == -1 || superPackageIndex != packageIndex ||
-                            !owner.regionMatches(0, superClass, 0, packageIndex)) {
-                        Set<String> superMethods = mPackagePrivateMethods.get(superClass);
-                        if (superMethods != null) {
-                            SetView<String> intersection = Sets.intersection(methods,
-                                    superMethods);
-                            if (!intersection.isEmpty()) {
-                                if (mLocations == null) {
-                                    mLocations = Maps.newHashMap();
-                                }
-                                // We need a separate data structure to keep track of which
-                                // signatures are in error,
-                                if (mErrors == null) {
-                                    mErrors = Maps.newHashMap();
-                                }
-
-                                for (String signature : intersection) {
-                                    Map<String, Location> locations = mLocations.get(owner);
-                                    if (locations == null) {
-                                        locations = Maps.newHashMap();
-                                        mLocations.put(owner, locations);
-                                    }
-                                    locations.put(signature, null);
-
-                                    locations = mLocations.get(superClass);
-                                    if (locations == null) {
-                                        locations = Maps.newHashMap();
-                                        mLocations.put(superClass, locations);
-                                    }
-                                    locations.put(signature, null);
-
-
-                                    Map<String, String> errors = mErrors.get(owner);
-                                    if (errors == null) {
-                                        errors = Maps.newHashMap();
-                                        mErrors.put(owner, errors);
-                                    }
-                                    errors.put(signature, superClass);
-                                }
-                            }
-                        }
-                    }
-                    superClass = driver.getSuperClass(superClass);
-                }
-            }
-
-            if (mErrors != null) {
-                context.requestRepeat(this, ISSUE.getScope());
-            }
-        } else {
-            assert context.getPhase() == 2;
-
-            for (Entry<String, Map<String, String>> ownerEntry : mErrors.entrySet()) {
-                String owner = ownerEntry.getKey();
-                Map<String, String> methodToSuper = ownerEntry.getValue();
-                for (Entry<String, String> entry : methodToSuper.entrySet()) {
-                    String signature = entry.getKey();
-                    String superClass = entry.getValue();
-
-                    Map<String, Location> ownerLocations = mLocations.get(owner);
-                    if (ownerLocations != null) {
-                        Location location = ownerLocations.get(signature);
-                        if (location != null) {
-                            Map<String, Location> superLocations = mLocations.get(superClass);
-                            if (superLocations != null) {
-                                Location superLocation = superLocations.get(signature);
-                                if (superLocation != null) {
-                                    location.setSecondary(superLocation);
-                                    superLocation.setMessage(
-                                            "This method is treated as overridden");
-                                }
-                            }
-                            String methodName = signature;
-                            int index = methodName.indexOf('(');
-                            if (index != -1) {
-                                methodName = methodName.substring(0, index);
-                            }
-                            String message = String.format(
-                                    "This package private method may be unintentionally " +
-                                    "overriding %1$s in %2$s", methodName,
-                                    ClassContext.getFqcn(superClass));
-                            context.report(ISSUE, location, message, null);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    @SuppressWarnings("rawtypes") // ASM4 API
-    @Override
-    public void checkClass(@NonNull ClassContext context, @NonNull ClassNode classNode) {
-        if (!context.getProject().getReportIssues()) {
-            // If this is a library project not being analyzed, ignore it
-            return;
-        }
-
-        List methodList = classNode.methods;
-        if (context.getPhase() == 1) {
-            for (Object m : methodList) {
-                MethodNode method = (MethodNode) m;
-                int access = method.access;
-                // Only record non-static package private methods
-                if ((access & (ACC_STATIC|ACC_PRIVATE|ACC_PROTECTED|ACC_PUBLIC)) != 0) {
-                    continue;
-                }
-
-                // Ignore constructors too
-                if (CONSTRUCTOR_NAME.equals(method.name)) {
-                    continue;
-                }
-
-                String owner = classNode.name;
-                Set<String> methods = mPackagePrivateMethods.get(owner);
-                if (methods == null) {
-                    methods = Sets.newHashSetWithExpectedSize(methodList.size());
-                    mPackagePrivateMethods.put(owner, methods);
-                }
-                methods.add(method.name + method.desc);
-            }
-        } else {
-            assert context.getPhase() == 2;
-            Map<String, Location> methods = mLocations.get(classNode.name);
-            if (methods == null) {
-                // No locations needed from this class
-                return;
-            }
-
-            for (Object m : methodList) {
-                MethodNode method = (MethodNode) m;
-
-                String signature = method.name + method.desc;
-                if (methods.containsKey(signature)){
-                    if (context.getDriver().isSuppressed(ISSUE, classNode,
-                            method, null)) {
-                        Map<String, String> errors = mErrors.get(classNode.name);
-                        if (errors != null) {
-                            errors.remove(signature);
-                        }
-                        continue;
-                    }
-
-                    Location location = context.getLocation(method, classNode);
-                    methods.put(signature, location);
-                    String description = ClassContext.createSignature(classNode.name,
-                            method.name, method.desc);
-                    location.setClientData(description);
-                }
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/PrivateKeyDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/PrivateKeyDetector.java
deleted file mode 100644
index e8887a5..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/PrivateKeyDetector.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.EnumSet;
-
-/**
- * Looks for packaged private key files.
- */
-public class PrivateKeyDetector extends Detector implements Detector.OtherFileScanner {
-    /** Packaged private key files */
-    public static final Issue ISSUE = Issue.create(
-            "PackagedPrivateKey", //$NON-NLS-1$
-            "Looks for packaged private key files",
-
-            "In general, you should not package private key files inside your app.",
-
-            Category.SECURITY,
-            8,
-            Severity.WARNING,
-            PrivateKeyDetector.class,
-            Scope.OTHER_SCOPE);
-
-    /** Constructs a new {@link PrivateKeyDetector} check */
-    public PrivateKeyDetector() {
-    }
-
-    private static boolean isPrivateKeyFile(File file) {
-        if (!file.isFile() ||
-            (!LintUtils.endsWith(file.getPath(), "pem") &&  //NON-NLS-1$
-             !LintUtils.endsWith(file.getPath(), "key"))) { //NON-NLS-1$
-            return false;
-        }
-
-        try {
-            String firstLine = Files.readFirstLine(file, Charsets.US_ASCII);
-            return firstLine != null &&
-                firstLine.startsWith("---") &&     //NON-NLS-1$
-                firstLine.contains("PRIVATE KEY"); //NON-NLS-1$
-        } catch (IOException ex) {
-            // Don't care
-        }
-
-        return false;
-    }
-
-    // ---- Implements OtherFileScanner ----
-
-    @NonNull
-    @Override
-    public EnumSet<Scope> getApplicableFiles() {
-        return Scope.OTHER_SCOPE;
-    }
-
-    @Override
-    public void run(@NonNull Context context) {
-        if (!context.getProject().getReportIssues()) {
-            // If this is a library project not being analyzed, ignore it
-            return;
-        }
-
-        File file = context.file;
-        if (isPrivateKeyFile(file)) {
-            String fileName = file.getParentFile().getName() + File.separator
-                + file.getName();
-            String message = String.format(
-                "The %1$s file seems to be a private key file. " +
-                "Please make sure not to embed this in your APK file.", fileName);
-            context.report(ISSUE, Location.create(file), message, null);
-        }
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.NORMAL;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/PrivateResourceDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/PrivateResourceDetector.java
deleted file mode 100644
index d8a4ce0..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/PrivateResourceDetector.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-
-import java.util.Collection;
-
-/**
- * Check which looks for access of private resources.
- */
-public class PrivateResourceDetector extends ResourceXmlDetector {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "PrivateResource", //$NON-NLS-1$
-            "Looks for references to private resources",
-            "Private resources should not be referenced; the may not be present everywhere, and " +
-            "even where they are they may disappear without notice.\n" +
-            "\n" +
-            "To fix this, copy the resource into your own project. You can find the platform " +
-            "resources under `$ANDROID_SK/platforms/android-$VERSION/data/res/.`",
-            Category.CORRECTNESS,
-            3,
-            Severity.FATAL,
-            PrivateResourceDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new detector */
-    public PrivateResourceDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return ALL;
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        String value = attribute.getNodeValue();
-        if (value.startsWith("@*android:")) { //$NON-NLS-1$
-            context.report(ISSUE, attribute, context.getLocation(attribute),
-                    "Illegal resource reference: @*android resources are private and " +
-                    "not always present", null);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ProguardDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ProguardDetector.java
deleted file mode 100644
index 7762659..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ProguardDetector.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.PROGUARD_CONFIG;
-import static com.android.SdkConstants.PROJECT_PROPERTIES;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import java.io.File;
-import java.util.EnumSet;
-
-/**
- * Check which looks for errors in Proguard files.
- */
-public class ProguardDetector extends Detector {
-
-    /** The main issue discovered by this detector */
-    public static final Issue WRONGKEEP = Issue.create(
-            "Proguard", //$NON-NLS-1$
-            "Looks for problems in proguard config files",
-            "Using `-keepclasseswithmembernames` in a proguard config file is not " +
-            "correct; it can cause some symbols to be renamed which should not be.\n" +
-            "Earlier versions of ADT used to create proguard.cfg files with the " +
-            "wrong format. Instead of `-keepclasseswithmembernames` use " +
-            "`-keepclasseswithmembers`, since the old flags also implies " +
-            "\"allow shrinking\" which means symbols only referred to from XML and " +
-            "not Java (such as possibly CustomViews) can get deleted.",
-            Category.CORRECTNESS,
-            8,
-            Severity.FATAL,
-            ProguardDetector.class,
-            EnumSet.of(Scope.PROGUARD_FILE)).setMoreInfo(
-            "http://http://code.google.com/p/android/issues/detail?id=16384"); //$NON-NLS-1$
-
-    /** Finds ProGuard files that contain non-project specific configuration
-     * locally and suggests replacing it with an include path */
-    public static final Issue SPLITCONFIG = Issue.create(
-            "ProguardSplit", //$NON-NLS-1$
-            "Checks for old proguard.cfg files that contain generic Android rules",
-
-            "Earlier versions of the Android tools bundled a single `proguard.cfg` file " +
-            "containing a ProGuard configuration file suitable for Android shrinking and " +
-            "obfuscation. However, that version was copied into new projects, which " +
-            "means that it does not continue to get updated as we improve the default " +
-            "ProGuard rules for Android.\n" +
-            "\n" +
-            "In the new version of the tools, we have split the ProGuard configuration " +
-            "into two halves:\n" +
-            "* A simple configuration file containing only project-specific flags, in " +
-            "your project\n" +
-            "* A generic configuration file containing the recommended set of ProGuard " +
-            "options for Android projects. This generic file lives in the SDK install " +
-            "directory which means that it gets updated along with the tools.\n" +
-            "\n" +
-            "In order for this to work, the proguard.config property in the " +
-            "`project.properties` file now refers to a path, so you can reference both " +
-            "the generic file as well as your own (and any additional files too).\n" +
-            "\n" +
-            "To migrate your project to the new setup, create a new `proguard-project.txt` file " +
-            "in your project containing any project specific ProGuard flags as well as " +
-            "any customizations you have made, then update your project.properties file " +
-            "to contain:\n" +
-            "`proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt`",
-
-            Category.CORRECTNESS,
-            3,
-            Severity.WARNING,
-            ProguardDetector.class,
-            EnumSet.of(Scope.PROGUARD_FILE));
-
-    @Override
-    public void run(@NonNull Context context) {
-        String contents = context.getContents();
-        if (contents != null) {
-            if (context.isEnabled(WRONGKEEP)) {
-                int index = contents.indexOf(
-                        // Old pattern:
-                        "-keepclasseswithmembernames class * {\n" + //$NON-NLS-1$
-                        "    public <init>(android.");              //$NON-NLS-1$
-                if (index != -1) {
-                    context.report(WRONGKEEP,
-                            Location.create(context.file, contents, index, index),
-                            "Obsolete ProGuard file; use -keepclasseswithmembers instead of " +
-                            "-keepclasseswithmembernames", null);
-                }
-            }
-            if (context.isEnabled(SPLITCONFIG)) {
-                int index = contents.indexOf("-keep public class * extends android.app.Activity");
-                if (index != -1) {
-                    // Only complain if project.properties actually references this file;
-                    // no need to bother the users who got a default proguard.cfg file
-                    // when they created their projects but haven't actually hooked it up
-                    // to shrinking & obfuscation.
-                    File propertyFile = new File(context.file.getParentFile(), PROJECT_PROPERTIES);
-                    if (!propertyFile.exists()) {
-                        return;
-                    }
-                    String properties = context.getClient().readFile(propertyFile);
-                    int i = properties.indexOf(PROGUARD_CONFIG);
-                    if (i == -1) {
-                        return;
-                    }
-                    // Make sure the entry isn't just commented out, such as
-                    // # To enable ProGuard to shrink and obfuscate your code, uncomment this:
-                    // #proguard.config=proguard.cfg
-                    for (; i >= 0; i--) {
-                        char c = properties.charAt(i);
-                        if (c == '#') {
-                            return;
-                        }
-                        if (c == '\n') {
-                            break;
-                        }
-                    }
-                    if (properties.contains(PROGUARD_CONFIG)) {
-                        context.report(SPLITCONFIG,
-                            Location.create(context.file, contents, index, index),
-                            String.format(
-                            "Local ProGuard configuration contains general Android " +
-                            "configuration: Inherit these settings instead? " +
-                            "Modify project.properties to define " +
-                            "proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:%1$s" +
-                            " and then keep only project-specific configuration here",
-                            context.file.getName()), null);
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return true;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/PxUsageDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/PxUsageDetector.java
deleted file mode 100644
index ed9447e..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/PxUsageDetector.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_TEXT_SIZE;
-import static com.android.SdkConstants.TAG_ITEM;
-import static com.android.SdkConstants.TAG_STYLE;
-import static com.android.SdkConstants.UNIT_DIP;
-import static com.android.SdkConstants.UNIT_DP;
-import static com.android.SdkConstants.UNIT_IN;
-import static com.android.SdkConstants.UNIT_MM;
-import static com.android.SdkConstants.UNIT_PX;
-import static com.android.SdkConstants.UNIT_SP;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Check for px dimensions instead of dp dimensions.
- * Also look for non-"sp" text sizes.
- */
-public class PxUsageDetector extends LayoutDetector {
-    /** Using px instead of dp */
-    public static final Issue PX_ISSUE = Issue.create(
-            "PxUsage", //$NON-NLS-1$
-            "Looks for use of the \"px\" dimension",
-            // This description is from the below screen support document
-            "For performance reasons and to keep the code simpler, the Android system uses pixels " +
-            "as the standard unit for expressing dimension or coordinate values. That means that " +
-            "the dimensions of a view are always expressed in the code using pixels, but " +
-            "always based on the current screen density. For instance, if `myView.getWidth()` " +
-            "returns 10, the view is 10 pixels wide on the current screen, but on a device with " +
-            "a higher density screen, the value returned might be 15. If you use pixel values " +
-            "in your application code to work with bitmaps that are not pre-scaled for the " +
-            "current screen density, you might need to scale the pixel values that you use in " +
-            "your code to match the un-scaled bitmap source.",
-            Category.CORRECTNESS,
-            2,
-            Severity.WARNING,
-            PxUsageDetector.class,
-            Scope.RESOURCE_FILE_SCOPE).setMoreInfo(
-            "http://developer.android.com/guide/practices/screens_support.html#screen-independence"); //$NON-NLS-1$
-
-    /** Using mm/in instead of dp */
-    public static final Issue IN_MM_ISSUE = Issue.create(
-            "InOrMmUsage", //$NON-NLS-1$
-            "Looks for use of the \"mm\" or \"in\" dimensions",
-
-            "Avoid using `mm` (millimeters) or `in` (inches) as the unit for dimensions.\n" +
-            "\n" +
-            "While it should work in principle, unfortunately many devices do not report " +
-            "the correct true physical density, which means that the dimension calculations " +
-            "won't work correctly. You are better off using `dp` (and for font sizes, `sp`.)",
-
-            Category.CORRECTNESS,
-            4,
-            Severity.WARNING,
-            PxUsageDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Using sp instead of dp */
-    public static final Issue DP_ISSUE = Issue.create(
-            "SpUsage", //$NON-NLS-1$
-            "Looks for uses of \"dp\" instead of \"sp\" dimensions for text sizes",
-
-            "When setting text sizes, you should normally use `sp`, or \"scale-independent " +
-            "pixels\". This is like the `dp` unit, but it is also scaled " +
-            "by the user's font size preference. It is recommend you use this unit when " +
-            "specifying font sizes, so they will be adjusted for both the screen density " +
-            "and the user's preference.\n" +
-            "\n" +
-            "There *are* cases where you might need to use `dp`; typically this happens when " +
-            "the text is in a container with a specific dp-size. This will prevent the text " +
-            "from spilling outside the container. Note however that this means that the user's " +
-            "font size settings are not respected, so consider adjusting the layout itself " +
-            "to be more flexible.",
-            Category.CORRECTNESS,
-            3,
-            Severity.WARNING,
-            PxUsageDetector.class,
-            Scope.RESOURCE_FILE_SCOPE).setMoreInfo(
-            "http://developer.android.com/training/multiscreen/screendensities.html"); //$NON-NLS-1$
-
-    /** Using text sizes that are too small */
-    public static final Issue SMALL_SP_ISSUE = Issue.create(
-            "SmallSp", //$NON-NLS-1$
-            "Looks for text sizes that are too small",
-
-            "Avoid using sizes smaller than 12sp.",
-
-            Category.USABILITY,
-            4,
-            Severity.WARNING,
-            PxUsageDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-
-    /** Constructs a new {@link PxUsageDetector} */
-    public PxUsageDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        // Look in both layouts (at attribute values) and in value files (at style definitions)
-        return folderType == ResourceFolderType.LAYOUT || folderType == ResourceFolderType.VALUES;
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return ALL;
-    }
-
-    @Override
-    @Nullable
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(TAG_STYLE);
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        if (context.getResourceFolderType() != ResourceFolderType.LAYOUT) {
-            return;
-        }
-
-        String value = attribute.getValue();
-        if (value.endsWith(UNIT_PX) && value.matches("\\d+px")) { //$NON-NLS-1$
-            if (value.charAt(0) == '0') {
-                // 0px is fine. 0px is 0dp regardless of density...
-                return;
-            }
-            if (context.isEnabled(PX_ISSUE)) {
-                context.report(PX_ISSUE, attribute, context.getLocation(attribute),
-                    "Avoid using \"px\" as units; use \"dp\" instead", null);
-            }
-        } else if (value.endsWith(UNIT_MM) && value.matches("\\d+mm") //$NON-NLS-1$
-                       || value.endsWith(UNIT_IN) && value.matches("\\d+in")) { //$NON-NLS-1$
-            if (value.charAt(0) == '0') {
-                // 0mm == 0in == 0dp
-                return;
-            }
-            if (context.isEnabled(IN_MM_ISSUE)) {
-                String unit = value.substring(value.length() - 2);
-                context.report(IN_MM_ISSUE, attribute, context.getLocation(attribute),
-                        String.format("Avoid using \"%1$s\" as units " +
-                                "(it does not work accurately on all devices); use \"dp\" instead",
-                                unit),
-                    null);
-            }
-        } else if (value.endsWith(UNIT_SP)
-                && (ATTR_TEXT_SIZE.equals(attribute.getLocalName())
-                        || ATTR_LAYOUT_HEIGHT.equals(attribute.getLocalName()))
-                && value.matches("\\d+sp")) { //$NON-NLS-1$
-            int size = getSize(value);
-            if (size > 0 && size < 12) {
-                context.report(SMALL_SP_ISSUE, attribute, context.getLocation(attribute),
-                        String.format("Avoid using sizes smaller than 12sp: %1$s", value),
-                        null);
-            }
-        } else if (ATTR_TEXT_SIZE.equals(attribute.getLocalName())
-                && (value.endsWith(UNIT_DP) || value.endsWith(UNIT_DIP))
-                && (value.matches("\\d+di?p"))) { //$NON-NLS-1$
-            if (context.isEnabled(DP_ISSUE)) {
-                context.report(DP_ISSUE, attribute, context.getLocation(attribute),
-                    "Should use \"sp\" instead of \"dp\" for text sizes", null);
-            }
-        }
-    }
-
-    private static int getSize(String text) {
-        assert text.matches("\\d+sp") : text; //$NON-NLS-1$
-        return Integer.parseInt(text.substring(0, text.length() - 2));
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        if (context.getResourceFolderType() != ResourceFolderType.VALUES) {
-            return;
-        }
-
-        assert element.getTagName().equals(TAG_STYLE);
-        NodeList itemNodes = element.getChildNodes();
-        for (int j = 0, nodeCount = itemNodes.getLength(); j < nodeCount; j++) {
-            Node item = itemNodes.item(j);
-            if (item.getNodeType() == Node.ELEMENT_NODE &&
-                    TAG_ITEM.equals(item.getNodeName())) {
-                Element itemElement = (Element) item;
-                NodeList childNodes = item.getChildNodes();
-                for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-                    Node child = childNodes.item(i);
-                    if (child.getNodeType() != Node.TEXT_NODE) {
-                        return;
-                    }
-
-                    checkStyleItem(context, itemElement, child);
-                }
-            }
-        }
-    }
-
-    private static void checkStyleItem(XmlContext context, Element item, Node textNode) {
-        String text = textNode.getNodeValue();
-        for (int j = text.length() - 1; j > 0; j--) {
-            char c = text.charAt(j);
-            if (!Character.isWhitespace(c)) {
-                if (c == 'x' && text.charAt(j - 1) == 'p') { // ends with px
-                    text = text.trim();
-                    if (text.matches("\\d+px") && text.charAt(0) != '0') { //$NON-NLS-1$
-                        if (context.isEnabled(PX_ISSUE)) {
-                            context.report(PX_ISSUE, item, context.getLocation(textNode),
-                                "Avoid using \"px\" as units; use \"dp\" instead", null);
-                        }
-                    }
-                } else if (c == 'm' && text.charAt(j - 1) == 'm' ||
-                            c == 'n' && text.charAt(j - 1) == 'i') {
-                    text = text.trim();
-                    String unit = text.substring(text.length() - 2);
-                    if (text.matches("\\d+" + unit) && text.charAt(0) != '0') { //$NON-NLS-1$
-                        if (context.isEnabled(IN_MM_ISSUE)) {
-                            context.report(IN_MM_ISSUE, item, context.getLocation(textNode),
-                                String.format("Avoid using \"%1$s\" as units "
-                                        + "(it does not work accurately on all devices); "
-                                        + "use \"dp\" instead", unit), null);
-                        }
-                    }
-                } else if (c == 'p' && (text.charAt(j - 1) == 'd'
-                        || text.charAt(j - 1) == 'i')) { // ends with dp or di
-                    text = text.trim();
-                    String name = item.getAttribute(ATTR_NAME);
-                    if ((name.equals(ATTR_TEXT_SIZE)
-                            || name.equals("android:textSize"))  //$NON-NLS-1$
-                            && text.matches("\\d+di?p")) {  //$NON-NLS-1$
-                        if (context.isEnabled(DP_ISSUE)) {
-                            context.report(DP_ISSUE, item, context.getLocation(textNode),
-                                "Should use \"sp\" instead of \"dp\" for text sizes", null);
-                        }
-                    }
-                } else if (c == 'p' && text.charAt(j - 1) == 's') {
-                    String name = item.getAttribute(ATTR_NAME);
-                    if (ATTR_TEXT_SIZE.equals(name) || ATTR_LAYOUT_HEIGHT.equals(name)) {
-                        text = text.trim();
-                        String unit = text.substring(text.length() - 2);
-                        if (text.matches("\\d+" + unit)) { //$NON-NLS-1$
-                            if (context.isEnabled(SMALL_SP_ISSUE)) {
-                                int size = getSize(text);
-                                if (size > 0 && size < 12) {
-                                    context.report(SMALL_SP_ISSUE, item,
-                                        context.getLocation(textNode), String.format(
-                                                "Avoid using sizes smaller than 12sp: %1$s",
-                                                        text), null);
-                                }
-                            }
-                        }
-                    }
-                }
-                break;
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/RegistrationDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/RegistrationDetector.java
deleted file mode 100644
index c4fd0a7..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/RegistrationDetector.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_APP_ACTIVITY;
-import static com.android.SdkConstants.ANDROID_APP_SERVICE;
-import static com.android.SdkConstants.ANDROID_CONTENT_BROADCAST_RECEIVER;
-import static com.android.SdkConstants.ANDROID_CONTENT_CONTENT_PROVIDER;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_PACKAGE;
-import static com.android.SdkConstants.TAG_ACTIVITY;
-import static com.android.SdkConstants.TAG_PROVIDER;
-import static com.android.SdkConstants.TAG_RECEIVER;
-import static com.android.SdkConstants.TAG_SERVICE;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.ClassNode;
-import org.w3c.dom.Element;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.Map.Entry;
-
-/**
- * Checks for missing manifest registrations for activities, services etc
- * and also makes sure that they are registered with the correct tag
- */
-public class RegistrationDetector extends LayoutDetector implements ClassScanner {
-    /** Unregistered activities and services */
-    public static final Issue ISSUE = Issue.create(
-        "Registered", //$NON-NLS-1$
-        "Ensures that Activities, Services and Content Providers are registered in the manifest",
-
-        "Activities, services and content providers should be registered in the " +
-        "`AndroidManifest.xml` file using `<activity>`, `<service>` and `<provider>` tags.\n" +
-        "\n" +
-        "If your activity is simply a parent class intended to be subclassed by other " +
-        "\"real\" activities, make it an abstract class.",
-
-        Category.CORRECTNESS,
-        6,
-        Severity.WARNING,
-        RegistrationDetector.class,
-        EnumSet.of(Scope.MANIFEST, Scope.CLASS_FILE)).setMoreInfo(
-        "http://developer.android.com/guide/topics/manifest/manifest-intro.html"); //$NON-NLS-1$
-
-    private Multimap<String, String> mManifestRegistrations;
-
-    /** Constructs a new {@link RegistrationDetector} */
-    public RegistrationDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements XmlScanner ----
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(sTags);
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        String fqcn = getFqcn(element);
-        String tag = element.getTagName();
-        String frameworkClass = tagToClass(tag);
-        if (frameworkClass != null) {
-            String signature = ClassContext.getInternalName(fqcn);
-            if (mManifestRegistrations == null) {
-                mManifestRegistrations = ArrayListMultimap.create(4, 8);
-            }
-            mManifestRegistrations.put(frameworkClass, signature);
-            if (signature.indexOf('$') != -1) {
-                // The internal name contains a $ which means it's an inner class.
-                // The conversion from fqcn to internal name is a bit ambiguous:
-                // "a.b.C.D" usually means "inner class D in class C in package a.b".
-                // However, it can (see issue 31592) also mean class D in package "a.b.C".
-                // Place *both* of these possibilities in the registered map, since this
-                // is only used to check that an activity is registered, not the other way
-                // (so it's okay to have entries there that do not correspond to real classes).
-                signature = signature.replace('$', '/');
-                mManifestRegistrations.put(frameworkClass, signature);
-            }
-        }
-    }
-
-    /**
-     * Returns the fully qualified class name for a manifest entry element that
-     * specifies a name attribute
-     *
-     * @param element the element
-     * @return the fully qualified class name
-     */
-    @NonNull
-    private static String getFqcn(@NonNull Element element) {
-        Element root = element.getOwnerDocument().getDocumentElement();
-        String pkg = root.getAttribute(ATTR_PACKAGE);
-        String className = element.getAttributeNS(ANDROID_URI, ATTR_NAME);
-        if (className.startsWith(".")) { //$NON-NLS-1$
-            return pkg + className;
-        } else if (className.indexOf('.') == -1) {
-            // According to the <activity> manifest element documentation, this is not
-            // valid ( http://developer.android.com/guide/topics/manifest/activity-element.html )
-            // but it appears in manifest files and appears to be supported by the runtime
-            // so handle this in code as well:
-            return pkg + '.' + className;
-        } // else: the class name is already a fully qualified class name
-
-        return className;
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @Override
-    public void checkClass(@NonNull ClassContext context, @NonNull ClassNode classNode) {
-        // Abstract classes do not need to be registered
-        if ((classNode.access & Opcodes.ACC_ABSTRACT) != 0) {
-            return;
-        }
-        String curr = classNode.name;
-
-        int lastIndex = curr.lastIndexOf('$');
-        if (lastIndex != -1 && lastIndex < curr.length() - 1) {
-            if (Character.isDigit(curr.charAt(lastIndex+1))) {
-                // Anonymous inner class, doesn't need to be registered
-                return;
-            }
-        }
-
-        while (curr != null) {
-            for (String s : sClasses) {
-                if (curr.equals(s)) {
-                    Collection<String> registered = mManifestRegistrations != null ?
-                            mManifestRegistrations.get(curr) : null;
-                    if (registered == null || !registered.contains(classNode.name)) {
-                        report(context, classNode, curr);
-                    }
-
-                }
-            }
-
-            curr = context.getDriver().getSuperClass(curr);
-        }
-    }
-
-    private void report(ClassContext context, ClassNode classNode, String curr) {
-        String tag = classToTag(curr);
-        String className = ClassContext.createSignature(classNode.name, null, null);
-
-        String wrongClass = null; // The framework class this class actually extends
-        if (mManifestRegistrations != null) {
-            Collection<Entry<String,String>> entries =
-                    mManifestRegistrations.entries();
-            for (Entry<String,String> entry : entries) {
-                if (entry.getValue().equals(classNode.name)) {
-                    wrongClass = entry.getKey();
-                    break;
-                }
-            }
-        }
-        if (wrongClass != null) {
-            Location location = context.getLocation(classNode);
-            context.report(
-                    ISSUE,
-                    location,
-                    String.format(
-                            "%1$s is a <%2$s> but is registered in the manifest as a <%3$s>",
-                            className, tag, classToTag(wrongClass)),
-                    null);
-        } else if (!tag.equals(TAG_RECEIVER)) { // don't need to be registered
-            Location location = context.getLocation(classNode);
-            context.report(
-                    ISSUE,
-                    location,
-                    String.format(
-                            "The <%1$s> %2$s is not registered in the manifest",
-                            tag, className),
-                    null);
-        }
-    }
-
-    /** The manifest tags we care about */
-    private static final String[] sTags = new String[] {
-        TAG_ACTIVITY,
-        TAG_SERVICE,
-        TAG_RECEIVER,
-        TAG_PROVIDER,
-        // Keep synchronized with {@link #sClasses}
-    };
-
-    /** The corresponding framework classes that the tags in {@link #sTags} should extend */
-    private static final String[] sClasses = new String[] {
-            ANDROID_APP_ACTIVITY,
-            ANDROID_APP_SERVICE,
-            ANDROID_CONTENT_BROADCAST_RECEIVER,
-            ANDROID_CONTENT_CONTENT_PROVIDER,
-            // Keep synchronized with {@link #sTags}
-    };
-
-    /** Looks up the corresponding framework class a given manifest tag's class should extend */
-    private static String tagToClass(String tag) {
-        for (int i = 0, n = sTags.length; i < n; i++) {
-            if (sTags[i].equals(tag)) {
-                return sClasses[i];
-            }
-        }
-
-        return null;
-    }
-
-    /** Looks up the tag a given framework class should be registered with */
-    private static String classToTag(String className) {
-        for (int i = 0, n = sClasses.length; i < n; i++) {
-            if (sClasses[i].equals(className)) {
-                return sTags[i];
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/RequiredAttributeDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/RequiredAttributeDetector.java
deleted file mode 100644
index 861c1be..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/RequiredAttributeDetector.java
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME_PREFIX;
-import static com.android.SdkConstants.ANDROID_STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_PARENT;
-import static com.android.SdkConstants.ATTR_STYLE;
-import static com.android.SdkConstants.FD_RES_LAYOUT;
-import static com.android.SdkConstants.FN_RESOURCE_BASE;
-import static com.android.SdkConstants.FQCN_GRID_LAYOUT_V7;
-import static com.android.SdkConstants.GRID_LAYOUT;
-import static com.android.SdkConstants.LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.REQUEST_FOCUS;
-import static com.android.SdkConstants.STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.TABLE_LAYOUT;
-import static com.android.SdkConstants.TABLE_ROW;
-import static com.android.SdkConstants.TAG_ITEM;
-import static com.android.SdkConstants.TAG_STYLE;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-import static com.android.SdkConstants.VIEW_MERGE;
-import static com.android.resources.ResourceFolderType.LAYOUT;
-import static com.android.resources.ResourceFolderType.VALUES;
-import static com.android.tools.lint.detector.api.LintUtils.getLayoutName;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.Expression;
-import lombok.ast.MethodInvocation;
-import lombok.ast.NullLiteral;
-import lombok.ast.Select;
-import lombok.ast.StrictListAccessor;
-import lombok.ast.VariableReference;
-
-/**
- * Ensures that layout width and height attributes are specified
- */
-public class RequiredAttributeDetector extends LayoutDetector implements Detector.JavaScanner {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "RequiredSize", //$NON-NLS-1$
-            "Ensures that the layout_width and layout_height are specified for all views",
-
-            "All views must specify an explicit layout_width and layout_height attribute. " +
-            "There is a runtime check for this, so if you fail to specify a size, an exception " +
-            "is thrown at runtime.\n" +
-            "\n" +
-            "It's possible to specify these widths via styles as well. GridLayout, as a special " +
-            "case, does not require you to specify a size.",
-            Category.CORRECTNESS,
-            4,
-            Severity.ERROR,
-            RequiredAttributeDetector.class,
-            EnumSet.of(Scope.JAVA_FILE, Scope.ALL_RESOURCE_FILES));
-
-    /** Map from each style name to parent style */
-    @Nullable private Map<String, String> mStyleParents;
-
-    /** Set of style names where the style sets the layout width */
-    @Nullable private Set<String> mWidthStyles;
-
-    /** Set of style names where the style sets the layout height */
-    @Nullable private Set<String> mHeightStyles;
-
-    /** Set of layout names for layouts that are included by an {@code <include>} tag
-     * where the width is set on the include */
-    @Nullable private Set<String> mIncludedWidths;
-
-    /** Set of layout names for layouts that are included by an {@code <include>} tag
-     * where the height is set on the include */
-    @Nullable private Set<String> mIncludedHeights;
-
-    /** Set of layout names for layouts that are included by an {@code <include>} tag
-     * where the width is <b>not</b> set on the include */
-    @Nullable private Set<String> mNotIncludedWidths;
-
-    /** Set of layout names for layouts that are included by an {@code <include>} tag
-     * where the height is <b>not</b> set on the include */
-    @Nullable private Set<String> mNotIncludedHeights;
-
-    /** Whether the width was set in a theme definition */
-    private boolean mSetWidthInTheme;
-
-    /** Whether the height was set in a theme definition */
-    private boolean mSetHeightInTheme;
-
-    /** Constructs a new {@link RequiredAttributeDetector} */
-    public RequiredAttributeDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == LAYOUT || folderType == VALUES;
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        // Process checks in two phases:
-        // Phase 1: Gather styles and includes (styles are encountered after the layouts
-        // so we can't do it in a single phase, and includes can be affected by includes from
-        // layouts we haven't seen yet)
-        // Phase 2: Process layouts, using gathered style and include data, and mark layouts
-        // not known.
-        //
-        if (context.getPhase() == 1) {
-            checkSizeSetInTheme();
-
-            context.requestRepeat(this, Scope.RESOURCE_FILE_SCOPE);
-        }
-    }
-
-    private boolean isWidthStyle(String style) {
-        return isSizeStyle(style, mWidthStyles);
-    }
-
-    private boolean isHeightStyle(String style) {
-        return isSizeStyle(style, mHeightStyles);
-    }
-
-    private boolean isSizeStyle(String style, Set<String> sizeStyles) {
-        if (isFrameworkSizeStyle(style)) {
-            return true;
-        }
-        if (sizeStyles == null) {
-            return false;
-        }
-        return isSizeStyle(stripStylePrefix(style), sizeStyles, 0);
-    }
-
-    private static boolean isFrameworkSizeStyle(String style) {
-        // The styles Widget.TextView.ListSeparator (and several theme variations, such as
-        // Widget.Holo.TextView.ListSeparator, Widget.Holo.Light.TextView.ListSeparator, etc)
-        // define layout_width and layout_height.
-        // These are exposed through the listSeparatorTextViewStyle style.
-        if (style.equals("?android:attr/listSeparatorTextViewStyle")      //$NON-NLS-1$
-                || style.equals("?android/listSeparatorTextViewStyle")) { //$NON-NLS-1$
-            return true;
-        }
-
-        // It's also set on Widget.QuickContactBadge and Widget.QuickContactBadgeSmall
-        // These are exposed via a handful of attributes with a common prefix
-        if (style.startsWith("?android:attr/quickContactBadgeStyle")) { //$NON-NLS-1$
-            return true;
-        }
-
-        // Finally, the styles are set on MediaButton and Widget.Holo.Tab (and
-        // Widget.Holo.Light.Tab) but these are not exposed via attributes.
-
-        return false;
-    }
-
-    private boolean isSizeStyle(
-            @NonNull String style,
-            @NonNull Set<String> sizeStyles, int depth) {
-        if (depth == 30) {
-            // Cycle between local and framework attribute style missed
-            // by the fact that we're stripping the distinction between framework
-            // and local styles here
-            return false;
-        }
-
-        assert !style.startsWith(STYLE_RESOURCE_PREFIX)
-                && !style.startsWith(ANDROID_STYLE_RESOURCE_PREFIX);
-
-        if (sizeStyles.contains(style)) {
-            return true;
-        }
-
-        if (mStyleParents != null) {
-            String parentStyle = mStyleParents.get(style);
-            if (parentStyle != null) {
-                parentStyle = stripStylePrefix(parentStyle);
-                if (isSizeStyle(parentStyle, sizeStyles, depth + 1)) {
-                    return true;
-                }
-            }
-        }
-
-        int index = style.lastIndexOf('.');
-        if (index > 0) {
-            return isSizeStyle(style.substring(0, index), sizeStyles, depth + 1);
-        }
-
-        return false;
-    }
-
-    private void checkSizeSetInTheme() {
-        // Look through the styles and determine whether each style is a theme
-        if (mStyleParents == null) {
-            return;
-        }
-
-        Map<String, Boolean> isTheme = Maps.newHashMap();
-        for (String style : mStyleParents.keySet()) {
-            if (isTheme(stripStylePrefix(style), isTheme, 0)) {
-                mSetWidthInTheme = true;
-                mSetHeightInTheme = true;
-                break;
-            }
-        }
-    }
-
-    private boolean isTheme(String style, Map<String, Boolean> isTheme, int depth) {
-        if (depth == 30) {
-            // Cycle between local and framework attribute style missed
-            // by the fact that we're stripping the distinction between framework
-            // and local styles here
-            return false;
-        }
-
-        assert !style.startsWith(STYLE_RESOURCE_PREFIX)
-                && !style.startsWith(ANDROID_STYLE_RESOURCE_PREFIX);
-
-        Boolean known = isTheme.get(style);
-        if (known != null) {
-            return known;
-        }
-
-        if (style.contains("Theme")) { //$NON-NLS-1$
-            isTheme.put(style, true);
-            return true;
-        }
-
-        if (mStyleParents != null) {
-            String parentStyle = mStyleParents.get(style);
-            if (parentStyle != null) {
-                parentStyle = stripStylePrefix(parentStyle);
-                if (isTheme(parentStyle, isTheme, depth + 1)) {
-                    isTheme.put(style, true);
-                    return true;
-                }
-            }
-        }
-
-        int index = style.lastIndexOf('.');
-        if (index > 0) {
-            String parentStyle = style.substring(0, index);
-            boolean result = isTheme(parentStyle, isTheme, depth + 1);
-            isTheme.put(style, result);
-            return result;
-        }
-
-        return false;
-    }
-
-    private static boolean hasLayoutVariations(File file) {
-        File parent = file.getParentFile();
-        if (parent == null) {
-            return false;
-        }
-        File res = file.getParentFile();
-        if (res == null) {
-            return false;
-        }
-        String name = file.getName();
-        File[] folders = res.listFiles();
-        if (folders == null) {
-            return false;
-        }
-        for (File folder : folders) {
-            if (!folder.getName().startsWith(FD_RES_LAYOUT)) {
-                continue;
-            }
-            if (folder.equals(parent)) {
-                continue;
-            }
-            File other = new File(folder, name);
-            if (other.exists()) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private static String stripStylePrefix(@NonNull String style) {
-        if (style.startsWith(STYLE_RESOURCE_PREFIX)) {
-            style = style.substring(STYLE_RESOURCE_PREFIX.length());
-        } else if (style.startsWith(ANDROID_STYLE_RESOURCE_PREFIX)) {
-            style = style.substring(ANDROID_STYLE_RESOURCE_PREFIX.length());
-        }
-
-        return style;
-    }
-
-    private static boolean isRootElement(@NonNull Node node) {
-        return node == node.getOwnerDocument().getDocumentElement();
-    }
-
-    // ---- Implements XmlScanner ----
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return ALL;
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        ResourceFolderType folderType = context.getResourceFolderType();
-        int phase = context.getPhase();
-        if (phase == 1 && folderType == VALUES) {
-            String tag = element.getTagName();
-            if (TAG_STYLE.equals(tag)) {
-                String parent = element.getAttribute(ATTR_PARENT);
-                if (parent != null && !parent.isEmpty()) {
-                    String name = element.getAttribute(ATTR_NAME);
-                    if (name != null && !name.isEmpty()) {
-                        if (mStyleParents == null) {
-                            mStyleParents = Maps.newHashMap();
-                        }
-                        mStyleParents.put(name, parent);
-                    }
-                }
-            } else if (TAG_ITEM.equals(tag)
-                    && TAG_STYLE.equals(element.getParentNode().getNodeName())) {
-                String name = element.getAttribute(ATTR_NAME);
-                if (name.endsWith(ATTR_LAYOUT_WIDTH) &&
-                        name.equals(ANDROID_NS_NAME_PREFIX + ATTR_LAYOUT_WIDTH)) {
-                    if (mWidthStyles == null) {
-                        mWidthStyles = Sets.newHashSet();
-                    }
-                    String styleName = ((Element) element.getParentNode()).getAttribute(ATTR_NAME);
-                    mWidthStyles.add(styleName);
-                }
-                if (name.endsWith(ATTR_LAYOUT_HEIGHT) &&
-                        name.equals(ANDROID_NS_NAME_PREFIX + ATTR_LAYOUT_HEIGHT)) {
-                    if (mHeightStyles == null) {
-                        mHeightStyles = Sets.newHashSet();
-                    }
-                    String styleName = ((Element) element.getParentNode()).getAttribute(ATTR_NAME);
-                    mHeightStyles.add(styleName);
-                }
-            }
-        } else if (folderType == LAYOUT) {
-            if (phase == 1) {
-                // Gather includes
-                if (element.getTagName().equals(VIEW_INCLUDE)) {
-                    String layout = element.getAttribute(ATTR_LAYOUT);
-                    if (layout != null && !layout.isEmpty()) {
-                        recordIncludeWidth(layout,
-                                element.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH));
-                        recordIncludeHeight(layout,
-                                element.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_HEIGHT));
-                    }
-                }
-            } else {
-                assert phase == 2; // Check everything using style data and include data
-                boolean hasWidth = element.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH);
-                boolean hasHeight = element.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_HEIGHT);
-
-                if (mSetWidthInTheme) {
-                    hasWidth = true;
-                }
-
-                if (mSetHeightInTheme) {
-                    hasHeight = true;
-                }
-
-                if (hasWidth && hasHeight) {
-                    return;
-                }
-
-                String tag = element.getTagName();
-                if (VIEW_MERGE.equals(tag)
-                        || VIEW_INCLUDE.equals(tag)
-                        || REQUEST_FOCUS.equals(tag)) {
-                    return;
-                }
-
-                String parentTag = element.getParentNode() != null
-                        ?  element.getParentNode().getNodeName() : "";
-                if (TABLE_LAYOUT.equals(parentTag)
-                        || TABLE_ROW.equals(parentTag)
-                        || GRID_LAYOUT.equals(parentTag)
-                        || FQCN_GRID_LAYOUT_V7.equals(parentTag)) {
-                    return;
-                }
-
-                if (!context.getProject().getReportIssues()) {
-                    // If this is a library project not being analyzed, ignore it
-                    return;
-                }
-
-                boolean certain = true;
-                boolean isRoot = isRootElement(element);
-                if (isRoot || isRootElement(element.getParentNode())
-                        && VIEW_MERGE.equals(parentTag)) {
-                    String name = LAYOUT_RESOURCE_PREFIX + getLayoutName(context.file);
-                    if (!hasWidth && mIncludedWidths != null) {
-                        hasWidth = mIncludedWidths.contains(name);
-                        // If the layout is *also* included in a context where the width
-                        // was not set, we're not certain; it's possible that
-                        if (mNotIncludedWidths != null && mNotIncludedWidths.contains(name)) {
-                            hasWidth = false;
-                            // If we only have a single layout we know that this layout isn't
-                            // always included with layout_width or layout_height set, but
-                            // if there are multiple layouts, it's possible that at runtime
-                            // we only load the size-less layout by the tag which includes
-                            // the size
-                            certain = !hasLayoutVariations(context.file);
-                        }
-                    }
-                    if (!hasHeight && mIncludedHeights != null) {
-                        hasHeight = mIncludedHeights.contains(name);
-                        if (mNotIncludedHeights != null && mNotIncludedHeights.contains(name)) {
-                            hasHeight = false;
-                            certain = !hasLayoutVariations(context.file);
-                        }
-                    }
-                    if (hasWidth && hasHeight) {
-                        return;
-                    }
-                }
-
-                if (!hasWidth || !hasHeight) {
-                    String style = element.getAttribute(ATTR_STYLE);
-                    if (style != null && !style.isEmpty()) {
-                        if (!hasWidth) {
-                            hasWidth = isWidthStyle(style);
-                        }
-                        if (!hasHeight) {
-                            hasHeight = isHeightStyle(style);
-                        }
-                    }
-                    if (hasWidth && hasHeight) {
-                        return;
-                    }
-                }
-
-                String message;
-                if (!(hasWidth || hasHeight)) {
-                    if (certain) {
-                        message = "The required layout_width and layout_height attributes " +
-                                "are missing";
-                    } else {
-                        message = "The required layout_width and layout_height attributes " +
-                                "*may* be missing";
-                    }
-                } else {
-                    String attribute = hasWidth ? ATTR_LAYOUT_HEIGHT : ATTR_LAYOUT_WIDTH;
-                    if (certain) {
-                        message = String.format("The required %1$s attribute is missing",
-                                attribute);
-                    } else {
-                        message = String.format("The required %1$s attribute *may* be missing",
-                                attribute);
-                    }
-                }
-                context.report(ISSUE, element, context.getLocation(element),
-                        message, null);
-            }
-        }
-    }
-
-    private void recordIncludeWidth(String layout, boolean providesWidth) {
-        if (providesWidth) {
-            if (mIncludedWidths == null) {
-                mIncludedWidths = Sets.newHashSet();
-            }
-            mIncludedWidths.add(layout);
-        } else {
-            if (mNotIncludedWidths == null) {
-                mNotIncludedWidths = Sets.newHashSet();
-            }
-            mNotIncludedWidths.add(layout);
-        }
-    }
-
-    private void recordIncludeHeight(String layout, boolean providesHeight) {
-        if (providesHeight) {
-            if (mIncludedHeights == null) {
-                mIncludedHeights = Sets.newHashSet();
-            }
-            mIncludedHeights.add(layout);
-        } else {
-            if (mNotIncludedHeights == null) {
-                mNotIncludedHeights = Sets.newHashSet();
-            }
-            mNotIncludedHeights.add(layout);
-        }
-    }
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    @Nullable
-    public List<String> getApplicableMethodNames() {
-        return Collections.singletonList("inflate"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void visitMethod(
-            @NonNull JavaContext context,
-            @Nullable AstVisitor visitor,
-            @NonNull MethodInvocation call) {
-        // Handle
-        //    View#inflate(Context context, int resource, ViewGroup root)
-        //    LayoutInflater#inflate(int resource, ViewGroup root)
-        //    LayoutInflater#inflate(int resource, ViewGroup root, boolean attachToRoot)
-        StrictListAccessor<Expression, MethodInvocation> args = call.astArguments();
-
-        String layout = null;
-        int index = 0;
-        for (Iterator<Expression> iterator = args.iterator(); iterator.hasNext(); index++) {
-            Expression expression = iterator.next();
-            if (expression instanceof Select) {
-                Select outer = (Select) expression;
-                Expression operand = outer.astOperand();
-                if (operand instanceof Select) {
-                    Select inner = (Select) operand;
-                    if (inner.astOperand() instanceof VariableReference) {
-                        VariableReference reference = (VariableReference) inner.astOperand();
-                        if (FN_RESOURCE_BASE.equals(reference.astIdentifier().astValue())
-                                // TODO: constant
-                                && "layout".equals(inner.astIdentifier().astValue())) {
-                            layout = LAYOUT_RESOURCE_PREFIX + outer.astIdentifier().astValue();
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-
-        if (layout == null) {
-            lombok.ast.Node method = StringFormatDetector.getParentMethod(call);
-            if (method != null) {
-                // Must track local types
-                index = 0;
-                String name = StringFormatDetector.getResourceArg(method, call, index);
-                if (name == null) {
-                    index = 1;
-                    name = StringFormatDetector.getResourceArg(method, call, index);
-                }
-                if (name != null) {
-                    layout = LAYOUT_RESOURCE_PREFIX + name;
-                }
-            }
-            if (layout == null) {
-                // Flow analysis didn't succeed
-                return;
-            }
-        }
-
-        // In all the applicable signatures, the view root argument is immediately after
-        // the layout resource id.
-        int viewRootPos = index + 1;
-        if (viewRootPos < args.size()) {
-            int i = 0;
-            Iterator<Expression> iterator = args.iterator();
-            while (iterator.hasNext() && i < viewRootPos) {
-                iterator.next();
-                i++;
-            }
-            if (iterator.hasNext()) {
-                Expression viewRoot = iterator.next();
-                if (viewRoot instanceof NullLiteral) {
-                    // Yep, this one inflates the given view with a null parent:
-                    // Tag it as such. For now just use the include data structure since
-                    // it has the same net effect
-                    recordIncludeWidth(layout, true);
-                    recordIncludeHeight(layout, true);
-                }
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ScrollViewChildDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ScrollViewChildDetector.java
deleted file mode 100644
index 81bb522..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ScrollViewChildDetector.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.HORIZONTAL_SCROLL_VIEW;
-import static com.android.SdkConstants.SCROLL_VIEW;
-import static com.android.SdkConstants.VALUE_FILL_PARENT;
-import static com.android.SdkConstants.VALUE_MATCH_PARENT;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Check which looks at the children of ScrollViews and ensures that they fill/match
- * the parent width instead of setting wrap_content.
- */
-public class ScrollViewChildDetector extends LayoutDetector {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "ScrollViewSize", //$NON-NLS-1$
-            "Checks that ScrollViews use wrap_content in scrolling dimension",
-            // TODO add a better explanation here!
-            "ScrollView children must set their `layout_width` or `layout_height` attributes " +
-            "to `wrap_content` rather than `fill_parent` or `match_parent` in the scrolling " +
-            "dimension",
-            Category.CORRECTNESS,
-            7,
-            Severity.WARNING,
-            ScrollViewChildDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new {@link ScrollViewChildDetector} */
-    public ScrollViewChildDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                SCROLL_VIEW,
-                HORIZONTAL_SCROLL_VIEW
-        );
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        List<Element> children = LintUtils.getChildren(element);
-        boolean isHorizontal = HORIZONTAL_SCROLL_VIEW.equals(element.getTagName());
-        String attributeName = isHorizontal ? ATTR_LAYOUT_WIDTH : ATTR_LAYOUT_HEIGHT;
-        for (Element child : children) {
-            Attr sizeNode = child.getAttributeNodeNS(ANDROID_URI, attributeName);
-            if (sizeNode == null) {
-                return;
-            }
-            String value = sizeNode.getValue();
-            if (VALUE_FILL_PARENT.equals(value) || VALUE_MATCH_PARENT.equals(value)) {
-                String msg = String.format("This %1$s should use android:%2$s=\"wrap_content\"",
-                        child.getTagName(), attributeName);
-                context.report(ISSUE, sizeNode, context.getLocation(sizeNode), msg,
-                        null);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SdCardDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SdCardDetector.java
deleted file mode 100644
index c876b96..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SdCardDetector.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.Node;
-import lombok.ast.StringLiteral;
-
-/**
- * Looks for hardcoded references to /sdcard/.
- */
-public class SdCardDetector extends Detector implements Detector.JavaScanner {
-    /** Hardcoded /sdcard/ references */
-    public static final Issue ISSUE = Issue.create(
-            "SdCardPath", //$NON-NLS-1$
-            "Looks for hardcoded references to /sdcard",
-
-            "Your code should not reference the `/sdcard` path directly; instead use " +
-            "`Environment.getExternalStorageDirectory().getPath()`.\n" +
-            "\n" +
-            "Similarly, do not reference the `/data/data/` path directly; it can vary " +
-            "in multi-user scenarios. Instead, use " +
-            "`Context.getFilesDir().getPath()`.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.WARNING,
-            SdCardDetector.class,
-            Scope.JAVA_FILE_SCOPE).setMoreInfo(
-            "http://developer.android.com/guide/topics/data/data-storage.html#filesExternal"); //$NON-NLS-1$
-
-    /** Constructs a new {@link SdCardDetector} check */
-    public SdCardDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return true;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    public List<Class<? extends Node>> getApplicableNodeTypes() {
-        return Collections.<Class<? extends Node>>singletonList(StringLiteral.class);
-    }
-
-    @Override
-    public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
-        return new StringChecker(context);
-    }
-
-    private static class StringChecker extends ForwardingAstVisitor {
-        private final JavaContext mContext;
-
-        public StringChecker(JavaContext context) {
-            mContext = context;
-        }
-
-        @Override
-        public boolean visitStringLiteral(StringLiteral node) {
-            String s = node.astValue();
-            if (s.isEmpty()) {
-                return false;
-            }
-            char c = s.charAt(0);
-            if (c != '/' && c != 'f') {
-                return false;
-            }
-
-            if (s.startsWith("/sdcard")                        //$NON-NLS-1$
-                    || s.startsWith("/mnt/sdcard/")            //$NON-NLS-1$
-                    || s.startsWith("/system/media/sdcard")    //$NON-NLS-1$
-                    || s.startsWith("file://sdcard/")          //$NON-NLS-1$
-                    || s.startsWith("file:///sdcard/")) {      //$NON-NLS-1$
-                String message = "Do not hardcode \"/sdcard/\"; " +
-                    "use Environment.getExternalStorageDirectory().getPath() instead";
-                Location location = mContext.getLocation(node);
-                mContext.report(ISSUE, node, location, message, s);
-            } else if (s.startsWith("/data/data/")    //$NON-NLS-1$
-                    || s.startsWith("/data/user/")) { //$NON-NLS-1$
-                String message = "Do not hardcode \"/data/\"; " +
-                        "use Context.getFilesDir().getPath() instead";
-                    Location location = mContext.getLocation(node);
-                    mContext.report(ISSUE, node, location, message, s);
-            }
-
-            return false;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SecureRandomDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SecureRandomDetector.java
deleted file mode 100644
index f1d349b..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SecureRandomDetector.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.InsnList;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.objectweb.asm.tree.analysis.Analyzer;
-import org.objectweb.asm.tree.analysis.AnalyzerException;
-import org.objectweb.asm.tree.analysis.BasicInterpreter;
-import org.objectweb.asm.tree.analysis.BasicValue;
-import org.objectweb.asm.tree.analysis.Frame;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Checks for hardcoded seeds with random numbers.
- */
-public class SecureRandomDetector extends Detector implements ClassScanner {
-    /** Unregistered activities and services */
-    public static final Issue ISSUE = Issue.create(
-        "SecureRandom", //$NON-NLS-1$
-        "Looks for suspicious usage of the SecureRandom class",
-
-        "Specifying a fixed seed will cause the instance to return a predictable sequence " +
-        "of numbers. This may be useful for testing but it is not appropriate for secure use.",
-
-        Category.PERFORMANCE,
-        9,
-        Severity.WARNING,
-        SecureRandomDetector.class,
-        Scope.CLASS_FILE_SCOPE).
-        setMoreInfo("http://developer.android.com/reference/java/security/SecureRandom.html");
-
-    private static final String SET_SEED = "setSeed"; //$NON-NLS-1$
-    private static final String OWNER_SECURE_RANDOM = "java/security/SecureRandom"; //$NON-NLS-1$
-    private static final String OWNER_RANDOM = "java/util/Random"; //$NON-NLS-1$
-    private static final String VM_SECURE_RANDOM = 'L' + OWNER_SECURE_RANDOM + ';';
-    /** Method description for a method that takes a long argument (no return type specified */
-    private static final String LONG_ARG = "(J)"; //$NON-NLS-1$
-
-    /** Constructs a new {@link SecureRandomDetector} */
-    public SecureRandomDetector() {
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @Override
-    @Nullable
-    public List<String> getApplicableCallNames() {
-        return Collections.singletonList(SET_SEED);
-    }
-
-    @Override
-    public void checkCall(@NonNull ClassContext context, @NonNull ClassNode classNode,
-            @NonNull MethodNode method, @NonNull MethodInsnNode call) {
-        String owner = call.owner;
-        String desc = call.desc;
-        if (owner.equals(OWNER_SECURE_RANDOM)) {
-            if (desc.startsWith(LONG_ARG)) {
-                checkValidSetSeed(context, call);
-            } else if (desc.startsWith("([B)")) { //$NON-NLS-1$
-                // setSeed(byte[]) ...
-                // We could do some flow analysis here to see whether the byte array getting
-                // passed in appears to be fixed.
-                // However, people calling this constructor rather than the simpler one
-                // with a fixed integer are probably less likely to make that mistake... right?
-            }
-        } else if (owner.equals(OWNER_RANDOM) && desc.startsWith(LONG_ARG)) {
-            // Called setSeed(long) on an instanceof a Random object. Flag this if the instance
-            // is likely a SecureRandom.
-
-            // Track allocations such that we know whether the type of the call
-            // is on a SecureRandom rather than a Random
-            Analyzer analyzer = new Analyzer(new BasicInterpreter() {
-                @Override
-                public BasicValue newValue(Type type) {
-                    if (type != null && type.getDescriptor().equals(VM_SECURE_RANDOM)) {
-                        return new BasicValue(type);
-                    }
-                    return super.newValue(type);
-                }
-            });
-            try {
-                Frame[] frames = analyzer.analyze(classNode.name, method);
-                InsnList instructions = method.instructions;
-                Frame frame = frames[instructions.indexOf(call)];
-                int stackSlot = frame.getStackSize();
-                for (Type type : Type.getArgumentTypes(desc)) {
-                    stackSlot -= type.getSize();
-                }
-                BasicValue stackValue = (BasicValue) frame.getStack(stackSlot);
-                Type type = stackValue.getType();
-                if (type != null && type.getDescriptor().equals(VM_SECURE_RANDOM)) {
-                    checkValidSetSeed(context, call);
-                }
-            } catch (AnalyzerException e) {
-                context.log(e, null);
-            }
-        } else if (owner.equals(OWNER_RANDOM) && desc.startsWith(LONG_ARG)) {
-            // Called setSeed(long) on an instanceof a Random object. Flag this if the instance
-            // is likely a SecureRandom.
-            // TODO
-        }
-    }
-
-    private static void checkValidSetSeed(ClassContext context, MethodInsnNode call) {
-        assert call.name.equals(SET_SEED);
-
-        // Make sure the argument passed is not a literal
-        AbstractInsnNode prev = LintUtils.getPrevInstruction(call);
-        if (prev == null) {
-            return;
-        }
-        int opcode = prev.getOpcode();
-        if (opcode == Opcodes.LCONST_0 || opcode == Opcodes.LCONST_1 || opcode == Opcodes.LDC) {
-            context.report(ISSUE, context.getLocation(call),
-                    "Do not call setSeed() on a SecureRandom with a fixed seed: " +
-                    "it is not secure. Use getSeed().",
-                    null);
-        } else if (opcode == Opcodes.INVOKESTATIC) {
-            String methodName = ((MethodInsnNode) prev).name;
-            if (methodName.equals("currentTimeMillis") || methodName.equals("nanoTime")) {
-                context.report(ISSUE, context.getLocation(call),
-                        "It is dangerous to seed SecureRandom with the current time because " +
-                        "that value is more predictable to an attacker than the default seed.",
-                        null);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SecurityDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SecurityDetector.java
deleted file mode 100644
index b6cc957..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SecurityDetector.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_MANIFEST_XML;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_EXPORTED;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_PATH;
-import static com.android.SdkConstants.ATTR_PATH_PATTERN;
-import static com.android.SdkConstants.ATTR_PATH_PREFIX;
-import static com.android.SdkConstants.ATTR_PERMISSION;
-import static com.android.SdkConstants.ATTR_READ_PERMISSION;
-import static com.android.SdkConstants.ATTR_WRITE_PERMISSION;
-import static com.android.SdkConstants.TAG_ACTIVITY;
-import static com.android.SdkConstants.TAG_APPLICATION;
-import static com.android.SdkConstants.TAG_GRANT_PERMISSION;
-import static com.android.SdkConstants.TAG_INTENT_FILTER;
-import static com.android.SdkConstants.TAG_PATH_PERMISSION;
-import static com.android.SdkConstants.TAG_PROVIDER;
-import static com.android.SdkConstants.TAG_RECEIVER;
-import static com.android.SdkConstants.TAG_SERVICE;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.Expression;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.Identifier;
-import lombok.ast.MethodInvocation;
-import lombok.ast.StrictListAccessor;
-
-/**
- * Checks that exported services request a permission.
- */
-public class SecurityDetector extends Detector implements Detector.XmlScanner,
-        Detector.JavaScanner {
-
-    /** Exported services */
-    public static final Issue EXPORTED_SERVICE = Issue.create(
-            "ExportedService", //$NON-NLS-1$
-            "Checks for exported services that do not require permissions",
-            "Exported services (services which either set `exported=true` or contain " +
-            "an intent-filter and do not specify `exported=false`) should define a " +
-            "permission that an entity must have in order to launch the service " +
-            "or bind to it. Without this, any application can use this service.",
-            Category.SECURITY,
-            5,
-            Severity.WARNING,
-            SecurityDetector.class,
-            Scope.MANIFEST_SCOPE);
-
-    /** Exported content providers */
-    public static final Issue EXPORTED_PROVIDER = Issue.create(
-            "ExportedContentProvider", //$NON-NLS-1$
-            "Checks for exported content providers that do not require permissions",
-            "Content providers are exported by default and any application on the " +
-            "system can potentially use them to read and write data. If the content " +
-            "provider provides access to sensitive data, it should be protected by " +
-            "specifying `export=false` in the manifest or by protecting it with a " +
-            "permission that can be granted to other applications.",
-            Category.SECURITY,
-            5,
-            Severity.WARNING,
-            SecurityDetector.class,
-            Scope.MANIFEST_SCOPE);
-
-    /** Exported receivers */
-    public static final Issue EXPORTED_RECEIVER = Issue.create(
-            "ExportedReceiver", //$NON-NLS-1$
-            "Checks for exported receivers that do not require permissions",
-            "Exported receivers (receivers which either set `exported=true` or contain " +
-            "an intent-filter and do not specify `exported=false`) should define a " +
-            "permission that an entity must have in order to launch the receiver " +
-            "or bind to it. Without this, any application can use this receiver.",
-            Category.SECURITY,
-            5,
-            Severity.WARNING,
-            SecurityDetector.class,
-            Scope.MANIFEST_SCOPE);
-
-    /** Content provides which grant all URIs access */
-    public static final Issue OPEN_PROVIDER = Issue.create(
-            "GrantAllUris", //$NON-NLS-1$
-            "Checks for <grant-uri-permission> elements where everything is shared",
-            "The `<grant-uri-permission>` element allows specific paths to be shared. " +
-            "This detector checks for a path URL of just '/' (everything), which is " +
-            "probably not what you want; you should limit access to a subset.",
-            Category.SECURITY,
-            7,
-            Severity.WARNING,
-            SecurityDetector.class,
-            Scope.MANIFEST_SCOPE);
-
-    /** Using the world-writable flag */
-    public static final Issue WORLD_WRITEABLE = Issue.create(
-            "WorldWriteableFiles", //$NON-NLS-1$
-            "Checks for openFileOutput() and getSharedPreferences() calls passing " +
-            "MODE_WORLD_WRITEABLE",
-            "There are cases where it is appropriate for an application to write " +
-            "world writeable files, but these should be reviewed carefully to " +
-            "ensure that they contain no private data, and that if the file is " +
-            "modified by a malicious application it does not trick or compromise " +
-            "your application.",
-            Category.SECURITY,
-            4,
-            Severity.WARNING,
-            SecurityDetector.class,
-            Scope.JAVA_FILE_SCOPE);
-
-
-    /** Using the world-readable flag */
-    public static final Issue WORLD_READABLE = Issue.create(
-            "WorldReadableFiles", //$NON-NLS-1$
-            "Checks for openFileOutput() and getSharedPreferences() calls passing " +
-            "MODE_WORLD_READABLE",
-            "There are cases where it is appropriate for an application to write " +
-            "world readable files, but these should be reviewed carefully to " +
-            "ensure that they contain no private data that is leaked to other " +
-            "applications.",
-            Category.SECURITY,
-            4,
-            Severity.WARNING,
-            SecurityDetector.class,
-            Scope.JAVA_FILE_SCOPE);
-
-    /** Constructs a new {@link SecurityDetector} check */
-    public SecurityDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return file.getName().equals(ANDROID_MANIFEST_XML);
-    }
-
-    // ---- Implements Detector.XmlScanner ----
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-            TAG_SERVICE,
-            TAG_GRANT_PERMISSION,
-            TAG_PROVIDER,
-            TAG_ACTIVITY,
-            TAG_RECEIVER
-        );
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        String tag = element.getTagName();
-        if (tag.equals(TAG_SERVICE)) {
-            checkService(context, element);
-        } else if (tag.equals(TAG_GRANT_PERMISSION)) {
-            checkGrantPermission(context, element);
-        } else if (tag.equals(TAG_PROVIDER)) {
-            checkProvider(context, element);
-        } else if (tag.equals(TAG_RECEIVER)) {
-            checkReceiver(context, element);
-        }
-    }
-
-    private static boolean getExported(Element element) {
-        // Used to check whether an activity, service or broadcast receiver is exported.
-        String exportValue = element.getAttributeNS(ANDROID_URI, ATTR_EXPORTED);
-        if (exportValue != null && !exportValue.isEmpty()) {
-            return Boolean.valueOf(exportValue);
-        } else {
-            for (Element child : LintUtils.getChildren(element)) {
-                if (child.getTagName().equals(TAG_INTENT_FILTER)) {
-                    return true;
-                }
-            }
-        }
-
-      return false;
-    }
-
-    private static boolean isUnprotectedByPermission(Element element) {
-        // Used to check whether an activity, service or broadcast receiver are
-        // protected by a permission.
-        String permission = element.getAttributeNS(ANDROID_URI, ATTR_PERMISSION);
-        if (permission == null || permission.isEmpty()) {
-            Node parent = element.getParentNode();
-            if (parent.getNodeType() == Node.ELEMENT_NODE
-                    && parent.getNodeName().equals(TAG_APPLICATION)) {
-                Element application = (Element) parent;
-                permission = application.getAttributeNS(ANDROID_URI, ATTR_PERMISSION);
-                return permission == null || permission.isEmpty();
-            }
-        }
-
-        return false;
-    }
-
-    private static boolean isLauncher(Element element) {
-        // Checks whether an element is a launcher activity.
-        for (Element child : LintUtils.getChildren(element)) {
-            if (child.getTagName().equals(TAG_INTENT_FILTER)) {
-                for (Element innerChild: LintUtils.getChildren(child)) {
-                    if (innerChild.getTagName().equals("category")) { //$NON-NLS-1$
-                        String categoryString = innerChild.getAttributeNS(ANDROID_URI, ATTR_NAME);
-                        return "android.intent.category.LAUNCHER".equals(categoryString); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-
-        return false;
-    }
-
-    private static boolean isStandardReceiver(Element element) {
-      // Checks whether a broadcast receiver receives a standard Android action
-        for (Element child : LintUtils.getChildren(element)) {
-            if (child.getTagName().equals(TAG_INTENT_FILTER)) {
-                for (Element innerChild : LintUtils.getChildren(child)) {
-                    if (innerChild.getTagName().equals("action")) { //$NON-NLS-1$
-                        String categoryString = innerChild.getAttributeNS(ANDROID_URI, ATTR_NAME);
-                        return categoryString.startsWith("android."); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    private static void checkReceiver(XmlContext context, Element element) {
-        if (getExported(element) && isUnprotectedByPermission(element) &&
-            !isStandardReceiver(element)) {
-            // No declared permission for this exported receiver: complain
-            context.report(EXPORTED_RECEIVER, element, context.getLocation(element),
-                           "Exported receiver does not require permission", null);
-        }
-    }
-
-    private static void checkService(XmlContext context, Element element) {
-        if (getExported(element) && isUnprotectedByPermission(element)) {
-            // No declared permission for this exported service: complain
-            context.report(EXPORTED_SERVICE, element, context.getLocation(element),
-                           "Exported service does not require permission", null);
-        }
-    }
-
-    private static void checkGrantPermission(XmlContext context, Element element) {
-        Attr path = element.getAttributeNodeNS(ANDROID_URI, ATTR_PATH);
-        Attr prefix = element.getAttributeNodeNS(ANDROID_URI, ATTR_PATH_PREFIX);
-        Attr pattern = element.getAttributeNodeNS(ANDROID_URI, ATTR_PATH_PATTERN);
-
-        String msg = "Content provider shares everything; this is potentially dangerous.";
-        if (path != null && path.getValue().equals("/")) { //$NON-NLS-1$
-            context.report(OPEN_PROVIDER, path, context.getLocation(path), msg, null);
-        }
-        if (prefix != null && prefix.getValue().equals("/")) { //$NON-NLS-1$
-            context.report(OPEN_PROVIDER, prefix, context.getLocation(prefix), msg, null);
-        }
-        if (pattern != null && (pattern.getValue().equals("/")  //$NON-NLS-1$
-               /* || pattern.getValue().equals(".*")*/)) {
-            context.report(OPEN_PROVIDER, pattern, context.getLocation(pattern), msg, null);
-        }
-    }
-
-    private static void checkProvider(XmlContext context, Element element) {
-        String exportValue = element.getAttributeNS(ANDROID_URI, ATTR_EXPORTED);
-        // Content providers are exported by default
-        boolean exported = true;
-        if (exportValue != null && !exportValue.isEmpty()) {
-            exported = Boolean.valueOf(exportValue);
-        }
-
-        if (exported) {
-            // Just check for some use of permissions. Other Lint checks can check the saneness
-            // of the permissions. We'll accept the permission, readPermission, or writePermission
-            // attributes on the provider element, or a path-permission element.
-            String permission = element.getAttributeNS(ANDROID_URI, ATTR_READ_PERMISSION);
-            if (permission == null || permission.isEmpty()) {
-                permission = element.getAttributeNS(ANDROID_URI, ATTR_WRITE_PERMISSION);
-                if (permission == null || permission.isEmpty()) {
-                    permission = element.getAttributeNS(ANDROID_URI, ATTR_PERMISSION);
-                    if (permission == null || permission.isEmpty()) {
-                        // No permission attributes? Check for path-permission.
-
-                        // TODO: Add a Lint check to ensure the path-permission is good, similar to
-                        // the grant-uri-permission check.
-                        boolean hasPermission = false;
-                        for (Element child : LintUtils.getChildren(element)) {
-                            String tag = child.getTagName();
-                            if (tag.equals(TAG_PATH_PERMISSION)) {
-                                hasPermission = true;
-                                break;
-                            }
-                        }
-
-                        if (!hasPermission) {
-                            context.report(EXPORTED_PROVIDER, element,
-                                    context.getLocation(element),
-                                    "Exported content providers can provide access to " +
-                                            "potentially sensitive data",
-                                    null);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    // ---- Implements Detector.JavaScanner ----
-
-    @Override
-    public List<String> getApplicableMethodNames() {
-        // These are the API calls that can accept a MODE_WORLD_READABLE/MODE_WORLD_WRITABLE
-        // argument.
-        List<String> values = new ArrayList<String>(2);
-        values.add("openFileOutput"); //$NON-NLS-1$
-        values.add("getSharedPreferences"); //$NON-NLS-1$
-        return values;
-    }
-
-    @Override
-    public void visitMethod(@NonNull JavaContext context, @Nullable AstVisitor visitor,
-            @NonNull MethodInvocation node) {
-        StrictListAccessor<Expression,MethodInvocation> args = node.astArguments();
-        Iterator<Expression> iterator = args.iterator();
-        while (iterator.hasNext()) {
-            iterator.next().accept(visitor);
-        }
-    }
-
-    @Override
-    public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
-        return new IdentifierVisitor(context);
-    }
-
-    private static class IdentifierVisitor extends ForwardingAstVisitor {
-        private final JavaContext mContext;
-
-        public IdentifierVisitor(JavaContext context) {
-            super();
-            mContext = context;
-        }
-
-        @Override
-        public boolean visitIdentifier(Identifier node) {
-            if ("MODE_WORLD_WRITEABLE".equals(node.getDescription())) { //$NON-NLS-1$
-                Location location = mContext.getLocation(node);
-                mContext.report(WORLD_WRITEABLE, node, location,
-                        "Using MODE_WORLD_WRITEABLE when creating files can be " +
-                                "risky, review carefully",
-                        null);
-            } else if ("MODE_WORLD_READABLE".equals(node.getDescription())) { //$NON-NLS-1$
-                Location location = mContext.getLocation(node);
-                mContext.report(WORLD_READABLE, node, location,
-                        "Using MODE_WORLD_READABLE when creating files can be " +
-                                "risky, review carefully",
-                        null);
-            }
-
-            return false;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SetJavaScriptEnabledDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SetJavaScriptEnabledDetector.java
deleted file mode 100644
index 4b4ba01..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SetJavaScriptEnabledDetector.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-
-import java.util.Collections;
-import java.util.List;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.MethodInvocation;
-
-/**
- * Looks for invocations of android.webkit.WebSettings.setJavaScriptEnabled.
- */
-public class SetJavaScriptEnabledDetector extends Detector implements Detector.JavaScanner {
-    /** Invocations of setJavaScriptEnabled */
-    public static final Issue ISSUE = Issue.create("SetJavaScriptEnabled", //$NON-NLS-1$
-            "Looks for invocations of android.webkit.WebSettings.setJavaScriptEnabled",
-
-            "Your code should not invoke `setJavaScriptEnabled` if you are not sure that " +
-            "your app really requires JavaScript support.",
-
-            Category.SECURITY,
-            6,
-            Severity.WARNING,
-            SetJavaScriptEnabledDetector.class,
-            Scope.JAVA_FILE_SCOPE).setMoreInfo(
-            "http://developer.android.com/guide/practices/security.html"); //$NON-NLS-1$
-
-    /** Constructs a new {@link SetJavaScriptEnabledDetector} check */
-    public SetJavaScriptEnabledDetector() {
-    }
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    public void visitMethod(@NonNull JavaContext context, @Nullable AstVisitor visitor,
-            @NonNull MethodInvocation node) {
-        if (node.astArguments().size() == 1
-                && !node.astArguments().first().toString().equals("false")) { //$NON-NLS-1$
-            context.report(ISSUE, node, context.getLocation(node),
-                    "Using setJavaScriptEnabled can introduce XSS vulnerabilities " +
-                            "into you application, review carefully.",
-                    null);
-        }
-    }
-
-    @Override
-    public List<String> getApplicableMethodNames() {
-        return Collections.singletonList("setJavaScriptEnabled");
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SharedPrefsDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SharedPrefsDetector.java
deleted file mode 100644
index 76887a5..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SharedPrefsDetector.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.ConstructorDeclaration;
-import lombok.ast.Expression;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.MethodDeclaration;
-import lombok.ast.MethodInvocation;
-import lombok.ast.Node;
-import lombok.ast.NormalTypeBody;
-import lombok.ast.Return;
-import lombok.ast.VariableDeclaration;
-import lombok.ast.VariableDefinition;
-import lombok.ast.VariableReference;
-
-/**
- * Detector looking for SharedPreferences.edit() calls without a corresponding
- * commit() or apply() call
- */
-public class SharedPrefsDetector extends Detector implements Detector.JavaScanner {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "CommitPrefEdits", //$NON-NLS-1$
-            "Looks for code editing a SharedPreference but forgetting to call commit() on it",
-
-            "After calling `edit()` on a `SharedPreference`, you must call `commit()` " +
-            "or `apply()` on the editor to save the results.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.WARNING,
-            SharedPrefsDetector.class,
-            Scope.JAVA_FILE_SCOPE);
-
-    /** Constructs a new {@link SharedPrefsDetector} check */
-    public SharedPrefsDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return true;
-    }
-
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    public List<String> getApplicableMethodNames() {
-        return Collections.singletonList("edit"); //$NON-NLS-1$
-    }
-
-    @Nullable
-    private static NormalTypeBody findSurroundingTypeBody(Node scope) {
-        while (scope != null) {
-            Class<? extends Node> type = scope.getClass();
-            // The Lombok AST uses a flat hierarchy of node type implementation classes
-            // so no need to do instanceof stuff here.
-            if (type == NormalTypeBody.class) {
-                return (NormalTypeBody) scope;
-            }
-
-            scope = scope.getParent();
-        }
-
-        return null;
-    }
-
-
-    @Override
-    public void visitMethod(@NonNull JavaContext context, @Nullable AstVisitor visitor,
-            @NonNull MethodInvocation node) {
-        assert node.astName().astValue().equals("edit");
-        Expression operand = node.astOperand();
-        if (operand == null) {
-            return;
-        }
-
-        // Looking for the specific pattern where you assign the edit() result
-        // to a local variable; this means we won't recognize some other usages
-        // of the API (e.g. assigning it to a previously declared variable) but
-        // is needed until we have type attribution in the AST itself.
-        Node parent = node.getParent();
-        VariableDefinition definition = getLhs(parent);
-        boolean allowCommitBeforeTarget;
-        if (definition == null) {
-            if (operand instanceof VariableReference) {
-                NormalTypeBody body = findSurroundingTypeBody(parent);
-                if (body == null) {
-                    return;
-                }
-                String variableName = ((VariableReference) operand).astIdentifier().astValue();
-                String type = getFieldType(body, variableName);
-                if (type == null || !type.equals("SharedPreferences")) { //$NON-NLS-1$
-                    return;
-                }
-                allowCommitBeforeTarget = true;
-            } else {
-                return;
-            }
-        } else {
-            String type = definition.astTypeReference().toString();
-            if (!type.endsWith("SharedPreferences.Editor")) {                   //$NON-NLS-1$
-                if (!type.equals("Editor") ||                                   //$NON-NLS-1$
-                        !LintUtils.isImported(context.compilationUnit,
-                                "android.content.SharedPreferences.Editor")) {  //$NON-NLS-1$
-                    return;
-                }
-            }
-            allowCommitBeforeTarget = false;
-        }
-
-        Node method = JavaContext.findSurroundingMethod(parent);
-        if (method == null) {
-            return;
-        }
-
-        CommitFinder finder = new CommitFinder(node, allowCommitBeforeTarget);
-        method.accept(finder);
-        if (!finder.isCommitCalled()) {
-            context.report(ISSUE, method, context.getLocation(node),
-                    "SharedPreferences.edit() without a corresponding commit() or apply() call",
-                    null);
-        }
-    }
-
-    @Nullable
-    private static String getFieldType(@NonNull NormalTypeBody cls, @NonNull String name) {
-        List<Node> children = cls.getChildren();
-        for (Node child : children) {
-            if (child.getClass() == VariableDeclaration.class) {
-                VariableDeclaration declaration = (VariableDeclaration) child;
-                VariableDefinition definition = declaration.astDefinition();
-                return definition.astTypeReference().toString();
-            }
-        }
-
-        return null;
-    }
-
-    @Nullable
-    private static VariableDefinition getLhs(@NonNull Node node) {
-        while (node != null) {
-            Class<? extends Node> type = node.getClass();
-            // The Lombok AST uses a flat hierarchy of node type implementation classes
-            // so no need to do instanceof stuff here.
-            if (type == MethodDeclaration.class || type == ConstructorDeclaration.class) {
-                return null;
-            }
-            if (type == VariableDefinition.class) {
-                return (VariableDefinition) node;
-            }
-
-            node = node.getParent();
-        }
-
-        return null;
-    }
-
-    private static class CommitFinder extends ForwardingAstVisitor {
-        /** The target edit call */
-        private final MethodInvocation mTarget;
-        /** whether it allows the commit call to be seen before the target node */
-        private final boolean mAllowCommitBeforeTarget;
-        /** Whether we've found one of the commit/cancel methods */
-        private boolean mFound;
-        /** Whether we've seen the target edit node yet */
-        private boolean mSeenTarget;
-
-        private CommitFinder(MethodInvocation target, boolean allowCommitBeforeTarget) {
-            mTarget = target;
-            mAllowCommitBeforeTarget = allowCommitBeforeTarget;
-        }
-
-        @Override
-        public boolean visitMethodInvocation(MethodInvocation node) {
-            if (node == mTarget) {
-                mSeenTarget = true;
-            } else if (mAllowCommitBeforeTarget || mSeenTarget || node.astOperand() == mTarget) {
-                String name = node.astName().astValue();
-                if ("commit".equals(name) || "apply".equals(name)) { //$NON-NLS-1$ //$NON-NLS-2$
-                    // TODO: Do more flow analysis to see whether we're really calling commit/apply
-                    // on the right type of object?
-                    mFound = true;
-                }
-            }
-
-            return super.visitMethodInvocation(node);
-        }
-
-        @Override
-        public boolean visitReturn(Return node) {
-            if (node.astValue() == mTarget) {
-                // If you just do "return editor.commit() don't warn
-                mFound = true;
-            }
-            return super.visitReturn(node);
-        }
-
-        boolean isCommitCalled() {
-            return mFound;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/StateListDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/StateListDetector.java
deleted file mode 100644
index c0dea30..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/StateListDetector.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Checks for unreachable states in an Android state list definition
- */
-public class StateListDetector extends ResourceXmlDetector {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "StateListReachable", //$NON-NLS-1$
-            "Looks for unreachable states in a <selector>",
-            "In a selector, only the last child in the state list should omit a " +
-            "state qualifier. If not, all subsequent items in the list will be ignored " +
-            "since the given item will match all.",
-            Category.CORRECTNESS,
-            5,
-            Severity.WARNING,
-            StateListDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    private static final String STATE_PREFIX = "state_"; //$NON-NLS-1$
-
-    /** Constructs a new {@link StateListDetector} */
-    public StateListDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.DRAWABLE;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public void visitDocument(@NonNull XmlContext context, @NonNull Document document) {
-        // TODO: Look for views that don't specify
-        // Display the error token somewhere so it can be suppressed
-        // Emit warning at the end "run with --help to learn how to suppress types of errors/checks";
-        // ("...and this message.")
-
-        Element root = document.getDocumentElement();
-        if (root != null && root.getTagName().equals("selector")) { //$NON-NLS-1$
-            List<Element> children = LintUtils.getChildren(root);
-            Map<Element, Set<String>> states =
-                    new HashMap<Element, Set<String>>(children.size());
-
-            for (int i = 0; i < children.size(); i++) {
-                Element child = children.get(i);
-                NamedNodeMap attributes = child.getAttributes();
-                Set<String> stateNames = new HashSet<String>(attributes.getLength());
-                states.put(child, stateNames);
-
-                for (int j = 0; j < attributes.getLength(); j++) {
-                    Attr attribute = (Attr) attributes.item(j);
-                    String name = attribute.getLocalName();
-                    if (name == null) {
-                        continue;
-                    }
-                    if (name.startsWith(STATE_PREFIX)) {
-                        stateNames.add(name + '=' + attribute.getValue());
-                    } else {
-                        String namespaceUri = attribute.getNamespaceURI();
-                        if (namespaceUri != null && !namespaceUri.isEmpty() &&
-                                !ANDROID_URI.equals(namespaceUri)) {
-                            // There is a custom attribute on this item.
-                            // This could be a state, see
-                            //   http://code.google.com/p/android/issues/detail?id=22339
-                            // so don't flag this one.
-                            stateNames.add(attribute.getName() + '=' + attribute.getValue());
-                        }
-                    }
-                }
-            }
-
-            // See if for each state, any subsequent state fully contains all the same
-            // state requirements
-
-            for (int i = 0; i < children.size() - 1; i++) {
-                Element prev = children.get(i);
-                Set<String> prevStates = states.get(prev);
-                assert prevStates != null : prev;
-                for (int j = i + 1; j < children.size(); j++) {
-                    Element current = children.get(j);
-                    Set<String> currentStates = states.get(current);
-                    assert currentStates != null : current;
-                    if (currentStates.containsAll(prevStates)) {
-                        Location location = context.getLocation(current);
-                        Location secondary = context.getLocation(prev);
-                        secondary.setMessage("Earlier item which masks item");
-                        location.setSecondary(secondary);
-                        context.report(ISSUE, current, location, String.format(
-                                "This item is unreachable because a previous item (item #%1$d) is a more general match than this one",
-                                i + 1),  null);
-                        // Don't keep reporting errors for all the remaining cases in this file
-                        return;
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/StringFormatDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/StringFormatDetector.java
deleted file mode 100644
index 7bb07f2..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/StringFormatDetector.java
+++ /dev/null
@@ -1,1304 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.DOT_JAVA;
-import static com.android.SdkConstants.FORMAT_METHOD;
-import static com.android.SdkConstants.GET_STRING_METHOD;
-import static com.android.SdkConstants.TAG_STRING;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.client.api.IJavaParser;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Location.Handle;
-import com.android.tools.lint.detector.api.Position;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.android.utils.Pair;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.Formatter;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.CharLiteral;
-import lombok.ast.ConstructorDeclaration;
-import lombok.ast.ConstructorInvocation;
-import lombok.ast.Expression;
-import lombok.ast.FloatingPointLiteral;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.IntegralLiteral;
-import lombok.ast.MethodDeclaration;
-import lombok.ast.MethodInvocation;
-import lombok.ast.NullLiteral;
-import lombok.ast.Select;
-import lombok.ast.StrictListAccessor;
-import lombok.ast.StringLiteral;
-import lombok.ast.VariableDefinitionEntry;
-import lombok.ast.VariableReference;
-
-/**
- * Check which looks for problems with formatting strings such as inconsistencies between
- * translations or between string declaration and string usage in Java.
- * <p>
- * TODO: Handle Resources.getQuantityString as well
- */
-public class StringFormatDetector extends ResourceXmlDetector implements Detector.JavaScanner {
-    /** Whether formatting strings are invalid */
-    public static final Issue INVALID = Issue.create(
-            "StringFormatInvalid", //$NON-NLS-1$
-            "Checks that format strings are valid",
-
-            "If a string contains a '%' character, then the string may be a formatting string " +
-            "which will be passed to `String.format` from Java code to replace each '%' " +
-            "occurrence with specific values.\n" +
-            "\n" +
-            "This lint warning checks for two related problems:\n" +
-            "(1) Formatting strings that are invalid, meaning that `String.format` will throw " +
-            "exceptions at runtime when attempting to use the format string.\n" +
-            "(2) Strings containing '%' that are not formatting strings getting passed to " +
-            "a `String.format` call. In this case the '%' will need to be escaped as '%%'.\n" +
-            "\n" +
-            "NOTE: Not all Strings which look like formatting strings are intended for " +
-            "use by `String.format`; for example, they may contain date formats intended " +
-            "for `android.text.format.Time#format()`. Lint cannot always figure out that " +
-            "a String is a date format, so you may get false warnings in those scenarios. " +
-            "See the suppress help topic for information on how to suppress errors in " +
-            "that case.",
-
-            Category.MESSAGES,
-            9,
-            Severity.ERROR,
-            StringFormatDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    /** Whether formatting argument types are consistent across translations */
-    public static final Issue ARG_COUNT = Issue.create(
-            "StringFormatCount", //$NON-NLS-1$
-            "Ensures that all format strings are used and that the same number is defined "
-                + "across translations",
-
-            "When a formatted string takes arguments, it usually needs to reference the " +
-            "same arguments in all translations. There are cases where this is not the case, " +
-            "so this issue is a warning rather than an error by default. However, this usually " +
-            "happens when a language is not translated or updated correctly.",
-            Category.MESSAGES,
-            5,
-            Severity.WARNING,
-            StringFormatDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    /** Whether the string format supplied in a call to String.format matches the format string */
-    public static final Issue ARG_TYPES = Issue.create(
-            "StringFormatMatches", //$NON-NLS-1$
-            "Ensures that the format used in <string> definitions is compatible with the "
-                + "String.format call",
-
-            "This lint check ensures the following:\n" +
-            "(1) If there are multiple translations of the format string, then all translations " +
-            "use the same type for the same numbered arguments\n" +
-            "(2) The usage of the format string in Java is consistent with the format string, " +
-            "meaning that the parameter types passed to String.format matches those in the " +
-            "format string.",
-            Category.MESSAGES,
-            9,
-            Severity.ERROR,
-            StringFormatDetector.class,
-            EnumSet.of(Scope.ALL_RESOURCE_FILES, Scope.JAVA_FILE));
-
-    /**
-     * Map from a format string name to a list of declaration file and actual
-     * formatting string content. We're using a list since a format string can be
-     * defined multiple times, usually for different translations.
-     */
-    private Map<String, List<Pair<Handle, String>>> mFormatStrings;
-
-    /**
-     * Map of strings that contain percents that aren't formatting strings; these
-     * should not be passed to String.format.
-     */
-    private final Map<String, Handle> mNotFormatStrings = new HashMap<String, Handle>();
-
-    /**
-     * Set of strings that have an unknown format such as date formatting; we should not
-     * flag these as invalid when used from a String#format call
-     */
-    private Set<String> mIgnoreStrings;
-
-    /** Constructs a new {@link StringFormatDetector} check */
-    public StringFormatDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.VALUES;
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        if (LintUtils.endsWith(file.getName(), DOT_JAVA)) {
-            return mFormatStrings != null;
-        }
-
-        return super.appliesTo(context, file);
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(TAG_STRING);
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        NodeList childNodes = element.getChildNodes();
-        if (childNodes.getLength() > 0) {
-            if (childNodes.getLength() == 1) {
-                Node child = childNodes.item(0);
-                if (child.getNodeType() == Node.TEXT_NODE) {
-                    checkTextNode(context, element, strip(child.getNodeValue()));
-                }
-            } else {
-                // Concatenate children and build up a plain string.
-                // This is needed to handle xliff localization documents,
-                // but this needs more work so ignore compound XML documents as
-                // string values for now:
-                //StringBuilder sb = new StringBuilder();
-                //addText(sb, element);
-                //if (sb.length() > 0) {
-                //    checkTextNode(context, element, sb.toString());
-                //}
-            }
-        }
-    }
-
-    //private static void addText(StringBuilder sb, Node node) {
-    //    if (node.getNodeType() == Node.TEXT_NODE) {
-    //        sb.append(strip(node.getNodeValue().trim()));
-    //    } else {
-    //        NodeList childNodes = node.getChildNodes();
-    //        for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-    //            addText(sb, childNodes.item(i));
-    //        }
-    //    }
-    //}
-
-    private static String strip(String s) {
-        if (s.length() < 2) {
-            return s;
-        }
-        char first = s.charAt(0);
-        char last = s.charAt(s.length() - 1);
-        if (first == last && (first == '\'' || first == '"')) {
-            return s.substring(1, s.length() - 1);
-        }
-
-        return s;
-    }
-
-    private void checkTextNode(XmlContext context, Element element, String text) {
-        String name = null;
-        boolean found = false;
-
-        // Look at the String and see if it's a format string (contains
-        // positional %'s)
-        for (int j = 0, m = text.length(); j < m; j++) {
-            char c = text.charAt(j);
-            if (c == '\\') {
-                j++;
-            }
-            if (c == '%') {
-                if (name == null) {
-                    name = element.getAttribute(ATTR_NAME);
-                }
-
-                // Also make sure this String isn't an unformatted String
-                String formatted = element.getAttribute("formatted"); //$NON-NLS-1$
-                if (!formatted.isEmpty() && !Boolean.parseBoolean(formatted)) {
-                    if (!mNotFormatStrings.containsKey(name)) {
-                        Handle handle = context.parser.createLocationHandle(context, element);
-                        handle.setClientData(element);
-                        mNotFormatStrings.put(name, handle);
-                    }
-                    return;
-                }
-
-                // See if it's not a format string, e.g. "Battery charge is 100%!".
-                // If so we want to record this name in a special list such that we can
-                // make sure you don't attempt to reference this string from a String.format
-                // call.
-                Matcher matcher = FORMAT.matcher(text);
-                if (!matcher.find(j)) {
-                    if (!mNotFormatStrings.containsKey(name)) {
-                        Handle handle = context.parser.createLocationHandle(context, element);
-                        handle.setClientData(element);
-                        mNotFormatStrings.put(name, handle);
-                    }
-                    return;
-                }
-
-                String conversion = matcher.group(6);
-                int conversionClass = getConversionClass(conversion.charAt(0));
-                if (conversionClass == CONVERSION_CLASS_UNKNOWN || matcher.group(5) != null) {
-                    if (mIgnoreStrings == null) {
-                        mIgnoreStrings = new HashSet<String>();
-                    }
-                    mIgnoreStrings.add(name);
-
-                    // Don't process any other strings here; some of them could
-                    // accidentally look like a string, e.g. "%H" is a hash code conversion
-                    // in String.format (and hour in Time formatting).
-                    return;
-                }
-
-                found = true;
-                j++; // Ensure that when we process a "%%" we don't separately check the second %
-            }
-        }
-
-        if (found && name != null) {
-            if (!context.getProject().getReportIssues()) {
-                // If this is a library project not being analyzed, ignore it
-                return;
-            }
-
-            // Record it for analysis when seen in Java code
-            if (mFormatStrings == null) {
-                mFormatStrings = new HashMap<String, List<Pair<Handle,String>>>();
-            }
-
-            List<Pair<Handle, String>> list = mFormatStrings.get(name);
-            if (list == null) {
-                list = new ArrayList<Pair<Handle, String>>();
-                mFormatStrings.put(name, list);
-            }
-            Handle handle = context.parser.createLocationHandle(context, element);
-            handle.setClientData(element);
-            list.add(Pair.of(handle, text));
-        }
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (mFormatStrings != null) {
-            Formatter formatter = new Formatter();
-
-            boolean checkCount = context.isEnabled(ARG_COUNT);
-            boolean checkValid = context.isEnabled(INVALID);
-            boolean checkTypes = context.isEnabled(ARG_TYPES);
-
-            // Ensure that all the format strings are consistent with respect to each other;
-            // e.g. they all have the same number of arguments, they all use all the
-            // arguments, and they all use the same types for all the numbered arguments
-            for (Map.Entry<String, List<Pair<Handle, String>>> entry : mFormatStrings.entrySet()) {
-                String name = entry.getKey();
-                List<Pair<Handle, String>> list = entry.getValue();
-
-                // Check argument counts
-                if (checkCount) {
-                    checkArity(context, name, list);
-                }
-
-                // Check argument types (and also make sure that the formatting strings are valid)
-                if (checkValid || checkTypes) {
-                    checkTypes(context, formatter, checkValid, checkTypes, name, list);
-                }
-            }
-
-            formatter.close();
-        }
-    }
-
-    private static void checkTypes(Context context, Formatter formatter, boolean checkValid,
-            boolean checkTypes, String name, List<Pair<Handle, String>> list) {
-        Map<Integer, String> types = new HashMap<Integer, String>();
-        Map<Integer, Handle> typeDefinition = new HashMap<Integer, Handle>();
-        for (Pair<Handle, String> pair : list) {
-            Handle handle = pair.getFirst();
-            String formatString = pair.getSecond();
-
-            //boolean warned = false;
-            Matcher matcher = FORMAT.matcher(formatString);
-            int index = 0;
-            int prevIndex = 0;
-            int nextNumber = 1;
-            while (true) {
-                if (matcher.find(index)) {
-                    int matchStart = matcher.start();
-                    // Make sure this is not an escaped '%'
-                    for (; prevIndex < matchStart; prevIndex++) {
-                        char c = formatString.charAt(prevIndex);
-                        if (c == '\\') {
-                            prevIndex++;
-                        }
-                    }
-                    if (prevIndex > matchStart) {
-                        // We're in an escape, ignore this result
-                        index = prevIndex;
-                        continue;
-                    }
-
-                    index = matcher.end(); // Ensure loop proceeds
-                    String str = formatString.substring(matchStart, matcher.end());
-                    if (str.equals("%%")) { //$NON-NLS-1$
-                        // Just an escaped %
-                        continue;
-                    }
-
-                    if (checkValid) {
-                        // Make sure it's a valid format string
-                        if (str.length() > 2 && str.charAt(str.length() - 2) == ' ') {
-                            char last = str.charAt(str.length() - 1);
-                            // If you forget to include the conversion character, e.g.
-                            //   "Weight=%1$ g" instead of "Weight=%1$d g", then
-                            // you're going to end up with a format string interpreted as
-                            // "%1$ g". This means that the space character is interpreted
-                            // as a flag character, but it can only be a flag character
-                            // when used in conjunction with the numeric conversion
-                            // formats (d, o, x, X). If that's not the case, make a
-                            // dedicated error message
-                            if (last != 'd' && last != 'o' && last != 'x' && last != 'X') {
-                                Object clientData = handle.getClientData();
-                                if (clientData instanceof Node) {
-                                    if (context.getDriver().isSuppressed(INVALID,
-                                            (Node) clientData)) {
-                                        return;
-                                    }
-                                }
-
-                                Location location = handle.resolve();
-                                String message = String.format(
-                                        "Incorrect formatting string %1$s; missing conversion " +
-                                        "character in '%2$s' ?", name, str);
-                                context.report(INVALID, location, message, null);
-                                //warned = true;
-                                continue;
-                            }
-                        }
-                    }
-
-                    if (!checkTypes) {
-                        continue;
-                    }
-
-                    // Shouldn't throw a number format exception since we've already
-                    // matched the pattern in the regexp
-                    int number;
-                    String numberString = matcher.group(1);
-                    if (numberString != null) {
-                        // Strip off trailing $
-                        numberString = numberString.substring(0, numberString.length() - 1);
-                        number = Integer.parseInt(numberString);
-                        nextNumber = number + 1;
-                    } else {
-                        number = nextNumber++;
-                    }
-                    String format = matcher.group(6);
-                    String currentFormat = types.get(number);
-                    if (currentFormat == null) {
-                        types.put(number, format);
-                        typeDefinition.put(number, handle);
-                    } else if (!currentFormat.equals(format)
-                            && isIncompatible(currentFormat.charAt(0), format.charAt(0))) {
-
-                        Object clientData = handle.getClientData();
-                        if (clientData instanceof Node) {
-                            if (context.getDriver().isSuppressed(ARG_TYPES, (Node) clientData)) {
-                                return;
-                            }
-                        }
-
-                        Location location = handle.resolve();
-                        // Attempt to limit the location range to just the formatting
-                        // string in question
-                        location = refineLocation(context, location, formatString,
-                                matcher.start(), matcher.end());
-                        Location otherLocation = typeDefinition.get(number).resolve();
-                        otherLocation.setMessage("Conflicting argument type here");
-                        location.setSecondary(otherLocation);
-                        File f = otherLocation.getFile();
-                        String message = String.format(
-                                "Inconsistent formatting types for argument #%1$d in " +
-                                "format string %2$s ('%3$s'): Found both '%4$s' and '%5$s' " +
-                                "(in %6$s)",
-                                number, name,
-                                str,
-                                currentFormat, format,
-                                f.getParentFile().getName() + File.separator + f.getName());
-                        //warned = true;
-                        context.report(ARG_TYPES, location, message, null);
-                        break;
-                    }
-                } else {
-                    break;
-                }
-            }
-
-            // Check that the format string is valid by actually attempting to instantiate
-            // it. We only do this if we haven't already complained about this string
-            // for other reasons.
-            /* Check disabled for now: it had many false reports due to conversion
-             * errors (which is expected since we just pass in strings), but once those
-             * are eliminated there aren't really any other valid error messages returned
-             * (for example, calling the formatter with bogus formatting flags always just
-             * returns a "conversion" error. It looks like we'd need to actually pass compatible
-             * arguments to trigger other types of formatting errors such as precision errors.
-            if (!warned && checkValid) {
-                try {
-                    formatter.format(formatString, "", "", "", "", "", "", "",
-                            "", "", "", "", "", "", "");
-
-                } catch (IllegalFormatException t) { // TODO: UnknownFormatConversionException
-                    if (!t.getLocalizedMessage().contains(" != ")
-                            && !t.getLocalizedMessage().contains("Conversion")) {
-                        Location location = handle.resolve();
-                        context.report(INVALID, location,
-                                String.format("Wrong format for %1$s: %2$s",
-                                        name, t.getLocalizedMessage()), null);
-                    }
-                }
-            }
-            */
-        }
-    }
-
-    /**
-     * Returns true if two String.format conversions are "incompatible" (meaning
-     * that using these two for the same argument across different translations
-     * is more likely an error than intentional. Some conversions are
-     * incompatible, e.g. "d" and "s" where one is a number and string, whereas
-     * others may work (e.g. float versus integer) but are probably not
-     * intentional.
-     */
-    private static boolean isIncompatible(char conversion1, char conversion2) {
-        int class1 = getConversionClass(conversion1);
-        int class2 = getConversionClass(conversion2);
-        return class1 != class2
-                && class1 != CONVERSION_CLASS_UNKNOWN
-                && class2 != CONVERSION_CLASS_UNKNOWN;
-    }
-
-    private static final int CONVERSION_CLASS_UNKNOWN = 0;
-    private static final int CONVERSION_CLASS_STRING = 1;
-    private static final int CONVERSION_CLASS_CHARACTER = 2;
-    private static final int CONVERSION_CLASS_INTEGER = 3;
-    private static final int CONVERSION_CLASS_FLOAT = 4;
-    private static final int CONVERSION_CLASS_BOOLEAN = 5;
-    private static final int CONVERSION_CLASS_HASHCODE = 6;
-    private static final int CONVERSION_CLASS_PERCENT = 7;
-    private static final int CONVERSION_CLASS_NEWLINE = 8;
-    private static final int CONVERSION_CLASS_DATETIME = 9;
-
-    private static int getConversionClass(char conversion) {
-        // See http://developer.android.com/reference/java/util/Formatter.html
-        switch (conversion) {
-            case 't':   // Time/date conversion
-            case 'T':
-                return CONVERSION_CLASS_DATETIME;
-            case 's':   // string
-            case 'S':   // Uppercase string
-                return CONVERSION_CLASS_STRING;
-            case 'c':   // character
-            case 'C':   // Uppercase character
-                return CONVERSION_CLASS_CHARACTER;
-            case 'd':   // decimal
-            case 'o':   // octal
-            case 'x':   // hex
-            case 'X':
-                return CONVERSION_CLASS_INTEGER;
-            case 'f':   // decimal float
-            case 'e':   // exponential float
-            case 'E':
-            case 'g':   // decimal or exponential depending on size
-            case 'G':
-            case 'a':   // hex float
-            case 'A':
-                return CONVERSION_CLASS_FLOAT;
-            case 'b':   // boolean
-            case 'B':
-                return CONVERSION_CLASS_BOOLEAN;
-            case 'h':   // boolean
-            case 'H':
-                return CONVERSION_CLASS_HASHCODE;
-            case '%':   // literal
-                return CONVERSION_CLASS_PERCENT;
-            case 'n':   // literal
-                return CONVERSION_CLASS_NEWLINE;
-        }
-
-        return CONVERSION_CLASS_UNKNOWN;
-    }
-
-    private static Location refineLocation(Context context, Location location,
-            String formatString, int substringStart, int substringEnd) {
-        Position startLocation = location.getStart();
-        Position endLocation = location.getStart();
-        if (startLocation != null && endLocation != null) {
-            int startOffset = startLocation.getOffset();
-            int endOffset = endLocation.getOffset();
-            if (startOffset >= 0) {
-                String contents = context.getClient().readFile(location.getFile());
-                if (contents != null
-                        && endOffset <= contents.length() && startOffset < endOffset) {
-                    int formatOffset = contents.indexOf(formatString, startOffset);
-                    if (formatOffset != -1 && formatOffset <= endOffset) {
-                        return Location.create(context.file, contents,
-                                formatOffset + substringStart, formatOffset + substringEnd);
-                    }
-                }
-            }
-        }
-
-        return location;
-    }
-
-    /**
-     * Check that the number of arguments in the format string is consistent
-     * across translations, and that all arguments are used
-     */
-    private static void checkArity(Context context, String name, List<Pair<Handle, String>> list) {
-        // Check to make sure that the argument counts and types are consistent
-        int prevCount = -1;
-        for (Pair<Handle, String> pair : list) {
-            Set<Integer> indices = new HashSet<Integer>();
-            int count = getFormatArgumentCount(pair.getSecond(), indices);
-            Handle handle = pair.getFirst();
-            if (prevCount != -1 && prevCount != count) {
-                Object clientData = handle.getClientData();
-                if (clientData instanceof Node) {
-                    if (context.getDriver().isSuppressed(ARG_COUNT, (Node) clientData)) {
-                        return;
-                    }
-                }
-                Location location = handle.resolve();
-                Location secondary = list.get(0).getFirst().resolve();
-                secondary.setMessage("Conflicting number of arguments here");
-                location.setSecondary(secondary);
-                String message = String.format(
-                        "Inconsistent number of arguments in formatting string %1$s; " +
-                        "found both %2$d and %3$d", name, prevCount, count);
-                context.report(ARG_COUNT, location, message, null);
-                break;
-            }
-
-            for (int i = 1; i <= count; i++) {
-                if (!indices.contains(i)) {
-                    Object clientData = handle.getClientData();
-                    if (clientData instanceof Node) {
-                        if (context.getDriver().isSuppressed(ARG_COUNT, (Node) clientData)) {
-                            return;
-                        }
-                    }
-
-                    Set<Integer> all = new HashSet<Integer>();
-                    for (int j = 1; j < count; j++) {
-                        all.add(j);
-                    }
-                    all.removeAll(indices);
-                    List<Integer> sorted = new ArrayList<Integer>(all);
-                    Collections.sort(sorted);
-                    Location location = handle.resolve();
-                    String message = String.format(
-                            "Formatting string '%1$s' is not referencing numbered arguments %2$s",
-                            name, sorted);
-                    context.report(ARG_COUNT, location, message, null);
-                    break;
-                }
-            }
-
-            prevCount = count;
-        }
-    }
-
-    // See java.util.Formatter docs
-    private static final Pattern FORMAT = Pattern.compile(
-            // Generic format:
-            //   %[argument_index$][flags][width][.precision]conversion
-            //
-            "%" +                                                               //$NON-NLS-1$
-            // Argument Index
-            "(\\d+\\$)?" +                                                      //$NON-NLS-1$
-            // Flags
-            "([-+#, 0(\\<]*)?" +                                                //$NON-NLS-1$
-            // Width
-            "(\\d+)?" +                                                         //$NON-NLS-1$
-            // Precision
-            "(\\.\\d+)?" +                                                      //$NON-NLS-1$
-            // Conversion. These are all a single character, except date/time conversions
-            // which take a prefix of t/T:
-            "([tT])?" +                                                         //$NON-NLS-1$
-            // The current set of conversion characters are
-            // b,h,s,c,d,o,x,e,f,g,a,t (as well as all those as upper-case characters), plus
-            // n for newlines and % as a literal %. And then there are all the time/date
-            // characters: HIKLm etc. Just match on all characters here since there should
-            // be at least one.
-            "([a-zA-Z%])");                                                     //$NON-NLS-1$
-
-    /** Given a format string returns the format type of the given argument */
-    @VisibleForTesting
-    static String getFormatArgumentType(String s, int argument) {
-        Matcher matcher = FORMAT.matcher(s);
-        int index = 0;
-        int prevIndex = 0;
-        int nextNumber = 1;
-        while (true) {
-            if (matcher.find(index)) {
-                int matchStart = matcher.start();
-                // Make sure this is not an escaped '%'
-                for (; prevIndex < matchStart; prevIndex++) {
-                    char c = s.charAt(prevIndex);
-                    if (c == '\\') {
-                        prevIndex++;
-                    }
-                }
-                if (prevIndex > matchStart) {
-                    // We're in an escape, ignore this result
-                    index = prevIndex;
-                    continue;
-                }
-
-                // Shouldn't throw a number format exception since we've already
-                // matched the pattern in the regexp
-                int number;
-                String numberString = matcher.group(1);
-                if (numberString != null) {
-                    // Strip off trailing $
-                    numberString = numberString.substring(0, numberString.length() - 1);
-                    number = Integer.parseInt(numberString);
-                    nextNumber = number + 1;
-                } else {
-                    number = nextNumber++;
-                }
-
-                if (number == argument) {
-                    return matcher.group(6);
-                }
-                index = matcher.end();
-            } else {
-                break;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Given a format string returns the number of required arguments. If the
-     * {@code seenArguments} parameter is not null, put the indices of any
-     * observed arguments into it.
-     */
-    @VisibleForTesting
-    static int getFormatArgumentCount(String s, Set<Integer> seenArguments) {
-        Matcher matcher = FORMAT.matcher(s);
-        int index = 0;
-        int prevIndex = 0;
-        int nextNumber = 1;
-        int max = 0;
-        while (true) {
-            if (matcher.find(index)) {
-                if ("%".equals(matcher.group(6))) { //$NON-NLS-1$
-                    index = matcher.end();
-                    continue;
-                }
-                int matchStart = matcher.start();
-                // Make sure this is not an escaped '%'
-                for (; prevIndex < matchStart; prevIndex++) {
-                    char c = s.charAt(prevIndex);
-                    if (c == '\\') {
-                        prevIndex++;
-                    }
-                }
-                if (prevIndex > matchStart) {
-                    // We're in an escape, ignore this result
-                    index = prevIndex;
-                    continue;
-                }
-
-                // Shouldn't throw a number format exception since we've already
-                // matched the pattern in the regexp
-                int number;
-                String numberString = matcher.group(1);
-                if (numberString != null) {
-                    // Strip off trailing $
-                    numberString = numberString.substring(0, numberString.length() - 1);
-                    number = Integer.parseInt(numberString);
-                    nextNumber = number + 1;
-                } else {
-                    number = nextNumber++;
-                }
-
-                if (number > max) {
-                    max = number;
-                }
-                if (seenArguments != null) {
-                    seenArguments.add(number);
-                }
-
-                index = matcher.end();
-            } else {
-                break;
-            }
-        }
-
-        return max;
-    }
-
-    /**
-     * Determines whether the given {@link String#format(String, Object...)}
-     * formatting string is "locale dependent", meaning that its output depends
-     * on the locale. This is the case if it for example references decimal
-     * numbers of dates and times.
-     *
-     * @param format the format string
-     * @return true if the format is locale sensitive, false otherwise
-     */
-    public static boolean isLocaleSpecific(@NonNull String format) {
-        if (format.indexOf('%') == -1) {
-            return false;
-        }
-
-        String s = format;
-        Matcher matcher = FORMAT.matcher(s);
-        int index = 0;
-        int prevIndex = 0;
-        while (true) {
-            if (matcher.find(index)) {
-                int matchStart = matcher.start();
-                // Make sure this is not an escaped '%'
-                for (; prevIndex < matchStart; prevIndex++) {
-                    char c = s.charAt(prevIndex);
-                    if (c == '\\') {
-                        prevIndex++;
-                    }
-                }
-                if (prevIndex > matchStart) {
-                    // We're in an escape, ignore this result
-                    index = prevIndex;
-                    continue;
-                }
-
-                String type = matcher.group(6);
-                if (!type.isEmpty()) {
-                    char t = type.charAt(0);
-
-                    // The following formatting characters are locale sensitive:
-                    switch (t) {
-                        case 'd': // decimal integer
-                        case 'e': // scientific
-                        case 'E':
-                        case 'f': // decimal float
-                        case 'g': // general
-                        case 'G':
-                        case 't': // date/time
-                        case 'T':
-                            return true;
-                    }
-                }
-                index = matcher.end();
-            } else {
-                break;
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public List<String> getApplicableMethodNames() {
-        return Arrays.asList(FORMAT_METHOD, GET_STRING_METHOD);
-    }
-
-    @Override
-    public void visitMethod(@NonNull JavaContext context, @Nullable AstVisitor visitor,
-            @NonNull MethodInvocation node) {
-        if (mFormatStrings == null) {
-            return;
-        }
-
-        String methodName = node.astName().getDescription();
-        if (methodName.equals(FORMAT_METHOD)) {
-            // String.format(getResources().getString(R.string.foo), arg1, arg2, ...)
-            // Check that the arguments in R.string.foo match arg1, arg2, ...
-            if (node.astOperand() instanceof VariableReference) {
-                VariableReference ref = (VariableReference) node.astOperand();
-                if ("String".equals(ref.astIdentifier().astValue())) { //$NON-NLS-1$
-                    // Found a String.format call
-                    // Look inside to see if we can find an R string
-                    // Find surrounding method
-                    checkFormatCall(context, node);
-                }
-            }
-        } else {
-            // getResources().getString(R.string.foo, arg1, arg2, ...)
-            // Check that the arguments in R.string.foo match arg1, arg2, ...
-            if (node.astArguments().size() > 1 && node.astOperand() != null ) {
-                checkFormatCall(context, node);
-            }
-        }
-    }
-
-    private void checkFormatCall(JavaContext context, MethodInvocation node) {
-        lombok.ast.Node current = getParentMethod(node);
-        if (current != null) {
-            checkStringFormatCall(context, current, node);
-        }
-    }
-
-    /**
-     * Check the given String.format call (with the given arguments) to see if
-     * the string format is being used correctly
-     *
-     * @param context the context to report errors to
-     * @param method the method containing the {@link String#format} call
-     * @param call the AST node for the {@link String#format}
-     */
-    private void checkStringFormatCall(
-            JavaContext context,
-            lombok.ast.Node method,
-            MethodInvocation call) {
-
-        StrictListAccessor<Expression, MethodInvocation> args = call.astArguments();
-        if (args.isEmpty()) {
-            return;
-        }
-
-        StringTracker tracker = new StringTracker(method, call, 0);
-        method.accept(tracker);
-        String name = tracker.getFormatStringName();
-        if (name == null) {
-            return;
-        }
-
-        if (mIgnoreStrings != null && mIgnoreStrings.contains(name)) {
-            return;
-        }
-
-        if (mNotFormatStrings.containsKey(name)) {
-            Handle handle = mNotFormatStrings.get(name);
-            Object clientData = handle.getClientData();
-            if (clientData instanceof Node) {
-                if (context.getDriver().isSuppressed(INVALID, (Node) clientData)) {
-                    return;
-                }
-            }
-            Location location = handle.resolve();
-            String message = String.format(
-                    "Format string '%1$s' is not a valid format string so it should not be " +
-                    "passed to String.format",
-                    name);
-            context.report(INVALID, location, message, null);
-            return;
-        }
-
-        // TODO: Need type information in the AST
-        Iterator<Expression> argIterator = args.iterator();
-        Expression first = argIterator.next();
-        Expression second = argIterator.hasNext() ? argIterator.next() : null;
-        String firstName = first.toString();
-        boolean specifiesLocale = firstName.startsWith("Locale.")             //$NON-NLS-1$
-                || firstName.contains("locale")                               //$NON-NLS-1$
-                || firstName.equals("null")                                   //$NON-NLS-1$
-                || second != null && second.toString().contains("getString"); //$NON-NLS-1$
-
-        List<Pair<Handle, String>> list = mFormatStrings.get(name);
-        if (list != null) {
-            for (Pair<Handle, String> pair : list) {
-                String s = pair.getSecond();
-                int count = getFormatArgumentCount(s, null);
-                Handle handle = pair.getFirst();
-                if (count != args.size() - 1 - (specifiesLocale ? 1 : 0)) {
-                    Location location = context.parser.getLocation(context, call);
-                    Location secondary = handle.resolve();
-                    secondary.setMessage(String.format("This definition requires %1$d arguments",
-                            count));
-                    location.setSecondary(secondary);
-                    String message = String.format(
-                            "Wrong argument count, format string %1$s requires %2$d but format " +
-                            "call supplies %3$d",
-                            name, count, args.size() - 1);
-                    context.report(ARG_TYPES, method, location, message, null);
-                } else {
-                    for (int i = 1; i <= count; i++) {
-                        int argumentIndex = i + (specifiesLocale ? 1 : 0);
-                        Class<?> type = tracker.getArgumentType(argumentIndex);
-                        if (type != null) {
-                            boolean valid = true;
-                            String formatType = getFormatArgumentType(s, i);
-                            char last = formatType.charAt(formatType.length() - 1);
-                            if (formatType.length() >= 2 &&
-                                    Character.toLowerCase(
-                                            formatType.charAt(formatType.length() - 2)) == 't') {
-                                // Date time conversion.
-                                // TODO
-                                continue;
-                            }
-                            switch (last) {
-                                // Booleans. It's okay to pass objects to these;
-                                // it will print "true" if non-null, but it's
-                                // unusual and probably not intended.
-                                case 'b':
-                                case 'B':
-                                    valid = type == Boolean.TYPE;
-                                    break;
-
-                                // Numeric: integer and floats in various formats
-                                case 'x':
-                                case 'X':
-                                case 'd':
-                                case 'o':
-                                case 'e':
-                                case 'E':
-                                case 'f':
-                                case 'g':
-                                case 'G':
-                                case 'a':
-                                case 'A':
-                                    valid = type == Integer.TYPE
-                                            || type == Float.TYPE;
-                                    break;
-                                case 'c':
-                                case 'C':
-                                    // Unicode character
-                                    valid = type == Character.TYPE;
-                                    break;
-                                case 'h':
-                                case 'H': // Hex print of hash code of objects
-                                case 's':
-                                case 'S':
-                                    // String. Can pass anything, but warn about
-                                    // numbers since you may have meant more
-                                    // specific formatting. Use special issue
-                                    // explanation for this?
-                                    valid = type != Boolean.TYPE &&
-                                        !type.isAssignableFrom(Number.class);
-                                    break;
-                            }
-
-                            if (!valid) {
-                                IJavaParser parser = context.parser;
-                                Expression argument = tracker.getArgument(argumentIndex);
-                                Location location = parser.getLocation(context, argument);
-                                Location secondary = handle.resolve();
-                                secondary.setMessage("Conflicting argument declaration here");
-                                location.setSecondary(secondary);
-
-                                String message = String.format(
-                                        "Wrong argument type for formatting argument '#%1$d' " +
-                                        "in %2$s: conversion is '%3$s', received %4$s",
-                                        i, name, formatType, type.getSimpleName());
-                                context.report(ARG_TYPES, method, location, message, null);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /** Returns the parent method of the given AST node */
-    @Nullable
-    static lombok.ast.Node getParentMethod(@NonNull lombok.ast.Node node) {
-        lombok.ast.Node current = node.getParent();
-        while (current != null
-                && !(current instanceof MethodDeclaration)
-                && !(current instanceof ConstructorDeclaration)) {
-            current = current.getParent();
-        }
-
-        return current;
-    }
-
-    /** Returns the resource name corresponding to the first argument in the given call */
-    static String getResourceForFirstArg(lombok.ast.Node method, lombok.ast.Node call) {
-        assert call instanceof MethodInvocation || call instanceof ConstructorInvocation;
-        StringTracker tracker = new StringTracker(method, call, 0);
-        method.accept(tracker);
-        String name = tracker.getFormatStringName();
-
-        return name;
-    }
-
-    /** Returns the resource name corresponding to the given argument in the given call */
-    static String getResourceArg(lombok.ast.Node method, lombok.ast.Node call, int argIndex) {
-        assert call instanceof MethodInvocation || call instanceof ConstructorInvocation;
-        StringTracker tracker = new StringTracker(method, call, argIndex);
-        method.accept(tracker);
-        String name = tracker.getFormatStringName();
-
-        return name;
-    }
-
-    /**
-     * Given a variable reference, finds the original R.string value corresponding to it.
-     * For example:
-     * <pre>
-     * {@code
-     *  String target = "World";
-     *  String hello = getResources().getString(R.string.hello);
-     *  String output = String.format(hello, target);
-     * }
-     * </pre>
-     *
-     * Given the {@code String.format} call, we want to find out what R.string resource
-     * corresponds to the first argument, in this case {@code R.string.hello}.
-     * To do this, we look for R.string references, and track those through assignments
-     * until we reach the target node.
-     * <p>
-     * In addition, it also does some primitive type tracking such that it (in some cases)
-     * can answer questions about the types of variables. This allows it to check whether
-     * certain argument types are valid. Note however that it does not do full-blown
-     * type analysis by checking method call signatures and so on.
-     */
-    private static class StringTracker extends ForwardingAstVisitor {
-        /** Method we're searching within */
-        private final lombok.ast.Node mTop;
-        /** The argument index in the method we're targeting */
-        private final int mArgIndex;
-        /** Map from variable name to corresponding string resource name */
-        private final Map<String, String> mMap = new HashMap<String, String>();
-        /** Map from variable name to corresponding type */
-        private final Map<String, Class<?>> mTypes = new HashMap<String, Class<?>>();
-        /** The AST node for the String.format we're interested in */
-        private final lombok.ast.Node mTargetNode;
-        private boolean mDone;
-        /**
-         * Result: the name of the string resource being passed to the
-         * String.format, if any
-         */
-        private String mName;
-
-        public StringTracker(lombok.ast.Node top, lombok.ast.Node targetNode, int argIndex) {
-            mTop = top;
-            mArgIndex = argIndex;
-            mTargetNode = targetNode;
-        }
-
-        public String getFormatStringName() {
-            return mName;
-        }
-
-        /** Returns the argument type of the given formatting argument of the
-         * target node. Note: This is in the formatting string, which is one higher
-         * than the String.format parameter number, since the first argument is the
-         * formatting string itself.
-         *
-         * @param argument the argument number
-         * @return the class (such as {@link Integer#TYPE} etc) or null if not known
-         */
-        public Class<?> getArgumentType(int argument) {
-            Expression arg = getArgument(argument);
-            if (arg != null) {
-                Class<?> type = getType(arg);
-                if (type != null) {
-                    return type;
-                }
-            }
-
-            return null;
-        }
-
-        public Expression getArgument(int argument) {
-            if (!(mTargetNode instanceof MethodInvocation)) {
-                return null;
-            }
-            MethodInvocation call = (MethodInvocation) mTargetNode;
-            StrictListAccessor<Expression, MethodInvocation> args = call.astArguments();
-            if (argument >= args.size()) {
-                return null;
-            }
-
-            Iterator<Expression> iterator = args.iterator();
-            int index = 0;
-            while (iterator.hasNext()) {
-                Expression arg = iterator.next();
-                if (index++ == argument) {
-                    return arg;
-                }
-            }
-
-            return null;
-        }
-
-        @Override
-        public boolean visitNode(lombok.ast.Node node) {
-            if (mDone) {
-                return true;
-            }
-
-            return super.visitNode(node);
-        }
-
-        @Override
-        public boolean visitVariableReference(VariableReference node) {
-            if (node.astIdentifier().getDescription().equals("R") &&   //$NON-NLS-1$
-                    node.getParent() instanceof Select &&
-                    node.getParent().getParent() instanceof Select) {
-
-                // See if we're on the right hand side of an assignment
-                lombok.ast.Node current = node.getParent().getParent();
-                String reference = ((Select) current).astIdentifier().astValue();
-
-                while (current != mTop && !(current instanceof VariableDefinitionEntry)) {
-                    if (current == mTargetNode) {
-                        mName = reference;
-                        mDone = true;
-                        return false;
-                    }
-                    current = current.getParent();
-                }
-                if (current instanceof VariableDefinitionEntry) {
-                    VariableDefinitionEntry entry = (VariableDefinitionEntry) current;
-                    String variable = entry.astName().astValue();
-                    mMap.put(variable, reference);
-                }
-            }
-
-            return false;
-        }
-
-        @Nullable
-        private Expression getTargetArgument() {
-            Iterator<Expression> iterator;
-            if (mTargetNode instanceof MethodInvocation) {
-                iterator = ((MethodInvocation) mTargetNode).astArguments().iterator();
-            } else if (mTargetNode instanceof ConstructorInvocation) {
-                iterator = ((ConstructorInvocation) mTargetNode).astArguments().iterator();
-            } else {
-                return null;
-            }
-            int i = 0;
-            while (i < mArgIndex && iterator.hasNext()) {
-                iterator.next();
-                i++;
-            }
-            if (iterator.hasNext()) {
-                return iterator.next();
-            }
-
-            return null;
-        }
-
-        @Override
-        public boolean visitMethodInvocation(MethodInvocation node) {
-            if (node == mTargetNode) {
-                Expression arg = getTargetArgument();
-                if (arg instanceof VariableReference) {
-                      VariableReference reference = (VariableReference) arg;
-                      String variable = reference.astIdentifier().astValue();
-                      mName = mMap.get(variable);
-                      mDone = true;
-                      return true;
-                }
-            }
-
-            // Is this a getString() call? On a resource object? If so,
-            // promote the resource argument up to the left hand side
-            return super.visitMethodInvocation(node);
-        }
-
-        @Override
-        public boolean visitConstructorInvocation(ConstructorInvocation node) {
-            if (node == mTargetNode) {
-                Expression arg = getTargetArgument();
-                if (arg instanceof VariableReference) {
-                      VariableReference reference = (VariableReference) arg;
-                      String variable = reference.astIdentifier().astValue();
-                      mName = mMap.get(variable);
-                      mDone = true;
-                      return true;
-                }
-            }
-
-            // Is this a getString() call? On a resource object? If so,
-            // promote the resource argument up to the left hand side
-            return super.visitConstructorInvocation(node);
-        }
-
-        @Override
-        public boolean visitVariableDefinitionEntry(VariableDefinitionEntry node) {
-            String name = node.astName().astValue();
-            Expression rhs = node.astInitializer();
-            Class<?> type = getType(rhs);
-            if (type != null) {
-                mTypes.put(name, type);
-            } else {
-                // Make sure we're not visiting the String.format node itself. If you have
-                //    msg = String.format("%1$s", msg)
-                // then we'd be wiping out the type of "msg" before visiting the
-                // String.format call!
-                if (rhs != mTargetNode) {
-                    mTypes.remove(name);
-                }
-            }
-
-            return super.visitVariableDefinitionEntry(node);
-        }
-
-        private Class<?> getType(Expression expression) {
-            if (expression instanceof VariableReference) {
-                VariableReference reference = (VariableReference) expression;
-                String variable = reference.astIdentifier().astValue();
-                return mTypes.get(variable);
-            } else if (expression instanceof MethodInvocation) {
-                MethodInvocation method = (MethodInvocation) expression;
-                String methodName = method.astName().astValue();
-                if (methodName.equals(GET_STRING_METHOD)) {
-                    return String.class;
-                }
-            } else if (expression instanceof StringLiteral) {
-                return String.class;
-            } else if (expression instanceof IntegralLiteral) {
-                return Integer.TYPE;
-            } else if (expression instanceof FloatingPointLiteral) {
-                return Float.TYPE;
-            } else if (expression instanceof CharLiteral) {
-                return Character.TYPE;
-            } else if (expression instanceof NullLiteral) {
-                return Object.class;
-            }
-
-            return null;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/StyleCycleDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/StyleCycleDetector.java
deleted file mode 100644
index 8ce103b..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/StyleCycleDetector.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_PARENT;
-import static com.android.SdkConstants.STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.TAG_STYLE;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Checks for cycles in style definitions
- */
-public class StyleCycleDetector extends ResourceXmlDetector {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "StyleCycle", //$NON-NLS-1$
-            "Looks for cycles in style definitions",
-            "There should be no cycles in style definitions as this can lead to runtime " +
-            "exceptions.",
-            Category.CORRECTNESS,
-            8,
-            Severity.FATAL,
-            StyleCycleDetector.class,
-            Scope.RESOURCE_FILE_SCOPE).setMoreInfo(
-            "http://developer.android.com/guide/topics/ui/themes.html#Inheritance"); //$NON-NLS-1$
-
-    /** Constructs a new {@link StyleCycleDetector} */
-    public StyleCycleDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.VALUES;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Collections.singleton(TAG_STYLE);
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        Attr parentNode = element.getAttributeNode(ATTR_PARENT);
-        if (parentNode != null) {
-            String parent = parentNode.getValue();
-            String name = element.getAttribute(ATTR_NAME);
-            if (parent.endsWith(name) &&
-                    parent.equals(STYLE_RESOURCE_PREFIX + name)) {
-                context.report(ISSUE, parentNode, context.getLocation(parentNode),
-                        String.format("Style %1$s should not extend itself", name), null);
-            } else if (parent.startsWith(STYLE_RESOURCE_PREFIX)
-                    && parent.startsWith(name, STYLE_RESOURCE_PREFIX.length())
-                    && parent.startsWith(".", STYLE_RESOURCE_PREFIX.length() + name.length())) {
-                context.report(ISSUE, parentNode, context.getLocation(parentNode),
-                        String.format("Potential cycle: %1$s is the implied parent of %2$s and " +
-                                "this defines the opposite", name,
-                                parent.substring(STYLE_RESOURCE_PREFIX.length())), null);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SystemPermissionsDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SystemPermissionsDetector.java
deleted file mode 100644
index 21fb6c0..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/SystemPermissionsDetector.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_MANIFEST_XML;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.TAG_USES_PERMISSION;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-
-/**
- * Checks if an application wants to use permissions that can only be used by
- * system applications.
- */
-public class SystemPermissionsDetector extends Detector implements Detector.XmlScanner {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "ProtectedPermissions", //$NON-NLS-1$
-            "Looks for permissions that are only granted to system apps",
-
-            "Permissions with the protection level signature or signatureOrSystem are only " +
-            "granted to system apps. If an app is a regular non-system app, it will never be " +
-            "able to use these permissions.",
-
-            Category.CORRECTNESS,
-            5,
-            Severity.ERROR,
-            SystemPermissionsDetector.class,
-            EnumSet.of(Scope.MANIFEST));
-
-    // List of permissions have the protection levels signature or systemOrSignature.
-    // This list must be sorted alphabetically.
-    private static final String[] SYSTEM_PERMISSIONS = new String[] {
-        "android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE",
-        "android.permission.ACCESS_CACHE_FILESYSTEM",
-        "android.permission.ACCESS_CHECKIN_PROPERTIES",
-        "android.permission.ACCESS_MTP",
-        "android.permission.ACCESS_SURFACE_FLINGER",
-        "android.permission.ACCOUNT_MANAGER",
-        "android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK",
-        "android.permission.ASEC_ACCESS",
-        "android.permission.ASEC_CREATE",
-        "android.permission.ASEC_DESTROY",
-        "android.permission.ASEC_MOUNT_UNMOUNT",
-        "android.permission.ASEC_RENAME",
-        "android.permission.BACKUP",
-        "android.permission.BIND_APPWIDGET",
-        "android.permission.BIND_DEVICE_ADMIN",
-        "android.permission.BIND_INPUT_METHOD",
-        "android.permission.BIND_PACKAGE_VERIFIER",
-        "android.permission.BIND_REMOTEVIEWS",
-        "android.permission.BIND_TEXT_SERVICE",
-        "android.permission.BIND_VPN_SERVICE",
-        "android.permission.BIND_WALLPAPER",
-        "android.permission.BRICK",
-        "android.permission.BROADCAST_PACKAGE_REMOVED",
-        "android.permission.BROADCAST_SMS",
-        "android.permission.BROADCAST_WAP_PUSH",
-        "android.permission.CALL_PRIVILEGED",
-        "android.permission.CHANGE_BACKGROUND_DATA_SETTING",
-        "android.permission.CHANGE_COMPONENT_ENABLED_STATE",
-        "android.permission.CLEAR_APP_USER_DATA",
-        "android.permission.CONFIRM_FULL_BACKUP",
-        "android.permission.CONNECTIVITY_INTERNAL",
-        "android.permission.CONTROL_LOCATION_UPDATES",
-        "android.permission.COPY_PROTECTED_DATA",
-        "android.permission.CRYPT_KEEPER",
-        "android.permission.DELETE_CACHE_FILES",
-        "android.permission.DELETE_PACKAGES",
-        "android.permission.DEVICE_POWER",
-        "android.permission.DIAGNOSTIC",
-        "android.permission.DUMP",
-        "android.permission.FACTORY_TEST",
-        "android.permission.FORCE_BACK",
-        "android.permission.FORCE_STOP_PACKAGES",
-        "android.permission.GLOBAL_SEARCH",
-        "android.permission.GLOBAL_SEARCH_CONTROL",
-        "android.permission.HARDWARE_TEST",
-        "android.permission.INJECT_EVENTS",
-        "android.permission.INSTALL_LOCATION_PROVIDER",
-        "android.permission.INSTALL_PACKAGES",
-        "android.permission.INTERNAL_SYSTEM_WINDOW",
-        "android.permission.MANAGE_APP_TOKENS",
-        "android.permission.MANAGE_NETWORK_POLICY",
-        "android.permission.MANAGE_USB",
-        "android.permission.MASTER_CLEAR",
-        "android.permission.MODIFY_NETWORK_ACCOUNTING",
-        "android.permission.MODIFY_PHONE_STATE",
-        "android.permission.MOVE_PACKAGE",
-        "android.permission.NET_ADMIN",
-        "android.permission.MODIFY_PHONE_STATE",
-        "android.permission.PACKAGE_USAGE_STATS",
-        "android.permission.PACKAGE_VERIFICATION_AGENT",
-        "android.permission.PERFORM_CDMA_PROVISIONING",
-        "android.permission.READ_FRAME_BUFFER",
-        "android.permission.READ_INPUT_STATE",
-        "android.permission.READ_NETWORK_USAGE_HISTORY",
-        "android.permission.READ_PRIVILEGED_PHONE_STATE",
-        "android.permission.REBOOT",
-        "android.permission.RECEIVE_EMERGENCY_BROADCAST",
-        "android.permission.REMOVE_TASKS",
-        "android.permission.RETRIEVE_WINDOW_CONTENT",
-        "android.permission.SEND_SMS_NO_CONFIRMATION",
-        "android.permission.SET_ACTIVITY_WATCHER",
-        "android.permission.SET_ORIENTATION",
-        "android.permission.SET_POINTER_SPEED",
-        "android.permission.SET_PREFERRED_APPLICATIONS",
-        "android.permission.SET_SCREEN_COMPATIBILITY",
-        "android.permission.SET_TIME",
-        "android.permission.SET_WALLPAPER_COMPONENT",
-        "android.permission.SHUTDOWN",
-        "android.permission.STATUS_BAR",
-        "android.permission.STATUS_BAR_SERVICE",
-        "android.permission.STOP_APP_SWITCHES",
-        "android.permission.UPDATE_DEVICE_STATS",
-        "android.permission.WRITE_APN_SETTINGS",
-        "android.permission.WRITE_GSERVICES",
-        "android.permission.WRITE_MEDIA_STORAGE",
-        "android.permission.WRITE_SECURE_SETTINGS"
-    };
-
-    /** Constructs a new {@link SystemPermissionsDetector} check */
-    public SystemPermissionsDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return file.getName().equals(ANDROID_MANIFEST_XML);
-    }
-
-    // ---- Implements Detector.XmlScanner ----
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(TAG_USES_PERMISSION);
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        Attr nameNode = element.getAttributeNodeNS(ANDROID_URI, ATTR_NAME);
-        if (nameNode != null) {
-            String permissionName = nameNode.getValue();
-            if (Arrays.binarySearch(SYSTEM_PERMISSIONS, permissionName) >= 0) {
-                context.report(ISSUE, element, context.getLocation(nameNode),
-                    "Permission is only granted to system apps", null);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TextFieldDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TextFieldDetector.java
deleted file mode 100644
index a059f5c..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TextFieldDetector.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_HINT;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_INPUT_METHOD;
-import static com.android.SdkConstants.ATTR_INPUT_TYPE;
-import static com.android.SdkConstants.ATTR_PASSWORD;
-import static com.android.SdkConstants.ATTR_PHONE_NUMBER;
-import static com.android.SdkConstants.ATTR_STYLE;
-import static com.android.SdkConstants.EDIT_TEXT;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Checks for usability problems in text fields: omitting inputType, or omitting a hint.
- */
-public class TextFieldDetector extends LayoutDetector {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "TextFields", //$NON-NLS-1$
-            "Looks for text fields missing inputType or hint settings",
-
-            "Providing an `inputType` attribute on a text field improves usability " +
-            "because depending on the data to be input, optimized keyboards can be shown " +
-            "to the user (such as just digits and parentheses for a phone number). Similarly," +
-            "a hint attribute displays a hint to the user for what is expected in the " +
-            "text field.\n" +
-            "\n" +
-            "The lint detector also looks at the `id` of the view, and if the id offers a " +
-            "hint of the purpose of the field (for example, the `id` contains the phrase " +
-            "`phone` or `email`), then lint will also ensure that the `inputType` contains " +
-            "the corresponding type attributes.\n" +
-            "\n" +
-            "If you really want to keep the text field generic, you can suppress this warning " +
-            "by setting `inputType=\"text\"`.",
-
-            Category.USABILITY,
-            5,
-            Severity.WARNING,
-            TextFieldDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new {@link TextFieldDetector} */
-    public TextFieldDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(EDIT_TEXT);
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        String style = element.getAttribute(ATTR_STYLE);
-        if (style != null && !style.isEmpty()) {
-            // The input type might be specified via a style. This will require
-            // us to track these (similar to what is done for the
-            // RequiredAttributeDetector to track layout_width and layout_height
-            // in style declarations). For now, simply ignore these elements
-            // to avoid producing false positives.
-            return;
-        }
-
-        Attr inputTypeNode = element.getAttributeNodeNS(ANDROID_URI, ATTR_INPUT_TYPE);
-        if (inputTypeNode == null &&
-                !element.hasAttributeNS(ANDROID_URI, ATTR_HINT)) {
-            // Also make sure the EditText does not set an inputMethod in which case
-            // an inputType might be provided from the input.
-            if (element.hasAttributeNS(ANDROID_URI, ATTR_INPUT_METHOD)) {
-                return;
-            }
-
-            context.report(ISSUE, element, context.getLocation(element),
-                    "This text field does not specify an inputType or a hint", null);
-        }
-
-        Attr idNode = element.getAttributeNodeNS(ANDROID_URI, ATTR_ID);
-        if (idNode == null) {
-            return;
-        }
-        String id = idNode.getValue();
-        if (id.isEmpty()) {
-            return;
-        }
-        if (id.startsWith("editText")) { //$NON-NLS-1$
-            // Just the default label
-            return;
-        }
-
-        String inputType = "";
-        if (inputTypeNode != null) {
-            inputType = inputTypeNode.getValue();
-        }
-
-        // TODO: See if the name is just the default names (button1, editText1 etc)
-        // and if so, do nothing
-        // TODO: Unit test this
-
-        if (containsWord(id, "phone", true, true)) {                 //$NON-NLS-1$
-            if (!inputType.contains("phone")                         //$NON-NLS-1$
-                    && element.getAttributeNodeNS(ANDROID_URI, ATTR_PHONE_NUMBER) == null) {
-                String message = String.format("The view name (%1$s) suggests this is a phone "
-                        + "number, but it does not include 'phone' in the inputType", id);
-                reportMismatch(context, idNode, inputTypeNode, message);
-            }
-            return;
-        }
-
-        if (containsWord(id, "width", false, true)
-                || containsWord(id, "height", false, true)
-                || containsWord(id, "size", false, true)
-                || containsWord(id, "length", false, true)
-                || containsWord(id, "weight", false, true)
-                || containsWord(id, "number", false, true)) {
-            if (!inputType.contains("number") && !inputType.contains("phone")) { //$NON-NLS-1$
-                String message = String.format("The view name (%1$s) suggests this is a number, "
-                        + "but it does not include a numeric inputType (such as 'numberSigned')",
-                        id);
-                reportMismatch(context, idNode, inputTypeNode, message);
-            }
-            return;
-        }
-
-        if (containsWord(id, "password", true, true)) {   //$NON-NLS-1$
-            if (!(inputType.contains("Password"))  //$NON-NLS-1$
-                && element.getAttributeNodeNS(ANDROID_URI, ATTR_PASSWORD) == null) {
-                String message = String.format("The view name (%1$s) suggests this is a password, "
-                        + "but it does not include 'textPassword' in the inputType", id);
-                reportMismatch(context, idNode, inputTypeNode, message);
-            }
-            return;
-        }
-
-        if (containsWord(id, "email", true, true)) {                   //$NON-NLS-1$
-            if (!inputType.contains("Email")) { //$NON-NLS-1$
-                String message = String.format("The view name (%1$s) suggests this is an e-mail "
-                        + "address, but it does not include 'textEmail' in the inputType", id);
-                reportMismatch(context, idNode, inputTypeNode, message);
-            }
-            return;
-        }
-
-        if (endsWith(id, "pin", false, true)) {    //$NON-NLS-1$
-            if (!(inputType.contains("numberPassword"))  //$NON-NLS-1$
-                && element.getAttributeNodeNS(ANDROID_URI, ATTR_PASSWORD) == null) {
-                String message = String.format("The view name (%1$s) suggests this is a password, "
-                        + "but it does not include 'numberPassword' in the inputType", id);
-                reportMismatch(context, idNode, inputTypeNode, message);
-            }
-            return;
-        }
-
-        if ((containsWord(id, "uri") || containsWord(id, "url"))
-                && !inputType.contains("textUri")) {
-            String message = String.format("The view name (%1$s) suggests this is a URI, "
-                    + "but it does not include 'textUri' in the inputType", id);
-            reportMismatch(context, idNode, inputTypeNode, message);
-        }
-
-        if ((containsWord(id, "date"))            //$NON-NLS-1$
-                && !inputType.contains("date")) { //$NON-NLS-1$
-            String message = String.format("The view name (%1$s) suggests this is a date, "
-                    + "but it does not include 'date' or 'datetime' in the inputType", id);
-            reportMismatch(context, idNode, inputTypeNode, message);
-        }
-    }
-
-    private static void reportMismatch(XmlContext context, Attr idNode, Attr inputTypeNode,
-            String message) {
-        Location location;
-        if (inputTypeNode != null) {
-            location = context.getLocation(inputTypeNode);
-            Location secondary = context.getLocation(idNode);
-            secondary.setMessage("id defined here");
-            location.setSecondary(secondary);
-        } else {
-            location = context.getLocation(idNode);
-        }
-        context.report(ISSUE, idNode.getOwnerElement(), location, message, null);
-    }
-
-    /** Returns true if the given sentence contains a given word */
-    @VisibleForTesting
-    static boolean containsWord(String sentence, String word) {
-        return containsWord(sentence, word, false, false);
-    }
-
-    /**
-     * Returns true if the given sentence contains a given word
-     * @param sentence the full sentence to search within
-     * @param word the word to look for
-     * @param allowPrefix if true, allow a prefix match even if the next character
-     *    is in the same word (same case or not an underscore)
-     * @param allowSuffix if true, allow a suffix match even if the preceding character
-     *    is in the same word (same case or not an underscore)
-     * @return true if the word is contained in the sentence
-     */
-    @VisibleForTesting
-    static boolean containsWord(String sentence, String word, boolean allowPrefix,
-            boolean allowSuffix) {
-        return indexOfWord(sentence, word, allowPrefix, allowSuffix) != -1;
-    }
-
-    /** Returns true if the given sentence <b>ends</b> with a given word */
-    private static boolean endsWith(String sentence, String word, boolean allowPrefix,
-            boolean allowSuffix) {
-        int index = indexOfWord(sentence, word, allowPrefix, allowSuffix);
-
-        if (index != -1) {
-            return index == sentence.length() - word.length();
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the index of the given word in the given sentence, if any. It will match
-     * across cases, and ignore words that seem to be just a substring in the middle
-     * of another word.
-     *
-     * @param sentence the full sentence to search within
-     * @param word the word to look for
-     * @param allowPrefix if true, allow a prefix match even if the next character
-     *    is in the same word (same case or not an underscore)
-     * @param allowSuffix if true, allow a suffix match even if the preceding character
-     *    is in the same word (same case or not an underscore)
-     * @return true if the word is contained in the sentence
-     */
-    private static int indexOfWord(String sentence, String word, boolean allowPrefix,
-            boolean allowSuffix) {
-        if (sentence.isEmpty()) {
-            return -1;
-        }
-        int wordLength = word.length();
-        if (wordLength > sentence.length()) {
-            return -1;
-        }
-
-        char firstUpper = Character.toUpperCase(word.charAt(0));
-        char firstLower = Character.toLowerCase(firstUpper);
-
-        int start = 0;
-        if (sentence.startsWith(NEW_ID_PREFIX)) {
-            start += NEW_ID_PREFIX.length();
-        } else if (sentence.startsWith(ID_PREFIX)) {
-            start += ID_PREFIX.length();
-        }
-
-        for (int i = start, n = sentence.length(), m = n - (wordLength - 1); i < m; i++) {
-            char c = sentence.charAt(i);
-            if (c == firstUpper || c == firstLower) {
-                if (sentence.regionMatches(true, i, word, 0, wordLength)) {
-                    if (i <= start && allowPrefix) {
-                        return i;
-                    }
-                    if (i == m - 1 && allowSuffix) {
-                        return i;
-                    }
-                    if (i <= start || (sentence.charAt(i - 1) == '_')
-                            || Character.isUpperCase(c)) {
-                        if (i == m - 1) {
-                            return i;
-                        }
-                        char after = sentence.charAt(i + wordLength);
-                        if (after == '_' || Character.isUpperCase(after)) {
-                            return i;
-                        }
-                    }
-                }
-            }
-        }
-
-        return -1;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TextViewDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TextViewDetector.java
deleted file mode 100644
index 3e519cf..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TextViewDetector.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_AUTO_TEXT;
-import static com.android.SdkConstants.ATTR_BUFFER_TYPE;
-import static com.android.SdkConstants.ATTR_CAPITALIZE;
-import static com.android.SdkConstants.ATTR_CURSOR_VISIBLE;
-import static com.android.SdkConstants.ATTR_DIGITS;
-import static com.android.SdkConstants.ATTR_EDITABLE;
-import static com.android.SdkConstants.ATTR_EDITOR_EXTRAS;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_IME_ACTION_ID;
-import static com.android.SdkConstants.ATTR_IME_ACTION_LABEL;
-import static com.android.SdkConstants.ATTR_IME_OPTIONS;
-import static com.android.SdkConstants.ATTR_INPUT_METHOD;
-import static com.android.SdkConstants.ATTR_INPUT_TYPE;
-import static com.android.SdkConstants.ATTR_NUMERIC;
-import static com.android.SdkConstants.ATTR_PASSWORD;
-import static com.android.SdkConstants.ATTR_PHONE_NUMBER;
-import static com.android.SdkConstants.ATTR_PRIVATE_IME_OPTIONS;
-import static com.android.SdkConstants.ATTR_TEXT;
-import static com.android.SdkConstants.ATTR_TEXT_IS_SELECTABLE;
-import static com.android.SdkConstants.ATTR_VISIBILITY;
-import static com.android.SdkConstants.BUTTON;
-import static com.android.SdkConstants.CHECKED_TEXT_VIEW;
-import static com.android.SdkConstants.CHECK_BOX;
-import static com.android.SdkConstants.RADIO_BUTTON;
-import static com.android.SdkConstants.SWITCH;
-import static com.android.SdkConstants.TEXT_VIEW;
-import static com.android.SdkConstants.TOGGLE_BUTTON;
-import static com.android.SdkConstants.VALUE_EDITABLE;
-import static com.android.SdkConstants.VALUE_NONE;
-import static com.android.SdkConstants.VALUE_TRUE;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-/**
- * Checks for cases where a TextView should probably be an EditText instead
- */
-public class TextViewDetector extends LayoutDetector {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "TextViewEdits", //$NON-NLS-1$
-            "Looks for TextViews being used for input",
-
-            "Using a `<TextView>` to input text is generally an error, you should be " +
-            "using `<EditText>` instead.  `EditText` is a subclass of `TextView`, and some " +
-            "of the editing support is provided by `TextView`, so it's possible to set " +
-            "some input-related properties on a `TextView`. However, using a `TextView` " +
-            "along with input attributes is usually a cut & paste error. To input " +
-            "text you should be using `<EditText>`." +
-            "\n" +
-            "This check also checks subclasses of `TextView`, such as `Button` and `CheckBox`, " +
-            "since these have the same issue: they should not be used with editable " +
-            "attributes.",
-
-            Category.CORRECTNESS,
-            7,
-            Severity.WARNING,
-            TextViewDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Text could be selectable */
-    public static final Issue SELECTABLE = Issue.create(
-            "SelectableText", //$NON-NLS-1$
-            "Looks for TextViews which should probably allow their text to be selected",
-
-            "If a `<TextView>` is used to display data, the user might want to copy that " +
-            "data and paste it elsewhere. To allow this, the `<TextView>` should specify " +
-            "`android:textIsSelectable=\"true\"`.\n" +
-            "\n" +
-            "This lint check looks for TextViews which are likely to be displaying data: " +
-            "views whose text is set dynamically. This value will be ignored on platforms " +
-            "older than API 11, so it is okay to set it regardless of your `minSdkVersion`.",
-
-            Category.USABILITY,
-            7,
-            Severity.WARNING,
-            TextViewDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new {@link TextViewDetector} */
-    public TextViewDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                TEXT_VIEW,
-                BUTTON,
-                TOGGLE_BUTTON,
-                CHECK_BOX,
-                RADIO_BUTTON,
-                CHECKED_TEXT_VIEW,
-                SWITCH
-        );
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        if (element.getTagName().equals(TEXT_VIEW)) {
-            if (!element.hasAttributeNS(ANDROID_URI, ATTR_TEXT)
-                    && element.hasAttributeNS(ANDROID_URI, ATTR_ID)
-                    && !element.hasAttributeNS(ANDROID_URI, ATTR_TEXT_IS_SELECTABLE)
-                    && !element.hasAttributeNS(ANDROID_URI, ATTR_VISIBILITY)
-                    && context.getMainProject().getTargetSdk() >= 11) {
-                context.report(SELECTABLE, element, context.getLocation(element),
-                        "Consider making the text value selectable by specifying " +
-                        "android:textIsSelectable=\"true\"", null);
-            }
-        }
-
-        NamedNodeMap attributes = element.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Attr attribute = (Attr) attributes.item(i);
-            String name = attribute.getLocalName();
-            if (name == null) {
-                // Attribute not in a namespace; we only care about the android: ones
-                continue;
-            }
-
-            boolean isEditAttribute = false;
-            switch (name.charAt(0)) {
-                case 'a': {
-                    isEditAttribute = name.equals(ATTR_AUTO_TEXT);
-                    break;
-                }
-                case 'b': {
-                    isEditAttribute = name.equals(ATTR_BUFFER_TYPE) &&
-                            attribute.getValue().equals(VALUE_EDITABLE);
-                    break;
-                }
-                case 'p': {
-                    isEditAttribute = name.equals(ATTR_PASSWORD)
-                            || name.equals(ATTR_PHONE_NUMBER)
-                            || name.equals(ATTR_PRIVATE_IME_OPTIONS);
-                    break;
-                }
-                case 'c': {
-                    isEditAttribute = name.equals(ATTR_CAPITALIZE)
-                            || name.equals(ATTR_CURSOR_VISIBLE);
-                    break;
-                }
-                case 'd': {
-                    isEditAttribute = name.equals(ATTR_DIGITS);
-                    break;
-                }
-                case 'e': {
-                    if (name.equals(ATTR_EDITABLE)) {
-                        isEditAttribute = attribute.getValue().equals(VALUE_TRUE);
-                    } else {
-                        isEditAttribute = name.equals(ATTR_EDITOR_EXTRAS);
-                    }
-                    break;
-                }
-                case 'i': {
-                    if (name.equals(ATTR_INPUT_TYPE)) {
-                        String value = attribute.getValue();
-                        isEditAttribute = !value.isEmpty() && !value.equals(VALUE_NONE);
-                    } else {
-                        isEditAttribute = name.equals(ATTR_INPUT_TYPE)
-                                || name.equals(ATTR_IME_OPTIONS)
-                                || name.equals(ATTR_IME_ACTION_LABEL)
-                                || name.equals(ATTR_IME_ACTION_ID)
-                                || name.equals(ATTR_INPUT_METHOD);
-                    }
-                    break;
-                }
-                case 'n': {
-                    isEditAttribute = name.equals(ATTR_NUMERIC);
-                    break;
-                }
-            }
-
-            if (isEditAttribute && ANDROID_URI.equals(attribute.getNamespaceURI())) {
-                Location location = context.getLocation(attribute);
-                String message;
-                String view = element.getTagName();
-                if (view.equals(TEXT_VIEW)) {
-                    message = String.format(
-                            "Attribute %1$s should not be used with <TextView>: " +
-                            "Change element type to <EditText> ?", attribute.getName());
-                } else {
-                    message = String.format(
-                            "Attribute %1$s should not be used with <%2$s>: " +
-                            "intended for editable text widgets",
-                            attribute.getName(), view);
-                }
-                context.report(ISSUE, attribute, location, message, null);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TitleDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TitleDetector.java
deleted file mode 100644
index 5fc5340..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TitleDetector.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_TITLE;
-import static com.android.SdkConstants.ATTR_VISIBLE;
-import static com.android.SdkConstants.TAG_ITEM;
-import static com.android.SdkConstants.VALUE_FALSE;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Detector.JavaScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Element;
-
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Check which makes sure menu items specify a title
- */
-public class TitleDetector extends ResourceXmlDetector implements JavaScanner {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "MenuTitle", //$NON-NLS-1$
-            "Ensures that all menu items supply a title",
-
-            "From the action bar documentation:\n" +
-            // u2014: em dash
-            "\"It's important that you always define android:title for each menu item \u2014 " +
-            "even if you don't declare that the title appear with the action item \u2014 for " +
-            "three reasons:\n" +
-            "\n" +
-            "* If there's not enough room in the action bar for the action item, the menu " +
-            "item appears in the overflow menu and only the title appears.\n" +
-            "* Screen readers for sight-impaired users read the menu item's title.\n" +
-            "* If the action item appears with only the icon, a user can long-press the item " +
-            "to reveal a tool-tip that displays the action item's title.\n" +
-            "The android:icon is always optional, but recommended.",
-
-            Category.USABILITY,
-            5,
-            Severity.WARNING,
-            TitleDetector.class,
-            Scope.RESOURCE_FILE_SCOPE).setMoreInfo(
-            "http://developer.android.com/guide/topics/ui/actionbar.html"); //$NON-NLS-1$
-
-    /** Constructs a new {@link TitleDetector} */
-    public TitleDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.MENU;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    @Nullable
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(TAG_ITEM);
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        if (element.hasAttributeNS(ANDROID_URI, ATTR_TITLE)) {
-            return;
-        }
-
-        // TODO: Find out if this is necessary on older versions too.
-        // I swear I saw it mentioned.
-        if (context.getMainProject().getTargetSdk() < 11) {
-            return;
-        }
-
-        if (VALUE_FALSE.equals(element.getAttributeNS(ANDROID_URI, ATTR_VISIBLE))) {
-            return;
-        }
-
-        String message = "Menu items should specify a title";
-        context.report(ISSUE, element, context.getLocation(element), message, null);
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ToastDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ToastDetector.java
deleted file mode 100644
index 01804af..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ToastDetector.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.Expression;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.IntegralLiteral;
-import lombok.ast.MethodInvocation;
-import lombok.ast.Node;
-import lombok.ast.Return;
-import lombok.ast.StrictListAccessor;
-
-/** Detector looking for Toast.makeText() without a corresponding show() call */
-public class ToastDetector extends Detector implements Detector.JavaScanner {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "ShowToast", //$NON-NLS-1$
-            "Looks for code creating a Toast but forgetting to call show() on it",
-
-            "`Toast.makeText()` creates a `Toast` but does *not* show it. You must call " +
-            "`show()` on the resulting object to actually make the `Toast` appear.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.WARNING,
-            ToastDetector.class,
-            Scope.JAVA_FILE_SCOPE);
-
-
-    /** Constructs a new {@link ToastDetector} check */
-    public ToastDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return true;
-    }
-
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    public List<String> getApplicableMethodNames() {
-        return Collections.singletonList("makeText"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void visitMethod(@NonNull JavaContext context, @Nullable AstVisitor visitor,
-            @NonNull MethodInvocation node) {
-        assert node.astName().astValue().equals("makeText");
-        if (node.astOperand() == null) {
-            // "makeText()" in the code with no operand
-            return;
-        }
-
-        String operand = node.astOperand().toString();
-        if (!(operand.equals("Toast") || operand.endsWith(".Toast"))) {
-            return;
-        }
-
-        // Make sure you pass the right kind of duration: it's not a delay, it's
-        //  LENGTH_SHORT or LENGTH_LONG
-        // (see http://code.google.com/p/android/issues/detail?id=3655)
-        StrictListAccessor<Expression, MethodInvocation> args = node.astArguments();
-        if (args.size() == 3) {
-            Expression duration = args.last();
-            if (duration instanceof IntegralLiteral) {
-                context.report(ISSUE, context.getLocation(duration),
-                        "Expected duration Toast.LENGTH_SHORT or Toast.LENGTH_LONG, a custom " +
-                        "duration value is not supported",
-                        null);
-            }
-        }
-
-        Node method = JavaContext.findSurroundingMethod(node.getParent());
-        if (method == null) {
-            return;
-        }
-
-        ShowFinder finder = new ShowFinder(node);
-        method.accept(finder);
-        if (!finder.isShowCalled()) {
-            context.report(ISSUE, method, context.getLocation(node),
-                    "Toast created but not shown: did you forget to call show() ?", null);
-        }
-    }
-
-    private static class ShowFinder extends ForwardingAstVisitor {
-        /** The target makeText call */
-        private final MethodInvocation mTarget;
-        /** Whether we've found the show method */
-        private boolean mFound;
-        /** Whether we've seen the target makeText node yet */
-        private boolean mSeenTarget;
-
-        private ShowFinder(MethodInvocation target) {
-            mTarget = target;
-        }
-
-        @Override
-        public boolean visitMethodInvocation(MethodInvocation node) {
-            if (node == mTarget) {
-                mSeenTarget = true;
-            } else if ((mSeenTarget || node.astOperand() == mTarget)
-                    && "show".equals(node.astName().astValue())) { //$NON-NLS-1$
-                // TODO: Do more flow analysis to see whether we're really calling show
-                // on the right type of object?
-                mFound = true;
-            }
-
-            return true;
-        }
-
-        @Override
-        public boolean visitReturn(Return node) {
-            if (node.astValue() == mTarget) {
-                // If you just do "return Toast.makeText(...) don't warn
-                mFound = true;
-            }
-            return super.visitReturn(node);
-        }
-
-        boolean isShowCalled() {
-            return mFound;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TooManyViewsDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TooManyViewsDetector.java
deleted file mode 100644
index 94a9611..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TooManyViewsDetector.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Element;
-
-import java.util.Collection;
-
-/**
- * Checks whether a root FrameLayout can be replaced with a {@code <merge>} tag.
- */
-public class TooManyViewsDetector extends LayoutDetector {
-    /** Issue of having too many views in a single layout */
-    public static final Issue TOO_MANY = Issue.create(
-            "TooManyViews", //$NON-NLS-1$
-            "Checks whether a layout has too many views",
-            "Using too many views in a single layout is bad for " +
-            "performance. Consider using compound drawables or other tricks for " +
-            "reducing the number of views in this layout.\n\n" +
-            "The maximum view count defaults to 80 but can be configured with the " +
-            "environment variable `ANDROID_LINT_MAX_VIEW_COUNT`.",
-            Category.PERFORMANCE,
-            1,
-            Severity.WARNING,
-            TooManyViewsDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Issue of having too deep hierarchies in layouts */
-    public static final Issue TOO_DEEP = Issue.create(
-            "TooDeepLayout", //$NON-NLS-1$
-            "Checks whether a layout hierarchy is too deep",
-            "Layouts with too much nesting is bad for performance. " +
-            "Consider using a flatter layout (such as `RelativeLayout` or `GridLayout`)." +
-            "The default maximum depth is 10 but can be configured with the environment " +
-            "variable `ANDROID_LINT_MAX_DEPTH`.",
-            Category.PERFORMANCE,
-            1,
-            Severity.WARNING,
-            TooManyViewsDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    private static final int MAX_VIEW_COUNT;
-    private static final int MAX_DEPTH;
-    static {
-        int maxViewCount = 0;
-        int maxDepth = 0;
-
-        String countValue = System.getenv("ANDROID_LINT_MAX_VIEW_COUNT"); //$NON-NLS-1$
-        if (countValue != null) {
-            try {
-                maxViewCount = Integer.parseInt(countValue);
-            } catch (NumberFormatException e) {
-                // pass: set to default below
-            }
-        }
-        String depthValue = System.getenv("ANDROID_LINT_MAX_DEPTH"); //$NON-NLS-1$
-        if (depthValue != null) {
-            try {
-                maxDepth = Integer.parseInt(depthValue);
-            } catch (NumberFormatException e) {
-                // pass: set to default below
-            }
-        }
-        if (maxViewCount == 0) {
-            maxViewCount = 80;
-        }
-        if (maxDepth == 0) {
-            maxDepth = 10;
-        }
-
-        MAX_VIEW_COUNT = maxViewCount;
-        MAX_DEPTH = maxDepth;
-    }
-
-    private int mViewCount;
-    private int mDepth;
-    private boolean mWarnedAboutDepth;
-
-    /** Constructs a new {@link TooManyViewsDetector} */
-    public TooManyViewsDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public void beforeCheckFile(@NonNull Context context) {
-        mViewCount = mDepth = 0;
-        mWarnedAboutDepth = false;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return ALL;
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        mViewCount++;
-        mDepth++;
-
-        if (mDepth == MAX_DEPTH && !mWarnedAboutDepth) {
-            // Have to record whether or not we've warned since we could have many siblings
-            // at the max level and we'd warn for each one. No need to do the same thing
-            // for the view count error since we'll only have view count exactly equal the
-            // max just once.
-            mWarnedAboutDepth = true;
-            String msg = String.format("%1$s has more than %2$d levels, bad for performance",
-                    context.file.getName(), MAX_DEPTH);
-            context.report(TOO_DEEP, element, context.getLocation(element), msg, null);
-        }
-        if (mViewCount == MAX_VIEW_COUNT) {
-            String msg = String.format("%1$s has more than %2$d views, bad for performance",
-                    context.file.getName(), MAX_VIEW_COUNT);
-            context.report(TOO_MANY, element, context.getLocation(element), msg, null);
-        }
-    }
-
-    @Override
-    public void visitElementAfter(@NonNull XmlContext context, @NonNull Element element) {
-        mDepth--;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TranslationDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TranslationDetector.java
deleted file mode 100644
index 5ca6046..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TranslationDetector.java
+++ /dev/null
@@ -1,580 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.ATTR_LOCALE;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_TRANSLATABLE;
-import static com.android.SdkConstants.STRING_PREFIX;
-import static com.android.SdkConstants.TAG_ITEM;
-import static com.android.SdkConstants.TAG_STRING;
-import static com.android.SdkConstants.TAG_STRING_ARRAY;
-import static com.android.SdkConstants.TOOLS_URI;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-/**
- * Checks for incomplete translations - e.g. keys that are only present in some
- * locales but not all.
- */
-public class TranslationDetector extends ResourceXmlDetector {
-    @VisibleForTesting
-    static boolean sCompleteRegions =
-            System.getenv("ANDROID_LINT_COMPLETE_REGIONS") != null; //$NON-NLS-1$
-
-    private static final Pattern LANGUAGE_PATTERN = Pattern.compile("^[a-z]{2}$"); //$NON-NLS-1$
-    private static final Pattern REGION_PATTERN = Pattern.compile("^r([A-Z]{2})$"); //$NON-NLS-1$
-
-    /** Are all translations complete? */
-    public static final Issue MISSING = Issue.create(
-            "MissingTranslation", //$NON-NLS-1$
-            "Checks for incomplete translations where not all strings are translated",
-            "If an application has more than one locale, then all the strings declared in " +
-            "one language should also be translated in all other languages.\n" +
-            "\n" +
-            "If the string should *not* be translated, you can add the attribute " +
-            "`translatable=\"false\"` on the `<string>` element, or you can define all " +
-            "your non-translatable strings in a resource file called `donottranslate.xml`. " +
-            "Or, you can ignore the issue with a `tools:ignore=\"MissingTranslation\"` " +
-            "attribute.\n" +
-            "\n" +
-            "By default this detector allows regions of a language to just provide a " +
-            "subset of the strings and fall back to the standard language strings. " +
-            "You can require all regions to provide a full translation by setting the " +
-            "environment variable `ANDROID_LINT_COMPLETE_REGIONS`.\n" +
-            "\n" +
-            "You can tell lint (and other tools) which language is the default language " +
-            "in your `res/values/` folder by specifying `tools:locale=\"languageCode\"` for " +
-            "the root `<resources>` element in your resource file. (The `tools` prefix refers " +
-            "to the namespace declaration `http://schemas.android.com/tools`.)",
-            Category.MESSAGES,
-            8,
-            Severity.FATAL,
-            TranslationDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    /** Are there extra translations that are "unused" (appear only in specific languages) ? */
-    public static final Issue EXTRA = Issue.create(
-            "ExtraTranslation", //$NON-NLS-1$
-            "Checks for translations that appear to be unused (no default language string)",
-            "If a string appears in a specific language translation file, but there is " +
-            "no corresponding string in the default locale, then this string is probably " +
-            "unused. (It's technically possible that your application is only intended to " +
-            "run in a specific locale, but it's still a good idea to provide a fallback.).\n" +
-            "\n" +
-            "Note that these strings can lead to crashes if the string is looked up on any " +
-            "locale not providing a translation, so it's important to clean them up.",
-            Category.MESSAGES,
-            6,
-            Severity.FATAL,
-            TranslationDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    private Set<String> mNames;
-    private Set<String> mTranslatedArrays;
-    private Set<String> mNonTranslatable;
-    private boolean mIgnoreFile;
-    private Map<File, Set<String>> mFileToNames;
-    private Map<File, String> mFileToLocale;
-
-    /** Locations for each untranslated string name. Populated during phase 2, if necessary */
-    private Map<String, Location> mMissingLocations;
-
-    /** Locations for each extra translated string name. Populated during phase 2, if necessary */
-    private Map<String, Location> mExtraLocations;
-
-    /** Error messages for each untranslated string name. Populated during phase 2, if necessary */
-    private Map<String, String> mDescriptions;
-
-    /** Constructs a new {@link TranslationDetector} */
-    public TranslationDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.VALUES;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                TAG_STRING,
-                TAG_STRING_ARRAY
-        );
-    }
-
-    @Override
-    public void beforeCheckProject(@NonNull Context context) {
-        if (context.getDriver().getPhase() == 1) {
-            mFileToNames = new HashMap<File, Set<String>>();
-        }
-    }
-
-    @Override
-    public void beforeCheckFile(@NonNull Context context) {
-        if (context.getPhase() == 1) {
-            mNames = new HashSet<String>();
-        }
-
-        // Convention seen in various projects
-        mIgnoreFile = context.file.getName().startsWith("donottranslate"); //$NON-NLS-1$
-
-        if (!context.getProject().getReportIssues()) {
-            mIgnoreFile = true;
-        }
-    }
-
-    @Override
-    public void afterCheckFile(@NonNull Context context) {
-        if (context.getPhase() == 1) {
-            // Store this layout's set of ids for full project analysis in afterCheckProject
-            if (context.getProject().getReportIssues() && mNames != null) {
-                mFileToNames.put(context.file, mNames);
-
-                Element root = ((XmlContext) context).document.getDocumentElement();
-                if (root != null) {
-                    String locale = root.getAttributeNS(TOOLS_URI, ATTR_LOCALE);
-                    if (locale != null && !locale.isEmpty()) {
-                        if (mFileToLocale == null) {
-                            mFileToLocale = Maps.newHashMap();
-                        }
-                        mFileToLocale.put(context.file, locale);
-                    }
-                }
-            }
-
-            mNames = null;
-        }
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (context.getPhase() == 1) {
-            // NOTE - this will look for the presence of translation strings.
-            // If you create a resource folder but don't actually place a file in it
-            // we won't detect that, but it seems like a smaller problem.
-
-            checkTranslations(context);
-
-            mFileToNames = null;
-
-            if (mMissingLocations != null || mExtraLocations != null) {
-                context.getDriver().requestRepeat(this, Scope.ALL_RESOURCES_SCOPE);
-            }
-        } else {
-            assert context.getPhase() == 2;
-
-            reportMap(context, MISSING, mMissingLocations);
-            reportMap(context, EXTRA, mExtraLocations);
-            mMissingLocations = null;
-            mExtraLocations = null;
-            mDescriptions = null;
-        }
-    }
-
-    private void reportMap(Context context, Issue issue, Map<String, Location> map) {
-        if (map != null) {
-            for (Map.Entry<String, Location> entry : map.entrySet()) {
-                Location location = entry.getValue();
-                String name = entry.getKey();
-                String message = mDescriptions.get(name);
-
-                // We were prepending locations, but we want to prefer the base folders
-                location = Location.reverse(location);
-
-                context.report(issue, location, message, null);
-            }
-        }
-    }
-
-    private void checkTranslations(Context context) {
-        // Only one file defining strings? If so, no problems.
-        Set<File> files = mFileToNames.keySet();
-        if (files.size() == 1) {
-            return;
-        }
-
-        Set<File> parentFolders = new HashSet<File>();
-        for (File file : files) {
-            parentFolders.add(file.getParentFile());
-        }
-        if (parentFolders.size() == 1) {
-            // Only one language - no problems.
-            return;
-        }
-
-        boolean reportMissing = context.isEnabled(MISSING);
-        boolean reportExtra = context.isEnabled(EXTRA);
-
-        // res/strings.xml etc
-        String defaultLanguage = "Default";
-
-        Map<File, String> parentFolderToLanguage = new HashMap<File, String>();
-        for (File parent : parentFolders) {
-            String name = parent.getName();
-
-            // Look up the language for this folder.
-            String language = getLanguage(name);
-            if (language == null) {
-                language = defaultLanguage;
-            }
-
-            parentFolderToLanguage.put(parent, language);
-        }
-
-        int languageCount = parentFolderToLanguage.values().size();
-        if (languageCount <= 1) {
-            // At most one language -- no problems.
-            return;
-        }
-
-        // Merge together the various files building up the translations for each language
-        Map<String, Set<String>> languageToStrings =
-                new HashMap<String, Set<String>>(languageCount);
-        Set<String> allStrings = new HashSet<String>(200);
-        for (File file : files) {
-            String language = null;
-            if (mFileToLocale != null) {
-                String locale = mFileToLocale.get(file);
-                if (locale != null) {
-                    int index = locale.indexOf('-');
-                    if (index != -1) {
-                        locale = locale.substring(0, index);
-                    }
-                    language = locale;
-                }
-            }
-            if (language == null) {
-                language = parentFolderToLanguage.get(file.getParentFile());
-            }
-            assert language != null : file.getParent();
-            Set<String> fileStrings = mFileToNames.get(file);
-
-            Set<String> languageStrings = languageToStrings.get(language);
-            if (languageStrings == null) {
-                // We don't need a copy; we're done with the string tables now so we
-                // can modify them
-                languageToStrings.put(language, fileStrings);
-            } else {
-                languageStrings.addAll(fileStrings);
-            }
-            allStrings.addAll(fileStrings);
-        }
-
-        Set<String> defaultStrings = languageToStrings.get(defaultLanguage);
-        if (defaultStrings == null) {
-            defaultStrings = new HashSet<String>();
-        }
-
-        // Fast check to see if there's no problem: if the default locale set is the
-        // same as the all set (meaning there are no extra strings in the other languages)
-        // then we can quickly determine if everything is okay by just making sure that
-        // each language defines everything. If that's the case they will all have the same
-        // string count.
-        int stringCount = allStrings.size();
-        if (stringCount == defaultStrings.size()) {
-            boolean haveError = false;
-            for (Map.Entry<String, Set<String>> entry : languageToStrings.entrySet()) {
-                Set<String> strings = entry.getValue();
-                if (stringCount != strings.size()) {
-                    haveError = true;
-                    break;
-                }
-            }
-            if (!haveError) {
-                return;
-            }
-        }
-
-        // Do we need to resolve fallback strings for regions that only define a subset
-        // of the strings in the language and fall back on the main language for the rest?
-        if (!sCompleteRegions) {
-            for (String l : languageToStrings.keySet()) {
-                if (l.indexOf('-') != -1) {
-                    // Yes, we have regions. Merge all base language string names into each region.
-                    for (Map.Entry<String, Set<String>> entry : languageToStrings.entrySet()) {
-                        Set<String> strings = entry.getValue();
-                        if (stringCount != strings.size()) {
-                            String languageRegion = entry.getKey();
-                            int regionIndex = languageRegion.indexOf('-');
-                            if (regionIndex != -1) {
-                                String language = languageRegion.substring(0, regionIndex);
-                                Set<String> fallback = languageToStrings.get(language);
-                                if (fallback != null) {
-                                    strings.addAll(fallback);
-                                }
-                            }
-                        }
-                    }
-                    // We only need to do this once; when we see the first region we know
-                    // we need to do it; once merged we can bail
-                    break;
-                }
-            }
-        }
-
-        List<String> languages = new ArrayList<String>(languageToStrings.keySet());
-        Collections.sort(languages);
-        for (String language : languages) {
-            Set<String> strings = languageToStrings.get(language);
-            if (defaultLanguage.equals(language)) {
-                continue;
-            }
-
-            // if strings.size() == stringCount, then this language is defining everything,
-            // both all the default language strings and the union of all extra strings
-            // defined in other languages, so there's no problem.
-            if (stringCount != strings.size()) {
-                if (reportMissing) {
-                    Set<String> difference = Sets.difference(defaultStrings, strings);
-                    if (!difference.isEmpty()) {
-                        if (mMissingLocations == null) {
-                            mMissingLocations = new HashMap<String, Location>();
-                        }
-                        if (mDescriptions == null) {
-                            mDescriptions = new HashMap<String, String>();
-                        }
-
-                        for (String s : difference) {
-                            mMissingLocations.put(s, null);
-                            String message = mDescriptions.get(s);
-                            if (message == null) {
-                                message = String.format("\"%1$s\" is not translated in %2$s",
-                                        s, language);
-                            } else {
-                                message = message + ", " + language;
-                            }
-                            mDescriptions.put(s, message);
-                        }
-                    }
-                }
-
-                if (reportExtra) {
-                    Set<String> difference = Sets.difference(strings, defaultStrings);
-                    if (!difference.isEmpty()) {
-                        if (mExtraLocations == null) {
-                            mExtraLocations = new HashMap<String, Location>();
-                        }
-                        if (mDescriptions == null) {
-                            mDescriptions = new HashMap<String, String>();
-                        }
-
-                        for (String s : difference) {
-                            if (mTranslatedArrays != null && mTranslatedArrays.contains(s)) {
-                                continue;
-                            }
-                            mExtraLocations.put(s, null);
-                            String message = String.format(
-                                "\"%1$s\" is translated here but not found in default locale", s);
-                            mDescriptions.put(s, message);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /** Look up the language for the given folder name */
-    private static String getLanguage(String name) {
-        String[] segments = name.split("-"); //$NON-NLS-1$
-
-        // TODO: To get an accurate answer, this should later do a
-        //   FolderConfiguration.getConfig(String[] folderSegments)
-        // to obtain a FolderConfiguration, then call
-        // getLanguageQualifier() on it, and if not null, call getValue() to get the
-        // actual language value.
-        // However, we don't have sdk_common on the build path for lint, so for now
-        // use a simple guess about what constitutes a language qualifier here:
-
-        String language = null;
-        for (String segment : segments) {
-            // Language
-            if (language == null && segment.length() == 2
-                    && LANGUAGE_PATTERN.matcher(segment).matches()) {
-                language = segment;
-            }
-
-            // Add in region
-            if (language != null && segment.length() == 3
-                    && REGION_PATTERN.matcher(segment).matches()) {
-                language = language + '-' + segment;
-                break;
-            }
-        }
-
-        return language;
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        if (mIgnoreFile) {
-            return;
-        }
-
-        Attr attribute = element.getAttributeNode(ATTR_NAME);
-
-        if (context.getPhase() == 2) {
-            // Just locating names requested in the {@link #mLocations} map
-            if (attribute == null) {
-                return;
-            }
-            String name = attribute.getValue();
-            if (mMissingLocations != null && mMissingLocations.containsKey(name)) {
-                String language = getLanguage(context.file.getParentFile().getName());
-                if (language == null) {
-                    if (context.getDriver().isSuppressed(MISSING, element)) {
-                        mMissingLocations.remove(name);
-                        return;
-                    }
-
-                    Location location = context.getLocation(attribute);
-                    location.setClientData(element);
-                    location.setSecondary(mMissingLocations.get(name));
-                    mMissingLocations.put(name, location);
-                }
-            }
-            if (mExtraLocations != null && mExtraLocations.containsKey(name)) {
-                if (context.getDriver().isSuppressed(EXTRA, element)) {
-                    mExtraLocations.remove(name);
-                    return;
-                }
-                Location location = context.getLocation(attribute);
-                location.setClientData(element);
-                location.setMessage("Also translated here");
-                location.setSecondary(mExtraLocations.get(name));
-                mExtraLocations.put(name, location);
-            }
-            return;
-        }
-
-        assert context.getPhase() == 1;
-        if (attribute == null || attribute.getValue().isEmpty()) {
-            context.report(MISSING, element, context.getLocation(element),
-                    "Missing name attribute in <string> declaration", null);
-        } else {
-            String name = attribute.getValue();
-
-            Attr translatable = element.getAttributeNode(ATTR_TRANSLATABLE);
-            if (translatable != null && !Boolean.valueOf(translatable.getValue())) {
-                String l = LintUtils.getLocaleAndRegion(context.file.getParentFile().getName());
-                if (l != null) {
-                    context.report(EXTRA, translatable, context.getLocation(translatable),
-                        "Non-translatable resources should only be defined in the base " +
-                        "values/ folder", null);
-                } else {
-                    if (mNonTranslatable == null) {
-                        mNonTranslatable = new HashSet<String>();
-                    }
-                    mNonTranslatable.add(name);
-                }
-                return;
-            }
-
-            if (element.getTagName().equals(TAG_STRING_ARRAY) &&
-                    allItemsAreReferences(element)) {
-                // No need to provide translations for string arrays where all
-                // the children items are defined as translated string resources,
-                // e.g.
-                //    <string-array name="foo">
-                //       <item>@string/item1</item>
-                //       <item>@string/item2</item>
-                //    </string-array>
-                // However, we need to remember these names such that we don't consider
-                // these arrays "extra" if one of the *translated* versions of the array
-                // perform an inline translation of an array item
-                if (mTranslatedArrays == null) {
-                    mTranslatedArrays = new HashSet<String>();
-                }
-                mTranslatedArrays.add(name);
-                return;
-            }
-
-            // Check for duplicate name definitions? No, because there can be
-            // additional customizations like product=
-            //if (mNames.contains(name)) {
-            //    context.mClient.report(ISSUE, context.getLocation(attribute),
-            //        String.format("Duplicate name %1$s, already defined earlier in this file",
-            //            name));
-            //}
-
-            mNames.add(name);
-
-            if (mNonTranslatable != null && mNonTranslatable.contains(name)) {
-                String message = String.format("The resource string \"%1$s\" has been marked as " +
-                        "translatable=\"false\"", name);
-                context.report(EXTRA, attribute, context.getLocation(attribute), message, null);
-            }
-
-            // TBD: Also make sure that the strings are not empty or placeholders?
-        }
-    }
-
-    private static boolean allItemsAreReferences(Element element) {
-        assert element.getTagName().equals(TAG_STRING_ARRAY);
-        NodeList childNodes = element.getChildNodes();
-        for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-            Node item = childNodes.item(i);
-            if (item.getNodeType() == Node.ELEMENT_NODE &&
-                    TAG_ITEM.equals(item.getNodeName())) {
-                NodeList itemChildren = item.getChildNodes();
-                for (int j = 0, m = itemChildren.getLength(); j < m; j++) {
-                    Node valueNode = itemChildren.item(j);
-                    if (valueNode.getNodeType() == Node.TEXT_NODE) {
-                        String value = valueNode.getNodeValue().trim();
-                        if (!value.startsWith(ANDROID_PREFIX)
-                                && !value.startsWith(STRING_PREFIX)) {
-                            return false;
-                        }
-                    }
-                }
-            }
-        }
-
-        return true;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TypoDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TypoDetector.java
deleted file mode 100644
index b9b889f..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TypoDetector.java
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ATTR_LOCALE;
-import static com.android.SdkConstants.FD_RES_VALUES;
-import static com.android.SdkConstants.TAG_STRING;
-import static com.android.SdkConstants.TOOLS_URI;
-import static com.android.tools.lint.checks.TypoLookup.isLetter;
-import static com.google.common.base.Objects.equal;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.base.Charsets;
-import com.google.common.base.Splitter;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Check which looks for likely typos in Strings.
- * <p>
- * TODO:
- * <ul>
- * <li> Add check of Java String literals too!
- * <li> Add support for <b>additional</b> languages. The typo detector is now
- *      multilingual and looks for typos-*locale*.txt files to use. However,
- *      we need to seed it with additional typo databases. I did some searching
- *      and came up with some alternatives. Here's the strategy I used:
- *      Used Google Translate to translate "Wikipedia Common Misspellings", and
- *      then I went to google.no, google.fr etc searching with that translation, and
- *      came up with what looks like wikipedia language local lists of typos.
- *      This is how I found the Norwegian one for example:
- *      <br>
- *         http://no.wikipedia.org/wiki/Wikipedia:Liste_over_alminnelige_stavefeil/Maskinform
- *      <br>
- *     Here are some additional possibilities not yet processed:
- *      <ul>
- *        <li> French: http://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Liste_de_fautes_d'orthographe_courantes
- *            (couldn't find a machine-readable version there?)
- *         <li> Swedish:
- *              http://sv.wikipedia.org/wiki/Wikipedia:Lista_%C3%B6ver_vanliga_spr%C3%A5kfel
- *              (couldn't find a machine-readable version there?)
- *        <li> German
- *              http://de.wikipedia.org/wiki/Wikipedia:Liste_von_Tippfehlern/F%C3%BCr_Maschinen
- *       </ul>
- * <li> Consider also digesting files like
- *       http://sv.wikipedia.org/wiki/Wikipedia:AutoWikiBrowser/Typos
- *       See http://en.wikipedia.org/wiki/Wikipedia:AutoWikiBrowser/User_manual.
- * </ul>
- */
-public class TypoDetector extends ResourceXmlDetector {
-    @Nullable private TypoLookup mLookup;
-    @Nullable private String mLastLanguage;
-    @Nullable private String mLastRegion;
-    @Nullable private String mLanguage;
-    @Nullable private String mRegion;
-
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "Typos", //$NON-NLS-1$
-            "Looks for typos in messages",
-
-            "This check looks through the string definitions, and if it finds any words " +
-            "that look like likely misspellings, they are flagged.",
-            Category.MESSAGES,
-            7,
-            Severity.WARNING,
-            TypoDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new detector */
-    public TypoDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.VALUES;
-    }
-
-    /** Look up the locale and region from the given parent folder name and store it
-     * in {@link #mLanguage} and {@link #mRegion} */
-    private void initLocale(@NonNull String parent) {
-        mLanguage = null;
-        mRegion = null;
-
-        if (parent.equals(FD_RES_VALUES)) {
-            return;
-        }
-
-        for (String qualifier : Splitter.on('-').split(parent)) {
-            int qualifierLength = qualifier.length();
-            if (qualifierLength == 2) {
-                char first = qualifier.charAt(0);
-                char second = qualifier.charAt(1);
-                if (first >= 'a' && first <= 'z' && second >= 'a' && second <= 'z') {
-                    mLanguage = qualifier;
-                }
-            } else if (qualifierLength == 3 && qualifier.charAt(0) == 'r') {
-                char first = qualifier.charAt(1);
-                char second = qualifier.charAt(2);
-                if (first >= 'A' && first <= 'Z' && second >= 'A' && second <= 'Z') {
-                    mRegion = new String(new char[] { first, second }); // Don't include the "r"
-                }
-                break;
-            }
-        }
-    }
-
-    @Override
-    public void beforeCheckFile(@NonNull Context context) {
-        initLocale(context.file.getParentFile().getName());
-        if (mLanguage == null) {
-            // Check to see if the user has specified the language for this folder
-            // using a tools:locale attribute
-            if (context instanceof XmlContext) {
-                Element root = ((XmlContext) context).document.getDocumentElement();
-                if (root != null) {
-                    String locale = root.getAttributeNS(TOOLS_URI, ATTR_LOCALE);
-                    if (locale != null && !locale.isEmpty()) {
-                        initLocale(FD_RES_VALUES + '-' + locale);
-                    }
-                }
-            }
-
-            if (mLanguage == null) {
-                mLanguage = "en"; //$NON-NLS-1$
-            }
-        }
-
-        if (!equal(mLastLanguage, mLanguage) || !equal(mLastRegion, mRegion)) {
-            mLookup = TypoLookup.get(context.getClient(), mLanguage, mRegion);
-            mLastLanguage = mLanguage;
-            mLastRegion = mRegion;
-        }
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.NORMAL;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(TAG_STRING);
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        if (mLookup == null) {
-            return;
-        }
-
-        visit(context, element);
-    }
-
-    private void visit(XmlContext context, Node node) {
-        if (node.getNodeType() == Node.TEXT_NODE) {
-            // TODO: Figure out how to deal with entities
-            check(context, node, node.getNodeValue());
-        } else {
-            NodeList children = node.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++) {
-                visit(context, children.item(i));
-            }
-        }
-    }
-
-    private void check(XmlContext context, Node node, String text) {
-        int max = text.length();
-        int index = 0;
-        boolean checkedTypos = false;
-        while (index < max) {
-            for (; index < max; index++) {
-                char c = text.charAt(index);
-                if (c == '\\') {
-                    index++;
-                    continue;
-                } else if (Character.isLetter(c)) {
-                    break;
-                }
-            }
-            if (index >= max) {
-                return;
-            }
-            int begin = index;
-            for (; index < max; index++) {
-                char c = text.charAt(index);
-                if (c == '\\') {
-                    index++;
-                    break;
-                } else if (!Character.isLetter(c)) {
-                    break;
-                } else if (text.charAt(index) >= 0x80) {
-                    // Switch to UTF-8 handling for this string
-                    if (checkedTypos) {
-                        // If we've already checked words we may have reported typos
-                        // so create a substring from the current word and on.
-                        byte[] utf8Text = text.substring(begin).getBytes(Charsets.UTF_8);
-                        check(context, node, utf8Text, 0, utf8Text.length, text, begin);
-                    } else {
-                        // If all we've done so far is skip whitespace (common scenario)
-                        // then no need to substring the text, just re-search with the
-                        // UTF-8 routines
-                        byte[] utf8Text = text.getBytes(Charsets.UTF_8);
-                        check(context, node, utf8Text, 0, utf8Text.length, text, 0);
-                    }
-                    return;
-                }
-            }
-
-            int end = index;
-            checkedTypos = true;
-            List<String> replacements = mLookup.getTypos(text, begin, end);
-            if (replacements != null) {
-                reportTypo(context, node, text, begin, replacements);
-            }
-
-            index = end + 1;
-        }
-    }
-
-    private void check(XmlContext context, Node node, byte[] utf8Text,
-            int byteStart, int byteEnd, String text, int charStart) {
-        int index = byteStart;
-        while (index < byteEnd) {
-            // Find beginning of word
-            while (index < byteEnd) {
-                byte b = utf8Text[index];
-                if (b == '\\') {
-                    index++;
-                    charStart++;
-                    if (index < byteEnd) {
-                        b = utf8Text[index];
-                    }
-                } else if (isLetter(b)) {
-                    break;
-                }
-                index++;
-                if ((b & 0x80) == 0 || (b & 0xC0) == 0xC0) {
-                    // First characters in UTF-8 are always ASCII (0 high bit) or 11XXXXXX
-                    charStart++;
-                }
-            }
-
-            if (index >= byteEnd) {
-                return;
-            }
-            int charEnd = charStart;
-            int begin = index;
-
-            // Find end of word. Unicode has the nice property that even 2nd, 3rd and 4th
-            // bytes won't match these ASCII characters (because the high bit must be set there)
-            while (index < byteEnd) {
-                byte b = utf8Text[index];
-                if (b == '\\') {
-                    index++;
-                    charEnd++;
-                    if (index < byteEnd) {
-                        b = utf8Text[index++];
-                        if ((b & 0x80) == 0 || (b & 0xC0) == 0xC0) {
-                            charEnd++;
-                        }
-                    }
-                    break;
-                } else if (!isLetter(b)) {
-                    break;
-                }
-                index++;
-                if ((b & 0x80) == 0 || (b & 0xC0) == 0xC0) {
-                    // First characters in UTF-8 are always ASCII (0 high bit) or 11XXXXXX
-                    charEnd++;
-                }
-            }
-
-            int end = index;
-            List<String> replacements = mLookup.getTypos(utf8Text, begin, end);
-            if (replacements != null) {
-                reportTypo(context, node, text, charStart, replacements);
-            }
-
-            charStart = charEnd;
-        }
-    }
-
-    /** Report the typo found at the given offset and suggest the given replacements */
-    private static void reportTypo(XmlContext context, Node node, String text, int begin,
-            List<String> replacements) {
-        if (replacements.size() < 2) {
-            return;
-        }
-
-        String typo = replacements.get(0);
-        String word = text.substring(begin, begin + typo.length());
-
-        String first = null;
-        String message;
-
-        boolean isCapitalized = Character.isUpperCase(word.charAt(0));
-        StringBuilder sb = new StringBuilder(40);
-        for (int i = 1, n = replacements.size(); i < n; i++) {
-            String replacement = replacements.get(i);
-            if (first == null) {
-                first = replacement;
-            }
-            if (sb.length() > 0) {
-                sb.append(" or ");
-            }
-            sb.append('"');
-            if (isCapitalized) {
-                sb.append(Character.toUpperCase(replacement.charAt(0)));
-                sb.append(replacement.substring(1));
-            } else {
-                sb.append(replacement);
-            }
-            sb.append('"');
-        }
-
-        if (first != null && first.equalsIgnoreCase(word)) {
-            if (first.equals(word)) {
-                return;
-            }
-            message = String.format(
-                    "\"%1$s\" is usually capitalized as \"%2$s\"",
-                    word, first);
-        } else {
-            message = String.format(
-                    "\"%1$s\" is a common misspelling; did you mean %2$s ?",
-                    word, sb.toString());
-        }
-
-        int end = begin + word.length();
-        context.report(ISSUE, node, context.getLocation(node, begin, end), message, null);
-    }
-
-    /** Returns the suggested replacements, if any, for the given typo. The error
-     * message <b>must</b> be one supplied by lint.
-     *
-     * @param errorMessage the error message
-     * @return a list of replacement words suggested by the error message
-     */
-    @Nullable
-    public static List<String> getSuggestions(@NonNull String errorMessage) {
-        // The words are all in quotes; the first word is the misspelling,
-        // the other words are the suggested replacements
-        List<String> words = new ArrayList<String>();
-        // Skip the typo
-        int index = errorMessage.indexOf('"');
-        index = errorMessage.indexOf('"', index + 1);
-        index++;
-
-        while (true) {
-            index = errorMessage.indexOf('"', index);
-            if (index == -1) {
-                break;
-            }
-            index++;
-            int start = index;
-            index = errorMessage.indexOf('"', index);
-            if (index == -1) {
-                index = errorMessage.length();
-            }
-            words.add(errorMessage.substring(start, index));
-            index++;
-        }
-
-        return words;
-    }
-
-    /**
-     * Returns the typo word in the error message from this detector
-     *
-     * @param errorMessage the error message produced earlier by this detector
-     * @return the typo
-     */
-    @Nullable
-    public static String getTypo(@NonNull String errorMessage) {
-        // The words are all in quotes
-        int index = errorMessage.indexOf('"');
-        int start = index + 1;
-        index = errorMessage.indexOf('"', start);
-        if (index != -1) {
-            return errorMessage.substring(start, index);
-        }
-
-        return null;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TypoLookup.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TypoLookup.java
deleted file mode 100644
index 7d9d8f2..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TypoLookup.java
+++ /dev/null
@@ -1,785 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.tools.lint.detector.api.LintUtils.assertionsEnabled;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.tools.lint.client.api.LintClient;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.google.common.base.Charsets;
-import com.google.common.base.Splitter;
-import com.google.common.io.Files;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel.MapMode;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-import java.util.WeakHashMap;
-
-/**
- * Database of common typos / misspellings.
- */
-public class TypoLookup {
-    private static final TypoLookup NONE = new TypoLookup();
-
-    /** String separating misspellings and suggested replacements in the text file */
-    private static final String WORD_SEPARATOR = "->";  //$NON-NLS-1$
-
-    /** Relative path to the typos database file within the Lint installation */
-    private static final String XML_FILE_PATH = "tools/support/typos-%1$s.txt"; //$NON-NLS-1$
-    private static final String FILE_HEADER = "Typo database used by Android lint\000";
-    private static final int BINARY_FORMAT_VERSION = 2;
-    private static final boolean DEBUG_FORCE_REGENERATE_BINARY = false;
-    private static final boolean DEBUG_SEARCH = false;
-    private static final boolean WRITE_STATS = false;
-    /** Default size to reserve for each API entry when creating byte buffer to build up data */
-    private static final int BYTES_PER_ENTRY = 28;
-
-    private final LintClient mClient;
-    private final File mXmlFile;
-    private final File mBinaryFile;
-    private byte[] mData;
-    private int[] mIndices;
-    private int mWordCount;
-
-    private static final WeakHashMap<String, TypoLookup> sInstanceMap =
-            new WeakHashMap<String, TypoLookup>();
-
-    /**
-     * Returns an instance of the Typo database for the given locale
-     *
-     * @param client the client to associate with this database - used only for
-     *            logging. The database object may be shared among repeated
-     *            invocations, and in that case client used will be the one
-     *            originally passed in. In other words, this parameter may be
-     *            ignored if the client created is not new.
-     * @param locale the locale to look up a typo database for (should be a
-     *            language code (ISO 639-1, two lowercase character names)
-     * @param region the region to look up a typo database for (should be a two
-     *            letter ISO 3166-1 alpha-2 country code in upper case) language
-     *            code
-     * @return a (possibly shared) instance of the typo database, or null if its
-     *         data can't be found
-     */
-    @Nullable
-    public static TypoLookup get(@NonNull LintClient client, @NonNull String locale,
-            @Nullable String region) {
-        synchronized (TypoLookup.class) {
-            String key = locale;
-
-            if (region != null) {
-                // Allow for region-specific dictionaries. See for example
-                // http://en.wikipedia.org/wiki/American_and_British_English_spelling_differences
-                assert region.length() == 2
-                        && Character.isUpperCase(region.charAt(0))
-                        && Character.isUpperCase(region.charAt(1)) : region;
-                // Look for typos-en-rUS.txt etc
-                key = locale + 'r' + region;
-            }
-
-            TypoLookup db = sInstanceMap.get(key);
-            if (db == null) {
-                String path = String.format(XML_FILE_PATH, key);
-                File file = client.findResource(path);
-                if (file == null) {
-                    // AOSP build environment?
-                    String build = System.getenv("ANDROID_BUILD_TOP");   //$NON-NLS-1$
-                    if (build != null) {
-                        file = new File(build, ("sdk/files/" //$NON-NLS-1$
-                                    + path.substring(path.lastIndexOf('/') + 1))
-                                      .replace('/', File.separatorChar));
-                    }
-                }
-
-                if (file == null || !file.exists()) {
-                    if (region != null) {
-                        // Fall back to the generic locale (non-region-specific) database
-                        return get(client, locale, null);
-                    }
-                    db = NONE;
-                } else {
-                    db = get(client, file);
-                    assert db != null : file;
-                }
-                sInstanceMap.put(key, db);
-            }
-
-            if (db == NONE) {
-                return null;
-            } else {
-                return db;
-            }
-        }
-    }
-
-    /**
-     * Returns an instance of the typo database
-     *
-     * @param client the client to associate with this database - used only for
-     *            logging
-     * @param xmlFile the XML file containing configuration data to use for this
-     *            database
-     * @return a (possibly shared) instance of the typo database, or null
-     *         if its data can't be found
-     */
-    @Nullable
-    private static TypoLookup get(LintClient client, File xmlFile) {
-        if (!xmlFile.exists()) {
-            client.log(null, "The typo database file %1$s does not exist", xmlFile);
-            return null;
-        }
-
-        String name = xmlFile.getName();
-        if (LintUtils.endsWith(name, DOT_XML)) {
-            name = name.substring(0, name.length() - DOT_XML.length());
-        }
-        File cacheDir = client.getCacheDir(true/*create*/);
-        if (cacheDir == null) {
-            cacheDir = xmlFile.getParentFile();
-        }
-
-        File binaryData = new File(cacheDir, name
-                // Incorporate version number in the filename to avoid upgrade filename
-                // conflicts on Windows (such as issue #26663)
-                + '-' + BINARY_FORMAT_VERSION + ".bin"); //$NON-NLS-1$
-
-        if (DEBUG_FORCE_REGENERATE_BINARY) {
-            System.err.println("\nTemporarily regenerating binary data unconditionally \nfrom "
-                    + xmlFile + "\nto " + binaryData);
-            if (!createCache(client, xmlFile, binaryData)) {
-                return null;
-            }
-        } else if (!binaryData.exists() || binaryData.lastModified() < xmlFile.lastModified()) {
-            if (!createCache(client, xmlFile, binaryData)) {
-                return null;
-            }
-        }
-
-        if (!binaryData.exists()) {
-            client.log(null, "The typo database file %1$s does not exist", binaryData);
-            return null;
-        }
-
-        return new TypoLookup(client, xmlFile, binaryData);
-    }
-
-    private static boolean createCache(LintClient client, File xmlFile, File binaryData) {
-        long begin = 0;
-        if (WRITE_STATS) {
-            begin = System.currentTimeMillis();
-        }
-
-        // Read in data
-        List<String> lines;
-        try {
-            lines = Files.readLines(xmlFile, Charsets.UTF_8);
-        } catch (IOException e) {
-            client.log(e, "Can't read typo database file");
-            return false;
-        }
-
-        if (WRITE_STATS) {
-            long end = System.currentTimeMillis();
-            System.out.println("Reading data structures took " + (end - begin) + " ms)");
-        }
-
-        try {
-            writeDatabase(binaryData, lines);
-            return true;
-        } catch (IOException ioe) {
-            client.log(ioe, "Can't write typo cache file");
-        }
-
-        return false;
-    }
-
-    /** Use one of the {@link #get} factory methods instead */
-    private TypoLookup(
-            @NonNull LintClient client,
-            @NonNull File xmlFile,
-            @Nullable File binaryFile) {
-        mClient = client;
-        mXmlFile = xmlFile;
-        mBinaryFile = binaryFile;
-
-        if (binaryFile != null) {
-            readData();
-        }
-    }
-
-    private TypoLookup() {
-        mClient = null;
-        mXmlFile = null;
-        mBinaryFile = null;
-    }
-
-    private void readData() {
-        if (!mBinaryFile.exists()) {
-            mClient.log(null, "%1$s does not exist", mBinaryFile);
-            return;
-        }
-        long start = System.currentTimeMillis();
-        try {
-            MappedByteBuffer buffer = Files.map(mBinaryFile, MapMode.READ_ONLY);
-            assert buffer.order() == ByteOrder.BIG_ENDIAN;
-
-            // First skip the header
-            byte[] expectedHeader = FILE_HEADER.getBytes(Charsets.US_ASCII);
-            buffer.rewind();
-            for (int offset = 0; offset < expectedHeader.length; offset++) {
-                if (expectedHeader[offset] != buffer.get()) {
-                    mClient.log(null, "Incorrect file header: not an typo database cache " +
-                            "file, or a corrupt cache file");
-                    return;
-                }
-            }
-
-            // Read in the format number
-            if (buffer.get() != BINARY_FORMAT_VERSION) {
-                // Force regeneration of new binary data with up to date format
-                if (createCache(mClient, mXmlFile, mBinaryFile)) {
-                    readData(); // Recurse
-                }
-
-                return;
-            }
-
-            mWordCount = buffer.getInt();
-
-            // Read in the word table indices;
-            int count = mWordCount;
-            int[] offsets = new int[count];
-
-            // Another idea: I can just store the DELTAS in the file (and add them up
-            // when reading back in) such that it takes just ONE byte instead of four!
-
-            for (int i = 0; i < count; i++) {
-                offsets[i] = buffer.getInt();
-            }
-
-            // No need to read in the rest -- we'll just keep the whole byte array in memory
-            // TODO: Make this code smarter/more efficient.
-            int size = buffer.limit();
-            byte[] b = new byte[size];
-            buffer.rewind();
-            buffer.get(b);
-            mData = b;
-            mIndices = offsets;
-
-            // TODO: We only need to keep the data portion here since we've initialized
-            // the offset array separately.
-            // TODO: Investigate (profile) accessing the byte buffer directly instead of
-            // accessing a byte array.
-        } catch (IOException e) {
-            mClient.log(e, null);
-        }
-        if (WRITE_STATS) {
-            long end = System.currentTimeMillis();
-            System.out.println("\nRead typo database in " + (end - start)
-                    + " milliseconds.");
-            System.out.println("Size of data table: " + mData.length + " bytes ("
-                    + Integer.toString(mData.length/1024) + "k)\n");
-        }
-    }
-
-    /** See the {@link #readData()} for documentation on the data format. */
-    private static void writeDatabase(File file, List<String> lines) throws IOException {
-        /*
-         * 1. A file header, which is the exact contents of {@link FILE_HEADER} encoded
-         *     as ASCII characters. The purpose of the header is to identify what the file
-         *     is for, for anyone attempting to open the file.
-         * 2. A file version number. If the binary file does not match the reader's expected
-         *     version, it can ignore it (and regenerate the cache from XML).
-         */
-
-        // Drop comments etc
-        List<String> words = new ArrayList<String>(lines.size());
-        for (String line : lines) {
-            if (!line.isEmpty() && Character.isLetter(line.charAt(0))) {
-                int end = line.indexOf(WORD_SEPARATOR);
-                if (end == -1) {
-                    end = line.trim().length();
-                }
-                String typo = line.substring(0, end).trim();
-                String replacements = line.substring(end + WORD_SEPARATOR.length()).trim();
-                if (replacements.isEmpty()) {
-                    // We don't support empty replacements
-                    continue;
-                }
-                String combined = typo + (char) 0 + replacements;
-
-                words.add(combined);
-            }
-        }
-
-        byte[][] wordArrays = new byte[words.size()][];
-        for (int i = 0, n = words.size(); i < n; i++) {
-            String word = words.get(i);
-            wordArrays[i] = word.getBytes(Charsets.UTF_8);
-        }
-        // Sort words, using our own comparator to ensure that it matches the
-        // binary search in getTypos()
-        Comparator<byte[]> comparator = new Comparator<byte[]>() {
-            @Override
-            public int compare(byte[] o1, byte[] o2) {
-                return TypoLookup.compare(o1, 0, (byte) 0, o2, 0, o2.length);
-            }
-        };
-        Arrays.sort(wordArrays, comparator);
-
-        int entryCount = wordArrays.length;
-        int capacity = entryCount * BYTES_PER_ENTRY;
-        ByteBuffer buffer = ByteBuffer.allocate(capacity);
-        buffer.order(ByteOrder.BIG_ENDIAN);
-        //  1. A file header, which is the exact contents of {@link FILE_HEADER} encoded
-        //      as ASCII characters. The purpose of the header is to identify what the file
-        //      is for, for anyone attempting to open the file.
-        buffer.put(FILE_HEADER.getBytes(Charsets.US_ASCII));
-
-        //  2. A file version number. If the binary file does not match the reader's expected
-        //      version, it can ignore it (and regenerate the cache from XML).
-        buffer.put((byte) BINARY_FORMAT_VERSION);
-
-        //  3. The number of words [1 int]
-        buffer.putInt(entryCount);
-
-        //  4. Word offset table (one integer per word, pointing to the byte offset in the
-        //       file (relative to the beginning of the file) where each word begins.
-        //       The words are always sorted alphabetically.
-        int wordOffsetTable = buffer.position();
-
-        // Reserve enough room for the offset table here: we will backfill it with pointers
-        // as we're writing out the data structures below
-        for (int i = 0, n = entryCount; i < n; i++) {
-            buffer.putInt(0);
-        }
-
-        int nextEntry = buffer.position();
-        int nextOffset = wordOffsetTable;
-
-        // 7. Word entry table. Each word entry consists of the word, followed by the byte 0
-        //      as a terminator, followed by a comma separated list of suggestions (which
-        //      may be empty), or a final 0.
-        for (int i = 0; i < entryCount; i++) {
-            byte[] word = wordArrays[i];
-            buffer.position(nextOffset);
-            buffer.putInt(nextEntry);
-            nextOffset = buffer.position();
-            buffer.position(nextEntry);
-
-            buffer.put(word); // already embeds 0 to separate typo from words
-            buffer.put((byte) 0);
-
-            nextEntry = buffer.position();
-        }
-
-        int size = buffer.position();
-        assert size <= buffer.limit();
-        buffer.mark();
-
-        if (WRITE_STATS) {
-            System.out.println("Wrote " + words.size() + " word entries");
-            System.out.print("Actual binary size: " + size + " bytes");
-            System.out.println(String.format(" (%.1fM)", size/(1024*1024.f)));
-
-            System.out.println("Allocated size: " + (entryCount * BYTES_PER_ENTRY) + " bytes");
-            System.out.println("Required bytes per entry: " + (size/ entryCount) + " bytes");
-        }
-
-        // Now dump this out as a file
-        // There's probably an API to do this more efficiently; TODO: Look into this.
-        byte[] b = new byte[size];
-        buffer.rewind();
-        buffer.get(b);
-        FileOutputStream output = Files.newOutputStreamSupplier(file).getOutput();
-        output.write(b);
-        output.close();
-    }
-
-    // For debugging only
-    private String dumpEntry(int offset) {
-        if (DEBUG_SEARCH) {
-            int end = offset;
-            while (mData[end] != 0) {
-                end++;
-            }
-            return new String(mData, offset, end - offset, Charsets.UTF_8);
-        } else {
-            return "<disabled>"; //$NON-NLS-1$
-        }
-    }
-
-    /** Comparison function: *only* used for ASCII strings */
-    @VisibleForTesting
-    static int compare(byte[] data, int offset, byte terminator, CharSequence s,
-            int begin, int end) {
-        int i = offset;
-        int j = begin;
-        for (; ; i++, j++) {
-            byte b = data[i];
-            if (b == ' ') {
-                // We've matched up to the space in a split-word typo, such as
-                // in German all zu=>allzu; here we've matched just past "all".
-                // Rather than terminating, attempt to continue in the buffer.
-                if (j == end) {
-                    int max = s.length();
-                    if (end < max && s.charAt(end) == ' ') {
-                        // Find next word
-                        for (; end < max; end++) {
-                            char c = s.charAt(end);
-                            if (!Character.isLetter(c)) {
-                                if (c == ' ' && end == j) {
-                                    continue;
-                                }
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-
-            if (j == end) {
-                break;
-            }
-
-            if (b == '*') {
-                // Glob match (only supported at the end)
-                return 0;
-            }
-            char c = s.charAt(j);
-            byte cb = (byte) c;
-            int delta = b - cb;
-            if (delta != 0) {
-                cb = (byte) Character.toLowerCase(c);
-                if (b != cb) {
-                    // Ensure that it has the right sign
-                    b = (byte) Character.toLowerCase(b);
-                    delta = b - cb;
-                    if (delta != 0) {
-                        return delta;
-                    }
-                }
-            }
-        }
-
-        return data[i] - terminator;
-    }
-
-    /** Comparison function used for general UTF-8 encoded strings */
-    @VisibleForTesting
-    static int compare(byte[] data, int offset, byte terminator, byte[] s,
-            int begin, int end) {
-        int i = offset;
-        int j = begin;
-        for (; ; i++, j++) {
-            byte b = data[i];
-            if (b == ' ') {
-                // We've matched up to the space in a split-word typo, such as
-                // in German all zu=>allzu; here we've matched just past "all".
-                // Rather than terminating, attempt to continue in the buffer.
-                // We've matched up to the space in a split-word typo, such as
-                // in German all zu=>allzu; here we've matched just past "all".
-                // Rather than terminating, attempt to continue in the buffer.
-                if (j == end) {
-                    int max = s.length;
-                    if (end < max && s[end] == ' ') {
-                        // Find next word
-                        for (; end < max; end++) {
-                            byte cb = s[end];
-                            if (!isLetter(cb)) {
-                                if (cb == ' ' && end == j) {
-                                    continue;
-                                }
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-
-            if (j == end) {
-                break;
-            }
-            if (b == '*') {
-                // Glob match (only supported at the end)
-                return 0;
-            }
-            byte cb = s[j];
-            int delta = b - cb;
-            if (delta != 0) {
-                cb = toLowerCase(cb);
-                b = toLowerCase(b);
-                delta = b - cb;
-                if (delta != 0) {
-                    return delta;
-                }
-            }
-
-            if (b == terminator || cb == terminator) {
-                return delta;
-            }
-        }
-
-        return data[i] - terminator;
-    }
-
-    /**
-     * Look up whether this word is a typo, and if so, return the typo itself
-     * and one or more likely meanings
-     *
-     * @param text the string containing the word
-     * @param begin the index of the first character in the word
-     * @param end the index of the first character after the word. Note that the
-     *            search may extend <b>beyond</b> this index, if for example the
-     *            word matches a multi-word typo in the dictionary
-     * @return a list of the typo itself followed by the replacement strings if
-     *         the word represents a typo, and null otherwise
-     */
-    @Nullable
-    public List<String> getTypos(@NonNull CharSequence text, int begin, int end) {
-        assert end <= text.length();
-
-        if (assertionsEnabled()) {
-            for (int i = begin; i < end; i++) {
-                char c = text.charAt(i);
-                if (c >= 128) {
-                    assert false : "Call the UTF-8 version of this method instead";
-                    return null;
-                }
-            }
-        }
-
-        int low = 0;
-        int high = mWordCount - 1;
-        while (low <= high) {
-            int middle = (low + high) >>> 1;
-            int offset = mIndices[middle];
-
-            if (DEBUG_SEARCH) {
-                System.out.println("Comparing string " + text +" with entry at " + offset
-                        + ": " + dumpEntry(offset));
-            }
-
-            // Compare the word at the given index.
-            int compare = compare(mData, offset, (byte) 0, text, begin, end);
-
-            if (compare == 0) {
-                offset = mIndices[middle];
-
-                // Don't allow matching uncapitalized words, such as "enlish", when
-                // the dictionary word is capitalized, "Enlish".
-                if (mData[offset] != text.charAt(begin)
-                        && Character.isLowerCase(text.charAt(begin))) {
-                    return null;
-                }
-
-                // Make sure there is a case match; we only want to allow
-                // matching capitalized words to capitalized typos or uncapitalized typos
-                //  (e.g. "Teh" and "teh" to "the"), but not uncapitalized words to capitalized
-                // typos (e.g. "enlish" to "Enlish").
-                String glob = null;
-                for (int i = begin; ; i++) {
-                    byte b = mData[offset++];
-                    if (b == 0) {
-                        offset--;
-                        break;
-                    } else if (b == '*') {
-                        int globEnd = i;
-                        while (globEnd < text.length()
-                                && Character.isLetter(text.charAt(globEnd))) {
-                            globEnd++;
-                        }
-                        glob = text.subSequence(i, globEnd).toString();
-                        break;
-                    }
-                    char c = text.charAt(i);
-                    byte cb = (byte) c;
-                    if (b != cb && i > begin) {
-                        return null;
-                    }
-                }
-
-                return computeSuggestions(mIndices[middle], offset, glob);
-            }
-
-            if (compare < 0) {
-                low = middle + 1;
-            } else if (compare > 0) {
-                high = middle - 1;
-            } else {
-                assert false; // compare == 0 already handled above
-                return null;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Look up whether this word is a typo, and if so, return the typo itself
-     * and one or more likely meanings
-     *
-     * @param utf8Text the string containing the word, encoded as UTF-8
-     * @param begin the index of the first character in the word
-     * @param end the index of the first character after the word. Note that the
-     *            search may extend <b>beyond</b> this index, if for example the
-     *            word matches a multi-word typo in the dictionary
-     * @return a list of the typo itself followed by the replacement strings if
-     *         the word represents a typo, and null otherwise
-     */
-    @Nullable
-    public List<String> getTypos(@NonNull byte[] utf8Text, int begin, int end) {
-        assert end <= utf8Text.length;
-
-        int low = 0;
-        int high = mWordCount - 1;
-        while (low <= high) {
-            int middle = (low + high) >>> 1;
-            int offset = mIndices[middle];
-
-            if (DEBUG_SEARCH) {
-                String s = new String(Arrays.copyOfRange(utf8Text, begin, end), Charsets.UTF_8);
-                System.out.println("Comparing string " + s +" with entry at " + offset
-                        + ": " + dumpEntry(offset));
-                System.out.println("   middle=" + middle + ", low=" + low + ", high=" + high);
-            }
-
-            // Compare the word at the given index.
-            int compare = compare(mData, offset, (byte) 0, utf8Text, begin, end);
-
-            if (DEBUG_SEARCH) {
-                System.out.println(" signum=" + (int)Math.signum(compare) + ", delta=" + compare);
-            }
-
-            if (compare == 0) {
-                offset = mIndices[middle];
-
-                // Don't allow matching uncapitalized words, such as "enlish", when
-                // the dictionary word is capitalized, "Enlish".
-                if (mData[offset] != utf8Text[begin] && isUpperCase(mData[offset])) {
-                    return null;
-                }
-
-                // Make sure there is a case match; we only want to allow
-                // matching capitalized words to capitalized typos or uncapitalized typos
-                //  (e.g. "Teh" and "teh" to "the"), but not uncapitalized words to capitalized
-                // typos (e.g. "enlish" to "Enlish").
-                String glob = null;
-                for (int i = begin; ; i++) {
-                    byte b = mData[offset++];
-                    if (b == 0) {
-                        offset--;
-                        break;
-                    } else if (b == '*') {
-                        int globEnd = i;
-                        while (globEnd < utf8Text.length && isLetter(utf8Text[globEnd])) {
-                            globEnd++;
-                        }
-                        glob = new String(utf8Text, i, globEnd - i, Charsets.UTF_8);
-                        break;
-                    }
-                    byte cb = utf8Text[i];
-                    if (b != cb && i > begin) {
-                        return null;
-                    }
-                }
-
-                return computeSuggestions(mIndices[middle], offset, glob);
-            }
-
-            if (compare < 0) {
-                low = middle + 1;
-            } else if (compare > 0) {
-                high = middle - 1;
-            } else {
-                assert false; // compare == 0 already handled above
-                return null;
-            }
-        }
-
-        return null;
-    }
-
-    private List<String> computeSuggestions(int begin, int offset, String glob) {
-        String typo = new String(mData, begin, offset - begin, Charsets.UTF_8);
-
-        if (glob != null) {
-            typo = typo.replaceAll("\\*", glob); //$NON-NLS-1$
-        }
-
-        assert mData[offset] == 0;
-        offset++;
-        int replacementEnd = offset;
-        while (mData[replacementEnd] != 0) {
-            replacementEnd++;
-        }
-        String replacements = new String(mData, offset, replacementEnd - offset, Charsets.UTF_8);
-        List<String> words = new ArrayList<String>();
-        words.add(typo);
-
-        // The first entry should be the typo itself. We need to pass this back since due
-        // to multi-match words and globbing it could extend beyond the initial word range
-
-        for (String s : Splitter.on(',').omitEmptyStrings().trimResults().split(replacements)) {
-            if (glob != null) {
-                // Need to append the glob string to each result
-                words.add(s.replaceAll("\\*", glob)); //$NON-NLS-1$
-            } else {
-                words.add(s);
-            }
-        }
-
-        return words;
-    }
-
-    // "Character" handling for bytes. This assumes that the bytes correspond to Unicode
-    // characters in the ISO 8859-1 range, which is are encoded the same way in UTF-8.
-    // This obviously won't work to for example uppercase to lowercase conversions for
-    // multi byte characters, which means we simply won't catch typos if the dictionaries
-    // contain these. None of the currently included dictionaries do. However, it does
-    // help us properly deal with punctuation and spacing characters.
-
-    static boolean isUpperCase(byte b) {
-        return Character.isUpperCase((char) b);
-    }
-
-    static byte toLowerCase(byte b) {
-        return (byte) Character.toLowerCase((char) b);
-    }
-
-    static boolean isSpace(byte b) {
-        return Character.isWhitespace((char) b);
-    }
-
-    static boolean isLetter(byte b) {
-        // Assume that multi byte characters represent letters in other languages.
-        // Obviously, it could be unusual punctuation etc but letters are more likely
-        // in this context.
-        return Character.isLetter((char) b) || (b & 0x80) != 0;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TypographyDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TypographyDetector.java
deleted file mode 100644
index 8f2ed47..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/TypographyDetector.java
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.TAG_STRING;
-import static com.android.SdkConstants.TAG_STRING_ARRAY;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Checks for various typographical issues in string definitions.
- */
-public class TypographyDetector extends ResourceXmlDetector {
-    /** Replace hyphens with dashes? */
-    public static final Issue DASHES = Issue.create(
-            "TypographyDashes", //$NON-NLS-1$
-            "Looks for usages of hyphens which can be replaced by n dash and m dash characters",
-            "The \"n dash\" (\u2013, &#8211;) and the \"m dash\" (\u2014, &#8212;) " +
-            "characters are used for ranges (n dash) and breaks (m dash). Using these " +
-            "instead of plain hyphens can make text easier to read and your application " +
-            "will look more polished.",
-            Category.TYPOGRAPHY,
-            5,
-            Severity.WARNING,
-            TypographyDetector.class,
-            Scope.RESOURCE_FILE_SCOPE).
-            setMoreInfo("http://en.wikipedia.org/wiki/Dash"); //$NON-NLS-1$
-
-    /** Replace dumb quotes with smart quotes? */
-    public static final Issue QUOTES = Issue.create(
-            "TypographyQuotes", //$NON-NLS-1$
-            "Looks for straight quotes which can be replaced by curvy quotes",
-            "Straight single quotes and double quotes, when used as a pair, can be replaced " +
-            "by \"curvy quotes\" (or directional quotes). This can make the text more " +
-            "readable.\n" +
-            "\n" +
-            "Note that you should never use grave accents and apostrophes to quote, " +
-            "`like this'.\n" +
-            "\n" +
-            "(Also note that you should not use curvy quotes for code fragments.)",
-            Category.TYPOGRAPHY,
-            5,
-            Severity.WARNING,
-            TypographyDetector.class,
-            Scope.RESOURCE_FILE_SCOPE).
-            setMoreInfo("http://en.wikipedia.org/wiki/Quotation_mark"). //$NON-NLS-1$
-            // This feature is apparently controversial: recent apps have started using
-            // straight quotes to avoid inconsistencies. Disabled by default for now.
-            setEnabledByDefault(false);
-
-    /** Replace fraction strings with fraction characters? */
-    public static final Issue FRACTIONS = Issue.create(
-            "TypographyFractions", //$NON-NLS-1$
-            "Looks for fraction strings which can be replaced with a fraction character",
-            "You can replace certain strings, such as 1/2, and 1/4, with dedicated " +
-            "characters for these, such as \u00BD (&#189;) and \00BC (&#188;). " +
-            "This can help make the text more readable.",
-            Category.TYPOGRAPHY,
-            5,
-            Severity.WARNING,
-            TypographyDetector.class,
-            Scope.RESOURCE_FILE_SCOPE).
-            setMoreInfo("http://en.wikipedia.org/wiki/Number_Forms"); //$NON-NLS-1$
-
-    /** Replace ... with the ellipsis character? */
-    public static final Issue ELLIPSIS = Issue.create(
-            "TypographyEllipsis", //$NON-NLS-1$
-            "Looks for ellipsis strings (...) which can be replaced with an ellipsis character",
-            "You can replace the string \"...\" with a dedicated ellipsis character, " +
-            "ellipsis character (\u2026, &#8230;). This can help make the text more readable.",
-            Category.TYPOGRAPHY,
-            5,
-            Severity.WARNING,
-            TypographyDetector.class,
-            Scope.RESOURCE_FILE_SCOPE).
-            setMoreInfo("http://en.wikipedia.org/wiki/Ellipsis"); //$NON-NLS-1$
-
-    /** The main issue discovered by this detector */
-    public static final Issue OTHER = Issue.create(
-            "TypographyOther", //$NON-NLS-1$
-            "Looks for miscellaneous typographical problems like replacing (c) with \u00A9",
-            "This check looks for miscellaneous typographical problems and offers replacement " +
-            "sequences that will make the text easier to read and your application more " +
-            "polished.",
-            Category.TYPOGRAPHY,
-            3,
-            Severity.WARNING,
-            TypographyDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    private static final String GRAVE_QUOTE_MESSAGE =
-        "Avoid quoting with grave accents; use apostrophes or better yet directional quotes instead";
-    private static final String ELLIPSIS_MESSAGE =
-        "Replace \"...\" with ellipsis character (\u2026, &#8230;) ?";
-    private static final String EN_DASH_MESSAGE =
-        "Replace \"-\" with an \"en dash\" character (\u2013, &#8211;) ?";
-    private static final String EM_DASH_MESSAGE =
-        "Replace \"--\" with an \"em dash\" character (\u2014, &#8212;) ?";
-    private static final String TYPOGRAPHIC_APOSTROPHE_MESSAGE =
-        "Replace apostrophe (') with typographic apostrophe (\u2019, &#8217;) ?";
-    private static final String SINGLE_QUOTE_MESSAGE =
-        "Replace straight quotes ('') with directional quotes (\u2018\u2019, &#8216; and &#8217;) ?";
-    private static final String DBL_QUOTES_MESSAGE =
-        "Replace straight quotes (\") with directional quotes (\u201C\u201D, &#8220; and &#8221;) ?";
-    private static final String COPYRIGHT_MESSAGE =
-        "Replace (c) with copyright symbol \u00A9 (&#169;) ?";
-
-    /**
-     * Pattern used to detect scenarios which can be replaced with n dashes: a
-     * numeric range with a hyphen in the middle (and possibly spaces)
-     */
-    @VisibleForTesting
-    static final Pattern HYPHEN_RANGE_PATTERN =
-            Pattern.compile(".*(\\d+\\s*)-(\\s*\\d+).*"); //$NON-NLS-1$
-
-    /**
-     * Pattern used to detect scenarios where a grave accent mark is used
-     * to do ASCII quotations of the form `this'' or ``this'', which is frowned upon.
-     * This pattern tries to avoid falsely complaining about strings like
-     * "Type Option-` then 'Escape'."
-     */
-    @VisibleForTesting
-    static final Pattern GRAVE_QUOTATION =
-            Pattern.compile("(^[^`]*`[^'`]+'[^']*$)|(^[^`]*``[^'`]+''[^']*$)"); //$NON-NLS-1$
-
-    /**
-     * Pattern used to detect common fractions, e.g. 1/2, 1/3, 2/3, 1/4, 3/4 and
-     * variations like 2 / 3, but not 11/22 and so on.
-     */
-    @VisibleForTesting
-    static final Pattern FRACTION_PATTERN =
-            Pattern.compile(".*\\b([13])\\s*/\\s*([234])\\b.*"); //$NON-NLS-1$
-
-    /**
-     * Pattern used to detect single quote strings, such as 'hello', but
-     * not just quoted strings like 'Double quote: "', and not sentences
-     * where there are multiple apostrophes but not in a quoting context such
-     * as "Mind Your P's and Q's".
-     */
-    @VisibleForTesting
-    static final Pattern SINGLE_QUOTE =
-            Pattern.compile(".*\\W*'[^']+'(\\W.*)?"); //$NON-NLS-1$
-
-    private static final String FRACTION_MESSAGE =
-            "Use fraction character %1$c (%2$s) instead of %3$s ?";
-
-    private static final String FRACTION_MESSAGE_PATTERN =
-            "Use fraction character (.+) \\((.+)\\) instead of (.+) \\?";
-
-    private boolean mCheckDashes;
-    private boolean mCheckQuotes;
-    private boolean mCheckFractions;
-    private boolean mCheckEllipsis;
-    private boolean mCheckMisc;
-
-    /** Constructs a new {@link TypographyDetector} */
-    public TypographyDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.VALUES;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                TAG_STRING,
-                TAG_STRING_ARRAY
-        );
-    }
-
-    @Override
-    public void beforeCheckProject(@NonNull Context context) {
-        mCheckDashes = context.isEnabled(DASHES);
-        mCheckQuotes = context.isEnabled(QUOTES);
-        mCheckFractions = context.isEnabled(FRACTIONS);
-        mCheckEllipsis = context.isEnabled(ELLIPSIS);
-        mCheckMisc = context.isEnabled(OTHER);
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        NodeList childNodes = element.getChildNodes();
-        for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-            Node child = childNodes.item(i);
-            if (child.getNodeType() == Node.TEXT_NODE) {
-                String text = child.getNodeValue();
-                checkText(context, element, child, text);
-            } else if (child.getNodeType() == Node.ELEMENT_NODE &&
-                    child.getParentNode().getNodeName().equals(TAG_STRING_ARRAY)) {
-                // String array item children
-                NodeList items = child.getChildNodes();
-                for (int j = 0, m = items.getLength(); j < m; j++) {
-                    Node item = items.item(j);
-                    if (item.getNodeType() == Node.TEXT_NODE) {
-                        String text = item.getNodeValue();
-                        checkText(context, child, item, text);
-                    }
-                }
-            }
-        }
-    }
-
-    private void checkText(XmlContext context, Node element, Node textNode, String text) {
-        if (mCheckEllipsis) {
-            // Replace ... with ellipsis character?
-            int ellipsis = text.indexOf("..."); //$NON-NLS-1$
-            if (ellipsis != -1 && !text.startsWith(".", ellipsis + 3)) { //$NON-NLS-1$
-                context.report(ELLIPSIS, element, context.getLocation(textNode),
-                        ELLIPSIS_MESSAGE, null);
-            }
-        }
-
-        // Dashes
-        if (mCheckDashes) {
-            int hyphen = text.indexOf('-');
-            if (hyphen != -1) {
-                // n dash
-                Matcher matcher = HYPHEN_RANGE_PATTERN.matcher(text);
-                if (matcher.matches()) {
-                    // Make sure that if there is no space before digit there isn't
-                    // one on the left either -- since we don't want to consider
-                    // "1 2 -3" as a range from 2 to 3
-                    boolean isNegativeNumber =
-                        !Character.isWhitespace(matcher.group(2).charAt(0)) &&
-                            Character.isWhitespace(matcher.group(1).charAt(
-                                    matcher.group(1).length() - 1));
-                    if (!isNegativeNumber && !isAnalyticsTrackingId((Element) element)) {
-                        context.report(DASHES, element, context.getLocation(textNode),
-                            EN_DASH_MESSAGE,
-                            null);
-                    }
-                }
-
-                // m dash
-                int emdash = text.indexOf("--"); //$NON-NLS-1$
-                // Don't suggest replacing -- or "--" with an m dash since these are sometimes
-                // used as digit marker strings
-                if (emdash > 1 && !text.startsWith("-", emdash + 2)) {   //$NON-NLS-1$
-                    context.report(DASHES, element, context.getLocation(textNode),
-                            EM_DASH_MESSAGE, null);
-                }
-            }
-        }
-
-        if (mCheckQuotes) {
-            // Check for single quotes that can be replaced with directional quotes
-            int quoteStart = text.indexOf('\'');
-            if (quoteStart != -1) {
-                int quoteEnd = text.indexOf('\'', quoteStart + 1);
-                if (quoteEnd != -1 && quoteEnd > quoteStart + 1
-                        && (quoteEnd < text.length() -1 || quoteStart > 0)
-                        && SINGLE_QUOTE.matcher(text).matches()) {
-                    context.report(QUOTES, element, context.getLocation(textNode),
-                        SINGLE_QUOTE_MESSAGE, null);
-                    return;
-                }
-
-                // Check for apostrophes that can be replaced by typographic apostrophes
-                if (quoteEnd == -1 && quoteStart > 0
-                        && Character.isLetterOrDigit(text.charAt(quoteStart - 1))) {
-                    context.report(QUOTES, element, context.getLocation(textNode),
-                            TYPOGRAPHIC_APOSTROPHE_MESSAGE, null);
-                    return;
-                }
-            }
-
-            // Check for double quotes that can be replaced by directional double quotes
-            quoteStart = text.indexOf('"');
-            if (quoteStart != -1) {
-                int quoteEnd = text.indexOf('"', quoteStart + 1);
-                if (quoteEnd != -1 && quoteEnd > quoteStart + 1) {
-                    if (quoteEnd < text.length() -1 || quoteStart > 0) {
-                        context.report(QUOTES, element, context.getLocation(textNode),
-                            DBL_QUOTES_MESSAGE, null);
-                        return;
-                    }
-                }
-            }
-
-            // Check for grave accent quotations
-            if (text.indexOf('`') != -1 && GRAVE_QUOTATION.matcher(text).matches()) {
-                // Are we indenting ``like this'' or `this' ? If so, complain
-                context.report(QUOTES, element, context.getLocation(textNode),
-                        GRAVE_QUOTE_MESSAGE, null);
-                return;
-            }
-
-            // Consider suggesting other types of directional quotes, such as guillemets, in
-            // other languages?
-            // There are a lot of exceptions and special cases to be considered so
-            // this will need careful implementation and testing.
-            // See http://en.wikipedia.org/wiki/Non-English_usage_of_quotation_marks
-        }
-
-        // Fraction symbols?
-        if (mCheckFractions && text.indexOf('/') != -1) {
-            Matcher matcher = FRACTION_PATTERN.matcher(text);
-            if (matcher.matches()) {
-                String top = matcher.group(1);    // Numerator
-                String bottom = matcher.group(2); // Denominator
-                if (top.equals("1") && bottom.equals("2")) { //$NON-NLS-1$ //$NON-NLS-2$
-                    context.report(FRACTIONS, element, context.getLocation(textNode),
-                            String.format(FRACTION_MESSAGE, '\u00BD', "&#189;", "1/2"), null);
-                } else if (top.equals("1") && bottom.equals("4")) { //$NON-NLS-1$ //$NON-NLS-2$
-                    context.report(FRACTIONS, element, context.getLocation(textNode),
-                            String.format(FRACTION_MESSAGE, '\u00BC', "&#188;", "1/4"), null);
-                } else if (top.equals("3") && bottom.equals("4")) { //$NON-NLS-1$ //$NON-NLS-2$
-                    context.report(FRACTIONS, element, context.getLocation(textNode),
-                            String.format(FRACTION_MESSAGE, '\u00BE', "&#190;", "3/4"), null);
-                } else if (top.equals("1") && bottom.equals("3")) { //$NON-NLS-1$ //$NON-NLS-2$
-                    context.report(FRACTIONS, element, context.getLocation(textNode),
-                            String.format(FRACTION_MESSAGE, '\u2153', "&#8531;", "1/3"), null);
-                } else if (top.equals("2") && bottom.equals("3")) { //$NON-NLS-1$ //$NON-NLS-2$
-                    context.report(FRACTIONS, element, context.getLocation(textNode),
-                            String.format(FRACTION_MESSAGE, '\u2154', "&#8532;", "2/3"), null);
-                }
-            }
-        }
-
-        if (mCheckMisc) {
-            // Fix copyright symbol?
-            if (text.indexOf('(') != -1
-                    && (text.contains("(c)") || text.contains("(C)"))) { //$NON-NLS-1$ //$NON-NLS-2$
-                // Suggest replacing with copyright symbol?
-                context.report(OTHER, element, context.getLocation(textNode),
-                    COPYRIGHT_MESSAGE, null);
-                // Replace (R) and TM as well? There are unicode characters for these but they
-                // are probably not very common within Android app strings.
-            }
-        }
-    }
-
-    private static boolean isAnalyticsTrackingId(Element element) {
-        String name = element.getAttribute(ATTR_NAME);
-        return "ga_trackingId".equals(name); //$NON-NLS-1$
-    }
-
-    /**
-     * An object describing a single edit to be made. The offset points to a
-     * location to start editing; the length is the number of characters to
-     * delete, and the replaceWith string points to a string to insert at the
-     * offset. Note that this can model not just replacement edits but deletions
-     * (empty replaceWith) and insertions (replace length = 0) too.
-     */
-    public static class ReplaceEdit {
-        /** The offset of the edit */
-        public final int offset;
-        /** The number of characters to delete at the offset */
-        public final int length;
-        /** The characters to insert at the offset */
-        public final String replaceWith;
-
-        /**
-         * Creates a new replace edit
-         *
-         * @param offset the offset of the edit
-         * @param length the number of characters to delete at the offset
-         * @param replaceWith the characters to insert at the offset
-         */
-        public ReplaceEdit(int offset, int length, String replaceWith) {
-            super();
-            this.offset = offset;
-            this.length = length;
-            this.replaceWith = replaceWith;
-        }
-    }
-
-    /**
-     * Returns a list of edits to be applied to fix the suggestion made by the
-     * given warning. The specific issue id and message should be the message
-     * provided by this detector in an earlier run.
-     * <p>
-     * This is intended to help tools implement automatic fixes of these
-     * warnings. The reason only the message and issue id can be provided
-     * instead of actual state passed in the data field to a reporter is that
-     * fix operation can be run much later than the lint is processed (for
-     * example, in a subsequent run of the IDE when only the warnings have been
-     * persisted),
-     *
-     * @param issueId the issue id, which should be the id for one of the
-     *            typography issues
-     * @param message the actual error message, which should be a message
-     *            provided by this detector
-     * @param textNode a text node which corresponds to the text node the
-     *            warning operated on
-     * @return a list of edits, which is never null but could be empty. The
-     *         offsets in the edit objects are relative to the text node.
-     */
-    public static List<ReplaceEdit> getEdits(String issueId, String message, Node textNode) {
-        List<ReplaceEdit> edits = new ArrayList<ReplaceEdit>();
-        String text = textNode.getNodeValue();
-        if (message.equals(ELLIPSIS_MESSAGE)) {
-            int offset = text.indexOf("...");                            //$NON-NLS-1$
-            if (offset != -1) {
-                edits.add(new ReplaceEdit(offset, 3, "\u2026"));         //$NON-NLS-1$
-            }
-        } else if (message.equals(EN_DASH_MESSAGE)) {
-            int offset = text.indexOf('-');
-            if (offset != -1) {
-                edits.add(new ReplaceEdit(offset, 1, "\u2013"));         //$NON-NLS-1$
-            }
-        } else if (message.equals(EM_DASH_MESSAGE)) {
-            int offset = text.indexOf("--");                             //$NON-NLS-1$
-            if (offset != -1) {
-                edits.add(new ReplaceEdit(offset, 2, "\u2014"));         //$NON-NLS-1$
-            }
-        } else if (message.equals(TYPOGRAPHIC_APOSTROPHE_MESSAGE)) {
-            int offset = text.indexOf('\'');
-            if (offset != -1) {
-                edits.add(new ReplaceEdit(offset, 1, "\u2019"));         //$NON-NLS-1$
-            }
-        } else if (message.equals(COPYRIGHT_MESSAGE)) {
-            int offset = text.indexOf("(c)");                            //$NON-NLS-1$
-            if (offset == -1) {
-                offset = text.indexOf("(C)");                            //$NON-NLS-1$
-            }
-            if (offset != -1) {
-                edits.add(new ReplaceEdit(offset, 3, "\u00A9"));         //$NON-NLS-1$
-            }
-        } else if (message.equals(SINGLE_QUOTE_MESSAGE)) {
-            int offset = text.indexOf('\'');
-            if (offset != -1) {
-                int endOffset = text.indexOf('\'', offset + 1);           //$NON-NLS-1$
-                if (endOffset != -1) {
-                    edits.add(new ReplaceEdit(offset, 1, "\u2018"));     //$NON-NLS-1$
-                    edits.add(new ReplaceEdit(endOffset, 1, "\u2019"));  //$NON-NLS-1$
-                }
-            }
-        } else if (message.equals(DBL_QUOTES_MESSAGE)) {
-            int offset = text.indexOf('"');
-            if (offset != -1) {
-                int endOffset = text.indexOf('"', offset + 1);
-                if (endOffset != -1) {
-                    edits.add(new ReplaceEdit(offset, 1, "\u201C"));     //$NON-NLS-1$
-                    edits.add(new ReplaceEdit(endOffset, 1, "\u201D"));  //$NON-NLS-1$
-                }
-            }
-        } else if (message.equals(GRAVE_QUOTE_MESSAGE)) {
-            int offset = text.indexOf('`');
-            if (offset != -1) {
-                int endOffset = text.indexOf('\'', offset + 1);
-                if (endOffset != -1) {
-                    edits.add(new ReplaceEdit(offset, 1, "\u2018"));     //$NON-NLS-1$
-                    edits.add(new ReplaceEdit(endOffset, 1, "\u2019"));  //$NON-NLS-1$
-                }
-            }
-        } else {
-            Matcher matcher = Pattern.compile(FRACTION_MESSAGE_PATTERN).matcher(message);
-            if (matcher.find()) {
-                //  "Use fraction character %1$c (%2$s) instead of %3$s ?";
-                String replace = matcher.group(3);
-                int offset = text.indexOf(replace);
-                if (offset != -1) {
-                    String replaceWith = matcher.group(2);
-                    edits.add(new ReplaceEdit(offset, replace.length(), replaceWith));
-                }
-            }
-        }
-
-        return edits;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/UnusedResourceDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/UnusedResourceDetector.java
deleted file mode 100644
index f960118..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/UnusedResourceDetector.java
+++ /dev/null
@@ -1,591 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_REF_PREFIX;
-import static com.android.SdkConstants.DOT_GIF;
-import static com.android.SdkConstants.DOT_JPG;
-import static com.android.SdkConstants.DOT_PNG;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.RESOURCE_CLR_STYLEABLE;
-import static com.android.SdkConstants.RESOURCE_CLZ_ARRAY;
-import static com.android.SdkConstants.RESOURCE_CLZ_ID;
-import static com.android.SdkConstants.R_ATTR_PREFIX;
-import static com.android.SdkConstants.R_CLASS;
-import static com.android.SdkConstants.R_ID_PREFIX;
-import static com.android.SdkConstants.R_PREFIX;
-import static com.android.SdkConstants.TAG_ARRAY;
-import static com.android.SdkConstants.TAG_ITEM;
-import static com.android.SdkConstants.TAG_PLURALS;
-import static com.android.SdkConstants.TAG_RESOURCES;
-import static com.android.SdkConstants.TAG_STRING_ARRAY;
-import static com.android.SdkConstants.TAG_STYLE;
-import static com.android.tools.lint.detector.api.LintUtils.endsWith;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.resources.ResourceType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Project;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.collect.Lists;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.ClassDeclaration;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.NormalTypeBody;
-import lombok.ast.VariableDeclaration;
-import lombok.ast.VariableDefinition;
-
-/**
- * Finds unused resources.
- * <p>
- * Note: This detector currently performs *string* analysis to check Java files.
- * The Lint API needs an official Java AST API (or map to an existing one like
- * BCEL for bytecode analysis etc) and once it does this should be updated to
- * use it.
- */
-public class UnusedResourceDetector extends ResourceXmlDetector implements Detector.JavaScanner {
-
-    /** Unused resources (other than ids). */
-    public static final Issue ISSUE = Issue.create("UnusedResources", //$NON-NLS-1$
-            "Looks for unused resources",
-            "Unused resources make applications larger and slow down builds.",
-            Category.PERFORMANCE,
-            3,
-            Severity.WARNING,
-            UnusedResourceDetector.class,
-            EnumSet.of(Scope.MANIFEST, Scope.ALL_RESOURCE_FILES, Scope.ALL_JAVA_FILES));
-
-    /** Unused id's */
-    public static final Issue ISSUE_IDS = Issue.create("UnusedIds", //$NON-NLS-1$
-            "Looks for unused id's",
-            "This resource id definition appears not to be needed since it is not referenced " +
-            "from anywhere. Having id definitions, even if unused, is not necessarily a bad " +
-            "idea since they make working on layouts and menus easier, so there is not a " +
-            "strong reason to delete these.",
-            Category.PERFORMANCE,
-            1,
-            Severity.WARNING,
-            UnusedResourceDetector.class,
-            EnumSet.of(Scope.MANIFEST, Scope.ALL_RESOURCE_FILES, Scope.ALL_JAVA_FILES))
-            .setEnabledByDefault(false);
-
-    private Set<String> mDeclarations;
-    private Set<String> mReferences;
-    private Map<String, Location> mUnused;
-
-    /**
-     * Constructs a new {@link UnusedResourceDetector}
-     */
-    public UnusedResourceDetector() {
-    }
-
-    @Override
-    public void run(@NonNull Context context) {
-        assert false;
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        return true;
-    }
-
-    @Override
-    public void beforeCheckProject(@NonNull Context context) {
-        if (context.getPhase() == 1) {
-            mDeclarations = new HashSet<String>(300);
-            mReferences = new HashSet<String>(300);
-        }
-    }
-
-    // ---- Implements JavaScanner ----
-
-    @Override
-    public void beforeCheckFile(@NonNull Context context) {
-        File file = context.file;
-
-        String fileName = file.getName();
-        boolean isXmlFile = endsWith(fileName, DOT_XML);
-        if (isXmlFile
-                || endsWith(fileName, DOT_PNG)
-                || endsWith(fileName, DOT_JPG)
-                || endsWith(fileName, DOT_GIF)) {
-            String parentName = file.getParentFile().getName();
-            int dash = parentName.indexOf('-');
-            String typeName = parentName.substring(0, dash == -1 ? parentName.length() : dash);
-            ResourceType type = ResourceType.getEnum(typeName);
-            if (type != null && LintUtils.isFileBasedResourceType(type)) {
-                String baseName = fileName.substring(0, fileName.length() - DOT_XML.length());
-                String resource = R_PREFIX + typeName + '.' + baseName;
-                if (context.getPhase() == 1) {
-                    mDeclarations.add(resource);
-                } else {
-                    assert context.getPhase() == 2;
-                    if (mUnused.containsKey(resource)) {
-                        // Check whether this is an XML document that has a tools:ignore attribute
-                        // on the document element: if so don't record it as a declaration.
-                        if (isXmlFile && context instanceof XmlContext) {
-                            XmlContext xmlContext = (XmlContext) context;
-                            if (xmlContext.document != null
-                                    && xmlContext.document.getDocumentElement() != null) {
-                                Element root = xmlContext.document.getDocumentElement();
-                                if (xmlContext.getDriver().isSuppressed(ISSUE, root)) {
-                                    //  Also remove it from consideration such that even the
-                                    // presence of this field in the R file is ignored.
-                                    mUnused.remove(resource);
-                                    return;
-                                }
-                            }
-                        }
-
-                        if (!context.getProject().getReportIssues()) {
-                            // If this is a library project not being analyzed, ignore it
-                            mUnused.remove(resource);
-                            return;
-                        }
-
-                        recordLocation(resource, Location.create(file));
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (context.getPhase() == 1) {
-            mDeclarations.removeAll(mReferences);
-            Set<String> unused = mDeclarations;
-            mReferences = null;
-            mDeclarations = null;
-
-            // Remove styles and attributes: they may be used, analysis isn't complete for these
-            List<String> styles = new ArrayList<String>();
-            for (String resource : unused) {
-                // R.style.x, R.styleable.x, R.attr
-                if (resource.startsWith("R.style")          //$NON-NLS-1$
-                        || resource.startsWith("R.attr")) { //$NON-NLS-1$
-                    styles.add(resource);
-                }
-            }
-            unused.removeAll(styles);
-
-            // Remove id's if the user has disabled reporting issue ids
-            if (!unused.isEmpty() && !context.isEnabled(ISSUE_IDS)) {
-                // Remove all R.id references
-                List<String> ids = new ArrayList<String>();
-                for (String resource : unused) {
-                    if (resource.startsWith(R_ID_PREFIX)) {
-                        ids.add(resource);
-                    }
-                }
-                unused.removeAll(ids);
-            }
-
-            if (!unused.isEmpty() && !context.getDriver().hasParserErrors()) {
-                mUnused = new HashMap<String, Location>(unused.size());
-                for (String resource : unused) {
-                    mUnused.put(resource, null);
-                }
-
-                // Request another pass, and in the second pass we'll gather location
-                // information for all declaration locations we've found
-                context.requestRepeat(this, Scope.ALL_RESOURCES_SCOPE);
-            }
-        } else {
-            assert context.getPhase() == 2;
-
-            // Report any resources that we (for some reason) could not find a declaration
-            // location for
-            if (!mUnused.isEmpty()) {
-                // Fill in locations for files that we didn't encounter in other ways
-                for (Map.Entry<String, Location> entry : mUnused.entrySet()) {
-                    String resource = entry.getKey();
-                    Location location = entry.getValue();
-                    if (location != null) {
-                        continue;
-                    }
-
-                    // Try to figure out the file if it's a file based resource (such as R.layout) --
-                    // in that case we can figure out the filename since it has a simple mapping
-                    // from the resource name (though the presence of qualifiers like -land etc
-                    // makes it a little tricky if there's no base file provided)
-                    int secondDot = resource.indexOf('.', 2);
-                    String typeName = resource.substring(2, secondDot); // 2: Skip R.
-                    ResourceType type = ResourceType.getEnum(typeName);
-                    if (type != null && LintUtils.isFileBasedResourceType(type)) {
-                        String name = resource.substring(secondDot + 1);
-
-                        List<File> folders = Lists.newArrayList();
-                        List<File> resourceFolders = context.getProject().getResourceFolders();
-                        for (File res : resourceFolders) {
-                            File[] f = res.listFiles();
-                            if (f != null) {
-                                folders.addAll(Arrays.asList(f));
-                            }
-                        }
-                        if (folders != null) {
-                            // Process folders in alphabetical order such that we process
-                            // based folders first: we want the locations in base folder
-                            // order
-                            Collections.sort(folders, new Comparator<File>() {
-                                @Override
-                                public int compare(File file1, File file2) {
-                                    return file1.getName().compareTo(file2.getName());
-                                }
-                            });
-                            for (File folder : folders) {
-                                if (folder.getName().startsWith(typeName)) {
-                                    File[] files = folder.listFiles();
-                                    if (files != null) {
-                                        for (File file : files) {
-                                            String fileName = file.getName();
-                                            if (fileName.startsWith(name)
-                                                    && fileName.startsWith(".", //$NON-NLS-1$
-                                                            name.length())) {
-                                                recordLocation(resource, Location.create(file));
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-
-                List<String> sorted = new ArrayList<String>(mUnused.keySet());
-                Collections.sort(sorted);
-
-                Boolean skippedLibraries = null;
-
-                for (String resource : sorted) {
-                    Location location = mUnused.get(resource);
-                    if (location != null) {
-                        // We were prepending locations, but we want to prefer the base folders
-                        location = Location.reverse(location);
-                    }
-
-                    if (location == null) {
-                        if (skippedLibraries == null) {
-                            skippedLibraries = false;
-                            for (Project project : context.getDriver().getProjects()) {
-                                if (!project.getReportIssues()) {
-                                    skippedLibraries = true;
-                                    break;
-                                }
-                            }
-                        }
-                        if (skippedLibraries) {
-                            // Skip this resource if we don't have a location, and one or
-                            // more library projects were skipped; the resource was very
-                            // probably defined in that library project and only encountered
-                            // in the main project's java R file
-                            continue;
-                        }
-                    }
-
-                    String message = String.format("The resource %1$s appears to be unused",
-                            resource);
-                    Issue issue = getIssue(resource);
-                    // TODO: Compute applicable node scope
-                    context.report(issue, location, message, resource);
-                }
-            }
-        }
-    }
-
-    private static Issue getIssue(String resource) {
-        return resource.startsWith(R_ID_PREFIX) ? ISSUE_IDS : ISSUE;
-    }
-
-    private void recordLocation(String resource, Location location) {
-        Location oldLocation = mUnused.get(resource);
-        if (oldLocation != null) {
-            location.setSecondary(oldLocation);
-        }
-        mUnused.put(resource, location);
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return ALL;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                TAG_STYLE,
-                TAG_RESOURCES,
-                TAG_ARRAY,
-                TAG_STRING_ARRAY,
-                TAG_PLURALS
-        );
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        if (TAG_RESOURCES.equals(element.getTagName())) {
-            for (Element item : LintUtils.getChildren(element)) {
-                Attr nameAttribute = item.getAttributeNode(ATTR_NAME);
-                if (nameAttribute != null) {
-                    String name = nameAttribute.getValue();
-                    if (name.indexOf('.') != -1) {
-                        name = name.replace('.', '_');
-                    }
-                    String type = item.getTagName();
-                    if (type.equals(TAG_ITEM)) {
-                        type = RESOURCE_CLZ_ID;
-                    } else if (type.equals("declare-styleable")) {   //$NON-NLS-1$
-                        type = RESOURCE_CLR_STYLEABLE;
-                    } else if (type.contains("array")) {             //$NON-NLS-1$
-                        // <string-array> etc
-                        type = RESOURCE_CLZ_ARRAY;
-                    }
-                    String resource = R_PREFIX + type + '.' + name;
-
-                    if (context.getPhase() == 1) {
-                        mDeclarations.add(resource);
-                        checkChildRefs(item);
-                    } else {
-                        assert context.getPhase() == 2;
-                        if (mUnused.containsKey(resource)) {
-                            if (context.getDriver().isSuppressed(getIssue(resource), item)) {
-                                mUnused.remove(resource);
-                                continue;
-                            }
-                            if (!context.getProject().getReportIssues()) {
-                                mUnused.remove(resource);
-                                continue;
-                            }
-                            if (isAnalyticsFile(context)) {
-                                mUnused.remove(resource);
-                                continue;
-                            }
-
-                            recordLocation(resource, context.getLocation(nameAttribute));
-                        }
-                    }
-                }
-            }
-        } else if (mReferences != null) {
-            assert TAG_STYLE.equals(element.getTagName())
-                || TAG_ARRAY.equals(element.getTagName())
-                || TAG_PLURALS.equals(element.getTagName())
-                || TAG_STRING_ARRAY.equals(element.getTagName());
-            for (Element item : LintUtils.getChildren(element)) {
-                checkChildRefs(item);
-            }
-        }
-    }
-
-    private static final String ANALYTICS_FILE = "analytics.xml"; //$NON-NLS-1$
-
-    /**
-     * Returns true if this XML file corresponds to an Analytics configuration file;
-     * these contain some attributes read by the library which won't be flagged as
-     * used by the application
-     */
-    private static boolean isAnalyticsFile(XmlContext context) {
-        File file = context.file;
-        return file.getPath().endsWith(ANALYTICS_FILE) && file.getName().equals(ANALYTICS_FILE);
-    }
-
-    private void checkChildRefs(Element item) {
-        // Look for ?attr/ and @dimen/foo etc references in the item children
-        NodeList childNodes = item.getChildNodes();
-        for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-            Node child = childNodes.item(i);
-            if (child.getNodeType() == Node.TEXT_NODE) {
-                String text = child.getNodeValue();
-
-                int index = text.indexOf(ATTR_REF_PREFIX);
-                if (index != -1) {
-                    String name = text.substring(index + ATTR_REF_PREFIX.length()).trim();
-                    mReferences.add(R_ATTR_PREFIX + name);
-                } else {
-                    index = text.indexOf('@');
-                    if (index != -1 && text.indexOf('/', index) != -1
-                            && !text.startsWith("@android:", index)) {  //$NON-NLS-1$
-                        // Compute R-string, e.g. @string/foo => R.string.foo
-                        String token = text.substring(index + 1).trim().replace('/', '.');
-                        String r = R_PREFIX + token;
-                        mReferences.add(r);
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        String value = attribute.getValue();
-
-        if (value.startsWith("@+") && !value.startsWith("@+android")) { //$NON-NLS-1$ //$NON-NLS-2$
-            String resource = R_PREFIX + value.substring(2).replace('/', '.');
-            // We already have the declarations when we scan the R file, but we're tracking
-            // these here to get attributes for position info
-
-            if (context.getPhase() == 1) {
-                mDeclarations.add(resource);
-            } else if (mUnused.containsKey(resource)) {
-                if (context.getDriver().isSuppressed(getIssue(resource), attribute)) {
-                    mUnused.remove(resource);
-                    return;
-                }
-                if (!context.getProject().getReportIssues()) {
-                    mUnused.remove(resource);
-                    return;
-                }
-                recordLocation(resource, context.getLocation(attribute));
-                return;
-            }
-        } else if (mReferences != null) {
-            if (value.startsWith("@")              //$NON-NLS-1$
-                    && !value.startsWith("@android:")) {  //$NON-NLS-1$
-                // Compute R-string, e.g. @string/foo => R.string.foo
-                String r = R_PREFIX + value.substring(1).replace('/', '.');
-                mReferences.add(r);
-            } else if (value.startsWith(ATTR_REF_PREFIX)) {
-                mReferences.add(R_ATTR_PREFIX + value.substring(ATTR_REF_PREFIX.length()));
-            }
-        }
-
-        if (attribute.getNamespaceURI() != null
-                && !ANDROID_URI.equals(attribute.getNamespaceURI()) && mReferences != null) {
-            mReferences.add(R_ATTR_PREFIX + attribute.getLocalName());
-        }
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.SLOW;
-    }
-
-    @Override
-    public List<Class<? extends lombok.ast.Node>> getApplicableNodeTypes() {
-        return Collections.<Class<? extends lombok.ast.Node>>singletonList(ClassDeclaration.class);
-    }
-
-    @Override
-    public boolean appliesToResourceRefs() {
-        return true;
-    }
-
-    @Override
-    public void visitResourceReference(@NonNull JavaContext context, @Nullable AstVisitor visitor,
-            @NonNull lombok.ast.Node node, @NonNull String type, @NonNull String name,
-            boolean isFramework) {
-        if (mReferences != null && !isFramework) {
-            String reference = R_PREFIX + type + '.' + name;
-            mReferences.add(reference);
-        }
-    }
-
-    @Override
-    public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
-        if (mReferences != null) {
-            return new UnusedResourceVisitor();
-        } else {
-            // Second pass, computing resource declaration locations: No need to look at Java
-            return null;
-        }
-    }
-
-    // Look for references and declarations
-    private class UnusedResourceVisitor extends ForwardingAstVisitor {
-        @Override
-        public boolean visitClassDeclaration(ClassDeclaration node) {
-            // Look for declarations of R class fields and store them in
-            // mDeclarations
-            String description = node.getDescription();
-            if (description.equals(R_CLASS)) {
-                // This is an R class. We can process this class very deliberately.
-                // The R class has a very specific AST format:
-                // ClassDeclaration ("R")
-                //    NormalTypeBody
-                //        ClassDeclaration (e.g. "drawable")
-                //             NormalTypeBody
-                //                 VariableDeclaration
-                //                     VariableDefinition (e.g. "ic_launcher")
-                for (lombok.ast.Node body : node.getChildren()) {
-                    if (body instanceof NormalTypeBody) {
-                        for (lombok.ast.Node subclass : body.getChildren()) {
-                            if (subclass instanceof ClassDeclaration) {
-                                String className = ((ClassDeclaration) subclass).getDescription();
-                                for (lombok.ast.Node innerBody : subclass.getChildren()) {
-                                    if (innerBody instanceof NormalTypeBody) {
-                                        for (lombok.ast.Node field : innerBody.getChildren()) {
-                                            if (field instanceof VariableDeclaration) {
-                                                for (lombok.ast.Node child : field.getChildren()) {
-                                                    if (child instanceof VariableDefinition) {
-                                                        VariableDefinition def =
-                                                                (VariableDefinition) child;
-                                                        String name = def.astVariables().first()
-                                                                .astName().astValue();
-                                                        String resource = R_PREFIX + className
-                                                                + '.' + name;
-                                                        mDeclarations.add(resource);
-                                                    } // Else: It could be a comment node
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-
-                return true;
-            }
-
-            return false;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/UseCompoundDrawableDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/UseCompoundDrawableDetector.java
deleted file mode 100644
index db5de4d..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/UseCompoundDrawableDetector.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_BACKGROUND;
-import static com.android.SdkConstants.ATTR_LAYOUT_WEIGHT;
-import static com.android.SdkConstants.ATTR_SCALE_TYPE;
-import static com.android.SdkConstants.IMAGE_VIEW;
-import static com.android.SdkConstants.LINEAR_LAYOUT;
-import static com.android.SdkConstants.TEXT_VIEW;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Element;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Checks whether the current node can be replaced by a TextView using compound
- * drawables.
- */
-public class UseCompoundDrawableDetector extends LayoutDetector {
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "UseCompoundDrawables", //$NON-NLS-1$
-            "Checks whether the current node can be replaced by a TextView using compound drawables.",
-            "A `LinearLayout` which contains an `ImageView` and a `TextView` can be more " +
-            "efficiently handled as a compound drawable (a single TextView, using the " +
-            "`drawableTop`, `drawableLeft`, `drawableRight` and/or `drawableBottom` attributes " +
-            "to draw one or more images adjacent to the text).\n" +
-            "\n" +
-            "If the two widgets are offset from each other with " +
-            "margins, this can be replaced with a `drawablePadding` attribute.\n" +
-            "\n" +
-            "There's a lint quickfix to perform this conversion in the Eclipse plugin.",
-            Category.PERFORMANCE,
-            6,
-            Severity.WARNING,
-            UseCompoundDrawableDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new {@link UseCompoundDrawableDetector} */
-    public UseCompoundDrawableDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Collections.singletonList(
-                LINEAR_LAYOUT
-        );
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        int childCount = LintUtils.getChildCount(element);
-        if (childCount == 2) {
-            List<Element> children = LintUtils.getChildren(element);
-            Element first = children.get(0);
-            Element second = children.get(1);
-            if ((first.getTagName().equals(IMAGE_VIEW) &&
-                    second.getTagName().equals(TEXT_VIEW) &&
-                    !first.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_WEIGHT)) ||
-                ((second.getTagName().equals(IMAGE_VIEW) &&
-                        first.getTagName().equals(TEXT_VIEW) &&
-                        !second.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_WEIGHT)))) {
-                // If the layout has a background, ignore since it would disappear from
-                // the TextView
-                if (element.hasAttributeNS(ANDROID_URI, ATTR_BACKGROUND)) {
-                    return;
-                }
-
-                // Certain scale types cannot be done with compound drawables
-                String scaleType = first.getTagName().equals(IMAGE_VIEW)
-                        ? first.getAttributeNS(ANDROID_URI, ATTR_SCALE_TYPE)
-                        : second.getAttributeNS(ANDROID_URI, ATTR_SCALE_TYPE);
-                if (scaleType != null && !scaleType.isEmpty()) {
-                    // For now, ignore if any scale type is set
-                    return;
-                }
-
-                context.report(ISSUE, element, context.getLocation(element),
-                        "This tag and its children can be replaced by one <TextView/> and " +
-                                "a compound drawable", null);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/UselessViewDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/UselessViewDetector.java
deleted file mode 100644
index 867c3c4..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/UselessViewDetector.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ABSOLUTE_LAYOUT;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_BACKGROUND;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_STYLE;
-import static com.android.SdkConstants.FRAME_LAYOUT;
-import static com.android.SdkConstants.GRID_LAYOUT;
-import static com.android.SdkConstants.GRID_VIEW;
-import static com.android.SdkConstants.HORIZONTAL_SCROLL_VIEW;
-import static com.android.SdkConstants.LINEAR_LAYOUT;
-import static com.android.SdkConstants.VIEW_MERGE;
-import static com.android.SdkConstants.RADIO_GROUP;
-import static com.android.SdkConstants.RELATIVE_LAYOUT;
-import static com.android.SdkConstants.SCROLL_VIEW;
-import static com.android.SdkConstants.TABLE_LAYOUT;
-import static com.android.SdkConstants.TABLE_ROW;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Checks whether the current node can be removed without affecting the layout.
- */
-public class UselessViewDetector extends LayoutDetector {
-    /** Issue of including a parent that has no value on its own */
-    public static final Issue USELESS_PARENT = Issue.create(
-            "UselessParent", //$NON-NLS-1$
-            "Checks whether a parent layout can be removed.",
-            "A layout with children that has no siblings, is not a scrollview or " +
-            "a root layout, and does not have a background, can be removed and have " +
-            "its children moved directly into the parent for a flatter and more " +
-            "efficient layout hierarchy.",
-            Category.PERFORMANCE,
-            2,
-            Severity.WARNING,
-            UselessViewDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Issue of including a leaf that isn't shown */
-    public static final Issue USELESS_LEAF = Issue.create(
-            "UselessLeaf", //$NON-NLS-1$
-            "Checks whether a leaf layout can be removed.",
-            "A layout that has no children or no background can often be removed (since it " +
-            "is invisible) for a flatter and more efficient layout hierarchy.",
-            Category.PERFORMANCE,
-            2,
-            Severity.WARNING,
-            UselessViewDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new {@link UselessViewDetector} */
-    public UselessViewDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    private static final List<String> CONTAINERS = new ArrayList<String>(18);
-    static {
-        CONTAINERS.add(ABSOLUTE_LAYOUT);
-        CONTAINERS.add(FRAME_LAYOUT);
-        CONTAINERS.add(GRID_LAYOUT);
-        CONTAINERS.add(GRID_VIEW);
-        CONTAINERS.add(HORIZONTAL_SCROLL_VIEW);
-        CONTAINERS.add("ImageSwitcher");                      //$NON-NLS-1$
-        CONTAINERS.add(LINEAR_LAYOUT);
-        CONTAINERS.add(RADIO_GROUP);
-        CONTAINERS.add(RELATIVE_LAYOUT);
-        CONTAINERS.add(SCROLL_VIEW);
-        CONTAINERS.add("SlidingDrawer");                      //$NON-NLS-1$
-        CONTAINERS.add("StackView");                          //$NON-NLS-1$
-        CONTAINERS.add(TABLE_LAYOUT);
-        CONTAINERS.add(TABLE_ROW);
-        CONTAINERS.add("TextSwitcher");                       //$NON-NLS-1$
-        CONTAINERS.add("ViewAnimator");                       //$NON-NLS-1$
-        CONTAINERS.add("ViewFlipper");                        //$NON-NLS-1$
-        CONTAINERS.add("ViewSwitcher");                       //$NON-NLS-1$
-        // Available ViewGroups that are not included by this check:
-        //  CONTAINERS.add("android.gesture.GestureOverlayView");
-        //  CONTAINERS.add("AdapterViewFlipper");
-        //  CONTAINERS.add("DialerFilter");
-        //  CONTAINERS.add("ExpandableListView");
-        //  CONTAINERS.add("ListView");
-        //  CONTAINERS.add("MediaController");
-        //  CONTAINERS.add("merge");
-        //  CONTAINERS.add("SearchView");
-        //  CONTAINERS.add("TabWidget");
-        //  CONTAINERS.add("TabHost");
-    }
-    @Override
-    public Collection<String> getApplicableElements() {
-        return CONTAINERS;
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        int childCount = LintUtils.getChildCount(element);
-        if (childCount == 0) {
-            // Check to see if this is a leaf layout that can be removed
-            checkUselessLeaf(context, element);
-        } else {
-            // Check to see if this is a middle-man layout which can be removed
-            checkUselessMiddleLayout(context, element);
-        }
-    }
-
-    // This is the old UselessLayoutCheck from layoutopt
-    private static void checkUselessMiddleLayout(XmlContext context, Element element) {
-        // Conditions:
-        // - The node has children
-        // - The node does not have siblings
-        // - The node's parent is not a scroll view (horizontal or vertical)
-        // - The node does not have a background or its parent does not have a
-        //   background or neither the node and its parent have a background
-        // - The parent is not a <merge/>
-
-        Node parentNode = element.getParentNode();
-        if (parentNode.getNodeType() != Node.ELEMENT_NODE) {
-            // Can't remove root
-            return;
-        }
-
-        Element parent = (Element) parentNode;
-        String parentTag = parent.getTagName();
-        if (parentTag.equals(SCROLL_VIEW) || parentTag.equals(HORIZONTAL_SCROLL_VIEW) ||
-                parentTag.equals(VIEW_MERGE)) {
-            // Can't remove if the parent is a scroll view or a merge
-            return;
-        }
-
-        // This method is only called when we've already ensured that it has children
-        assert LintUtils.getChildCount(element) > 0;
-
-        int parentChildCount = LintUtils.getChildCount(parent);
-        if (parentChildCount != 1) {
-            // Don't remove if the node has siblings
-            return;
-        }
-
-        // - A parent can be removed if it doesn't have a background
-        // - A parent can be removed if has a background *and* the child does not have a
-        //   background (in which case, just move the background over to the child, remove
-        //   the parent)
-        // - If both child and parent have a background, the parent cannot be removed (a
-        //   background can be translucent, have transparent padding, etc.)
-        boolean nodeHasBackground = element.hasAttributeNS(ANDROID_URI, ATTR_BACKGROUND);
-        boolean parentHasBackground = parent.hasAttributeNS(ANDROID_URI, ATTR_BACKGROUND);
-        if (nodeHasBackground && parentHasBackground) {
-            // Can't remove because both define a background, and they might both be
-            // visible (e.g. through transparency or padding).
-            return;
-        }
-
-        // Certain parents are special - such as the TabHost and the GestureOverlayView -
-        // where we want to leave things alone.
-        if (!CONTAINERS.contains(parentTag)) {
-            return;
-        }
-
-        boolean hasId = element.hasAttributeNS(ANDROID_URI, ATTR_ID);
-        Location location = context.getLocation(element);
-        String tag = element.getTagName();
-        String format;
-        if (hasId) {
-            format = "This %1$s layout or its %2$s parent is possibly useless";
-        } else {
-            format = "This %1$s layout or its %2$s parent is useless";
-        }
-        if (nodeHasBackground || parentHasBackground) {
-            format += "; transfer the background attribute to the other view";
-        }
-        String message = String.format(format, tag, parentTag);
-        context.report(USELESS_PARENT, element, location, message, null);
-    }
-
-    // This is the old UselessView check from layoutopt
-    private static void checkUselessLeaf(XmlContext context, Element element) {
-        assert LintUtils.getChildCount(element) == 0;
-
-        // Conditions:
-        // - The node is a container view (LinearLayout, etc.)
-        // - The node has no id
-        // - The node has no background
-        // - The node has no children
-        // - The node has no style
-        // - The node is not a root
-
-        if (element.hasAttributeNS(ANDROID_URI, ATTR_ID)) {
-            return;
-        }
-
-        if (element.hasAttributeNS(ANDROID_URI, ATTR_BACKGROUND)) {
-            return;
-        }
-
-        if (element.hasAttribute(ATTR_STYLE)) {
-            return;
-        }
-
-        if (element == context.document.getDocumentElement()) {
-            return;
-        }
-
-        Location location = context.getLocation(element);
-        String tag = element.getTagName();
-        String message = String.format(
-                "This %1$s view is useless (no children, no background, no id, no style)", tag);
-        context.report(USELESS_LEAF, element, location, message, null);
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/Utf8Detector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/Utf8Detector.java
deleted file mode 100644
index 2e23483..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/Utf8Detector.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Document;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Checks that the encoding used in resource files is always UTF-8.
- */
-public class Utf8Detector extends LayoutDetector {
-    /** Detects non-utf8 encodings */
-    public static final Issue ISSUE = Issue.create(
-            "EnforceUTF8", //$NON-NLS-1$
-            "Checks that all XML resource files are using UTF-8 as the file encoding",
-            "XML supports encoding in a wide variety of character sets. However, not all " +
-            "tools handle the XML encoding attribute correctly, and nearly all Android " +
-            "apps use UTF-8, so by using UTF-8 you can protect yourself against subtle " +
-            "bugs when using non-ASCII characters.",
-            Category.I18N,
-            2,
-            Severity.WARNING,
-            Utf8Detector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** See http://www.w3.org/TR/REC-xml/#NT-EncodingDecl */
-    private static final Pattern ENCODING_PATTERN =
-            Pattern.compile("encoding=['\"](\\S*)['\"]");//$NON-NLS-1$
-
-    /** Constructs a new {@link Utf8Detector} */
-    public Utf8Detector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public void visitDocument(@NonNull XmlContext context, @NonNull Document document) {
-        String xml = context.getContents();
-        if (xml == null) {
-            return;
-        }
-
-        // AAPT: The prologue must be in the first line
-        int lineEnd = 0;
-        int max = xml.length();
-        for (; lineEnd < max; lineEnd++) {
-            char c = xml.charAt(lineEnd);
-            if (c == '\n' || c == '\r') {
-                break;
-            }
-        }
-
-        for (int i = 16; i < lineEnd - 5; i++) { // +4: Skip at least <?xml encoding="
-            if ((xml.charAt(i) == 'u' || xml.charAt(i) == 'U')
-                    && (xml.charAt(i + 1) == 't' || xml.charAt(i + 1) == 'T')
-                    && (xml.charAt(i + 2) == 'f' || xml.charAt(i + 2) == 'F')
-                    && (xml.charAt(i + 3) == '-' || xml.charAt(i + 3) == '_')
-                    && (xml.charAt(i + 4) == '8')) {
-                return;
-            }
-        }
-
-        int encodingIndex = xml.lastIndexOf("encoding", lineEnd); //$NON-NLS-1$
-        if (encodingIndex != -1) {
-            Matcher matcher = ENCODING_PATTERN.matcher(xml);
-            if (matcher.find(encodingIndex)) {
-                String encoding = matcher.group(1);
-                Location location = Location.create(context.file, xml,
-                        matcher.start(1), matcher.end(1));
-                context.report(ISSUE, null, location, String.format(
-                        "%1$s: Not using UTF-8 as the file encoding. This can lead to subtle " +
-                                "bugs with non-ascii characters", encoding), null);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ViewConstructorDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ViewConstructorDetector.java
deleted file mode 100644
index 0eba024..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ViewConstructorDetector.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.CONSTRUCTOR_NAME;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.MethodNode;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * Looks for custom views that do not define the view constructors needed by UI builders
- */
-public class ViewConstructorDetector extends Detector implements Detector.ClassScanner {
-    private static final String SIG1 =
-            "(Landroid/content/Context;)V"; //$NON-NLS-1$
-    private static final String SIG2 =
-            "(Landroid/content/Context;Landroid/util/AttributeSet;)V"; //$NON-NLS-1$
-    private static final String SIG3 =
-            "(Landroid/content/Context;Landroid/util/AttributeSet;I)V"; //$NON-NLS-1$
-
-    /** The main issue discovered by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "ViewConstructor", //$NON-NLS-1$
-            "Checks that custom views define the expected constructors",
-
-            "Some layout tools (such as the Android layout editor for Eclipse) needs to " +
-            "find a constructor with one of the following signatures:\n" +
-            "* `View(Context context)`\n" +
-            "* `View(Context context, AttributeSet attrs)`\n" +
-            "* `View(Context context, AttributeSet attrs, int defStyle)`\n" +
-            "\n" +
-            "If your custom view needs to perform initialization which does not apply when " +
-            "used in a layout editor, you can surround the given code with a check to " +
-            "see if `View#isInEditMode()` is false, since that method will return `false` " +
-            "at runtime but true within a user interface editor.",
-
-            Category.USABILITY,
-            3,
-            Severity.WARNING,
-            ViewConstructorDetector.class,
-            Scope.CLASS_FILE_SCOPE);
-
-    /** Constructs a new {@link ViewConstructorDetector} check */
-    public ViewConstructorDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @Override
-    public void checkClass(@NonNull ClassContext context, @NonNull ClassNode classNode) {
-        if (classNode.name.indexOf('$') != -1
-            && (classNode.access & Opcodes.ACC_STATIC) == 0) {
-            // Ignore inner classes that aren't static: we can't create these
-            // anyway since we'd need the outer instance
-            return;
-        }
-
-        if (isViewClass(context, classNode)) {
-            checkConstructors(context, classNode);
-        }
-    }
-
-    private static boolean isViewClass(ClassContext context, ClassNode node) {
-        String superName = node.superName;
-        while (superName != null) {
-            if (superName.equals("android/view/View")                //$NON-NLS-1$
-                    || superName.equals("android/view/ViewGroup")    //$NON-NLS-1$
-                    || superName.startsWith("android/widget/")       //$NON-NLS-1$
-                    && !((superName.endsWith("Adapter")              //$NON-NLS-1$
-                            || superName.endsWith("Controller")      //$NON-NLS-1$
-                            || superName.endsWith("Service")         //$NON-NLS-1$
-                            || superName.endsWith("Provider")        //$NON-NLS-1$
-                            || superName.endsWith("Filter")))) {     //$NON-NLS-1$
-                return true;
-            }
-
-            superName = context.getDriver().getSuperClass(superName);
-        }
-
-        return false;
-    }
-
-    private static void checkConstructors(ClassContext context, ClassNode classNode) {
-        // Look through constructors
-        @SuppressWarnings("rawtypes")
-        List methods = classNode.methods;
-        for (Object methodObject : methods) {
-            MethodNode method = (MethodNode) methodObject;
-            if (method.name.equals(CONSTRUCTOR_NAME)) {
-                String desc = method.desc;
-                if (desc.equals(SIG1) || desc.equals(SIG2) || desc.equals(SIG3)) {
-                    return;
-                }
-            }
-        }
-
-        // If we get this far, none of the expected constructors were found.
-
-        // Use location of one of the constructors?
-        String message = String.format(
-                "Custom view %1$s is missing constructor used by tools: " +
-                "(Context) or (Context,AttributeSet) or (Context,AttributeSet,int)",
-                classNode.name);
-        File sourceFile = context.getSourceFile();
-        Location location = Location.create(sourceFile != null
-                ? sourceFile : context.file);
-        context.report(ISSUE, location, message, null /*data*/);
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ViewTagDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ViewTagDetector.java
deleted file mode 100644
index 46e24cc..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ViewTagDetector.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.client.api.LintDriver;
-import com.android.tools.lint.client.api.SdkInfo;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import org.objectweb.asm.Type;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.InsnList;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.objectweb.asm.tree.analysis.Analyzer;
-import org.objectweb.asm.tree.analysis.AnalyzerException;
-import org.objectweb.asm.tree.analysis.BasicInterpreter;
-import org.objectweb.asm.tree.analysis.BasicValue;
-import org.objectweb.asm.tree.analysis.Frame;
-
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-
-/**
- * Checks for missing view tag detectors
- */
-public class ViewTagDetector extends Detector implements ClassScanner {
-    /** Using setTag and leaking memory */
-    public static final Issue ISSUE = Issue.create(
-            "ViewTag", //$NON-NLS-1$
-            "Finds potential leaks when using View.setTag",
-
-            "Prior to Android 4.0, the implementation of View.setTag(int, Object) would " +
-            "store the objects in a static map, where the values were strongly referenced. " +
-            "This means that if the object contains any references pointing back to the " +
-            "context, the context (which points to pretty much everything else) will leak. " +
-            "If you pass a view, the view provides a reference to the context " +
-            "that created it. Similarly, view holders typically contain a view, and cursors " +
-            "are sometimes also associated with views.",
-
-            Category.PERFORMANCE,
-            6,
-            Severity.WARNING,
-            ViewTagDetector.class,
-            EnumSet.of(Scope.ALL_RESOURCE_FILES, Scope.CLASS_FILE));
-
-    /** Constructs a new {@link ViewTagDetector} */
-    public ViewTagDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @Override
-    @Nullable
-    public List<String> getApplicableCallNames() {
-        return Collections.singletonList("setTag"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void checkCall(@NonNull ClassContext context, @NonNull ClassNode classNode,
-            @NonNull MethodNode method, @NonNull MethodInsnNode call) {
-        // The leak behavior is fixed in ICS:
-        // http://code.google.com/p/android/issues/detail?id=18273
-        if (context.getMainProject().getMinSdk() >= 14) {
-            return;
-        }
-
-        String owner = call.owner;
-        String desc = call.desc;
-        if (owner.equals("android/view/View")                 //$NON-NLS-1$
-                && desc.equals("(ILjava/lang/Object;)V")) {   //$NON-NLS-1$
-            Analyzer analyzer = new Analyzer(new BasicInterpreter() {
-                @Override
-                public BasicValue newValue(Type type) {
-                    if (type == null) {
-                        return BasicValue.UNINITIALIZED_VALUE;
-                    } else if (type.getSort() == Type.VOID) {
-                        return null;
-                    } else {
-                        return new BasicValue(type);
-                    }
-                }
-            });
-            try {
-                Frame[] frames = analyzer.analyze(classNode.name, method);
-                InsnList instructions = method.instructions;
-                Frame frame = frames[instructions.indexOf(call)];
-                if (frame.getStackSize() < 3) {
-                    return;
-                }
-                BasicValue stackValue = (BasicValue) frame.getStack(2);
-                Type type = stackValue.getType();
-                if (type == null) {
-                    return;
-                }
-
-                String internalName = type.getInternalName();
-                String className = type.getClassName();
-                LintDriver driver = context.getDriver();
-
-                SdkInfo sdkInfo = context.getClient().getSdkInfo(context.getMainProject());
-                String objectType = null;
-                while (className != null) {
-                    if (className.equals("android.view.View")) {         //$NON-NLS-1$
-                        objectType = "views";
-                        break;
-                    } else if (className.endsWith("ViewHolder")) {       //$NON-NLS-1$
-                        objectType = "view holders";
-                        break;
-                    } else if (className.endsWith("Cursor")              //$NON-NLS-1$
-                                && className.startsWith("android.")) {   //$NON-NLS-1$
-                        objectType = "cursors";
-                        break;
-                    }
-
-                    // TBD: Bitmaps, drawables? That's tricky, because as explained in
-                    // http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
-                    // apparently these are used along with nulling out the callbacks,
-                    // and that's harder to detect here
-
-                    String parent = sdkInfo.getParentViewClass(className);
-                    if (parent == null) {
-                        if (internalName == null) {
-                            internalName = className.replace('.', '/');
-                        }
-                        assert internalName != null;
-                        parent = driver.getSuperClass(internalName);
-                    }
-                    className = parent;
-                    internalName = null;
-                }
-
-                if (objectType != null) {
-                    Location location = context.getLocation(call);
-                    String message = String.format("Avoid setting %1$s as values for setTag: " +
-                        "Can lead to memory leaks in versions older than Android 4.0",
-                        objectType);
-                    context.report(ISSUE, method, call, location, message, null);
-                }
-            } catch (AnalyzerException e) {
-                context.log(e, null);
-            }
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ViewTypeDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ViewTypeDetector.java
deleted file mode 100644
index bad5d50..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/ViewTypeDetector.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.DOT_JAVA;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.ResourceXmlDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.google.common.base.Joiner;
-
-import org.w3c.dom.Attr;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.Cast;
-import lombok.ast.Expression;
-import lombok.ast.MethodInvocation;
-import lombok.ast.Select;
-import lombok.ast.StrictListAccessor;
-
-/** Detector for finding inconsistent usage of views and casts */
-public class ViewTypeDetector extends ResourceXmlDetector implements Detector.JavaScanner {
-    /** Mismatched view types */
-    public static final Issue ISSUE = Issue.create("WrongViewCast", //$NON-NLS-1$
-            "Looks for incorrect casts to views that according to the XML are of a different type",
-            "Keeps track of the view types associated with ids and if it finds a usage of " +
-            "the id in the Java code it ensures that it is treated as the same type.",
-            Category.CORRECTNESS,
-            9,
-            Severity.ERROR,
-            ViewTypeDetector.class,
-            EnumSet.of(Scope.ALL_RESOURCE_FILES, Scope.ALL_JAVA_FILES));
-
-    private final Map<String, Object> mIdToViewTag = new HashMap<String, Object>(50);
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.SLOW;
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.LAYOUT;
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull Context context, @NonNull File file) {
-        if (LintUtils.endsWith(file.getName(), DOT_JAVA)) {
-            return true;
-        }
-
-        return super.appliesTo(context, file);
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return Collections.singletonList(ATTR_ID);
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        String view = attribute.getOwnerElement().getTagName();
-        String value = attribute.getValue();
-        String id = null;
-        if (value.startsWith(ID_PREFIX)) {
-            id = value.substring(ID_PREFIX.length());
-        } else if (value.startsWith(NEW_ID_PREFIX)) {
-            id = value.substring(NEW_ID_PREFIX.length());
-        } // else: could be @android id
-
-        if (id != null) {
-            if (view.equals(VIEW_TAG)) {
-                view = attribute.getOwnerElement().getAttribute(ATTR_CLASS);
-            }
-
-            Object existing = mIdToViewTag.get(id);
-            if (existing == null) {
-                mIdToViewTag.put(id, view);
-            } else if (existing instanceof String) {
-                String existingString = (String) existing;
-                if (!existingString.equals(view)) {
-                    // Convert to list
-                    List<String> list = new ArrayList<String>(2);
-                    list.add((String) existing);
-                    list.add(view);
-                    mIdToViewTag.put(id, list);
-                }
-            } else if (existing instanceof List<?>) {
-                @SuppressWarnings("unchecked")
-                List<String> list = (List<String>) existing;
-                if (!list.contains(view)) {
-                    list.add(view);
-                }
-            }
-        }
-    }
-
-    // ---- Implements Detector.JavaScanner ----
-
-    @Override
-    public List<String> getApplicableMethodNames() {
-        return Collections.singletonList("findViewById"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void visitMethod(@NonNull JavaContext context, @Nullable AstVisitor visitor,
-            @NonNull MethodInvocation node) {
-        assert node.astName().getDescription().equals("findViewById");
-        if (node.getParent() instanceof Cast) {
-            Cast cast = (Cast) node.getParent();
-            String castType = cast.astTypeReference().getTypeName();
-            StrictListAccessor<Expression, MethodInvocation> args = node.astArguments();
-            if (args.size() == 1) {
-                Expression first = args.first();
-                // TODO: Do flow analysis as in the StringFormatDetector in order
-                // to handle variable references too
-                if (first instanceof Select) {
-                    String resource = first.toString();
-                    if (resource.startsWith("R.id.")) { //$NON-NLS-1$
-                        String id = ((Select) first).astIdentifier().astValue();
-                        Object types = mIdToViewTag.get(id);
-                        if (types instanceof String) {
-                            String layoutType = (String) types;
-                            checkCompatible(context, castType, layoutType, null, cast);
-                        } else if (types instanceof List<?>) {
-                            @SuppressWarnings("unchecked")
-                            List<String> layoutTypes = (List<String>) types;
-                            checkCompatible(context, castType, null, layoutTypes, cast);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /** Check if the view and cast type are compatible */
-    private static void checkCompatible(JavaContext context, String castType, String layoutType,
-            List<String> layoutTypes, Cast node) {
-        assert layoutType == null || layoutTypes == null; // Should only specify one or the other
-        boolean compatible = true;
-        if (layoutType != null) {
-            if (!layoutType.equals(castType)
-                    && !context.getSdkInfo().isSubViewOf(castType, layoutType)) {
-                compatible = false;
-            }
-        } else {
-            compatible = false;
-            assert layoutTypes != null;
-            for (String type : layoutTypes) {
-                if (type.equals(castType)
-                        || context.getSdkInfo().isSubViewOf(castType, type)) {
-                    compatible = true;
-                    break;
-                }
-            }
-        }
-
-        if (!compatible) {
-            if (layoutType == null) {
-                layoutType = Joiner.on("|").join(layoutTypes);
-            }
-            String message = String.format(
-                    "Unexpected cast to %1$s: layout tag was %2$s",
-                    castType, layoutType);
-            context.report(ISSUE, node, context.parser.getLocation(context, node), message,
-                    null);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WakelockDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WakelockDetector.java
deleted file mode 100644
index 47410eb..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WakelockDetector.java
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_APP_ACTIVITY;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.checks.ControlFlowGraph.Node;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.InsnList;
-import org.objectweb.asm.tree.JumpInsnNode;
-import org.objectweb.asm.tree.LdcInsnNode;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-import org.objectweb.asm.tree.analysis.AnalyzerException;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Checks for problems with wakelocks (such as failing to release them)
- * which can lead to unnecessary battery usage.
- */
-public class WakelockDetector extends Detector implements ClassScanner {
-
-    /** Problems using wakelocks */
-    public static final Issue ISSUE = Issue.create(
-        "Wakelock", //$NON-NLS-1$
-        "Looks for problems with wakelock usage",
-
-        "Failing to release a wakelock properly can keep the Android device in " +
-        "a high power mode, which reduces battery life. There are several causes " +
-        "of this, such as releasing the wake lock in `onDestroy()` instead of in " +
-        "`onPause()`, failing to call `release()` in all possible code paths after " +
-        "an `acquire()`, and so on.\n" +
-        "\n" +
-        "NOTE: If you are using the lock just to keep the screen on, you should " +
-        "strongly consider using `FLAG_KEEP_SCREEN_ON` instead. This window flag " +
-        "will be correctly managed by the platform as the user moves between " +
-        "applications and doesn't require a special permission. See " +
-        "http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_KEEP_SCREEN_ON.",
-
-        Category.PERFORMANCE,
-        9,
-        Severity.WARNING,
-        WakelockDetector.class,
-        Scope.CLASS_FILE_SCOPE);
-
-    private static final String WAKELOCK_OWNER = "android/os/PowerManager$WakeLock"; //$NON-NLS-1$
-    private static final String RELEASE_METHOD = "release"; //$NON-NLS-1$
-    private static final String ACQUIRE_METHOD = "acquire"; //$NON-NLS-1$
-    private static final String IS_HELD_METHOD = "isHeld"; //$NON-NLS-1$
-    private static final String POWER_MANAGER = "android/os/PowerManager"; //$NON-NLS-1$
-    private static final String NEW_WAKE_LOCK_METHOD = "newWakeLock"; //$NON-NLS-1$
-
-    /** Print diagnostics during analysis (display flow control graph etc).
-     * Make sure you add the asm-debug or asm-util jars to the runtime classpath
-     * as well since the opcode integer to string mapping display routine looks for
-     * it via reflection. */
-    private static final boolean DEBUG = false;
-
-    /** Constructs a new {@link WakelockDetector} */
-    public WakelockDetector() {
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (mHasAcquire && !mHasRelease && context.getDriver().getPhase() == 1) {
-            // Gather positions of the acquire calls
-            context.getDriver().requestRepeat(this, Scope.CLASS_FILE_SCOPE);
-        }
-    }
-
-    // ---- Implements ClassScanner ----
-
-    /** Whether any {@code acquire()} calls have been encountered */
-    private boolean mHasAcquire;
-
-    /** Whether any {@code release()} calls have been encountered */
-    private boolean mHasRelease;
-
-    @Override
-    @Nullable
-    public List<String> getApplicableCallNames() {
-        return Arrays.asList(ACQUIRE_METHOD, RELEASE_METHOD, NEW_WAKE_LOCK_METHOD);
-    }
-
-    @Override
-    public void checkCall(@NonNull ClassContext context, @NonNull ClassNode classNode,
-            @NonNull MethodNode method, @NonNull MethodInsnNode call) {
-        if (!context.getProject().getReportIssues()) {
-            // If this is a library project not being analyzed, ignore it
-            return;
-        }
-
-        if (call.owner.equals(WAKELOCK_OWNER)) {
-            String name = call.name;
-            if (name.equals(ACQUIRE_METHOD)) {
-                mHasAcquire = true;
-
-                if (context.getDriver().getPhase() == 2) {
-                    assert !mHasRelease;
-                    context.report(ISSUE, method, call, context.getLocation(call),
-                        "Found a wakelock acquire() but no release() calls anywhere",
-                        null);
-                } else {
-                    assert context.getDriver().getPhase() == 1;
-                    // Perform flow analysis in this method to see if we're
-                    // performing an acquire/release block, where there are code paths
-                    // between the acquire and release which can result in the
-                    // release call not getting reached.
-                    checkFlow(context, classNode, method, call);
-                }
-            } else if (name.equals(RELEASE_METHOD)) {
-                mHasRelease = true;
-
-                // See if the release is happening in an onDestroy method, in an
-                // activity.
-                if ("onDestroy".equals(method.name) //$NON-NLS-1$
-                        && context.getDriver().isSubclassOf(
-                                classNode, ANDROID_APP_ACTIVITY)) {
-                    context.report(ISSUE, method, call, context.getLocation(call),
-                        "Wakelocks should be released in onPause, not onDestroy",
-                        null);
-                }
-            }
-        } else if (call.owner.equals(POWER_MANAGER)) {
-            if (call.name.equals(NEW_WAKE_LOCK_METHOD)) {
-                AbstractInsnNode prev = LintUtils.getPrevInstruction(call);
-                if (prev == null) {
-                    return;
-                }
-                prev = LintUtils.getPrevInstruction(prev);
-                if (prev == null || prev.getOpcode() != Opcodes.LDC) {
-                    return;
-                }
-                LdcInsnNode ldc = (LdcInsnNode) prev;
-                Object constant = ldc.cst;
-                if (constant instanceof Integer) {
-                    int flag = ((Integer) constant).intValue();
-                    // Constant values are copied into the bytecode so we have to compare
-                    // values; however, that means the values are part of the API
-                    final int PARTIAL_WAKE_LOCK = 0x00000001;
-                    final int ACQUIRE_CAUSES_WAKEUP = 0x10000000;
-                    final int both = PARTIAL_WAKE_LOCK | ACQUIRE_CAUSES_WAKEUP;
-                    if ((flag & both) == both) {
-                        context.report(ISSUE, method, call, context.getLocation(call),
-                                "Should not set both PARTIAL_WAKE_LOCK and ACQUIRE_CAUSES_WAKEUP. "
-                                        + "If you do not want the screen to turn on, get rid of "
-                                        + "ACQUIRE_CAUSES_WAKEUP",
-                                null);
-                    }
-                }
-
-            }
-        }
-    }
-
-    private void checkFlow(@NonNull ClassContext context, @NonNull ClassNode classNode,
-            @NonNull MethodNode method, @NonNull MethodInsnNode acquire) {
-        // Track allocations such that we know whether the type of the call
-        // is on a SecureRandom rather than a Random
-        final InsnList instructions = method.instructions;
-        MethodInsnNode release = null;
-
-        // Find release call
-        for (int i = 0, n = instructions.size(); i < n; i++) {
-            AbstractInsnNode instruction = instructions.get(i);
-            int type = instruction.getType();
-            if (type == AbstractInsnNode.METHOD_INSN) {
-                MethodInsnNode call = (MethodInsnNode) instruction;
-                if (call.name.equals(RELEASE_METHOD) &&
-                        call.owner.equals(WAKELOCK_OWNER)) {
-                    release = call;
-                    break;
-                }
-            }
-        }
-
-        if (release == null) {
-            // Didn't find both acquire and release in this method; no point in doing
-            // local flow analysis
-            return;
-        }
-
-        try {
-            MyGraph graph = new MyGraph();
-            ControlFlowGraph.create(graph, classNode, method);
-
-            if (DEBUG) {
-                // Requires util package
-                //ClassNode clazz = classNode;
-                //clazz.accept(new TraceClassVisitor(new PrintWriter(System.out)));
-                System.out.println(graph.toString(graph.getNode(acquire)));
-            }
-
-            int status = dfs(graph.getNode(acquire));
-            if ((status & SEEN_RETURN) != 0) {
-                String message;
-                if ((status & SEEN_EXCEPTION) != 0) {
-                    message = "The release() call is not always reached (via exceptional flow)";
-                } else {
-                    message = "The release() call is not always reached";
-                }
-
-                context.report(ISSUE, method, acquire,
-                        context.getLocation(release), message, null);
-            }
-        } catch (AnalyzerException e) {
-            context.log(e, null);
-        }
-    }
-
-    private static final int SEEN_TARGET = 1;
-    private static final int SEEN_BRANCH = 2;
-    private static final int SEEN_EXCEPTION = 4;
-    private static final int SEEN_RETURN = 8;
-
-    /** TODO RENAME */
-    private static class MyGraph extends ControlFlowGraph {
-        @Override
-        protected void add(@NonNull AbstractInsnNode from, @NonNull AbstractInsnNode to) {
-            if (from.getOpcode() == Opcodes.IFNULL) {
-                JumpInsnNode jump = (JumpInsnNode) from;
-                if (jump.label == to) {
-                    // Skip jump targets on null if it's surrounding the release call
-                    //
-                    //  if (lock != null) {
-                    //      lock.release();
-                    //  }
-                    //
-                    // The above shouldn't be considered a scenario where release() may not
-                    // be called.
-                    AbstractInsnNode next = LintUtils.getNextInstruction(from);
-                    if (next != null && next.getType() == AbstractInsnNode.VAR_INSN) {
-                        next = LintUtils.getNextInstruction(next);
-                        if (next != null && next.getType() == AbstractInsnNode.METHOD_INSN) {
-                            MethodInsnNode method = (MethodInsnNode) next;
-                            if (method.name.equals(RELEASE_METHOD) &&
-                                    method.owner.equals(WAKELOCK_OWNER)) {
-                                // This isn't entirely correct; this will also trigger
-                                // for "if (lock == null) { lock.release(); }" but that's
-                                // not likely (and caught by other null checking in tools)
-                                return;
-                            }
-                        }
-                    }
-                }
-            } else if (from.getOpcode() == Opcodes.IFEQ) {
-                JumpInsnNode jump = (JumpInsnNode) from;
-                if (jump.label == to) {
-                    AbstractInsnNode prev = LintUtils.getPrevInstruction(from);
-                    if (prev != null && prev.getType() == AbstractInsnNode.METHOD_INSN) {
-                        MethodInsnNode method = (MethodInsnNode) prev;
-                        if (method.name.equals(IS_HELD_METHOD) &&
-                                method.owner.equals(WAKELOCK_OWNER)) {
-                            AbstractInsnNode next = LintUtils.getNextInstruction(from);
-                            if (next != null) {
-                                super.add(from, next);
-                                return;
-                            }
-                        }
-                    }
-                }
-            }
-
-            super.add(from, to);
-        }
-    }
-
-    /** Search from the given node towards the target; return false if we reach
-     * an exit point such as a return or a call on the way there that is not within
-     * a try/catch clause.
-     *
-     * @param node the current node
-     * @return true if the target was reached
-     *    XXX RETURN VALUES ARE WRONG AS OF RIGHT NOW
-     */
-    protected int dfs(ControlFlowGraph.Node node) {
-        AbstractInsnNode instruction = node.instruction;
-        if (instruction.getType() == AbstractInsnNode.JUMP_INSN) {
-            int opcode = instruction.getOpcode();
-            if (opcode == Opcodes.RETURN || opcode == Opcodes.ARETURN
-                    || opcode == Opcodes.LRETURN || opcode == Opcodes.IRETURN
-                    || opcode == Opcodes.DRETURN || opcode == Opcodes.FRETURN
-                    || opcode == Opcodes.ATHROW) {
-                if (DEBUG) {
-                    System.out.println("Found exit via explicit return: " //$NON-NLS-1$
-                            + node.toString(false));
-                }
-                return SEEN_RETURN;
-            }
-        }
-
-        if (!DEBUG) {
-            // There are no cycles, so no *NEED* for this, though it does avoid
-            // researching shared labels. However, it makes debugging harder (no re-entry)
-            // so this is only done when debugging is off
-            if (node.visit != 0) {
-                return 0;
-            }
-            node.visit = 1;
-        }
-
-        // Look for the target. This is any method call node which is a release on the
-        // lock (later also check it's the same instance, though that's harder).
-        // This is because finally blocks tend to be inlined so from a single try/catch/finally
-        // with a release() in the finally, the bytecode can contain multiple repeated
-        // (inlined) release() calls.
-        if (instruction.getType() == AbstractInsnNode.METHOD_INSN) {
-            MethodInsnNode method = (MethodInsnNode) instruction;
-            if (method.name.equals(RELEASE_METHOD) && method.owner.equals(WAKELOCK_OWNER)) {
-                return SEEN_TARGET;
-            } else if (method.name.equals(ACQUIRE_METHOD) && method.owner.equals(WAKELOCK_OWNER)) {
-                // OK
-            } else if (method.name.equals(IS_HELD_METHOD) && method.owner.equals(WAKELOCK_OWNER)) {
-                // OK
-            } else {
-                // Some non acquire/release method call: if this is not associated with a
-                // try-catch block, it would mean the exception would exit the method,
-                // which would be an error
-                if (node.exceptions == null || node.exceptions.isEmpty()) {
-                    // Look up the corresponding frame, if any
-                    AbstractInsnNode curr = method.getPrevious();
-                    boolean foundFrame = false;
-                    while (curr != null) {
-                        if (curr.getType() == AbstractInsnNode.FRAME) {
-                            foundFrame = true;
-                            break;
-                        }
-                        curr = curr.getPrevious();
-                    }
-
-                    if (!foundFrame) {
-                        if (DEBUG) {
-                            System.out.println("Found exit via unguarded method call: " //$NON-NLS-1$
-                                    + node.toString(false));
-                        }
-                        return SEEN_RETURN;
-                    }
-                }
-            }
-        }
-
-        // if (node.instruction is a call, and the call is not caught by
-        // a try/catch block (provided the release is not inside the try/catch block)
-        // then return false
-        int status = 0;
-
-        boolean implicitReturn = true;
-        List<Node> successors = node.successors;
-        List<Node> exceptions = node.exceptions;
-        if (exceptions != null) {
-            if (!exceptions.isEmpty()) {
-                implicitReturn = false;
-            }
-            for (Node successor : exceptions) {
-                status = dfs(successor) | status;
-                if ((status & SEEN_RETURN) != 0) {
-                    if (DEBUG) {
-                        System.out.println("Found exit via exception: " //$NON-NLS-1$
-                                + node.toString(false));
-                    }
-                    return status;
-                }
-            }
-
-            if (status != 0) {
-                status |= SEEN_EXCEPTION;
-            }
-        }
-
-        if (successors != null) {
-            if (!successors.isEmpty()) {
-                implicitReturn = false;
-                if (successors.size() > 1) {
-                    status |= SEEN_BRANCH;
-                }
-            }
-            for (Node successor : successors) {
-                status = dfs(successor) | status;
-                if ((status & SEEN_RETURN) != 0) {
-                    if (DEBUG) {
-                        System.out.println("Found exit via branches: " //$NON-NLS-1$
-                                + node.toString(false));
-                    }
-                    return status;
-                }
-            }
-        }
-
-        if (implicitReturn) {
-            status |= SEEN_RETURN;
-            if (DEBUG) {
-                System.out.println("Found exit: via implicit return: " //$NON-NLS-1$
-                        + node.toString(false));
-            }
-        }
-
-        return status;
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongCallDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongCallDetector.java
deleted file mode 100644
index 174f915..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongCallDetector.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.tools.lint.checks.JavaPerformanceDetector.ON_DRAW;
-import static com.android.tools.lint.checks.JavaPerformanceDetector.ON_LAYOUT;
-import static com.android.tools.lint.checks.JavaPerformanceDetector.ON_MEASURE;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.ClassContext;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Detector.ClassScanner;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.MethodNode;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Checks for cases where the wrong call is being made
- */
-public class WrongCallDetector extends Detector implements ClassScanner {
-    /** Calling the wrong method */
-    public static final Issue ISSUE = Issue.create(
-            "WrongCall", //$NON-NLS-1$
-            "Finds cases where the wrong call is made, such as calling onMeasure instead of measure",
-
-            "Custom views typically need to call `measure()` on their children, not `onMeasure`. " +
-            "Ditto for onDraw, onLayout, etc.",
-
-            Category.CORRECTNESS,
-            6,
-            Severity.ERROR,
-            WrongCallDetector.class,
-            Scope.CLASS_FILE_SCOPE);
-
-    /** Constructs a new {@link WrongCallDetector} */
-    public WrongCallDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements ClassScanner ----
-
-    @Override
-    @Nullable
-    public List<String> getApplicableCallNames() {
-        return Arrays.asList(
-                ON_DRAW,
-                ON_MEASURE,
-                ON_LAYOUT
-        );
-    }
-
-    @Override
-    public void checkCall(@NonNull ClassContext context, @NonNull ClassNode classNode,
-            @NonNull MethodNode method, @NonNull MethodInsnNode call) {
-        String name = call.name;
-        // Call is only allowed if it is both only called on the super class (invoke special)
-        // as well as within the same overriding method (e.g. you can't call super.onLayout
-        // from the onMeasure method)
-        if (call.getOpcode() != Opcodes.INVOKESPECIAL || !name.equals(method.name)) {
-            String suggestion = Character.toLowerCase(name.charAt(2)) + name.substring(3);
-            String message = String.format(
-                  "Suspicious method call; should probably call \"%1$s\" rather than \"%2$s\"",
-                  suggestion, name);
-            context.report(ISSUE, method, call, context.getLocation(call), message, null);
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongCaseDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongCaseDetector.java
deleted file mode 100644
index d15af9a..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongCaseDetector.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Element;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-/**
- * Check which looks for missing wrong case usage for certain layout tags.
- *
- * @todo Generalize this to handling spelling errors in general.
- */
-public class WrongCaseDetector extends LayoutDetector {
-    /** Using the wrong case for layout tags */
-    public static final Issue WRONGCASE = Issue.create(
-            "WrongCase", //$NON-NLS-1$
-            "Ensures that the correct case is used for special layout tags such as <fragment>",
-
-            ""
-            + "Most layout tags, such as <Button>, refer to actual view classes and are therefore "
-            + "capitalized. However, there are exceptions such as <fragment> and <include>. This "
-            + "lint check looks for incorrect capitalizations.",
-
-            Category.CORRECTNESS,
-            8,
-            Severity.WARNING,
-            WrongCaseDetector.class,
-            Scope.RESOURCE_FILE_SCOPE)
-            .setMoreInfo("http://developer.android.com/guide/components/fragments.html"); //$NON-NLS-1$
-
-    /** Constructs a new {@link WrongCaseDetector} */
-    public WrongCaseDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(
-                "Fragment",      //$NON-NLS-1$
-                "RequestFocus",  //$NON-NLS-1$
-                "Include",       //$NON-NLS-1$
-                "Merge"
-        );
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        String tag = element.getTagName();
-        String correct = Character.toLowerCase(tag.charAt(0)) + tag.substring(1);
-        context.report(WRONGCASE, element, context.getLocation(element),
-                String.format("Invalid tag <%1$s>; should be <%2$s>", tag, correct), null);
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongIdDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongIdDetector.java
deleted file mode 100644
index e0e2d0a..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongIdDetector.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_TYPE;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.RELATIVE_LAYOUT;
-import static com.android.SdkConstants.TAG_ITEM;
-import static com.android.SdkConstants.VALUE_ID;
-import static com.android.tools.lint.detector.api.LintUtils.stripIdPrefix;
-
-import com.android.annotations.NonNull;
-import com.android.resources.ResourceFolderType;
-import com.android.tools.lint.client.api.IDomParser;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Context;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Location.Handle;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.android.utils.Pair;
-import com.google.common.base.Joiner;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Checks for duplicate ids within a layout and within an included layout
- */
-public class WrongIdDetector extends LayoutDetector {
-
-    /** Ids bound to widgets in any of the layout files */
-    private final Set<String> mGlobalIds = new HashSet<String>(100);
-
-    /** Ids bound to widgets in the current layout file */
-    private Set<String> mFileIds;
-
-    /** Ids declared in a value's file, e.g. {@code <item type="id" name="foo"/>} */
-    private Set<String> mDeclaredIds;
-
-    /**
-     * Location handles for the various id references that were not found as
-     * defined in the same layout, to be checked after the whole project has
-     * been scanned
-     */
-    private List<Pair<String, Location.Handle>> mHandles;
-
-    /** List of RelativeLayout elements in the current layout */
-    private List<Element> mRelativeLayouts;
-
-    /** Reference to an unknown id */
-    public static final Issue UNKNOWN_ID = Issue.create(
-            "UnknownId", //$NON-NLS-1$
-            "Checks for id references in RelativeLayouts that are not defined elsewhere",
-            "The `@+id/` syntax refers to an existing id, or creates a new one if it has " +
-            "not already been defined elsewhere. However, this means that if you have a " +
-            "typo in your reference, or if the referred view no longer exists, you do not " +
-            "get a warning since the id will be created on demand. This check catches " +
-            "errors where you have renamed an id without updating all of the references to " +
-            "it.",
-            Category.CORRECTNESS,
-            8,
-            Severity.FATAL,
-            WrongIdDetector.class,
-            Scope.ALL_RESOURCES_SCOPE);
-
-    /** Reference to an id that is not in the current layout */
-    public static final Issue UNKNOWN_ID_LAYOUT = Issue.create(
-            "UnknownIdInLayout", //$NON-NLS-1$
-            "Makes sure that @+id references refer to views in the same layout",
-
-            "The `@+id/` syntax refers to an existing id, or creates a new one if it has " +
-            "not already been defined elsewhere. However, this means that if you have a " +
-            "typo in your reference, or if the referred view no longer exists, you do not " +
-            "get a warning since the id will be created on demand.\n" +
-            "\n" +
-            "This is sometimes intentional, for example where you are referring to a view " +
-            "which is provided in a different layout via an include. However, it is usually " +
-            "an accident where you have a typo or you have renamed a view without updating " +
-            "all the references to it.",
-
-            Category.CORRECTNESS,
-            5,
-            Severity.WARNING,
-            WrongIdDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a duplicate id check */
-    public WrongIdDetector() {
-    }
-
-    @Override
-    public boolean appliesTo(@NonNull ResourceFolderType folderType) {
-        return folderType == ResourceFolderType.LAYOUT || folderType == ResourceFolderType.VALUES;
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public Collection<String> getApplicableAttributes() {
-        return Collections.singletonList(ATTR_ID);
-    }
-
-    @Override
-    public Collection<String> getApplicableElements() {
-        return Arrays.asList(RELATIVE_LAYOUT, TAG_ITEM);
-    }
-
-    @Override
-    public void beforeCheckFile(@NonNull Context context) {
-        mFileIds = new HashSet<String>();
-        mRelativeLayouts = null;
-    }
-
-    @Override
-    public void afterCheckFile(@NonNull Context context) {
-        if (mRelativeLayouts != null) {
-            if (!context.getProject().getReportIssues()) {
-                // If this is a library project not being analyzed, ignore it
-                return;
-            }
-
-            for (Element layout : mRelativeLayouts) {
-                NodeList children = layout.getChildNodes();
-                for (int j = 0, childCount = children.getLength(); j < childCount; j++) {
-                    Node child = children.item(j);
-                    if (child.getNodeType() != Node.ELEMENT_NODE) {
-                        continue;
-                    }
-                    Element element = (Element) child;
-                    NamedNodeMap attributes = element.getAttributes();
-                    for (int i = 0, n = attributes.getLength(); i < n; i++) {
-                        Attr attr = (Attr) attributes.item(i);
-                        String value = attr.getValue();
-                        if ((value.startsWith(NEW_ID_PREFIX) ||
-                                value.startsWith(ID_PREFIX))
-                                && ANDROID_URI.equals(attr.getNamespaceURI())
-                                && attr.getLocalName().startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)) {
-                            if (!idDefined(mFileIds, value)) {
-                                // Stash a reference to this id and location such that
-                                // we can check after the *whole* layout has been processed,
-                                // since it's too early to conclude here that the id does
-                                // not exist (you are allowed to have forward references)
-                                XmlContext xmlContext = (XmlContext) context;
-                                IDomParser parser = xmlContext.parser;
-                                Handle handle = parser.createLocationHandle(xmlContext, attr);
-                                handle.setClientData(attr);
-
-                                if (mHandles == null) {
-                                    mHandles = new ArrayList<Pair<String,Handle>>();
-                                }
-                                mHandles.add(Pair.of(value, handle));
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        mFileIds = null;
-    }
-
-    @Override
-    public void afterCheckProject(@NonNull Context context) {
-        if (mHandles != null) {
-            boolean checkSameLayout = context.isEnabled(UNKNOWN_ID_LAYOUT);
-            boolean checkExists = context.isEnabled(UNKNOWN_ID);
-            boolean projectScope = context.getScope().contains(Scope.ALL_RESOURCE_FILES);
-            for (Pair<String, Handle> pair : mHandles) {
-                String id = pair.getFirst();
-                boolean isBound = idDefined(mGlobalIds, id);
-                if (!isBound && checkExists && projectScope) {
-                    Handle handle = pair.getSecond();
-                    boolean isDeclared = idDefined(mDeclaredIds, id);
-                    id = stripIdPrefix(id);
-                    String suggestionMessage;
-                    List<String> suggestions = getSpellingSuggestions(id, mGlobalIds);
-                    if (suggestions.size() > 1) {
-                        suggestionMessage = String.format(" Did you mean one of {%2$s} ?",
-                                id, Joiner.on(", ").join(suggestions));
-                    } else if (!suggestions.isEmpty()) {
-                        suggestionMessage = String.format(" Did you mean %2$s ?",
-                                id, suggestions.get(0));
-                    } else {
-                        suggestionMessage = "";
-                    }
-                    String message;
-                    if (isDeclared) {
-                        message = String.format(
-                                "The id \"%1$s\" is defined but not assigned to any views.%2$s",
-                                id, suggestionMessage);
-                    } else {
-                        message = String.format(
-                                "The id \"%1$s\" is not defined anywhere.%2$s",
-                                id, suggestionMessage);
-                    }
-                    report(context, UNKNOWN_ID, handle, message);
-                } else if (checkSameLayout && (!projectScope || isBound)
-                        && id.startsWith(NEW_ID_PREFIX)) {
-                    // The id was defined, but in a different layout. Usually not intentional
-                    // (might be referring to a random other view that happens to have the same
-                    // name.)
-                    Handle handle = pair.getSecond();
-                    report(context, UNKNOWN_ID_LAYOUT, handle,
-                            String.format(
-                                    "The id \"%1$s\" is not referring to any views in this layout",
-                                    stripIdPrefix(id)));
-                }
-            }
-        }
-    }
-
-    private static void report(Context context, Issue issue, Handle handle, String message) {
-        Location location = handle.resolve();
-        Object clientData = handle.getClientData();
-        if (clientData instanceof Node) {
-            if (context.getDriver().isSuppressed(issue, (Node) clientData)) {
-                return;
-            }
-        }
-
-        context.report(issue, location, message, null);
-    }
-
-    @Override
-    public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
-        if (element.getTagName().equals(RELATIVE_LAYOUT)) {
-            if (mRelativeLayouts == null) {
-                mRelativeLayouts = new ArrayList<Element>();
-            }
-            mRelativeLayouts.add(element);
-        } else {
-            assert element.getTagName().equals(TAG_ITEM);
-            String type = element.getAttribute(ATTR_TYPE);
-            if (VALUE_ID.equals(type)) {
-                String name = element.getAttribute(ATTR_NAME);
-                if (!name.isEmpty()) {
-                    if (mDeclaredIds == null) {
-                        mDeclaredIds = Sets.newHashSet();
-                    }
-                    mDeclaredIds.add(ID_PREFIX + name);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void visitAttribute(@NonNull XmlContext context, @NonNull Attr attribute) {
-        assert attribute.getName().equals(ATTR_ID) || attribute.getLocalName().equals(ATTR_ID);
-        String id = attribute.getValue();
-        mFileIds.add(id);
-        mGlobalIds.add(id);
-    }
-
-    private static boolean idDefined(Set<String> ids, String id) {
-        if (ids == null) {
-            return false;
-        }
-        boolean definedLocally = ids.contains(id);
-        if (!definedLocally) {
-            if (id.startsWith(NEW_ID_PREFIX)) {
-                definedLocally = ids.contains(ID_PREFIX +
-                        id.substring(NEW_ID_PREFIX.length()));
-            } else if (id.startsWith(ID_PREFIX)) {
-                definedLocally = ids.contains(NEW_ID_PREFIX +
-                        id.substring(ID_PREFIX.length()));
-            }
-        }
-
-        return definedLocally;
-    }
-
-    private static List<String> getSpellingSuggestions(String id, Collection<String> ids) {
-        int maxDistance = id.length() >= 4 ? 2 : 1;
-
-        // Look for typos and try to match with custom views and android views
-        Multimap<Integer, String> matches = ArrayListMultimap.create(2, 10);
-        int count = 0;
-        if (!ids.isEmpty()) {
-            for (String matchWith : ids) {
-                matchWith = stripIdPrefix(matchWith);
-                if (Math.abs(id.length() - matchWith.length()) > maxDistance) {
-                    // The string lengths differ more than the allowed edit distance;
-                    // no point in even attempting to compute the edit distance (requires
-                    // O(n*m) storage and O(n*m) speed, where n and m are the string lengths)
-                    continue;
-                }
-                int distance = LintUtils.editDistance(id, matchWith);
-                if (distance <= maxDistance) {
-                    matches.put(distance, matchWith);
-                }
-
-                if (count++ > 100) {
-                    // Make sure that for huge projects we don't completely grind to a halt
-                    break;
-                }
-            }
-        }
-
-        for (int i = 0; i < maxDistance; i++) {
-            Collection<String> strings = matches.get(i);
-            if (strings != null && !strings.isEmpty()) {
-                List<String> suggestions = new ArrayList<String>(strings);
-                Collections.sort(suggestions);
-                return suggestions;
-            }
-        }
-
-        return Collections.emptyList();
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongImportDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongImportDetector.java
deleted file mode 100644
index 64f3ce1..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongImportDetector.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Detector;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.JavaContext;
-import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-
-import java.util.Collections;
-import java.util.List;
-
-import lombok.ast.AstVisitor;
-import lombok.ast.ForwardingAstVisitor;
-import lombok.ast.ImportDeclaration;
-import lombok.ast.Node;
-
-/**
- * Checks for "import android.R", which seems to be a common source of confusion
- * (see for example http://stackoverflow.com/questions/885009/r-cannot-be-resolved-android-error
- * and many other forums).
- * <p>
- * The root cause is probably this (from http://source.android.com/source/using-eclipse.html) :
- * <blockquote> Note: Eclipse sometimes likes to add an import android.R
- * statement at the top of your files that use resources, especially when you
- * ask eclipse to sort or otherwise manage imports. This will cause your make to
- * break. Look out for these erroneous import statements and delete them.
- * </blockquote>
- */
-public class WrongImportDetector extends Detector implements Detector.JavaScanner {
-    /** Is android.R being imported? */
-    public static final Issue ISSUE = Issue.create("SuspiciousImport", //$NON-NLS-1$
-            "Checks for 'import android.R' statements, which are usually accidental",
-            "Importing `android.R` is usually not intentional; it sometimes happens when " +
-            "you use an IDE and ask it to automatically add imports at a time when your " +
-            "project's R class it not present.\n" +
-            "\n" +
-            "Once the import is there you might get a lot of \"confusing\" error messages " +
-            "because of course the fields available on `android.R` are not the ones you'd " +
-            "expect from just looking at your own `R` class.",
-            Category.CORRECTNESS,
-            9,
-            Severity.WARNING,
-            WrongImportDetector.class,
-            Scope.JAVA_FILE_SCOPE);
-
-    /** Constructs a new {@link WrongImportDetector} check */
-    public WrongImportDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    // ---- Implements Detector.JavaScanner ----
-
-    @Override
-    public List<Class<? extends Node>> getApplicableNodeTypes() {
-        return Collections.<Class<? extends Node>> singletonList(
-                ImportDeclaration.class);
-    }
-
-    @Override
-    public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
-        return new ImportVisitor(context);
-    }
-
-    private static class ImportVisitor extends ForwardingAstVisitor {
-        private final JavaContext mContext;
-
-        public ImportVisitor(JavaContext context) {
-            super();
-            mContext = context;
-        }
-
-        @Override
-        public boolean visitImportDeclaration(ImportDeclaration node) {
-            String fqn = node.asFullyQualifiedName();
-            if (fqn.equals("android.R")) { //$NON-NLS-1$
-                Location location = mContext.getLocation(node);
-                mContext.report(ISSUE, node, location,
-                    "Don't include android.R here; use a fully qualified name for "
-                            + "each usage instead", null);
-            }
-            return false;
-        }
-    }
-}
diff --git a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongLocationDetector.java b/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongLocationDetector.java
deleted file mode 100644
index 37ffbeb..0000000
--- a/lint/libs/lint_checks/src/main/java/com/android/tools/lint/checks/WrongLocationDetector.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.tools.lint.checks;
-
-import static com.android.SdkConstants.TAG_RESOURCES;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.LayoutDetector;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.Speed;
-import com.android.tools.lint.detector.api.XmlContext;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/** Looks for problems with XML files being placed in the wrong folder */
-public class WrongLocationDetector extends LayoutDetector {
-    /** Main issue investigated by this detector */
-    public static final Issue ISSUE = Issue.create(
-            "WrongFolder", //$NON-NLS-1$
-
-            "Finds resource files that are placed in the wrong folders",
-
-            "Resource files are sometimes placed in the wrong folder, and it can lead to " +
-            "subtle bugs that are hard to understand. This check looks for problems in this " +
-            "area, such as attempting to place a layout \"alias\" file in a `layout/` folder " +
-            "rather than the `values/` folder where it belongs.",
-            Category.CORRECTNESS,
-            8,
-            Severity.ERROR,
-            WrongLocationDetector.class,
-            Scope.RESOURCE_FILE_SCOPE);
-
-    /** Constructs a new {@link WrongLocationDetector} check */
-    public WrongLocationDetector() {
-    }
-
-    @NonNull
-    @Override
-    public Speed getSpeed() {
-        return Speed.FAST;
-    }
-
-    @Override
-    public void visitDocument(@NonNull XmlContext context, @NonNull Document document) {
-        Element root = document.getDocumentElement();
-        if (root != null && root.getTagName().equals(TAG_RESOURCES)) {
-            context.report(ISSUE, root, context.getLocation(root),
-                    "This file should be placed in a values/ folder, not a layout/ folder", null);
-        }
-    }
-}
diff --git a/manifmerger/Android.mk b/manifmerger/Android.mk
index b1f1ac7..b07af36 100644
--- a/manifmerger/Android.mk
+++ b/manifmerger/Android.mk
@@ -16,7 +16,7 @@
 include $(CLEAR_VARS)
 
 # The manifest-merger code has moved to tools/base/manifmerger.
-# The rule below uses the prebuilt manifmerger.jar if found.
+# The rule below uses the prebuilt manifmerger.jar.
 #
 # If you want to run the tests, cd to tools/base/manifmerger
 # and run ./gradlew :manifmerger:test
@@ -26,7 +26,7 @@
 LOCAL_JAVA_LIBRARIES := common sdklib
 
 LOCAL_PREBUILT_JAVA_LIBRARIES := \
-	../../prebuilts/devtools/$(LOCAL_MODULE)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
+	../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
 
 include $(BUILD_HOST_PREBUILT)
 
diff --git a/sdk_common/.classpath b/sdk_common/.classpath
index 1afd216..e5bbc54 100644
--- a/sdk_common/.classpath
+++ b/sdk_common/.classpath
@@ -6,6 +6,6 @@
 	<classpathentry kind="var" path="ANDROID_SRC/prebuilts/misc/common/kxml2/kxml2-2.3.0.jar" sourcepath="/ANDROID_SRC/dalvik/libcore/xml/src/main/java"/>
 	<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/guava-tools/guava-13.0.1.jar" sourcepath="/ANDROID_SRC/prebuilts/tools/common/guava-tools/src.zip"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/common"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/SdkLib"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/sdklib"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/sdk_common/Android.mk b/sdk_common/Android.mk
index 51c5919..17c78cb 100644
--- a/sdk_common/Android.mk
+++ b/sdk_common/Android.mk
@@ -16,7 +16,11 @@
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
+# The sdk_common code has moved to tools/base/sdk_common.
+# The rule below uses the prebuilt sdk_common.jar.
+#
+# If you want to run the tests, cd to tools/base/sdk_common
+# and run ./gradlew :sdk_common:test
 
 LOCAL_JAVA_LIBRARIES := \
 	layoutlib_api \
@@ -26,7 +30,10 @@
 	sdklib
 
 LOCAL_MODULE := sdk_common
-
 LOCAL_MODULE_TAGS := optional
 
-include $(BUILD_HOST_JAVA_LIBRARY)
+LOCAL_PREBUILT_JAVA_LIBRARIES := \
+	../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
+
+include $(BUILD_HOST_PREBUILT)
+
diff --git a/sdk_common/src/com/android/ide/common/rendering/HardwareConfigHelper.java b/sdk_common/src/com/android/ide/common/rendering/HardwareConfigHelper.java
deleted file mode 100644
index afca8fe..0000000
--- a/sdk_common/src/com/android/ide/common/rendering/HardwareConfigHelper.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.rendering.api.HardwareConfig;
-import com.android.resources.ScreenOrientation;
-import com.android.sdklib.devices.ButtonType;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.Screen;
-
-/**
- * Helper method to create a {@link HardwareConfig} object.
- *
- * The base data comes from a {@link Device} object, with additional data provided on the helper
- * object.
- *
- * Since {@link HardwareConfig} is immutable, this allows creating one in several (optional)
- * steps more easily.
- *
- */
-public class HardwareConfigHelper {
-
-    private final @NonNull Device mDevice;
-    private @NonNull ScreenOrientation mScreenOrientation = ScreenOrientation.PORTRAIT;
-
-    // optional
-    private int mMaxRenderWidth = -1;
-    private int mMaxRenderHeight = -1;
-    private int mOverrideRenderWidth = -1;
-    private int mOverrideRenderHeight = -1;
-
-    /**
-     * Creates a new helper for a given device.
-     * @param device the device to provide the base data.
-     */
-    public HardwareConfigHelper(@NonNull Device device) {
-        mDevice = device;
-    }
-
-    /**
-     * Sets the orientation of the config.
-     * @param screenOrientation the orientation.
-     * @return this (such that chains of setters can be stringed together)
-     */
-    @NonNull
-    public HardwareConfigHelper setOrientation(@NonNull ScreenOrientation screenOrientation) {
-        mScreenOrientation = screenOrientation;
-        return this;
-    }
-
-    /**
-     * Overrides the width and height to be used during rendering.
-     *
-     * A value of -1 will make the rendering use the normal width and height coming from the
-     * {@link Device} object.
-     *
-     * @param overrideRenderWidth the width in pixels of the layout to be rendered
-     * @param overrideRenderHeight the height in pixels of the layout to be rendered
-     * @return this (such that chains of setters can be stringed together)
-     */
-    @NonNull
-    public HardwareConfigHelper setOverrideRenderSize(int overrideRenderWidth,
-            int overrideRenderHeight) {
-        mOverrideRenderWidth = overrideRenderWidth;
-        mOverrideRenderHeight = overrideRenderHeight;
-        return this;
-    }
-
-    /**
-     * Sets the max width and height to be used during rendering.
-     *
-     * A value of -1 will make the rendering use the normal width and height coming from the
-     * {@link Device} object.
-     *
-     * @param maxRenderWidth the max width in pixels of the layout to be rendered
-     * @param maxRenderHeight the max height in pixels of the layout to be rendered
-     * @return this (such that chains of setters can be stringed together)
-     */
-    @NonNull
-    public HardwareConfigHelper setMaxRenderSize(int maxRenderWidth, int maxRenderHeight) {
-        mMaxRenderWidth = maxRenderWidth;
-        mMaxRenderHeight = maxRenderHeight;
-        return this;
-    }
-
-    /**
-     * Creates and returns the HardwareConfig object.
-     * @return the config
-     */
-    @NonNull
-    public HardwareConfig getConfig() {
-        Screen screen = mDevice.getDefaultHardware().getScreen();
-
-        // compute width and height to take orientation into account.
-        int x = screen.getXDimension();
-        int y = screen.getYDimension();
-        int width, height;
-
-        if (x > y) {
-            if (mScreenOrientation == ScreenOrientation.LANDSCAPE) {
-                width = x;
-                height = y;
-            } else {
-                width = y;
-                height = x;
-            }
-        } else {
-            if (mScreenOrientation == ScreenOrientation.LANDSCAPE) {
-                width = y;
-                height = x;
-            } else {
-                width = x;
-                height = y;
-            }
-        }
-
-        if (mOverrideRenderHeight != -1) {
-            width = mOverrideRenderWidth;
-        }
-
-        if (mOverrideRenderHeight != -1) {
-            height = mOverrideRenderHeight;
-        }
-
-        if (mMaxRenderWidth != -1) {
-            width = mMaxRenderWidth;
-        }
-
-        if (mMaxRenderHeight != -1) {
-            height = mMaxRenderHeight;
-        }
-
-        return new HardwareConfig(
-                width,
-                height,
-                screen.getPixelDensity(),
-                (float) screen.getXdpi(),
-                (float) screen.getYdpi(),
-                screen.getSize(),
-                mScreenOrientation,
-                mDevice.getDefaultHardware().getButtonType() == ButtonType.SOFT);
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/rendering/LayoutLibrary.java b/sdk_common/src/com/android/ide/common/rendering/LayoutLibrary.java
deleted file mode 100644
index 0a353f9..0000000
--- a/sdk_common/src/com/android/ide/common/rendering/LayoutLibrary.java
+++ /dev/null
@@ -1,755 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering;
-
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_REFLECTION;
-
-import com.android.ide.common.rendering.api.Bridge;
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.common.rendering.api.DrawableParams;
-import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.rendering.api.RenderSession;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.rendering.api.Result;
-import com.android.ide.common.rendering.api.Result.Status;
-import com.android.ide.common.rendering.api.SessionParams;
-import com.android.ide.common.rendering.api.SessionParams.RenderingMode;
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.ide.common.rendering.legacy.ILegacyPullParser;
-import com.android.ide.common.rendering.legacy.LegacyCallback;
-import com.android.ide.common.resources.ResourceResolver;
-import com.android.ide.common.sdk.LoadStatus;
-import com.android.layoutlib.api.ILayoutBridge;
-import com.android.layoutlib.api.ILayoutLog;
-import com.android.layoutlib.api.ILayoutResult;
-import com.android.layoutlib.api.ILayoutResult.ILayoutViewInfo;
-import com.android.layoutlib.api.IProjectCallback;
-import com.android.layoutlib.api.IResourceValue;
-import com.android.layoutlib.api.IXmlPullParser;
-import com.android.resources.ResourceType;
-import com.android.utils.ILogger;
-
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.net.URI;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * Class to use the Layout library.
- * <p/>
- * Use {@link #load(String, ILogger)} to load the jar file.
- * <p/>
- * Use the layout library with:
- * {@link #init(String, Map)}, {@link #supports(Capability)}, {@link #createSession(SessionParams)},
- * {@link #dispose()}, {@link #clearCaches(Object)}.
- *
- * <p/>
- * For client wanting to access both new and old (pre API level 5) layout libraries, it is
- * important that the following interfaces be used:<br>
- * {@link ILegacyPullParser} instead of {@link ILayoutPullParser}<br>
- * {@link LegacyCallback} instead of {@link com.android.ide.common.rendering.api.IProjectCallback}.
- * <p/>
- * These interfaces will ensure that both new and older Layout libraries can be accessed.
- */
-@SuppressWarnings("deprecation")
-public class LayoutLibrary {
-
-    public final static String CLASS_BRIDGE = "com.android.layoutlib.bridge.Bridge"; //$NON-NLS-1$
-
-    /** Link to the layout bridge */
-    private final Bridge mBridge;
-    /** Link to a ILayoutBridge in case loaded an older library */
-    private final ILayoutBridge mLegacyBridge;
-    /** Status of the layoutlib.jar loading */
-    private final LoadStatus mStatus;
-    /** Message associated with the {@link LoadStatus}. This is mostly used when
-     * {@link #getStatus()} returns {@link LoadStatus#FAILED}.
-     */
-    private final String mLoadMessage;
-    /** classloader used to load the jar file */
-    private final ClassLoader mClassLoader;
-
-    // Reflection data for older Layout Libraries.
-    private Method mViewGetParentMethod;
-    private Method mViewGetBaselineMethod;
-    private Method mViewParentIndexOfChildMethod;
-    private Class<?> mMarginLayoutParamClass;
-    private Field mLeftMarginField;
-    private Field mTopMarginField;
-    private Field mRightMarginField;
-    private Field mBottomMarginField;
-
-    /**
-     * Returns the {@link LoadStatus} of the loading of the layoutlib jar file.
-     */
-    public LoadStatus getStatus() {
-        return mStatus;
-    }
-
-    /** Returns the message associated with the {@link LoadStatus}. This is mostly used when
-     * {@link #getStatus()} returns {@link LoadStatus#FAILED}.
-     */
-    public String getLoadMessage() {
-        return mLoadMessage;
-    }
-
-    /**
-     * Returns the classloader used to load the classes in the layoutlib jar file.
-     */
-    public ClassLoader getClassLoader() {
-        return mClassLoader;
-    }
-
-    /**
-     * Loads the layoutlib.jar file located at the given path and returns a {@link LayoutLibrary}
-     * object representing the result.
-     * <p/>
-     * If loading failed {@link #getStatus()} will reflect this, and {@link #getBridge()} will
-     * return null.
-     *
-     * @param layoutLibJarOsPath the path of the jar file
-     * @param log an optional log file.
-     * @return a {@link LayoutLibrary} object always.
-     */
-    public static LayoutLibrary load(String layoutLibJarOsPath, ILogger log, String toolName) {
-
-        LoadStatus status = LoadStatus.LOADING;
-        String message = null;
-        Bridge bridge = null;
-        ILayoutBridge legacyBridge = null;
-        ClassLoader classLoader = null;
-
-        try {
-            // get the URL for the file.
-            File f = new File(layoutLibJarOsPath);
-            if (f.isFile() == false) {
-                if (log != null) {
-                    log.error(null, "layoutlib.jar is missing!"); //$NON-NLS-1$
-                }
-            } else {
-                URI uri = f.toURI();
-                URL url = uri.toURL();
-
-                // create a class loader. Because this jar reference interfaces
-                // that are in the editors plugin, it's important to provide
-                // a parent class loader.
-                classLoader = new URLClassLoader(
-                        new URL[] { url },
-                        LayoutLibrary.class.getClassLoader());
-
-                // load the class
-                Class<?> clazz = classLoader.loadClass(CLASS_BRIDGE);
-                if (clazz != null) {
-                    // instantiate an object of the class.
-                    Constructor<?> constructor = clazz.getConstructor();
-                    if (constructor != null) {
-                        Object bridgeObject = constructor.newInstance();
-                        if (bridgeObject instanceof Bridge) {
-                            bridge = (Bridge)bridgeObject;
-                        } else if (bridgeObject instanceof ILayoutBridge) {
-                            legacyBridge = (ILayoutBridge) bridgeObject;
-                        }
-                    }
-                }
-
-                if (bridge == null && legacyBridge == null) {
-                    status = LoadStatus.FAILED;
-                    message = "Failed to load " + CLASS_BRIDGE; //$NON-NLS-1$
-                    if (log != null) {
-                        log.error(null,
-                                "Failed to load " + //$NON-NLS-1$
-                                CLASS_BRIDGE +
-                                " from " +          //$NON-NLS-1$
-                                layoutLibJarOsPath);
-                    }
-                } else {
-                    // mark the lib as loaded, unless it's overridden below.
-                    status = LoadStatus.LOADED;
-
-                    // check the API, only if it's not a legacy bridge
-                    if (bridge != null) {
-                        int api = bridge.getApiLevel();
-                        if (api > Bridge.API_CURRENT) {
-                            status = LoadStatus.FAILED;
-                            message = String.format(
-                                    "This version of the rendering library is more recent than your version of %1$s. Please update %1$s", toolName);
-                        }
-                    }
-                }
-            }
-        } catch (Throwable t) {
-            status = LoadStatus.FAILED;
-            Throwable cause = t;
-            while (cause.getCause() != null) {
-                cause = cause.getCause();
-            }
-            message = "Failed to load the LayoutLib: " + cause.getMessage();
-            // log the error.
-            if (log != null) {
-                log.error(t, message);
-            }
-        }
-
-        return new LayoutLibrary(bridge, legacyBridge, classLoader, status, message);
-    }
-
-    // ------ Layout Lib API proxy
-
-    /**
-     * Returns the API level of the layout library.
-     */
-    public int getApiLevel() {
-        if (mBridge != null) {
-            return mBridge.getApiLevel();
-        }
-
-        if (mLegacyBridge != null) {
-            return getLegacyApiLevel();
-        }
-
-        return 0;
-    }
-
-    /**
-     * Returns the revision of the library inside a given (layoutlib) API level.
-     * The true version number of the library is {@link #getApiLevel()}.{@link #getRevision()}
-     */
-    public int getRevision() {
-        if (mBridge != null) {
-            return mBridge.getRevision();
-        }
-
-        return 0;
-    }
-
-    /**
-     * Returns whether the LayoutLibrary supports a given {@link Capability}.
-     * @return true if it supports it.
-     *
-     * @see Bridge#getCapabilities()
-     *
-     */
-    public boolean supports(Capability capability) {
-        if (mBridge != null) {
-            return mBridge.getCapabilities().contains(capability);
-        }
-
-        if (mLegacyBridge != null) {
-            switch (capability) {
-                case UNBOUND_RENDERING:
-                    // legacy stops at 4. 5 is new API.
-                    return getLegacyApiLevel() == 4;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Initializes the Layout Library object. This must be called before any other action is taken
-     * on the instance.
-     *
-     * @param platformProperties The build properties for the platform.
-     * @param fontLocation the location of the fonts in the SDK target.
-     * @param enumValueMap map attrName => { map enumFlagName => Integer value }. This is typically
-     *          read from attrs.xml in the SDK target.
-     * @param log a {@link LayoutLog} object. Can be null.
-     * @return true if success.
-     *
-     * @see Bridge#init(String, Map)
-     */
-    public boolean init(Map<String, String> platformProperties,
-            File fontLocation,
-            Map<String, Map<String, Integer>> enumValueMap,
-            LayoutLog log) {
-        if (mBridge != null) {
-            return mBridge.init(platformProperties, fontLocation, enumValueMap, log);
-        } else if (mLegacyBridge != null) {
-            return mLegacyBridge.init(fontLocation.getAbsolutePath(), enumValueMap);
-        }
-
-        return false;
-    }
-
-    /**
-     * Prepares the layoutlib to unloaded.
-     *
-     * @see Bridge#dispose()
-     */
-    public boolean dispose() {
-        if (mBridge != null) {
-            return mBridge.dispose();
-        }
-
-        return true;
-    }
-
-    /**
-     * Starts a layout session by inflating and rendering it. The method returns a
-     * {@link RenderSession} on which further actions can be taken.
-     * <p/>
-     * Before taking further actions on the scene, it is recommended to use
-     * {@link #supports(Capability)} to check what the scene can do.
-     *
-     * @return a new {@link ILayoutScene} object that contains the result of the scene creation and
-     * first rendering or null if {@link #getStatus()} doesn't return {@link LoadStatus#LOADED}.
-     *
-     * @see Bridge#createSession(SessionParams)
-     */
-    public RenderSession createSession(SessionParams params) {
-        if (mBridge != null) {
-            RenderSession session = mBridge.createSession(params);
-            if (params.getExtendedViewInfoMode() &&
-                    mBridge.getCapabilities().contains(Capability.EXTENDED_VIEWINFO) == false) {
-                // Extended view info was requested but the layoutlib does not support it.
-                // Add it manually.
-                List<ViewInfo> infoList = session.getRootViews();
-                if (infoList != null) {
-                    for (ViewInfo info : infoList) {
-                        addExtendedViewInfo(info);
-                    }
-                }
-            }
-
-            return session;
-        } else if (mLegacyBridge != null) {
-            return createLegacySession(params);
-        }
-
-        return null;
-    }
-
-    /**
-     * Renders a Drawable. If the rendering is successful, the result image is accessible through
-     * {@link Result#getData()}. It is of type {@link BufferedImage}
-     * @param params the rendering parameters.
-     * @return the result of the action.
-     */
-    public Result renderDrawable(DrawableParams params) {
-        if (mBridge != null) {
-            return mBridge.renderDrawable(params);
-        }
-
-        return Status.NOT_IMPLEMENTED.createResult();
-    }
-
-    /**
-     * Clears the resource cache for a specific project.
-     * <p/>This cache contains bitmaps and nine patches that are loaded from the disk and reused
-     * until this method is called.
-     * <p/>The cache is not configuration dependent and should only be cleared when a
-     * resource changes (at this time only bitmaps and 9 patches go into the cache).
-     *
-     * @param projectKey the key for the project.
-     *
-     * @see Bridge#clearCaches(Object)
-     */
-    public void clearCaches(Object projectKey) {
-        if (mBridge != null) {
-            mBridge.clearCaches(projectKey);
-        } else if (mLegacyBridge != null) {
-            mLegacyBridge.clearCaches(projectKey);
-        }
-    }
-
-    /**
-     * Utility method returning the parent of a given view object.
-     *
-     * @param viewObject the object for which to return the parent.
-     *
-     * @return a {@link Result} indicating the status of the action, and if success, the parent
-     *      object in {@link Result#getData()}
-     */
-    public Result getViewParent(Object viewObject) {
-        if (mBridge != null) {
-            Result r = mBridge.getViewParent(viewObject);
-            if (r.isSuccess()) {
-                return r;
-            }
-        }
-
-        return getViewParentWithReflection(viewObject);
-    }
-
-    /**
-     * Utility method returning the index of a given view in its parent.
-     * @param viewObject the object for which to return the index.
-     *
-     * @return a {@link Result} indicating the status of the action, and if success, the index in
-     *      the parent in {@link Result#getData()}
-     */
-    public Result getViewIndex(Object viewObject) {
-        if (mBridge != null) {
-            Result r = mBridge.getViewIndex(viewObject);
-            if (r.isSuccess()) {
-                return r;
-            }
-        }
-
-        return getViewIndexReflection(viewObject);
-    }
-
-    // ------ Implementation
-
-    private LayoutLibrary(Bridge bridge, ILayoutBridge legacyBridge, ClassLoader classLoader,
-            LoadStatus status, String message) {
-        mBridge = bridge;
-        mLegacyBridge = legacyBridge;
-        mClassLoader = classLoader;
-        mStatus = status;
-        mLoadMessage = message;
-    }
-
-    /**
-     * Returns the API level of the legacy bridge.
-     * <p/>
-     * This handles the case where ILayoutBridge does not have a {@link ILayoutBridge#getApiLevel()}
-     * (at API level 1).
-     * <p/>
-     * {@link ILayoutBridge#getApiLevel()} should never called directly.
-     *
-     * @return the api level of {@link #mLegacyBridge}.
-     */
-    private int getLegacyApiLevel() {
-        int apiLevel = 1;
-        try {
-            apiLevel = mLegacyBridge.getApiLevel();
-        } catch (AbstractMethodError e) {
-            // the first version of the api did not have this method
-            // so this is 1
-        }
-
-        return apiLevel;
-    }
-
-    private RenderSession createLegacySession(SessionParams params) {
-        if (params.getLayoutDescription() instanceof IXmlPullParser == false) {
-            throw new IllegalArgumentException("Parser must be of type ILegacyPullParser");
-        }
-        if (params.getProjectCallback() instanceof
-                com.android.layoutlib.api.IProjectCallback == false) {
-            throw new IllegalArgumentException("Project callback must be of type ILegacyCallback");
-        }
-
-        if (params.getResources() instanceof ResourceResolver == false) {
-            throw new IllegalArgumentException("RenderResources object must be of type ResourceResolver");
-        }
-
-        ResourceResolver resources = (ResourceResolver) params.getResources();
-
-        int apiLevel = getLegacyApiLevel();
-
-        // create a log wrapper since the older api requires a ILayoutLog
-        final LayoutLog log = params.getLog();
-        ILayoutLog logWrapper = new ILayoutLog() {
-
-            @Override
-            public void warning(String message) {
-                log.warning(null, message, null /*data*/);
-            }
-
-            @Override
-            public void error(Throwable t) {
-                log.error(null, "error!", t, null /*data*/);
-            }
-
-            @Override
-            public void error(String message) {
-                log.error(null, message, null /*data*/);
-            }
-        };
-
-
-        // convert the map of ResourceValue into IResourceValue. Super ugly but works.
-
-        Map<String, Map<String, IResourceValue>> projectMap = convertMap(
-                resources.getProjectResources());
-        Map<String, Map<String, IResourceValue>> frameworkMap = convertMap(
-                resources.getFrameworkResources());
-
-        ILayoutResult result = null;
-
-        if (apiLevel == 4) {
-            // Final ILayoutBridge API added support for "render full height"
-            result = mLegacyBridge.computeLayout(
-                    (IXmlPullParser) params.getLayoutDescription(),
-                    params.getProjectKey(),
-                    params.getScreenWidth(), params.getScreenHeight(),
-                    params.getRenderingMode() == RenderingMode.FULL_EXPAND ? true : false,
-                    params.getDensity().getDpiValue(), params.getXdpi(), params.getYdpi(),
-                    resources.getThemeName(), resources.isProjectTheme(),
-                    projectMap, frameworkMap,
-                    (IProjectCallback) params.getProjectCallback(),
-                    logWrapper);
-        } else if (apiLevel == 3) {
-            // api 3 add density support.
-            result = mLegacyBridge.computeLayout(
-                    (IXmlPullParser) params.getLayoutDescription(), params.getProjectKey(),
-                    params.getScreenWidth(), params.getScreenHeight(),
-                    params.getDensity().getDpiValue(), params.getXdpi(), params.getYdpi(),
-                    resources.getThemeName(), resources.isProjectTheme(),
-                    projectMap, frameworkMap,
-                    (IProjectCallback) params.getProjectCallback(), logWrapper);
-        } else if (apiLevel == 2) {
-            // api 2 added boolean for separation of project/framework theme
-            result = mLegacyBridge.computeLayout(
-                    (IXmlPullParser) params.getLayoutDescription(), params.getProjectKey(),
-                    params.getScreenWidth(), params.getScreenHeight(),
-                    resources.getThemeName(), resources.isProjectTheme(),
-                    projectMap, frameworkMap,
-                    (IProjectCallback) params.getProjectCallback(), logWrapper);
-        } else {
-            // First api with no density/dpi, and project theme boolean mixed
-            // into the theme name.
-
-            // change the string if it's a custom theme to make sure we can
-            // differentiate them
-            String themeName = resources.getThemeName();
-            if (resources.isProjectTheme()) {
-                themeName = "*" + themeName; //$NON-NLS-1$
-            }
-
-            result = mLegacyBridge.computeLayout(
-                    (IXmlPullParser) params.getLayoutDescription(), params.getProjectKey(),
-                    params.getScreenWidth(), params.getScreenHeight(),
-                    themeName,
-                    projectMap, frameworkMap,
-                    (IProjectCallback) params.getProjectCallback(), logWrapper);
-        }
-
-        // clean up that is not done by the ILayoutBridge itself
-        legacyCleanUp();
-
-        return convertToScene(result);
-    }
-
-    @SuppressWarnings("unchecked")
-    private Map<String, Map<String, IResourceValue>> convertMap(
-            Map<ResourceType, Map<String, ResourceValue>> map) {
-        Map<String, Map<String, IResourceValue>> result =
-            new HashMap<String, Map<String, IResourceValue>>();
-
-        for (Entry<ResourceType, Map<String, ResourceValue>> entry : map.entrySet()) {
-            // ugly case but works.
-            result.put(entry.getKey().getName(),
-                    (Map) entry.getValue());
-        }
-
-        return result;
-    }
-
-    /**
-     * Converts a {@link ILayoutResult} to a {@link RenderSession}.
-     */
-    private RenderSession convertToScene(ILayoutResult result) {
-
-        Result sceneResult;
-        ViewInfo rootViewInfo = null;
-
-        if (result.getSuccess() == ILayoutResult.SUCCESS) {
-            sceneResult = Status.SUCCESS.createResult();
-            ILayoutViewInfo oldRootView = result.getRootView();
-            if (oldRootView != null) {
-                rootViewInfo = convertToViewInfo(oldRootView);
-            }
-        } else {
-            sceneResult = Status.ERROR_UNKNOWN.createResult(result.getErrorMessage());
-        }
-
-        // create a BasicLayoutScene. This will return the given values but return the default
-        // implementation for all method.
-        // ADT should gracefully handle the default implementations of LayoutScene
-        return new StaticRenderSession(sceneResult, rootViewInfo, result.getImage());
-    }
-
-    /**
-     * Converts a {@link ILayoutViewInfo} (and its children) to a {@link ViewInfo}.
-     */
-    private ViewInfo convertToViewInfo(ILayoutViewInfo view) {
-        // create the view info.
-        ViewInfo viewInfo = new ViewInfo(view.getName(), view.getViewKey(),
-                view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
-
-        // then convert the children
-        ILayoutViewInfo[] children = view.getChildren();
-        if (children != null) {
-            ArrayList<ViewInfo> convertedChildren = new ArrayList<ViewInfo>(children.length);
-            for (ILayoutViewInfo child : children) {
-                convertedChildren.add(convertToViewInfo(child));
-            }
-            viewInfo.setChildren(convertedChildren);
-        }
-
-        return viewInfo;
-    }
-
-    /**
-     * Post rendering clean-up that must be done here because it's not done in any layoutlib using
-     * {@link ILayoutBridge}.
-     */
-    private void legacyCleanUp() {
-        try {
-            Class<?> looperClass = mClassLoader.loadClass("android.os.Looper"); //$NON-NLS-1$
-            Field threadLocalField = looperClass.getField("sThreadLocal"); //$NON-NLS-1$
-            if (threadLocalField != null) {
-                threadLocalField.setAccessible(true);
-                // get object. Field is static so no need to pass an object
-                ThreadLocal<?> threadLocal = (ThreadLocal<?>) threadLocalField.get(null);
-                if (threadLocal != null) {
-                    threadLocal.remove();
-                }
-            }
-        } catch (Exception e) {
-            // do nothing.
-        }
-    }
-
-    private Result getViewParentWithReflection(Object viewObject) {
-        // default implementation using reflection.
-        try {
-            if (mViewGetParentMethod == null) {
-                Class<?> viewClass = Class.forName("android.view.View");
-                mViewGetParentMethod = viewClass.getMethod("getParent");
-            }
-
-            return Status.SUCCESS.createResult(mViewGetParentMethod.invoke(viewObject));
-        } catch (Exception e) {
-            // Catch all for the reflection calls.
-            return ERROR_REFLECTION.createResult(null, e);
-        }
-    }
-
-    /**
-     * Utility method returning the index of a given view in its parent.
-     * @param viewObject the object for which to return the index.
-     *
-     * @return a {@link Result} indicating the status of the action, and if success, the index in
-     *      the parent in {@link Result#getData()}
-     */
-    private Result getViewIndexReflection(Object viewObject) {
-        // default implementation using reflection.
-        try {
-            Class<?> viewClass = Class.forName("android.view.View");
-
-            if (mViewGetParentMethod == null) {
-                mViewGetParentMethod = viewClass.getMethod("getParent");
-            }
-
-            Object parentObject = mViewGetParentMethod.invoke(viewObject);
-
-            if (mViewParentIndexOfChildMethod == null) {
-                Class<?> viewParentClass = Class.forName("android.view.ViewParent");
-                mViewParentIndexOfChildMethod = viewParentClass.getMethod("indexOfChild",
-                        viewClass);
-            }
-
-            return Status.SUCCESS.createResult(
-                    mViewParentIndexOfChildMethod.invoke(parentObject, viewObject));
-        } catch (Exception e) {
-            // Catch all for the reflection calls.
-            return ERROR_REFLECTION.createResult(null, e);
-        }
-    }
-
-    private void addExtendedViewInfo(ViewInfo info) {
-        computeExtendedViewInfo(info);
-
-        List<ViewInfo> children = info.getChildren();
-        for (ViewInfo child : children) {
-            addExtendedViewInfo(child);
-        }
-    }
-
-    private void computeExtendedViewInfo(ViewInfo info) {
-        Object viewObject = info.getViewObject();
-        Object params = info.getLayoutParamsObject();
-
-        int baseLine = getViewBaselineReflection(viewObject);
-        int leftMargin = 0;
-        int topMargin = 0;
-        int rightMargin = 0;
-        int bottomMargin = 0;
-
-        try {
-            if (mMarginLayoutParamClass == null) {
-                mMarginLayoutParamClass = Class.forName(
-                        "android.view.ViewGroup$MarginLayoutParams");
-
-                mLeftMarginField = mMarginLayoutParamClass.getField("leftMargin");
-                mTopMarginField = mMarginLayoutParamClass.getField("topMargin");
-                mRightMarginField = mMarginLayoutParamClass.getField("rightMargin");
-                mBottomMarginField = mMarginLayoutParamClass.getField("bottomMargin");
-            }
-
-            if (mMarginLayoutParamClass.isAssignableFrom(params.getClass())) {
-
-                leftMargin = (Integer)mLeftMarginField.get(params);
-                topMargin = (Integer)mTopMarginField.get(params);
-                rightMargin = (Integer)mRightMarginField.get(params);
-                bottomMargin = (Integer)mBottomMarginField.get(params);
-            }
-
-        } catch (Exception e) {
-            // just use 'unknown' value.
-            leftMargin = Integer.MIN_VALUE;
-            topMargin = Integer.MIN_VALUE;
-            rightMargin = Integer.MIN_VALUE;
-            bottomMargin = Integer.MIN_VALUE;
-        }
-
-        info.setExtendedInfo(baseLine, leftMargin, topMargin, rightMargin, bottomMargin);
-    }
-
-    /**
-     * Utility method returning the baseline value for a given view object. This basically returns
-     * View.getBaseline().
-     *
-     * @param viewObject the object for which to return the index.
-     *
-     * @return the baseline value or -1 if not applicable to the view object or if this layout
-     *     library does not implement this method.
-     */
-    private int getViewBaselineReflection(Object viewObject) {
-        // default implementation using reflection.
-        try {
-            if (mViewGetBaselineMethod == null) {
-                Class<?> viewClass = Class.forName("android.view.View");
-                mViewGetBaselineMethod = viewClass.getMethod("getBaseline");
-            }
-
-            Object result = mViewGetBaselineMethod.invoke(viewObject);
-            if (result instanceof Integer) {
-                return ((Integer)result).intValue();
-            }
-
-        } catch (Exception e) {
-            // Catch all for the reflection calls.
-        }
-
-        return Integer.MIN_VALUE;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/rendering/StaticRenderSession.java b/sdk_common/src/com/android/ide/common/rendering/StaticRenderSession.java
deleted file mode 100644
index c122c1c..0000000
--- a/sdk_common/src/com/android/ide/common/rendering/StaticRenderSession.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering;
-
-import com.android.ide.common.rendering.api.RenderSession;
-import com.android.ide.common.rendering.api.Result;
-import com.android.ide.common.rendering.api.ViewInfo;
-
-import java.awt.image.BufferedImage;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Static {@link RenderSession} returning a given {@link Result}, {@link ViewInfo} and
- * {@link BufferedImage}.
- * <p/>
- * All other methods are untouched from the base implementation provided by the API.
- * <p/>
- * This is meant to be used as a wrapper around the static results. No further operations are
- * possible.
- *
- */
-public class StaticRenderSession extends RenderSession {
-
-    private final Result mResult;
-    private final List<ViewInfo> mRootViewInfo;
-    private final BufferedImage mImage;
-
-    public StaticRenderSession(Result result, ViewInfo rootViewInfo, BufferedImage image) {
-        mResult = result;
-        mRootViewInfo = Collections.singletonList(rootViewInfo);
-        mImage = image;
-    }
-
-    @Override
-    public Result getResult() {
-        return mResult;
-    }
-
-    @Override
-    public List<ViewInfo> getRootViews() {
-        return mRootViewInfo;
-    }
-
-    @Override
-    public BufferedImage getImage() {
-        return mImage;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/rendering/legacy/ILegacyPullParser.java b/sdk_common/src/com/android/ide/common/rendering/legacy/ILegacyPullParser.java
deleted file mode 100644
index a71e190..0000000
--- a/sdk_common/src/com/android/ide/common/rendering/legacy/ILegacyPullParser.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.legacy;
-
-import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.layoutlib.api.IXmlPullParser;
-
-/**
- * Intermediary interface extending both old and new project pull parsers from the layout lib API.
- *
- * Clients should use this instead of {@link ILayoutPullParser} or {@link IXmlPullParser}.
- *
- */
-@SuppressWarnings("deprecation")
-public interface ILegacyPullParser extends ILayoutPullParser, IXmlPullParser {
-
-}
diff --git a/sdk_common/src/com/android/ide/common/rendering/legacy/LegacyCallback.java b/sdk_common/src/com/android/ide/common/rendering/legacy/LegacyCallback.java
deleted file mode 100644
index 67e6a7b..0000000
--- a/sdk_common/src/com/android/ide/common/rendering/legacy/LegacyCallback.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.rendering.legacy;
-
-import com.android.ide.common.rendering.api.IProjectCallback;
-import com.android.resources.ResourceType;
-import com.android.util.Pair;
-
-/**
- * Intermediary class implementing parts of both the old and new project call back from the
- * layout lib API.
- *
- * Clients should use this instead of {@link IProjectCallback} to target both old and new
- * Layout Libraries.
- *
- */
-@SuppressWarnings("deprecation")
-public abstract class LegacyCallback implements
-        com.android.ide.common.rendering.api.IProjectCallback,
-        com.android.layoutlib.api.IProjectCallback {
-
-    // ------ implementation of the old interface using the new interface.
-
-    @Override
-    public final Integer getResourceValue(String type, String name) {
-        return getResourceId(ResourceType.getEnum(type), name);
-    }
-
-    @Override
-    public final String[] resolveResourceValue(int id) {
-        Pair<ResourceType, String> info = resolveResourceId(id);
-        if (info != null) {
-            return new String[] { info.getSecond(), info.getFirst().getName() };
-        }
-
-        return null;
-    }
-
-    @Override
-    public final String resolveResourceValue(int[] id) {
-        return resolveResourceId(id);
-    }
-
-    // ------
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/FrameworkResourceItem.java b/sdk_common/src/com/android/ide/common/resources/FrameworkResourceItem.java
deleted file mode 100644
index 70bbcef..0000000
--- a/sdk_common/src/com/android/ide/common/resources/FrameworkResourceItem.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-/**
- * A custom {@link ResourceItem} for resources provided by the framework.
- *
- * The main change is that {@link #isEditableDirectly()} returns false.
- */
-class FrameworkResourceItem extends ResourceItem {
-
-    FrameworkResourceItem(String name) {
-        super(name);
-    }
-
-    @Override
-    public boolean isEditableDirectly() {
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return "FrameworkResourceItem [mName=" + getName() + ", mFiles=" //$NON-NLS-1$ //$NON-NLS-2$
-                + getSourceFileList() + "]"; //$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/FrameworkResources.java b/sdk_common/src/com/android/ide/common/resources/FrameworkResources.java
deleted file mode 100755
index fe8e197..0000000
--- a/sdk_common/src/com/android/ide/common/resources/FrameworkResources.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.io.IAbstractFile;
-import com.android.io.IAbstractFolder;
-import com.android.resources.ResourceType;
-import com.android.utils.ILogger;
-import com.google.common.base.Charsets;
-
-import org.kxml2.io.KXmlParser;
-import org.xmlpull.v1.XmlPullParser;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Framework resources repository.
- *
- * This behaves the same as {@link ResourceRepository} except that it differentiates between
- * resources that are public and non public.
- * {@link #getResources(ResourceType)} and {@link #hasResourcesOfType(ResourceType)} only return
- * public resources. This is typically used to display resource lists in the UI.
- *
- * {@link #getConfiguredResources(com.android.ide.eclipse.adt.internal.resources.configurations.FolderConfiguration)}
- * returns all resources, even the non public ones so that this can be used for rendering.
- */
-public class FrameworkResources extends ResourceRepository {
-
-    /**
-     * Map of {@link ResourceType} to list of items. It is guaranteed to contain a list for all
-     * possible values of ResourceType.
-     */
-    protected final Map<ResourceType, List<ResourceItem>> mPublicResourceMap =
-        new EnumMap<ResourceType, List<ResourceItem>>(ResourceType.class);
-
-    public FrameworkResources(@NonNull IAbstractFolder resFolder) {
-        super(resFolder, true /*isFrameworkRepository*/);
-    }
-
-    /**
-     * Returns a {@link Collection} (always non null, but can be empty) of <b>public</b>
-     * {@link ResourceItem} matching a given {@link ResourceType}.
-     *
-     * @param type the type of the resources to return
-     * @return a collection of items, possible empty.
-     */
-    @Override
-    @NonNull
-    public List<ResourceItem> getResourceItemsOfType(@NonNull ResourceType type) {
-        return mPublicResourceMap.get(type);
-    }
-
-    /**
-     * Returns whether the repository has <b>public</b> resources of a given {@link ResourceType}.
-     * @param type the type of resource to check.
-     * @return true if the repository contains resources of the given type, false otherwise.
-     */
-    @Override
-    public boolean hasResourcesOfType(@NonNull ResourceType type) {
-        return mPublicResourceMap.get(type).size() > 0;
-    }
-
-    @Override
-    @NonNull
-    protected ResourceItem createResourceItem(@NonNull String name) {
-        return new FrameworkResourceItem(name);
-    }
-
-    /**
-     * Reads the public.xml file in data/res/values/ for a given resource folder and builds up
-     * a map of public resources.
-     *
-     * This map is a subset of the full resource map that only contains framework resources
-     * that are public.
-     *
-     * @param resFolder The root folder of the resources
-     * @param logger a logger to report issues to
-     */
-    public void loadPublicResources(@Nullable ILogger logger) {
-        IAbstractFolder valueFolder = getResFolder().getFolder(SdkConstants.FD_RES_VALUES);
-        if (valueFolder.exists() == false) {
-            return;
-        }
-
-        IAbstractFile publicXmlFile = valueFolder.getFile("public.xml"); //$NON-NLS-1$
-        if (publicXmlFile.exists()) {
-            Reader reader = null;
-            try {
-                reader = new BufferedReader(new InputStreamReader(publicXmlFile.getContents(),
-                        Charsets.UTF_8));
-                KXmlParser parser = new KXmlParser();
-                parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
-                parser.setInput(reader);
-
-                ResourceType lastType = null;
-                String lastTypeName = "";
-                while (true) {
-                    int event = parser.next();
-                    if (event == XmlPullParser.START_TAG) {
-                        // As of API 15 there are a number of "java-symbol" entries here
-                        if (!parser.getName().equals("public")) { //$NON-NLS-1$
-                            continue;
-                        }
-
-                        String name = null;
-                        String typeName = null;
-                        for (int i = 0, n = parser.getAttributeCount(); i < n; i++) {
-                            String attribute = parser.getAttributeName(i);
-
-                            if (attribute.equals("name")) { //$NON-NLS-1$
-                                name = parser.getAttributeValue(i);
-                                if (typeName != null) {
-                                    // Skip id attribute processing
-                                    break;
-                                }
-                            } else if (attribute.equals("type")) { //$NON-NLS-1$
-                                typeName = parser.getAttributeValue(i);
-                            }
-                        }
-
-                        if (name != null && typeName != null) {
-                            ResourceType type = null;
-                            if (typeName.equals(lastTypeName)) {
-                                type = lastType;
-                            } else {
-                                type = ResourceType.getEnum(typeName);
-                                lastType = type;
-                                lastTypeName = typeName;
-                            }
-                            if (type != null) {
-                                ResourceItem match = null;
-                                Map<String, ResourceItem> map = mResourceMap.get(type);
-                                if (map != null) {
-                                    match = map.get(name);
-                                }
-
-                                if (match != null) {
-                                    List<ResourceItem> publicList = mPublicResourceMap.get(type);
-                                    if (publicList == null) {
-                                        // Pick initial size for the list to hold the public
-                                        // resources. We could just use map.size() here,
-                                        // but they're usually much bigger; for example,
-                                        // in one platform version, there are 1500 drawables
-                                        // and 1200 strings but only 175 and 25 public ones
-                                        // respectively.
-                                        int size;
-                                        switch (type) {
-                                            case STYLE: size = 500; break;
-                                            case ATTR: size = 1000; break;
-                                            case DRAWABLE: size = 200; break;
-                                            case ID: size = 50; break;
-                                            case LAYOUT:
-                                            case COLOR:
-                                            case STRING:
-                                            case ANIM:
-                                            case INTERPOLATOR:
-                                                size = 30;
-                                                break;
-                                            default:
-                                                size = 10;
-                                                break;
-                                        }
-                                        publicList = new ArrayList<ResourceItem>(size);
-                                        mPublicResourceMap.put(type, publicList);
-                                    }
-
-                                    publicList.add(match);
-                                } else {
-                                    // log that there's a public resource that doesn't actually
-                                    // exist?
-                                }
-                            } else {
-                                // log that there was a reference to a typo that doesn't actually
-                                // exist?
-                            }
-                        }
-                    } else if (event == XmlPullParser.END_DOCUMENT) {
-                        break;
-                    }
-                }
-            } catch (Exception e) {
-                if (logger != null) {
-                    logger.error(e, "Can't read and parse public attribute list");
-                }
-            } finally {
-                if (reader != null) {
-                    try {
-                        reader.close();
-                    } catch (IOException e) {
-                        // Nothing to be done here - we don't care if it closed or not.
-                    }
-                }
-            }
-        }
-
-        // put unmodifiable list for all res type in the public resource map
-        // this will simplify access
-        for (ResourceType type : ResourceType.values()) {
-            List<ResourceItem> list = mPublicResourceMap.get(type);
-            if (list == null) {
-                list = Collections.emptyList();
-            } else {
-                list = Collections.unmodifiableList(list);
-            }
-
-            // put the new list in the map
-            mPublicResourceMap.put(type, list);
-        }
-    }
-}
-
diff --git a/sdk_common/src/com/android/ide/common/resources/IdGeneratingResourceFile.java b/sdk_common/src/com/android/ide/common/resources/IdGeneratingResourceFile.java
deleted file mode 100644
index 9ff1748..0000000
--- a/sdk_common/src/com/android/ide/common/resources/IdGeneratingResourceFile.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import com.android.ide.common.rendering.api.DensityBasedResourceValue;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.ValueResourceParser.IValueResourceRepository;
-import com.android.ide.common.resources.configuration.DensityQualifier;
-import com.android.io.IAbstractFile;
-import com.android.io.StreamException;
-import com.android.resources.ResourceType;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Represents a resource file that also generates ID resources.
- * <p/>
- * This is typically an XML file in res/layout or res/menu
- */
-public final class IdGeneratingResourceFile extends ResourceFile
-                                            implements IValueResourceRepository {
-
-    private final Map<String, ResourceValue> mIdResources =
-        new HashMap<String, ResourceValue>();
-
-    private final Collection<ResourceType> mResourceTypeList;
-
-    private final String mFileName;
-
-    private final ResourceType mFileType;
-
-    private final ResourceValue mFileValue;
-
-    public IdGeneratingResourceFile(IAbstractFile file, ResourceFolder folder, ResourceType type) {
-        super(file, folder);
-
-        mFileType = type;
-
-        // Set up our resource types
-        mResourceTypeList = new HashSet<ResourceType>();
-        mResourceTypeList.add(mFileType);
-        mResourceTypeList.add(ResourceType.ID);
-
-        // compute the resource name
-        mFileName = getFileName(type);
-
-        // Get the resource value of this file as a whole layout
-        mFileValue = getFileValue(file, folder);
-    }
-
-    @Override
-    protected void load(ScanningContext context) {
-        // Parse the file and look for @+id/ entries
-        parseFileForIds(context);
-
-        // create the resource items in the repository
-        updateResourceItems(context);
-    }
-
-    @Override
-    protected void update(ScanningContext context) {
-        // Copy the previous list of ID names
-        Set<String> oldIdNames = new HashSet<String>(mIdResources.keySet());
-
-        // reset current content.
-        mIdResources.clear();
-
-        // need to parse the file and find the IDs.
-        if (!parseFileForIds(context)) {
-            context.requestFullAapt();
-            // Continue through to updating the resource item here since it
-            // will make for example layout rendering more accurate until
-            // aapt is re-run
-        }
-
-        // We only need to update the repository if our IDs have changed
-        Set<String> keySet = mIdResources.keySet();
-        assert keySet != oldIdNames;
-        if (oldIdNames.equals(keySet) == false) {
-            updateResourceItems(context);
-        }
-    }
-
-    @Override
-    protected void dispose(ScanningContext context) {
-        ResourceRepository repository = getRepository();
-
-        // Remove declarations from this file from the repository
-        repository.removeFile(mResourceTypeList, this);
-
-        // Ask for an ID refresh since we'll be taking away ID generating items
-        context.requestFullAapt();
-    }
-
-    @Override
-    public Collection<ResourceType> getResourceTypes() {
-        return mResourceTypeList;
-    }
-
-    @Override
-    public boolean hasResources(ResourceType type) {
-        return (type == mFileType) || (type == ResourceType.ID && !mIdResources.isEmpty());
-    }
-
-    @Override
-    public ResourceValue getValue(ResourceType type, String name) {
-        // Check to see if they're asking for one of the right types:
-        if (type != mFileType && type != ResourceType.ID) {
-            return null;
-        }
-
-        // If they're looking for a resource of this type with this name give them the whole file
-        if (type == mFileType && name.equals(mFileName)) {
-            return mFileValue;
-        } else {
-            // Otherwise try to return them an ID
-            // the map will return null if it's not found
-            return mIdResources.get(name);
-        }
-    }
-
-    /**
-     * Looks through the file represented for Ids and adds them to
-     * our id repository
-     *
-     * @return true if parsing succeeds and false if it fails
-     */
-    private boolean parseFileForIds(ScanningContext context) {
-        IdResourceParser parser = new IdResourceParser(this, context, isFramework());
-        try {
-            IAbstractFile file = getFile();
-            return parser.parse(mFileType, file.getOsLocation(), file.getContents());
-        } catch (IOException e) {
-            // Pass
-        } catch (StreamException e) {
-            // Pass
-        }
-
-        return false;
-    }
-
-    /**
-     * Add the resources represented by this file to the repository
-     */
-    private void updateResourceItems(ScanningContext context) {
-        ResourceRepository repository = getRepository();
-
-        // remove this file from all existing ResourceItem.
-        repository.removeFile(mResourceTypeList, this);
-
-        // First add this as a layout file
-        ResourceItem item = repository.getResourceItem(mFileType, mFileName);
-        item.add(this);
-
-        // Now iterate through our IDs and add
-        for (String idName : mIdResources.keySet()) {
-            item = repository.getResourceItem(ResourceType.ID, idName);
-            // add this file to the list of files generating ID resources.
-            item.add(this);
-        }
-
-        //  Ask the repository for an ID refresh
-        context.requestFullAapt();
-    }
-
-    /**
-     * Returns the resource value associated with this whole file as a layout resource
-     * @param file the file handler that represents this file
-     * @param folder the folder this file is under
-     * @return a resource value associated with this layout
-     */
-    private ResourceValue getFileValue(IAbstractFile file, ResourceFolder folder) {
-        // test if there's a density qualifier associated with the resource
-        DensityQualifier qualifier = folder.getConfiguration().getDensityQualifier();
-
-        ResourceValue value;
-        if (qualifier == null) {
-            value = new ResourceValue(mFileType, mFileName,
-                    file.getOsLocation(), isFramework());
-        } else {
-            value = new DensityBasedResourceValue(
-                    mFileType, mFileName,
-                    file.getOsLocation(),
-                    qualifier.getValue(),
-                    isFramework());
-        }
-        return value;
-    }
-
-
-    /**
-     * Returns the name of this resource.
-     */
-    private String getFileName(ResourceType type) {
-        // get the name from the filename.
-        String name = getFile().getName();
-
-        int pos = name.indexOf('.');
-        if (pos != -1) {
-            name = name.substring(0, pos);
-        }
-
-        return name;
-    }
-
-    @Override
-    public void addResourceValue(ResourceValue value) {
-        // Just overwrite collisions. We're only interested in the unique
-        // IDs declared
-        mIdResources.put(value.getName(), value);
-    }
-
-    @Override
-    public boolean hasResourceValue(ResourceType type, String name) {
-        if (type == ResourceType.ID) {
-            return mIdResources.containsKey(name);
-        }
-
-        return false;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/IdResourceParser.java b/sdk_common/src/com/android/ide/common/resources/IdResourceParser.java
deleted file mode 100644
index 60c1725..0000000
--- a/sdk_common/src/com/android/ide/common/resources/IdResourceParser.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.ValueResourceParser.IValueResourceRepository;
-import com.android.resources.ResourceType;
-import com.google.common.io.Closeables;
-
-import org.kxml2.io.KXmlParser;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.BufferedInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Parser for scanning an id-generating resource file such as a layout or a menu
- * file, which registers any ids it encounters with an
- * {@link IValueResourceRepository}, and which registers errors with a
- * {@link ScanningContext}.
- */
-public class IdResourceParser {
-    private final IValueResourceRepository mRepository;
-    private final boolean mIsFramework;
-    private ScanningContext mContext;
-
-    /**
-     * Creates a new {@link IdResourceParser}
-     *
-     * @param repository value repository for registering resource declaration
-     * @param context a context object with state for the current update, such
-     *            as a place to stash errors encountered
-     * @param isFramework true if scanning a framework resource
-     */
-    public IdResourceParser(
-            @NonNull IValueResourceRepository repository,
-            @NonNull ScanningContext context,
-            boolean isFramework) {
-        mRepository = repository;
-        mContext = context;
-        mIsFramework = isFramework;
-    }
-
-    /**
-     * Parse the given input and register ids with the given
-     * {@link IValueResourceRepository}.
-     *
-     * @param type the type of resource being scanned
-     * @param path the full OS path to the file being parsed
-     * @param input the input stream of the XML to be parsed (will be closed by this method)
-     * @return true if parsing succeeds and false if it fails
-     * @throws IOException if reading the contents fails
-     */
-    public boolean parse(ResourceType type, final String path, InputStream input)
-            throws IOException {
-        KXmlParser parser = new KXmlParser();
-        try {
-            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
-
-            if (input instanceof FileInputStream) {
-                input = new BufferedInputStream(input);
-            }
-            parser.setInput(input, "UTF-8"); //$NON-NLS-1$
-
-            return parse(type, path, parser);
-        } catch (XmlPullParserException e) {
-            String message = e.getMessage();
-
-            // Strip off position description
-            int index = message.indexOf("(position:"); //$NON-NLS-1$ (Hardcoded in KXml)
-            if (index != -1) {
-                message = message.substring(0, index);
-            }
-
-            String error = String.format("%1$s:%2$d: Error: %3$s", //$NON-NLS-1$
-                    path, parser.getLineNumber(), message);
-            mContext.addError(error);
-            return false;
-        } catch (RuntimeException e) {
-            // Some exceptions are thrown by the KXmlParser that are not XmlPullParserExceptions,
-            // such as this one:
-            //    java.lang.RuntimeException: Undefined Prefix: w in org.kxml2.io.KXmlParser@...
-            //        at org.kxml2.io.KXmlParser.adjustNsp(Unknown Source)
-            //        at org.kxml2.io.KXmlParser.parseStartTag(Unknown Source)
-            String message = e.getMessage();
-            String error = String.format("%1$s:%2$d: Error: %3$s", //$NON-NLS-1$
-                    path, parser.getLineNumber(), message);
-            mContext.addError(error);
-            return false;
-        } finally {
-            Closeables.closeQuietly(input);
-        }
-    }
-
-    private boolean parse(ResourceType type, String path, KXmlParser parser)
-            throws XmlPullParserException, IOException {
-        boolean valid = true;
-        boolean checkForErrors = !mIsFramework && !mContext.needsFullAapt();
-
-        while (true) {
-            int event = parser.next();
-            if (event == XmlPullParser.START_TAG) {
-                for (int i = 0, n = parser.getAttributeCount(); i < n; i++) {
-                    String attribute = parser.getAttributeName(i);
-                    String value = parser.getAttributeValue(i);
-                    assert value != null : attribute;
-
-                    if (checkForErrors) {
-                        String uri = parser.getAttributeNamespace(i);
-                        if (!mContext.checkValue(uri, attribute, value)) {
-                            mContext.requestFullAapt();
-                            checkForErrors = false;
-                            valid = false;
-                        }
-                    }
-
-                    if (value.startsWith("@+")) {       //$NON-NLS-1$
-                        // Strip out the @+id/ or @+android:id/ section
-                        String id = value.substring(value.indexOf('/') + 1);
-                        ResourceValue newId = new ResourceValue(ResourceType.ID, id,
-                                mIsFramework);
-                        mRepository.addResourceValue(newId);
-                    }
-                }
-            } else if (event == XmlPullParser.END_DOCUMENT) {
-                break;
-            }
-        }
-
-        return valid;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/InlineResourceItem.java b/sdk_common/src/com/android/ide/common/resources/InlineResourceItem.java
deleted file mode 100644
index 37fdc81..0000000
--- a/sdk_common/src/com/android/ide/common/resources/InlineResourceItem.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.resources.ResourceType;
-
-
-/**
- * Represents a resource item that has been declared inline in another resource file.
- *
- * This covers the typical ID declaration of "@+id/foo", but does not cover normal value
- * resources declared in strings.xml or other similar value files.
- *
- * This resource will return {@code true} for {@link #isDeclaredInline()} and {@code false} for
- * {@link #isEditableDirectly()}.
- */
-public class InlineResourceItem extends ResourceItem {
-
-    private ResourceValue mValue = null;
-
-    /**
-     * Constructs a new inline ResourceItem.
-     * @param name the name of the resource as it appears in the XML and R.java files.
-     */
-    public InlineResourceItem(String name) {
-        super(name);
-    }
-
-    @Override
-    public boolean isDeclaredInline() {
-        return true;
-    }
-
-    @Override
-    public boolean isEditableDirectly() {
-        return false;
-    }
-
-    @Override
-    public ResourceValue getResourceValue(ResourceType type, FolderConfiguration referenceConfig,
-            boolean isFramework) {
-        assert type == ResourceType.ID;
-        if (mValue == null) {
-            mValue = new ResourceValue(type, getName(), isFramework);
-        }
-
-        return mValue;
-    }
-
-    @Override
-    public String toString() {
-        return "InlineResourceItem [mName=" + getName() + ", mFiles=" //$NON-NLS-1$ //$NON-NLS-2$
-                + getSourceFileList() + "]"; //$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/IntArrayWrapper.java b/sdk_common/src/com/android/ide/common/resources/IntArrayWrapper.java
deleted file mode 100644
index 668c677..0000000
--- a/sdk_common/src/com/android/ide/common/resources/IntArrayWrapper.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import java.util.Arrays;
-
-
-/**
- * Wrapper around a int[] to provide hashCode/equals support.
- */
-public final class IntArrayWrapper {
-
-    private int[] mData;
-
-    public IntArrayWrapper(int[] data) {
-        mData = data;
-    }
-
-    public void set(int[] data) {
-        mData = data;
-    }
-
-    @Override
-    public int hashCode() {
-        return Arrays.hashCode(mData);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null) {
-            return false;
-        }
-        if (getClass().equals(obj.getClass())) {
-            return Arrays.equals(mData, ((IntArrayWrapper)obj).mData);
-        }
-
-        return super.equals(obj);
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/MultiResourceFile.java b/sdk_common/src/com/android/ide/common/resources/MultiResourceFile.java
deleted file mode 100644
index c9a8bc7..0000000
--- a/sdk_common/src/com/android/ide/common/resources/MultiResourceFile.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.ValueResourceParser.IValueResourceRepository;
-import com.android.io.IAbstractFile;
-import com.android.io.StreamException;
-import com.android.resources.ResourceType;
-
-import org.xml.sax.SAXException;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-/**
- * Represents a resource file able to declare multiple resources, which could be of
- * different {@link ResourceType}.
- * <p/>
- * This is typically an XML file inside res/values.
- */
-public final class MultiResourceFile extends ResourceFile implements IValueResourceRepository {
-
-    private final static SAXParserFactory sParserFactory = SAXParserFactory.newInstance();
-
-    private final Map<ResourceType, Map<String, ResourceValue>> mResourceItems =
-        new EnumMap<ResourceType, Map<String, ResourceValue>>(ResourceType.class);
-
-    private Collection<ResourceType> mResourceTypeList = null;
-
-    public MultiResourceFile(IAbstractFile file, ResourceFolder folder) {
-        super(file, folder);
-    }
-
-    // Boolean flag to track whether a named element has been added or removed, thus requiring
-    // a new ID table to be generated
-    private boolean mNeedIdRefresh;
-
-    @Override
-    protected void load(ScanningContext context) {
-        // need to parse the file and find the content.
-        parseFile();
-
-        // create new ResourceItems for the new content.
-        mResourceTypeList = Collections.unmodifiableCollection(mResourceItems.keySet());
-
-        // We need an ID generation step
-        mNeedIdRefresh = true;
-
-        // create/update the resource items.
-        updateResourceItems(context);
-    }
-
-    @Override
-    protected void update(ScanningContext context) {
-        // Reset the ID generation flag
-        mNeedIdRefresh = false;
-
-        // Copy the previous version of our list of ResourceItems and types
-        Map<ResourceType, Map<String, ResourceValue>> oldResourceItems
-                        = new EnumMap<ResourceType, Map<String, ResourceValue>>(mResourceItems);
-
-        // reset current content.
-        mResourceItems.clear();
-
-        // need to parse the file and find the content.
-        parseFile();
-
-        // create new ResourceItems for the new content.
-        mResourceTypeList = Collections.unmodifiableCollection(mResourceItems.keySet());
-
-        // Check to see if any names have changed. If so, mark the flag so updateResourceItems
-        // can notify the ResourceRepository that an ID refresh is needed
-        if (oldResourceItems.keySet().equals(mResourceItems.keySet())) {
-            for (ResourceType type : mResourceTypeList) {
-                // We just need to check the names of the items.
-                // If there are new or removed names then we'll have to regenerate IDs
-                if (mResourceItems.get(type).keySet()
-                                          .equals(oldResourceItems.get(type).keySet()) == false) {
-                    mNeedIdRefresh = true;
-                }
-            }
-        } else {
-            // If our type list is different, obviously the names will be different
-            mNeedIdRefresh = true;
-        }
-        // create/update the resource items.
-        updateResourceItems(context);
-    }
-
-    @Override
-    protected void dispose(ScanningContext context) {
-        ResourceRepository repository = getRepository();
-
-        // only remove this file from all existing ResourceItem.
-        repository.removeFile(mResourceTypeList, this);
-
-        // We'll need an ID refresh because we deleted items
-        context.requestFullAapt();
-
-        // don't need to touch the content, it'll get reclaimed as this objects disappear.
-        // In the mean time other objects may need to access it.
-    }
-
-    @Override
-    public Collection<ResourceType> getResourceTypes() {
-        return mResourceTypeList;
-    }
-
-    @Override
-    public boolean hasResources(ResourceType type) {
-        Map<String, ResourceValue> list = mResourceItems.get(type);
-        return (list != null && list.size() > 0);
-    }
-
-    private void updateResourceItems(ScanningContext context) {
-        ResourceRepository repository = getRepository();
-
-        // remove this file from all existing ResourceItem.
-        repository.removeFile(mResourceTypeList, this);
-
-        for (ResourceType type : mResourceTypeList) {
-            Map<String, ResourceValue> list = mResourceItems.get(type);
-
-            if (list != null) {
-                Collection<ResourceValue> values = list.values();
-                for (ResourceValue res : values) {
-                    ResourceItem item = repository.getResourceItem(type, res.getName());
-
-                    // add this file to the list of files generating this resource item.
-                    item.add(this);
-                }
-            }
-        }
-
-        // If we need an ID refresh, ask the repository for that now
-        if (mNeedIdRefresh) {
-            context.requestFullAapt();
-        }
-    }
-
-    /**
-     * Parses the file and creates a list of {@link ResourceType}.
-     */
-    private void parseFile() {
-        try {
-            SAXParser parser = sParserFactory.newSAXParser();
-            parser.parse(getFile().getContents(), new ValueResourceParser(this, isFramework()));
-        } catch (ParserConfigurationException e) {
-        } catch (SAXException e) {
-        } catch (IOException e) {
-        } catch (StreamException e) {
-        }
-    }
-
-    /**
-     * Adds a resource item to the list
-     * @param value The value of the resource.
-     */
-    @Override
-    public void addResourceValue(ResourceValue value) {
-        ResourceType resType = value.getResourceType();
-
-        Map<String, ResourceValue> list = mResourceItems.get(resType);
-
-        // if the list does not exist, create it.
-        if (list == null) {
-            list = new HashMap<String, ResourceValue>();
-            mResourceItems.put(resType, list);
-        } else {
-            // look for a possible value already existing.
-            ResourceValue oldValue = list.get(value.getName());
-
-            if (oldValue != null) {
-                oldValue.replaceWith(value);
-                return;
-            }
-        }
-
-        // empty list or no match found? add the given resource
-        list.put(value.getName(), value);
-    }
-
-    @Override
-    public boolean hasResourceValue(ResourceType type, String name) {
-        Map<String, ResourceValue> map = mResourceItems.get(type);
-        return map != null && map.containsKey(name);
-    }
-
-    @Override
-    public ResourceValue getValue(ResourceType type, String name) {
-        // get the list for the given type
-        Map<String, ResourceValue> list = mResourceItems.get(type);
-
-        if (list != null) {
-            return list.get(name);
-        }
-
-        return null;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/ResourceDeltaKind.java b/sdk_common/src/com/android/ide/common/resources/ResourceDeltaKind.java
deleted file mode 100644
index 769b6ea..0000000
--- a/sdk_common/src/com/android/ide/common/resources/ResourceDeltaKind.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-/**
- * Enum indicating a type of resource change.
- *
- * This is similar, and can be easily mapped to Eclipse's integer constants in IResourceDelta.
- */
-public enum ResourceDeltaKind {
-    CHANGED, ADDED, REMOVED;
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/ResourceFile.java b/sdk_common/src/com/android/ide/common/resources/ResourceFile.java
deleted file mode 100644
index 378602a..0000000
--- a/sdk_common/src/com/android/ide/common/resources/ResourceFile.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.configuration.Configurable;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.io.IAbstractFile;
-import com.android.resources.ResourceType;
-
-import java.util.Collection;
-
-/**
- * Represents a Resource file (a file under $Project/res/)
- */
-public abstract class ResourceFile implements Configurable {
-
-    private final IAbstractFile mFile;
-    private final ResourceFolder mFolder;
-
-    protected ResourceFile(IAbstractFile file, ResourceFolder folder) {
-        mFile = file;
-        mFolder = folder;
-    }
-
-    protected abstract void load(ScanningContext context);
-    protected abstract void update(ScanningContext context);
-    protected abstract void dispose(ScanningContext context);
-
-    @Override
-    public FolderConfiguration getConfiguration() {
-        return mFolder.getConfiguration();
-    }
-
-    /**
-     * Returns the IFile associated with the ResourceFile.
-     */
-    public final IAbstractFile getFile() {
-        return mFile;
-    }
-
-    /**
-     * Returns the parent folder as a {@link ResourceFolder}.
-     */
-    public final ResourceFolder getFolder() {
-        return mFolder;
-    }
-
-    public final ResourceRepository getRepository() {
-        return mFolder.getRepository();
-    }
-
-    /**
-     * Returns whether the resource is a framework resource.
-     */
-    public final boolean isFramework() {
-        return mFolder.getRepository().isFrameworkRepository();
-    }
-
-    /**
-     * Returns the list of {@link ResourceType} generated by the file. This is never null.
-     */
-    public abstract Collection<ResourceType> getResourceTypes();
-
-    /**
-     * Returns whether the file generated a resource of a specific type.
-     * @param type The {@link ResourceType}
-     */
-    public abstract boolean hasResources(ResourceType type);
-
-    /**
-     * Returns the value of a resource generated by this file by {@link ResourceType} and name.
-     * <p/>If no resource match, <code>null</code> is returned.
-     * @param type the type of the resource.
-     * @param name the name of the resource.
-     */
-    public abstract ResourceValue getValue(ResourceType type, String name);
-
-    @Override
-    public String toString() {
-        return mFile.toString();
-    }
-}
-
diff --git a/sdk_common/src/com/android/ide/common/resources/ResourceFolder.java b/sdk_common/src/com/android/ide/common/resources/ResourceFolder.java
deleted file mode 100644
index d6464c8..0000000
--- a/sdk_common/src/com/android/ide/common/resources/ResourceFolder.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.ide.common.resources.configuration.Configurable;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.io.IAbstractFile;
-import com.android.io.IAbstractFolder;
-import com.android.resources.FolderTypeRelationship;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Resource Folder class. Contains list of {@link ResourceFile}s,
- * the {@link FolderConfiguration}, and a link to the {@link IAbstractFolder} object.
- */
-public final class ResourceFolder implements Configurable {
-    final ResourceFolderType mType;
-    final FolderConfiguration mConfiguration;
-    IAbstractFolder mFolder;
-    List<ResourceFile> mFiles = null;
-    Map<String, ResourceFile> mNames = null;
-    private final ResourceRepository mRepository;
-
-    /**
-     * Creates a new {@link ResourceFolder}
-     * @param type The type of the folder
-     * @param config The configuration of the folder
-     * @param folder The associated {@link IAbstractFolder} object.
-     * @param repository The associated {@link ResourceRepository}
-     */
-    protected ResourceFolder(ResourceFolderType type, FolderConfiguration config,
-            IAbstractFolder folder, ResourceRepository repository) {
-        mType = type;
-        mConfiguration = config;
-        mFolder = folder;
-        mRepository = repository;
-    }
-
-    /**
-     * Processes a file and adds it to its parent folder resource.
-     *
-     * @param file the underlying resource file.
-     * @param kind the file change kind.
-     * @param context a context object with state for the current update, such
-     *            as a place to stash errors encountered
-     * @return the {@link ResourceFile} that was created.
-     */
-    public ResourceFile processFile(IAbstractFile file, ResourceDeltaKind kind,
-            ScanningContext context) {
-        // look for this file if it's already been created
-        ResourceFile resFile = getFile(file, context);
-
-        if (resFile == null) {
-            if (kind != ResourceDeltaKind.REMOVED) {
-                // create a ResourceFile for it.
-
-                resFile = createResourceFile(file);
-                resFile.load(context);
-
-                // add it to the folder
-                addFile(resFile);
-            }
-        } else {
-            if (kind == ResourceDeltaKind.REMOVED) {
-                removeFile(resFile, context);
-            } else {
-                resFile.update(context);
-            }
-        }
-
-        return resFile;
-    }
-
-    private ResourceFile createResourceFile(IAbstractFile file) {
-        // check if that's a single or multi resource type folder. For now we define this by
-        // the number of possible resource type output by files in the folder.
-        // We have a special case for layout/menu folders which can also generate IDs.
-        // This does
-        // not make the difference between several resource types from a single file or
-        // the ability to have 2 files in the same folder generating 2 different types of
-        // resource. The former is handled by MultiResourceFile properly while we don't
-        // handle the latter. If we were to add this behavior we'd have to change this call.
-        List<ResourceType> types = FolderTypeRelationship.getRelatedResourceTypes(mType);
-
-        ResourceFile resFile = null;
-        if (types.size() == 1) {
-            resFile = new SingleResourceFile(file, this);
-        } else if (types.contains(ResourceType.LAYOUT)) {
-            resFile = new IdGeneratingResourceFile(file, this, ResourceType.LAYOUT);
-        } else if (types.contains(ResourceType.MENU)) {
-            resFile = new IdGeneratingResourceFile(file, this, ResourceType.MENU);
-        } else {
-            resFile = new MultiResourceFile(file, this);
-        }
-        return resFile;
-    }
-
-    /**
-     * Adds a {@link ResourceFile} to the folder.
-     * @param file The {@link ResourceFile}.
-     */
-    @VisibleForTesting(visibility=Visibility.PROTECTED)
-    public void addFile(ResourceFile file) {
-        if (mFiles == null) {
-            int initialSize = 16;
-            if (mRepository.isFrameworkRepository()) {
-                String name = mFolder.getName();
-                // Pick some reasonable initial sizes for framework data structures
-                // since they are typically (a) large and (b) their sizes are roughly known
-                // in advance
-                switch (mType) {
-                    case DRAWABLE: {
-                        // See if it's one of the -mdpi, -hdpi etc folders which
-                        // are large (~1250 items)
-                        int index = name.indexOf('-');
-                        if (index == -1) {
-                            initialSize = 230; // "drawable" folder
-                        } else {
-                            index = name.indexOf('-', index + 1);
-                            if (index == -1) {
-                                // One of the "drawable-<density>" folders
-                                initialSize = 1260;
-                            } else {
-                                // "drawable-sw600dp-hdpi" etc
-                                initialSize = 30;
-                            }
-                        }
-                        break;
-                    }
-                    case LAYOUT: {
-                        // The main layout folder has about ~185 layouts in it;
-                        // the others are small
-                        if (name.indexOf('-') == -1) {
-                            initialSize = 200;
-                        }
-                        break;
-                    }
-                    case VALUES: {
-                        if (name.indexOf('-') == -1) {
-                            initialSize = 32;
-                        } else {
-                            initialSize = 4;
-                        }
-                        break;
-                    }
-                    case ANIM: initialSize = 85; break;
-                    case COLOR: initialSize = 32; break;
-                    case RAW: initialSize = 4; break;
-                    default:
-                        // Stick with the 16 default
-                        break;
-                }
-            }
-
-            mFiles = new ArrayList<ResourceFile>(initialSize);
-            mNames = new HashMap<String, ResourceFile>(initialSize, 2.0f);
-        }
-
-        mFiles.add(file);
-        mNames.put(file.getFile().getName(), file);
-    }
-
-    protected void removeFile(ResourceFile file, ScanningContext context) {
-        file.dispose(context);
-        mFiles.remove(file);
-        mNames.remove(file.getFile().getName());
-    }
-
-    protected void dispose(ScanningContext context) {
-        if (mFiles != null) {
-            for (ResourceFile file : mFiles) {
-                file.dispose(context);
-            }
-
-            mFiles.clear();
-            mNames.clear();
-        }
-    }
-
-    /**
-     * Returns the {@link IAbstractFolder} associated with this object.
-     */
-    public IAbstractFolder getFolder() {
-        return mFolder;
-    }
-
-    /**
-     * Returns the {@link ResourceFolderType} of this object.
-     */
-    public ResourceFolderType getType() {
-        return mType;
-    }
-
-    public ResourceRepository getRepository() {
-        return mRepository;
-    }
-
-    /**
-     * Returns the list of {@link ResourceType}s generated by the files inside this folder.
-     */
-    public Collection<ResourceType> getResourceTypes() {
-        ArrayList<ResourceType> list = new ArrayList<ResourceType>();
-
-        if (mFiles != null) {
-            for (ResourceFile file : mFiles) {
-                Collection<ResourceType> types = file.getResourceTypes();
-
-                // loop through those and add them to the main list,
-                // if they are not already present
-                for (ResourceType resType : types) {
-                    if (list.indexOf(resType) == -1) {
-                        list.add(resType);
-                    }
-                }
-            }
-        }
-
-        return list;
-    }
-
-    @Override
-    public FolderConfiguration getConfiguration() {
-        return mConfiguration;
-    }
-
-    /**
-     * Returns whether the folder contains a file with the given name.
-     * @param name the name of the file.
-     */
-    public boolean hasFile(String name) {
-        if (mNames != null && mNames.containsKey(name)) {
-            return true;
-        }
-
-        // Note: mNames.containsKey(name) is faster, but doesn't give the same result; this
-        // method seems to be called on this ResourceFolder before it has been processed,
-        // so we need to use the file system check instead:
-        return mFolder.hasFile(name);
-    }
-
-    /**
-     * Returns the {@link ResourceFile} matching a {@link IAbstractFile} object.
-     *
-     * @param file The {@link IAbstractFile} object.
-     * @param context a context object with state for the current update, such
-     *            as a place to stash errors encountered
-     * @return the {@link ResourceFile} or null if no match was found.
-     */
-    private ResourceFile getFile(IAbstractFile file, ScanningContext context) {
-        assert mFolder.equals(file.getParentFolder());
-
-        if (mNames != null) {
-            ResourceFile resFile = mNames.get(file.getName());
-            if (resFile != null) {
-                return resFile;
-            }
-        }
-
-        // If the file actually exists, the resource folder  may not have been
-        // scanned yet; add it lazily
-        if (file.exists()) {
-            ResourceFile resFile = createResourceFile(file);
-            resFile.load(context);
-            addFile(resFile);
-            return resFile;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link ResourceFile} matching a given name.
-     * @param filename The name of the file to return.
-     * @return the {@link ResourceFile} or <code>null</code> if no match was found.
-     */
-    public ResourceFile getFile(String filename) {
-        if (mNames != null) {
-            ResourceFile resFile = mNames.get(filename);
-            if (resFile != null) {
-                return resFile;
-            }
-        }
-
-        // If the file actually exists, the resource folder  may not have been
-        // scanned yet; add it lazily
-        IAbstractFile file = mFolder.getFile(filename);
-        if (file != null && file.exists()) {
-            ResourceFile resFile = createResourceFile(file);
-            resFile.load(new ScanningContext(mRepository));
-            addFile(resFile);
-            return resFile;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns whether a file in the folder is generating a resource of a specified type.
-     * @param type The {@link ResourceType} being looked up.
-     */
-    public boolean hasResources(ResourceType type) {
-        // Check if the folder type is able to generate resource of the type that was asked.
-        // this is a first check to avoid going through the files.
-        List<ResourceFolderType> folderTypes = FolderTypeRelationship.getRelatedFolders(type);
-
-        boolean valid = false;
-        for (ResourceFolderType rft : folderTypes) {
-            if (rft == mType) {
-                valid = true;
-                break;
-            }
-        }
-
-        if (valid) {
-            if (mFiles != null) {
-                for (ResourceFile f : mFiles) {
-                    if (f.hasResources(type)) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return mFolder.toString();
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/ResourceItem.java b/sdk_common/src/com/android/ide/common/resources/ResourceItem.java
deleted file mode 100644
index 49396eb..0000000
--- a/sdk_common/src/com/android/ide/common/resources/ResourceItem.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.resources.ResourceType;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * An android resource.
- *
- * This is a representation of the resource, not of its value(s). It gives access to all
- * the source files that generate this particular resource which then can be used to access
- * the actual value(s).
- *
- * @see ResourceFile#getResources(ResourceType, ResourceRepository)
- */
-public class ResourceItem implements Comparable<ResourceItem> {
-
-    private final static Comparator<ResourceFile> sComparator = new Comparator<ResourceFile>() {
-        @Override
-        public int compare(ResourceFile file1, ResourceFile file2) {
-            // get both FolderConfiguration and compare them
-            FolderConfiguration fc1 = file1.getFolder().getConfiguration();
-            FolderConfiguration fc2 = file2.getFolder().getConfiguration();
-
-            return fc1.compareTo(fc2);
-        }
-    };
-
-    private final String mName;
-
-    /**
-     * List of files generating this ResourceItem.
-     */
-    private final List<ResourceFile> mFiles = new ArrayList<ResourceFile>();
-
-    /**
-     * Constructs a new ResourceItem.
-     * @param name the name of the resource as it appears in the XML and R.java files.
-     */
-    public ResourceItem(String name) {
-        mName = name;
-    }
-
-    /**
-     * Returns the name of the resource.
-     */
-    public final String getName() {
-        return mName;
-    }
-
-    /**
-     * Compares the {@link ResourceItem} to another.
-     * @param other the ResourceItem to be compared to.
-     */
-    @Override
-    public int compareTo(ResourceItem other) {
-        return mName.compareTo(other.mName);
-    }
-
-    /**
-     * Returns whether the resource is editable directly.
-     * <p/>
-     * This is typically the case for resources that don't have alternate versions, or resources
-     * of type {@link ResourceType#ID} that aren't declared inline.
-     */
-    public boolean isEditableDirectly() {
-        return hasAlternates() == false;
-    }
-
-    /**
-     * Returns whether the ID resource has been declared inline inside another resource XML file.
-     * If the resource type is not {@link ResourceType#ID}, this will always return {@code false}.
-     */
-    public boolean isDeclaredInline() {
-        return false;
-    }
-
-    /**
-     * Returns a {@link ResourceValue} for this item based on the given configuration.
-     * If the ResourceItem has several source files, one will be selected based on the config.
-     * @param type the type of the resource. This is necessary because ResourceItem doesn't embed
-     *     its type, but ResourceValue does.
-     * @param referenceConfig the config of the resource item.
-     * @param isFramework whether the resource is a framework value. Same as the type.
-     * @return a ResourceValue or null if none match the config.
-     */
-    public ResourceValue getResourceValue(ResourceType type, FolderConfiguration referenceConfig,
-            boolean isFramework) {
-        // look for the best match for the given configuration
-        // the match has to be of type ResourceFile since that's what the input list contains
-        ResourceFile match = (ResourceFile) referenceConfig.findMatchingConfigurable(mFiles);
-
-        if (match != null) {
-            // get the value of this configured resource.
-            return match.getValue(type, mName);
-        }
-
-        return null;
-    }
-
-    /**
-     * Adds a new source file.
-     * @param file the source file.
-     */
-    protected void add(ResourceFile file) {
-        mFiles.add(file);
-    }
-
-    /**
-     * Removes a file from the list of source files.
-     * @param file the file to remove
-     */
-    protected void removeFile(ResourceFile file) {
-        mFiles.remove(file);
-    }
-
-    /**
-     * Returns {@code true} if the item has no source file.
-     * @return
-     */
-    protected boolean hasNoSourceFile() {
-        return mFiles.size() == 0;
-    }
-
-    /**
-     * Reset the item by emptying its source file list.
-     */
-    protected void reset() {
-        mFiles.clear();
-    }
-
-    /**
-     * Returns the sorted list of {@link ResourceItem} objects for this resource item.
-     */
-    public ResourceFile[] getSourceFileArray() {
-        ArrayList<ResourceFile> list = new ArrayList<ResourceFile>();
-        list.addAll(mFiles);
-
-        Collections.sort(list, sComparator);
-
-        return list.toArray(new ResourceFile[list.size()]);
-    }
-
-    /**
-     * Returns the list of source file for this resource.
-     */
-    public List<ResourceFile> getSourceFileList() {
-        return Collections.unmodifiableList(mFiles);
-    }
-
-    /**
-     * Returns if the resource has at least one non-default version.
-     *
-     * @see ResourceFile#getConfiguration()
-     * @see FolderConfiguration#isDefault()
-     */
-    public boolean hasAlternates() {
-        for (ResourceFile file : mFiles) {
-            if (file.getFolder().getConfiguration().isDefault() == false) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns whether the resource has a default version, with no qualifier.
-     *
-     * @see ResourceFile#getConfiguration()
-     * @see FolderConfiguration#isDefault()
-     */
-    public boolean hasDefault() {
-        for (ResourceFile file : mFiles) {
-            if (file.getFolder().getConfiguration().isDefault()) {
-                return true;
-            }
-        }
-
-        // We only want to return false if there's no default and more than 0 items.
-        return (mFiles.size() == 0);
-    }
-
-    /**
-     * Returns the number of alternate versions for this resource.
-     *
-     * @see ResourceFile#getConfiguration()
-     * @see FolderConfiguration#isDefault()
-     */
-    public int getAlternateCount() {
-        int count = 0;
-        for (ResourceFile file : mFiles) {
-            if (file.getFolder().getConfiguration().isDefault() == false) {
-                count++;
-            }
-        }
-
-        return count;
-    }
-
-    /**
-     * Returns a formatted string usable in an XML to use for the {@link ResourceItem}.
-     * @param system Whether this is a system resource or a project resource.
-     * @return a string in the format @[type]/[name]
-     */
-    public String getXmlString(ResourceType type, boolean system) {
-        if (type == ResourceType.ID && isDeclaredInline()) {
-            return (system ? "@android:" : "@+") + type.getName() + "/" + mName; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-        }
-
-        return (system ? "@android:" : "@") + type.getName() + "/" + mName; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-    }
-
-    @Override
-    public String toString() {
-        return "ResourceItem [mName=" + mName + ", mFiles=" + mFiles + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/ResourceRepository.java b/sdk_common/src/com/android/ide/common/resources/ResourceRepository.java
deleted file mode 100755
index a3b20ed..0000000
--- a/sdk_common/src/com/android/ide/common/resources/ResourceRepository.java
+++ /dev/null
@@ -1,960 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import static com.android.SdkConstants.ATTR_REF_PREFIX;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.PREFIX_THEME_REF;
-import static com.android.SdkConstants.RESOURCE_CLZ_ATTR;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.configuration.Configurable;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.LanguageQualifier;
-import com.android.ide.common.resources.configuration.RegionQualifier;
-import com.android.io.IAbstractFile;
-import com.android.io.IAbstractFolder;
-import com.android.io.IAbstractResource;
-import com.android.resources.FolderTypeRelationship;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-import com.android.utils.Pair;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.IdentityHashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/**
- * Base class for resource repository.
- *
- * A repository is both a file representation of a resource folder and a representation
- * of the generated resources, organized by type.
- *
- * {@link #getResourceFolder(IAbstractFolder)} and {@link #getSourceFiles(ResourceType, String, FolderConfiguration)}
- * give access to the folders and files of the resource folder.
- *
- * {@link #getResources(ResourceType)} gives access to the resources directly.
- *
- */
-public abstract class ResourceRepository {
-
-    private final IAbstractFolder mResourceFolder;
-
-    protected Map<ResourceFolderType, List<ResourceFolder>> mFolderMap =
-        new EnumMap<ResourceFolderType, List<ResourceFolder>>(ResourceFolderType.class);
-
-    protected Map<ResourceType, Map<String, ResourceItem>> mResourceMap =
-            new EnumMap<ResourceType, Map<String, ResourceItem>>(
-                    ResourceType.class);
-
-    private Map<Map<String, ResourceItem>, Collection<ResourceItem>> mReadOnlyListMap =
-            new IdentityHashMap<Map<String, ResourceItem>, Collection<ResourceItem>>();
-
-    private final boolean mFrameworkRepository;
-    private boolean mCleared = true;
-    private boolean mInitializing = false;
-
-    protected final IntArrayWrapper mWrapper = new IntArrayWrapper(null);
-
-    /**
-     * Makes a resource repository
-     * @param resFolder the resource folder of the repository.
-     * @param isFrameworkRepository whether the repository is for framework resources.
-     */
-    protected ResourceRepository(@NonNull IAbstractFolder resFolder,
-            boolean isFrameworkRepository) {
-        mResourceFolder = resFolder;
-        mFrameworkRepository = isFrameworkRepository;
-    }
-
-    public IAbstractFolder getResFolder() {
-        return mResourceFolder;
-    }
-
-    public boolean isFrameworkRepository() {
-        return mFrameworkRepository;
-    }
-
-    public synchronized void clear() {
-        mCleared = true;
-        mFolderMap = new EnumMap<ResourceFolderType, List<ResourceFolder>>(
-                ResourceFolderType.class);
-        mResourceMap = new EnumMap<ResourceType, Map<String, ResourceItem>>(
-                ResourceType.class);
-
-        mReadOnlyListMap =
-            new IdentityHashMap<Map<String, ResourceItem>, Collection<ResourceItem>>();
-    }
-
-    /**
-     * Ensures that the repository has been initialized again after a call to
-     * {@link ResourceRepository#clear()}
-     *
-     * @return true if the repository was just re-initialized.
-     */
-    public synchronized boolean ensureInitialized() {
-        if (mCleared && !mInitializing) {
-            ScanningContext context = new ScanningContext(this);
-            mInitializing = true;
-
-            IAbstractResource[] resources = mResourceFolder.listMembers();
-
-            for (IAbstractResource res : resources) {
-                if (res instanceof IAbstractFolder) {
-                    IAbstractFolder folder = (IAbstractFolder)res;
-                    ResourceFolder resFolder = processFolder(folder);
-
-                    if (resFolder != null) {
-                        // now we process the content of the folder
-                        IAbstractResource[] files = folder.listMembers();
-
-                        for (IAbstractResource fileRes : files) {
-                            if (fileRes instanceof IAbstractFile) {
-                                IAbstractFile file = (IAbstractFile)fileRes;
-
-                                resFolder.processFile(file, ResourceDeltaKind.ADDED, context);
-                            }
-                        }
-                    }
-                }
-            }
-
-            mInitializing = false;
-            mCleared = false;
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Adds a Folder Configuration to the project.
-     * @param type The resource type.
-     * @param config The resource configuration.
-     * @param folder The workspace folder object.
-     * @return the {@link ResourceFolder} object associated to this folder.
-     */
-    private ResourceFolder add(
-            @NonNull ResourceFolderType type,
-            @NonNull FolderConfiguration config,
-            @NonNull IAbstractFolder folder) {
-        // get the list for the resource type
-        List<ResourceFolder> list = mFolderMap.get(type);
-
-        if (list == null) {
-            list = new ArrayList<ResourceFolder>();
-
-            ResourceFolder cf = new ResourceFolder(type, config, folder, this);
-            list.add(cf);
-
-            mFolderMap.put(type, list);
-
-            return cf;
-        }
-
-        // look for an already existing folder configuration.
-        for (ResourceFolder cFolder : list) {
-            if (cFolder.mConfiguration.equals(config)) {
-                // config already exist. Nothing to be done really, besides making sure
-                // the IAbstractFolder object is up to date.
-                cFolder.mFolder = folder;
-                return cFolder;
-            }
-        }
-
-        // If we arrive here, this means we didn't find a matching configuration.
-        // So we add one.
-        ResourceFolder cf = new ResourceFolder(type, config, folder, this);
-        list.add(cf);
-
-        return cf;
-    }
-
-    /**
-     * Removes a {@link ResourceFolder} associated with the specified {@link IAbstractFolder}.
-     * @param type The type of the folder
-     * @param removedFolder the IAbstractFolder object.
-     * @param context the scanning context
-     * @return the {@link ResourceFolder} that was removed, or null if no matches were found.
-     */
-    @Nullable
-    public ResourceFolder removeFolder(
-            @NonNull ResourceFolderType type,
-            @NonNull IAbstractFolder removedFolder,
-            @Nullable ScanningContext context) {
-        ensureInitialized();
-
-        // get the list of folders for the resource type.
-        List<ResourceFolder> list = mFolderMap.get(type);
-
-        if (list != null) {
-            int count = list.size();
-            for (int i = 0 ; i < count ; i++) {
-                ResourceFolder resFolder = list.get(i);
-                IAbstractFolder folder = resFolder.getFolder();
-                if (removedFolder.equals(folder)) {
-                    // we found the matching ResourceFolder. we need to remove it.
-                    list.remove(i);
-
-                    // remove its content
-                    resFolder.dispose(context);
-
-                    return resFolder;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns true if this resource repository contains a resource of the given
-     * name.
-     *
-     * @param url the resource URL
-     * @return true if the resource is known
-     */
-    public boolean hasResourceItem(@NonNull String url) {
-        // Handle theme references
-        if (url.startsWith(PREFIX_THEME_REF)) {
-            String remainder = url.substring(PREFIX_THEME_REF.length());
-            if (url.startsWith(ATTR_REF_PREFIX)) {
-                url = PREFIX_RESOURCE_REF + url.substring(PREFIX_THEME_REF.length());
-                return hasResourceItem(url);
-            }
-            int colon = url.indexOf(':');
-            if (colon != -1) {
-                // Convert from ?android:progressBarStyleBig to ?android:attr/progressBarStyleBig
-                if (remainder.indexOf('/', colon) == -1) {
-                    remainder = remainder.substring(0, colon) + RESOURCE_CLZ_ATTR + '/'
-                            + remainder.substring(colon);
-                }
-                url = PREFIX_RESOURCE_REF + remainder;
-                return hasResourceItem(url);
-            } else {
-                int slash = url.indexOf('/');
-                if (slash == -1) {
-                    url = PREFIX_RESOURCE_REF + RESOURCE_CLZ_ATTR + '/' + remainder;
-                    return hasResourceItem(url);
-                }
-            }
-        }
-
-        if (!url.startsWith(PREFIX_RESOURCE_REF)) {
-            return false;
-        }
-
-        assert url.startsWith("@") || url.startsWith("?") : url;
-
-        ensureInitialized();
-
-        int typeEnd = url.indexOf('/', 1);
-        if (typeEnd != -1) {
-            int nameBegin = typeEnd + 1;
-
-            // Skip @ and @+
-            int typeBegin = url.startsWith("@+") ? 2 : 1; //$NON-NLS-1$
-
-            int colon = url.lastIndexOf(':', typeEnd);
-            if (colon != -1) {
-                typeBegin = colon + 1;
-            }
-            String typeName = url.substring(typeBegin, typeEnd);
-            ResourceType type = ResourceType.getEnum(typeName);
-            if (type != null) {
-                String name = url.substring(nameBegin);
-                return hasResourceItem(type, name);
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true if this resource repository contains a resource of the given
-     * name.
-     *
-     * @param type the type of resource to look up
-     * @param name the name of the resource
-     * @return true if the resource is known
-     */
-    public boolean hasResourceItem(@NonNull ResourceType type, @NonNull String name) {
-        ensureInitialized();
-
-        Map<String, ResourceItem> map = mResourceMap.get(type);
-
-        if (map != null) {
-
-            ResourceItem resourceItem = map.get(name);
-            if (resourceItem != null) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns a {@link ResourceItem} matching the given {@link ResourceType} and name. If none
-     * exist, it creates one.
-     *
-     * @param type the resource type
-     * @param name the name of the resource.
-     * @return A resource item matching the type and name.
-     */
-    @NonNull
-    protected ResourceItem getResourceItem(@NonNull ResourceType type, @NonNull String name) {
-        ensureInitialized();
-
-        // looking for an existing ResourceItem with this type and name
-        ResourceItem item = findDeclaredResourceItem(type, name);
-
-        // create one if there isn't one already, or if the existing one is inlined, since
-        // clearly we need a non inlined one (the inline one is removed too)
-        if (item == null || item.isDeclaredInline()) {
-            ResourceItem oldItem = item != null && item.isDeclaredInline() ? item : null;
-
-            item = createResourceItem(name);
-
-            Map<String, ResourceItem> map = mResourceMap.get(type);
-
-            if (map == null) {
-                if (isFrameworkRepository()) {
-                    // Pick initial size for the maps. Also change the load factor to 1.0
-                    // to avoid rehashing the whole table when we (as expected) get near
-                    // the known rough size of each resource type map.
-                    int size;
-                    switch (type) {
-                        // Based on counts in API 16. Going back to API 10, the counts
-                        // are roughly 25-50% smaller (e.g. compared to the top 5 types below
-                        // the fractions are 1107 vs 1734, 831 vs 1508, 895 vs 1255,
-                        // 733 vs 1064 and 171 vs 783.
-                        case PUBLIC:           size = 1734; break;
-                        case DRAWABLE:         size = 1508; break;
-                        case STRING:           size = 1255; break;
-                        case ATTR:             size = 1064; break;
-                        case STYLE:             size = 783; break;
-                        case ID:                size = 347; break;
-                        case DECLARE_STYLEABLE: size = 210; break;
-                        case LAYOUT:            size = 187; break;
-                        case COLOR:             size = 120; break;
-                        case ANIM:               size = 95; break;
-                        case DIMEN:              size = 81; break;
-                        case BOOL:               size = 54; break;
-                        case INTEGER:            size = 52; break;
-                        case ARRAY:              size = 51; break;
-                        case PLURALS:            size = 20; break;
-                        case XML:                size = 14; break;
-                        case INTERPOLATOR :      size = 13; break;
-                        case ANIMATOR:            size = 8; break;
-                        case RAW:                 size = 4; break;
-                        case MENU:                size = 2; break;
-                        case MIPMAP:              size = 2; break;
-                        case FRACTION:            size = 1; break;
-                        default:
-                            size = 2;
-                    }
-                    map = new HashMap<String, ResourceItem>(size, 1.0f);
-                } else {
-                    map = new HashMap<String, ResourceItem>();
-                }
-                mResourceMap.put(type, map);
-            }
-
-            map.put(item.getName(), item);
-
-            if (oldItem != null) {
-                map.remove(oldItem.getName());
-
-            }
-        }
-
-        return item;
-    }
-
-    /**
-     * Creates a resource item with the given name.
-     * @param name the name of the resource
-     * @return a new ResourceItem (or child class) instance.
-     */
-    @NonNull
-    protected abstract ResourceItem createResourceItem(@NonNull String name);
-
-    /**
-     * Processes a folder and adds it to the list of existing folders.
-     * @param folder the folder to process
-     * @return the ResourceFolder created from this folder, or null if the process failed.
-     */
-    @Nullable
-    public ResourceFolder processFolder(@NonNull IAbstractFolder folder) {
-        ensureInitialized();
-
-        // split the name of the folder in segments.
-        String[] folderSegments = folder.getName().split(SdkConstants.RES_QUALIFIER_SEP);
-
-        // get the enum for the resource type.
-        ResourceFolderType type = ResourceFolderType.getTypeByName(folderSegments[0]);
-
-        if (type != null) {
-            // get the folder configuration.
-            FolderConfiguration config = FolderConfiguration.getConfig(folderSegments);
-
-            if (config != null) {
-                return add(type, config, folder);
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a list of {@link ResourceFolder} for a specific {@link ResourceFolderType}.
-     * @param type The {@link ResourceFolderType}
-     */
-    @Nullable
-    public List<ResourceFolder> getFolders(@NonNull ResourceFolderType type) {
-        ensureInitialized();
-
-        return mFolderMap.get(type);
-    }
-
-    @NonNull
-    public List<ResourceType> getAvailableResourceTypes() {
-        ensureInitialized();
-
-        List<ResourceType> list = new ArrayList<ResourceType>();
-
-        // For each key, we check if there's a single ResourceType match.
-        // If not, we look for the actual content to give us the resource type.
-
-        for (ResourceFolderType folderType : mFolderMap.keySet()) {
-            List<ResourceType> types = FolderTypeRelationship.getRelatedResourceTypes(folderType);
-            if (types.size() == 1) {
-                // before we add it we check if it's not already present, since a ResourceType
-                // could be created from multiple folders, even for the folders that only create
-                // one type of resource (drawable for instance, can be created from drawable/ and
-                // values/)
-                if (list.contains(types.get(0)) == false) {
-                    list.add(types.get(0));
-                }
-            } else {
-                // there isn't a single resource type out of this folder, so we look for all
-                // content.
-                List<ResourceFolder> folders = mFolderMap.get(folderType);
-                if (folders != null) {
-                    for (ResourceFolder folder : folders) {
-                        Collection<ResourceType> folderContent = folder.getResourceTypes();
-
-                        // then we add them, but only if they aren't already in the list.
-                        for (ResourceType folderResType : folderContent) {
-                            if (list.contains(folderResType) == false) {
-                                list.add(folderResType);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return list;
-    }
-
-    /**
-     * Returns a list of {@link ResourceItem} matching a given {@link ResourceType}.
-     * @param type the type of the resource items to return
-     * @return a non null collection of resource items
-     */
-    @NonNull
-    public Collection<ResourceItem> getResourceItemsOfType(@NonNull ResourceType type) {
-        ensureInitialized();
-
-        Map<String, ResourceItem> map = mResourceMap.get(type);
-
-        if (map == null) {
-            return Collections.emptyList();
-        }
-
-        Collection<ResourceItem> roList = mReadOnlyListMap.get(map);
-        if (roList == null) {
-            roList = Collections.unmodifiableCollection(map.values());
-            mReadOnlyListMap.put(map, roList);
-        }
-
-        return roList;
-    }
-
-    /**
-     * Returns whether the repository has resources of a given {@link ResourceType}.
-     * @param type the type of resource to check.
-     * @return true if the repository contains resources of the given type, false otherwise.
-     */
-    public boolean hasResourcesOfType(@NonNull ResourceType type) {
-        ensureInitialized();
-
-        Map<String, ResourceItem> items = mResourceMap.get(type);
-        return (items != null && items.size() > 0);
-    }
-
-    /**
-     * Returns the {@link ResourceFolder} associated with a {@link IAbstractFolder}.
-     * @param folder The {@link IAbstractFolder} object.
-     * @return the {@link ResourceFolder} or null if it was not found.
-     */
-    @Nullable
-    public ResourceFolder getResourceFolder(@NonNull IAbstractFolder folder) {
-        ensureInitialized();
-
-        Collection<List<ResourceFolder>> values = mFolderMap.values();
-
-        for (List<ResourceFolder> list : values) {
-            for (ResourceFolder resFolder : list) {
-                IAbstractFolder wrapper = resFolder.getFolder();
-                if (wrapper.equals(folder)) {
-                    return resFolder;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link ResourceFile} matching the given name,
-     * {@link ResourceFolderType} and configuration.
-     * <p/>
-     * This only works with files generating one resource named after the file
-     * (for instance, layouts, bitmap based drawable, xml, anims).
-     *
-     * @param name the resource name or file name
-     * @param type the folder type search for
-     * @param config the folder configuration to match for
-     * @return the matching file or <code>null</code> if no match was found.
-     */
-    @Nullable
-    public ResourceFile getMatchingFile(
-            @NonNull String name,
-            @NonNull ResourceFolderType type,
-            @NonNull FolderConfiguration config) {
-        List<ResourceType> types = FolderTypeRelationship.getRelatedResourceTypes(type);
-        for (ResourceType t : types) {
-            if (t == ResourceType.ID) {
-                continue;
-            }
-            ResourceFile match = getMatchingFile(name, type, config);
-            if (match != null) {
-                return match;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link ResourceFile} matching the given name,
-     * {@link ResourceType} and configuration.
-     * <p/>
-     * This only works with files generating one resource named after the file
-     * (for instance, layouts, bitmap based drawable, xml, anims).
-     *
-     * @param name the resource name or file name
-     * @param type the folder type search for
-     * @param config the folder configuration to match for
-     * @return the matching file or <code>null</code> if no match was found.
-     */
-    @Nullable
-    public ResourceFile getMatchingFile(
-            @NonNull String name,
-            @NonNull ResourceType type,
-            @NonNull FolderConfiguration config) {
-        ensureInitialized();
-
-        String resourceName = name;
-        int dot = resourceName.indexOf('.');
-        if (dot != -1) {
-            resourceName = resourceName.substring(0, dot);
-        }
-
-        Map<String, ResourceItem> items = mResourceMap.get(type);
-        if (items != null) {
-            ResourceItem item = items.get(resourceName);
-            if (item != null) {
-                List<ResourceFile> files = item.getSourceFileList();
-                if (files != null) {
-                    if (files.size() > 1) {
-                        ResourceValue value = item.getResourceValue(type, config,
-                                isFrameworkRepository());
-                        if (value != null) {
-                            String v = value.getValue();
-                            if (v != null) {
-                                Pair<ResourceType, String> pair = parseResource(v);
-                                if (pair != null) {
-                                    return getMatchingFile(pair.getSecond(), pair.getFirst(),
-                                            config);
-                                } else {
-                                    // Looks like the resource value is pointing to a file
-                                    // It's most likely one of the source files for this
-                                    // resource item, so check those first
-                                    for (ResourceFile f : files) {
-                                        if (v.equals(f.getFile().getOsLocation())) {
-                                            // Found the file
-                                            return f;
-                                        }
-                                    }
-
-                                    // No; look up the resource file from the full path
-                                    File file = new File(v);
-                                    if (file.exists()) {
-                                        ResourceFile f = findResourceFile(file);
-                                        if (f != null) {
-                                            return f;
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    } else if (files.size() == 1) {
-                        // Single file: see if it matches
-                        ResourceFile matchingFile = files.get(0);
-                        if (matchingFile.getFolder().getConfiguration().isMatchFor(config)) {
-                            return matchingFile;
-                        }
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    @Nullable
-    private ResourceFile findResourceFile(@NonNull File file) {
-        // Look up the right resource file for this path
-        String parentName = file.getParentFile().getName();
-        IAbstractFolder folder = getResFolder().getFolder(parentName);
-        if (folder != null) {
-            ResourceFolder resourceFolder = getResourceFolder(folder);
-            if (resourceFolder != null) {
-                ResourceFile resourceFile = resourceFolder.getFile(file.getName());
-                if (resourceFile != null) {
-                    return resourceFile;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the list of source files for a given resource.
-     * Optionally, if a {@link FolderConfiguration} is given, then only the best
-     * match for this config is returned.
-     *
-     * @param type the type of the resource.
-     * @param name the name of the resource.
-     * @param referenceConfig an optional config for which only the best match will be returned.
-     *
-     * @return a list of files generating this resource or null if it was not found.
-     */
-    @Nullable
-    public List<ResourceFile> getSourceFiles(@NonNull ResourceType type, @NonNull String name,
-            @Nullable FolderConfiguration referenceConfig) {
-        ensureInitialized();
-
-        Collection<ResourceItem> items = getResourceItemsOfType(type);
-
-        for (ResourceItem item : items) {
-            if (name.equals(item.getName())) {
-                if (referenceConfig != null) {
-                    Configurable match = referenceConfig.findMatchingConfigurable(
-                            item.getSourceFileList());
-
-                    if (match instanceof ResourceFile) {
-                        return Collections.singletonList((ResourceFile) match);
-                    }
-
-                    return null;
-                }
-                return item.getSourceFileList();
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the resources values matching a given {@link FolderConfiguration}.
-     *
-     * @param referenceConfig the configuration that each value must match.
-     * @return a map with guaranteed to contain an entry for each {@link ResourceType}
-     */
-    @NonNull
-    public Map<ResourceType, Map<String, ResourceValue>> getConfiguredResources(
-            @NonNull FolderConfiguration referenceConfig) {
-        ensureInitialized();
-
-        return doGetConfiguredResources(referenceConfig);
-    }
-
-    /**
-     * Returns the resources values matching a given {@link FolderConfiguration} for the current
-     * project.
-     *
-     * @param referenceConfig the configuration that each value must match.
-     * @return a map with guaranteed to contain an entry for each {@link ResourceType}
-     */
-    @NonNull
-    protected final Map<ResourceType, Map<String, ResourceValue>> doGetConfiguredResources(
-            @NonNull FolderConfiguration referenceConfig) {
-        ensureInitialized();
-
-        Map<ResourceType, Map<String, ResourceValue>> map =
-            new EnumMap<ResourceType, Map<String, ResourceValue>>(ResourceType.class);
-
-        for (ResourceType key : ResourceType.values()) {
-            // get the local results and put them in the map
-            map.put(key, getConfiguredResource(key, referenceConfig));
-        }
-
-        return map;
-    }
-
-    /**
-     * Returns the sorted list of languages used in the resources.
-     */
-    @NonNull
-    public SortedSet<String> getLanguages() {
-        ensureInitialized();
-
-        SortedSet<String> set = new TreeSet<String>();
-
-        Collection<List<ResourceFolder>> folderList = mFolderMap.values();
-        for (List<ResourceFolder> folderSubList : folderList) {
-            for (ResourceFolder folder : folderSubList) {
-                FolderConfiguration config = folder.getConfiguration();
-                LanguageQualifier lang = config.getLanguageQualifier();
-                if (lang != null) {
-                    set.add(lang.getShortDisplayValue());
-                }
-            }
-        }
-
-        return set;
-    }
-
-    /**
-     * Returns the sorted list of regions used in the resources with the given language.
-     * @param currentLanguage the current language the region must be associated with.
-     */
-    @NonNull
-    public SortedSet<String> getRegions(@NonNull String currentLanguage) {
-        ensureInitialized();
-
-        SortedSet<String> set = new TreeSet<String>();
-
-        Collection<List<ResourceFolder>> folderList = mFolderMap.values();
-        for (List<ResourceFolder> folderSubList : folderList) {
-            for (ResourceFolder folder : folderSubList) {
-                FolderConfiguration config = folder.getConfiguration();
-
-                // get the language
-                LanguageQualifier lang = config.getLanguageQualifier();
-                if (lang != null && lang.getShortDisplayValue().equals(currentLanguage)) {
-                    RegionQualifier region = config.getRegionQualifier();
-                    if (region != null) {
-                        set.add(region.getShortDisplayValue());
-                    }
-                }
-            }
-        }
-
-        return set;
-    }
-
-    /**
-     * Loads the resources.
-     */
-    public void loadResources() {
-        clear();
-        ensureInitialized();
-    }
-
-    protected void removeFile(@NonNull Collection<ResourceType> types,
-            @NonNull ResourceFile file) {
-        ensureInitialized();
-
-        for (ResourceType type : types) {
-            removeFile(type, file);
-        }
-    }
-
-    protected void removeFile(@NonNull ResourceType type, @NonNull ResourceFile file) {
-        Map<String, ResourceItem> map = mResourceMap.get(type);
-        if (map != null) {
-            Collection<ResourceItem> values = map.values();
-            for (ResourceItem item : values) {
-                item.removeFile(file);
-            }
-        }
-    }
-
-    /**
-     * Returns a map of (resource name, resource value) for the given {@link ResourceType}.
-     * <p/>The values returned are taken from the resource files best matching a given
-     * {@link FolderConfiguration}.
-     * @param type the type of the resources.
-     * @param referenceConfig the configuration to best match.
-     */
-    @NonNull
-    private Map<String, ResourceValue> getConfiguredResource(@NonNull ResourceType type,
-            @NonNull FolderConfiguration referenceConfig) {
-
-        // get the resource item for the given type
-        Map<String, ResourceItem> items = mResourceMap.get(type);
-        if (items == null) {
-            return new HashMap<String, ResourceValue>();
-        }
-
-        // create the map
-        HashMap<String, ResourceValue> map = new HashMap<String, ResourceValue>(items.size());
-
-        for (ResourceItem item : items.values()) {
-            ResourceValue value = item.getResourceValue(type, referenceConfig,
-                    isFrameworkRepository());
-            if (value != null) {
-                map.put(item.getName(), value);
-            }
-        }
-
-        return map;
-    }
-
-
-    /**
-     * Cleans up the repository of resource items that have no source file anymore.
-     */
-    public void postUpdateCleanUp() {
-        // Since removed files/folders remove source files from existing ResourceItem, loop through
-        // all resource items and remove the ones that have no source files.
-
-        Collection<Map<String, ResourceItem>> maps = mResourceMap.values();
-        for (Map<String, ResourceItem> map : maps) {
-            Set<String> keySet = map.keySet();
-            Iterator<String> iterator = keySet.iterator();
-            while (iterator.hasNext()) {
-                String name = iterator.next();
-                ResourceItem resourceItem = map.get(name);
-                if (resourceItem.hasNoSourceFile()) {
-                    iterator.remove();
-                }
-            }
-        }
-    }
-
-    /**
-     * Looks up an existing {@link ResourceItem} by {@link ResourceType} and name. This
-     * ignores inline resources.
-     * @param type the Resource Type.
-     * @param name the Resource name.
-     * @return the existing ResourceItem or null if no match was found.
-     */
-    @Nullable
-    private ResourceItem findDeclaredResourceItem(@NonNull ResourceType type,
-            @NonNull String name) {
-        Map<String, ResourceItem> map = mResourceMap.get(type);
-
-        if (map != null) {
-            ResourceItem resourceItem = map.get(name);
-            if (resourceItem != null && !resourceItem.isDeclaredInline()) {
-                return resourceItem;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Return the resource type of the given url, and the resource name
-     *
-     * @param url the resource url to be parsed
-     * @return a pair of the resource type and the resource name
-     */
-    public static Pair<ResourceType,String> parseResource(String url) {
-        // Handle theme references
-        if (url.startsWith(PREFIX_THEME_REF)) {
-            String remainder = url.substring(PREFIX_THEME_REF.length());
-            if (url.startsWith(ATTR_REF_PREFIX)) {
-                url = PREFIX_RESOURCE_REF + url.substring(PREFIX_THEME_REF.length());
-                return parseResource(url);
-            }
-            int colon = url.indexOf(':');
-            if (colon != -1) {
-                // Convert from ?android:progressBarStyleBig to ?android:attr/progressBarStyleBig
-                if (remainder.indexOf('/', colon) == -1) {
-                    remainder = remainder.substring(0, colon) + RESOURCE_CLZ_ATTR + '/'
-                            + remainder.substring(colon);
-                }
-                url = PREFIX_RESOURCE_REF + remainder;
-                return parseResource(url);
-            } else {
-                int slash = url.indexOf('/');
-                if (slash == -1) {
-                    url = PREFIX_RESOURCE_REF + RESOURCE_CLZ_ATTR + '/' + remainder;
-                    return parseResource(url);
-                }
-            }
-        }
-
-        if (!url.startsWith(PREFIX_RESOURCE_REF)) {
-            return null;
-        }
-        int typeEnd = url.indexOf('/', 1);
-        if (typeEnd == -1) {
-            return null;
-        }
-        int nameBegin = typeEnd + 1;
-
-        // Skip @ and @+
-        int typeBegin = url.startsWith("@+") ? 2 : 1; //$NON-NLS-1$
-
-        int colon = url.lastIndexOf(':', typeEnd);
-        if (colon != -1) {
-            typeBegin = colon + 1;
-        }
-        String typeName = url.substring(typeBegin, typeEnd);
-        ResourceType type = ResourceType.getEnum(typeName);
-        if (type == null) {
-            return null;
-        }
-        String name = url.substring(nameBegin);
-
-        return Pair.of(type, name);
-    }
-}
-
diff --git a/sdk_common/src/com/android/ide/common/resources/ResourceResolver.java b/sdk_common/src/com/android/ide/common/resources/ResourceResolver.java
deleted file mode 100644
index 219c93f..0000000
--- a/sdk_common/src/com/android/ide/common/resources/ResourceResolver.java
+++ /dev/null
@@ -1,590 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.ANDROID_THEME_PREFIX;
-import static com.android.SdkConstants.PREFIX_ANDROID;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.PREFIX_THEME_REF;
-import static com.android.SdkConstants.REFERENCE_STYLE;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.rendering.api.RenderResources;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.rendering.api.StyleResourceValue;
-import com.android.resources.ResourceType;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-public class ResourceResolver extends RenderResources {
-
-    private final Map<ResourceType, Map<String, ResourceValue>> mProjectResources;
-    private final Map<ResourceType, Map<String, ResourceValue>> mFrameworkResources;
-
-    private final Map<StyleResourceValue, StyleResourceValue> mStyleInheritanceMap =
-        new HashMap<StyleResourceValue, StyleResourceValue>();
-
-    private StyleResourceValue mTheme;
-
-    private FrameworkResourceIdProvider mFrameworkProvider;
-    private LayoutLog mLogger;
-    private String mThemeName;
-    private boolean mIsProjectTheme;
-
-    private ResourceResolver(
-            Map<ResourceType, Map<String, ResourceValue>> projectResources,
-            Map<ResourceType, Map<String, ResourceValue>> frameworkResources) {
-        mProjectResources = projectResources;
-        mFrameworkResources = frameworkResources;
-    }
-
-    /**
-     * Creates a new {@link ResourceResolver} object.
-     *
-     * @param projectResources the project resources.
-     * @param frameworkResources the framework resources.
-     * @param themeName the name of the current theme.
-     * @param isProjectTheme Is this a project theme?
-     * @return a new {@link ResourceResolver}
-     */
-    public static ResourceResolver create(
-            Map<ResourceType, Map<String, ResourceValue>> projectResources,
-            Map<ResourceType, Map<String, ResourceValue>> frameworkResources,
-            String themeName, boolean isProjectTheme) {
-
-        ResourceResolver resolver = new ResourceResolver(
-                projectResources, frameworkResources);
-
-        resolver.computeStyleMaps(themeName, isProjectTheme);
-
-        return resolver;
-    }
-
-    // ---- Methods to help dealing with older LayoutLibs.
-
-    public String getThemeName() {
-        return mThemeName;
-    }
-
-    public boolean isProjectTheme() {
-        return mIsProjectTheme;
-    }
-
-    public Map<ResourceType, Map<String, ResourceValue>> getProjectResources() {
-        return mProjectResources;
-    }
-
-    public Map<ResourceType, Map<String, ResourceValue>> getFrameworkResources() {
-        return mFrameworkResources;
-    }
-
-    // ---- RenderResources Methods
-
-    @Override
-    public void setFrameworkResourceIdProvider(FrameworkResourceIdProvider provider) {
-        mFrameworkProvider = provider;
-    }
-
-    @Override
-    public void setLogger(LayoutLog logger) {
-        mLogger = logger;
-    }
-
-    @Override
-    public StyleResourceValue getCurrentTheme() {
-        return mTheme;
-    }
-
-    @Override
-    public StyleResourceValue getTheme(String name, boolean frameworkTheme) {
-        ResourceValue theme = null;
-
-        if (frameworkTheme) {
-            Map<String, ResourceValue> frameworkStyleMap = mFrameworkResources.get(
-                    ResourceType.STYLE);
-            theme = frameworkStyleMap.get(name);
-        } else {
-            Map<String, ResourceValue> projectStyleMap = mProjectResources.get(ResourceType.STYLE);
-            theme = projectStyleMap.get(name);
-        }
-
-        if (theme instanceof StyleResourceValue) {
-            return (StyleResourceValue) theme;
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean themeIsParentOf(StyleResourceValue parentTheme, StyleResourceValue childTheme) {
-        do {
-            childTheme = mStyleInheritanceMap.get(childTheme);
-            if (childTheme == null) {
-                return false;
-            } else if (childTheme == parentTheme) {
-                return true;
-            }
-        } while (true);
-    }
-
-    @Override
-    public ResourceValue getFrameworkResource(ResourceType resourceType, String resourceName) {
-        return getResource(resourceType, resourceName, mFrameworkResources);
-    }
-
-    @Override
-    public ResourceValue getProjectResource(ResourceType resourceType, String resourceName) {
-        return getResource(resourceType, resourceName, mProjectResources);
-    }
-
-    @Override
-    @Deprecated
-    public ResourceValue findItemInStyle(StyleResourceValue style, String attrName) {
-        // this method is deprecated because it doesn't know about the namespace of the
-        // attribute so we search for the project namespace first and then in the
-        // android namespace if needed.
-        ResourceValue item = findItemInStyle(style, attrName, false /*isFrameworkAttr*/);
-        if (item == null) {
-            item = findItemInStyle(style, attrName, true /*isFrameworkAttr*/);
-        }
-
-        return item;
-    }
-
-    @Override
-    public ResourceValue findItemInStyle(StyleResourceValue style, String itemName,
-            boolean isFrameworkAttr) {
-        ResourceValue item = style.findValue(itemName, isFrameworkAttr);
-
-        // if we didn't find it, we look in the parent style (if applicable)
-        if (item == null && mStyleInheritanceMap != null) {
-            StyleResourceValue parentStyle = mStyleInheritanceMap.get(style);
-            if (parentStyle != null) {
-                return findItemInStyle(parentStyle, itemName, isFrameworkAttr);
-            }
-        }
-
-        return item;
-    }
-
-    @Override
-    public ResourceValue findResValue(String reference, boolean forceFrameworkOnly) {
-        if (reference == null) {
-            return null;
-        }
-        if (reference.startsWith(PREFIX_THEME_REF)
-                && reference.length() > PREFIX_THEME_REF.length()) {
-            // no theme? no need to go further!
-            if (mTheme == null) {
-                return null;
-            }
-
-            boolean frameworkOnly = false;
-
-            // eliminate the prefix from the string
-            String originalReference = reference;
-            if (reference.startsWith(ANDROID_THEME_PREFIX)) {
-                frameworkOnly = true;
-                reference = reference.substring(ANDROID_THEME_PREFIX.length());
-            } else {
-                reference = reference.substring(PREFIX_THEME_REF.length());
-            }
-
-            // at this point, value can contain type/name (drawable/foo for instance).
-            // split it to make sure.
-            String[] segments = reference.split("/");
-
-            // we look for the referenced item name.
-            String referenceName = null;
-
-            if (segments.length == 2) {
-                // there was a resType in the reference. If it's attr, we ignore it
-                // else, we assert for now.
-                if (ResourceType.ATTR.getName().equals(segments[0])) {
-                    referenceName = segments[1];
-                } else {
-                    // At this time, no support for ?type/name where type is not "attr"
-                    return null;
-                }
-            } else {
-                // it's just an item name.
-                referenceName = segments[0];
-
-                // Make sure it looks like a resource name; if not, it could just be a string
-                // which starts with a ?
-                if (!Character.isJavaIdentifierStart(referenceName.charAt(0))) {
-                    return null;
-                }
-                for (int i = 1, n = referenceName.length(); i < n; i++) {
-                    char c = referenceName.charAt(i);
-                    if (!Character.isJavaIdentifierPart(c) && c != '.') {
-                        return null;
-                    }
-                }
-            }
-
-            // now we look for android: in the referenceName in order to support format
-            // such as: ?attr/android:name
-            if (referenceName.startsWith(PREFIX_ANDROID)) {
-                frameworkOnly = true;
-                referenceName = referenceName.substring(PREFIX_ANDROID.length());
-            }
-
-            // Now look for the item in the theme, starting with the current one.
-            ResourceValue item = findItemInStyle(mTheme, referenceName,
-                    forceFrameworkOnly || frameworkOnly);
-
-            if (item == null && mLogger != null) {
-                mLogger.warning(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR,
-                        String.format("Couldn't find theme resource %1$s for the current theme",
-                                reference),
-                        new ResourceValue(ResourceType.ATTR, originalReference, frameworkOnly));
-            }
-
-            return item;
-        } else if (reference.startsWith(PREFIX_RESOURCE_REF)) {
-            boolean frameworkOnly = false;
-
-            // check for the specific null reference value.
-            if (REFERENCE_NULL.equals(reference)) {
-                return null;
-            }
-
-            // Eliminate the prefix from the string.
-            if (reference.startsWith(ANDROID_PREFIX)) {
-                frameworkOnly = true;
-                reference = reference.substring(ANDROID_PREFIX.length());
-            } else {
-                reference = reference.substring(PREFIX_RESOURCE_REF.length());
-            }
-
-            // at this point, value contains type/[android:]name (drawable/foo for instance)
-            String[] segments = reference.split("/");
-            if (segments.length != 2) {
-                return null;
-            }
-
-            // now we look for android: in the resource name in order to support format
-            // such as: @drawable/android:name
-            String referenceName = segments[1];
-            if (referenceName.startsWith(PREFIX_ANDROID)) {
-                frameworkOnly = true;
-                referenceName = referenceName.substring(PREFIX_ANDROID.length());
-            }
-
-            ResourceType type = ResourceType.getEnum(segments[0]);
-
-            // unknown type?
-            if (type == null) {
-                return null;
-            }
-
-            // Make sure it looks like a resource name; if not, it could just be a string
-            // which starts with a ?
-            if (!Character.isJavaIdentifierStart(referenceName.charAt(0))) {
-                return null;
-            }
-            for (int i = 1, n = referenceName.length(); i < n; i++) {
-                char c = referenceName.charAt(i);
-                if (!Character.isJavaIdentifierPart(c) && c != '.') {
-                    return null;
-                }
-            }
-
-            return findResValue(type, referenceName,
-                    forceFrameworkOnly ? true :frameworkOnly);
-        }
-
-        // Looks like the value didn't reference anything. Return null.
-        return null;
-    }
-
-    @Override
-    public ResourceValue resolveValue(ResourceType type, String name, String value,
-            boolean isFrameworkValue) {
-        if (value == null) {
-            return null;
-        }
-
-        // get the ResourceValue referenced by this value
-        ResourceValue resValue = findResValue(value, isFrameworkValue);
-
-        // if resValue is null, but value is not null, this means it was not a reference.
-        // we return the name/value wrapper in a ResourceValue. the isFramework flag doesn't
-        // matter.
-        if (resValue == null) {
-            return new ResourceValue(type, name, value, isFrameworkValue);
-        }
-
-        // we resolved a first reference, but we need to make sure this isn't a reference also.
-        return resolveResValue(resValue);
-    }
-
-    @Override
-    public ResourceValue resolveResValue(ResourceValue resValue) {
-        if (resValue == null) {
-            return null;
-        }
-
-        // if the resource value is null, we simply return it.
-        String value = resValue.getValue();
-        if (value == null) {
-            return resValue;
-        }
-
-        // else attempt to find another ResourceValue referenced by this one.
-        ResourceValue resolvedResValue = findResValue(value, resValue.isFramework());
-
-        // if the value did not reference anything, then we simply return the input value
-        if (resolvedResValue == null) {
-            return resValue;
-        }
-
-        // detect potential loop due to mishandled namespace in attributes
-        if (resValue == resolvedResValue) {
-            if (mLogger != null) {
-                mLogger.error(LayoutLog.TAG_BROKEN,
-                        String.format("Potential stackoverflow trying to resolve '%s'. Render may not be accurate.", value),
-                        null);
-            }
-            return resValue;
-        }
-
-        // otherwise, we attempt to resolve this new value as well
-        return resolveResValue(resolvedResValue);
-    }
-
-    // ---- Private helper methods.
-
-    /**
-     * Searches for, and returns a {@link ResourceValue} by its name, and type.
-     * @param resType the type of the resource
-     * @param resName  the name of the resource
-     * @param frameworkOnly if <code>true</code>, the method does not search in the
-     * project resources
-     */
-    private ResourceValue findResValue(ResourceType resType, String resName,
-            boolean frameworkOnly) {
-        // map of ResouceValue for the given type
-        Map<String, ResourceValue> typeMap;
-
-        // if allowed, search in the project resources first.
-        if (frameworkOnly == false) {
-            typeMap = mProjectResources.get(resType);
-            ResourceValue item = typeMap.get(resName);
-            if (item != null) {
-                return item;
-            }
-        }
-
-        // now search in the framework resources.
-        typeMap = mFrameworkResources.get(resType);
-        ResourceValue item = typeMap.get(resName);
-        if (item != null) {
-            return item;
-        }
-
-        // if it was not found and the type is an id, it is possible that the ID was
-        // generated dynamically when compiling the framework resources.
-        // Look for it in the R map.
-        if (mFrameworkProvider != null && resType == ResourceType.ID) {
-            if (mFrameworkProvider.getId(resType, resName) != null) {
-                return new ResourceValue(resType, resName, true);
-            }
-        }
-
-        // didn't find the resource anywhere.
-        if (mLogger != null) {
-            mLogger.warning(LayoutLog.TAG_RESOURCES_RESOLVE,
-                    "Couldn't resolve resource @" +
-                    (frameworkOnly ? "android:" : "") + resType + "/" + resName,
-                    new ResourceValue(resType, resName, frameworkOnly));
-        }
-        return null;
-    }
-
-    private ResourceValue getResource(ResourceType resourceType, String resourceName,
-            Map<ResourceType, Map<String, ResourceValue>> resourceRepository) {
-        Map<String, ResourceValue> typeMap = resourceRepository.get(resourceType);
-        if (typeMap != null) {
-            ResourceValue item = typeMap.get(resourceName);
-            if (item != null) {
-                item = resolveResValue(item);
-                return item;
-            }
-        }
-
-        // didn't find the resource anywhere.
-        return null;
-
-    }
-
-    /**
-     * Compute style information from the given list of style for the project and framework.
-     * @param themeName the name of the current theme.
-     * @param isProjectTheme Is this a project theme?
-     */
-    private void computeStyleMaps(String themeName, boolean isProjectTheme) {
-        mThemeName = themeName;
-        mIsProjectTheme = isProjectTheme;
-        Map<String, ResourceValue> projectStyleMap = mProjectResources.get(ResourceType.STYLE);
-        Map<String, ResourceValue> frameworkStyleMap = mFrameworkResources.get(ResourceType.STYLE);
-
-        // first, get the theme
-        ResourceValue theme = null;
-
-        // project theme names have been prepended with a *
-        if (isProjectTheme) {
-            theme = projectStyleMap.get(themeName);
-        } else {
-            theme = frameworkStyleMap.get(themeName);
-        }
-
-        if (theme instanceof StyleResourceValue) {
-            // compute the inheritance map for both the project and framework styles
-            computeStyleInheritance(projectStyleMap.values(), projectStyleMap,
-                    frameworkStyleMap);
-
-            // Compute the style inheritance for the framework styles/themes.
-            // Since, for those, the style parent values do not contain 'android:'
-            // we want to force looking in the framework style only to avoid using
-            // similarly named styles from the project.
-            // To do this, we pass null in lieu of the project style map.
-            computeStyleInheritance(frameworkStyleMap.values(), null /*inProjectStyleMap */,
-                    frameworkStyleMap);
-
-            mTheme = (StyleResourceValue) theme;
-        }
-    }
-
-
-
-    /**
-     * Compute the parent style for all the styles in a given list.
-     * @param styles the styles for which we compute the parent.
-     * @param inProjectStyleMap the map of project styles.
-     * @param inFrameworkStyleMap the map of framework styles.
-     * @param outInheritanceMap the map of style inheritance. This is filled by the method.
-     */
-    private void computeStyleInheritance(Collection<ResourceValue> styles,
-            Map<String, ResourceValue> inProjectStyleMap,
-            Map<String, ResourceValue> inFrameworkStyleMap) {
-        for (ResourceValue value : styles) {
-            if (value instanceof StyleResourceValue) {
-                StyleResourceValue style = (StyleResourceValue)value;
-                StyleResourceValue parentStyle = null;
-
-                // first look for a specified parent.
-                String parentName = style.getParentStyle();
-
-                // no specified parent? try to infer it from the name of the style.
-                if (parentName == null) {
-                    parentName = getParentName(value.getName());
-                }
-
-                if (parentName != null) {
-                    parentStyle = getStyle(parentName, inProjectStyleMap, inFrameworkStyleMap);
-
-                    if (parentStyle != null) {
-                        mStyleInheritanceMap.put(style, parentStyle);
-                    }
-                }
-            }
-        }
-    }
-
-
-    /**
-     * Computes the name of the parent style, or <code>null</code> if the style is a root style.
-     */
-    private String getParentName(String styleName) {
-        int index = styleName.lastIndexOf('.');
-        if (index != -1) {
-            return styleName.substring(0, index);
-        }
-
-        return null;
-    }
-
-    /**
-     * Searches for and returns the {@link StyleResourceValue} from a given name.
-     * <p/>The format of the name can be:
-     * <ul>
-     * <li>[android:]&lt;name&gt;</li>
-     * <li>[android:]style/&lt;name&gt;</li>
-     * <li>@[android:]style/&lt;name&gt;</li>
-     * </ul>
-     * @param parentName the name of the style.
-     * @param inProjectStyleMap the project style map. Can be <code>null</code>
-     * @param inFrameworkStyleMap the framework style map.
-     * @return The matching {@link StyleResourceValue} object or <code>null</code> if not found.
-     */
-    private StyleResourceValue getStyle(String parentName,
-            Map<String, ResourceValue> inProjectStyleMap,
-            Map<String, ResourceValue> inFrameworkStyleMap) {
-        boolean frameworkOnly = false;
-
-        String name = parentName;
-
-        // remove the useless @ if it's there
-        if (name.startsWith(PREFIX_RESOURCE_REF)) {
-            name = name.substring(PREFIX_RESOURCE_REF.length());
-        }
-
-        // check for framework identifier.
-        if (name.startsWith(PREFIX_ANDROID)) {
-            frameworkOnly = true;
-            name = name.substring(PREFIX_ANDROID.length());
-        }
-
-        // at this point we could have the format <type>/<name>. we want only the name as long as
-        // the type is style.
-        if (name.startsWith(REFERENCE_STYLE)) {
-            name = name.substring(REFERENCE_STYLE.length());
-        } else if (name.indexOf('/') != -1) {
-            return null;
-        }
-
-        ResourceValue parent = null;
-
-        // if allowed, search in the project resources.
-        if (frameworkOnly == false && inProjectStyleMap != null) {
-            parent = inProjectStyleMap.get(name);
-        }
-
-        // if not found, then look in the framework resources.
-        if (parent == null) {
-            parent = inFrameworkStyleMap.get(name);
-        }
-
-        // make sure the result is the proper class type and return it.
-        if (parent instanceof StyleResourceValue) {
-            return (StyleResourceValue)parent;
-        }
-
-        if (mLogger != null) {
-            mLogger.error(LayoutLog.TAG_RESOURCES_RESOLVE,
-                    String.format("Unable to resolve parent style name: %s", parentName),
-                    null /*data*/);
-        }
-
-        return null;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/ScanningContext.java b/sdk_common/src/com/android/ide/common/resources/ScanningContext.java
deleted file mode 100644
index 43561e8..0000000
--- a/sdk_common/src/com/android/ide/common/resources/ScanningContext.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 com.android.ide.common.resources;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A {@link ScanningContext} keeps track of state during a resource file scan,
- * such as any parsing errors encountered, whether Android ids have changed, and
- * so on.
- */
-public class ScanningContext {
-    protected final ResourceRepository mRepository;
-    private boolean mNeedsFullAapt;
-    private List<String> mErrors = null;
-
-    /**
-     * Constructs a new {@link ScanningContext}
-     *
-     * @param repository the associated resource repository
-     */
-    public ScanningContext(@NonNull ResourceRepository repository) {
-        super();
-        mRepository = repository;
-    }
-
-    /**
-     * Returns a list of errors encountered during scanning
-     *
-     * @return a list of errors encountered during scanning (or null)
-     */
-    @Nullable
-    public List<String> getErrors() {
-        return mErrors;
-    }
-
-    /**
-     * Adds the given error to the scanning context. The error should use the
-     * same syntax as real aapt error messages such that the aapt parser can
-     * properly detect the filename, line number, etc.
-     *
-     * @param error the error message, including file name and line number at
-     *            the beginning
-     */
-    public void addError(@NonNull String error) {
-        if (mErrors == null) {
-            mErrors = new ArrayList<String>();
-        }
-        mErrors.add(error);
-    }
-
-    /**
-     * Returns the repository associated with this scanning context
-     *
-     * @return the associated repository, never null
-     */
-    @NonNull
-    public ResourceRepository getRepository() {
-        return mRepository;
-    }
-
-    /**
-     * Marks that a full aapt compilation of the resources is necessary because it has
-     * detected a change that cannot be incrementally handled.
-     */
-    protected void requestFullAapt() {
-        mNeedsFullAapt = true;
-    }
-
-    /**
-     * Returns whether this repository has been marked as "dirty"; if one or
-     * more of the constituent files have declared that the resource item names
-     * that they provide have changed.
-     *
-     * @return true if a full aapt compilation is required
-     */
-    public boolean needsFullAapt() {
-        return mNeedsFullAapt;
-    }
-
-    /**
-     * Asks the context to check whether the given attribute name and value is valid
-     * in this context.
-     *
-     * @param uri the XML namespace URI
-     * @param name the attribute local name
-     * @param value the attribute value
-     * @return true if the attribute is valid
-     */
-    public boolean checkValue(@Nullable String uri, @NonNull String name, @NonNull String value) {
-        return true;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/SingleResourceFile.java b/sdk_common/src/com/android/ide/common/resources/SingleResourceFile.java
deleted file mode 100644
index 8e394d3..0000000
--- a/sdk_common/src/com/android/ide/common/resources/SingleResourceFile.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import static com.android.SdkConstants.DOT_XML;
-
-import com.android.ide.common.rendering.api.DensityBasedResourceValue;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.configuration.DensityQualifier;
-import com.android.io.IAbstractFile;
-import com.android.resources.FolderTypeRelationship;
-import com.android.resources.ResourceType;
-import com.android.utils.SdkUtils;
-
-import java.util.Collection;
-import java.util.List;
-
-import javax.xml.parsers.SAXParserFactory;
-
-/**
- * Represents a resource file describing a single resource.
- * <p/>
- * This is typically an XML file inside res/anim, res/layout, or res/menu or an image file
- * under res/drawable.
- */
-public class SingleResourceFile extends ResourceFile {
-
-    private final static SAXParserFactory sParserFactory = SAXParserFactory.newInstance();
-    static {
-        sParserFactory.setNamespaceAware(true);
-    }
-
-    private final String mResourceName;
-    private final ResourceType mType;
-    private ResourceValue mValue;
-
-    public SingleResourceFile(IAbstractFile file, ResourceFolder folder) {
-        super(file, folder);
-
-        // we need to infer the type of the resource from the folder type.
-        // This is easy since this is a single Resource file.
-        List<ResourceType> types = FolderTypeRelationship.getRelatedResourceTypes(folder.getType());
-        mType = types.get(0);
-
-        // compute the resource name
-        mResourceName = getResourceName(mType);
-
-        // test if there's a density qualifier associated with the resource
-        DensityQualifier qualifier = folder.getConfiguration().getDensityQualifier();
-
-        if (qualifier == null) {
-            mValue = new ResourceValue(mType, getResourceName(mType),
-                    file.getOsLocation(), isFramework());
-        } else {
-            mValue = new DensityBasedResourceValue(
-                    mType,
-                    getResourceName(mType),
-                    file.getOsLocation(),
-                    qualifier.getValue(),
-                    isFramework());
-        }
-    }
-
-    @Override
-    protected void load(ScanningContext context) {
-        // get a resource item matching the given type and name
-        ResourceItem item = getRepository().getResourceItem(mType, mResourceName);
-
-        // add this file to the list of files generating this resource item.
-        item.add(this);
-
-        // Ask for an ID refresh since we're adding an item that will generate an ID
-        context.requestFullAapt();
-    }
-
-    @Override
-    protected void update(ScanningContext context) {
-        // when this happens, nothing needs to be done since the file only generates
-        // a single resources that doesn't actually change (its content is the file path)
-
-        // However, we should check for newly introduced errors
-        // Parse the file and look for @+id/ entries
-        validateAttributes(context);
-    }
-
-    @Override
-    protected void dispose(ScanningContext context) {
-        // only remove this file from the existing ResourceItem.
-        getFolder().getRepository().removeFile(mType, this);
-
-        // Ask for an ID refresh since we're removing an item that previously generated an ID
-        context.requestFullAapt();
-
-        // don't need to touch the content, it'll get reclaimed as this objects disappear.
-        // In the mean time other objects may need to access it.
-    }
-
-    @Override
-    public Collection<ResourceType> getResourceTypes() {
-        return FolderTypeRelationship.getRelatedResourceTypes(getFolder().getType());
-    }
-
-    @Override
-    public boolean hasResources(ResourceType type) {
-        return FolderTypeRelationship.match(type, getFolder().getType());
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see com.android.ide.eclipse.editors.resources.manager.ResourceFile#getValue(com.android.ide.eclipse.common.resources.ResourceType, java.lang.String)
-     *
-     * This particular implementation does not care about the type or name since a
-     * SingleResourceFile represents a file generating only one resource.
-     * The value returned is the full absolute path of the file in OS form.
-     */
-    @Override
-    public ResourceValue getValue(ResourceType type, String name) {
-        return mValue;
-    }
-
-    /**
-     * Returns the name of the resources.
-     */
-    private String getResourceName(ResourceType type) {
-        // get the name from the filename.
-        String name = getFile().getName();
-
-        int pos = name.indexOf('.');
-        if (pos != -1) {
-            name = name.substring(0, pos);
-        }
-
-        return name;
-    }
-
-    /**
-     * Validates the associated resource file to make sure the attribute references are valid
-     *
-     * @return true if parsing succeeds and false if it fails
-     */
-    private boolean validateAttributes(ScanningContext context) {
-        // We only need to check if it's a non-framework file (and an XML file; skip .png's)
-        if (!isFramework() && SdkUtils.endsWith(getFile().getName(), DOT_XML)) {
-            ValidatingResourceParser parser = new ValidatingResourceParser(context, false);
-            try {
-                IAbstractFile file = getFile();
-                return parser.parse(file.getOsLocation(), file.getContents());
-            } catch (Exception e) {
-                context.needsFullAapt();
-            }
-
-            return false;
-        }
-
-        return true;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/ValidatingResourceParser.java b/sdk_common/src/com/android/ide/common/resources/ValidatingResourceParser.java
deleted file mode 100644
index b477b8f..0000000
--- a/sdk_common/src/com/android/ide/common/resources/ValidatingResourceParser.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import com.android.annotations.NonNull;
-import com.google.common.io.Closeables;
-
-import org.kxml2.io.KXmlParser;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.BufferedInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Parser for scanning an XML resource file and validating all framework
- * attribute references in it. If an error is found, the associated context
- * is marked as needing a full AAPT run.
- */
-public class ValidatingResourceParser {
-    private final boolean mIsFramework;
-    private ScanningContext mContext;
-
-    /**
-     * Creates a new {@link ValidatingResourceParser}
-     *
-     * @param context a context object with state for the current update, such
-     *            as a place to stash errors encountered
-     * @param isFramework true if scanning a framework resource
-     */
-    public ValidatingResourceParser(
-            @NonNull ScanningContext context,
-            boolean isFramework) {
-        mContext = context;
-        mIsFramework = isFramework;
-    }
-
-    /**
-     * Parse the given input and return false if it contains errors, <b>or</b> if
-     * the context is already tagged as needing a full aapt run.
-     *
-     * @param path the full OS path to the file being parsed
-     * @param input the input stream of the XML to be parsed (will be closed by this method)
-     * @return true if parsing succeeds and false if it fails
-     * @throws IOException if reading the contents fails
-     */
-    public boolean parse(final String path, InputStream input)
-            throws IOException {
-        // No need to validate framework files
-        if (mIsFramework) {
-            Closeables.closeQuietly(input);
-            return true;
-        }
-        if (mContext.needsFullAapt()) {
-            Closeables.closeQuietly(input);
-            return false;
-        }
-
-        KXmlParser parser = new KXmlParser();
-        try {
-            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
-
-            if (input instanceof FileInputStream) {
-                input = new BufferedInputStream(input);
-            }
-            parser.setInput(input, "UTF-8"); //$NON-NLS-1$
-
-            return parse(path, parser);
-        } catch (XmlPullParserException e) {
-            String message = e.getMessage();
-
-            // Strip off position description
-            int index = message.indexOf("(position:"); //$NON-NLS-1$ (Hardcoded in KXml)
-            if (index != -1) {
-                message = message.substring(0, index);
-            }
-
-            String error = String.format("%1$s:%2$d: Error: %3$s", //$NON-NLS-1$
-                    path, parser.getLineNumber(), message);
-            mContext.addError(error);
-            return false;
-        } catch (RuntimeException e) {
-            // Some exceptions are thrown by the KXmlParser that are not XmlPullParserExceptions,
-            // such as this one:
-            //    java.lang.RuntimeException: Undefined Prefix: w in org.kxml2.io.KXmlParser@...
-            //        at org.kxml2.io.KXmlParser.adjustNsp(Unknown Source)
-            //        at org.kxml2.io.KXmlParser.parseStartTag(Unknown Source)
-            String message = e.getMessage();
-            String error = String.format("%1$s:%2$d: Error: %3$s", //$NON-NLS-1$
-                    path, parser.getLineNumber(), message);
-            mContext.addError(error);
-            return false;
-        } finally {
-            Closeables.closeQuietly(input);
-        }
-    }
-
-    private boolean parse(String path, KXmlParser parser)
-            throws XmlPullParserException, IOException {
-        boolean checkForErrors = !mIsFramework && !mContext.needsFullAapt();
-
-        while (true) {
-            int event = parser.next();
-            if (event == XmlPullParser.START_TAG) {
-                for (int i = 0, n = parser.getAttributeCount(); i < n; i++) {
-                    String attribute = parser.getAttributeName(i);
-                    String value = parser.getAttributeValue(i);
-                    assert value != null : attribute;
-
-                    if (checkForErrors) {
-                        String uri = parser.getAttributeNamespace(i);
-                        if (!mContext.checkValue(uri, attribute, value)) {
-                            mContext.requestFullAapt();
-                            return false;
-                        }
-                    }
-                }
-            } else if (event == XmlPullParser.END_DOCUMENT) {
-                break;
-            }
-        }
-
-        return true;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/ValueResourceParser.java b/sdk_common/src/com/android/ide/common/resources/ValueResourceParser.java
deleted file mode 100644
index aa1f4b8..0000000
--- a/sdk_common/src/com/android/ide/common/resources/ValueResourceParser.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import static com.android.SdkConstants.AMP_ENTITY;
-import static com.android.SdkConstants.LT_ENTITY;
-
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.rendering.api.AttrResourceValue;
-import com.android.ide.common.rendering.api.DeclareStyleableResourceValue;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.rendering.api.StyleResourceValue;
-import com.android.resources.ResourceType;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * SAX handler to parser value resource files.
- */
-public final class ValueResourceParser extends DefaultHandler {
-
-    // TODO: reuse definitions from somewhere else.
-    private final static String NODE_RESOURCES = "resources";
-    private final static String NODE_ITEM = "item";
-    private final static String ATTR_NAME = "name";
-    private final static String ATTR_TYPE = "type";
-    private final static String ATTR_PARENT = "parent";
-    private final static String ATTR_VALUE = "value";
-
-    private final static String DEFAULT_NS_PREFIX = "android:";
-    private final static int DEFAULT_NS_PREFIX_LEN = DEFAULT_NS_PREFIX.length();
-
-    public interface IValueResourceRepository {
-        void addResourceValue(ResourceValue value);
-        boolean hasResourceValue(ResourceType type, String name);
-    }
-
-    private boolean inResources = false;
-    private int mDepth = 0;
-    private ResourceValue mCurrentValue = null;
-    private StyleResourceValue mCurrentStyle = null;
-    private DeclareStyleableResourceValue mCurrentDeclareStyleable = null;
-    private AttrResourceValue mCurrentAttr;
-    private IValueResourceRepository mRepository;
-    private final boolean mIsFramework;
-
-    public ValueResourceParser(IValueResourceRepository repository, boolean isFramework) {
-        mRepository = repository;
-        mIsFramework = isFramework;
-    }
-
-    @Override
-    public void endElement(String uri, String localName, String qName) throws SAXException {
-        if (mCurrentValue != null) {
-            mCurrentValue.setValue(unescapeResourceString(mCurrentValue.getValue(), false, true));
-        }
-
-        if (inResources && qName.equals(NODE_RESOURCES)) {
-            inResources = false;
-        } else if (mDepth == 2) {
-            mCurrentValue = null;
-            mCurrentStyle = null;
-            mCurrentDeclareStyleable = null;
-            mCurrentAttr = null;
-        } else if (mDepth == 3) {
-            mCurrentValue = null;
-            if (mCurrentDeclareStyleable != null) {
-                mCurrentAttr = null;
-            }
-        }
-
-        mDepth--;
-        super.endElement(uri, localName, qName);
-    }
-
-    @Override
-    public void startElement(String uri, String localName, String qName, Attributes attributes)
-            throws SAXException {
-        try {
-            mDepth++;
-            if (inResources == false && mDepth == 1) {
-                if (qName.equals(NODE_RESOURCES)) {
-                    inResources = true;
-                }
-            } else if (mDepth == 2 && inResources == true) {
-                ResourceType type = getType(qName, attributes);
-
-                if (type != null) {
-                    // get the resource name
-                    String name = attributes.getValue(ATTR_NAME);
-                    if (name != null) {
-                        switch (type) {
-                            case STYLE:
-                                String parent = attributes.getValue(ATTR_PARENT);
-                                mCurrentStyle = new StyleResourceValue(type, name, parent,
-                                        mIsFramework);
-                                mRepository.addResourceValue(mCurrentStyle);
-                                break;
-                            case DECLARE_STYLEABLE:
-                                mCurrentDeclareStyleable = new DeclareStyleableResourceValue(
-                                        type, name, mIsFramework);
-                                mRepository.addResourceValue(mCurrentDeclareStyleable);
-                                break;
-                            case ATTR:
-                                mCurrentAttr = new AttrResourceValue(type, name, mIsFramework);
-                                mRepository.addResourceValue(mCurrentAttr);
-                                break;
-                            default:
-                                mCurrentValue = new ResourceValue(type, name, mIsFramework);
-                                mRepository.addResourceValue(mCurrentValue);
-                                break;
-                        }
-                    }
-                }
-            } else if (mDepth == 3) {
-                // get the resource name
-                String name = attributes.getValue(ATTR_NAME);
-                if (name != null) {
-
-                    if (mCurrentStyle != null) {
-                        // is the attribute in the android namespace?
-                        boolean isFrameworkAttr = mIsFramework;
-                        if (name.startsWith(DEFAULT_NS_PREFIX)) {
-                            name = name.substring(DEFAULT_NS_PREFIX_LEN);
-                            isFrameworkAttr = true;
-                        }
-
-                        mCurrentValue = new ResourceValue(null, name, mIsFramework);
-                        mCurrentStyle.addValue(mCurrentValue, isFrameworkAttr);
-                    } else if (mCurrentDeclareStyleable != null) {
-                        // is the attribute in the android namespace?
-                        boolean isFramework = mIsFramework;
-                        if (name.startsWith(DEFAULT_NS_PREFIX)) {
-                            name = name.substring(DEFAULT_NS_PREFIX_LEN);
-                            isFramework = true;
-                        }
-
-                        mCurrentAttr = new AttrResourceValue(ResourceType.ATTR, name, isFramework);
-                        mCurrentDeclareStyleable.addValue(mCurrentAttr);
-
-                        // also add it to the repository.
-                        mRepository.addResourceValue(mCurrentAttr);
-
-                    } else if (mCurrentAttr != null) {
-                        // get the enum/flag value
-                        String value = attributes.getValue(ATTR_VALUE);
-
-                        try {
-                            // Integer.decode/parseInt can't deal with hex value > 0x7FFFFFFF so we
-                            // use Long.decode instead.
-                            mCurrentAttr.addValue(name, (int)(long)Long.decode(value));
-                        } catch (NumberFormatException e) {
-                            // pass, we'll just ignore this value
-                        }
-
-                    }
-                }
-            } else if (mDepth == 4 && mCurrentAttr != null) {
-                // get the enum/flag name
-                String name = attributes.getValue(ATTR_NAME);
-                String value = attributes.getValue(ATTR_VALUE);
-
-                try {
-                    // Integer.decode/parseInt can't deal with hex value > 0x7FFFFFFF so we
-                    // use Long.decode instead.
-                    mCurrentAttr.addValue(name, (int)(long)Long.decode(value));
-                } catch (NumberFormatException e) {
-                    // pass, we'll just ignore this value
-                }
-            }
-        } finally {
-            super.startElement(uri, localName, qName, attributes);
-        }
-    }
-
-    private ResourceType getType(String qName, Attributes attributes) {
-        String typeValue;
-
-        // if the node is <item>, we get the type from the attribute "type"
-        if (NODE_ITEM.equals(qName)) {
-            typeValue = attributes.getValue(ATTR_TYPE);
-        } else {
-            // the type is the name of the node.
-            typeValue = qName;
-        }
-
-        ResourceType type = ResourceType.getEnum(typeValue);
-        return type;
-    }
-
-
-    @Override
-    public void characters(char[] ch, int start, int length) throws SAXException {
-        if (mCurrentValue != null) {
-            String value = mCurrentValue.getValue();
-            if (value == null) {
-                mCurrentValue.setValue(new String(ch, start, length));
-            } else {
-                mCurrentValue.setValue(value + new String(ch, start, length));
-            }
-        }
-    }
-
-    /**
-     * Replaces escapes in an XML resource string with the actual characters,
-     * performing unicode substitutions (replacing any {@code \\uNNNN} references in the
-     * given string with the corresponding unicode characters), etc.
-     *
-     *
-     *
-     * @param s the string to unescape
-     * @param escapeEntities XML entities
-     * @param trim whether surrounding space and quotes should be trimmed
-     * @return the string with the escape characters removed and expanded
-     */
-    @Nullable
-    public static String unescapeResourceString(
-            @Nullable String s,
-            boolean escapeEntities, boolean trim) {
-        if (s == null) {
-            return null;
-        }
-
-        // Trim space surrounding optional quotes
-        int i = 0;
-        int n = s.length();
-        if (trim) {
-            while (i < n) {
-                char c = s.charAt(i);
-                if (!Character.isWhitespace(c)) {
-                    break;
-                }
-                i++;
-            }
-            while (n > i) {
-                char c = s.charAt(n - 1);
-                if (!Character.isWhitespace(c)) {
-                    //See if this was a \, and if so, see whether it was escaped
-                    if (n < s.length() && isEscaped(s, n)) {
-                        n++;
-                    }
-                    break;
-                }
-                n--;
-            }
-
-            // Trim surrounding quotes. Note that there can be *any* number of these, and
-            // the left side and right side do not have to match; e.g. you can have
-            //    """"f"" => f
-            int quoteStart = i;
-            int quoteEnd = n;
-            while (i < n) {
-                char c = s.charAt(i);
-                if (c != '"') {
-                    break;
-                }
-                i++;
-            }
-            // Searching backwards is slightly more complicated; make sure we don't trim
-            // quotes that have been escaped.
-            while (n > i) {
-                char c = s.charAt(n - 1);
-                if (c != '"') {
-                    if (n < s.length() && isEscaped(s, n)) {
-                        n++;
-                    }
-                    break;
-                }
-                n--;
-            }
-            if (n == i) {
-                return ""; //$NON-NLS-1$
-            }
-
-            // Only trim leading spaces if we didn't already process a leading quote:
-            if (i == quoteStart) {
-                while (i < n) {
-                    char c = s.charAt(i);
-                    if (!Character.isWhitespace(c)) {
-                        break;
-                    }
-                    i++;
-                }
-            }
-            // Only trim trailing spaces if we didn't already process a trailing quote:
-            if (n == quoteEnd) {
-                while (n > i) {
-                    char c = s.charAt(n - 1);
-                    if (!Character.isWhitespace(c)) {
-                        //See if this was a \, and if so, see whether it was escaped
-                        if (n < s.length() && isEscaped(s, n)) {
-                            n++;
-                        }
-                        break;
-                    }
-                    n--;
-                }
-            }
-            if (n == i) {
-                return ""; //$NON-NLS-1$
-            }
-        }
-
-        // If no surrounding whitespace and no escape characters, no need to do any
-        // more work
-        if (i == 0 && n == s.length() && s.indexOf('\\') == -1
-                && (!escapeEntities || s.indexOf('&') == -1)) {
-            return s;
-        }
-
-        StringBuilder sb = new StringBuilder(n - i);
-        for (; i < n; i++) {
-            char c = s.charAt(i);
-            if (c == '\\' && i < n - 1) {
-                char next = s.charAt(i + 1);
-                // Unicode escapes
-                if (next == 'u' && i < n - 5) { // case sensitive
-                    String hex = s.substring(i + 2, i + 6);
-                    try {
-                        int unicodeValue = Integer.parseInt(hex, 16);
-                        sb.append((char) unicodeValue);
-                        i += 5;
-                        continue;
-                    } catch (NumberFormatException e) {
-                        // Invalid escape: Just proceed to literally transcribe it
-                        sb.append(c);
-                    }
-                } else if (next == 'n') {
-                    sb.append('\n');
-                    i++;
-                } else if (next == 't') {
-                    sb.append('\t');
-                    i++;
-                } else {
-                    sb.append(next);
-                    i++;
-                    continue;
-                }
-            } else {
-                if (c == '&' && escapeEntities) {
-                    if (s.regionMatches(true, i, LT_ENTITY, 0, LT_ENTITY.length())) {
-                        sb.append('<');
-                        i += LT_ENTITY.length() - 1;
-                        continue;
-                    } else if (s.regionMatches(true, i, AMP_ENTITY, 0, AMP_ENTITY.length())) {
-                        sb.append('&');
-                        i += AMP_ENTITY.length() - 1;
-                        continue;
-                    }
-                }
-                sb.append(c);
-            }
-        }
-        s = sb.toString();
-
-        return s;
-    }
-
-    /**
-     * Returns true if the character at the given offset in the string is escaped
-     * (the previous character is a \, and that character isn't itself an escaped \)
-     *
-     * @param s the string
-     * @param index the index of the character in the string to check
-     * @return true if the character is escaped
-     */
-    @VisibleForTesting
-    static boolean isEscaped(String s, int index) {
-        if (index == 0 || index == s.length()) {
-            return false;
-        }
-        int prevPos = index - 1;
-        char prev = s.charAt(prevPos);
-        if (prev != '\\') {
-            return false;
-        }
-        // The character *may* be escaped; not sure if the \ we ran into is
-        // an escape character, or an escaped backslash; we have to search backwards
-        // to be certain.
-        int j = prevPos - 1;
-        while (j >= 0) {
-            if (s.charAt(j) != '\\') {
-                break;
-            }
-            j--;
-        }
-        // If we passed an odd number of \'s, the space is escaped
-        return (prevPos - j) % 2 == 1;
-    }
-
-    /**
-     * Escape a string value to be placed in a string resource file such that it complies with
-     * the escaping rules described here:
-     *   http://developer.android.com/guide/topics/resources/string-resource.html
-     * More examples of the escaping rules can be found here:
-     *   http://androidcookbook.com/Recipe.seam?recipeId=2219&recipeFrom=ViewTOC
-     * This method assumes that the String is not escaped already.
-     *
-     * Rules:
-     * <ul>
-     * <li>Double quotes are needed if string starts or ends with at least one space.
-     * <li>{@code @, ?} at beginning of string have to be escaped with a backslash.
-     * <li>{@code ', ", \} have to be escaped with a backslash.
-     * <li>{@code <, >, &} have to be replaced by their predefined xml entity.
-     * <li>{@code \n, \t} have to be replaced by a backslash and the appropriate character.
-     * </ul>
-     * @param s the string to be escaped
-     * @return the escaped string as it would appear in the XML text in a values file
-     */
-    public static String escapeResourceString(String s) {
-        int n = s.length();
-        if (n == 0) {
-            return "";
-        }
-
-        StringBuilder sb = new StringBuilder(s.length() * 2);
-        boolean hasSpace = s.charAt(0) == ' ' || s.charAt(n - 1) == ' ';
-
-        if (hasSpace) {
-            sb.append('"');
-        } else if (s.charAt(0) == '@' || s.charAt(0) == '?') {
-            sb.append('\\');
-        }
-
-        for (int i = 0; i < n; ++i) {
-            char c = s.charAt(i);
-            switch (c) {
-                case '\'':
-                    if (!hasSpace) {
-                        sb.append('\\');
-                    }
-                    sb.append(c);
-                    break;
-                case '"':
-                case '\\':
-                    sb.append('\\');
-                    sb.append(c);
-                    break;
-                case '<':
-                    sb.append(LT_ENTITY);
-                    break;
-                case '&':
-                    sb.append(AMP_ENTITY);
-                    break;
-                case '\n':
-                    sb.append("\\n"); //$NON-NLS-1$
-                    break;
-                case '\t':
-                    sb.append("\\t"); //$NON-NLS-1$
-                    break;
-                default:
-                    sb.append(c);
-                    break;
-            }
-        }
-
-        if (hasSpace) {
-            sb.append('"');
-        }
-
-        return sb.toString();
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/Configurable.java b/sdk_common/src/com/android/ide/common/resources/configuration/Configurable.java
deleted file mode 100644
index 5e7f910..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/Configurable.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-
-/**
- * An object that is associated with a {@link FolderConfiguration}.
- */
-public interface Configurable {
-    /**
-     * Returns the {@link FolderConfiguration} for this object.
-     */
-    public FolderConfiguration getConfiguration();
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/CountryCodeQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/CountryCodeQualifier.java
deleted file mode 100644
index eb7cc0d..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/CountryCodeQualifier.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Resource Qualifier for Mobile Country Code.
- */
-public final class CountryCodeQualifier extends ResourceQualifier {
-    /** Default pixel density value. This means the property is not set. */
-    private final static int DEFAULT_CODE = -1;
-
-    private final static Pattern sCountryCodePattern = Pattern.compile("^mcc(\\d{3})$");//$NON-NLS-1$
-
-    private final int mCode;
-
-    public static final String NAME = "Mobile Country Code";
-
-    /**
-     * Creates and returns a qualifier from the given folder segment. If the segment is incorrect,
-     * <code>null</code> is returned.
-     * @param segment the folder segment from which to create a qualifier.
-     * @return a new {@link CountryCodeQualifier} object or <code>null</code>
-     */
-    public static CountryCodeQualifier getQualifier(String segment) {
-        Matcher m = sCountryCodePattern.matcher(segment);
-        if (m.matches()) {
-            String v = m.group(1);
-
-            int code = -1;
-            try {
-                code = Integer.parseInt(v);
-            } catch (NumberFormatException e) {
-                // looks like the string we extracted wasn't a valid number.
-                return null;
-            }
-
-            CountryCodeQualifier qualifier = new CountryCodeQualifier(code);
-            return qualifier;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the folder name segment for the given value. This is equivalent to calling
-     * {@link #toString()} on a {@link CountryCodeQualifier} object.
-     * @param code the value of the qualifier, as returned by {@link #getCode()}.
-     */
-    public static String getFolderSegment(int code) {
-        if (code != DEFAULT_CODE && code >= 100 && code <=999) { // code is 3 digit.) {
-            return String.format("mcc%1$d", code); //$NON-NLS-1$
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    public CountryCodeQualifier() {
-        this(DEFAULT_CODE);
-    }
-
-    public CountryCodeQualifier(int code) {
-        mCode = code;
-    }
-
-    public int getCode() {
-        return mCode;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return "Country Code";
-    }
-
-    @Override
-    public int since() {
-        return 1;
-    }
-
-    @Override
-    public boolean isValid() {
-        return mCode != DEFAULT_CODE;
-    }
-
-    @Override
-    public boolean hasFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        CountryCodeQualifier qualifier = getQualifier(value);
-        if (qualifier != null) {
-            config.setCountryCodeQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean equals(Object qualifier) {
-        if (qualifier instanceof CountryCodeQualifier) {
-            return mCode == ((CountryCodeQualifier)qualifier).mCode;
-        }
-
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return mCode;
-    }
-
-    /**
-     * Returns the string used to represent this qualifier in the folder name.
-     */
-    @Override
-    public String getFolderSegment() {
-        return getFolderSegment(mCode);
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        if (mCode != DEFAULT_CODE) {
-            return String.format("MCC %1$d", mCode);
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return getShortDisplayValue();
-    }
-
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/DensityQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/DensityQualifier.java
deleted file mode 100644
index a9e4a01..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/DensityQualifier.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.Density;
-import com.android.resources.ResourceEnum;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Resource Qualifier for Screen Pixel Density.
- */
-public final class DensityQualifier extends EnumBasedResourceQualifier {
-    private final static Pattern sDensityLegacyPattern = Pattern.compile("^(\\d+)dpi$");//$NON-NLS-1$
-
-    public static final String NAME = "Density";
-
-    private Density mValue = Density.MEDIUM;
-
-    public DensityQualifier() {
-        // pass
-    }
-
-    public DensityQualifier(Density value) {
-        mValue = value;
-    }
-
-    public Density getValue() {
-        return mValue;
-    }
-
-    @Override
-    ResourceEnum getEnumValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return NAME;
-    }
-
-    @Override
-    public int since() {
-        return 4;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        Density density = Density.getEnum(value);
-        if (density == null) {
-
-            // attempt to read a legacy value.
-            Matcher m = sDensityLegacyPattern.matcher(value);
-            if (m.matches()) {
-                String v = m.group(1);
-
-                try {
-                    density = Density.getEnum(Integer.parseInt(v));
-                } catch (NumberFormatException e) {
-                    // looks like the string we extracted wasn't a valid number
-                    // which really shouldn't happen since the regexp would have failed.
-                }
-            }
-        }
-
-        if (density != null) {
-            DensityQualifier qualifier = new DensityQualifier();
-            qualifier.mValue = density;
-            config.setDensityQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean isMatchFor(ResourceQualifier qualifier) {
-        if (qualifier instanceof DensityQualifier) {
-            // as long as there's a density qualifier, it's always a match.
-            // The best match will be found later.
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean isBetterMatchThan(ResourceQualifier compareTo, ResourceQualifier reference) {
-        if (compareTo == null) {
-            return true;
-        }
-
-        DensityQualifier compareQ = (DensityQualifier)compareTo;
-        DensityQualifier referenceQ = (DensityQualifier)reference;
-
-        if (compareQ.mValue == referenceQ.mValue) {
-            // what we have is already the best possible match (exact match)
-            return false;
-        } else if (mValue == referenceQ.mValue) {
-            // got new exact value, this is the best!
-            return true;
-        } else {
-            // in all case we're going to prefer the higher dpi.
-            // if reference is high, we want highest dpi.
-            // if reference is medium, we'll prefer to scale down high dpi, than scale up low dpi
-            // if reference if low, we'll prefer to scale down high than medium (2:1 over 4:3)
-            return mValue.getDpiValue() > compareQ.mValue.getDpiValue();
-        }
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/DeviceConfigHelper.java b/sdk_common/src/com/android/ide/common/resources/configuration/DeviceConfigHelper.java
deleted file mode 100644
index 27eaa01..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/DeviceConfigHelper.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.annotations.Nullable;
-import com.android.resources.NightMode;
-import com.android.resources.UiMode;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.Hardware;
-import com.android.sdklib.devices.Screen;
-import com.android.sdklib.devices.State;
-
-public class DeviceConfigHelper {
-    /**
-     * Returns a {@link FolderConfiguration} based on the given state
-     *
-     * @param state
-     *            The {@link State} of the {@link Device} to base the
-     *            {@link FolderConfiguration} on. Can be null.
-     * @return A {@link FolderConfiguration} based on the given {@link State}.
-     *         If the given {@link State} is null, the result is also null;
-     */
-    @Nullable
-    public static FolderConfiguration getFolderConfig(@Nullable State state) {
-        if (state == null) {
-            return null;
-        }
-
-        Hardware hw = state.getHardware();
-
-        FolderConfiguration config = new FolderConfiguration();
-        config.createDefault();
-        Screen screen = hw.getScreen();
-        config.setDensityQualifier(new DensityQualifier(screen.getPixelDensity()));
-        config.setNavigationMethodQualifier(new NavigationMethodQualifier(hw.getNav()));
-        ScreenDimensionQualifier sdq;
-        if (screen.getXDimension() > screen.getYDimension()) {
-            sdq = new ScreenDimensionQualifier(screen.getXDimension(), screen.getYDimension());
-        } else {
-            sdq = new ScreenDimensionQualifier(screen.getYDimension(), screen.getXDimension());
-        }
-        config.setScreenDimensionQualifier(sdq);
-        config.setScreenRatioQualifier(new ScreenRatioQualifier(screen.getRatio()));
-        config.setScreenSizeQualifier(new ScreenSizeQualifier(screen.getSize()));
-        config.setTextInputMethodQualifier(new TextInputMethodQualifier(hw.getKeyboard()));
-        config.setTouchTypeQualifier(new TouchScreenQualifier(screen.getMechanism()));
-
-        config.setKeyboardStateQualifier(new KeyboardStateQualifier(state.getKeyState()));
-        config.setNavigationStateQualifier(new NavigationStateQualifier(state.getNavState()));
-        config.setScreenOrientationQualifier(
-            new ScreenOrientationQualifier(state.getOrientation()));
-
-        config.updateScreenWidthAndHeight();
-
-        // Setup some default qualifiers
-        config.setUiModeQualifier(new UiModeQualifier(UiMode.NORMAL));
-        config.setNightModeQualifier(new NightModeQualifier(NightMode.NOTNIGHT));
-        config.setCountryCodeQualifier(new CountryCodeQualifier());
-        config.setLanguageQualifier(new LanguageQualifier());
-        config.setNetworkCodeQualifier(new NetworkCodeQualifier());
-        config.setRegionQualifier(new RegionQualifier());
-        config.setVersionQualifier(new VersionQualifier());
-
-        return config;
-    }
-
-    /**
-     * Returns a {@link FolderConfiguration} based on the {@link State} given by
-     * the {@link Device} and the state name.
-     *
-     * @param d
-     *            The {@link Device} to base the {@link FolderConfiguration} on.
-     * @param stateName
-     *            The name of the state to base the {@link FolderConfiguration}
-     *            on.
-     * @return The {@link FolderConfiguration} based on the determined
-     *         {@link State}. If there is no {@link State} with the given state
-     *         name for the given device, null is returned.
-     */
-    @Nullable
-    public static FolderConfiguration getFolderConfig(Device d, String stateName) {
-        return getFolderConfig(d.getState(stateName));
-    }
-
-    /**
-     * Returns a {@link FolderConfiguration} based on the default {@link State}
-     * for the given {@link Device}.
-     *
-     * @param d
-     *            The {@link Device} to generate the {@link FolderConfiguration}
-     *            from.
-     * @return A {@link FolderConfiguration} based on the default {@link State}
-     *         for the given {@link Device}
-     */
-    public static FolderConfiguration getFolderConfig(Device d) {
-        return getFolderConfig(d.getDefaultState());
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/EnumBasedResourceQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/EnumBasedResourceQualifier.java
deleted file mode 100644
index 7bfda2d..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/EnumBasedResourceQualifier.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.ResourceEnum;
-
-/**
- * Base class for {@link ResourceQualifier} whose value is an {@link ResourceEnum}.
- *
- */
-abstract class EnumBasedResourceQualifier extends ResourceQualifier {
-
-    abstract ResourceEnum getEnumValue();
-
-    @Override
-    public boolean isValid() {
-        return getEnumValue() != null;
-    }
-
-    @Override
-    public boolean hasFakeValue() {
-        return getEnumValue().isFakeValue();
-    }
-
-    @Override
-    public boolean equals(Object qualifier) {
-        if (qualifier instanceof EnumBasedResourceQualifier) {
-            return getEnumValue() == ((EnumBasedResourceQualifier)qualifier).getEnumValue();
-        }
-
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        ResourceEnum value = getEnumValue();
-        if (value != null) {
-            return value.hashCode();
-        }
-
-        return 0;
-    }
-
-    /**
-     * Returns the string used to represent this qualifier in the folder name.
-     */
-    @Override
-    public final String getFolderSegment() {
-        ResourceEnum value = getEnumValue();
-        if (value != null) {
-            return value.getResourceValue();
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-
-    @Override
-    public String getShortDisplayValue() {
-        ResourceEnum value = getEnumValue();
-        if (value != null) {
-            return value.getShortDisplayValue();
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        ResourceEnum value = getEnumValue();
-        if (value != null) {
-            return value.getLongDisplayValue();
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/FolderConfiguration.java b/sdk_common/src/com/android/ide/common/resources/configuration/FolderConfiguration.java
deleted file mode 100644
index fc83359..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/FolderConfiguration.java
+++ /dev/null
@@ -1,946 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.SdkConstants;
-import com.android.resources.Density;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ScreenOrientation;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-
-/**
- * Represents the configuration for Resource Folders. All the properties have a default
- * value which means that the property is not set.
- */
-public final class FolderConfiguration implements Comparable<FolderConfiguration> {
-
-    private final static ResourceQualifier[] DEFAULT_QUALIFIERS;
-
-    static {
-        // get the default qualifiers.
-        FolderConfiguration defaultConfig = new FolderConfiguration();
-        defaultConfig.createDefault();
-        DEFAULT_QUALIFIERS = defaultConfig.getQualifiers();
-    }
-
-
-    private final ResourceQualifier[] mQualifiers = new ResourceQualifier[INDEX_COUNT];
-
-    private final static int INDEX_COUNTRY_CODE          = 0;
-    private final static int INDEX_NETWORK_CODE          = 1;
-    private final static int INDEX_LANGUAGE              = 2;
-    private final static int INDEX_REGION                = 3;
-    private final static int INDEX_LAYOUTDIR             = 4;
-    private final static int INDEX_SMALLEST_SCREEN_WIDTH = 5;
-    private final static int INDEX_SCREEN_WIDTH          = 6;
-    private final static int INDEX_SCREEN_HEIGHT         = 7;
-    private final static int INDEX_SCREEN_LAYOUT_SIZE    = 8;
-    private final static int INDEX_SCREEN_RATIO          = 9;
-    private final static int INDEX_SCREEN_ORIENTATION    = 10;
-    private final static int INDEX_UI_MODE               = 11;
-    private final static int INDEX_NIGHT_MODE            = 12;
-    private final static int INDEX_PIXEL_DENSITY         = 13;
-    private final static int INDEX_TOUCH_TYPE            = 14;
-    private final static int INDEX_KEYBOARD_STATE        = 15;
-    private final static int INDEX_TEXT_INPUT_METHOD     = 16;
-    private final static int INDEX_NAVIGATION_STATE      = 17;
-    private final static int INDEX_NAVIGATION_METHOD     = 18;
-    private final static int INDEX_SCREEN_DIMENSION      = 19;
-    private final static int INDEX_VERSION               = 20;
-    private final static int INDEX_COUNT                 = 21;
-
-    /**
-     * Creates a {@link FolderConfiguration} matching the folder segments.
-     * @param folderSegments The segments of the folder name. The first segments should contain
-     * the name of the folder
-     * @return a FolderConfiguration object, or null if the folder name isn't valid..
-     */
-    public static FolderConfiguration getConfig(String[] folderSegments) {
-        FolderConfiguration config = new FolderConfiguration();
-
-        // we are going to loop through the segments, and match them with the first
-        // available qualifier. If the segment doesn't match we try with the next qualifier.
-        // Because the order of the qualifier is fixed, we do not reset the first qualifier
-        // after each successful segment.
-        // If we run out of qualifier before processing all the segments, we fail.
-
-        int qualifierIndex = 0;
-        int qualifierCount = DEFAULT_QUALIFIERS.length;
-
-        for (int i = 1 ; i < folderSegments.length; i++) {
-            String seg = folderSegments[i];
-            if (seg.length() > 0) {
-                while (qualifierIndex < qualifierCount &&
-                        DEFAULT_QUALIFIERS[qualifierIndex].checkAndSet(seg, config) == false) {
-                    qualifierIndex++;
-                }
-
-                // if we reached the end of the qualifier we didn't find a matching qualifier.
-                if (qualifierIndex == qualifierCount) {
-                    return null;
-                }
-
-            } else {
-                return null;
-            }
-        }
-
-        return config;
-    }
-
-    /**
-     * Creates a {@link FolderConfiguration} matching the folder segments.
-     * @param folderSegments The segments of the folder name. The first segments should contain
-     * the name of the folder
-     * @return a FolderConfiguration object, or null if the folder name isn't valid..
-     * @see FolderConfiguration#getConfig(String[])
-     */
-    public static FolderConfiguration getConfig(Iterable<String>folderSegments) {
-        FolderConfiguration config = new FolderConfiguration();
-
-        // we are going to loop through the segments, and match them with the first
-        // available qualifier. If the segment doesn't match we try with the next qualifier.
-        // Because the order of the qualifier is fixed, we do not reset the first qualifier
-        // after each successful segment.
-        // If we run out of qualifier before processing all the segments, we fail.
-
-        int qualifierIndex = 0;
-        int qualifierCount = DEFAULT_QUALIFIERS.length;
-
-        Iterator<String> iterator = folderSegments.iterator();
-        if (iterator.hasNext()) {
-            // Skip the first segment: it should be just the base folder, such as "values" or
-            // "layout"
-            iterator.next();
-        }
-        while (iterator.hasNext()) {
-            String seg = iterator.next();
-            if (seg.length() > 0) {
-                while (qualifierIndex < qualifierCount &&
-                        DEFAULT_QUALIFIERS[qualifierIndex].checkAndSet(seg, config) == false) {
-                    qualifierIndex++;
-                }
-
-                // if we reached the end of the qualifier we didn't find a matching qualifier.
-                if (qualifierIndex == qualifierCount) {
-                    return null;
-                }
-
-            } else {
-                return null;
-            }
-        }
-
-        return config;
-    }
-
-    /**
-     * Returns the number of {@link ResourceQualifier} that make up a Folder configuration.
-     */
-    public static int getQualifierCount() {
-        return INDEX_COUNT;
-    }
-
-    /**
-     * Sets the config from the qualifiers of a given <var>config</var>.
-     * <p/>This is equivalent to <code>set(config, false)</code>
-     * @param config the configuration to set
-     *
-     * @see #set(FolderConfiguration, boolean)
-     */
-    public void set(FolderConfiguration config) {
-        set(config, false /*nonFakeValuesOnly*/);
-    }
-
-    /**
-     * Sets the config from the qualifiers of a given <var>config</var>.
-     * @param config the configuration to set
-     * @param nonFakeValuesOnly if set to true this ignore qualifiers for which the
-     * current value is a fake value.
-     *
-     * @see ResourceQualifier#hasFakeValue()
-     */
-    public void set(FolderConfiguration config, boolean nonFakeValuesOnly) {
-        if (config != null) {
-            for (int i = 0 ; i < INDEX_COUNT ; i++) {
-                ResourceQualifier q = config.mQualifiers[i];
-                if (nonFakeValuesOnly == false || q == null || q.hasFakeValue() == false) {
-                    mQualifiers[i] = q;
-                }
-            }
-        }
-    }
-
-    /**
-     * Reset the config.
-     * <p/>This makes qualifiers at all indices <code>null</code>.
-     */
-    public void reset() {
-        for (int i = 0 ; i < INDEX_COUNT ; i++) {
-            mQualifiers[i] = null;
-        }
-    }
-
-    /**
-     * Removes the qualifiers from the receiver if they are present (and valid)
-     * in the given configuration.
-     */
-    public void substract(FolderConfiguration config) {
-        for (int i = 0 ; i < INDEX_COUNT ; i++) {
-            if (config.mQualifiers[i] != null && config.mQualifiers[i].isValid()) {
-                mQualifiers[i] = null;
-            }
-        }
-    }
-
-    /**
-     * Adds the non-qualifiers from the given config.
-     * Qualifiers that are null in the given config do not change in the receiver.
-     */
-    public void add(FolderConfiguration config) {
-        for (int i = 0 ; i < INDEX_COUNT ; i++) {
-            if (config.mQualifiers[i] != null) {
-                mQualifiers[i] = config.mQualifiers[i];
-            }
-        }
-    }
-
-    /**
-     * Returns the first invalid qualifier, or <code>null<code> if they are all valid (or if none
-     * exists).
-     */
-    public ResourceQualifier getInvalidQualifier() {
-        for (int i = 0 ; i < INDEX_COUNT ; i++) {
-            if (mQualifiers[i] != null && mQualifiers[i].isValid() == false) {
-                return mQualifiers[i];
-            }
-        }
-
-        // all allocated qualifiers are valid, we return null.
-        return null;
-    }
-
-    /**
-     * Returns whether the Region qualifier is valid. Region qualifier can only be present if a
-     * Language qualifier is present as well.
-     * @return true if the Region qualifier is valid.
-     */
-    public boolean checkRegion() {
-        if (mQualifiers[INDEX_LANGUAGE] == null && mQualifiers[INDEX_REGION] != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Adds a qualifier to the {@link FolderConfiguration}
-     * @param qualifier the {@link ResourceQualifier} to add.
-     */
-    public void addQualifier(ResourceQualifier qualifier) {
-        if (qualifier instanceof CountryCodeQualifier) {
-            mQualifiers[INDEX_COUNTRY_CODE] = qualifier;
-
-        } else if (qualifier instanceof NetworkCodeQualifier) {
-            mQualifiers[INDEX_NETWORK_CODE] = qualifier;
-
-        } else if (qualifier instanceof LanguageQualifier) {
-            mQualifiers[INDEX_LANGUAGE] = qualifier;
-
-        } else if (qualifier instanceof RegionQualifier) {
-            mQualifiers[INDEX_REGION] = qualifier;
-
-        } else if (qualifier instanceof LayoutDirectionQualifier) {
-            mQualifiers[INDEX_LAYOUTDIR] = qualifier;
-
-        } else if (qualifier instanceof SmallestScreenWidthQualifier) {
-            mQualifiers[INDEX_SMALLEST_SCREEN_WIDTH] = qualifier;
-
-        } else if (qualifier instanceof ScreenWidthQualifier) {
-            mQualifiers[INDEX_SCREEN_WIDTH] = qualifier;
-
-        } else if (qualifier instanceof ScreenHeightQualifier) {
-            mQualifiers[INDEX_SCREEN_HEIGHT] = qualifier;
-
-        } else if (qualifier instanceof ScreenSizeQualifier) {
-            mQualifiers[INDEX_SCREEN_LAYOUT_SIZE] = qualifier;
-
-        } else if (qualifier instanceof ScreenRatioQualifier) {
-            mQualifiers[INDEX_SCREEN_RATIO] = qualifier;
-
-        } else if (qualifier instanceof ScreenOrientationQualifier) {
-            mQualifiers[INDEX_SCREEN_ORIENTATION] = qualifier;
-
-        } else if (qualifier instanceof UiModeQualifier) {
-            mQualifiers[INDEX_UI_MODE] = qualifier;
-
-        } else if (qualifier instanceof NightModeQualifier) {
-            mQualifiers[INDEX_NIGHT_MODE] = qualifier;
-
-        } else if (qualifier instanceof DensityQualifier) {
-            mQualifiers[INDEX_PIXEL_DENSITY] = qualifier;
-
-        } else if (qualifier instanceof TouchScreenQualifier) {
-            mQualifiers[INDEX_TOUCH_TYPE] = qualifier;
-
-        } else if (qualifier instanceof KeyboardStateQualifier) {
-            mQualifiers[INDEX_KEYBOARD_STATE] = qualifier;
-
-        } else if (qualifier instanceof TextInputMethodQualifier) {
-            mQualifiers[INDEX_TEXT_INPUT_METHOD] = qualifier;
-
-        } else if (qualifier instanceof NavigationStateQualifier) {
-            mQualifiers[INDEX_NAVIGATION_STATE] = qualifier;
-
-        } else if (qualifier instanceof NavigationMethodQualifier) {
-            mQualifiers[INDEX_NAVIGATION_METHOD] = qualifier;
-
-        } else if (qualifier instanceof ScreenDimensionQualifier) {
-            mQualifiers[INDEX_SCREEN_DIMENSION] = qualifier;
-
-        } else if (qualifier instanceof VersionQualifier) {
-            mQualifiers[INDEX_VERSION] = qualifier;
-
-        }
-    }
-
-    /**
-     * Removes a given qualifier from the {@link FolderConfiguration}.
-     * @param qualifier the {@link ResourceQualifier} to remove.
-     */
-    public void removeQualifier(ResourceQualifier qualifier) {
-        for (int i = 0 ; i < INDEX_COUNT ; i++) {
-            if (mQualifiers[i] == qualifier) {
-                mQualifiers[i] = null;
-                return;
-            }
-        }
-    }
-
-    /**
-     * Returns a qualifier by its index. The total number of qualifiers can be accessed by
-     * {@link #getQualifierCount()}.
-     * @param index the index of the qualifier to return.
-     * @return the qualifier or null if there are none at the index.
-     */
-    public ResourceQualifier getQualifier(int index) {
-        return mQualifiers[index];
-    }
-
-    public void setCountryCodeQualifier(CountryCodeQualifier qualifier) {
-        mQualifiers[INDEX_COUNTRY_CODE] = qualifier;
-    }
-
-    public CountryCodeQualifier getCountryCodeQualifier() {
-        return (CountryCodeQualifier)mQualifiers[INDEX_COUNTRY_CODE];
-    }
-
-    public void setNetworkCodeQualifier(NetworkCodeQualifier qualifier) {
-        mQualifiers[INDEX_NETWORK_CODE] = qualifier;
-    }
-
-    public NetworkCodeQualifier getNetworkCodeQualifier() {
-        return (NetworkCodeQualifier)mQualifiers[INDEX_NETWORK_CODE];
-    }
-
-    public void setLanguageQualifier(LanguageQualifier qualifier) {
-        mQualifiers[INDEX_LANGUAGE] = qualifier;
-    }
-
-    public LanguageQualifier getLanguageQualifier() {
-        return (LanguageQualifier)mQualifiers[INDEX_LANGUAGE];
-    }
-
-    public void setRegionQualifier(RegionQualifier qualifier) {
-        mQualifiers[INDEX_REGION] = qualifier;
-    }
-
-    public RegionQualifier getRegionQualifier() {
-        return (RegionQualifier)mQualifiers[INDEX_REGION];
-    }
-
-    public void setLayoutDirectionQualifier(LayoutDirectionQualifier qualifier) {
-        mQualifiers[INDEX_LAYOUTDIR] = qualifier;
-    }
-
-    public LayoutDirectionQualifier getLayoutDirectionQualifier() {
-        return (LayoutDirectionQualifier)mQualifiers[INDEX_LAYOUTDIR];
-    }
-
-    public void setSmallestScreenWidthQualifier(SmallestScreenWidthQualifier qualifier) {
-        mQualifiers[INDEX_SMALLEST_SCREEN_WIDTH] = qualifier;
-    }
-
-    public SmallestScreenWidthQualifier getSmallestScreenWidthQualifier() {
-        return (SmallestScreenWidthQualifier) mQualifiers[INDEX_SMALLEST_SCREEN_WIDTH];
-    }
-
-    public void setScreenWidthQualifier(ScreenWidthQualifier qualifier) {
-        mQualifiers[INDEX_SCREEN_WIDTH] = qualifier;
-    }
-
-    public ScreenWidthQualifier getScreenWidthQualifier() {
-        return (ScreenWidthQualifier) mQualifiers[INDEX_SCREEN_WIDTH];
-    }
-
-    public void setScreenHeightQualifier(ScreenHeightQualifier qualifier) {
-        mQualifiers[INDEX_SCREEN_HEIGHT] = qualifier;
-    }
-
-    public ScreenHeightQualifier getScreenHeightQualifier() {
-        return (ScreenHeightQualifier) mQualifiers[INDEX_SCREEN_HEIGHT];
-    }
-
-    public void setScreenSizeQualifier(ScreenSizeQualifier qualifier) {
-        mQualifiers[INDEX_SCREEN_LAYOUT_SIZE] = qualifier;
-    }
-
-    public ScreenSizeQualifier getScreenSizeQualifier() {
-        return (ScreenSizeQualifier)mQualifiers[INDEX_SCREEN_LAYOUT_SIZE];
-    }
-
-    public void setScreenRatioQualifier(ScreenRatioQualifier qualifier) {
-        mQualifiers[INDEX_SCREEN_RATIO] = qualifier;
-    }
-
-    public ScreenRatioQualifier getScreenRatioQualifier() {
-        return (ScreenRatioQualifier)mQualifiers[INDEX_SCREEN_RATIO];
-    }
-
-    public void setScreenOrientationQualifier(ScreenOrientationQualifier qualifier) {
-        mQualifiers[INDEX_SCREEN_ORIENTATION] = qualifier;
-    }
-
-    public ScreenOrientationQualifier getScreenOrientationQualifier() {
-        return (ScreenOrientationQualifier)mQualifiers[INDEX_SCREEN_ORIENTATION];
-    }
-
-    public void setUiModeQualifier(UiModeQualifier qualifier) {
-        mQualifiers[INDEX_UI_MODE] = qualifier;
-    }
-
-    public UiModeQualifier getUiModeQualifier() {
-        return (UiModeQualifier)mQualifiers[INDEX_UI_MODE];
-    }
-
-    public void setNightModeQualifier(NightModeQualifier qualifier) {
-        mQualifiers[INDEX_NIGHT_MODE] = qualifier;
-    }
-
-    public NightModeQualifier getNightModeQualifier() {
-        return (NightModeQualifier)mQualifiers[INDEX_NIGHT_MODE];
-    }
-
-    public void setDensityQualifier(DensityQualifier qualifier) {
-        mQualifiers[INDEX_PIXEL_DENSITY] = qualifier;
-    }
-
-    public DensityQualifier getDensityQualifier() {
-        return (DensityQualifier)mQualifiers[INDEX_PIXEL_DENSITY];
-    }
-
-    public void setTouchTypeQualifier(TouchScreenQualifier qualifier) {
-        mQualifiers[INDEX_TOUCH_TYPE] = qualifier;
-    }
-
-    public TouchScreenQualifier getTouchTypeQualifier() {
-        return (TouchScreenQualifier)mQualifiers[INDEX_TOUCH_TYPE];
-    }
-
-    public void setKeyboardStateQualifier(KeyboardStateQualifier qualifier) {
-        mQualifiers[INDEX_KEYBOARD_STATE] = qualifier;
-    }
-
-    public KeyboardStateQualifier getKeyboardStateQualifier() {
-        return (KeyboardStateQualifier)mQualifiers[INDEX_KEYBOARD_STATE];
-    }
-
-    public void setTextInputMethodQualifier(TextInputMethodQualifier qualifier) {
-        mQualifiers[INDEX_TEXT_INPUT_METHOD] = qualifier;
-    }
-
-    public TextInputMethodQualifier getTextInputMethodQualifier() {
-        return (TextInputMethodQualifier)mQualifiers[INDEX_TEXT_INPUT_METHOD];
-    }
-
-    public void setNavigationStateQualifier(NavigationStateQualifier qualifier) {
-        mQualifiers[INDEX_NAVIGATION_STATE] = qualifier;
-    }
-
-    public NavigationStateQualifier getNavigationStateQualifier() {
-        return (NavigationStateQualifier)mQualifiers[INDEX_NAVIGATION_STATE];
-    }
-
-    public void setNavigationMethodQualifier(NavigationMethodQualifier qualifier) {
-        mQualifiers[INDEX_NAVIGATION_METHOD] = qualifier;
-    }
-
-    public NavigationMethodQualifier getNavigationMethodQualifier() {
-        return (NavigationMethodQualifier)mQualifiers[INDEX_NAVIGATION_METHOD];
-    }
-
-    public void setScreenDimensionQualifier(ScreenDimensionQualifier qualifier) {
-        mQualifiers[INDEX_SCREEN_DIMENSION] = qualifier;
-    }
-
-    public ScreenDimensionQualifier getScreenDimensionQualifier() {
-        return (ScreenDimensionQualifier)mQualifiers[INDEX_SCREEN_DIMENSION];
-    }
-
-    public void setVersionQualifier(VersionQualifier qualifier) {
-        mQualifiers[INDEX_VERSION] = qualifier;
-    }
-
-    public VersionQualifier getVersionQualifier() {
-        return (VersionQualifier)mQualifiers[INDEX_VERSION];
-    }
-
-    /**
-     * Updates the {@link SmallestScreenWidthQualifier}, {@link ScreenWidthQualifier}, and
-     * {@link ScreenHeightQualifier} based on the (required) values of
-     * {@link ScreenDimensionQualifier} {@link DensityQualifier}, and
-     * {@link ScreenOrientationQualifier}.
-     *
-     * Also the density cannot be {@link Density#NODPI} as it's not valid on a device.
-     */
-    public void updateScreenWidthAndHeight() {
-
-        ResourceQualifier sizeQ = mQualifiers[INDEX_SCREEN_DIMENSION];
-        ResourceQualifier densityQ = mQualifiers[INDEX_PIXEL_DENSITY];
-        ResourceQualifier orientQ = mQualifiers[INDEX_SCREEN_ORIENTATION];
-
-        if (sizeQ != null && densityQ != null && orientQ != null) {
-            Density density = ((DensityQualifier) densityQ).getValue();
-            if (density == Density.NODPI) {
-                return;
-            }
-
-            ScreenOrientation orientation = ((ScreenOrientationQualifier) orientQ).getValue();
-
-            int size1 = ((ScreenDimensionQualifier) sizeQ).getValue1();
-            int size2 = ((ScreenDimensionQualifier) sizeQ).getValue2();
-
-            // make sure size1 is the biggest (should be the case, but make sure)
-            if (size1 < size2) {
-                int a = size1;
-                size1 = size2;
-                size2 = a;
-            }
-
-            // compute the dp. round them up since we want -w480dp to match a 480.5dp screen
-            int dp1 = (int) Math.ceil(size1 * Density.DEFAULT_DENSITY / density.getDpiValue());
-            int dp2 = (int) Math.ceil(size2 * Density.DEFAULT_DENSITY / density.getDpiValue());
-
-            setSmallestScreenWidthQualifier(new SmallestScreenWidthQualifier(dp2));
-
-            switch (orientation) {
-                case PORTRAIT:
-                    setScreenWidthQualifier(new ScreenWidthQualifier(dp2));
-                    setScreenHeightQualifier(new ScreenHeightQualifier(dp1));
-                    break;
-                case LANDSCAPE:
-                    setScreenWidthQualifier(new ScreenWidthQualifier(dp1));
-                    setScreenHeightQualifier(new ScreenHeightQualifier(dp2));
-                    break;
-                case SQUARE:
-                    setScreenWidthQualifier(new ScreenWidthQualifier(dp2));
-                    setScreenHeightQualifier(new ScreenHeightQualifier(dp2));
-                    break;
-            }
-        }
-    }
-
-    /**
-     * Returns whether an object is equals to the receiver.
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-
-        if (obj instanceof FolderConfiguration) {
-            FolderConfiguration fc = (FolderConfiguration)obj;
-            for (int i = 0 ; i < INDEX_COUNT ; i++) {
-                ResourceQualifier qualifier = mQualifiers[i];
-                ResourceQualifier fcQualifier = fc.mQualifiers[i];
-                if (qualifier != null) {
-                    if (qualifier.equals(fcQualifier) == false) {
-                        return false;
-                    }
-                } else if (fcQualifier != null) {
-                    return false;
-                }
-            }
-
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return toString().hashCode();
-    }
-
-    /**
-     * Returns whether the Configuration has only default values.
-     */
-    public boolean isDefault() {
-        for (ResourceQualifier irq : mQualifiers) {
-            if (irq != null) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Returns the name of a folder with the configuration.
-     */
-    public String getFolderName(ResourceFolderType folder) {
-        StringBuilder result = new StringBuilder(folder.getName());
-
-        for (ResourceQualifier qualifier : mQualifiers) {
-            if (qualifier != null) {
-                String segment = qualifier.getFolderSegment();
-                if (segment != null && segment.length() > 0) {
-                    result.append(SdkConstants.RES_QUALIFIER_SEP);
-                    result.append(segment);
-                }
-            }
-        }
-
-        return result.toString();
-    }
-
-    /**
-     * Returns {@link #toDisplayString()}.
-     */
-    @Override
-    public String toString() {
-        return toDisplayString();
-    }
-
-    /**
-     * Returns a string valid for display purpose.
-     */
-    public String toDisplayString() {
-        if (isDefault()) {
-            return "default";
-        }
-
-        StringBuilder result = null;
-        int index = 0;
-        ResourceQualifier qualifier = null;
-
-        // pre- language/region qualifiers
-        while (index < INDEX_LANGUAGE) {
-            qualifier = mQualifiers[index++];
-            if (qualifier != null) {
-                if (result == null) {
-                    result = new StringBuilder();
-                } else {
-                    result.append(", "); //$NON-NLS-1$
-                }
-                result.append(qualifier.getLongDisplayValue());
-
-            }
-        }
-
-        // process the language/region qualifier in a custom way, if there are both non null.
-        if (mQualifiers[INDEX_LANGUAGE] != null && mQualifiers[INDEX_REGION] != null) {
-            String language = mQualifiers[INDEX_LANGUAGE].getLongDisplayValue();
-            String region = mQualifiers[INDEX_REGION].getLongDisplayValue();
-
-            if (result == null) {
-                result = new StringBuilder();
-            } else {
-                result.append(", "); //$NON-NLS-1$
-            }
-            result.append(String.format("Locale %s_%s", language, region)); //$NON-NLS-1$
-
-            index += 2;
-        }
-
-        // post language/region qualifiers.
-        while (index < INDEX_COUNT) {
-            qualifier = mQualifiers[index++];
-            if (qualifier != null) {
-                if (result == null) {
-                    result = new StringBuilder();
-                } else {
-                    result.append(", "); //$NON-NLS-1$
-                }
-                result.append(qualifier.getLongDisplayValue());
-
-            }
-        }
-
-        return result == null ? null : result.toString();
-    }
-
-    @Override
-    public int compareTo(FolderConfiguration folderConfig) {
-        // default are always at the top.
-        if (isDefault()) {
-            if (folderConfig.isDefault()) {
-                return 0;
-            }
-            return -1;
-        }
-
-        // now we compare the qualifiers
-        for (int i = 0 ; i < INDEX_COUNT; i++) {
-            ResourceQualifier qualifier1 = mQualifiers[i];
-            ResourceQualifier qualifier2 = folderConfig.mQualifiers[i];
-
-            if (qualifier1 == null) {
-                if (qualifier2 == null) {
-                    continue;
-                } else {
-                    return -1;
-                }
-            } else {
-                if (qualifier2 == null) {
-                    return 1;
-                } else {
-                    int result = qualifier1.compareTo(qualifier2);
-
-                    if (result == 0) {
-                        continue;
-                    }
-
-                    return result;
-                }
-            }
-        }
-
-        // if we arrive here, all the qualifier matches
-        return 0;
-    }
-
-    /**
-     * Returns the best matching {@link Configurable} for this configuration.
-     *
-     * @param configurables the list of {@link Configurable} to choose from.
-     *
-     * @return an item from the given list of {@link Configurable} or null.
-     *
-     * @see http://d.android.com/guide/topics/resources/resources-i18n.html#best-match
-     */
-    public Configurable findMatchingConfigurable(List<? extends Configurable> configurables) {
-        //
-        // 1: eliminate resources that contradict the reference configuration
-        // 2: pick next qualifier type
-        // 3: check if any resources use this qualifier, if no, back to 2, else move on to 4.
-        // 4: eliminate resources that don't use this qualifier.
-        // 5: if more than one resource left, go back to 2.
-        //
-        // The precedence of the qualifiers is more important than the number of qualifiers that
-        // exactly match the device.
-
-        // 1: eliminate resources that contradict
-        ArrayList<Configurable> matchingConfigurables = new ArrayList<Configurable>();
-        for (int i = 0 ; i < configurables.size(); i++) {
-            Configurable res = configurables.get(i);
-
-            if (res.getConfiguration().isMatchFor(this)) {
-                matchingConfigurables.add(res);
-            }
-        }
-
-        // if there is only one match, just take it
-        if (matchingConfigurables.size() == 1) {
-            return matchingConfigurables.get(0);
-        } else if (matchingConfigurables.size() == 0) {
-            return null;
-        }
-
-        // 2. Loop on the qualifiers, and eliminate matches
-        final int count = FolderConfiguration.getQualifierCount();
-        for (int q = 0 ; q < count ; q++) {
-            // look to see if one configurable has this qualifier.
-            // At the same time also record the best match value for the qualifier (if applicable).
-
-            // The reference value, to find the best match.
-            // Note that this qualifier could be null. In which case any qualifier found in the
-            // possible match, will all be considered best match.
-            ResourceQualifier referenceQualifier = getQualifier(q);
-
-            boolean found = false;
-            ResourceQualifier bestMatch = null; // this is to store the best match.
-            for (Configurable configurable : matchingConfigurables) {
-                ResourceQualifier qualifier = configurable.getConfiguration().getQualifier(q);
-                if (qualifier != null) {
-                    // set the flag.
-                    found = true;
-
-                    // Now check for a best match. If the reference qualifier is null ,
-                    // any qualifier is a "best" match (we don't need to record all of them.
-                    // Instead the non compatible ones are removed below)
-                    if (referenceQualifier != null) {
-                        if (qualifier.isBetterMatchThan(bestMatch, referenceQualifier)) {
-                            bestMatch = qualifier;
-                        }
-                    }
-                }
-            }
-
-            // 4. If a configurable has a qualifier at the current index, remove all the ones that
-            // do not have one, or whose qualifier value does not equal the best match found above
-            // unless there's no reference qualifier, in which case they are all considered
-            // "best" match.
-            if (found) {
-                for (int i = 0 ; i < matchingConfigurables.size(); ) {
-                    Configurable configurable = matchingConfigurables.get(i);
-                    ResourceQualifier qualifier = configurable.getConfiguration().getQualifier(q);
-
-                    if (qualifier == null) {
-                        // this resources has no qualifier of this type: rejected.
-                        matchingConfigurables.remove(configurable);
-                    } else if (referenceQualifier != null && bestMatch != null &&
-                            bestMatch.equals(qualifier) == false) {
-                        // there's a reference qualifier and there is a better match for it than
-                        // this resource, so we reject it.
-                        matchingConfigurables.remove(configurable);
-                    } else {
-                        // looks like we keep this resource, move on to the next one.
-                        i++;
-                    }
-                }
-
-                // at this point we may have run out of matching resources before going
-                // through all the qualifiers.
-                if (matchingConfigurables.size() < 2) {
-                    break;
-                }
-            }
-        }
-
-        // Because we accept resources whose configuration have qualifiers where the reference
-        // configuration doesn't, we can end up with more than one match. In this case, we just
-        // take the first one.
-        if (matchingConfigurables.size() == 0) {
-            return null;
-        }
-        return matchingConfigurables.get(0);
-    }
-
-
-    /**
-     * Returns whether the configuration is a match for the given reference config.
-     * <p/>A match means that, for each qualifier of this config
-     * <ul>
-     * <li>The reference config has no value set
-     * <li>or, the qualifier of the reference config is a match. Depending on the qualifier type
-     * this does not mean the same exact value.</li>
-     * </ul>
-     * @param referenceConfig The reference configuration to test against.
-     * @return true if the configuration matches.
-     */
-    public boolean isMatchFor(FolderConfiguration referenceConfig) {
-        if (referenceConfig == null) {
-            return false;
-        }
-
-        for (int i = 0 ; i < INDEX_COUNT ; i++) {
-            ResourceQualifier testQualifier = mQualifiers[i];
-            ResourceQualifier referenceQualifier = referenceConfig.mQualifiers[i];
-
-            // it's only a non match if both qualifiers are non-null, and they don't match.
-            if (testQualifier != null && referenceQualifier != null &&
-                        testQualifier.isMatchFor(referenceQualifier) == false) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Returns the index of the first non null {@link ResourceQualifier} starting at index
-     * <var>startIndex</var>
-     * @param startIndex
-     * @return -1 if no qualifier was found.
-     */
-    public int getHighestPriorityQualifier(int startIndex) {
-        for (int i = startIndex ; i < INDEX_COUNT ; i++) {
-            if (mQualifiers[i] != null) {
-                return i;
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Create default qualifiers.
-     * <p/>This creates qualifiers with no values for all indices.
-     */
-    public void createDefault() {
-        mQualifiers[INDEX_COUNTRY_CODE] = new CountryCodeQualifier();
-        mQualifiers[INDEX_NETWORK_CODE] = new NetworkCodeQualifier();
-        mQualifiers[INDEX_LANGUAGE] = new LanguageQualifier();
-        mQualifiers[INDEX_REGION] = new RegionQualifier();
-        mQualifiers[INDEX_LAYOUTDIR] = new LayoutDirectionQualifier();
-        mQualifiers[INDEX_SMALLEST_SCREEN_WIDTH] = new SmallestScreenWidthQualifier();
-        mQualifiers[INDEX_SCREEN_WIDTH] = new ScreenWidthQualifier();
-        mQualifiers[INDEX_SCREEN_HEIGHT] = new ScreenHeightQualifier();
-        mQualifiers[INDEX_SCREEN_LAYOUT_SIZE] = new ScreenSizeQualifier();
-        mQualifiers[INDEX_SCREEN_RATIO] = new ScreenRatioQualifier();
-        mQualifiers[INDEX_SCREEN_ORIENTATION] = new ScreenOrientationQualifier();
-        mQualifiers[INDEX_UI_MODE] = new UiModeQualifier();
-        mQualifiers[INDEX_NIGHT_MODE] = new NightModeQualifier();
-        mQualifiers[INDEX_PIXEL_DENSITY] = new DensityQualifier();
-        mQualifiers[INDEX_TOUCH_TYPE] = new TouchScreenQualifier();
-        mQualifiers[INDEX_KEYBOARD_STATE] = new KeyboardStateQualifier();
-        mQualifiers[INDEX_TEXT_INPUT_METHOD] = new TextInputMethodQualifier();
-        mQualifiers[INDEX_NAVIGATION_STATE] = new NavigationStateQualifier();
-        mQualifiers[INDEX_NAVIGATION_METHOD] = new NavigationMethodQualifier();
-        mQualifiers[INDEX_SCREEN_DIMENSION] = new ScreenDimensionQualifier();
-        mQualifiers[INDEX_VERSION] = new VersionQualifier();
-    }
-
-    /**
-     * Returns an array of all the non null qualifiers.
-     */
-    public ResourceQualifier[] getQualifiers() {
-        int count = 0;
-        for (int i = 0 ; i < INDEX_COUNT ; i++) {
-            if (mQualifiers[i] != null) {
-                count++;
-            }
-        }
-
-        ResourceQualifier[] array = new ResourceQualifier[count];
-        int index = 0;
-        for (int i = 0 ; i < INDEX_COUNT ; i++) {
-            if (mQualifiers[i] != null) {
-                array[index++] = mQualifiers[i];
-            }
-        }
-
-        return array;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/KeyboardStateQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/KeyboardStateQualifier.java
deleted file mode 100644
index 1397808..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/KeyboardStateQualifier.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.KeyboardState;
-import com.android.resources.ResourceEnum;
-
-/**
- * Resource Qualifier for keyboard state.
- */
-public final class KeyboardStateQualifier extends EnumBasedResourceQualifier {
-
-    public static final String NAME = "Keyboard State";
-
-    private KeyboardState mValue = null;
-
-    public KeyboardStateQualifier() {
-        // pass
-    }
-
-    public KeyboardStateQualifier(KeyboardState value) {
-        mValue = value;
-    }
-
-    public KeyboardState getValue() {
-        return mValue;
-    }
-
-    @Override
-    ResourceEnum getEnumValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return "Keyboard";
-    }
-
-    @Override
-    public int since() {
-        return 1;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        KeyboardState orientation = KeyboardState.getEnum(value);
-        if (orientation != null) {
-            KeyboardStateQualifier qualifier = new KeyboardStateQualifier();
-            qualifier.mValue = orientation;
-            config.setKeyboardStateQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean isMatchFor(ResourceQualifier qualifier) {
-        if (qualifier instanceof KeyboardStateQualifier) {
-            KeyboardStateQualifier referenceQualifier = (KeyboardStateQualifier)qualifier;
-
-            // special case where EXPOSED can be used for SOFT
-            if (referenceQualifier.mValue == KeyboardState.SOFT &&
-                    mValue == KeyboardState.EXPOSED) {
-                return true;
-            }
-
-            return referenceQualifier.mValue == mValue;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean isBetterMatchThan(ResourceQualifier compareTo, ResourceQualifier reference) {
-        if (compareTo == null) {
-            return true;
-        }
-
-        KeyboardStateQualifier compareQualifier = (KeyboardStateQualifier)compareTo;
-        KeyboardStateQualifier referenceQualifier = (KeyboardStateQualifier)reference;
-
-        if (referenceQualifier.mValue == KeyboardState.SOFT) { // only case where there could be a
-                                                               // better qualifier
-            // only return true if it's a better value.
-            if (compareQualifier.mValue == KeyboardState.EXPOSED && mValue == KeyboardState.SOFT) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/LanguageQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/LanguageQualifier.java
deleted file mode 100644
index 76514e2..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/LanguageQualifier.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import java.util.Locale;
-import java.util.regex.Pattern;
-
-/**
- * Resource Qualifier for Language.
- */
-public final class LanguageQualifier extends ResourceQualifier {
-    private final static Pattern sLanguagePattern = Pattern.compile("^[a-z]{2}$"); //$NON-NLS-1$
-
-    public static final String FAKE_LANG_VALUE = "__"; //$NON-NLS-1$
-    public static final String NAME = "Language";
-
-    private String mValue;
-
-    /**
-     * Creates and returns a qualifier from the given folder segment. If the segment is incorrect,
-     * <code>null</code> is returned.
-     * @param segment the folder segment from which to create a qualifier.
-     * @return a new {@link LanguageQualifier} object or <code>null</code>
-     */
-    public static LanguageQualifier getQualifier(String segment) {
-        if (sLanguagePattern.matcher(segment).matches()) {
-            LanguageQualifier qualifier = new LanguageQualifier();
-            qualifier.mValue = segment;
-
-            return qualifier;
-        }
-        return null;
-    }
-
-    /**
-     * Returns the folder name segment for the given value. This is equivalent to calling
-     * {@link #toString()} on a {@link LanguageQualifier} object.
-     * @param value the value of the qualifier, as returned by {@link #getValue()}.
-     */
-    public static String getFolderSegment(String value) {
-        String segment = value.toLowerCase(Locale.US);
-        if (sLanguagePattern.matcher(segment).matches()) {
-            return segment;
-        }
-
-        return null;
-    }
-
-    public LanguageQualifier() {
-
-    }
-
-    public LanguageQualifier(String value) {
-        mValue = value;
-    }
-
-    public String getValue() {
-        if (mValue != null) {
-            return mValue;
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return NAME;
-    }
-
-    @Override
-    public int since() {
-        return 1;
-    }
-
-    @Override
-    public boolean isValid() {
-        return mValue != null;
-    }
-
-    @Override
-    public boolean hasFakeValue() {
-        return FAKE_LANG_VALUE.equals(mValue);
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        LanguageQualifier qualifier = getQualifier(value);
-        if (qualifier != null) {
-            config.setLanguageQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean equals(Object qualifier) {
-        if (qualifier instanceof LanguageQualifier) {
-            if (mValue == null) {
-                return ((LanguageQualifier)qualifier).mValue == null;
-            }
-            return mValue.equals(((LanguageQualifier)qualifier).mValue);
-        }
-
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        if (mValue != null) {
-            return mValue.hashCode();
-        }
-
-        return 0;
-    }
-
-    /**
-     * Returns the string used to represent this qualifier in the folder name.
-     */
-    @Override
-    public String getFolderSegment() {
-        if (mValue != null) {
-            return getFolderSegment(mValue);
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        if (mValue != null) {
-            return mValue;
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        if (mValue != null) {
-            return String.format("Language %s", mValue);
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/LayoutDirectionQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/LayoutDirectionQualifier.java
deleted file mode 100644
index 48498f0..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/LayoutDirectionQualifier.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.LayoutDirection;
-import com.android.resources.ResourceEnum;
-
-/**
- * Resource Qualifier for layout direction. values can be "ltr", or "rtl"
- */
-public class LayoutDirectionQualifier extends EnumBasedResourceQualifier {
-
-    public static final String NAME = "Layout Direction";
-
-    private LayoutDirection mValue = null;
-
-
-    public LayoutDirectionQualifier() {
-    }
-
-    public LayoutDirectionQualifier(LayoutDirection value) {
-        mValue = value;
-    }
-
-    public LayoutDirection getValue() {
-        return mValue;
-    }
-
-    @Override
-    ResourceEnum getEnumValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return NAME;
-    }
-
-    @Override
-    public int since() {
-        return 17;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        LayoutDirection ld = LayoutDirection.getEnum(value);
-        if (ld != null) {
-            LayoutDirectionQualifier qualifier = new LayoutDirectionQualifier(ld);
-            config.setLayoutDirectionQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/NavigationMethodQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/NavigationMethodQualifier.java
deleted file mode 100644
index f40bc6c..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/NavigationMethodQualifier.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.Navigation;
-import com.android.resources.ResourceEnum;
-
-/**
- * Resource Qualifier for Navigation Method.
- */
-public final class NavigationMethodQualifier extends EnumBasedResourceQualifier {
-
-    public static final String NAME = "Navigation Method";
-
-    private Navigation mValue;
-
-    public NavigationMethodQualifier() {
-        // pass
-    }
-
-    public NavigationMethodQualifier(Navigation value) {
-        mValue = value;
-    }
-
-    public Navigation getValue() {
-        return mValue;
-    }
-
-    @Override
-    ResourceEnum getEnumValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return NAME;
-    }
-
-    @Override
-    public int since() {
-        return 1;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        Navigation method = Navigation.getEnum(value);
-        if (method != null) {
-            NavigationMethodQualifier qualifier = new NavigationMethodQualifier(method);
-            config.setNavigationMethodQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/NavigationStateQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/NavigationStateQualifier.java
deleted file mode 100644
index 91b81df..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/NavigationStateQualifier.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.NavigationState;
-import com.android.resources.ResourceEnum;
-
-/**
- * Resource Qualifier for navigation state.
- */
-public final class NavigationStateQualifier extends EnumBasedResourceQualifier {
-
-    public static final String NAME = "Navigation State";
-
-    private NavigationState mValue = null;
-
-    public NavigationStateQualifier() {
-        // pass
-    }
-
-    public NavigationStateQualifier(NavigationState value) {
-        mValue = value;
-    }
-
-    public NavigationState getValue() {
-        return mValue;
-    }
-
-    @Override
-    ResourceEnum getEnumValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return NAME;
-    }
-
-    @Override
-    public int since() {
-        return 1;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        NavigationState state = NavigationState.getEnum(value);
-        if (state != null) {
-            NavigationStateQualifier qualifier = new NavigationStateQualifier();
-            qualifier.mValue = state;
-            config.setNavigationStateQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/NetworkCodeQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/NetworkCodeQualifier.java
deleted file mode 100644
index 1ef2015..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/NetworkCodeQualifier.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Resource Qualifier for Mobile Network Code Pixel Density.
- */
-public final class NetworkCodeQualifier extends ResourceQualifier {
-    /** Default pixel density value. This means the property is not set. */
-    private final static int DEFAULT_CODE = -1;
-
-    private final static Pattern sNetworkCodePattern = Pattern.compile("^mnc(\\d{1,3})$"); //$NON-NLS-1$
-
-    private final int mCode;
-
-    public final static String NAME = "Mobile Network Code";
-
-    /**
-     * Creates and returns a qualifier from the given folder segment. If the segment is incorrect,
-     * <code>null</code> is returned.
-     * @param segment the folder segment from which to create a qualifier.
-     * @return a new {@link CountryCodeQualifier} object or <code>null</code>
-     */
-    public static NetworkCodeQualifier getQualifier(String segment) {
-        Matcher m = sNetworkCodePattern.matcher(segment);
-        if (m.matches()) {
-            String v = m.group(1);
-
-            int code = -1;
-            try {
-                code = Integer.parseInt(v);
-            } catch (NumberFormatException e) {
-                // looks like the string we extracted wasn't a valid number.
-                return null;
-            }
-
-            NetworkCodeQualifier qualifier = new NetworkCodeQualifier(code);
-            return qualifier;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the folder name segment for the given value. This is equivalent to calling
-     * {@link #toString()} on a {@link NetworkCodeQualifier} object.
-     * @param code the value of the qualifier, as returned by {@link #getCode()}.
-     */
-    public static String getFolderSegment(int code) {
-        if (code != DEFAULT_CODE && code >= 1 && code <= 999) { // code is 1-3 digit.
-            return String.format("mnc%1$d", code); //$NON-NLS-1$
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    public NetworkCodeQualifier() {
-        this(DEFAULT_CODE);
-    }
-
-    public NetworkCodeQualifier(int code) {
-        mCode = code;
-    }
-
-    public int getCode() {
-        return mCode;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return "Network Code";
-    }
-
-    @Override
-    public int since() {
-        return 1;
-    }
-
-    @Override
-    public boolean isValid() {
-        return mCode != DEFAULT_CODE;
-    }
-
-    @Override
-    public boolean hasFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        Matcher m = sNetworkCodePattern.matcher(value);
-        if (m.matches()) {
-            String v = m.group(1);
-
-            int code = -1;
-            try {
-                code = Integer.parseInt(v);
-            } catch (NumberFormatException e) {
-                // looks like the string we extracted wasn't a valid number.
-                return false;
-            }
-
-            NetworkCodeQualifier qualifier = new NetworkCodeQualifier(code);
-            config.setNetworkCodeQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean equals(Object qualifier) {
-        if (qualifier instanceof NetworkCodeQualifier) {
-            return mCode == ((NetworkCodeQualifier)qualifier).mCode;
-        }
-
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return mCode;
-    }
-
-    /**
-     * Returns the string used to represent this qualifier in the folder name.
-     */
-    @Override
-    public String getFolderSegment() {
-        return getFolderSegment(mCode);
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        if (mCode != DEFAULT_CODE) {
-            return String.format("MNC %1$d", mCode);
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        return getShortDisplayValue();
-    }
-
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/NightModeQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/NightModeQualifier.java
deleted file mode 100644
index d3b6760..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/NightModeQualifier.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.NightMode;
-import com.android.resources.ResourceEnum;
-
-/**
- * Resource Qualifier for Navigation Method.
- */
-public final class NightModeQualifier extends EnumBasedResourceQualifier {
-
-    public static final String NAME = "Night Mode";
-
-    private NightMode mValue;
-
-    public NightModeQualifier() {
-        // pass
-    }
-
-    public NightModeQualifier(NightMode value) {
-        mValue = value;
-    }
-
-    public NightMode getValue() {
-        return mValue;
-    }
-
-    @Override
-    ResourceEnum getEnumValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return "Night Mode";
-    }
-
-    @Override
-    public int since() {
-        return 8;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        NightMode mode = NightMode.getEnum(value);
-        if (mode != null) {
-            NightModeQualifier qualifier = new NightModeQualifier(mode);
-            config.setNightModeQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/RegionQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/RegionQualifier.java
deleted file mode 100644
index bd033bd..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/RegionQualifier.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import java.util.Locale;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Resource Qualifier for Region.
- */
-public final class RegionQualifier extends ResourceQualifier {
-    private final static Pattern sRegionPattern = Pattern.compile("^r([A-Z]{2})$"); //$NON-NLS-1$
-
-    public static final String FAKE_REGION_VALUE = "__"; //$NON-NLS-1$
-    public static final String NAME = "Region";
-
-    private String mValue;
-
-    /**
-     * Creates and returns a qualifier from the given folder segment. If the segment is incorrect,
-     * <code>null</code> is returned.
-     * @param segment the folder segment from which to create a qualifier.
-     * @return a new {@link RegionQualifier} object or <code>null</code>
-     */
-    public static RegionQualifier getQualifier(String segment) {
-        Matcher m = sRegionPattern.matcher(segment);
-        if (m.matches()) {
-            RegionQualifier qualifier = new RegionQualifier();
-            qualifier.mValue = m.group(1);
-
-            return qualifier;
-        }
-        return null;
-    }
-
-    /**
-     * Returns the folder name segment for the given value. This is equivalent to calling
-     * {@link #toString()} on a {@link RegionQualifier} object.
-     * @param value the value of the qualifier, as returned by {@link #getValue()}.
-     */
-    public static String getFolderSegment(String value) {
-        if (value != null) {
-            // See http://developer.android.com/reference/java/util/Locale.html#default_locale
-            String segment = "r" + value.toUpperCase(Locale.US); //$NON-NLS-1$
-            if (sRegionPattern.matcher(segment).matches()) {
-                return segment;
-            }
-        }
-
-        return "";  //$NON-NLS-1$
-    }
-
-    public RegionQualifier() {
-
-    }
-
-    public RegionQualifier(String value) {
-        mValue = value;
-    }
-
-    public String getValue() {
-        if (mValue != null) {
-            return mValue;
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return NAME;
-    }
-
-    @Override
-    public int since() {
-        return 1;
-    }
-
-    @Override
-    public boolean isValid() {
-        return mValue != null;
-    }
-
-    @Override
-    public boolean hasFakeValue() {
-        return FAKE_REGION_VALUE.equals(mValue);
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        RegionQualifier qualifier = getQualifier(value);
-        if (qualifier != null) {
-            config.setRegionQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean equals(Object qualifier) {
-        if (qualifier instanceof RegionQualifier) {
-            if (mValue == null) {
-                return ((RegionQualifier)qualifier).mValue == null;
-            }
-            return mValue.equals(((RegionQualifier)qualifier).mValue);
-        }
-
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        if (mValue != null) {
-            return mValue.hashCode();
-        }
-
-        return 0;
-    }
-
-    /**
-     * Returns the string used to represent this qualifier in the folder name.
-     */
-    @Override
-    public String getFolderSegment() {
-        return getFolderSegment(mValue);
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        if (mValue != null) {
-            return mValue;
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        if (mValue != null) {
-            return String.format("Region %s", mValue);
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/ResourceQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/ResourceQualifier.java
deleted file mode 100644
index 2997c8f..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/ResourceQualifier.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-
-/**
- * Base class for resource qualifiers.
- * <p/>The resource qualifier classes are designed as immutable.
- */
-public abstract class ResourceQualifier implements Comparable<ResourceQualifier> {
-
-    /**
-     * Returns the human readable name of the qualifier.
-     */
-    public abstract String getName();
-
-    /**
-     * Returns a shorter human readable name for the qualifier.
-     * @see #getName()
-     */
-    public abstract String getShortName();
-
-    /**
-     * Returns when this qualifier was added to Android.
-     */
-    public abstract int since();
-
-    /**
-     * Whether this qualifier is deprecated.
-     */
-    public boolean deprecated() {
-        return false;
-    }
-
-    /**
-     * Returns whether the qualifier has a valid filter value.
-     */
-    public abstract boolean isValid();
-
-    /**
-     * Returns whether the qualifier has a fake value.
-     * <p/>Fake values are used internally and should not be used as real qualifier value.
-     */
-    public abstract boolean hasFakeValue();
-
-    /**
-     * Check if the value is valid for this qualifier, and if so sets the value
-     * into a Folder Configuration.
-     * @param value The value to check and set. Must not be null.
-     * @param config The folder configuration to receive the value. Must not be null.
-     * @return true if the value was valid and was set.
-     */
-    public abstract boolean checkAndSet(String value, FolderConfiguration config);
-
-    /**
-     * Returns a string formated to be used in a folder name.
-     * <p/>This is declared as abstract to force children classes to implement it.
-     */
-    public abstract String getFolderSegment();
-
-    /**
-     * Returns whether the given qualifier is a match for the receiver.
-     * <p/>The default implementation returns the result of {@link #equals(Object)}.
-     * <p/>Children class that re-implements this must implement
-     * {@link #isBetterMatchThan(ResourceQualifier, ResourceQualifier)} too.
-     * @param qualifier the reference qualifier
-     * @return true if the receiver is a match.
-     */
-    public boolean isMatchFor(ResourceQualifier qualifier) {
-        return equals(qualifier);
-    }
-
-    /**
-     * Returns true if the receiver is a better match for the given <var>reference</var> than
-     * the given <var>compareTo</var> comparable.
-     * @param compareTo The {@link ResourceQualifier} to compare to. Can be null, in which
-     * case the method must return <code>true</code>.
-     * @param reference The reference qualifier value for which the match is.
-     * @return true if the receiver is a better match.
-     */
-    public boolean isBetterMatchThan(ResourceQualifier compareTo, ResourceQualifier reference) {
-        // the default is to always return false. This gives less overhead than always returning
-        // true, as it would only compare same values anyway.
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return getFolderSegment();
-    }
-
-    /**
-     * Returns a string formatted for display purpose.
-     */
-    public abstract String getShortDisplayValue();
-
-    /**
-     * Returns a string formatted for display purpose.
-     */
-    public abstract String getLongDisplayValue();
-
-    /**
-     * Returns <code>true</code> if both objects are equal.
-     * <p/>This is declared as abstract to force children classes to implement it.
-     */
-    @Override
-    public abstract boolean equals(Object object);
-
-    /**
-     * Returns a hash code value for the object.
-     * <p/>This is declared as abstract to force children classes to implement it.
-     */
-    @Override
-    public abstract int hashCode();
-
-    @Override
-    public final int compareTo(ResourceQualifier o) {
-        return toString().compareTo(o.toString());
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/ScreenDimensionQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/ScreenDimensionQualifier.java
deleted file mode 100644
index dce6c68..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/ScreenDimensionQualifier.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Resource Qualifier for Screen Dimension.
- */
-public final class ScreenDimensionQualifier extends ResourceQualifier {
-    /** Default screen size value. This means the property is not set */
-    final static int DEFAULT_SIZE = -1;
-
-    private final static Pattern sDimensionPattern = Pattern.compile(
-            "^(\\d+)x(\\d+)$"); //$NON-NLS-1$
-
-    public static final String NAME = "Screen Dimension";
-
-    /** Screen size 1 value. This is not size X or Y because the folder name always
-     * contains the biggest size first. So if the qualifier is 400x200, size 1 will always be
-     * 400 but that'll be X in landscape and Y in portrait.
-     * Default value is <code>DEFAULT_SIZE</code> */
-    private int mValue1 = DEFAULT_SIZE;
-
-    /** Screen size 2 value. This is not size X or Y because the folder name always
-     * contains the biggest size first. So if the qualifier is 400x200, size 2 will always be
-     * 200 but that'll be Y in landscape and X in portrait.
-     * Default value is <code>DEFAULT_SIZE</code> */
-    private int mValue2 = DEFAULT_SIZE;
-
-    public ScreenDimensionQualifier() {
-        // pass
-    }
-
-    public ScreenDimensionQualifier(int value1, int value2) {
-        mValue1 = value1;
-        mValue2 = value2;
-    }
-
-    public int getValue1() {
-        return mValue1;
-    }
-
-    public int getValue2() {
-        return mValue2;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return "Dimension";
-    }
-
-    @Override
-    public int since() {
-        return 1;
-    }
-
-    @Override
-    public boolean deprecated() {
-        return true;
-    }
-
-    @Override
-    public boolean isValid() {
-        return mValue1 != DEFAULT_SIZE && mValue2 != DEFAULT_SIZE;
-    }
-
-    @Override
-    public boolean hasFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        Matcher m = sDimensionPattern.matcher(value);
-        if (m.matches()) {
-            String d1 = m.group(1);
-            String d2 = m.group(2);
-
-            ScreenDimensionQualifier qualifier = getQualifier(d1, d2);
-            if (qualifier != null) {
-                config.setScreenDimensionQualifier(qualifier);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public boolean equals(Object qualifier) {
-        if (qualifier instanceof ScreenDimensionQualifier) {
-            ScreenDimensionQualifier q = (ScreenDimensionQualifier)qualifier;
-            return (mValue1 == q.mValue1 && mValue2 == q.mValue2);
-        }
-
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return toString().hashCode();
-    }
-
-    public static ScreenDimensionQualifier getQualifier(String size1, String size2) {
-        try {
-            int s1 = Integer.parseInt(size1);
-            int s2 = Integer.parseInt(size2);
-
-            ScreenDimensionQualifier qualifier = new ScreenDimensionQualifier();
-
-            if (s1 > s2) {
-                qualifier.mValue1 = s1;
-                qualifier.mValue2 = s2;
-            } else {
-                qualifier.mValue1 = s2;
-                qualifier.mValue2 = s1;
-            }
-
-            return qualifier;
-        } catch (NumberFormatException e) {
-            // looks like the string we extracted wasn't a valid number.
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the string used to represent this qualifier in the folder name.
-     */
-    @Override
-    public String getFolderSegment() {
-        return String.format("%1$dx%2$d", mValue1, mValue2); //$NON-NLS-1$
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        if (isValid()) {
-            return String.format("%1$dx%2$d", mValue1, mValue2);
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        if (isValid()) {
-            return String.format("Screen resolution %1$dx%2$d", mValue1, mValue2);
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/ScreenHeightQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/ScreenHeightQualifier.java
deleted file mode 100644
index 08bba61..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/ScreenHeightQualifier.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Resource Qualifier for Screen Pixel Density.
- */
-public final class ScreenHeightQualifier extends ResourceQualifier {
-    /** Default screen size value. This means the property is not set */
-    final static int DEFAULT_SIZE = -1;
-
-    private final static Pattern sParsePattern = Pattern.compile("^h(\\d+)dp$");//$NON-NLS-1$
-    private final static String sPrintPattern = "h%1$ddp";
-
-    public static final String NAME = "Screen Height";
-
-    private int mValue = DEFAULT_SIZE;
-
-    public ScreenHeightQualifier() {
-        // pass
-    }
-
-    public ScreenHeightQualifier(int value) {
-        mValue = value;
-    }
-
-    public int getValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return NAME;
-    }
-
-    @Override
-    public int since() {
-        return 13;
-    }
-
-    @Override
-    public boolean hasFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValid() {
-        return mValue != DEFAULT_SIZE;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        Matcher m = sParsePattern.matcher(value);
-        if (m.matches()) {
-            String v = m.group(1);
-
-            ScreenHeightQualifier qualifier = getQualifier(v);
-            if (qualifier != null) {
-                config.setScreenHeightQualifier(qualifier);
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public static ScreenHeightQualifier getQualifier(String value) {
-        try {
-            int dp = Integer.parseInt(value);
-
-            ScreenHeightQualifier qualifier = new ScreenHeightQualifier();
-            qualifier.mValue = dp;
-            return qualifier;
-
-        } catch (NumberFormatException e) {
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean isMatchFor(ResourceQualifier qualifier) {
-        // this is the match only of the current dp value is lower or equal to the
-        if (qualifier instanceof ScreenHeightQualifier) {
-            return mValue <= ((ScreenHeightQualifier) qualifier).mValue;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean isBetterMatchThan(ResourceQualifier compareTo, ResourceQualifier reference) {
-        if (compareTo == null) {
-            return true;
-        }
-
-        ScreenHeightQualifier compareQ = (ScreenHeightQualifier)compareTo;
-        ScreenHeightQualifier referenceQ = (ScreenHeightQualifier)reference;
-
-        if (compareQ.mValue == referenceQ.mValue) {
-            // what we have is already the best possible match (exact match)
-            return false;
-        } else if (mValue == referenceQ.mValue) {
-            // got new exact value, this is the best!
-            return true;
-        } else {
-            // get the qualifier that has the width that is the closest to the reference, but not
-            // above. (which is guaranteed when this is called as isMatchFor is called first.
-            return mValue > compareQ.mValue;
-        }
-    }
-
-    @Override
-    public String getFolderSegment() {
-        return String.format(sPrintPattern, mValue);
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        if (isValid()) {
-            return getFolderSegment();
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        if (isValid()) {
-            return getFolderSegment();
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-
-    @Override
-    public int hashCode() {
-        return mValue;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        ScreenHeightQualifier other = (ScreenHeightQualifier) obj;
-        if (mValue != other.mValue) {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/ScreenOrientationQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/ScreenOrientationQualifier.java
deleted file mode 100644
index 732a078..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/ScreenOrientationQualifier.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.ResourceEnum;
-import com.android.resources.ScreenOrientation;
-
-/**
- * Resource Qualifier for Screen Orientation.
- */
-public final class ScreenOrientationQualifier extends EnumBasedResourceQualifier {
-
-    public static final String NAME = "Screen Orientation";
-
-    private ScreenOrientation mValue = null;
-
-    public ScreenOrientationQualifier() {
-    }
-
-    public ScreenOrientationQualifier(ScreenOrientation value) {
-        mValue = value;
-    }
-
-    public ScreenOrientation getValue() {
-        return mValue;
-    }
-
-    @Override
-    ResourceEnum getEnumValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return "Orientation";
-    }
-
-    @Override
-    public int since() {
-        return 1;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        ScreenOrientation orientation = ScreenOrientation.getEnum(value);
-        if (orientation != null) {
-            ScreenOrientationQualifier qualifier = new ScreenOrientationQualifier(orientation);
-            config.setScreenOrientationQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/ScreenRatioQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/ScreenRatioQualifier.java
deleted file mode 100644
index b45946b..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/ScreenRatioQualifier.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.ResourceEnum;
-import com.android.resources.ScreenRatio;
-
-public class ScreenRatioQualifier extends EnumBasedResourceQualifier {
-
-    public static final String NAME = "Screen Ratio";
-
-    private ScreenRatio mValue = null;
-
-    public ScreenRatioQualifier() {
-    }
-
-    public ScreenRatioQualifier(ScreenRatio value) {
-        mValue = value;
-    }
-
-    public ScreenRatio getValue() {
-        return mValue;
-    }
-
-    @Override
-    ResourceEnum getEnumValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return "Ratio";
-    }
-
-    @Override
-    public int since() {
-        return 4;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        ScreenRatio size = ScreenRatio.getEnum(value);
-        if (size != null) {
-            ScreenRatioQualifier qualifier = new ScreenRatioQualifier(size);
-            config.setScreenRatioQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/ScreenSizeQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/ScreenSizeQualifier.java
deleted file mode 100644
index 77193a2..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/ScreenSizeQualifier.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.ResourceEnum;
-import com.android.resources.ScreenSize;
-
-/**
- * Resource Qualifier for Screen Size. Size can be "small", "normal", "large" and "x-large"
- */
-public class ScreenSizeQualifier extends EnumBasedResourceQualifier {
-
-    public static final String NAME = "Screen Size";
-
-    private ScreenSize mValue = null;
-
-
-    public ScreenSizeQualifier() {
-    }
-
-    public ScreenSizeQualifier(ScreenSize value) {
-        mValue = value;
-    }
-
-    public ScreenSize getValue() {
-        return mValue;
-    }
-
-    @Override
-    ResourceEnum getEnumValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return "Size";
-    }
-
-    @Override
-    public int since() {
-        return 4;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        ScreenSize size = ScreenSize.getEnum(value);
-        if (size != null) {
-            ScreenSizeQualifier qualifier = new ScreenSizeQualifier(size);
-            config.setScreenSizeQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/ScreenWidthQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/ScreenWidthQualifier.java
deleted file mode 100644
index ab9134b..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/ScreenWidthQualifier.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Resource Qualifier for Screen Pixel Density.
- */
-public final class ScreenWidthQualifier extends ResourceQualifier {
-    /** Default screen size value. This means the property is not set */
-    final static int DEFAULT_SIZE = -1;
-
-    private final static Pattern sParsePattern = Pattern.compile("^w(\\d+)dp$"); //$NON-NLS-1$
-    private final static String sPrintPattern = "w%1$ddp"; //$NON-NLS-1$
-
-    public static final String NAME = "Screen Width";
-
-    private int mValue = DEFAULT_SIZE;
-
-    public ScreenWidthQualifier() {
-        // pass
-    }
-
-    public ScreenWidthQualifier(int value) {
-        mValue = value;
-    }
-
-    public int getValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return NAME;
-    }
-
-    @Override
-    public int since() {
-        return 13;
-    }
-
-    @Override
-    public boolean hasFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValid() {
-        return mValue != DEFAULT_SIZE;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        Matcher m = sParsePattern.matcher(value);
-        if (m.matches()) {
-            String v = m.group(1);
-
-            ScreenWidthQualifier qualifier = getQualifier(v);
-            if (qualifier != null) {
-                config.setScreenWidthQualifier(qualifier);
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public static ScreenWidthQualifier getQualifier(String value) {
-        try {
-            int dp = Integer.parseInt(value);
-
-            ScreenWidthQualifier qualifier = new ScreenWidthQualifier();
-            qualifier.mValue = dp;
-            return qualifier;
-
-        } catch (NumberFormatException e) {
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean isMatchFor(ResourceQualifier qualifier) {
-        // this is the match only of the current dp value is lower or equal to the
-        if (qualifier instanceof ScreenWidthQualifier) {
-            return mValue <= ((ScreenWidthQualifier) qualifier).mValue;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean isBetterMatchThan(ResourceQualifier compareTo, ResourceQualifier reference) {
-        if (compareTo == null) {
-            return true;
-        }
-
-        ScreenWidthQualifier compareQ = (ScreenWidthQualifier)compareTo;
-        ScreenWidthQualifier referenceQ = (ScreenWidthQualifier)reference;
-
-        if (compareQ.mValue == referenceQ.mValue) {
-            // what we have is already the best possible match (exact match)
-            return false;
-        } else if (mValue == referenceQ.mValue) {
-            // got new exact value, this is the best!
-            return true;
-        } else {
-            // get the qualifier that has the width that is the closest to the reference, but not
-            // above. (which is guaranteed when this is called as isMatchFor is called first.
-            return mValue > compareQ.mValue;
-        }
-    }
-
-    @Override
-    public String getFolderSegment() {
-        return String.format(sPrintPattern, mValue);
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        if (isValid()) {
-            return getFolderSegment();
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        if (isValid()) {
-            return getFolderSegment();
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public int hashCode() {
-        return mValue;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        ScreenWidthQualifier other = (ScreenWidthQualifier) obj;
-        if (mValue != other.mValue) {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/SmallestScreenWidthQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/SmallestScreenWidthQualifier.java
deleted file mode 100644
index 35d1ab1..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/SmallestScreenWidthQualifier.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Resource Qualifier for Screen Pixel Density.
- */
-public final class SmallestScreenWidthQualifier extends ResourceQualifier {
-    /** Default screen size value. This means the property is not set */
-    final static int DEFAULT_SIZE = -1;
-
-    private final static Pattern sParsePattern = Pattern.compile("^sw(\\d+)dp$"); //$NON-NLS-1$
-    private final static String sPrintPattern = "sw%1$ddp"; //$NON-NLS-1$
-
-    public static final String NAME = "Smallest Screen Width";
-
-    private int mValue = DEFAULT_SIZE;
-
-    public SmallestScreenWidthQualifier() {
-        // pass
-    }
-
-    public SmallestScreenWidthQualifier(int value) {
-        mValue = value;
-    }
-
-    public int getValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return NAME;
-    }
-
-    @Override
-    public int since() {
-        return 13;
-    }
-
-    @Override
-    public boolean hasFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean isValid() {
-        return mValue != DEFAULT_SIZE;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        Matcher m = sParsePattern.matcher(value);
-        if (m.matches()) {
-            String v = m.group(1);
-
-            SmallestScreenWidthQualifier qualifier = getQualifier(v);
-            if (qualifier != null) {
-                config.setSmallestScreenWidthQualifier(qualifier);
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public static SmallestScreenWidthQualifier getQualifier(String value) {
-        try {
-            int dp = Integer.parseInt(value);
-
-            SmallestScreenWidthQualifier qualifier = new SmallestScreenWidthQualifier();
-            qualifier.mValue = dp;
-            return qualifier;
-
-        } catch (NumberFormatException e) {
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean isMatchFor(ResourceQualifier qualifier) {
-        // this is the match only of the current dp value is lower or equal to the
-        if (qualifier instanceof SmallestScreenWidthQualifier) {
-            return mValue <= ((SmallestScreenWidthQualifier) qualifier).mValue;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean isBetterMatchThan(ResourceQualifier compareTo, ResourceQualifier reference) {
-        if (compareTo == null) {
-            return true;
-        }
-
-        SmallestScreenWidthQualifier compareQ = (SmallestScreenWidthQualifier)compareTo;
-        SmallestScreenWidthQualifier referenceQ = (SmallestScreenWidthQualifier)reference;
-
-        if (compareQ.mValue == referenceQ.mValue) {
-            // what we have is already the best possible match (exact match)
-            return false;
-        } else if (mValue == referenceQ.mValue) {
-            // got new exact value, this is the best!
-            return true;
-        } else {
-            // get the qualifier that has the width that is the closest to the reference, but not
-            // above. (which is guaranteed when this is called as isMatchFor is called first.
-            return mValue > compareQ.mValue;
-        }
-    }
-
-    @Override
-    public String getFolderSegment() {
-        return String.format(sPrintPattern, mValue);
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        if (isValid()) {
-            return getFolderSegment();
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        if (isValid()) {
-            return getFolderSegment();
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public int hashCode() {
-        return mValue;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        SmallestScreenWidthQualifier other = (SmallestScreenWidthQualifier) obj;
-        if (mValue != other.mValue) {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/TextInputMethodQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/TextInputMethodQualifier.java
deleted file mode 100644
index 784d43d..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/TextInputMethodQualifier.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.Keyboard;
-import com.android.resources.ResourceEnum;
-
-/**
- * Resource Qualifier for Text Input Method.
- */
-public final class TextInputMethodQualifier extends EnumBasedResourceQualifier {
-
-    public static final String NAME = "Text Input Method";
-
-    private Keyboard mValue;
-
-
-    public TextInputMethodQualifier() {
-        // pass
-    }
-
-    public TextInputMethodQualifier(Keyboard value) {
-        mValue = value;
-    }
-
-    public Keyboard getValue() {
-        return mValue;
-    }
-
-    @Override
-    ResourceEnum getEnumValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return "Text Input";
-    }
-
-    @Override
-    public int since() {
-        return 1;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        Keyboard method = Keyboard.getEnum(value);
-        if (method != null) {
-            TextInputMethodQualifier qualifier = new TextInputMethodQualifier();
-            qualifier.mValue = method;
-            config.setTextInputMethodQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/TouchScreenQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/TouchScreenQualifier.java
deleted file mode 100644
index dce9f1d..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/TouchScreenQualifier.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.ResourceEnum;
-import com.android.resources.TouchScreen;
-
-
-/**
- * Resource Qualifier for Touch Screen type.
- */
-public final class TouchScreenQualifier extends EnumBasedResourceQualifier {
-
-    public static final String NAME = "Touch Screen";
-
-    private TouchScreen mValue;
-
-    public TouchScreenQualifier() {
-        // pass
-    }
-
-    public TouchScreenQualifier(TouchScreen touchValue) {
-        mValue = touchValue;
-    }
-
-    public TouchScreen getValue() {
-        return mValue;
-    }
-
-    @Override
-    ResourceEnum getEnumValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return NAME;
-    }
-
-    @Override
-    public int since() {
-        return 1;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        TouchScreen type = TouchScreen.getEnum(value);
-        if (type != null) {
-            TouchScreenQualifier qualifier = new TouchScreenQualifier();
-            qualifier.mValue = type;
-            config.setTouchTypeQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/UiModeQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/UiModeQualifier.java
deleted file mode 100644
index 1e302c5..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/UiModeQualifier.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.ResourceEnum;
-import com.android.resources.UiMode;
-
-/**
- * Resource Qualifier for UI Mode.
- */
-public final class UiModeQualifier extends EnumBasedResourceQualifier {
-
-    public static final String NAME = "UI Mode";
-
-    private UiMode mValue;
-
-    public UiModeQualifier() {
-        // pass
-    }
-
-    public UiModeQualifier(UiMode value) {
-        mValue = value;
-    }
-
-    public UiMode getValue() {
-        return mValue;
-    }
-
-    @Override
-    ResourceEnum getEnumValue() {
-        return mValue;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return NAME;
-    }
-
-    @Override
-    public int since() {
-        return 8;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        UiMode mode = UiMode.getEnum(value);
-        if (mode != null) {
-            UiModeQualifier qualifier = new UiModeQualifier(mode);
-            config.setUiModeQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean isMatchFor(ResourceQualifier qualifier) {
-        // only normal is a match for all UI mode, because it's not an actual mode.
-        if (mValue == UiMode.NORMAL) {
-            return true;
-        }
-
-        // others must be an exact match
-        return ((UiModeQualifier)qualifier).mValue == mValue;
-    }
-
-    @Override
-    public boolean isBetterMatchThan(ResourceQualifier compareTo, ResourceQualifier reference) {
-        if (compareTo == null) {
-            return true;
-        }
-
-        UiModeQualifier compareQualifier = (UiModeQualifier)compareTo;
-        UiModeQualifier referenceQualifier = (UiModeQualifier)reference;
-
-        if (compareQualifier.getValue() == referenceQualifier.getValue()) {
-            // what we have is already the best possible match (exact match)
-            return false;
-        } else  if (mValue == referenceQualifier.mValue) {
-            // got new exact value, this is the best!
-            return true;
-        } else if (mValue == UiMode.NORMAL) {
-            // else "normal" can be a match in case there's no exact match
-            return true;
-        }
-
-        return false;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/resources/configuration/VersionQualifier.java b/sdk_common/src/com/android/ide/common/resources/configuration/VersionQualifier.java
deleted file mode 100644
index 078d4af..0000000
--- a/sdk_common/src/com/android/ide/common/resources/configuration/VersionQualifier.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Resource Qualifier for Platform Version.
- */
-public final class VersionQualifier extends ResourceQualifier {
-    /** Default pixel density value. This means the property is not set. */
-    private final static int DEFAULT_VERSION = -1;
-
-    private final static Pattern sVersionPattern = Pattern.compile("^v(\\d+)$");//$NON-NLS-1$
-
-    private int mVersion = DEFAULT_VERSION;
-
-    public static final String NAME = "Platform Version";
-
-    /**
-     * Creates and returns a qualifier from the given folder segment. If the segment is incorrect,
-     * <code>null</code> is returned.
-     * @param segment the folder segment from which to create a qualifier.
-     * @return a new {@link VersionQualifier} object or <code>null</code>
-     */
-    public static VersionQualifier getQualifier(String segment) {
-        Matcher m = sVersionPattern.matcher(segment);
-        if (m.matches()) {
-            String v = m.group(1);
-
-            int code = -1;
-            try {
-                code = Integer.parseInt(v);
-            } catch (NumberFormatException e) {
-                // looks like the string we extracted wasn't a valid number.
-                return null;
-            }
-
-            VersionQualifier qualifier = new VersionQualifier();
-            qualifier.mVersion = code;
-            return qualifier;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the folder name segment for the given value. This is equivalent to calling
-     * {@link #toString()} on a {@link VersionQualifier} object.
-     * @param version the value of the qualifier, as returned by {@link #getVersion()}.
-     */
-    public static String getFolderSegment(int version) {
-        if (version != DEFAULT_VERSION) {
-            return String.format("v%1$d", version); //$NON-NLS-1$
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    public VersionQualifier(int apiLevel) {
-        mVersion = apiLevel;
-    }
-
-    public VersionQualifier() {
-        //pass
-    }
-
-    public int getVersion() {
-        return mVersion;
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    public String getShortName() {
-        return "Version";
-    }
-
-    @Override
-    public int since() {
-        return 1;
-    }
-
-    @Override
-    public boolean isValid() {
-        return mVersion != DEFAULT_VERSION;
-    }
-
-    @Override
-    public boolean hasFakeValue() {
-        return false;
-    }
-
-    @Override
-    public boolean checkAndSet(String value, FolderConfiguration config) {
-        VersionQualifier qualifier = getQualifier(value);
-        if (qualifier != null) {
-            config.setVersionQualifier(qualifier);
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean equals(Object qualifier) {
-        if (qualifier instanceof VersionQualifier) {
-            return mVersion == ((VersionQualifier)qualifier).mVersion;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean isMatchFor(ResourceQualifier qualifier) {
-        if (qualifier instanceof VersionQualifier) {
-            // it is considered a match if the api level is equal or lower to the given qualifier
-            return mVersion <= ((VersionQualifier) qualifier).mVersion;
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean isBetterMatchThan(ResourceQualifier compareTo, ResourceQualifier reference) {
-        if (compareTo == null) {
-            return true;
-        }
-
-        VersionQualifier compareQ = (VersionQualifier)compareTo;
-        VersionQualifier referenceQ = (VersionQualifier)reference;
-
-        if (compareQ.mVersion == referenceQ.mVersion) {
-            // what we have is already the best possible match (exact match)
-            return false;
-        } else if (mVersion == referenceQ.mVersion) {
-            // got new exact value, this is the best!
-            return true;
-        } else {
-            // in all case we're going to prefer the higher version (since they have been filtered
-            // to not be too high
-            return mVersion > compareQ.mVersion;
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return mVersion;
-    }
-
-    /**
-     * Returns the string used to represent this qualifier in the folder name.
-     */
-    @Override
-    public String getFolderSegment() {
-        return getFolderSegment(mVersion);
-    }
-
-    @Override
-    public String getShortDisplayValue() {
-        if (mVersion != DEFAULT_VERSION) {
-            return String.format("API %1$d", mVersion);
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getLongDisplayValue() {
-        if (mVersion != DEFAULT_VERSION) {
-            return String.format("API Level %1$d", mVersion);
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/sdk/LoadStatus.java b/sdk_common/src/com/android/ide/common/sdk/LoadStatus.java
deleted file mode 100644
index babbd63..0000000
--- a/sdk_common/src/com/android/ide/common/sdk/LoadStatus.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.sdk;
-
-/**
- * Enum for loading status of various SDK parts.
- */
-public enum LoadStatus {
-    LOADING, LOADED, FAILED;
-}
diff --git a/sdk_common/src/com/android/ide/common/xml/AndroidManifestParser.java b/sdk_common/src/com/android/ide/common/xml/AndroidManifestParser.java
deleted file mode 100644
index 7fde6ce..0000000
--- a/sdk_common/src/com/android/ide/common/xml/AndroidManifestParser.java
+++ /dev/null
@@ -1,672 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.xml;
-
-import com.android.SdkConstants;
-import com.android.ide.common.xml.ManifestData.Activity;
-import com.android.ide.common.xml.ManifestData.Instrumentation;
-import com.android.ide.common.xml.ManifestData.SupportsScreens;
-import com.android.ide.common.xml.ManifestData.UsesConfiguration;
-import com.android.ide.common.xml.ManifestData.UsesFeature;
-import com.android.ide.common.xml.ManifestData.UsesLibrary;
-import com.android.io.IAbstractFile;
-import com.android.io.IAbstractFolder;
-import com.android.io.StreamException;
-import com.android.resources.Keyboard;
-import com.android.resources.Navigation;
-import com.android.resources.TouchScreen;
-import com.android.xml.AndroidManifest;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Locale;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-public class AndroidManifestParser {
-
-    private final static int LEVEL_TOP = 0;
-    private final static int LEVEL_INSIDE_MANIFEST = 1;
-    private final static int LEVEL_INSIDE_APPLICATION = 2;
-    private final static int LEVEL_INSIDE_APP_COMPONENT = 3;
-    private final static int LEVEL_INSIDE_INTENT_FILTER = 4;
-
-    private final static String ACTION_MAIN = "android.intent.action.MAIN"; //$NON-NLS-1$
-    private final static String CATEGORY_LAUNCHER = "android.intent.category.LAUNCHER"; //$NON-NLS-1$
-
-    public interface ManifestErrorHandler extends ErrorHandler {
-        /**
-         * Handles a parsing error and an optional line number.
-         */
-        void handleError(Exception exception, int lineNumber);
-
-        /**
-         * Checks that a class is valid and can be used in the Android Manifest.
-         * <p/>
-         * Errors are put as {@code org.eclipse.core.resources.IMarker} on the manifest file.
-         *
-         * @param locator
-         * @param className the fully qualified name of the class to test.
-         * @param superClassName the fully qualified name of the class it is supposed to extend.
-         * @param testVisibility if <code>true</code>, the method will check the visibility of
-         * the class or of its constructors.
-         */
-        void checkClass(Locator locator, String className, String superClassName,
-                boolean testVisibility);
-    }
-
-    /**
-     * XML error & data handler used when parsing the AndroidManifest.xml file.
-     * <p/>
-     * During parsing this will fill up the {@link ManifestData} object given to the constructor
-     * and call out errors to the given {@link ManifestErrorHandler}.
-     */
-    private static class ManifestHandler extends DefaultHandler {
-
-        //--- temporary data/flags used during parsing
-        private final ManifestData mManifestData;
-        private final ManifestErrorHandler mErrorHandler;
-        private int mCurrentLevel = 0;
-        private int mValidLevel = 0;
-        private Activity mCurrentActivity = null;
-        private Locator mLocator;
-
-        /**
-         * Creates a new {@link ManifestHandler}.
-         *
-         * @param manifestFile The manifest file being parsed. Can be null.
-         * @param manifestData Class containing the manifest info obtained during the parsing.
-         * @param errorHandler An optional error handler.
-         */
-        ManifestHandler(IAbstractFile manifestFile, ManifestData manifestData,
-                ManifestErrorHandler errorHandler) {
-            super();
-            mManifestData = manifestData;
-            mErrorHandler = errorHandler;
-        }
-
-        /* (non-Javadoc)
-         * @see org.xml.sax.helpers.DefaultHandler#setDocumentLocator(org.xml.sax.Locator)
-         */
-        @Override
-        public void setDocumentLocator(Locator locator) {
-            mLocator = locator;
-            super.setDocumentLocator(locator);
-        }
-
-        /* (non-Javadoc)
-         * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String,
-         * java.lang.String, org.xml.sax.Attributes)
-         */
-        @Override
-        public void startElement(String uri, String localName, String name, Attributes attributes)
-                throws SAXException {
-            try {
-                if (mManifestData == null) {
-                    return;
-                }
-
-                // if we're at a valid level
-                if (mValidLevel == mCurrentLevel) {
-                    String value;
-                    switch (mValidLevel) {
-                        case LEVEL_TOP:
-                            if (AndroidManifest.NODE_MANIFEST.equals(localName)) {
-                                // lets get the package name.
-                                mManifestData.mPackage = getAttributeValue(attributes,
-                                        AndroidManifest.ATTRIBUTE_PACKAGE,
-                                        false /* hasNamespace */);
-
-                                // and the versionCode
-                                String tmp = getAttributeValue(attributes,
-                                        AndroidManifest.ATTRIBUTE_VERSIONCODE, true);
-                                if (tmp != null) {
-                                    try {
-                                        mManifestData.mVersionCode = Integer.valueOf(tmp);
-                                    } catch (NumberFormatException e) {
-                                        // keep null in the field.
-                                    }
-                                }
-                                mValidLevel++;
-                            }
-                            break;
-                        case LEVEL_INSIDE_MANIFEST:
-                            if (AndroidManifest.NODE_APPLICATION.equals(localName)) {
-                                value = getAttributeValue(attributes,
-                                        AndroidManifest.ATTRIBUTE_PROCESS,
-                                        true /* hasNamespace */);
-                                if (value != null) {
-                                    mManifestData.addProcessName(value);
-                                }
-
-                                value = getAttributeValue(attributes,
-                                        AndroidManifest.ATTRIBUTE_DEBUGGABLE,
-                                        true /* hasNamespace*/);
-                                if (value != null) {
-                                    mManifestData.mDebuggable = Boolean.parseBoolean(value);
-                                }
-
-                                mValidLevel++;
-                            } else if (AndroidManifest.NODE_USES_SDK.equals(localName)) {
-                                mManifestData.setMinSdkVersionString(getAttributeValue(attributes,
-                                        AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION,
-                                        true /* hasNamespace */));
-                                mManifestData.setTargetSdkVersionString(getAttributeValue(attributes,
-                                        AndroidManifest.ATTRIBUTE_TARGET_SDK_VERSION,
-                                        true /* hasNamespace */));
-                            } else if (AndroidManifest.NODE_INSTRUMENTATION.equals(localName)) {
-                                processInstrumentationNode(attributes);
-
-                            } else if (AndroidManifest.NODE_SUPPORTS_SCREENS.equals(localName)) {
-                                processSupportsScreensNode(attributes);
-
-                            } else if (AndroidManifest.NODE_USES_CONFIGURATION.equals(localName)) {
-                                processUsesConfiguration(attributes);
-
-                            } else if (AndroidManifest.NODE_USES_FEATURE.equals(localName)) {
-                                UsesFeature feature = new UsesFeature();
-
-                                // get the name
-                                value = getAttributeValue(attributes,
-                                        AndroidManifest.ATTRIBUTE_NAME,
-                                        true /* hasNamespace */);
-                                if (value != null) {
-                                    feature.mName = value;
-                                }
-
-                                // read the required attribute
-                                value = getAttributeValue(attributes,
-                                        AndroidManifest.ATTRIBUTE_REQUIRED,
-                                        true /*hasNamespace*/);
-                                if (value != null) {
-                                    Boolean b = Boolean.valueOf(value);
-                                    if (b != null) {
-                                        feature.mRequired = b;
-                                    }
-                                }
-
-                                // read the gl es attribute
-                                value = getAttributeValue(attributes,
-                                        AndroidManifest.ATTRIBUTE_GLESVERSION,
-                                        true /*hasNamespace*/);
-                                if (value != null) {
-                                    try {
-                                        int version = Integer.decode(value);
-                                        feature.mGlEsVersion = version;
-                                    } catch (NumberFormatException e) {
-                                        // ignore
-                                    }
-
-                                }
-
-                                mManifestData.mFeatures.add(feature);
-                            }
-                            break;
-                        case LEVEL_INSIDE_APPLICATION:
-                            if (AndroidManifest.NODE_ACTIVITY.equals(localName)
-                                    || AndroidManifest.NODE_ACTIVITY_ALIAS.equals(localName)) {
-                                processActivityNode(attributes);
-                                mValidLevel++;
-                            } else if (AndroidManifest.NODE_SERVICE.equals(localName)) {
-                                processNode(attributes, SdkConstants.CLASS_SERVICE);
-                                mValidLevel++;
-                            } else if (AndroidManifest.NODE_RECEIVER.equals(localName)) {
-                                processNode(attributes, SdkConstants.CLASS_BROADCASTRECEIVER);
-                                mValidLevel++;
-                            } else if (AndroidManifest.NODE_PROVIDER.equals(localName)) {
-                                processNode(attributes, SdkConstants.CLASS_CONTENTPROVIDER);
-                                mValidLevel++;
-                            } else if (AndroidManifest.NODE_USES_LIBRARY.equals(localName)) {
-                                value = getAttributeValue(attributes,
-                                        AndroidManifest.ATTRIBUTE_NAME,
-                                        true /* hasNamespace */);
-                                if (value != null) {
-                                    UsesLibrary library = new UsesLibrary();
-                                    library.mName = value;
-
-                                    // read the required attribute
-                                    value = getAttributeValue(attributes,
-                                            AndroidManifest.ATTRIBUTE_REQUIRED,
-                                            true /*hasNamespace*/);
-                                    if (value != null) {
-                                        Boolean b = Boolean.valueOf(value);
-                                        if (b != null) {
-                                            library.mRequired = b;
-                                        }
-                                    }
-
-                                    mManifestData.mLibraries.add(library);
-                                }
-                            }
-                            break;
-                        case LEVEL_INSIDE_APP_COMPONENT:
-                            // only process this level if we are in an activity
-                            if (mCurrentActivity != null &&
-                                    AndroidManifest.NODE_INTENT.equals(localName)) {
-                                mCurrentActivity.resetIntentFilter();
-                                mValidLevel++;
-                            }
-                            break;
-                        case LEVEL_INSIDE_INTENT_FILTER:
-                            if (mCurrentActivity != null) {
-                                if (AndroidManifest.NODE_ACTION.equals(localName)) {
-                                    // get the name attribute
-                                    String action = getAttributeValue(attributes,
-                                            AndroidManifest.ATTRIBUTE_NAME,
-                                            true /* hasNamespace */);
-                                    if (action != null) {
-                                        mCurrentActivity.setHasAction(true);
-                                        mCurrentActivity.setHasMainAction(
-                                                ACTION_MAIN.equals(action));
-                                    }
-                                } else if (AndroidManifest.NODE_CATEGORY.equals(localName)) {
-                                    String category = getAttributeValue(attributes,
-                                            AndroidManifest.ATTRIBUTE_NAME,
-                                            true /* hasNamespace */);
-                                    if (CATEGORY_LAUNCHER.equals(category)) {
-                                        mCurrentActivity.setHasLauncherCategory(true);
-                                    }
-                                }
-
-                                // no need to increase mValidLevel as we don't process anything
-                                // below this level.
-                            }
-                            break;
-                    }
-                }
-
-                mCurrentLevel++;
-            } finally {
-                super.startElement(uri, localName, name, attributes);
-            }
-        }
-
-        /* (non-Javadoc)
-         * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String,
-         * java.lang.String)
-         */
-        @Override
-        public void endElement(String uri, String localName, String name) throws SAXException {
-            try {
-                if (mManifestData == null) {
-                    return;
-                }
-
-                // decrement the levels.
-                if (mValidLevel == mCurrentLevel) {
-                    mValidLevel--;
-                }
-                mCurrentLevel--;
-
-                // if we're at a valid level
-                // process the end of the element
-                if (mValidLevel == mCurrentLevel) {
-                    switch (mValidLevel) {
-                        case LEVEL_INSIDE_APPLICATION:
-                            mCurrentActivity = null;
-                            break;
-                        case LEVEL_INSIDE_APP_COMPONENT:
-                            // if we found both a main action and a launcher category, this is our
-                            // launcher activity!
-                            if (mManifestData.mLauncherActivity == null &&
-                                    mCurrentActivity != null &&
-                                    mCurrentActivity.isHomeActivity() &&
-                                    mCurrentActivity.isExported()) {
-                                mManifestData.mLauncherActivity = mCurrentActivity;
-                            }
-                            break;
-                        default:
-                            break;
-                    }
-
-                }
-            } finally {
-                super.endElement(uri, localName, name);
-            }
-        }
-
-        /* (non-Javadoc)
-         * @see org.xml.sax.helpers.DefaultHandler#error(org.xml.sax.SAXParseException)
-         */
-        @Override
-        public void error(SAXParseException e) {
-            if (mErrorHandler != null) {
-                mErrorHandler.handleError(e, e.getLineNumber());
-            }
-        }
-
-        /* (non-Javadoc)
-         * @see org.xml.sax.helpers.DefaultHandler#fatalError(org.xml.sax.SAXParseException)
-         */
-        @Override
-        public void fatalError(SAXParseException e) {
-            if (mErrorHandler != null) {
-                mErrorHandler.handleError(e, e.getLineNumber());
-            }
-        }
-
-        /* (non-Javadoc)
-         * @see org.xml.sax.helpers.DefaultHandler#warning(org.xml.sax.SAXParseException)
-         */
-        @Override
-        public void warning(SAXParseException e) throws SAXException {
-            if (mErrorHandler != null) {
-                mErrorHandler.warning(e);
-            }
-        }
-
-        /**
-         * Processes the activity node.
-         * @param attributes the attributes for the activity node.
-         */
-        private void processActivityNode(Attributes attributes) {
-            // lets get the activity name, and add it to the list
-            String activityName = getAttributeValue(attributes, AndroidManifest.ATTRIBUTE_NAME,
-                    true /* hasNamespace */);
-            if (activityName != null) {
-                activityName = AndroidManifest.combinePackageAndClassName(mManifestData.mPackage,
-                        activityName);
-
-                // get the exported flag.
-                String exportedStr = getAttributeValue(attributes,
-                        AndroidManifest.ATTRIBUTE_EXPORTED, true);
-                boolean exported = exportedStr == null ||
-                        exportedStr.toLowerCase(Locale.US).equals("true"); //$NON-NLS-1$
-                mCurrentActivity = new Activity(activityName, exported);
-                mManifestData.mActivities.add(mCurrentActivity);
-
-                if (mErrorHandler != null) {
-                    mErrorHandler.checkClass(mLocator, activityName, SdkConstants.CLASS_ACTIVITY,
-                            true /* testVisibility */);
-                }
-            } else {
-                // no activity found! Aapt will output an error,
-                // so we don't have to do anything
-                mCurrentActivity = null;
-            }
-
-            String processName = getAttributeValue(attributes, AndroidManifest.ATTRIBUTE_PROCESS,
-                    true /* hasNamespace */);
-            if (processName != null) {
-                mManifestData.addProcessName(processName);
-            }
-        }
-
-        /**
-         * Processes the service/receiver/provider nodes.
-         * @param attributes the attributes for the activity node.
-         * @param superClassName the fully qualified name of the super class that this
-         * node is representing
-         */
-        private void processNode(Attributes attributes, String superClassName) {
-            // lets get the class name, and check it if required.
-            String serviceName = getAttributeValue(attributes, AndroidManifest.ATTRIBUTE_NAME,
-                    true /* hasNamespace */);
-            if (serviceName != null) {
-                serviceName = AndroidManifest.combinePackageAndClassName(mManifestData.mPackage,
-                        serviceName);
-
-                if (mErrorHandler != null) {
-                    mErrorHandler.checkClass(mLocator, serviceName, superClassName,
-                            false /* testVisibility */);
-                }
-            }
-
-            String processName = getAttributeValue(attributes, AndroidManifest.ATTRIBUTE_PROCESS,
-                    true /* hasNamespace */);
-            if (processName != null) {
-                mManifestData.addProcessName(processName);
-            }
-        }
-
-        /**
-         * Processes the instrumentation node.
-         * @param attributes the attributes for the instrumentation node.
-         */
-        private void processInstrumentationNode(Attributes attributes) {
-            // lets get the class name, and check it if required.
-            String instrumentationName = getAttributeValue(attributes,
-                    AndroidManifest.ATTRIBUTE_NAME,
-                    true /* hasNamespace */);
-            if (instrumentationName != null) {
-                String instrClassName = AndroidManifest.combinePackageAndClassName(
-                        mManifestData.mPackage, instrumentationName);
-                String targetPackage = getAttributeValue(attributes,
-                        AndroidManifest.ATTRIBUTE_TARGET_PACKAGE,
-                        true /* hasNamespace */);
-                mManifestData.mInstrumentations.add(
-                        new Instrumentation(instrClassName, targetPackage));
-                if (mErrorHandler != null) {
-                    mErrorHandler.checkClass(mLocator, instrClassName,
-                            SdkConstants.CLASS_INSTRUMENTATION, true /* testVisibility */);
-                }
-            }
-        }
-
-        /**
-         * Processes the supports-screens node.
-         * @param attributes the attributes for the supports-screens node.
-         */
-        private void processSupportsScreensNode(Attributes attributes) {
-            mManifestData.mSupportsScreensFromManifest = new SupportsScreens();
-
-            mManifestData.mSupportsScreensFromManifest.setResizeable(getAttributeBooleanValue(
-                    attributes, AndroidManifest.ATTRIBUTE_RESIZEABLE, true /*hasNamespace*/));
-
-            mManifestData.mSupportsScreensFromManifest.setAnyDensity(getAttributeBooleanValue(
-                    attributes, AndroidManifest.ATTRIBUTE_ANYDENSITY, true /*hasNamespace*/));
-
-            mManifestData.mSupportsScreensFromManifest.setSmallScreens(getAttributeBooleanValue(
-                    attributes, AndroidManifest.ATTRIBUTE_SMALLSCREENS, true /*hasNamespace*/));
-
-            mManifestData.mSupportsScreensFromManifest.setNormalScreens(getAttributeBooleanValue(
-                    attributes, AndroidManifest.ATTRIBUTE_NORMALSCREENS, true /*hasNamespace*/));
-
-            mManifestData.mSupportsScreensFromManifest.setLargeScreens(getAttributeBooleanValue(
-                    attributes, AndroidManifest.ATTRIBUTE_LARGESCREENS, true /*hasNamespace*/));
-        }
-
-        /**
-         * Processes the supports-screens node.
-         * @param attributes the attributes for the supports-screens node.
-         */
-        private void processUsesConfiguration(Attributes attributes) {
-            mManifestData.mUsesConfiguration = new UsesConfiguration();
-
-            mManifestData.mUsesConfiguration.mReqFiveWayNav = getAttributeBooleanValue(
-                    attributes,
-                    AndroidManifest.ATTRIBUTE_REQ_5WAYNAV, true /*hasNamespace*/);
-            mManifestData.mUsesConfiguration.mReqNavigation = Navigation.getEnum(
-                    getAttributeValue(attributes,
-                            AndroidManifest.ATTRIBUTE_REQ_NAVIGATION, true /*hasNamespace*/));
-            mManifestData.mUsesConfiguration.mReqHardKeyboard = getAttributeBooleanValue(
-                    attributes,
-                    AndroidManifest.ATTRIBUTE_REQ_HARDKEYBOARD, true /*hasNamespace*/);
-            mManifestData.mUsesConfiguration.mReqKeyboardType = Keyboard.getEnum(
-                    getAttributeValue(attributes,
-                            AndroidManifest.ATTRIBUTE_REQ_KEYBOARDTYPE, true /*hasNamespace*/));
-            mManifestData.mUsesConfiguration.mReqTouchScreen = TouchScreen.getEnum(
-                    getAttributeValue(attributes,
-                            AndroidManifest.ATTRIBUTE_REQ_TOUCHSCREEN, true /*hasNamespace*/));
-        }
-
-        /**
-         * Searches through the attributes list for a particular one and returns its value.
-         * @param attributes the attribute list to search through
-         * @param attributeName the name of the attribute to look for.
-         * @param hasNamespace Indicates whether the attribute has an android namespace.
-         * @return a String with the value or null if the attribute was not found.
-         * @see SdkConstants#NS_RESOURCES
-         */
-        private String getAttributeValue(Attributes attributes, String attributeName,
-                boolean hasNamespace) {
-            int count = attributes.getLength();
-            for (int i = 0 ; i < count ; i++) {
-                if (attributeName.equals(attributes.getLocalName(i)) &&
-                        ((hasNamespace &&
-                                SdkConstants.NS_RESOURCES.equals(attributes.getURI(i))) ||
-                                (hasNamespace == false && attributes.getURI(i).length() == 0))) {
-                    return attributes.getValue(i);
-                }
-            }
-
-            return null;
-        }
-
-        /**
-         * Searches through the attributes list for a particular one and returns its value as a
-         * Boolean. If the attribute is not present, this will return null.
-         * @param attributes the attribute list to search through
-         * @param attributeName the name of the attribute to look for.
-         * @param hasNamespace Indicates whether the attribute has an android namespace.
-         * @return a String with the value or null if the attribute was not found.
-         * @see SdkConstants#NS_RESOURCES
-         */
-        private Boolean getAttributeBooleanValue(Attributes attributes, String attributeName,
-                boolean hasNamespace) {
-            int count = attributes.getLength();
-            for (int i = 0 ; i < count ; i++) {
-                if (attributeName.equals(attributes.getLocalName(i)) &&
-                        ((hasNamespace &&
-                                SdkConstants.NS_RESOURCES.equals(attributes.getURI(i))) ||
-                                (hasNamespace == false && attributes.getURI(i).length() == 0))) {
-                    String attr = attributes.getValue(i);
-                    if (attr != null) {
-                        return Boolean.valueOf(attr);
-                    } else {
-                        return null;
-                    }
-                }
-            }
-
-            return null;
-        }
-
-    }
-
-    private final static SAXParserFactory sParserFactory;
-
-    static {
-        sParserFactory = SAXParserFactory.newInstance();
-        sParserFactory.setNamespaceAware(true);
-    }
-
-    /**
-     * Parses the Android Manifest, and returns a {@link ManifestData} object containing the
-     * result of the parsing.
-     *
-     * @param manifestFile the {@link IAbstractFile} representing the manifest file.
-     * @param gatherData indicates whether the parsing will extract data from the manifest. If false
-     * the method will always return null.
-     * @param errorHandler an optional errorHandler.
-     * @return A class containing the manifest info obtained during the parsing, or null on error.
-     *
-     * @throws StreamException
-     * @throws IOException
-     * @throws SAXException
-     * @throws ParserConfigurationException
-     */
-    public static ManifestData parse(
-            IAbstractFile manifestFile,
-            boolean gatherData,
-            ManifestErrorHandler errorHandler)
-                throws SAXException, IOException, StreamException, ParserConfigurationException {
-        if (manifestFile != null) {
-            SAXParser parser = sParserFactory.newSAXParser();
-
-            ManifestData data = null;
-            if (gatherData) {
-                data = new ManifestData();
-            }
-
-            ManifestHandler manifestHandler = new ManifestHandler(manifestFile,
-                    data, errorHandler);
-            parser.parse(new InputSource(manifestFile.getContents()), manifestHandler);
-
-            return data;
-        }
-
-        return null;
-    }
-
-    /**
-     * Parses the Android Manifest, and returns an object containing the result of the parsing.
-     *
-     * <p/>
-     * This is the equivalent of calling <pre>parse(manifestFile, true, null)</pre>
-     *
-     * @param manifestFile the manifest file to parse.
-     *
-     * @throws ParserConfigurationException
-     * @throws StreamException
-     * @throws IOException
-     * @throws SAXException
-     */
-    public static ManifestData parse(IAbstractFile manifestFile)
-            throws SAXException, IOException, StreamException, ParserConfigurationException {
-        return parse(manifestFile, true, null);
-    }
-
-    public static ManifestData parse(IAbstractFolder projectFolder)
-            throws SAXException, IOException, StreamException, ParserConfigurationException {
-        IAbstractFile manifestFile = AndroidManifest.getManifest(projectFolder);
-        if (manifestFile == null) {
-            throw new FileNotFoundException();
-        }
-
-        return parse(manifestFile, true, null);
-    }
-
-    /**
-     * Parses the Android Manifest from an {@link InputStream}, and returns a {@link ManifestData}
-     * object containing the result of the parsing.
-     *
-     * @param manifestFileStream the {@link InputStream} representing the manifest file.
-     * @return A class containing the manifest info obtained during the parsing or null on error.
-     *
-     * @throws StreamException
-     * @throws IOException
-     * @throws SAXException
-     * @throws ParserConfigurationException
-     */
-    public static ManifestData parse(InputStream manifestFileStream)
-            throws SAXException, IOException, StreamException, ParserConfigurationException {
-        if (manifestFileStream != null) {
-            SAXParser parser = sParserFactory.newSAXParser();
-
-            ManifestData data = new ManifestData();
-
-            ManifestHandler manifestHandler = new ManifestHandler(null, data, null);
-            parser.parse(new InputSource(manifestFileStream), manifestHandler);
-
-            return data;
-        }
-
-        return null;
-    }
-}
diff --git a/sdk_common/src/com/android/ide/common/xml/ManifestData.java b/sdk_common/src/com/android/ide/common/xml/ManifestData.java
deleted file mode 100644
index 9b68d60..0000000
--- a/sdk_common/src/com/android/ide/common/xml/ManifestData.java
+++ /dev/null
@@ -1,747 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.xml;
-
-import com.android.resources.Keyboard;
-import com.android.resources.Navigation;
-import com.android.resources.TouchScreen;
-
-import java.util.ArrayList;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Class containing the manifest info obtained during the parsing.
- */
-public final class ManifestData {
-
-    /**
-     * Value returned by {@link #getMinSdkVersion()} when the value of the minSdkVersion attribute
-     * in the manifest is a codename and not an integer value.
-     */
-    public final static int MIN_SDK_CODENAME = 0;
-
-    /**
-     * Value returned by {@link #getGlEsVersion()} when there are no <uses-feature> node with the
-     * attribute glEsVersion set.
-     */
-    public final static int GL_ES_VERSION_NOT_SET = -1;
-
-    /** Application package */
-    String mPackage;
-    /** Application version Code, null if the attribute is not present. */
-    Integer mVersionCode = null;
-    /** List of all activities */
-    final ArrayList<Activity> mActivities = new ArrayList<Activity>();
-    /** Launcher activity */
-    Activity mLauncherActivity = null;
-    /** list of process names declared by the manifest */
-    Set<String> mProcesses = null;
-    /** debuggable attribute value. If null, the attribute is not present. */
-    Boolean mDebuggable = null;
-    /** API level requirement. if null the attribute was not present. */
-    private String mMinSdkVersionString = null;
-    /** API level requirement. Default is 1 even if missing. If value is a codename, then it'll be
-     * 0 instead. */
-    private int mMinSdkVersion = 1;
-    private int mTargetSdkVersion = 0;
-    /** List of all instrumentations declared by the manifest */
-    final ArrayList<Instrumentation> mInstrumentations =
-        new ArrayList<Instrumentation>();
-    /** List of all libraries in use declared by the manifest */
-    final ArrayList<UsesLibrary> mLibraries = new ArrayList<UsesLibrary>();
-    /** List of all feature in use declared by the manifest */
-    final ArrayList<UsesFeature> mFeatures = new ArrayList<UsesFeature>();
-
-    SupportsScreens mSupportsScreensFromManifest;
-    SupportsScreens mSupportsScreensValues;
-    UsesConfiguration mUsesConfiguration;
-
-    /**
-     * Instrumentation info obtained from manifest
-     */
-    public final static class Instrumentation {
-        private final String mName;
-        private final String mTargetPackage;
-
-        Instrumentation(String name, String targetPackage) {
-            mName = name;
-            mTargetPackage = targetPackage;
-        }
-
-        /**
-         * Returns the fully qualified instrumentation class name
-         */
-        public String getName() {
-            return mName;
-        }
-
-        /**
-         * Returns the Android app package that is the target of this instrumentation
-         */
-        public String getTargetPackage() {
-            return mTargetPackage;
-        }
-    }
-
-    /**
-     * Activity info obtained from the manifest.
-     */
-    public final static class Activity {
-        private final String mName;
-        private final boolean mIsExported;
-        private boolean mHasAction = false;
-        private boolean mHasMainAction = false;
-        private boolean mHasLauncherCategory = false;
-
-        public Activity(String name, boolean exported) {
-            mName = name;
-            mIsExported = exported;
-        }
-
-        public String getName() {
-            return mName;
-        }
-
-        public boolean isExported() {
-            return mIsExported;
-        }
-
-        public boolean hasAction() {
-            return mHasAction;
-        }
-
-        public boolean isHomeActivity() {
-            return mHasMainAction && mHasLauncherCategory;
-        }
-
-        void setHasAction(boolean hasAction) {
-            mHasAction = hasAction;
-        }
-
-        /** If the activity doesn't yet have a filter set for the launcher, this resets both
-         * flags. This is to handle multiple intent-filters where one could have the valid
-         * action, and another one of the valid category.
-         */
-        void resetIntentFilter() {
-            if (isHomeActivity() == false) {
-                mHasMainAction = mHasLauncherCategory = false;
-            }
-        }
-
-        void setHasMainAction(boolean hasMainAction) {
-            mHasMainAction = hasMainAction;
-        }
-
-        void setHasLauncherCategory(boolean hasLauncherCategory) {
-            mHasLauncherCategory = hasLauncherCategory;
-        }
-    }
-
-    /**
-     * Class representing the <code>supports-screens</code> node in the manifest.
-     * By default, all the getters will return null if there was no value defined in the manifest.
-     *
-     * To get an instance with all the actual values, use {@link #resolveSupportsScreensValues(int)}
-     */
-    public final static class SupportsScreens {
-        private Boolean mResizeable;
-        private Boolean mAnyDensity;
-        private Boolean mSmallScreens;
-        private Boolean mNormalScreens;
-        private Boolean mLargeScreens;
-
-        public SupportsScreens() {
-        }
-
-        /**
-         * Instantiate an instance from a string. The string must have been created with
-         * {@link #getEncodedValues()}.
-         * @param value the string.
-         */
-        public SupportsScreens(String value) {
-            String[] values = value.split("\\|");
-
-            mAnyDensity = Boolean.valueOf(values[0]);
-            mResizeable = Boolean.valueOf(values[1]);
-            mSmallScreens = Boolean.valueOf(values[2]);
-            mNormalScreens = Boolean.valueOf(values[3]);
-            mLargeScreens = Boolean.valueOf(values[4]);
-        }
-
-        /**
-         * Returns an instance of {@link SupportsScreens} initialized with the default values
-         * based on the given targetSdkVersion.
-         * @param targetSdkVersion
-         */
-        public static SupportsScreens getDefaultValues(int targetSdkVersion) {
-            SupportsScreens result = new SupportsScreens();
-
-            result.mNormalScreens = Boolean.TRUE;
-            // Screen size and density became available in Android 1.5/API3, so before that
-            // non normal screens were not supported by default. After they are considered
-            // supported.
-            result.mResizeable = result.mAnyDensity = result.mSmallScreens = result.mLargeScreens =
-                targetSdkVersion <= 3 ? Boolean.FALSE : Boolean.TRUE;
-
-            return result;
-        }
-
-        /**
-         * Returns a version of the receiver for which all values have been set, even if they
-         * were not present in the manifest.
-         * @param targetSdkVersion the target api level of the app, since this has an effect
-         * on default values.
-         */
-        public SupportsScreens resolveSupportsScreensValues(int targetSdkVersion) {
-            SupportsScreens result = getDefaultValues(targetSdkVersion);
-
-            // Override the default with the existing values:
-            if (mResizeable != null) result.mResizeable = mResizeable;
-            if (mAnyDensity != null) result.mAnyDensity = mAnyDensity;
-            if (mSmallScreens != null) result.mSmallScreens = mSmallScreens;
-            if (mNormalScreens != null) result.mNormalScreens = mNormalScreens;
-            if (mLargeScreens != null) result.mLargeScreens = mLargeScreens;
-
-            return result;
-        }
-
-        /**
-         * returns the value of the <code>resizeable</code> attribute or null if not present.
-         */
-        public Boolean getResizeable() {
-            return mResizeable;
-        }
-
-        void setResizeable(Boolean resizeable) {
-            mResizeable = getConstantBoolean(resizeable);
-        }
-
-        /**
-         * returns the value of the <code>anyDensity</code> attribute or null if not present.
-         */
-        public Boolean getAnyDensity() {
-            return mAnyDensity;
-        }
-
-        void setAnyDensity(Boolean anyDensity) {
-            mAnyDensity = getConstantBoolean(anyDensity);
-        }
-
-        /**
-         * returns the value of the <code>smallScreens</code> attribute or null if not present.
-         */
-        public Boolean getSmallScreens() {
-            return mSmallScreens;
-        }
-
-        void setSmallScreens(Boolean smallScreens) {
-            mSmallScreens = getConstantBoolean(smallScreens);
-        }
-
-        /**
-         * returns the value of the <code>normalScreens</code> attribute or null if not present.
-         */
-        public Boolean getNormalScreens() {
-            return mNormalScreens;
-        }
-
-        void setNormalScreens(Boolean normalScreens) {
-            mNormalScreens = getConstantBoolean(normalScreens);
-        }
-
-        /**
-         * returns the value of the <code>largeScreens</code> attribute or null if not present.
-         */
-        public Boolean getLargeScreens() {
-            return mLargeScreens;
-        }
-
-        void setLargeScreens(Boolean largeScreens) {
-            mLargeScreens = getConstantBoolean(largeScreens);
-        }
-
-        /**
-         * Returns either {@link Boolean#TRUE} or {@link Boolean#FALSE} based on the value of
-         * the given Boolean object.
-         */
-        private Boolean getConstantBoolean(Boolean v) {
-            if (v != null) {
-                if (v.equals(Boolean.TRUE)) {
-                    return Boolean.TRUE;
-                } else {
-                    return Boolean.FALSE;
-                }
-            }
-
-            return null;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (obj instanceof SupportsScreens) {
-                SupportsScreens support = (SupportsScreens) obj;
-                // since all the fields are guaranteed to be either Boolean.TRUE or Boolean.FALSE
-                // (or null), we can simply check they are identical and not bother with
-                // calling equals (which would require to check != null.
-                // see #getConstanntBoolean(Boolean)
-                return mResizeable    == support.mResizeable &&
-                       mAnyDensity    == support.mAnyDensity &&
-                       mSmallScreens  == support.mSmallScreens &&
-                       mNormalScreens == support.mNormalScreens &&
-                       mLargeScreens  == support.mLargeScreens;
-            }
-
-            return false;
-        }
-
-        /* Override hashCode, mostly to make Eclipse happy and not warn about it.
-         * And if you ever put this in a Map or Set, it will avoid surprises. */
-        @Override
-        public int hashCode() {
-            final int prime = 31;
-            int result = 1;
-            result = prime * result + ((mAnyDensity    == null) ? 0 : mAnyDensity.hashCode());
-            result = prime * result + ((mLargeScreens  == null) ? 0 : mLargeScreens.hashCode());
-            result = prime * result + ((mNormalScreens == null) ? 0 : mNormalScreens.hashCode());
-            result = prime * result + ((mResizeable    == null) ? 0 : mResizeable.hashCode());
-            result = prime * result + ((mSmallScreens  == null) ? 0 : mSmallScreens.hashCode());
-            return result;
-        }
-
-        /**
-         * Returns true if the two instances support the same screen sizes.
-         * This is similar to {@link #equals(Object)} except that it ignores the values of
-         * {@link #getAnyDensity()} and {@link #getResizeable()}.
-         * @param support the other instance to compare to.
-         * @return true if the two instances support the same screen sizes.
-         */
-        public boolean hasSameScreenSupportAs(SupportsScreens support) {
-            // since all the fields are guaranteed to be either Boolean.TRUE or Boolean.FALSE
-            // (or null), we can simply check they are identical and not bother with
-            // calling equals (which would require to check != null.
-            // see #getConstanntBoolean(Boolean)
-
-            // This only checks that matter here are the screen sizes. resizeable and anyDensity
-            // are not checked.
-            return  mSmallScreens == support.mSmallScreens &&
-                    mNormalScreens == support.mNormalScreens &&
-                    mLargeScreens == support.mLargeScreens;
-        }
-
-        /**
-         * Returns true if the two instances have strictly different screen size support.
-         * This means that there is no screen size that they both support.
-         * @param support the other instance to compare to.
-         * @return true if they are stricly different.
-         */
-        public boolean hasStrictlyDifferentScreenSupportAs(SupportsScreens support) {
-            // since all the fields are guaranteed to be either Boolean.TRUE or Boolean.FALSE
-            // (or null), we can simply check they are identical and not bother with
-            // calling equals (which would require to check != null.
-            // see #getConstanntBoolean(Boolean)
-
-            // This only checks that matter here are the screen sizes. resizeable and anyDensity
-            // are not checked.
-            return (mSmallScreens != Boolean.TRUE || support.mSmallScreens != Boolean.TRUE) &&
-                    (mNormalScreens != Boolean.TRUE || support.mNormalScreens != Boolean.TRUE) &&
-                    (mLargeScreens != Boolean.TRUE || support.mLargeScreens != Boolean.TRUE);
-        }
-
-        /**
-         * Comparison of 2 Supports-screens. This only uses screen sizes (ignores resizeable and
-         * anyDensity), and considers that
-         * {@link #hasStrictlyDifferentScreenSupportAs(SupportsScreens)} returns true and
-         * {@link #overlapWith(SupportsScreens)} returns false.
-         * @throws IllegalArgumentException if the two instanced are not strictly different or
-         * overlap each other
-         * @see #hasStrictlyDifferentScreenSupportAs(SupportsScreens)
-         * @see #overlapWith(SupportsScreens)
-         */
-        public int compareScreenSizesWith(SupportsScreens o) {
-            if (hasStrictlyDifferentScreenSupportAs(o) == false) {
-                throw new IllegalArgumentException("The two instances are not strictly different.");
-            }
-            if (overlapWith(o)) {
-                throw new IllegalArgumentException("The two instances overlap each other.");
-            }
-
-            int comp = mLargeScreens.compareTo(o.mLargeScreens);
-            if (comp != 0) return comp;
-
-            comp = mNormalScreens.compareTo(o.mNormalScreens);
-            if (comp != 0) return comp;
-
-            comp = mSmallScreens.compareTo(o.mSmallScreens);
-            if (comp != 0) return comp;
-
-            return 0;
-        }
-
-        /**
-         * Returns a string encoding of the content of the instance. This string can be used to
-         * instantiate a {@link SupportsScreens} object through
-         * {@link #SupportsScreens(String)}.
-         */
-        public String getEncodedValues() {
-            return String.format("%1$s|%2$s|%3$s|%4$s|%5$s",
-                    mAnyDensity, mResizeable, mSmallScreens, mNormalScreens, mLargeScreens);
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder sb = new StringBuilder();
-
-            boolean alreadyOutputSomething = false;
-
-            if (Boolean.TRUE.equals(mSmallScreens)) {
-                alreadyOutputSomething = true;
-                sb.append("small");
-            }
-
-            if (Boolean.TRUE.equals(mNormalScreens)) {
-                if (alreadyOutputSomething) {
-                    sb.append(", ");
-                }
-                alreadyOutputSomething = true;
-                sb.append("normal");
-            }
-
-            if (Boolean.TRUE.equals(mLargeScreens)) {
-                if (alreadyOutputSomething) {
-                    sb.append(", ");
-                }
-                alreadyOutputSomething = true;
-                sb.append("large");
-            }
-
-            if (alreadyOutputSomething == false) {
-                sb.append("<none>");
-            }
-
-            return sb.toString();
-        }
-
-        /**
-         * Returns true if the two instance overlap with each other.
-         * This can happen if one instances supports a size, when the other instance doesn't while
-         * supporting a size above and a size below.
-         * @param otherSS the other supports-screens to compare to.
-         */
-        public boolean overlapWith(SupportsScreens otherSS) {
-            if (mSmallScreens == null || mNormalScreens == null || mLargeScreens == null ||
-                    otherSS.mSmallScreens == null || otherSS.mNormalScreens == null ||
-                    otherSS.mLargeScreens == null) {
-                throw new IllegalArgumentException("Some screen sizes Boolean are not initialized");
-            }
-
-            if (mSmallScreens == Boolean.TRUE && mNormalScreens == Boolean.FALSE &&
-                    mLargeScreens == Boolean.TRUE) {
-                return otherSS.mNormalScreens == Boolean.TRUE;
-            }
-
-            if (otherSS.mSmallScreens == Boolean.TRUE && otherSS.mNormalScreens == Boolean.FALSE &&
-                    otherSS.mLargeScreens == Boolean.TRUE) {
-                return mNormalScreens == Boolean.TRUE;
-            }
-
-            return false;
-        }
-    }
-
-    /**
-     * Class representing a <code>uses-library</code> node in the manifest.
-     */
-    public final static class UsesLibrary {
-        String mName;
-        Boolean mRequired = Boolean.TRUE; // default is true even if missing
-
-        public String getName() {
-            return mName;
-        }
-
-        public Boolean getRequired() {
-            return mRequired;
-        }
-    }
-
-    /**
-     * Class representing a <code>uses-feature</code> node in the manifest.
-     */
-    public final static class UsesFeature {
-        String mName;
-        int mGlEsVersion = 0;
-        Boolean mRequired = Boolean.TRUE;  // default is true even if missing
-
-        public String getName() {
-            return mName;
-        }
-
-        /**
-         * Returns the value of the glEsVersion attribute, or 0 if the attribute was not present.
-         */
-        public int getGlEsVersion() {
-            return mGlEsVersion;
-        }
-
-        public Boolean getRequired() {
-            return mRequired;
-        }
-    }
-
-    /**
-     * Class representing the <code>uses-configuration</code> node in the manifest.
-     */
-    public final static class UsesConfiguration {
-        Boolean mReqFiveWayNav;
-        Boolean mReqHardKeyboard;
-        Keyboard mReqKeyboardType;
-        TouchScreen mReqTouchScreen;
-        Navigation mReqNavigation;
-
-        /**
-         * returns the value of the <code>reqFiveWayNav</code> attribute or null if not present.
-         */
-        public Boolean getReqFiveWayNav() {
-            return mReqFiveWayNav;
-        }
-
-        /**
-         * returns the value of the <code>reqNavigation</code> attribute or null if not present.
-         */
-        public Navigation getReqNavigation() {
-            return mReqNavigation;
-        }
-
-        /**
-         * returns the value of the <code>reqHardKeyboard</code> attribute or null if not present.
-         */
-        public Boolean getReqHardKeyboard() {
-            return mReqHardKeyboard;
-        }
-
-        /**
-         * returns the value of the <code>reqKeyboardType</code> attribute or null if not present.
-         */
-        public Keyboard getReqKeyboardType() {
-            return mReqKeyboardType;
-        }
-
-        /**
-         * returns the value of the <code>reqTouchScreen</code> attribute or null if not present.
-         */
-        public TouchScreen getReqTouchScreen() {
-            return mReqTouchScreen;
-        }
-    }
-
-    /**
-     * Returns the package defined in the manifest, if found.
-     * @return The package name or null if not found.
-     */
-    public String getPackage() {
-        return mPackage;
-    }
-
-    /**
-     * Returns the versionCode value defined in the manifest, if found, null otherwise.
-     * @return the versionCode or null if not found.
-     */
-    public Integer getVersionCode() {
-        return mVersionCode;
-    }
-
-    /**
-     * Returns the list of activities found in the manifest.
-     * @return An array of fully qualified class names, or empty if no activity were found.
-     */
-    public Activity[] getActivities() {
-        return mActivities.toArray(new Activity[mActivities.size()]);
-    }
-
-    /**
-     * Returns the name of one activity found in the manifest, that is configured to show
-     * up in the HOME screen.
-     * @return the fully qualified name of a HOME activity or null if none were found.
-     */
-    public Activity getLauncherActivity() {
-        return mLauncherActivity;
-    }
-
-    /**
-     * Returns the list of process names declared by the manifest.
-     */
-    public String[] getProcesses() {
-        if (mProcesses != null) {
-            return mProcesses.toArray(new String[mProcesses.size()]);
-        }
-
-        return new String[0];
-    }
-
-    /**
-     * Returns the <code>debuggable</code> attribute value or null if it is not set.
-     */
-    public Boolean getDebuggable() {
-        return mDebuggable;
-    }
-
-    /**
-     * Returns the <code>minSdkVersion</code> attribute, or null if it's not set.
-     */
-    public String getMinSdkVersionString() {
-        return mMinSdkVersionString;
-    }
-
-    /**
-     * Sets the value of the <code>minSdkVersion</code> attribute.
-     * @param minSdkVersion the string value of the attribute in the manifest.
-     */
-    public void setMinSdkVersionString(String minSdkVersion) {
-        mMinSdkVersionString = minSdkVersion;
-        if (mMinSdkVersionString != null) {
-            try {
-                mMinSdkVersion = Integer.parseInt(mMinSdkVersionString);
-            } catch (NumberFormatException e) {
-                mMinSdkVersion = MIN_SDK_CODENAME;
-            }
-        }
-    }
-
-    /**
-     * Returns the <code>minSdkVersion</code> attribute, or 0 if it's not set or is a codename.
-     * @see #getMinSdkVersionString()
-     */
-    public int getMinSdkVersion() {
-        return mMinSdkVersion;
-    }
-
-
-    /**
-     * Sets the value of the <code>minSdkVersion</code> attribute.
-     * @param targetSdkVersion the string value of the attribute in the manifest.
-     */
-    public void setTargetSdkVersionString(String targetSdkVersion) {
-        if (targetSdkVersion != null) {
-            try {
-                mTargetSdkVersion = Integer.parseInt(targetSdkVersion);
-            } catch (NumberFormatException e) {
-                // keep the value at 0.
-            }
-        }
-    }
-
-    /**
-     * Returns the <code>targetSdkVersion</code> attribute, or the same value as
-     * {@link #getMinSdkVersion()} if it was not set in the manifest.
-     */
-    public int getTargetSdkVersion() {
-        if (mTargetSdkVersion == 0) {
-            return getMinSdkVersion();
-        }
-
-        return mTargetSdkVersion;
-    }
-
-    /**
-     * Returns the list of instrumentations found in the manifest.
-     * @return An array of {@link Instrumentation}, or empty if no instrumentations were
-     * found.
-     */
-    public Instrumentation[] getInstrumentations() {
-        return mInstrumentations.toArray(new Instrumentation[mInstrumentations.size()]);
-    }
-
-    /**
-     * Returns the list of libraries in use found in the manifest.
-     * @return An array of {@link UsesLibrary} objects, or empty if no libraries were found.
-     */
-    public UsesLibrary[] getUsesLibraries() {
-        return mLibraries.toArray(new UsesLibrary[mLibraries.size()]);
-    }
-
-    /**
-     * Returns the list of features in use found in the manifest.
-     * @return An array of {@link UsesFeature} objects, or empty if no libraries were found.
-     */
-    public UsesFeature[] getUsesFeatures() {
-        return mFeatures.toArray(new UsesFeature[mFeatures.size()]);
-    }
-
-    /**
-     * Returns the glEsVersion from a <uses-feature> or {@link #GL_ES_VERSION_NOT_SET} if not set.
-     */
-    public int getGlEsVersion() {
-        for (UsesFeature feature : mFeatures) {
-            if (feature.mGlEsVersion > 0) {
-                return feature.mGlEsVersion;
-            }
-        }
-        return GL_ES_VERSION_NOT_SET;
-    }
-
-    /**
-     * Returns the {@link SupportsScreens} object representing the <code>supports-screens</code>
-     * node, or null if the node doesn't exist at all.
-     * Some values in the {@link SupportsScreens} instance maybe null, indicating that they
-     * were not present in the manifest. To get an instance that contains the values, as seen
-     * by the Android platform when the app is running, use {@link #getSupportsScreensValues()}.
-     */
-    public SupportsScreens getSupportsScreensFromManifest() {
-        return mSupportsScreensFromManifest;
-    }
-
-    /**
-     * Returns an always non-null instance of {@link SupportsScreens} that's been initialized with
-     * the default values, and the values from the manifest.
-     * The default values depends on the manifest values for minSdkVersion and targetSdkVersion.
-     */
-    public synchronized SupportsScreens getSupportsScreensValues() {
-        if (mSupportsScreensValues == null) {
-            if (mSupportsScreensFromManifest == null) {
-                mSupportsScreensValues = SupportsScreens.getDefaultValues(getTargetSdkVersion());
-            } else {
-                // get a SupportsScreen that replace the missing values with default values.
-                mSupportsScreensValues = mSupportsScreensFromManifest.resolveSupportsScreensValues(
-                        getTargetSdkVersion());
-            }
-        }
-
-        return mSupportsScreensValues;
-    }
-
-    /**
-     * Returns the {@link UsesConfiguration} object representing the <code>uses-configuration</code>
-     * node, or null if the node doesn't exist at all.
-     */
-    public UsesConfiguration getUsesConfiguration() {
-        return mUsesConfiguration;
-    }
-
-    void addProcessName(String processName) {
-        if (mProcesses == null) {
-            mProcesses = new TreeSet<String>();
-        }
-
-        if (processName.startsWith(":")) {
-            mProcesses.add(mPackage + processName);
-        } else {
-            mProcesses.add(processName);
-        }
-    }
-
-}
diff --git a/sdk_common/tests/.classpath b/sdk_common/tests/.classpath
deleted file mode 100644
index 1e45d8a..0000000
--- a/sdk_common/tests/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/sdk_common"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/common"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/layoutlib_api"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/sdk_common/tests/.project b/sdk_common/tests/.project
deleted file mode 100644
index 86d2f15..0000000
--- a/sdk_common/tests/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>sdk_common-tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sdk_common/tests/.settings/org.moreunit.prefs b/sdk_common/tests/.settings/org.moreunit.prefs
deleted file mode 100644
index 902b677..0000000
--- a/sdk_common/tests/.settings/org.moreunit.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-eclipse.preferences.version=1
-org.moreunit.prefixes=
-org.moreunit.unitsourcefolder=sdk_common-tests\:src\:sdk_common\:src
-org.moreunit.useprojectsettings=true
diff --git a/sdk_common/tests/Android.mk b/sdk_common/tests/Android.mk
deleted file mode 100644
index e7f8c8d..0000000
--- a/sdk_common/tests/Android.mk
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (C) 2011 The Android Open Source Project
-#
-# Licensed 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-# Only compile source java files in this lib.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_MODULE := sdk_common-tests
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_JAVA_LIBRARIES := common sdk_common junit
-
-include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/ResourceRepositoryTest.java b/sdk_common/tests/src/com/android/ide/common/resources/ResourceRepositoryTest.java
deleted file mode 100644
index a8b8b1e..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/ResourceRepositoryTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import static com.android.resources.ResourceType.ATTR;
-import static com.android.resources.ResourceType.DIMEN;
-import static com.android.resources.ResourceType.LAYOUT;
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class ResourceRepositoryTest extends TestCase {
-    public void testParseResource() {
-        assertNull(ResourceRepository.parseResource(""));
-        assertNull(ResourceRepository.parseResource("not_a_resource"));
-
-        assertEquals(LAYOUT, ResourceRepository.parseResource("@layout/foo").getFirst());
-        assertEquals(DIMEN, ResourceRepository.parseResource("@dimen/foo").getFirst());
-        assertEquals(DIMEN, ResourceRepository.parseResource("@android:dimen/foo").getFirst());
-        assertEquals("foo", ResourceRepository.parseResource("@layout/foo").getSecond());
-        assertEquals("foo", ResourceRepository.parseResource("@dimen/foo").getSecond());
-        assertEquals("foo", ResourceRepository.parseResource("@android:dimen/foo").getSecond());
-
-        assertEquals(ATTR, ResourceRepository.parseResource("?attr/foo").getFirst());
-        assertEquals("foo", ResourceRepository.parseResource("?attr/foo").getSecond());
-
-        assertEquals(ATTR, ResourceRepository.parseResource("?foo").getFirst());
-        assertEquals("foo", ResourceRepository.parseResource("?foo").getSecond());
-
-        assertEquals(ATTR, ResourceRepository.parseResource("?android:foo").getFirst());
-        assertEquals("foo", ResourceRepository.parseResource("?android:foo").getSecond());
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/ValueResourceParserTest.java b/sdk_common/tests/src/com/android/ide/common/resources/ValueResourceParserTest.java
deleted file mode 100644
index aed6060..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/ValueResourceParserTest.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources;
-
-import static com.android.ide.common.resources.ValueResourceParser.escapeResourceString;
-import static com.android.ide.common.resources.ValueResourceParser.isEscaped;
-import static com.android.ide.common.resources.ValueResourceParser.unescapeResourceString;
-
-import junit.framework.TestCase;
-
-public class ValueResourceParserTest extends TestCase {
-
-    public void testEscapeStringShouldEscapeXmlSpecialCharacters() throws Exception {
-        assertEquals("&lt;", escapeResourceString("<"));
-        assertEquals("&amp;", escapeResourceString("&"));
-    }
-
-    public void testEscapeStringShouldEscapeQuotes() throws Exception {
-        assertEquals("\\'", escapeResourceString("'"));
-        assertEquals("\\\"", escapeResourceString("\""));
-        assertEquals("\" ' \"", escapeResourceString(" ' "));
-    }
-
-    public void testEscapeStringShouldPreserveWhitespace() throws Exception {
-        assertEquals("\"at end  \"", escapeResourceString("at end  "));
-        assertEquals("\"  at begin\"", escapeResourceString("  at begin"));
-    }
-
-    public void testEscapeStringShouldEscapeAtSignAndQuestionMarkOnlyAtBeginning()
-            throws Exception {
-        assertEquals("\\@text", escapeResourceString("@text"));
-        assertEquals("a@text", escapeResourceString("a@text"));
-        assertEquals("\\?text", escapeResourceString("?text"));
-        assertEquals("a?text", escapeResourceString("a?text"));
-        assertEquals("\" ?text\"", escapeResourceString(" ?text"));
-    }
-
-    public void testEscapeStringShouldEscapeJavaEscapeSequences() throws Exception {
-        assertEquals("\\n", escapeResourceString("\n"));
-        assertEquals("\\t", escapeResourceString("\t"));
-        assertEquals("\\\\", escapeResourceString("\\"));
-    }
-
-    public void testTrim() throws Exception {
-        assertEquals("", unescapeResourceString("", false, true));
-        assertEquals("", unescapeResourceString("  \n  ", false, true));
-        assertEquals("test", unescapeResourceString("  test  ", false, true));
-        assertEquals("  test  ", unescapeResourceString("\"  test  \"", false, true));
-        assertEquals("test", unescapeResourceString("\n\t  test \t\n ", false, true));
-
-        assertEquals("test\n", unescapeResourceString("  test\\n  ", false, true));
-        assertEquals("  test\n  ", unescapeResourceString("\"  test\\n  \"", false, true));
-        assertEquals("te\\st", unescapeResourceString("\n\t  te\\\\st \t\n ", false, true));
-        assertEquals("te\\st", unescapeResourceString("  te\\\\st  ", false, true));
-        assertEquals("test", unescapeResourceString("\"\"\"test\"\"  ", false, true));
-        assertEquals("\"test\"", unescapeResourceString("\"\"\\\"test\\\"\"  ", false, true));
-        assertEquals("test ", unescapeResourceString("test\\  ", false, true));
-        assertEquals("\\\\\\", unescapeResourceString("\\\\\\\\\\\\ ", false, true));
-        assertEquals("\\\\\\ ", unescapeResourceString("\\\\\\\\\\\\\\ ", false, true));
-    }
-
-    public void testNoTrim() throws Exception {
-        assertEquals("", unescapeResourceString("", false, false));
-        assertEquals("  \n  ", unescapeResourceString("  \n  ", false, false));
-        assertEquals("  test  ", unescapeResourceString("  test  ", false, false));
-        assertEquals("\"  test  \"", unescapeResourceString("\"  test  \"", false, false));
-        assertEquals("\n\t  test \t\n ", unescapeResourceString("\n\t  test \t\n ", false, false));
-
-        assertEquals("  test\n  ", unescapeResourceString("  test\\n  ", false, false));
-        assertEquals("\"  test\n  \"", unescapeResourceString("\"  test\\n  \"", false, false));
-        assertEquals("\n\t  te\\st \t\n ", unescapeResourceString("\n\t  te\\\\st \t\n ", false, false));
-        assertEquals("  te\\st  ", unescapeResourceString("  te\\\\st  ", false, false));
-        assertEquals("\"\"\"test\"\"  ", unescapeResourceString("\"\"\"test\"\"  ", false, false));
-        assertEquals("\"\"\"test\"\"  ", unescapeResourceString("\"\"\\\"test\\\"\"  ", false, false));
-        assertEquals("test  ", unescapeResourceString("test\\  ", false, false));
-        assertEquals("\\\\\\ ", unescapeResourceString("\\\\\\\\\\\\ ", false, false));
-        assertEquals("\\\\\\ ", unescapeResourceString("\\\\\\\\\\\\\\ ", false, false));
-    }
-
-    public void testUnescapeStringShouldUnescapeXmlSpecialCharacters() throws Exception {
-        assertEquals("&lt;", unescapeResourceString("&lt;", false, true));
-        assertEquals("<", unescapeResourceString("&lt;", true, true));
-        assertEquals("<", unescapeResourceString("  &lt;  ", true, true));
-        assertEquals("&amp;", unescapeResourceString("&amp;", false, true));
-        assertEquals("&", unescapeResourceString("&amp;", true, true));
-        assertEquals("&", unescapeResourceString("  &amp;  ", true, true));
-        assertEquals("!<", unescapeResourceString("!&lt;", true, true));
-    }
-
-    public void testUnescapeStringShouldUnescapeQuotes() throws Exception {
-        assertEquals("'", unescapeResourceString("\\'", false, true));
-        assertEquals("\"", unescapeResourceString("\\\"", false, true));
-        assertEquals(" ' ", unescapeResourceString("\" ' \"", false, true));
-    }
-
-    public void testUnescapeStringShouldPreserveWhitespace() throws Exception {
-        assertEquals("at end  ", unescapeResourceString("\"at end  \"", false, true));
-        assertEquals("  at begin", unescapeResourceString("\"  at begin\"", false, true));
-    }
-
-    public void testUnescapeStringShouldUnescapeAtSignAndQuestionMarkOnlyAtBeginning()
-            throws Exception {
-        assertEquals("@text", unescapeResourceString("\\@text", false, true));
-        assertEquals("a@text", unescapeResourceString("a@text", false, true));
-        assertEquals("?text", unescapeResourceString("\\?text", false, true));
-        assertEquals("a?text", unescapeResourceString("a?text", false, true));
-        assertEquals(" ?text", unescapeResourceString("\" ?text\"", false, true));
-    }
-
-    public void testUnescapeStringShouldUnescapeJavaUnescapeSequences() throws Exception {
-        assertEquals("\n", unescapeResourceString("\\n", false, true));
-        assertEquals("\t", unescapeResourceString("\\t", false, true));
-        assertEquals("\\", unescapeResourceString("\\\\", false, true));
-    }
-
-    public void testIsEscaped() throws Exception {
-        assertFalse(isEscaped("", 0));
-        assertFalse(isEscaped(" ", 0));
-        assertFalse(isEscaped(" ", 1));
-        assertFalse(isEscaped("x\\y ", 0));
-        assertFalse(isEscaped("x\\y ", 1));
-        assertTrue(isEscaped("x\\y ", 2));
-        assertFalse(isEscaped("x\\y ", 3));
-        assertFalse(isEscaped("x\\\\y ", 0));
-        assertFalse(isEscaped("x\\\\y ", 1));
-        assertTrue(isEscaped("x\\\\y ", 2));
-        assertFalse(isEscaped("x\\\\y ", 3));
-        assertFalse(isEscaped("\\\\\\\\y ", 0));
-        assertTrue(isEscaped( "\\\\\\\\y ", 1));
-        assertFalse(isEscaped("\\\\\\\\y ", 2));
-        assertTrue(isEscaped( "\\\\\\\\y ", 3));
-        assertFalse(isEscaped("\\\\\\\\y ", 4));
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/CountryCodeQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/CountryCodeQualifierTest.java
deleted file mode 100644
index eba8b8d..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/CountryCodeQualifierTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import junit.framework.TestCase;
-
-public class CountryCodeQualifierTest extends TestCase {
-
-    private CountryCodeQualifier mccq;
-    private FolderConfiguration config;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mccq = new CountryCodeQualifier();
-        config = new FolderConfiguration();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        mccq = null;
-        config = null;
-    }
-
-    public void testCheckAndSet() {
-        assertEquals(true, mccq.checkAndSet("mcc123", config));//$NON-NLS-1$
-        assertTrue(config.getCountryCodeQualifier() != null);
-        assertEquals(123, config.getCountryCodeQualifier().getCode());
-        assertEquals("mcc123", config.getCountryCodeQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testFailures() {
-        assertEquals(false, mccq.checkAndSet("", config));//$NON-NLS-1$
-        assertEquals(false, mccq.checkAndSet("mcc", config));//$NON-NLS-1$
-        assertEquals(false, mccq.checkAndSet("MCC123", config));//$NON-NLS-1$
-        assertEquals(false, mccq.checkAndSet("123", config));//$NON-NLS-1$
-        assertEquals(false, mccq.checkAndSet("mccsdf", config));//$NON-NLS-1$
-    }
-
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/DockModeQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/DockModeQualifierTest.java
deleted file mode 100644
index 1653805..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/DockModeQualifierTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.UiMode;
-
-import junit.framework.TestCase;
-
-public class DockModeQualifierTest extends TestCase {
-
-    private UiModeQualifier mCarQualifier;
-    private UiModeQualifier mDeskQualifier;
-    private UiModeQualifier mTVQualifier;
-    private UiModeQualifier mNoneQualifier;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mCarQualifier = new UiModeQualifier(UiMode.CAR);
-        mDeskQualifier = new UiModeQualifier(UiMode.DESK);
-        mTVQualifier = new UiModeQualifier(UiMode.TELEVISION);
-        mNoneQualifier = new UiModeQualifier(UiMode.NORMAL);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        mCarQualifier = null;
-        mDeskQualifier = null;
-        mTVQualifier = null;
-        mNoneQualifier = null;
-    }
-
-    public void testIsBetterMatchThan() {
-        assertTrue(mNoneQualifier.isBetterMatchThan(mCarQualifier, mDeskQualifier));
-        assertTrue(mNoneQualifier.isBetterMatchThan(mCarQualifier, mDeskQualifier));
-        assertFalse(mNoneQualifier.isBetterMatchThan(mDeskQualifier, mDeskQualifier));
-        assertTrue(mNoneQualifier.isBetterMatchThan(mDeskQualifier, mCarQualifier));
-        assertFalse(mNoneQualifier.isBetterMatchThan(mCarQualifier, mCarQualifier));
-
-        assertTrue(mDeskQualifier.isBetterMatchThan(mCarQualifier, mDeskQualifier));
-        assertFalse(mDeskQualifier.isBetterMatchThan(mCarQualifier, mCarQualifier));
-
-        assertTrue(mCarQualifier.isBetterMatchThan(mDeskQualifier, mCarQualifier));
-        assertFalse(mCarQualifier.isBetterMatchThan(mDeskQualifier, mDeskQualifier));
-
-        assertTrue(mTVQualifier.isBetterMatchThan(mCarQualifier, mTVQualifier));
-        assertFalse(mTVQualifier.isBetterMatchThan(mDeskQualifier, mDeskQualifier));
-
-    }
-
-    public void testIsMatchFor() {
-        assertTrue(mNoneQualifier.isMatchFor(mCarQualifier));
-        assertTrue(mNoneQualifier.isMatchFor(mDeskQualifier));
-        assertTrue(mNoneQualifier.isMatchFor(mTVQualifier));
-        assertTrue(mCarQualifier.isMatchFor(mCarQualifier));
-        assertTrue(mDeskQualifier.isMatchFor(mDeskQualifier));
-        assertTrue(mTVQualifier.isMatchFor(mTVQualifier));
-
-        assertFalse(mCarQualifier.isMatchFor(mNoneQualifier));
-        assertFalse(mCarQualifier.isMatchFor(mDeskQualifier));
-
-        assertFalse(mDeskQualifier.isMatchFor(mCarQualifier));
-        assertFalse(mDeskQualifier.isMatchFor(mNoneQualifier));
-
-        assertFalse(mTVQualifier.isMatchFor(mCarQualifier));
-        assertFalse(mTVQualifier.isMatchFor(mNoneQualifier));
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/FolderConfigurationTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/FolderConfigurationTest.java
deleted file mode 100644
index 5f29791..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/FolderConfigurationTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-public class FolderConfigurationTest extends TestCase {
-
-    /*
-     * Test createDefault creates all the qualifiers.
-     */
-    public void testCreateDefault() {
-        FolderConfiguration defaultConfig = new FolderConfiguration();
-        defaultConfig.createDefault();
-
-        // this is always valid and up to date.
-        final int count = FolderConfiguration.getQualifierCount();
-
-        // make sure all the qualifiers were created.
-        for (int i = 0 ; i < count ; i++) {
-            assertNotNull(defaultConfig.getQualifier(i));
-        }
-    }
-
-    public void testSimpleResMatch() {
-        runConfigMatchTest(
-                "en-rGB-port-hdpi-notouch-12key",
-                3,
-                "",
-                "en",
-                "fr-rCA",
-                "en-port",
-                "en-notouch-12key",
-                "port-ldpi",
-                "port-notouch-12key");
-    }
-
-    public void testVersionResMatch() {
-        runConfigMatchTest(
-                "en-rUS-w600dp-h1024dp-large-port-mdpi-finger-nokeys-v12",
-                2,
-                "",
-                "large",
-                "w540dp");
-    }
-
-    public void testAddQualifier() {
-        FolderConfiguration defaultConfig = new FolderConfiguration();
-        defaultConfig.createDefault();
-
-        final int count = FolderConfiguration.getQualifierCount();
-        for (int i = 0 ; i < count ; i++) {
-            FolderConfiguration empty = new FolderConfiguration();
-
-            ResourceQualifier q = defaultConfig.getQualifier(i);
-
-            empty.addQualifier(q);
-
-            // check it was added
-            assertNotNull(
-                    "addQualifier failed for " + q.getClass().getName(), empty.getQualifier(i));
-        }
-    }
-
-
-    // --- helper methods
-
-    private final static class MockConfigurable implements Configurable {
-
-        private final FolderConfiguration mConfig;
-
-        MockConfigurable(String config) {
-            mConfig = FolderConfiguration.getConfig(getFolderSegments(config));
-        }
-
-        @Override
-        public FolderConfiguration getConfiguration() {
-            return mConfig;
-        }
-
-        @Override
-        public String toString() {
-            return mConfig.toString();
-        }
-    }
-
-    private void runConfigMatchTest(String refConfig, int resultIndex, String... configs) {
-        FolderConfiguration reference = FolderConfiguration.getConfig(getFolderSegments(refConfig));
-        assertNotNull(reference);
-
-        List<? extends Configurable> list = getConfigurable(configs);
-
-        Configurable match = reference.findMatchingConfigurable(list);
-        assertEquals(resultIndex, list.indexOf(match));
-    }
-
-    private List<? extends Configurable> getConfigurable(String... configs) {
-        ArrayList<MockConfigurable> list = new ArrayList<MockConfigurable>();
-
-        for (String config : configs) {
-            list.add(new MockConfigurable(config));
-        }
-
-        return list;
-    }
-
-    private static String[] getFolderSegments(String config) {
-        return (config.length() > 0 ? "foo-" + config : "foo").split("-");
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/KeyboardStateQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/KeyboardStateQualifierTest.java
deleted file mode 100644
index cf52a38..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/KeyboardStateQualifierTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.KeyboardState;
-
-import junit.framework.TestCase;
-
-public class KeyboardStateQualifierTest extends TestCase {
-
-    private KeyboardStateQualifier ksq;
-    private FolderConfiguration config;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        ksq = new KeyboardStateQualifier();
-        config = new FolderConfiguration();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        ksq = null;
-        config = null;
-    }
-
-    public void testExposed() {
-        assertEquals(true, ksq.checkAndSet("keysexposed", config)); //$NON-NLS-1$
-        assertTrue(config.getKeyboardStateQualifier() != null);
-        assertEquals(KeyboardState.EXPOSED, config.getKeyboardStateQualifier().getValue());
-        assertEquals("keysexposed", config.getKeyboardStateQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testHidden() {
-        assertEquals(true, ksq.checkAndSet("keyshidden", config)); //$NON-NLS-1$
-        assertTrue(config.getKeyboardStateQualifier() != null);
-        assertEquals(KeyboardState.HIDDEN, config.getKeyboardStateQualifier().getValue());
-        assertEquals("keyshidden", config.getKeyboardStateQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testFailures() {
-        assertEquals(false, ksq.checkAndSet("", config));//$NON-NLS-1$
-        assertEquals(false, ksq.checkAndSet("KEYSEXPOSED", config));//$NON-NLS-1$
-        assertEquals(false, ksq.checkAndSet("other", config));//$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/LanguageQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/LanguageQualifierTest.java
deleted file mode 100644
index 2dfd65f..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/LanguageQualifierTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import junit.framework.TestCase;
-
-public class LanguageQualifierTest extends TestCase {
-
-    private FolderConfiguration config;
-    private LanguageQualifier lq;
-
-    @Override
-    public void setUp()  throws Exception {
-        super.setUp();
-        config = new FolderConfiguration();
-        lq = new LanguageQualifier();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        config = null;
-        lq = null;
-    }
-
-    public void testCheckAndSet() {
-        assertEquals(true, lq.checkAndSet("en", config)); //$NON-NLS-1$
-        assertTrue(config.getLanguageQualifier() != null);
-        assertEquals("en", config.getLanguageQualifier().toString()); //$NON-NLS-1$
-
-    }
-
-    public void testFailures() {
-        assertEquals(false, lq.checkAndSet("", config)); //$NON-NLS-1$
-        assertEquals(false, lq.checkAndSet("EN", config)); //$NON-NLS-1$
-        assertEquals(false, lq.checkAndSet("abc", config)); //$NON-NLS-1$
-    }
-}
-
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/NavigationMethodQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/NavigationMethodQualifierTest.java
deleted file mode 100644
index 4237dde..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/NavigationMethodQualifierTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.Navigation;
-
-import junit.framework.TestCase;
-
-public class NavigationMethodQualifierTest extends TestCase {
-
-    private FolderConfiguration config;
-    private NavigationMethodQualifier nmq;
-
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        config = new FolderConfiguration();
-        nmq = new NavigationMethodQualifier();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        config = null;
-        nmq = null;
-    }
-
-    public void testDPad() {
-        assertEquals(true, nmq.checkAndSet("dpad", config)); //$NON-NLS-1$
-        assertTrue(config.getNavigationMethodQualifier() != null);
-        assertEquals(Navigation.DPAD, config.getNavigationMethodQualifier().getValue());
-        assertEquals("dpad", config.getNavigationMethodQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testTrackball() {
-        assertEquals(true, nmq.checkAndSet("trackball", config)); //$NON-NLS-1$
-        assertTrue(config.getNavigationMethodQualifier() != null);
-        assertEquals(Navigation.TRACKBALL, config.getNavigationMethodQualifier().getValue());
-        assertEquals("trackball", config.getNavigationMethodQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testWheel() {
-        assertEquals(true, nmq.checkAndSet("wheel", config)); //$NON-NLS-1$
-        assertTrue(config.getNavigationMethodQualifier() != null);
-        assertEquals(Navigation.WHEEL, config.getNavigationMethodQualifier().getValue());
-        assertEquals("wheel", config.getNavigationMethodQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testFailures() {
-        assertEquals(false, nmq.checkAndSet("", config));//$NON-NLS-1$
-        assertEquals(false, nmq.checkAndSet("WHEEL", config));//$NON-NLS-1$
-        assertEquals(false, nmq.checkAndSet("other", config));//$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/NetworkCodeQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/NetworkCodeQualifierTest.java
deleted file mode 100644
index 6896316..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/NetworkCodeQualifierTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import junit.framework.TestCase;
-
-public class NetworkCodeQualifierTest extends TestCase {
-
-    private NetworkCodeQualifier mncq;
-    private FolderConfiguration config;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mncq = new NetworkCodeQualifier();
-        config = new FolderConfiguration();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        mncq = null;
-        config = null;
-    }
-
-    public void testCheckAndSet() {
-        assertEquals(true, mncq.checkAndSet("mnc123", config));//$NON-NLS-1$
-        assertTrue(config.getNetworkCodeQualifier() != null);
-        assertEquals(123, config.getNetworkCodeQualifier().getCode());
-        assertEquals("mnc123", config.getNetworkCodeQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testFailures() {
-        assertEquals(false, mncq.checkAndSet("", config));//$NON-NLS-1$
-        assertEquals(false, mncq.checkAndSet("mnc", config));//$NON-NLS-1$
-        assertEquals(false, mncq.checkAndSet("MNC123", config));//$NON-NLS-1$
-        assertEquals(false, mncq.checkAndSet("123", config));//$NON-NLS-1$
-        assertEquals(false, mncq.checkAndSet("mncsdf", config));//$NON-NLS-1$
-    }
-
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/PixelDensityQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/PixelDensityQualifierTest.java
deleted file mode 100644
index 4ab493a..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/PixelDensityQualifierTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.Density;
-
-import junit.framework.TestCase;
-
-public class PixelDensityQualifierTest extends TestCase {
-
-    private DensityQualifier pdq;
-    private FolderConfiguration config;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        pdq = new DensityQualifier();
-        config = new FolderConfiguration();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        pdq = null;
-        config = null;
-    }
-
-    public void testCheckAndSet() {
-        assertEquals(true, pdq.checkAndSet("ldpi", config));//$NON-NLS-1$
-        assertTrue(config.getDensityQualifier() != null);
-        assertEquals(Density.LOW, config.getDensityQualifier().getValue());
-        assertEquals("ldpi", config.getDensityQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testFailures() {
-        assertEquals(false, pdq.checkAndSet("", config));//$NON-NLS-1$
-        assertEquals(false, pdq.checkAndSet("dpi", config));//$NON-NLS-1$
-        assertEquals(false, pdq.checkAndSet("123dpi", config));//$NON-NLS-1$
-        assertEquals(false, pdq.checkAndSet("123", config));//$NON-NLS-1$
-        assertEquals(false, pdq.checkAndSet("sdfdpi", config));//$NON-NLS-1$
-    }
-
-    public void testIsBetterMatchThan() {
-        DensityQualifier ldpi = new DensityQualifier(Density.LOW);
-        DensityQualifier mdpi = new DensityQualifier(Density.MEDIUM);
-        DensityQualifier hdpi = new DensityQualifier(Density.HIGH);
-        DensityQualifier xhdpi = new DensityQualifier(Density.XHIGH);
-
-        // first test that each Q is a better match than all other Qs when the ref is the same Q.
-        assertTrue(ldpi.isBetterMatchThan(mdpi, ldpi));
-        assertTrue(ldpi.isBetterMatchThan(hdpi, ldpi));
-        assertTrue(ldpi.isBetterMatchThan(xhdpi, ldpi));
-
-        assertTrue(mdpi.isBetterMatchThan(ldpi, mdpi));
-        assertTrue(mdpi.isBetterMatchThan(hdpi, mdpi));
-        assertTrue(mdpi.isBetterMatchThan(xhdpi, mdpi));
-
-        assertTrue(hdpi.isBetterMatchThan(ldpi, hdpi));
-        assertTrue(hdpi.isBetterMatchThan(mdpi, hdpi));
-        assertTrue(hdpi.isBetterMatchThan(xhdpi, hdpi));
-
-        assertTrue(xhdpi.isBetterMatchThan(ldpi, xhdpi));
-        assertTrue(xhdpi.isBetterMatchThan(mdpi, xhdpi));
-        assertTrue(xhdpi.isBetterMatchThan(hdpi, xhdpi));
-
-        // now test that the highest dpi is always preferable if there's no exact match
-
-        // looking for ldpi:
-        assertTrue(hdpi.isBetterMatchThan(mdpi, ldpi));
-        assertTrue(xhdpi.isBetterMatchThan(mdpi, ldpi));
-        assertTrue(xhdpi.isBetterMatchThan(hdpi, ldpi));
-        // the other way around
-        assertFalse(mdpi.isBetterMatchThan(hdpi, ldpi));
-        assertFalse(mdpi.isBetterMatchThan(xhdpi, ldpi));
-        assertFalse(hdpi.isBetterMatchThan(xhdpi, ldpi));
-
-        // looking for mdpi
-        assertTrue(hdpi.isBetterMatchThan(ldpi, mdpi));
-        assertTrue(xhdpi.isBetterMatchThan(ldpi, mdpi));
-        assertTrue(xhdpi.isBetterMatchThan(hdpi, mdpi));
-        // the other way around
-        assertFalse(ldpi.isBetterMatchThan(hdpi, mdpi));
-        assertFalse(ldpi.isBetterMatchThan(xhdpi, mdpi));
-        assertFalse(hdpi.isBetterMatchThan(xhdpi, mdpi));
-
-        // looking for hdpi
-        assertTrue(mdpi.isBetterMatchThan(ldpi, hdpi));
-        assertTrue(xhdpi.isBetterMatchThan(ldpi, hdpi));
-        assertTrue(xhdpi.isBetterMatchThan(mdpi, hdpi));
-        // the other way around
-        assertFalse(ldpi.isBetterMatchThan(mdpi, hdpi));
-        assertFalse(ldpi.isBetterMatchThan(xhdpi, hdpi));
-        assertFalse(mdpi.isBetterMatchThan(xhdpi, hdpi));
-
-        // looking for xhdpi
-        assertTrue(mdpi.isBetterMatchThan(ldpi, xhdpi));
-        assertTrue(hdpi.isBetterMatchThan(ldpi, xhdpi));
-        assertTrue(hdpi.isBetterMatchThan(mdpi, xhdpi));
-        // the other way around
-        assertFalse(ldpi.isBetterMatchThan(mdpi, xhdpi));
-        assertFalse(ldpi.isBetterMatchThan(hdpi, xhdpi));
-        assertFalse(mdpi.isBetterMatchThan(hdpi, xhdpi));
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/RegionQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/RegionQualifierTest.java
deleted file mode 100644
index fc0402c..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/RegionQualifierTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import junit.framework.TestCase;
-
-public class RegionQualifierTest extends TestCase {
-
-    private RegionQualifier rq;
-    private FolderConfiguration config;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        rq = new RegionQualifier();
-        config = new FolderConfiguration();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        rq = null;
-        config = null;
-    }
-
-    public void testCheckAndSet() {
-        assertEquals(true, rq.checkAndSet("rUS", config));//$NON-NLS-1$
-        assertTrue(config.getRegionQualifier() != null);
-        assertEquals("US", config.getRegionQualifier().getValue()); //$NON-NLS-1$
-        assertEquals("rUS", config.getRegionQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testFailures() {
-        assertEquals(false, rq.checkAndSet("", config));//$NON-NLS-1$
-        assertEquals(false, rq.checkAndSet("rus", config));//$NON-NLS-1$
-        assertEquals(false, rq.checkAndSet("rUSA", config));//$NON-NLS-1$
-        assertEquals(false, rq.checkAndSet("abc", config));//$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/ScreenDimensionQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/ScreenDimensionQualifierTest.java
deleted file mode 100644
index e57424f..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/ScreenDimensionQualifierTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import junit.framework.TestCase;
-
-public class ScreenDimensionQualifierTest extends TestCase {
-
-    private ScreenDimensionQualifier sdq;
-    private FolderConfiguration config;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        sdq = new ScreenDimensionQualifier();
-        config = new FolderConfiguration();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        sdq = null;
-        config = null;
-    }
-
-    public void testCheckAndSet() {
-        assertEquals(true, sdq.checkAndSet("400x200", config));//$NON-NLS-1$
-        assertTrue(config.getScreenDimensionQualifier() != null);
-        assertEquals(400, config.getScreenDimensionQualifier().getValue1());
-        assertEquals(200, config.getScreenDimensionQualifier().getValue2());
-        assertEquals("400x200", config.getScreenDimensionQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testFailures() {
-        assertEquals(false, sdq.checkAndSet("", config));//$NON-NLS-1$
-        assertEquals(false, sdq.checkAndSet("400X200", config));//$NON-NLS-1$
-        assertEquals(false, sdq.checkAndSet("x200", config));//$NON-NLS-1$
-        assertEquals(false, sdq.checkAndSet("ax200", config));//$NON-NLS-1$
-        assertEquals(false, sdq.checkAndSet("400x", config));//$NON-NLS-1$
-        assertEquals(false, sdq.checkAndSet("400xa", config));//$NON-NLS-1$
-        assertEquals(false, sdq.checkAndSet("other", config));//$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/ScreenOrientationQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/ScreenOrientationQualifierTest.java
deleted file mode 100644
index 3aac5f3..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/ScreenOrientationQualifierTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.ScreenOrientation;
-
-import junit.framework.TestCase;
-
-public class ScreenOrientationQualifierTest extends TestCase {
-
-    private ScreenOrientationQualifier soq;
-    private FolderConfiguration config;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        soq = new ScreenOrientationQualifier();
-        config = new FolderConfiguration();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        soq = null;
-        config = null;
-    }
-
-    public void testPortrait() {
-        assertEquals(true, soq.checkAndSet("port", config)); //$NON-NLS-1$
-        assertTrue(config.getScreenOrientationQualifier() != null);
-        assertEquals(ScreenOrientation.PORTRAIT, config.getScreenOrientationQualifier().getValue());
-        assertEquals("port", config.getScreenOrientationQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testLanscape() {
-        assertEquals(true, soq.checkAndSet("land", config)); //$NON-NLS-1$
-        assertTrue(config.getScreenOrientationQualifier() != null);
-        assertEquals(ScreenOrientation.LANDSCAPE,
-                config.getScreenOrientationQualifier().getValue());
-        assertEquals("land", config.getScreenOrientationQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testSquare() {
-        assertEquals(true, soq.checkAndSet("square", config)); //$NON-NLS-1$
-        assertTrue(config.getScreenOrientationQualifier() != null);
-        assertEquals(ScreenOrientation.SQUARE,
-                config.getScreenOrientationQualifier().getValue());
-        assertEquals("square", config.getScreenOrientationQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testFailures() {
-        assertEquals(false, soq.checkAndSet("", config));//$NON-NLS-1$
-        assertEquals(false, soq.checkAndSet("PORT", config));//$NON-NLS-1$
-        assertEquals(false, soq.checkAndSet("landscape", config));//$NON-NLS-1$
-        assertEquals(false, soq.checkAndSet("portrait", config));//$NON-NLS-1$
-        assertEquals(false, soq.checkAndSet("other", config));//$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/ScreenSizeQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/ScreenSizeQualifierTest.java
deleted file mode 100644
index b19f125..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/ScreenSizeQualifierTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.ScreenSize;
-
-import junit.framework.TestCase;
-
-public class ScreenSizeQualifierTest extends TestCase {
-
-    private ScreenSizeQualifier ssq;
-    private FolderConfiguration config;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        ssq = new ScreenSizeQualifier();
-        config = new FolderConfiguration();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        ssq = null;
-        config = null;
-    }
-
-    public void testSmall() {
-        assertEquals(true, ssq.checkAndSet("small", config)); //$NON-NLS-1$
-        assertTrue(config.getScreenSizeQualifier() != null);
-        assertEquals(ScreenSize.SMALL, config.getScreenSizeQualifier().getValue());
-        assertEquals("small", config.getScreenSizeQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testNormal() {
-        assertEquals(true, ssq.checkAndSet("normal", config)); //$NON-NLS-1$
-        assertTrue(config.getScreenSizeQualifier() != null);
-        assertEquals(ScreenSize.NORMAL, config.getScreenSizeQualifier().getValue());
-        assertEquals("normal", config.getScreenSizeQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testLarge() {
-        assertEquals(true, ssq.checkAndSet("large", config)); //$NON-NLS-1$
-        assertTrue(config.getScreenSizeQualifier() != null);
-        assertEquals(ScreenSize.LARGE, config.getScreenSizeQualifier().getValue());
-        assertEquals("large", config.getScreenSizeQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testXLarge() {
-        assertEquals(true, ssq.checkAndSet("xlarge", config)); //$NON-NLS-1$
-        assertTrue(config.getScreenSizeQualifier() != null);
-        assertEquals(ScreenSize.XLARGE, config.getScreenSizeQualifier().getValue());
-        assertEquals("xlarge", config.getScreenSizeQualifier().toString()); //$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/TextInputMethodQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/TextInputMethodQualifierTest.java
deleted file mode 100644
index bc2c890..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/TextInputMethodQualifierTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.Keyboard;
-
-import junit.framework.TestCase;
-
-public class TextInputMethodQualifierTest extends TestCase {
-
-    private TextInputMethodQualifier timq;
-    private FolderConfiguration config;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        timq = new TextInputMethodQualifier();
-        config = new FolderConfiguration();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        timq = null;
-        config = null;
-    }
-
-    public void testQuerty() {
-        assertEquals(true, timq.checkAndSet("qwerty", config)); //$NON-NLS-1$
-        assertTrue(config.getTextInputMethodQualifier() != null);
-        assertEquals(Keyboard.QWERTY, config.getTextInputMethodQualifier().getValue());
-        assertEquals("qwerty", config.getTextInputMethodQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void test12Key() {
-        assertEquals(true, timq.checkAndSet("12key", config)); //$NON-NLS-1$
-        assertTrue(config.getTextInputMethodQualifier() != null);
-        assertEquals(Keyboard.TWELVEKEY, config.getTextInputMethodQualifier().getValue());
-        assertEquals("12key", config.getTextInputMethodQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testNoKey() {
-        assertEquals(true, timq.checkAndSet("nokeys", config)); //$NON-NLS-1$
-        assertTrue(config.getTextInputMethodQualifier() != null);
-        assertEquals(Keyboard.NOKEY, config.getTextInputMethodQualifier().getValue());
-        assertEquals("nokeys", config.getTextInputMethodQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testFailures() {
-        assertEquals(false, timq.checkAndSet("", config));//$NON-NLS-1$
-        assertEquals(false, timq.checkAndSet("QWERTY", config));//$NON-NLS-1$
-        assertEquals(false, timq.checkAndSet("12keys", config));//$NON-NLS-1$
-        assertEquals(false, timq.checkAndSet("*12key", config));//$NON-NLS-1$
-        assertEquals(false, timq.checkAndSet("other", config));//$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/resources/configuration/TouchScreenQualifierTest.java b/sdk_common/tests/src/com/android/ide/common/resources/configuration/TouchScreenQualifierTest.java
deleted file mode 100644
index 04f8a30..0000000
--- a/sdk_common/tests/src/com/android/ide/common/resources/configuration/TouchScreenQualifierTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.resources.configuration;
-
-import com.android.resources.TouchScreen;
-
-import junit.framework.TestCase;
-
-public class TouchScreenQualifierTest extends TestCase {
-
-    private TouchScreenQualifier tsq;
-    private FolderConfiguration config;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        tsq = new TouchScreenQualifier();
-        config = new FolderConfiguration();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        tsq = null;
-        config = null;
-    }
-
-    public void testNoTouch() {
-        assertEquals(true, tsq.checkAndSet("notouch", config)); //$NON-NLS-1$
-        assertTrue(config.getTouchTypeQualifier() != null);
-        assertEquals(TouchScreen.NOTOUCH, config.getTouchTypeQualifier().getValue());
-        assertEquals("notouch", config.getTouchTypeQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testFinger() {
-        assertEquals(true, tsq.checkAndSet("finger", config)); //$NON-NLS-1$
-        assertTrue(config.getTouchTypeQualifier() != null);
-        assertEquals(TouchScreen.FINGER, config.getTouchTypeQualifier().getValue());
-        assertEquals("finger", config.getTouchTypeQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testStylus() {
-        assertEquals(true, tsq.checkAndSet("stylus", config)); //$NON-NLS-1$
-        assertTrue(config.getTouchTypeQualifier() != null);
-        assertEquals(TouchScreen.STYLUS, config.getTouchTypeQualifier().getValue());
-        assertEquals("stylus", config.getTouchTypeQualifier().toString()); //$NON-NLS-1$
-    }
-
-    public void testFailures() {
-        assertEquals(false, tsq.checkAndSet("", config));//$NON-NLS-1$
-        assertEquals(false, tsq.checkAndSet("STYLUS", config));//$NON-NLS-1$
-        assertEquals(false, tsq.checkAndSet("other", config));//$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/xml/AndroidManifestParserTest.java b/sdk_common/tests/src/com/android/ide/common/xml/AndroidManifestParserTest.java
deleted file mode 100644
index fee6014..0000000
--- a/sdk_common/tests/src/com/android/ide/common/xml/AndroidManifestParserTest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.xml;
-
-import com.android.ide.common.xml.ManifestData.UsesFeature;
-import com.android.ide.common.xml.ManifestData.UsesLibrary;
-import com.android.resources.Keyboard;
-import com.android.resources.Navigation;
-import com.android.resources.TouchScreen;
-
-import junit.framework.TestCase;
-
-import java.io.InputStream;
-
-/**
- * Tests for {@link AndroidManifestParser}
- */
-public class AndroidManifestParserTest extends TestCase {
-    private ManifestData mManifestTestApp;
-    private ManifestData mManifestInstrumentation;
-
-    private static final String TESTDATA_PATH =
-        "/com/android/sdklib/testdata/";  //$NON-NLS-1$
-    private static final String INSTRUMENTATION_XML = TESTDATA_PATH +
-        "AndroidManifest-instrumentation.xml";  //$NON-NLS-1$
-    private static final String TESTAPP_XML = TESTDATA_PATH +
-        "AndroidManifest-testapp.xml";  //$NON-NLS-1$
-    private static final String ACTIVITY_ALIAS_XML = TESTDATA_PATH +
-            "AndroidManifest-activityalias.xml";  //$NON-NLS-1$
-    private static final String PACKAGE_NAME =  "com.android.testapp"; //$NON-NLS-1$
-    private static final Integer VERSION_CODE = 42;
-    private static final String ACTIVITY_NAME = "com.android.testapp.MainActivity"; //$NON-NLS-1$
-    private static final String LIBRARY_NAME = "android.test.runner"; //$NON-NLS-1$
-    private static final String LIBRARY_NAME2 = "android.test.runner2"; //$NON-NLS-1$
-    private static final String FEATURE_NAME = "com.foo.feature"; //$NON-NLS-1$
-    private static final String INSTRUMENTATION_NAME = "android.test.InstrumentationTestRunner"; //$NON-NLS-1$
-    private static final String INSTRUMENTATION_TARGET = "com.android.AndroidProject"; //$NON-NLS-1$
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        InputStream manifestStream = this.getClass().getResourceAsStream(TESTAPP_XML);
-
-        mManifestTestApp = AndroidManifestParser.parse(manifestStream);
-        assertNotNull(mManifestTestApp);
-
-        manifestStream = this.getClass().getResourceAsStream(INSTRUMENTATION_XML);
-        mManifestInstrumentation = AndroidManifestParser.parse(manifestStream);
-        assertNotNull(mManifestInstrumentation);
-    }
-
-    public void testGetInstrumentationInformation() {
-        assertEquals(1, mManifestInstrumentation.getInstrumentations().length);
-        assertEquals(INSTRUMENTATION_NAME,
-                mManifestInstrumentation.getInstrumentations()[0].getName());
-        assertEquals(INSTRUMENTATION_TARGET,
-                mManifestInstrumentation.getInstrumentations()[0].getTargetPackage());
-    }
-
-    public void testGetPackage() {
-        assertEquals(PACKAGE_NAME, mManifestTestApp.getPackage());
-    }
-
-    public void testGetVersionCode() {
-        assertEquals(VERSION_CODE, mManifestTestApp.getVersionCode());
-        assertEquals(null, mManifestInstrumentation.getVersionCode());
-    }
-
-    public void testMinSdkVersion() {
-        assertEquals(7, mManifestTestApp.getMinSdkVersion());
-        assertEquals(8, mManifestTestApp.getTargetSdkVersion());
-
-        assertEquals("foo", mManifestInstrumentation.getMinSdkVersionString());
-        assertEquals(ManifestData.MIN_SDK_CODENAME, mManifestInstrumentation.getMinSdkVersion());
-    }
-
-    public void testGetActivities() {
-        assertEquals(1, mManifestTestApp.getActivities().length);
-        ManifestData.Activity activity = mManifestTestApp.getActivities()[0];
-        assertEquals(ACTIVITY_NAME, activity.getName());
-        assertTrue(activity.hasAction());
-        assertTrue(activity.isHomeActivity());
-        assertTrue(activity.hasAction());
-        assertEquals(activity, mManifestTestApp.getActivities()[0]);
-    }
-
-    public void testGetLauncherActivity() {
-        ManifestData.Activity activity = mManifestTestApp.getLauncherActivity();
-        assertEquals(ACTIVITY_NAME, activity.getName());
-        assertTrue(activity.hasAction());
-        assertTrue(activity.isHomeActivity());
-    }
-
-    public void testSupportsScreen() {
-        ManifestData.SupportsScreens supportsScreens =
-            mManifestTestApp.getSupportsScreensFromManifest();
-
-        assertNotNull(supportsScreens);
-        assertEquals(Boolean.TRUE, supportsScreens.getAnyDensity());
-        assertEquals(Boolean.TRUE, supportsScreens.getResizeable());
-        assertEquals(Boolean.TRUE, supportsScreens.getSmallScreens());
-        assertEquals(Boolean.TRUE, supportsScreens.getNormalScreens());
-        assertEquals(Boolean.TRUE, supportsScreens.getLargeScreens());
-    }
-
-    public void testUsesConfiguration() {
-        ManifestData.UsesConfiguration usesConfig = mManifestTestApp.getUsesConfiguration();
-
-        assertNotNull(usesConfig);
-        assertEquals(Boolean.TRUE, usesConfig.getReqFiveWayNav());
-        assertEquals(Navigation.NONAV, usesConfig.getReqNavigation());
-        assertEquals(Boolean.TRUE, usesConfig.getReqHardKeyboard());
-        assertEquals(Keyboard.TWELVEKEY, usesConfig.getReqKeyboardType());
-        assertEquals(TouchScreen.FINGER, usesConfig.getReqTouchScreen());
-    }
-
-    private void assertEquals(ManifestData.Activity lhs, ManifestData.Activity rhs) {
-        assertTrue(lhs == rhs || (lhs != null && rhs != null));
-        if (lhs != null && rhs != null) {
-            assertEquals(lhs.getName(),        rhs.getName());
-            assertEquals(lhs.isExported(),     rhs.isExported());
-            assertEquals(lhs.hasAction(),      rhs.hasAction());
-            assertEquals(lhs.isHomeActivity(), rhs.isHomeActivity());
-        }
-    }
-
-    public void testGetUsesLibraries() {
-        UsesLibrary[] libraries = mManifestTestApp.getUsesLibraries();
-
-        assertEquals(2,             libraries.length);
-        assertEquals(LIBRARY_NAME,  libraries[0].getName());
-        assertEquals(Boolean.FALSE, libraries[0].getRequired());
-        assertEquals(LIBRARY_NAME2, libraries[1].getName());
-        assertEquals(Boolean.TRUE,  libraries[1].getRequired());
-    }
-
-    public void testGetUsesFeatures() {
-        UsesFeature[] features = mManifestTestApp.getUsesFeatures();
-
-        assertEquals(2,            features.length);
-        assertEquals(0x00020001,   features[0].mGlEsVersion);
-        assertEquals(Boolean.TRUE, features[0].getRequired());
-        assertEquals(FEATURE_NAME, features[1].getName());
-        assertEquals(Boolean.TRUE, features[1].getRequired());
-    }
-
-    public void testGetPackageName() {
-        assertEquals(PACKAGE_NAME, mManifestTestApp.getPackage());
-    }
-
-    public void testActivityAlias() throws Exception {
-        InputStream manifestStream = this.getClass().getResourceAsStream(ACTIVITY_ALIAS_XML);
-
-        ManifestData manifest = AndroidManifestParser.parse(manifestStream);
-        assertNotNull(manifest);
-
-        assertEquals(manifest.getLauncherActivity().getName(),
-                "com.android.testapp.AliasActivity"); //$NON-NLS-1$
-    }
-}
diff --git a/sdk_common/tests/src/com/android/ide/common/xml/SupportsScreensTest.java b/sdk_common/tests/src/com/android/ide/common/xml/SupportsScreensTest.java
deleted file mode 100644
index aa88fc7..0000000
--- a/sdk_common/tests/src/com/android/ide/common/xml/SupportsScreensTest.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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 com.android.ide.common.xml;
-
-import com.android.ide.common.xml.AndroidManifestParser;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.common.xml.ManifestData.SupportsScreens;
-
-import java.io.InputStream;
-
-import junit.framework.TestCase;
-
-public class SupportsScreensTest extends TestCase {
-
-    private static final String TESTDATA_PATH =
-        "/com/android/sdklib/testdata/";  //$NON-NLS-1$
-    private static final String TESTAPP2_XML = TESTDATA_PATH +
-        "AndroidManifest-testapp2.xml";  //$NON-NLS-1$
-
-    public void testDefaultValuesApi3() {
-        SupportsScreens supportsScreens = SupportsScreens.getDefaultValues(3);
-
-        assertNotNull(supportsScreens);
-        assertEquals(Boolean.FALSE, supportsScreens.getAnyDensity());
-        assertEquals(Boolean.FALSE, supportsScreens.getResizeable());
-        assertEquals(Boolean.FALSE, supportsScreens.getSmallScreens());
-        assertEquals(Boolean.TRUE, supportsScreens.getNormalScreens());
-        assertEquals(Boolean.FALSE, supportsScreens.getLargeScreens());
-    }
-
-    public void testDefaultValuesApi4() {
-        SupportsScreens supportsScreens = SupportsScreens.getDefaultValues(4);
-
-        assertNotNull(supportsScreens);
-        assertEquals(Boolean.TRUE, supportsScreens.getAnyDensity());
-        assertEquals(Boolean.TRUE, supportsScreens.getResizeable());
-        assertEquals(Boolean.TRUE, supportsScreens.getSmallScreens());
-        assertEquals(Boolean.TRUE, supportsScreens.getNormalScreens());
-        assertEquals(Boolean.TRUE, supportsScreens.getLargeScreens());
-    }
-
-    public void testManifestParsing() throws Exception {
-        InputStream manifestStream = this.getClass().getResourceAsStream(TESTAPP2_XML);
-
-        ManifestData data = AndroidManifestParser.parse(manifestStream);
-        assertNotNull(data);
-
-        SupportsScreens supportsScreens = data.getSupportsScreensFromManifest();
-        assertNotNull(supportsScreens);
-        assertEquals(null, supportsScreens.getAnyDensity());
-        assertEquals(null, supportsScreens.getResizeable());
-        assertEquals(null, supportsScreens.getSmallScreens());
-        assertEquals(null, supportsScreens.getNormalScreens());
-        assertEquals(Boolean.FALSE, supportsScreens.getLargeScreens());
-
-        supportsScreens = data.getSupportsScreensValues();
-        assertNotNull(supportsScreens);
-        assertEquals(Boolean.TRUE, supportsScreens.getAnyDensity());
-        assertEquals(Boolean.TRUE, supportsScreens.getResizeable());
-        assertEquals(Boolean.TRUE, supportsScreens.getSmallScreens());
-        assertEquals(Boolean.TRUE, supportsScreens.getNormalScreens());
-        assertEquals(Boolean.FALSE, supportsScreens.getLargeScreens());
-    }
-
-    public void testOverlapWith() {
-        SupportsScreens supportsN = new SupportsScreens("false|false|false|true|false");
-        SupportsScreens supportsSL = new SupportsScreens("false|false|true|false|true");
-
-        assertTrue(supportsN.overlapWith(supportsSL));
-        assertTrue(supportsSL.overlapWith(supportsN));
-    }
-
-    public void testCompareScreenSizesWith() {
-        // set instance that support all combo of the three sizes.
-        SupportsScreens supportsS = new SupportsScreens("false|false|true|false|false");
-        SupportsScreens supportsN = new SupportsScreens("false|false|false|true|false");
-        SupportsScreens supportsL = new SupportsScreens("false|false|false|false|true");
-        SupportsScreens supportsSL = new SupportsScreens("false|false|true|false|true");
-
-        assertEquals(-1, supportsS.compareScreenSizesWith(supportsN));
-        assertEquals( 1, supportsN.compareScreenSizesWith(supportsS));
-        assertEquals(-1, supportsN.compareScreenSizesWith(supportsL));
-        assertEquals(-1, supportsS.compareScreenSizesWith(supportsL));
-
-        // test thrown exception for overlapWith == true
-        try {
-            supportsSL.compareScreenSizesWith(supportsN);
-            fail("Should have thrown IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
-            // success!
-        }
-
-        // test thrown exception for hasStrictlyDifferentScreenSupportAs == false
-        try {
-            supportsSL.compareScreenSizesWith(supportsS);
-            fail("Should have thrown IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
-            // success!
-        }
-
-    }
-
-    public void testHasStrictlyDifferentScreenSupportAs() {
-        SupportsScreens supportsS = new SupportsScreens("false|false|true|false|false");
-        SupportsScreens supportsN = new SupportsScreens("false|false|false|true|false");
-        SupportsScreens supportsL = new SupportsScreens("false|false|false|false|true");
-
-        SupportsScreens supportsSN = new SupportsScreens("false|false|true|true|false");
-        SupportsScreens supportsNL = new SupportsScreens("false|false|false|true|true");
-        SupportsScreens supportsSL = new SupportsScreens("false|false|true|false|true");
-        SupportsScreens supportsSNL = new SupportsScreens("false|false|true|true|true");
-
-        assertTrue(supportsS.hasStrictlyDifferentScreenSupportAs(supportsN));
-        assertTrue(supportsS.hasStrictlyDifferentScreenSupportAs(supportsL));
-        assertTrue(supportsN.hasStrictlyDifferentScreenSupportAs(supportsS));
-        assertTrue(supportsN.hasStrictlyDifferentScreenSupportAs(supportsL));
-        assertTrue(supportsL.hasStrictlyDifferentScreenSupportAs(supportsS));
-        assertTrue(supportsL.hasStrictlyDifferentScreenSupportAs(supportsN));
-
-
-        assertFalse(supportsSN.hasStrictlyDifferentScreenSupportAs(supportsS));
-        assertFalse(supportsSN.hasStrictlyDifferentScreenSupportAs(supportsN));
-        assertTrue(supportsSN.hasStrictlyDifferentScreenSupportAs(supportsL));
-        assertFalse(supportsSL.hasStrictlyDifferentScreenSupportAs(supportsS));
-        assertTrue(supportsSL.hasStrictlyDifferentScreenSupportAs(supportsN));
-        assertFalse(supportsSL.hasStrictlyDifferentScreenSupportAs(supportsL));
-        assertTrue(supportsNL.hasStrictlyDifferentScreenSupportAs(supportsS));
-        assertFalse(supportsNL.hasStrictlyDifferentScreenSupportAs(supportsN));
-        assertFalse(supportsNL.hasStrictlyDifferentScreenSupportAs(supportsL));
-        assertFalse(supportsSNL.hasStrictlyDifferentScreenSupportAs(supportsS));
-        assertFalse(supportsSNL.hasStrictlyDifferentScreenSupportAs(supportsN));
-        assertFalse(supportsSNL.hasStrictlyDifferentScreenSupportAs(supportsL));
-    }
-}
diff --git a/sdkmanager/app/.classpath b/sdkmanager/app/.classpath
index b06fd5a..98cdeb1 100644
--- a/sdkmanager/app/.classpath
+++ b/sdkmanager/app/.classpath
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry excluding="**/Android.mk" kind="src" path="src"/>
-	<classpathentry excluding="**/Android.mk" kind="src" path="tests"/>
+	<classpathentry excluding="**/Android.mk" kind="src" path="src/main/java"/>
+	<classpathentry excluding="**/Android.mk" kind="src" path="src/test/java"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/sdklib"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/sdkuilib"/>
@@ -11,5 +11,6 @@
 	<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/eclipse/org.eclipse.core.commands_3.6.0.I20100512-1500.jar"/>
 	<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/eclipse/org.eclipse.equinox.common_3.6.0.v20100503.jar"/>
 	<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/eclipse/org.eclipse.jface_3.6.2.M20110210-1200.jar"/>
+	<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/guava-tools/guava-13.0.1.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/sdkmanager/app/Android.mk b/sdkmanager/app/Android.mk
index 82aad43..f72c401 100644
--- a/sdkmanager/app/Android.mk
+++ b/sdkmanager/app/Android.mk
@@ -1,10 +1,22 @@
 # Copyright 2007 The Android Open Source Project
 #
+# Licensed 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.
+#
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_JAVA_RESOURCE_DIRS := src
+LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
+LOCAL_JAVA_RESOURCE_DIRS := src/main/java
 
 LOCAL_JAR_MANIFEST := etc/manifest.txt
 
@@ -17,6 +29,7 @@
 #  current VM is 32 or 64 bit.)
 LOCAL_JAVA_LIBRARIES := \
 	common \
+	guava-tools \
 	sdklib \
 	sdkuilib \
 	swt \
@@ -25,10 +38,33 @@
 	org.eclipse.core.commands_3.6.0.I20100512-1500
 
 LOCAL_MODULE := sdkmanager
-LOCAL_MODULE_TAGS := debug
+LOCAL_MODULE_TAGS := optional
 
 include $(BUILD_HOST_JAVA_LIBRARY)
 
 # Build all sub-directories
 include $(call all-makefiles-under,$(LOCAL_PATH))
 
+
+# ----- TESTS ------
+# Copyright (C) 2011 The Android Open Source Project
+
+include $(CLEAR_VARS)
+
+# Only compile source java files in this lib.
+LOCAL_SRC_FILES := $(call all-java-files-under, src/test/java)
+
+LOCAL_MODULE := sdkmanager-tests
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_JAVA_LIBRARIES := \
+    guava-tools \
+    httpclient-4.1.1 \
+    httpcore-4.1 \
+    httpmime-4.1.1 \
+    junit \
+    sdkmanager \
+    sdklib
+
+include $(BUILD_HOST_JAVA_LIBRARY)
+
diff --git a/sdkmanager/app/etc/Android.mk b/sdkmanager/app/etc/Android.mk
index 96ec4df..8e3786e 100644
--- a/sdkmanager/app/etc/Android.mk
+++ b/sdkmanager/app/etc/Android.mk
@@ -4,6 +4,6 @@
 include $(CLEAR_VARS)
 
 LOCAL_PREBUILT_EXECUTABLES := android
-LOCAL_MODULE_TAGS := debug
+LOCAL_MODULE_TAGS := optional
 include $(BUILD_HOST_PREBUILT)
 
diff --git a/sdkmanager/app/etc/manifest.txt b/sdkmanager/app/etc/manifest.txt
index 50e1285..44be3b8 100644
--- a/sdkmanager/app/etc/manifest.txt
+++ b/sdkmanager/app/etc/manifest.txt
@@ -1,2 +1,2 @@
 Main-Class: com.android.sdkmanager.Main
-Class-Path: common.jar sdklib.jar sdkuilib.jar swtmenubar.jar org.eclipse.jface_3.6.2.M20110210-1200.jar org.eclipse.equinox.common_3.6.0.v20100503.jar org.eclipse.core.commands_3.6.0.I20100512-1500.jar
+Class-Path: common.jar sdklib.jar sdkuilib.jar swtmenubar.jar org.eclipse.jface_3.6.2.M20110210-1200.jar org.eclipse.equinox.common_3.6.0.v20100503.jar org.eclipse.core.commands_3.6.0.I20100512-1500.jar guava-tools.jar
diff --git a/sdkmanager/app/src/com/android/sdkmanager/Main.java b/sdkmanager/app/src/com/android/sdkmanager/Main.java
deleted file mode 100644
index 8f58612..0000000
--- a/sdkmanager/app/src/com/android/sdkmanager/Main.java
+++ /dev/null
@@ -1,1616 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed 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 com.android.sdkmanager;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.io.FileWrapper;
-import com.android.prefs.AndroidLocation;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.IAndroidTarget.IOptionalLibrary;
-import com.android.sdklib.ISystemImage;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.avd.AvdInfo;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.sdklib.internal.avd.HardwareProperties;
-import com.android.sdklib.internal.avd.HardwareProperties.HardwareProperty;
-import com.android.sdklib.internal.project.ProjectCreator;
-import com.android.sdklib.internal.project.ProjectCreator.OutputLevel;
-import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.sdklib.internal.project.ProjectProperties.PropertyType;
-import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.DownloadCache.Strategy;
-import com.android.sdklib.internal.repository.packages.PlatformToolPackage;
-import com.android.sdklib.internal.repository.packages.ToolPackage;
-import com.android.sdklib.repository.SdkAddonConstants;
-import com.android.sdklib.repository.SdkRepoConstants;
-import com.android.sdkuilib.internal.repository.SdkUpdaterNoWindow;
-import com.android.sdkuilib.internal.widgets.MessageBoxLog;
-import com.android.sdkuilib.repository.AvdManagerWindow;
-import com.android.sdkuilib.repository.AvdManagerWindow.AvdInvocationContext;
-import com.android.sdkuilib.repository.SdkUpdaterWindow;
-import com.android.sdkuilib.repository.SdkUpdaterWindow.SdkInvocationContext;
-import com.android.utils.ILogger;
-import com.android.utils.Pair;
-import com.android.xml.AndroidXPathFactory;
-
-import org.eclipse.swt.widgets.Display;
-import org.xml.sax.InputSource;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathExpressionException;
-
-/**
- * Main class for the 'android' application.
- */
-public class Main {
-
-    /** Java property that defines the location of the sdk/tools directory. */
-    public final static String TOOLSDIR = "com.android.sdkmanager.toolsdir";
-    /** Java property that defines the working directory. On Windows the current working directory
-     *  is actually the tools dir, in which case this is used to get the original CWD. */
-    private final static String WORKDIR = "com.android.sdkmanager.workdir";
-
-    /** Value returned by {@link #resolveTargetName(String)} when the target id does not match. */
-    private final static int INVALID_TARGET_ID = 0;
-
-    private final static String[] BOOLEAN_YES_REPLIES = new String[] { "yes", "y" };
-    private final static String[] BOOLEAN_NO_REPLIES  = new String[] { "no",  "n" };
-
-    /** Path to the SDK folder. This is the parent of {@link #TOOLSDIR}. */
-    private String mOsSdkFolder;
-    /** Logger object. Use this to print normal output, warnings or errors. */
-    private ILogger mSdkLog;
-    /** The SDK manager parses the SDK folder and gives access to the content. */
-    private SdkManager mSdkManager;
-    /** Command-line processor with options specific to SdkManager. */
-    private SdkCommandLine mSdkCommandLine;
-    /** The working directory, either null or set to an existing absolute canonical directory. */
-    private File mWorkDir;
-
-    public static void main(String[] args) {
-        new Main().run(args);
-    }
-
-    /** Used by tests to set the sdk manager. */
-    @VisibleForTesting(visibility=Visibility.PRIVATE)
-    void setSdkManager(SdkManager sdkManager) {
-        mSdkManager = sdkManager;
-    }
-
-    /**
-     * Runs the sdk manager app
-     */
-    private void run(String[] args) {
-        createLogger();
-        init();
-        mSdkCommandLine.parseArgs(args);
-        parseSdk();
-        doAction();
-    }
-
-    /**
-     * Creates the {@link #mSdkLog} object.
-     * This must be done before {@link #init()} as it will be used to report errors.
-     * This logger prints to the attached console.
-     */
-    private void createLogger() {
-        mSdkLog = new ILogger() {
-            @Override
-            public void error(Throwable t, String errorFormat, Object... args) {
-                if (errorFormat != null) {
-                    System.err.printf("Error: " + errorFormat, args);
-                    if (!errorFormat.endsWith("\n")) {
-                        System.err.printf("\n");
-                    }
-                }
-                if (t != null) {
-                    System.err.printf("Error: %s\n", t.getMessage());
-                }
-            }
-
-            @Override
-            public void warning(@NonNull String warningFormat, Object... args) {
-                if (mSdkCommandLine.isVerbose()) {
-                    System.out.printf("Warning: " + warningFormat, args);
-                    if (!warningFormat.endsWith("\n")) {
-                        System.out.printf("\n");
-                    }
-                }
-            }
-
-            @Override
-            public void info(@NonNull String msgFormat, Object... args) {
-                System.out.printf(msgFormat, args);
-            }
-
-            @Override
-            public void verbose(@NonNull String msgFormat, Object... args) {
-                System.out.printf(msgFormat, args);
-            }
-        };
-    }
-
-    /** For testing */
-    public void setLogger(ILogger logger) {
-        mSdkLog = logger;
-    }
-
-    /**
-     * Init the application by making sure the SDK path is available and
-     * doing basic parsing of the SDK.
-     */
-    private void init() {
-        mSdkCommandLine = new SdkCommandLine(mSdkLog);
-
-        // We get passed a property for the tools dir
-        String toolsDirProp = System.getProperty(TOOLSDIR);
-        if (toolsDirProp == null) {
-            // for debugging, it's easier to override using the process environment
-            toolsDirProp = System.getenv(TOOLSDIR);
-        }
-
-        if (toolsDirProp != null) {
-            // got back a level for the SDK folder
-            File tools;
-            if (toolsDirProp.length() > 0) {
-                tools = new File(toolsDirProp);
-                mOsSdkFolder = tools.getParent();
-            } else {
-                try {
-                    tools = new File(".").getCanonicalFile();
-                    mOsSdkFolder = tools.getParent();
-                } catch (IOException e) {
-                    // Will print an error below since mSdkFolder is not defined
-                }
-            }
-        }
-
-        if (mOsSdkFolder == null) {
-            errorAndExit("The tools directory property is not set, please make sure you are executing %1$s",
-                SdkConstants.androidCmdName());
-        }
-
-        // We might get passed a property for the working directory
-        // Either it is a valid directory and mWorkDir is set to it's absolute canonical value
-        // or mWorkDir remains null.
-        String workDirProp = System.getProperty(WORKDIR);
-        if (workDirProp == null) {
-            workDirProp = System.getenv(WORKDIR);
-        }
-        if (workDirProp != null) {
-            // This should be a valid directory
-            mWorkDir = new File(workDirProp);
-            try {
-                mWorkDir = mWorkDir.getCanonicalFile().getAbsoluteFile();
-            } catch (IOException e) {
-                mWorkDir = null;
-            }
-            if (mWorkDir == null || !mWorkDir.isDirectory()) {
-                errorAndExit("The working directory does not seem to be valid: '%1$s", workDirProp);
-            }
-        }
-    }
-
-    /**
-     * Does the basic SDK parsing required for all actions
-     */
-    private void parseSdk() {
-        mSdkManager = SdkManager.createManager(mOsSdkFolder, mSdkLog);
-
-        if (mSdkManager == null) {
-            errorAndExit("Unable to parse SDK content.");
-        }
-    }
-
-    /**
-     * Actually do an action...
-     */
-    private void doAction() {
-
-        if (mSdkCommandLine.hasClearCache()) {
-            DownloadCache d = new DownloadCache(Strategy.SERVE_CACHE);
-            d.clearCache();
-            mSdkLog.info("SDK Manager repository: manifest cache cleared.\n");
-        }
-
-        String verb = mSdkCommandLine.getVerb();
-        String directObject = mSdkCommandLine.getDirectObject();
-
-        if (SdkCommandLine.VERB_LIST.equals(verb)) {
-            // list action.
-            if (SdkCommandLine.OBJECT_TARGET.equals(directObject)) {
-                displayTargetList();
-
-            } else if (SdkCommandLine.OBJECT_AVD.equals(directObject)) {
-                displayAvdList();
-
-            } else if (SdkCommandLine.OBJECT_SDK.equals(directObject)) {
-                displayRemoteSdkListNoUI();
-
-            } else {
-                displayTargetList();
-                displayAvdList();
-            }
-
-        } else if (SdkCommandLine.VERB_CREATE.equals(verb)) {
-            if (SdkCommandLine.OBJECT_AVD.equals(directObject)) {
-                createAvd();
-
-            } else if (SdkCommandLine.OBJECT_PROJECT.equals(directObject)) {
-                createProject(false /*library*/);
-
-            } else if (SdkCommandLine.OBJECT_TEST_PROJECT.equals(directObject)) {
-                createTestProject();
-
-            } else if (SdkCommandLine.OBJECT_LIB_PROJECT.equals(directObject)) {
-                createProject(true /*library*/);
-
-            } else if (SdkCommandLine.OBJECT_UITEST_PROJECT.equals(directObject)) {
-                createUiTestProject();
-
-            }
-        } else if (SdkCommandLine.VERB_UPDATE.equals(verb)) {
-            if (SdkCommandLine.OBJECT_AVD.equals(directObject)) {
-                updateAvd();
-
-            } else if (SdkCommandLine.OBJECT_PROJECT.equals(directObject)) {
-                updateProject(false /*library*/);
-
-            } else if (SdkCommandLine.OBJECT_TEST_PROJECT.equals(directObject)) {
-                updateTestProject();
-
-            } else if (SdkCommandLine.OBJECT_LIB_PROJECT.equals(directObject)) {
-                updateProject(true /*library*/);
-
-            } else if (SdkCommandLine.OBJECT_SDK.equals(directObject)) {
-                if (mSdkCommandLine.getFlagNoUI(verb)) {
-                    updateSdkNoUI();
-                } else {
-                    showSdkManagerWindow();
-                }
-
-            } else if (SdkCommandLine.OBJECT_ADB.equals(directObject)) {
-                updateAdb();
-
-            }
-        } else if (SdkCommandLine.VERB_SDK.equals(verb)) {
-            showSdkManagerWindow();
-
-        } else if (SdkCommandLine.VERB_AVD.equals(verb)) {
-            showAvdManagerWindow();
-
-        } else if (SdkCommandLine.VERB_DELETE.equals(verb) &&
-                SdkCommandLine.OBJECT_AVD.equals(directObject)) {
-            deleteAvd();
-
-        } else if (SdkCommandLine.VERB_MOVE.equals(verb) &&
-                SdkCommandLine.OBJECT_AVD.equals(directObject)) {
-            moveAvd();
-
-        } else if (verb == null && directObject == null) {
-            showSdkManagerWindow();
-
-        } else {
-            mSdkCommandLine.printHelpAndExit(null);
-        }
-    }
-
-    /**
-     * Display the main SDK Manager app window
-     */
-    private void showSdkManagerWindow() {
-        try {
-            MessageBoxLog errorLogger = new MessageBoxLog(
-                    "SDK Manager",
-                    Display.getCurrent(),
-                    true /*logErrorsOnly*/);
-
-            SdkUpdaterWindow window = new SdkUpdaterWindow(
-                    null /* parentShell */,
-                    errorLogger,
-                    mOsSdkFolder,
-                    SdkInvocationContext.STANDALONE);
-            window.open();
-
-            errorLogger.displayResult(true);
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Display the main AVD Manager app window
-     */
-    private void showAvdManagerWindow() {
-        try {
-            MessageBoxLog errorLogger = new MessageBoxLog(
-                    "AVD Manager",
-                    Display.getCurrent(),
-                    true /*logErrorsOnly*/);
-
-            AvdManagerWindow window = new AvdManagerWindow(
-                    null /* parentShell */,
-                    errorLogger,
-                    mOsSdkFolder,
-                    AvdInvocationContext.STANDALONE);
-
-            window.open();
-
-            errorLogger.displayResult(true);
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    private void displayRemoteSdkListNoUI() {
-        boolean force    = mSdkCommandLine.getFlagForce();
-        boolean useHttp  = mSdkCommandLine.getFlagNoHttps();
-        boolean all      = mSdkCommandLine.getFlagAll();
-        boolean extended = mSdkCommandLine.getFlagExtended();
-        String proxyHost = mSdkCommandLine.getParamProxyHost();
-        String proxyPort = mSdkCommandLine.getParamProxyPort();
-
-        boolean obsolete = mSdkCommandLine.getFlagObsolete();
-        all |= obsolete;
-
-        SdkUpdaterNoWindow upd = new SdkUpdaterNoWindow(
-                mOsSdkFolder,
-                mSdkManager,
-                mSdkLog,
-                force,
-                useHttp,
-                proxyHost,
-                proxyPort);
-        upd.listRemotePackages(all, extended);
-
-        if (obsolete) {
-            mSdkLog.info("Note: Flag --obsolete is deprecated and will be removed in the next version.\n      Please use --all instead.\n");
-        }
-    }
-
-    /**
-     * Updates the whole SDK without any UI, just using console output.
-     */
-    private void updateSdkNoUI() {
-        boolean force    = mSdkCommandLine.getFlagForce();
-        boolean useHttp  = mSdkCommandLine.getFlagNoHttps();
-        boolean dryMode  = mSdkCommandLine.getFlagDryMode();
-        boolean all      = mSdkCommandLine.getFlagAll();
-        String proxyHost = mSdkCommandLine.getParamProxyHost();
-        String proxyPort = mSdkCommandLine.getParamProxyPort();
-
-        boolean obsolete = mSdkCommandLine.getFlagObsolete();
-        all |= obsolete;
-
-        // Check filter types.
-        Pair<String, ArrayList<String>> filterResult =
-            checkFilterValues(mSdkCommandLine.getParamFilter());
-        if (filterResult.getFirst() != null) {
-            // We got an error.
-            errorAndExit(filterResult.getFirst());
-        }
-
-        SdkUpdaterNoWindow upd = new SdkUpdaterNoWindow(
-                mOsSdkFolder,
-                mSdkManager,
-                mSdkLog,
-                force,
-                useHttp,
-                proxyHost,
-                proxyPort);
-        upd.updateAll(filterResult.getSecond(), all, dryMode);
-
-        if (obsolete) {
-            mSdkLog.info("Note: Flag --obsolete is deprecated and will be removed in the next version.\n      Please use --all instead.\n");
-        }
-    }
-
-    /**
-     * Checks the values from the filter parameter and returns a tuple
-     * (error , accepted values). Either error is null and accepted values is not,
-     * or the reverse.
-     * <p/>
-     * Note that this is a quick sanity check of the --filter parameter *before* we
-     * start loading the remote repository sources. Loading the remotes takes a while
-     * so it's worth doing a quick sanity check before hand.
-     *
-     * @param filter A comma-separated list of keywords
-     * @return A pair <error string, usable values>, only one must be null and the other non-null.
-     */
-    @VisibleForTesting(visibility=Visibility.PRIVATE)
-    Pair<String, ArrayList<String>> checkFilterValues(String filter) {
-        ArrayList<String> pkgFilter = new ArrayList<String>();
-
-        if (filter != null && filter.length() > 0) {
-            // Available types
-            Set<String> filterTypes = new TreeSet<String>();
-            filterTypes.addAll(Arrays.asList(SdkRepoConstants.NODES));
-            filterTypes.addAll(Arrays.asList(SdkAddonConstants.NODES));
-
-            for (String t : filter.split(",")) {    //$NON-NLS-1$
-                if (t == null) {
-                    continue;
-                }
-                t = t.trim();
-                if (t.length() <= 0) {
-                    continue;
-                }
-
-                if (t.indexOf('-') > 0 ||
-                        t.equals(ToolPackage.INSTALL_ID) ||
-                        t.equals(PlatformToolPackage.INSTALL_ID)) {
-                    // Heuristic: if the filter name contains a dash, it is probably
-                    // a variable package install id. Since we haven't loaded the remote
-                    // repositories we can't validate it yet, so just accept it.
-                    pkgFilter.add(t);
-                    continue;
-                }
-
-                if (t.replaceAll("[0-9]+", "").length() == 0) { //$NON-NLS-1$ //$NON-NLS-2$
-                    // If the filter argument *only* contains digits, accept it.
-                    // It's probably an index for the remote repository list,
-                    // which we can't validate yet.
-                    pkgFilter.add(t);
-                    continue;
-                }
-
-                if (filterTypes.contains(t)) {
-                    pkgFilter.add(t);
-                    continue;
-                }
-
-                return Pair.of(
-                    String.format(
-                       "Unknown package filter type '%1$s'.\nAccepted values are: %2$s",
-                       t,
-                       Arrays.toString(filterTypes.toArray())),
-                    null);
-            }
-        }
-
-        return Pair.of(null, pkgFilter);
-    }
-
-    /**
-     * Returns a configured {@link ProjectCreator} instance.
-     */
-    private ProjectCreator getProjectCreator() {
-        ProjectCreator creator = new ProjectCreator(mSdkManager, mOsSdkFolder,
-                mSdkCommandLine.isVerbose() ? OutputLevel.VERBOSE :
-                    mSdkCommandLine.isSilent() ? OutputLevel.SILENT :
-                        OutputLevel.NORMAL,
-                mSdkLog);
-        return creator;
-    }
-
-
-    /**
-     * Creates a new Android project based on command-line parameters
-     */
-    private void createProject(boolean library) {
-        String directObject = library? SdkCommandLine.OBJECT_LIB_PROJECT :
-                SdkCommandLine.OBJECT_PROJECT;
-
-        // get the target and try to resolve it.
-        int targetId = resolveTargetName(mSdkCommandLine.getParamTargetId());
-        IAndroidTarget[] targets = mSdkManager.getTargets();
-        if (targetId == INVALID_TARGET_ID || targetId > targets.length) {
-            errorAndExit("Target id is not valid. Use '%s list targets' to get the target ids.",
-                    SdkConstants.androidCmdName());
-        }
-        IAndroidTarget target = targets[targetId - 1];  // target id is 1-based
-
-        ProjectCreator creator = getProjectCreator();
-
-        String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath());
-
-        String projectName = mSdkCommandLine.getParamName();
-        String packageName = mSdkCommandLine.getParamProjectPackage(directObject);
-        String activityName = null;
-        if (library == false) {
-            activityName = mSdkCommandLine.getParamProjectActivity();
-        }
-
-        if (projectName != null &&
-                !ProjectCreator.RE_PROJECT_NAME.matcher(projectName).matches()) {
-            errorAndExit(
-                "Project name '%1$s' contains invalid characters.\nAllowed characters are: %2$s",
-                projectName, ProjectCreator.CHARS_PROJECT_NAME);
-            return;
-        }
-
-        if (activityName != null &&
-                !ProjectCreator.RE_ACTIVITY_NAME.matcher(activityName).matches()) {
-            errorAndExit(
-                "Activity name '%1$s' contains invalid characters.\nAllowed characters are: %2$s",
-                activityName, ProjectCreator.CHARS_ACTIVITY_NAME);
-            return;
-        }
-
-        if (packageName != null &&
-                !ProjectCreator.RE_PACKAGE_NAME.matcher(packageName).matches()) {
-            errorAndExit(
-                "Package name '%1$s' contains invalid characters.\n" +
-                "A package name must be constitued of two Java identifiers.\n" +
-                "Each identifier allowed characters are: %2$s",
-                packageName, ProjectCreator.CHARS_PACKAGE_NAME);
-            return;
-        }
-
-        creator.createProject(projectDir,
-                projectName,
-                packageName,
-                activityName,
-                target,
-                library,
-                null /*pathToMain*/);
-    }
-
-    /**
-     * Creates a new Android test project based on command-line parameters
-     */
-    private void createTestProject() {
-
-        String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath());
-
-        // first check the path of the parent project, and make sure it's valid.
-        String pathToMainProject = mSdkCommandLine.getParamTestProjectMain();
-
-        File parentProject = new File(pathToMainProject);
-        if (parentProject.isAbsolute() == false) {
-            // if the path is not absolute, we need to resolve it based on the
-            // destination path of the project
-            try {
-                parentProject = new File(projectDir, pathToMainProject).getCanonicalFile();
-            } catch (IOException e) {
-                errorAndExit("Unable to resolve Main project's directory: %1$s",
-                        pathToMainProject);
-                return; // help Eclipse static analyzer understand we'll never execute the rest.
-            }
-        }
-
-        if (parentProject.isDirectory() == false) {
-            errorAndExit("Main project's directory does not exist: %1$s",
-                    pathToMainProject);
-            return;
-        }
-
-        // now look for a manifest in there
-        File manifest = new File(parentProject, SdkConstants.FN_ANDROID_MANIFEST_XML);
-        if (manifest.isFile() == false) {
-            errorAndExit("No AndroidManifest.xml file found in the main project directory: %1$s",
-                    parentProject.getAbsolutePath());
-            return;
-        }
-
-        // now query the manifest for the package file.
-        XPath xpath = AndroidXPathFactory.newXPath();
-        String packageName, activityName;
-
-        try {
-            packageName = xpath.evaluate("/manifest/@package",
-                    new InputSource(new FileInputStream(manifest)));
-
-            mSdkLog.info("Found main project package: %1$s\n", packageName);
-
-            // now get the name of the first activity we find
-            activityName = xpath.evaluate("/manifest/application/activity[1]/@android:name",
-                    new InputSource(new FileInputStream(manifest)));
-            // xpath will return empty string when there's no match
-            if (activityName == null || activityName.length() == 0) {
-                activityName = null;
-            } else {
-                mSdkLog.info("Found main project activity: %1$s\n", activityName);
-            }
-        } catch (FileNotFoundException e) {
-            // this shouldn't happen as we test it above.
-            errorAndExit("No AndroidManifest.xml file found in main project.");
-            return; // this is not strictly needed because errorAndExit will stop the execution,
-            // but this makes the java compiler happy, wrt to uninitialized variables.
-        } catch (XPathExpressionException e) {
-            // looks like the main manifest is not valid.
-            errorAndExit("Unable to parse main project manifest to get information.");
-            return; // this is not strictly needed because errorAndExit will stop the execution,
-                    // but this makes the java compiler happy, wrt to uninitialized variables.
-        }
-
-        // now get the target hash
-        ProjectProperties p = ProjectProperties.load(parentProject.getAbsolutePath(),
-                PropertyType.PROJECT);
-        if (p == null) {
-            errorAndExit("Unable to load the main project's %1$s",
-                    PropertyType.PROJECT.getFilename());
-            return;
-        }
-
-        String targetHash = p.getProperty(ProjectProperties.PROPERTY_TARGET);
-        if (targetHash == null) {
-            errorAndExit("Couldn't find the main project target");
-            return;
-        }
-
-        // and resolve it.
-        IAndroidTarget target = mSdkManager.getTargetFromHashString(targetHash);
-        if (target == null) {
-            errorAndExit(
-                    "Unable to resolve main project target '%1$s'. You may want to install the platform in your SDK.",
-                    targetHash);
-            return;
-        }
-
-        mSdkLog.info("Found main project target: %1$s\n", target.getFullName());
-
-        ProjectCreator creator = getProjectCreator();
-
-        String projectName = mSdkCommandLine.getParamName();
-
-        if (projectName != null &&
-                !ProjectCreator.RE_PROJECT_NAME.matcher(projectName).matches()) {
-            errorAndExit(
-                "Project name '%1$s' contains invalid characters.\nAllowed characters are: %2$s",
-                projectName, ProjectCreator.CHARS_PROJECT_NAME);
-            return;
-        }
-
-        creator.createProject(projectDir,
-                projectName,
-                packageName,
-                activityName,
-                target,
-                false /* library*/,
-                pathToMainProject);
-    }
-
-    /**
-     * Creates a new Android UI test project based on command-line parameters
-     */
-    private void createUiTestProject() {
-
-        String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath());
-
-        // get the target and try to resolve it.
-        int targetId = resolveTargetName(mSdkCommandLine.getParamTargetId());
-        IAndroidTarget[] targets = mSdkManager.getTargets();
-        if (targetId == INVALID_TARGET_ID || targetId > targets.length) {
-            errorAndExit("Target id is not valid. Use '%s list targets' to get the target ids.",
-                    SdkConstants.androidCmdName());
-        }
-        IAndroidTarget target = targets[targetId - 1];  // target id is 1-based
-
-        if (target.getVersion().getApiLevel() < 16) {
-            errorAndExit("UI test projects can only target API 16 and above");
-        }
-
-        // get the project name
-        String projectName = mSdkCommandLine.getParamName();
-        // if none, use the folder name.
-        if (projectName == null) {
-            File f = new File(projectDir);
-            projectName = f.getName();
-        }
-
-        try {
-            // create src folder
-            File srcFolder = new File(projectDir, SdkConstants.FD_SOURCES);
-            srcFolder.mkdir();
-
-            // create the local.prop file.
-            // location of the SDK goes in localProperty
-            ProjectPropertiesWorkingCopy localProperties = ProjectProperties.create(projectDir,
-                    PropertyType.LOCAL);
-            localProperties.setProperty(ProjectProperties.PROPERTY_SDK, mOsSdkFolder);
-            localProperties.save();
-
-            // target goes in project properties
-            ProjectPropertiesWorkingCopy projectProperties = ProjectProperties.create(projectDir,
-                    PropertyType.PROJECT);
-            projectProperties.setProperty(ProjectProperties.PROPERTY_TARGET, target.hashString());
-            projectProperties.save();
-
-            // copy the build file using the keywords replacement.
-            final Map<String, String> keywords = new HashMap<String, String>();
-            keywords.put(ProjectCreator.PH_PROJECT_NAME, projectName);
-
-            ProjectCreator creator = getProjectCreator();
-
-            creator.installTemplate("uibuild.template",
-                    new File(projectDir, SdkConstants.FN_BUILD_XML),
-                    keywords);
-        } catch (Exception e) {
-            mSdkLog.error(e, null);
-        }
-    }
-
-    /**
-     * Updates an existing Android project based on command-line parameters
-     * @param library whether the project is a library project.
-     */
-    private void updateProject(boolean library) {
-        // get the target and try to resolve it.
-        IAndroidTarget target = null;
-        String targetStr = mSdkCommandLine.getParamTargetId();
-        // For "update project" the target parameter is optional so having null is acceptable.
-        // However if there's a value, it must be valid.
-        if (targetStr != null) {
-            IAndroidTarget[] targets = mSdkManager.getTargets();
-            int targetId = resolveTargetName(targetStr);
-            if (targetId == INVALID_TARGET_ID || targetId > targets.length) {
-                errorAndExit("Target id '%1$s' is not valid. Use '%2$s list targets' to get the target ids.",
-                        targetStr,
-                        SdkConstants.androidCmdName());
-            }
-            target = targets[targetId - 1];  // target id is 1-based
-        }
-
-        ProjectCreator creator = getProjectCreator();
-
-        String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath());
-
-        String libraryPath = library ? null :
-            mSdkCommandLine.getParamProjectLibrary(SdkCommandLine.OBJECT_PROJECT);
-
-        creator.updateProject(projectDir,
-                target,
-                mSdkCommandLine.getParamName(),
-                libraryPath);
-
-        if (library == false) {
-            boolean doSubProjects = mSdkCommandLine.getParamSubProject();
-            boolean couldHaveDone = false;
-
-            // If there are any sub-folders with a manifest, try to update them as projects
-            // too. This will take care of updating any underlying test project even if the
-            // user changed the folder name.
-            File[] files = new File(projectDir).listFiles();
-            if (files != null) {
-                for (File dir : files) {
-                    if (dir.isDirectory() &&
-                            new File(dir, SdkConstants.FN_ANDROID_MANIFEST_XML).isFile()) {
-                        if (doSubProjects) {
-                            creator.updateProject(dir.getPath(),
-                                    target,
-                                    mSdkCommandLine.getParamName(),
-                                    null /*libraryPath*/);
-                        } else {
-                            couldHaveDone = true;
-                        }
-                    }
-                }
-            }
-
-            if (couldHaveDone) {
-                mSdkLog.info(
-                        "It seems that there are sub-projects. If you want to update them\nplease use the --%1$s parameter.\n",
-                        SdkCommandLine.KEY_SUBPROJECTS);
-            }
-        }
-    }
-
-    /**
-     * Updates an existing test project with a new path to the main project.
-     */
-    private void updateTestProject() {
-        ProjectCreator creator = getProjectCreator();
-
-        String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath());
-
-        creator.updateTestProject(projectDir, mSdkCommandLine.getParamTestProjectMain(),
-                mSdkManager);
-    }
-
-    /**
-     * Adjusts the project location to make it absolute & canonical relative to the
-     * working directory, if any.
-     *
-     * @return The project absolute path relative to {@link #mWorkDir} or the original
-     *         newProjectLocation otherwise.
-     */
-    private String getProjectLocation(String newProjectLocation) {
-
-        // If the new project location is absolute, use it as-is
-        File projectDir = new File(newProjectLocation);
-        if (projectDir.isAbsolute()) {
-            return newProjectLocation;
-        }
-
-        // if there's no working directory, just use the project location as-is.
-        if (mWorkDir == null) {
-            return newProjectLocation;
-        }
-
-        // Combine then and get an absolute canonical directory
-        try {
-            projectDir = new File(mWorkDir, newProjectLocation).getCanonicalFile();
-
-            return projectDir.getPath();
-        } catch (IOException e) {
-            errorAndExit("Failed to combine working directory '%1$s' with project location '%2$s': %3$s",
-                    mWorkDir.getPath(),
-                    newProjectLocation,
-                    e.getMessage());
-            return null;
-        }
-    }
-
-    /**
-     * Displays the list of available Targets (Platforms and Add-ons)
-     */
-    @VisibleForTesting(visibility=Visibility.PRIVATE)
-    void displayTargetList() {
-
-        // Compact output, suitable for scripts.
-        if (mSdkCommandLine != null && mSdkCommandLine.getFlagCompact()) {
-            char eol = mSdkCommandLine.getFlagEolNull() ? '\0' : '\n';
-
-            for (IAndroidTarget target : mSdkManager.getTargets()) {
-                mSdkLog.info("%1$s%2$c", target.hashString(), eol);
-            }
-
-            return;
-        }
-
-        mSdkLog.info("Available Android targets:\n");
-
-        int index = 1;
-        for (IAndroidTarget target : mSdkManager.getTargets()) {
-            mSdkLog.info("----------\n");
-            mSdkLog.info("id: %1$d or \"%2$s\"\n", index, target.hashString());
-            mSdkLog.info("     Name: %s\n", target.getName());
-            if (target.isPlatform()) {
-                mSdkLog.info("     Type: Platform\n");
-                mSdkLog.info("     API level: %s\n", target.getVersion().getApiString());
-                mSdkLog.info("     Revision: %d\n", target.getRevision());
-            } else {
-                mSdkLog.info("     Type: Add-On\n");
-                mSdkLog.info("     Vendor: %s\n", target.getVendor());
-                mSdkLog.info("     Revision: %d\n", target.getRevision());
-                if (target.getDescription() != null) {
-                    mSdkLog.info("     Description: %s\n", target.getDescription());
-                }
-                mSdkLog.info("     Based on Android %s (API level %s)\n",
-                        target.getVersionName(), target.getVersion().getApiString());
-
-                // display the optional libraries.
-                IOptionalLibrary[] libraries = target.getOptionalLibraries();
-                if (libraries != null) {
-                    mSdkLog.info("     Libraries:\n");
-                    for (IOptionalLibrary library : libraries) {
-                        mSdkLog.info("      * %1$s (%2$s)\n",
-                                library.getName(), library.getJarName());
-                        mSdkLog.info("          %1$s\n", library.getDescription());
-                    }
-                }
-            }
-
-            // get the target skins & ABIs
-            displaySkinList(target, "     Skins: ");
-            displayAbiList (target, "     ABIs : ");
-
-            if (target.getUsbVendorId() != IAndroidTarget.NO_USB_ID) {
-                mSdkLog.info("     Adds USB support for devices (Vendor: 0x%04X)\n",
-                        target.getUsbVendorId());
-            }
-
-            index++;
-        }
-    }
-
-    /**
-     * Displays the skins valid for the given target.
-     */
-    @VisibleForTesting(visibility=Visibility.PRIVATE)
-    void displaySkinList(IAndroidTarget target, String message) {
-        String[] skins = target.getSkins();
-        String defaultSkin = target.getDefaultSkin();
-        mSdkLog.info(message);
-        if (skins != null) {
-            boolean first = true;
-            for (String skin : skins) {
-                if (first == false) {
-                    mSdkLog.info(", ");
-                } else {
-                    first = false;
-                }
-                mSdkLog.info(skin);
-
-                if (skin.equals(defaultSkin)) {
-                    mSdkLog.info(" (default)");
-                }
-            }
-            mSdkLog.info("\n");
-        } else {
-            mSdkLog.info("no skins.\n");
-        }
-    }
-
-    /**
-     * Displays the ABIs valid for the given target.
-     */
-    @VisibleForTesting(visibility=Visibility.PRIVATE)
-    void displayAbiList(IAndroidTarget target, String message) {
-        ISystemImage[] systemImages = target.getSystemImages();
-        mSdkLog.info(message);
-        if (systemImages.length > 0) {
-            boolean first = true;
-            for (ISystemImage si : systemImages) {
-                if (first == false) {
-                    mSdkLog.info(", ");
-                } else {
-                    first = false;
-                }
-                mSdkLog.info(si.getAbiType());
-            }
-            mSdkLog.info("\n");
-        } else {
-            mSdkLog.info("no ABIs.\n");
-        }
-    }
-
-    /**
-     * Displays the list of available AVDs for the given AvdManager.
-     *
-     * @param avdManager
-     */
-    @VisibleForTesting(visibility=Visibility.PRIVATE)
-    void displayAvdList(AvdManager avdManager) {
-
-        AvdInfo[] avds = avdManager.getValidAvds();
-
-        // Compact output, suitable for scripts.
-        if (mSdkCommandLine != null && mSdkCommandLine.getFlagCompact()) {
-            char eol = mSdkCommandLine.getFlagEolNull() ? '\0' : '\n';
-
-            for (int index = 0 ; index < avds.length ; index++) {
-                AvdInfo info = avds[index];
-                mSdkLog.info("%1$s%2$c", info.getName(), eol);
-            }
-
-            return;
-        }
-
-        mSdkLog.info("Available Android Virtual Devices:\n");
-
-        for (int index = 0 ; index < avds.length ; index++) {
-            AvdInfo info = avds[index];
-            if (index > 0) {
-                mSdkLog.info("---------\n");
-            }
-            mSdkLog.info("    Name: %s\n", info.getName());
-            mSdkLog.info("    Path: %s\n", info.getDataFolderPath());
-
-            // get the target of the AVD
-            IAndroidTarget target = info.getTarget();
-            if (target.isPlatform()) {
-                mSdkLog.info("  Target: %s (API level %s)\n", target.getName(),
-                        target.getVersion().getApiString());
-            } else {
-                mSdkLog.info("  Target: %s (%s)\n", target.getName(), target
-                        .getVendor());
-                mSdkLog.info("          Based on Android %s (API level %s)\n",
-                        target.getVersionName(), target.getVersion().getApiString());
-            }
-            mSdkLog.info("     ABI: %s\n", info.getAbiType());
-
-            // display some extra values.
-            Map<String, String> properties = info.getProperties();
-            if (properties != null) {
-                String skin = properties.get(AvdManager.AVD_INI_SKIN_NAME);
-                if (skin != null) {
-                    mSdkLog.info("    Skin: %s\n", skin);
-                }
-                String sdcard = properties.get(AvdManager.AVD_INI_SDCARD_SIZE);
-                if (sdcard == null) {
-                    sdcard = properties.get(AvdManager.AVD_INI_SDCARD_PATH);
-                }
-                if (sdcard != null) {
-                    mSdkLog.info("  Sdcard: %s\n", sdcard);
-                }
-                String snapshot = properties.get(AvdManager.AVD_INI_SNAPSHOT_PRESENT);
-                if (snapshot != null) {
-                    mSdkLog.info("Snapshot: %s\n", snapshot);
-                }
-            }
-        }
-
-        // Are there some unused AVDs?
-        AvdInfo[] badAvds = avdManager.getBrokenAvds();
-
-        if (badAvds.length == 0) {
-            return;
-        }
-
-        mSdkLog.info("\nThe following Android Virtual Devices could not be loaded:\n");
-        boolean needSeparator = false;
-        for (AvdInfo info : badAvds) {
-            if (needSeparator) {
-                mSdkLog.info("---------\n");
-            }
-            mSdkLog.info("    Name: %s\n", info.getName() == null ? "--" : info.getName());
-            mSdkLog.info("    Path: %s\n",
-                    info.getDataFolderPath() == null ? "--" : info.getDataFolderPath());
-
-            String error = info.getErrorMessage();
-            mSdkLog.info("   Error: %s\n", error == null ? "Uknown error" : error);
-            needSeparator = true;
-        }
-    }
-
-    /**
-     * Displays the list of available AVDs.
-     */
-    private void displayAvdList() {
-        try {
-            AvdManager avdManager = AvdManager.getInstance(mSdkManager, mSdkLog);
-            displayAvdList(avdManager);
-        } catch (AndroidLocationException e) {
-            errorAndExit(e.getMessage());
-        }
-    }
-
-    /**
-     * Creates a new AVD. This is a text based creation with command line prompt.
-     */
-    private void createAvd() {
-        // find a matching target
-        int targetId = resolveTargetName(mSdkCommandLine.getParamTargetId());
-        IAndroidTarget[] targets = mSdkManager.getTargets();
-
-        if (targetId == INVALID_TARGET_ID || targetId > targets.length) {
-            errorAndExit("Target id is not valid. Use '%s list targets' to get the target ids.",
-                    SdkConstants.androidCmdName());
-        }
-
-        IAndroidTarget target = targets[targetId-1]; // target id is 1-based
-
-        try {
-            boolean removePrevious = mSdkCommandLine.getFlagForce();
-            AvdManager avdManager = AvdManager.getInstance(mSdkManager, mSdkLog);
-
-            String avdName = mSdkCommandLine.getParamName();
-
-            if (!AvdManager.RE_AVD_NAME.matcher(avdName).matches()) {
-                errorAndExit(
-                    "AVD name '%1$s' contains invalid characters.\nAllowed characters are: %2$s",
-                    avdName, AvdManager.CHARS_AVD_NAME);
-                return;
-            }
-
-            AvdInfo info = avdManager.getAvd(avdName, false /*validAvdOnly*/);
-            if (info != null) {
-                if (removePrevious) {
-                    mSdkLog.warning(
-                            "Android Virtual Device '%s' already exists and will be replaced.",
-                            avdName);
-                } else {
-                    errorAndExit("Android Virtual Device '%s' already exists.\n" +
-                                 "Use --force if you want to replace it.",
-                                 avdName);
-                    return;
-                }
-            }
-
-            String paramFolderPath = mSdkCommandLine.getParamLocationPath();
-            File avdFolder = null;
-            if (paramFolderPath != null) {
-                avdFolder = new File(paramFolderPath);
-            } else {
-                avdFolder = AvdInfo.getDefaultAvdFolder(avdManager, avdName);
-            }
-
-            // Validate skin is either default (empty) or NNNxMMM or a valid skin name.
-            Map<String, String> skinHardwareConfig = null;
-            String skin = mSdkCommandLine.getParamSkin();
-            if (skin != null && skin.length() == 0) {
-                skin = null;
-            }
-
-            if (skin != null && target != null) {
-                boolean valid = false;
-                // Is it a know skin name for this target?
-                for (String s : target.getSkins()) {
-                    if (skin.equalsIgnoreCase(s)) {
-                        skin = s;  // Make skin names case-insensitive.
-                        valid = true;
-
-                        // get the hardware properties for this skin
-                        File skinFolder = avdManager.getSkinPath(skin, target);
-                        FileWrapper skinHardwareFile = new FileWrapper(skinFolder,
-                                AvdManager.HARDWARE_INI);
-                        if (skinHardwareFile.isFile()) {
-                            skinHardwareConfig = ProjectProperties.parsePropertyFile(
-                                    skinHardwareFile, mSdkLog);
-                        }
-                        break;
-                    }
-                }
-
-                // Is it NNNxMMM?
-                if (!valid) {
-                    valid = AvdManager.NUMERIC_SKIN_SIZE.matcher(skin).matches();
-                }
-
-                if (!valid) {
-                    displaySkinList(target, "Valid skins: ");
-                    errorAndExit("'%s' is not a valid skin name or size (NNNxMMM)", skin);
-                    return;
-                }
-            }
-
-            String abiType = mSdkCommandLine.getParamAbi();
-            if (target != null && (abiType == null || abiType.length() == 0)) {
-                ISystemImage[] systemImages = target.getSystemImages();
-                if (systemImages != null && systemImages.length == 1) {
-                    // Auto-select the single ABI available
-                    abiType = systemImages[0].getAbiType();
-                    mSdkLog.info("Auto-selecting single ABI %1$s\n", abiType);
-                } else {
-                    displayAbiList(target, "Valid ABIs: ");
-                    errorAndExit("This platform has more than one ABI. Please specify one using --%1$s.",
-                            SdkCommandLine.KEY_ABI);
-                }
-            }
-
-            Map<String, String> hardwareConfig = null;
-            if (target != null && target.isPlatform()) {
-                try {
-                    hardwareConfig = promptForHardware(target, skinHardwareConfig);
-                } catch (IOException e) {
-                    errorAndExit(e.getMessage());
-                }
-            }
-
-            @SuppressWarnings("unused") // oldAvdInfo is never read, yet useful for debugging
-            AvdInfo oldAvdInfo = null;
-            if (removePrevious) {
-                oldAvdInfo = avdManager.getAvd(avdName, false /*validAvdOnly*/);
-            }
-
-            @SuppressWarnings("unused") // newAvdInfo is never read, yet useful for debugging
-            AvdInfo newAvdInfo = avdManager.createAvd(avdFolder,
-                    avdName,
-                    target,
-                    abiType,
-                    skin,
-                    mSdkCommandLine.getParamSdCard(),
-                    hardwareConfig,
-                    mSdkCommandLine.getFlagSnapshot(),
-                    removePrevious,
-                    false, //edit existing
-                    mSdkLog);
-
-        } catch (AndroidLocationException e) {
-            errorAndExit(e.getMessage());
-        }
-    }
-
-    /**
-     * Delete an AVD. If the AVD name is not part of the available ones look for an
-     * invalid AVD (one not loaded due to some error) to remove it too.
-     */
-    private void deleteAvd() {
-        try {
-            String avdName = mSdkCommandLine.getParamName();
-            AvdManager avdManager = AvdManager.getInstance(mSdkManager, mSdkLog);
-            AvdInfo info = avdManager.getAvd(avdName, false /*validAvdOnly*/);
-
-            if (info == null) {
-                errorAndExit("There is no Android Virtual Device named '%s'.", avdName);
-                return;
-            }
-
-            avdManager.deleteAvd(info, mSdkLog);
-        } catch (AndroidLocationException e) {
-            errorAndExit(e.getMessage());
-        }
-    }
-
-    /**
-     * Moves an AVD.
-     */
-    private void moveAvd() {
-        try {
-            String avdName = mSdkCommandLine.getParamName();
-            AvdManager avdManager = AvdManager.getInstance(mSdkManager, mSdkLog);
-            AvdInfo info = avdManager.getAvd(avdName, true /*validAvdOnly*/);
-
-            if (info == null) {
-                errorAndExit("There is no valid Android Virtual Device named '%s'.", avdName);
-                return;
-            }
-
-            // This is a rename if there's a new name for the AVD
-            String newName = mSdkCommandLine.getParamMoveNewName();
-            if (newName != null && newName.equals(info.getName())) {
-                // same name, not actually a rename operation
-                newName = null;
-            }
-
-            // This is a move (of the data files) if there's a new location path
-            String paramFolderPath = mSdkCommandLine.getParamLocationPath();
-            if (paramFolderPath != null) {
-                // check if paths are the same. Use File methods to account for OS idiosyncrasies.
-                try {
-                    File f1 = new File(paramFolderPath).getCanonicalFile();
-                    File f2 = new File(info.getDataFolderPath()).getCanonicalFile();
-                    if (f1.equals(f2)) {
-                        // same canonical path, so not actually a move
-                        paramFolderPath = null;
-                    }
-                } catch (IOException e) {
-                    // Fail to resolve canonical path. Fail now since a move operation might fail
-                    // later and be harder to recover from.
-                    errorAndExit(e.getMessage());
-                    return;
-                }
-            }
-
-            if (newName == null && paramFolderPath == null) {
-                mSdkLog.warning("Move operation aborted: same AVD name, same canonical data path");
-                return;
-            }
-
-            // If a rename was requested and no data move was requested, check if the original
-            // data path is our default constructed from the AVD name. In this case we still want
-            // to rename that folder too.
-            if (newName != null && paramFolderPath == null) {
-                // Compute the original data path
-                File originalFolder = new File(
-                        AndroidLocation.getFolder() + AndroidLocation.FOLDER_AVD,
-                        info.getName() + AvdManager.AVD_FOLDER_EXTENSION);
-                if (info.getDataFolderPath() != null &&
-                        originalFolder.equals(new File(info.getDataFolderPath()))) {
-                    try {
-                        // The AVD is using the default data folder path based on the AVD name.
-                        // That folder needs to be adjusted to use the new name.
-                        File f = new File(AndroidLocation.getFolder() + AndroidLocation.FOLDER_AVD,
-                                     newName + AvdManager.AVD_FOLDER_EXTENSION);
-                        paramFolderPath = f.getCanonicalPath();
-                    } catch (IOException e) {
-                        // Fail to resolve canonical path. Fail now rather than later.
-                        errorAndExit(e.getMessage());
-                    }
-                }
-            }
-
-            // Check for conflicts
-            if (newName != null) {
-                if (avdManager.getAvd(newName, false /*validAvdOnly*/) != null) {
-                    errorAndExit("There is already an AVD named '%s'.", newName);
-                    return;
-                }
-
-                File ini = info.getIniFile();
-                if (ini.equals(AvdInfo.getDefaultIniFile(avdManager, newName))) {
-                    errorAndExit("The AVD file '%s' is in the way.", ini.getCanonicalPath());
-                    return;
-                }
-            }
-
-            if (paramFolderPath != null && new File(paramFolderPath).exists()) {
-                errorAndExit(
-                        "There is already a file or directory at '%s'.\nUse --path to specify a different data folder.",
-                        paramFolderPath);
-            }
-
-            avdManager.moveAvd(info, newName, paramFolderPath, mSdkLog);
-        } catch (AndroidLocationException e) {
-            errorAndExit(e.getMessage());
-        } catch (IOException e) {
-            errorAndExit(e.getMessage());
-        }
-    }
-
-    /**
-     * Updates a broken AVD.
-     */
-    private void updateAvd() {
-        try {
-            String avdName = mSdkCommandLine.getParamName();
-            AvdManager avdManager = AvdManager.getInstance(mSdkManager, mSdkLog);
-            avdManager.updateAvd(avdName, mSdkLog);
-        } catch (AndroidLocationException e) {
-            errorAndExit(e.getMessage());
-        } catch (IOException e) {
-            errorAndExit(e.getMessage());
-        }
-    }
-
-    /**
-     * Updates adb with the USB devices declared in the SDK add-ons.
-     */
-    private void updateAdb() {
-        try {
-            mSdkManager.updateAdb();
-
-            mSdkLog.info(
-                    "adb has been updated. You must restart adb with the following commands\n" +
-                    "\tadb kill-server\n" +
-                    "\tadb start-server\n");
-        } catch (AndroidLocationException e) {
-            errorAndExit(e.getMessage());
-        } catch (IOException e) {
-            errorAndExit(e.getMessage());
-        }
-    }
-
-
-
-    /**
-     * Prompts the user to setup a hardware config for a Platform-based AVD.
-     * @throws IOException
-     */
-    private Map<String, String> promptForHardware(IAndroidTarget createTarget,
-            Map<String, String> skinHardwareConfig) throws IOException {
-        byte[] readLineBuffer = new byte[256];
-        String result;
-        String defaultAnswer = "no";
-
-        mSdkLog.info("%s is a basic Android platform.\n", createTarget.getName());
-        mSdkLog.info("Do you wish to create a custom hardware profile [%s]",
-                defaultAnswer);
-
-        result = readLine(readLineBuffer).trim();
-        // handle default:
-        if (result.length() == 0) {
-            result = defaultAnswer;
-        }
-
-        if (getBooleanReply(result) == false) {
-            // no custom config, return the skin hardware config in case there is one.
-            return skinHardwareConfig;
-        }
-
-        mSdkLog.info("\n"); // empty line
-
-        // get the list of possible hardware properties
-        File hardwareDefs = new File (mOsSdkFolder + File.separator +
-                SdkConstants.OS_SDK_TOOLS_LIB_FOLDER, SdkConstants.FN_HARDWARE_INI);
-        Map<String, HardwareProperty> hwMap = HardwareProperties.parseHardwareDefinitions(
-                hardwareDefs, null /*sdkLog*/);
-
-        HashMap<String, String> map = new HashMap<String, String>();
-
-        // we just want to loop on the HardwareProperties
-        HardwareProperty[] hwProperties = hwMap.values().toArray(
-                new HardwareProperty[hwMap.size()]);
-        for (int i = 0 ; i < hwProperties.length ;) {
-            HardwareProperty property = hwProperties[i];
-
-            String description = property.getDescription();
-            if (description != null) {
-                mSdkLog.info("%s: %s\n", property.getAbstract(), description);
-            } else {
-                mSdkLog.info("%s\n", property.getAbstract());
-            }
-
-            String defaultValue = property.getDefault();
-            String defaultFromSkin = skinHardwareConfig != null ? skinHardwareConfig.get(
-                    property.getName()) : null;
-
-            if (defaultFromSkin != null) {
-                mSdkLog.info("%s [%s (from skin)]:", property.getName(), defaultFromSkin);
-            } else if (defaultValue != null) {
-                mSdkLog.info("%s [%s]:", property.getName(), defaultValue);
-            } else {
-                mSdkLog.info("%s (%s):", property.getName(), property.getType());
-            }
-
-            result = readLine(readLineBuffer);
-            if (result.length() == 0) {
-                if (defaultFromSkin != null || defaultValue != null) {
-                    if (defaultFromSkin != null) {
-                        // we need to write this one in the AVD file
-                        map.put(property.getName(), defaultFromSkin);
-                    }
-
-                    mSdkLog.info("\n"); // empty line
-                    i++; // go to the next property if we have a valid default value.
-                         // if there's no default, we'll redo this property
-                }
-                continue;
-            }
-
-            switch (property.getType()) {
-                case BOOLEAN:
-                    try {
-                        if (getBooleanReply(result)) {
-                            map.put(property.getName(), "yes");
-                            i++; // valid reply, move to next property
-                        } else {
-                            map.put(property.getName(), "no");
-                            i++; // valid reply, move to next property
-                        }
-                    } catch (IOException e) {
-                        // display error, and do not increment i to redo this property
-                        mSdkLog.info("\n%s\n", e.getMessage());
-                    }
-                    break;
-                case INTEGER:
-                    try {
-                        Integer.parseInt(result);
-                        map.put(property.getName(), result);
-                        i++; // valid reply, move to next property
-                    } catch (NumberFormatException e) {
-                        // display error, and do not increment i to redo this property
-                        mSdkLog.info("\n%s\n", e.getMessage());
-                    }
-                    break;
-                case DISKSIZE:
-                    // TODO check validity
-                    map.put(property.getName(), result);
-                    i++; // valid reply, move to next property
-                    break;
-            }
-
-            mSdkLog.info("\n"); // empty line
-        }
-
-        return map;
-    }
-
-    /**
-     * Reads a line from the input stream.
-     * @param buffer
-     * @throws IOException
-     */
-    private String readLine(byte[] buffer) throws IOException {
-        int count = System.in.read(buffer);
-
-        // is the input longer than the buffer?
-        if (count == buffer.length && buffer[count-1] != 10) {
-            // create a new temp buffer
-            byte[] tempBuffer = new byte[256];
-
-            // and read the rest
-            String secondHalf = readLine(tempBuffer);
-
-            // return a concat of both
-            return new String(buffer, 0, count) + secondHalf;
-        }
-
-        // ignore end whitespace
-        while (count > 0 && (buffer[count-1] == '\r' || buffer[count-1] == '\n')) {
-            count--;
-        }
-
-        return new String(buffer, 0, count);
-    }
-
-    /**
-     * Reads a line from the input stream, masking it as much as possible.
-     */
-    private String promptPassword(String prompt) throws IOException {
-
-        // Setup a thread that tries to overwrite any input by
-        // masking the last character with a space. This is quite
-        // crude but is a documented workaround to the lack of a
-        // proper password getter.
-        final AtomicBoolean keepErasing = new AtomicBoolean(true);
-
-        Thread eraser = new Thread(new Runnable() {
-            @Override
-            public void run() {
-                while (keepErasing.get()) {
-                    System.err.print("\b ");    //$NON-NLS-1$. \b=Backspace
-                    try {
-                        Thread.sleep(10 /*millis*/);
-                    } catch (InterruptedException e) {
-                        // Ignore
-                    }
-                }
-            }
-        }, "eraser");                           //$NON-NLS-1$
-
-        try {
-            System.err.print(prompt);
-            eraser.start();
-            byte[] buffer = new byte[256];
-            return readLine(buffer);
-        } finally {
-            keepErasing.set(false);
-            try {
-                eraser.join();
-            } catch (InterruptedException e) {
-                // Ignore
-            }
-        }
-    }
-
-    /**
-     * Returns the boolean value represented by the string.
-     * @throws IOException If the value is not a boolean string.
-     */
-    private boolean getBooleanReply(String reply) throws IOException {
-
-        for (String valid : BOOLEAN_YES_REPLIES) {
-            if (valid.equalsIgnoreCase(reply)) {
-                return true;
-            }
-        }
-
-        for (String valid : BOOLEAN_NO_REPLIES) {
-            if (valid.equalsIgnoreCase(reply)) {
-                return false;
-            }
-        }
-
-        throw new IOException(String.format("%s is not a valid reply", reply));
-    }
-
-    private void errorAndExit(String format, Object...args) {
-        mSdkLog.error(null, format, args);
-        System.exit(1);
-    }
-
-    /**
-     * Converts a symbolic target name (such as those accepted by --target on the command-line)
-     * to an internal target index id. A valid target name is either a numeric target id (> 0)
-     * or a target hash string.
-     * <p/>
-     * If the given target can't be mapped, {@link #INVALID_TARGET_ID} (0) is returned.
-     * It's up to the caller to output an error.
-     * <p/>
-     * On success, returns a value > 0.
-     */
-    private int resolveTargetName(String targetName) {
-
-        if (targetName == null) {
-            return INVALID_TARGET_ID;
-        }
-
-        targetName = targetName.trim();
-
-        // Case of an integer number
-        if (targetName.matches("[0-9]*")) {
-            try {
-                int n = Integer.parseInt(targetName);
-                return n < 1 ? INVALID_TARGET_ID : n;
-            } catch (NumberFormatException e) {
-                // Ignore. Should not happen.
-            }
-        }
-
-        // Let's try to find a platform or addon name.
-        IAndroidTarget[] targets = mSdkManager.getTargets();
-        for (int i = 0; i < targets.length; i++) {
-            if (targetName.equals(targets[i].hashString())) {
-                return i + 1;
-            }
-        }
-
-        return INVALID_TARGET_ID;
-    }
-}
diff --git a/sdkmanager/app/src/main/java/com/android/sdkmanager/Main.java b/sdkmanager/app/src/main/java/com/android/sdkmanager/Main.java
new file mode 100644
index 0000000..0ef18b8
--- /dev/null
+++ b/sdkmanager/app/src/main/java/com/android/sdkmanager/Main.java
@@ -0,0 +1,1617 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed 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 com.android.sdkmanager;
+
+import com.android.SdkConstants;
+import com.android.annotations.NonNull;
+import com.android.annotations.VisibleForTesting;
+import com.android.annotations.VisibleForTesting.Visibility;
+import com.android.io.FileWrapper;
+import com.android.prefs.AndroidLocation;
+import com.android.prefs.AndroidLocation.AndroidLocationException;
+import com.android.sdklib.IAndroidTarget;
+import com.android.sdklib.IAndroidTarget.IOptionalLibrary;
+import com.android.sdklib.ISystemImage;
+import com.android.sdklib.SdkManager;
+import com.android.sdklib.internal.avd.AvdInfo;
+import com.android.sdklib.internal.avd.AvdManager;
+import com.android.sdklib.internal.avd.HardwareProperties;
+import com.android.sdklib.internal.avd.HardwareProperties.HardwareProperty;
+import com.android.sdklib.internal.project.ProjectCreator;
+import com.android.sdklib.internal.project.ProjectCreator.OutputLevel;
+import com.android.sdklib.internal.project.ProjectProperties;
+import com.android.sdklib.internal.project.ProjectProperties.PropertyType;
+import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;
+import com.android.sdklib.internal.repository.DownloadCache;
+import com.android.sdklib.internal.repository.DownloadCache.Strategy;
+import com.android.sdklib.internal.repository.packages.PlatformToolPackage;
+import com.android.sdklib.internal.repository.packages.ToolPackage;
+import com.android.sdklib.internal.repository.updater.SdkUpdaterNoWindow;
+import com.android.sdklib.repository.SdkAddonConstants;
+import com.android.sdklib.repository.SdkRepoConstants;
+import com.android.sdkuilib.internal.widgets.MessageBoxLog;
+import com.android.sdkuilib.repository.AvdManagerWindow;
+import com.android.sdkuilib.repository.AvdManagerWindow.AvdInvocationContext;
+import com.android.sdkuilib.repository.SdkUpdaterWindow;
+import com.android.sdkuilib.repository.SdkUpdaterWindow.SdkInvocationContext;
+import com.android.utils.ILogger;
+import com.android.utils.Pair;
+import com.android.xml.AndroidXPathFactory;
+
+import org.eclipse.swt.widgets.Display;
+import org.xml.sax.InputSource;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathExpressionException;
+
+/**
+ * Main class for the 'android' application.
+ */
+public class Main {
+
+    /** Java property that defines the location of the sdk/tools directory. */
+    public final static String TOOLSDIR = "com.android.sdkmanager.toolsdir";
+    /** Java property that defines the working directory. On Windows the current working directory
+     *  is actually the tools dir, in which case this is used to get the original CWD. */
+    private final static String WORKDIR = "com.android.sdkmanager.workdir";
+
+    /** Value returned by {@link #resolveTargetName(String)} when the target id does not match. */
+    private final static int INVALID_TARGET_ID = 0;
+
+    private final static String[] BOOLEAN_YES_REPLIES = new String[] { "yes", "y" };
+    private final static String[] BOOLEAN_NO_REPLIES  = new String[] { "no",  "n" };
+
+    /** Path to the SDK folder. This is the parent of {@link #TOOLSDIR}. */
+    private String mOsSdkFolder;
+    /** Logger object. Use this to print normal output, warnings or errors. */
+    private ILogger mSdkLog;
+    /** The SDK manager parses the SDK folder and gives access to the content. */
+    private SdkManager mSdkManager;
+    /** Command-line processor with options specific to SdkManager. */
+    private SdkCommandLine mSdkCommandLine;
+    /** The working directory, either null or set to an existing absolute canonical directory. */
+    private File mWorkDir;
+
+    public static void main(String[] args) {
+        new Main().run(args);
+    }
+
+    /** Used by tests to set the sdk manager. */
+    @VisibleForTesting(visibility=Visibility.PRIVATE)
+    void setSdkManager(SdkManager sdkManager) {
+        mSdkManager = sdkManager;
+    }
+
+    /**
+     * Runs the sdk manager app
+     */
+    private void run(String[] args) {
+        createLogger();
+        init();
+        mSdkCommandLine.parseArgs(args);
+        parseSdk();
+        doAction();
+    }
+
+    /**
+     * Creates the {@link #mSdkLog} object.
+     * This must be done before {@link #init()} as it will be used to report errors.
+     * This logger prints to the attached console.
+     */
+    private void createLogger() {
+        mSdkLog = new ILogger() {
+            @Override
+            public void error(Throwable t, String errorFormat, Object... args) {
+                if (errorFormat != null) {
+                    System.err.printf("Error: " + errorFormat, args);
+                    if (!errorFormat.endsWith("\n")) {
+                        System.err.printf("\n");
+                    }
+                }
+                if (t != null) {
+                    System.err.printf("Error: %s\n", t.getMessage());
+                }
+            }
+
+            @Override
+            public void warning(@NonNull String warningFormat, Object... args) {
+                if (mSdkCommandLine.isVerbose()) {
+                    System.out.printf("Warning: " + warningFormat, args);
+                    if (!warningFormat.endsWith("\n")) {
+                        System.out.printf("\n");
+                    }
+                }
+            }
+
+            @Override
+            public void info(@NonNull String msgFormat, Object... args) {
+                System.out.printf(msgFormat, args);
+            }
+
+            @Override
+            public void verbose(@NonNull String msgFormat, Object... args) {
+                System.out.printf(msgFormat, args);
+            }
+        };
+    }
+
+    /** For testing */
+    public void setLogger(ILogger logger) {
+        mSdkLog = logger;
+    }
+
+    /**
+     * Init the application by making sure the SDK path is available and
+     * doing basic parsing of the SDK.
+     */
+    private void init() {
+        mSdkCommandLine = new SdkCommandLine(mSdkLog);
+
+        // We get passed a property for the tools dir
+        String toolsDirProp = System.getProperty(TOOLSDIR);
+        if (toolsDirProp == null) {
+            // for debugging, it's easier to override using the process environment
+            toolsDirProp = System.getenv(TOOLSDIR);
+        }
+
+        if (toolsDirProp != null) {
+            // got back a level for the SDK folder
+            File tools;
+            if (toolsDirProp.length() > 0) {
+                tools = new File(toolsDirProp);
+                mOsSdkFolder = tools.getParent();
+            } else {
+                try {
+                    tools = new File(".").getCanonicalFile();
+                    mOsSdkFolder = tools.getParent();
+                } catch (IOException e) {
+                    // Will print an error below since mSdkFolder is not defined
+                }
+            }
+        }
+
+        if (mOsSdkFolder == null) {
+            errorAndExit("The tools directory property is not set, please make sure you are executing %1$s",
+                SdkConstants.androidCmdName());
+        }
+
+        // We might get passed a property for the working directory
+        // Either it is a valid directory and mWorkDir is set to it's absolute canonical value
+        // or mWorkDir remains null.
+        String workDirProp = System.getProperty(WORKDIR);
+        if (workDirProp == null) {
+            workDirProp = System.getenv(WORKDIR);
+        }
+        if (workDirProp != null) {
+            // This should be a valid directory
+            mWorkDir = new File(workDirProp);
+            try {
+                mWorkDir = mWorkDir.getCanonicalFile().getAbsoluteFile();
+            } catch (IOException e) {
+                mWorkDir = null;
+            }
+            if (mWorkDir == null || !mWorkDir.isDirectory()) {
+                errorAndExit("The working directory does not seem to be valid: '%1$s", workDirProp);
+            }
+        }
+    }
+
+    /**
+     * Does the basic SDK parsing required for all actions
+     */
+    private void parseSdk() {
+        mSdkManager = SdkManager.createManager(mOsSdkFolder, mSdkLog);
+
+        if (mSdkManager == null) {
+            errorAndExit("Unable to parse SDK content.");
+        }
+    }
+
+    /**
+     * Actually do an action...
+     */
+    private void doAction() {
+
+        if (mSdkCommandLine.hasClearCache()) {
+            DownloadCache d = new DownloadCache(Strategy.SERVE_CACHE);
+            d.clearCache();
+            mSdkLog.info("SDK Manager repository: manifest cache cleared.\n");
+        }
+
+        String verb = mSdkCommandLine.getVerb();
+        String directObject = mSdkCommandLine.getDirectObject();
+
+        if (SdkCommandLine.VERB_LIST.equals(verb)) {
+            // list action.
+            if (SdkCommandLine.OBJECT_TARGET.equals(directObject)) {
+                displayTargetList();
+
+            } else if (SdkCommandLine.OBJECT_AVD.equals(directObject)) {
+                displayAvdList();
+
+            } else if (SdkCommandLine.OBJECT_SDK.equals(directObject)) {
+                displayRemoteSdkListNoUI();
+
+            } else {
+                displayTargetList();
+                displayAvdList();
+            }
+
+        } else if (SdkCommandLine.VERB_CREATE.equals(verb)) {
+            if (SdkCommandLine.OBJECT_AVD.equals(directObject)) {
+                createAvd();
+
+            } else if (SdkCommandLine.OBJECT_PROJECT.equals(directObject)) {
+                createProject(false /*library*/);
+
+            } else if (SdkCommandLine.OBJECT_TEST_PROJECT.equals(directObject)) {
+                createTestProject();
+
+            } else if (SdkCommandLine.OBJECT_LIB_PROJECT.equals(directObject)) {
+                createProject(true /*library*/);
+
+            } else if (SdkCommandLine.OBJECT_UITEST_PROJECT.equals(directObject)) {
+                createUiTestProject();
+
+            }
+        } else if (SdkCommandLine.VERB_UPDATE.equals(verb)) {
+            if (SdkCommandLine.OBJECT_AVD.equals(directObject)) {
+                updateAvd();
+
+            } else if (SdkCommandLine.OBJECT_PROJECT.equals(directObject)) {
+                updateProject(false /*library*/);
+
+            } else if (SdkCommandLine.OBJECT_TEST_PROJECT.equals(directObject)) {
+                updateTestProject();
+
+            } else if (SdkCommandLine.OBJECT_LIB_PROJECT.equals(directObject)) {
+                updateProject(true /*library*/);
+
+            } else if (SdkCommandLine.OBJECT_SDK.equals(directObject)) {
+                if (mSdkCommandLine.getFlagNoUI(verb)) {
+                    updateSdkNoUI();
+                } else {
+                    showSdkManagerWindow();
+                }
+
+            } else if (SdkCommandLine.OBJECT_ADB.equals(directObject)) {
+                updateAdb();
+
+            }
+        } else if (SdkCommandLine.VERB_SDK.equals(verb)) {
+            showSdkManagerWindow();
+
+        } else if (SdkCommandLine.VERB_AVD.equals(verb)) {
+            showAvdManagerWindow();
+
+        } else if (SdkCommandLine.VERB_DELETE.equals(verb) &&
+                SdkCommandLine.OBJECT_AVD.equals(directObject)) {
+            deleteAvd();
+
+        } else if (SdkCommandLine.VERB_MOVE.equals(verb) &&
+                SdkCommandLine.OBJECT_AVD.equals(directObject)) {
+            moveAvd();
+
+        } else if (verb == null && directObject == null) {
+            showSdkManagerWindow();
+
+        } else {
+            mSdkCommandLine.printHelpAndExit(null);
+        }
+    }
+
+    /**
+     * Display the main SDK Manager app window
+     */
+    private void showSdkManagerWindow() {
+        try {
+            MessageBoxLog errorLogger = new MessageBoxLog(
+                    "SDK Manager",
+                    Display.getCurrent(),
+                    true /*logErrorsOnly*/);
+
+            SdkUpdaterWindow window = new SdkUpdaterWindow(
+                    null /* parentShell */,
+                    errorLogger,
+                    mOsSdkFolder,
+                    SdkInvocationContext.STANDALONE);
+            window.open();
+
+            errorLogger.displayResult(true);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Display the main AVD Manager app window
+     */
+    private void showAvdManagerWindow() {
+        try {
+            MessageBoxLog errorLogger = new MessageBoxLog(
+                    "AVD Manager",
+                    Display.getCurrent(),
+                    true /*logErrorsOnly*/);
+
+            AvdManagerWindow window = new AvdManagerWindow(
+                    null /* parentShell */,
+                    errorLogger,
+                    mOsSdkFolder,
+                    AvdInvocationContext.STANDALONE);
+
+            window.open();
+
+            errorLogger.displayResult(true);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void displayRemoteSdkListNoUI() {
+        boolean force    = mSdkCommandLine.getFlagForce();
+        boolean useHttp  = mSdkCommandLine.getFlagNoHttps();
+        boolean all      = mSdkCommandLine.getFlagAll();
+        boolean extended = mSdkCommandLine.getFlagExtended();
+        String proxyHost = mSdkCommandLine.getParamProxyHost();
+        String proxyPort = mSdkCommandLine.getParamProxyPort();
+
+        boolean obsolete = mSdkCommandLine.getFlagObsolete();
+        all |= obsolete;
+
+        SdkUpdaterNoWindow upd = new SdkUpdaterNoWindow(
+                mOsSdkFolder,
+                mSdkManager,
+                mSdkLog,
+                force,
+                useHttp,
+                proxyHost,
+                proxyPort);
+        upd.listRemotePackages(all, extended);
+
+        if (obsolete) {
+            mSdkLog.info("Note: Flag --obsolete is deprecated and will be removed in the next version.\n      Please use --all instead.\n");
+        }
+    }
+
+    /**
+     * Updates the whole SDK without any UI, just using console output.
+     */
+    private void updateSdkNoUI() {
+        boolean force    = mSdkCommandLine.getFlagForce();
+        boolean useHttp  = mSdkCommandLine.getFlagNoHttps();
+        boolean dryMode  = mSdkCommandLine.getFlagDryMode();
+        boolean all      = mSdkCommandLine.getFlagAll();
+        String proxyHost = mSdkCommandLine.getParamProxyHost();
+        String proxyPort = mSdkCommandLine.getParamProxyPort();
+
+        boolean obsolete = mSdkCommandLine.getFlagObsolete();
+        all |= obsolete;
+
+        // Check filter types.
+        Pair<String, ArrayList<String>> filterResult =
+            checkFilterValues(mSdkCommandLine.getParamFilter());
+        if (filterResult.getFirst() != null) {
+            // We got an error.
+            errorAndExit(filterResult.getFirst());
+        }
+
+        SdkUpdaterNoWindow upd = new SdkUpdaterNoWindow(
+                mOsSdkFolder,
+                mSdkManager,
+                mSdkLog,
+                force,
+                useHttp,
+                proxyHost,
+                proxyPort);
+        upd.updateAll(filterResult.getSecond(), all, dryMode);
+
+        if (obsolete) {
+            mSdkLog.info("Note: Flag --obsolete is deprecated and will be removed in the next version.\n      Please use --all instead.\n");
+        }
+    }
+
+    /**
+     * Checks the values from the filter parameter and returns a tuple
+     * (error , accepted values). Either error is null and accepted values is not,
+     * or the reverse.
+     * <p/>
+     * Note that this is a quick sanity check of the --filter parameter *before* we
+     * start loading the remote repository sources. Loading the remotes takes a while
+     * so it's worth doing a quick sanity check before hand.
+     *
+     * @param filter A comma-separated list of keywords
+     * @return A pair <error string, usable values>, only one must be null and the other non-null.
+     */
+    @VisibleForTesting(visibility=Visibility.PRIVATE)
+    Pair<String, ArrayList<String>> checkFilterValues(String filter) {
+        ArrayList<String> pkgFilter = new ArrayList<String>();
+
+        if (filter != null && filter.length() > 0) {
+            // Available types
+            Set<String> filterTypes = new TreeSet<String>();
+            filterTypes.addAll(Arrays.asList(SdkRepoConstants.NODES));
+            filterTypes.addAll(Arrays.asList(SdkAddonConstants.NODES));
+
+            for (String t : filter.split(",")) {    //$NON-NLS-1$
+                if (t == null) {
+                    continue;
+                }
+                t = t.trim();
+                if (t.length() <= 0) {
+                    continue;
+                }
+
+                if (t.indexOf('-') > 0 ||
+                        t.equals(ToolPackage.INSTALL_ID) ||
+                        t.equals(PlatformToolPackage.INSTALL_ID)) {
+                    // Heuristic: if the filter name contains a dash, it is probably
+                    // a variable package install id. Since we haven't loaded the remote
+                    // repositories we can't validate it yet, so just accept it.
+                    pkgFilter.add(t);
+                    continue;
+                }
+
+                if (t.replaceAll("[0-9]+", "").length() == 0) { //$NON-NLS-1$ //$NON-NLS-2$
+                    // If the filter argument *only* contains digits, accept it.
+                    // It's probably an index for the remote repository list,
+                    // which we can't validate yet.
+                    pkgFilter.add(t);
+                    continue;
+                }
+
+                if (filterTypes.contains(t)) {
+                    pkgFilter.add(t);
+                    continue;
+                }
+
+                return Pair.of(
+                    String.format(
+                       "Unknown package filter type '%1$s'.\nAccepted values are: %2$s",
+                       t,
+                       Arrays.toString(filterTypes.toArray())),
+                    null);
+            }
+        }
+
+        return Pair.of(null, pkgFilter);
+    }
+
+    /**
+     * Returns a configured {@link ProjectCreator} instance.
+     */
+    private ProjectCreator getProjectCreator() {
+        ProjectCreator creator = new ProjectCreator(mSdkManager, mOsSdkFolder,
+                mSdkCommandLine.isVerbose() ? OutputLevel.VERBOSE :
+                    mSdkCommandLine.isSilent() ? OutputLevel.SILENT :
+                        OutputLevel.NORMAL,
+                mSdkLog);
+        return creator;
+    }
+
+
+    /**
+     * Creates a new Android project based on command-line parameters
+     */
+    private void createProject(boolean library) {
+        String directObject = library? SdkCommandLine.OBJECT_LIB_PROJECT :
+                SdkCommandLine.OBJECT_PROJECT;
+
+        // get the target and try to resolve it.
+        int targetId = resolveTargetName(mSdkCommandLine.getParamTargetId());
+        IAndroidTarget[] targets = mSdkManager.getTargets();
+        if (targetId == INVALID_TARGET_ID || targetId > targets.length) {
+            errorAndExit("Target id is not valid. Use '%s list targets' to get the target ids.",
+                    SdkConstants.androidCmdName());
+        }
+        IAndroidTarget target = targets[targetId - 1];  // target id is 1-based
+
+        ProjectCreator creator = getProjectCreator();
+
+        String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath());
+
+        String projectName = mSdkCommandLine.getParamName();
+        String packageName = mSdkCommandLine.getParamProjectPackage(directObject);
+        String activityName = null;
+        if (library == false) {
+            activityName = mSdkCommandLine.getParamProjectActivity();
+        }
+
+        if (projectName != null &&
+                !ProjectCreator.RE_PROJECT_NAME.matcher(projectName).matches()) {
+            errorAndExit(
+                "Project name '%1$s' contains invalid characters.\nAllowed characters are: %2$s",
+                projectName, ProjectCreator.CHARS_PROJECT_NAME);
+            return;
+        }
+
+        if (activityName != null &&
+                !ProjectCreator.RE_ACTIVITY_NAME.matcher(activityName).matches()) {
+            errorAndExit(
+                "Activity name '%1$s' contains invalid characters.\nAllowed characters are: %2$s",
+                activityName, ProjectCreator.CHARS_ACTIVITY_NAME);
+            return;
+        }
+
+        if (packageName != null &&
+                !ProjectCreator.RE_PACKAGE_NAME.matcher(packageName).matches()) {
+            errorAndExit(
+                "Package name '%1$s' contains invalid characters.\n" +
+                "A package name must be constitued of two Java identifiers.\n" +
+                "Each identifier allowed characters are: %2$s",
+                packageName, ProjectCreator.CHARS_PACKAGE_NAME);
+            return;
+        }
+
+        creator.createProject(projectDir,
+                projectName,
+                packageName,
+                activityName,
+                target,
+                library,
+                null /*pathToMain*/);
+    }
+
+    /**
+     * Creates a new Android test project based on command-line parameters
+     */
+    private void createTestProject() {
+
+        String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath());
+
+        // first check the path of the parent project, and make sure it's valid.
+        String pathToMainProject = mSdkCommandLine.getParamTestProjectMain();
+
+        File parentProject = new File(pathToMainProject);
+        if (parentProject.isAbsolute() == false) {
+            // if the path is not absolute, we need to resolve it based on the
+            // destination path of the project
+            try {
+                parentProject = new File(projectDir, pathToMainProject).getCanonicalFile();
+            } catch (IOException e) {
+                errorAndExit("Unable to resolve Main project's directory: %1$s",
+                        pathToMainProject);
+                return; // help Eclipse static analyzer understand we'll never execute the rest.
+            }
+        }
+
+        if (parentProject.isDirectory() == false) {
+            errorAndExit("Main project's directory does not exist: %1$s",
+                    pathToMainProject);
+            return;
+        }
+
+        // now look for a manifest in there
+        File manifest = new File(parentProject, SdkConstants.FN_ANDROID_MANIFEST_XML);
+        if (manifest.isFile() == false) {
+            errorAndExit("No AndroidManifest.xml file found in the main project directory: %1$s",
+                    parentProject.getAbsolutePath());
+            return;
+        }
+
+        // now query the manifest for the package file.
+        XPath xpath = AndroidXPathFactory.newXPath();
+        String packageName, activityName;
+
+        try {
+            packageName = xpath.evaluate("/manifest/@package",
+                    new InputSource(new FileInputStream(manifest)));
+
+            mSdkLog.info("Found main project package: %1$s\n", packageName);
+
+            // now get the name of the first activity we find
+            activityName = xpath.evaluate("/manifest/application/activity[1]/@android:name",
+                    new InputSource(new FileInputStream(manifest)));
+            // xpath will return empty string when there's no match
+            if (activityName == null || activityName.length() == 0) {
+                activityName = null;
+            } else {
+                mSdkLog.info("Found main project activity: %1$s\n", activityName);
+            }
+        } catch (FileNotFoundException e) {
+            // this shouldn't happen as we test it above.
+            errorAndExit("No AndroidManifest.xml file found in main project.");
+            return; // this is not strictly needed because errorAndExit will stop the execution,
+            // but this makes the java compiler happy, wrt to uninitialized variables.
+        } catch (XPathExpressionException e) {
+            // looks like the main manifest is not valid.
+            errorAndExit("Unable to parse main project manifest to get information.");
+            return; // this is not strictly needed because errorAndExit will stop the execution,
+                    // but this makes the java compiler happy, wrt to uninitialized variables.
+        }
+
+        // now get the target hash
+        ProjectProperties p = ProjectProperties.load(parentProject.getAbsolutePath(),
+                PropertyType.PROJECT);
+        if (p == null) {
+            errorAndExit("Unable to load the main project's %1$s",
+                    PropertyType.PROJECT.getFilename());
+            return;
+        }
+
+        String targetHash = p.getProperty(ProjectProperties.PROPERTY_TARGET);
+        if (targetHash == null) {
+            errorAndExit("Couldn't find the main project target");
+            return;
+        }
+
+        // and resolve it.
+        IAndroidTarget target = mSdkManager.getTargetFromHashString(targetHash);
+        if (target == null) {
+            errorAndExit(
+                    "Unable to resolve main project target '%1$s'. You may want to install the platform in your SDK.",
+                    targetHash);
+            return;
+        }
+
+        mSdkLog.info("Found main project target: %1$s\n", target.getFullName());
+
+        ProjectCreator creator = getProjectCreator();
+
+        String projectName = mSdkCommandLine.getParamName();
+
+        if (projectName != null &&
+                !ProjectCreator.RE_PROJECT_NAME.matcher(projectName).matches()) {
+            errorAndExit(
+                "Project name '%1$s' contains invalid characters.\nAllowed characters are: %2$s",
+                projectName, ProjectCreator.CHARS_PROJECT_NAME);
+            return;
+        }
+
+        creator.createProject(projectDir,
+                projectName,
+                packageName,
+                activityName,
+                target,
+                false /* library*/,
+                pathToMainProject);
+    }
+
+    /**
+     * Creates a new Android UI test project based on command-line parameters
+     */
+    private void createUiTestProject() {
+
+        String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath());
+
+        // get the target and try to resolve it.
+        int targetId = resolveTargetName(mSdkCommandLine.getParamTargetId());
+        IAndroidTarget[] targets = mSdkManager.getTargets();
+        if (targetId == INVALID_TARGET_ID || targetId > targets.length) {
+            errorAndExit("Target id is not valid. Use '%s list targets' to get the target ids.",
+                    SdkConstants.androidCmdName());
+        }
+        IAndroidTarget target = targets[targetId - 1];  // target id is 1-based
+
+        if (target.getVersion().getApiLevel() < 16) {
+            errorAndExit("UI test projects can only target API 16 and above");
+        }
+
+        // get the project name
+        String projectName = mSdkCommandLine.getParamName();
+        // if none, use the folder name.
+        if (projectName == null) {
+            File f = new File(projectDir);
+            projectName = f.getName();
+        }
+
+        try {
+            // create src folder
+            File srcFolder = new File(projectDir, SdkConstants.FD_SOURCES);
+            srcFolder.mkdir();
+
+            // create the local.prop file.
+            // location of the SDK goes in localProperty
+            ProjectPropertiesWorkingCopy localProperties = ProjectProperties.create(projectDir,
+                    PropertyType.LOCAL);
+            localProperties.setProperty(ProjectProperties.PROPERTY_SDK, mOsSdkFolder);
+            localProperties.save();
+
+            // target goes in project properties
+            ProjectPropertiesWorkingCopy projectProperties = ProjectProperties.create(projectDir,
+                    PropertyType.PROJECT);
+            projectProperties.setProperty(ProjectProperties.PROPERTY_TARGET, target.hashString());
+            projectProperties.save();
+
+            // copy the build file using the keywords replacement.
+            final Map<String, String> keywords = new HashMap<String, String>();
+            keywords.put(ProjectCreator.PH_PROJECT_NAME, projectName);
+
+            ProjectCreator creator = getProjectCreator();
+
+            creator.installTemplate("uibuild.template",
+                    new File(projectDir, SdkConstants.FN_BUILD_XML),
+                    keywords);
+        } catch (Exception e) {
+            mSdkLog.error(e, null);
+        }
+    }
+
+    /**
+     * Updates an existing Android project based on command-line parameters
+     * @param library whether the project is a library project.
+     */
+    private void updateProject(boolean library) {
+        // get the target and try to resolve it.
+        IAndroidTarget target = null;
+        String targetStr = mSdkCommandLine.getParamTargetId();
+        // For "update project" the target parameter is optional so having null is acceptable.
+        // However if there's a value, it must be valid.
+        if (targetStr != null) {
+            IAndroidTarget[] targets = mSdkManager.getTargets();
+            int targetId = resolveTargetName(targetStr);
+            if (targetId == INVALID_TARGET_ID || targetId > targets.length) {
+                errorAndExit("Target id '%1$s' is not valid. Use '%2$s list targets' to get the target ids.",
+                        targetStr,
+                        SdkConstants.androidCmdName());
+            }
+            target = targets[targetId - 1];  // target id is 1-based
+        }
+
+        ProjectCreator creator = getProjectCreator();
+
+        String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath());
+
+        String libraryPath = library ? null :
+            mSdkCommandLine.getParamProjectLibrary(SdkCommandLine.OBJECT_PROJECT);
+
+        creator.updateProject(projectDir,
+                target,
+                mSdkCommandLine.getParamName(),
+                libraryPath);
+
+        if (library == false) {
+            boolean doSubProjects = mSdkCommandLine.getParamSubProject();
+            boolean couldHaveDone = false;
+
+            // If there are any sub-folders with a manifest, try to update them as projects
+            // too. This will take care of updating any underlying test project even if the
+            // user changed the folder name.
+            File[] files = new File(projectDir).listFiles();
+            if (files != null) {
+                for (File dir : files) {
+                    if (dir.isDirectory() &&
+                            new File(dir, SdkConstants.FN_ANDROID_MANIFEST_XML).isFile()) {
+                        if (doSubProjects) {
+                            creator.updateProject(dir.getPath(),
+                                    target,
+                                    mSdkCommandLine.getParamName(),
+                                    null /*libraryPath*/);
+                        } else {
+                            couldHaveDone = true;
+                        }
+                    }
+                }
+            }
+
+            if (couldHaveDone) {
+                mSdkLog.info(
+                        "It seems that there are sub-projects. If you want to update them\nplease use the --%1$s parameter.\n",
+                        SdkCommandLine.KEY_SUBPROJECTS);
+            }
+        }
+    }
+
+    /**
+     * Updates an existing test project with a new path to the main project.
+     */
+    private void updateTestProject() {
+        ProjectCreator creator = getProjectCreator();
+
+        String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath());
+
+        creator.updateTestProject(projectDir, mSdkCommandLine.getParamTestProjectMain(),
+                mSdkManager);
+    }
+
+    /**
+     * Adjusts the project location to make it absolute & canonical relative to the
+     * working directory, if any.
+     *
+     * @return The project absolute path relative to {@link #mWorkDir} or the original
+     *         newProjectLocation otherwise.
+     */
+    private String getProjectLocation(String newProjectLocation) {
+
+        // If the new project location is absolute, use it as-is
+        File projectDir = new File(newProjectLocation);
+        if (projectDir.isAbsolute()) {
+            return newProjectLocation;
+        }
+
+        // if there's no working directory, just use the project location as-is.
+        if (mWorkDir == null) {
+            return newProjectLocation;
+        }
+
+        // Combine then and get an absolute canonical directory
+        try {
+            projectDir = new File(mWorkDir, newProjectLocation).getCanonicalFile();
+
+            return projectDir.getPath();
+        } catch (IOException e) {
+            errorAndExit("Failed to combine working directory '%1$s' with project location '%2$s': %3$s",
+                    mWorkDir.getPath(),
+                    newProjectLocation,
+                    e.getMessage());
+            return null;
+        }
+    }
+
+    /**
+     * Displays the list of available Targets (Platforms and Add-ons)
+     */
+    @VisibleForTesting(visibility=Visibility.PRIVATE)
+    void displayTargetList() {
+
+        // Compact output, suitable for scripts.
+        if (mSdkCommandLine != null && mSdkCommandLine.getFlagCompact()) {
+            char eol = mSdkCommandLine.getFlagEolNull() ? '\0' : '\n';
+
+            for (IAndroidTarget target : mSdkManager.getTargets()) {
+                mSdkLog.info("%1$s%2$c", target.hashString(), eol);
+            }
+
+            return;
+        }
+
+        mSdkLog.info("Available Android targets:\n");
+
+        int index = 1;
+        for (IAndroidTarget target : mSdkManager.getTargets()) {
+            mSdkLog.info("----------\n");
+            mSdkLog.info("id: %1$d or \"%2$s\"\n", index, target.hashString());
+            mSdkLog.info("     Name: %s\n", target.getName());
+            if (target.isPlatform()) {
+                mSdkLog.info("     Type: Platform\n");
+                mSdkLog.info("     API level: %s\n", target.getVersion().getApiString());
+                mSdkLog.info("     Revision: %d\n", target.getRevision());
+            } else {
+                mSdkLog.info("     Type: Add-On\n");
+                mSdkLog.info("     Vendor: %s\n", target.getVendor());
+                mSdkLog.info("     Revision: %d\n", target.getRevision());
+                if (target.getDescription() != null) {
+                    mSdkLog.info("     Description: %s\n", target.getDescription());
+                }
+                mSdkLog.info("     Based on Android %s (API level %s)\n",
+                        target.getVersionName(), target.getVersion().getApiString());
+
+                // display the optional libraries.
+                IOptionalLibrary[] libraries = target.getOptionalLibraries();
+                if (libraries != null) {
+                    mSdkLog.info("     Libraries:\n");
+                    for (IOptionalLibrary library : libraries) {
+                        mSdkLog.info("      * %1$s (%2$s)\n",
+                                library.getName(), library.getJarName());
+                        mSdkLog.info("          %1$s\n", library.getDescription());
+                    }
+                }
+            }
+
+            // get the target skins & ABIs
+            displaySkinList(target, "     Skins: ");
+            displayAbiList (target, "     ABIs : ");
+
+            if (target.getUsbVendorId() != IAndroidTarget.NO_USB_ID) {
+                mSdkLog.info("     Adds USB support for devices (Vendor: 0x%04X)\n",
+                        target.getUsbVendorId());
+            }
+
+            index++;
+        }
+    }
+
+    /**
+     * Displays the skins valid for the given target.
+     */
+    @VisibleForTesting(visibility=Visibility.PRIVATE)
+    void displaySkinList(IAndroidTarget target, String message) {
+        String[] skins = target.getSkins();
+        String defaultSkin = target.getDefaultSkin();
+        mSdkLog.info(message);
+        if (skins != null) {
+            boolean first = true;
+            for (String skin : skins) {
+                if (first == false) {
+                    mSdkLog.info(", ");
+                } else {
+                    first = false;
+                }
+                mSdkLog.info(skin);
+
+                if (skin.equals(defaultSkin)) {
+                    mSdkLog.info(" (default)");
+                }
+            }
+            mSdkLog.info("\n");
+        } else {
+            mSdkLog.info("no skins.\n");
+        }
+    }
+
+    /**
+     * Displays the ABIs valid for the given target.
+     */
+    @VisibleForTesting(visibility=Visibility.PRIVATE)
+    void displayAbiList(IAndroidTarget target, String message) {
+        ISystemImage[] systemImages = target.getSystemImages();
+        mSdkLog.info(message);
+        if (systemImages.length > 0) {
+            boolean first = true;
+            for (ISystemImage si : systemImages) {
+                if (first == false) {
+                    mSdkLog.info(", ");
+                } else {
+                    first = false;
+                }
+                mSdkLog.info(si.getAbiType());
+            }
+            mSdkLog.info("\n");
+        } else {
+            mSdkLog.info("no ABIs.\n");
+        }
+    }
+
+    /**
+     * Displays the list of available AVDs for the given AvdManager.
+     *
+     * @param avdManager
+     */
+    @VisibleForTesting(visibility=Visibility.PRIVATE)
+    void displayAvdList(AvdManager avdManager) {
+
+        AvdInfo[] avds = avdManager.getValidAvds();
+
+        // Compact output, suitable for scripts.
+        if (mSdkCommandLine != null && mSdkCommandLine.getFlagCompact()) {
+            char eol = mSdkCommandLine.getFlagEolNull() ? '\0' : '\n';
+
+            for (int index = 0 ; index < avds.length ; index++) {
+                AvdInfo info = avds[index];
+                mSdkLog.info("%1$s%2$c", info.getName(), eol);
+            }
+
+            return;
+        }
+
+        mSdkLog.info("Available Android Virtual Devices:\n");
+
+        for (int index = 0 ; index < avds.length ; index++) {
+            AvdInfo info = avds[index];
+            if (index > 0) {
+                mSdkLog.info("---------\n");
+            }
+            mSdkLog.info("    Name: %s\n", info.getName());
+            mSdkLog.info("    Path: %s\n", info.getDataFolderPath());
+
+            // get the target of the AVD
+            IAndroidTarget target = info.getTarget();
+            if (target.isPlatform()) {
+                mSdkLog.info("  Target: %s (API level %s)\n", target.getName(),
+                        target.getVersion().getApiString());
+            } else {
+                mSdkLog.info("  Target: %s (%s)\n", target.getName(), target
+                        .getVendor());
+                mSdkLog.info("          Based on Android %s (API level %s)\n",
+                        target.getVersionName(), target.getVersion().getApiString());
+            }
+            mSdkLog.info("     ABI: %s\n", info.getAbiType());
+
+            // display some extra values.
+            Map<String, String> properties = info.getProperties();
+            if (properties != null) {
+                String skin = properties.get(AvdManager.AVD_INI_SKIN_NAME);
+                if (skin != null) {
+                    mSdkLog.info("    Skin: %s\n", skin);
+                }
+                String sdcard = properties.get(AvdManager.AVD_INI_SDCARD_SIZE);
+                if (sdcard == null) {
+                    sdcard = properties.get(AvdManager.AVD_INI_SDCARD_PATH);
+                }
+                if (sdcard != null) {
+                    mSdkLog.info("  Sdcard: %s\n", sdcard);
+                }
+                String snapshot = properties.get(AvdManager.AVD_INI_SNAPSHOT_PRESENT);
+                if (snapshot != null) {
+                    mSdkLog.info("Snapshot: %s\n", snapshot);
+                }
+            }
+        }
+
+        // Are there some unused AVDs?
+        AvdInfo[] badAvds = avdManager.getBrokenAvds();
+
+        if (badAvds.length == 0) {
+            return;
+        }
+
+        mSdkLog.info("\nThe following Android Virtual Devices could not be loaded:\n");
+        boolean needSeparator = false;
+        for (AvdInfo info : badAvds) {
+            if (needSeparator) {
+                mSdkLog.info("---------\n");
+            }
+            mSdkLog.info("    Name: %s\n", info.getName() == null ? "--" : info.getName());
+            mSdkLog.info("    Path: %s\n",
+                    info.getDataFolderPath() == null ? "--" : info.getDataFolderPath());
+
+            String error = info.getErrorMessage();
+            mSdkLog.info("   Error: %s\n", error == null ? "Uknown error" : error);
+            needSeparator = true;
+        }
+    }
+
+    /**
+     * Displays the list of available AVDs.
+     */
+    private void displayAvdList() {
+        try {
+            AvdManager avdManager = AvdManager.getInstance(mSdkManager, mSdkLog);
+            displayAvdList(avdManager);
+        } catch (AndroidLocationException e) {
+            errorAndExit(e.getMessage());
+        }
+    }
+
+    /**
+     * Creates a new AVD. This is a text based creation with command line prompt.
+     */
+    private void createAvd() {
+        // find a matching target
+        int targetId = resolveTargetName(mSdkCommandLine.getParamTargetId());
+        IAndroidTarget[] targets = mSdkManager.getTargets();
+
+        if (targetId == INVALID_TARGET_ID || targetId > targets.length) {
+            errorAndExit("Target id is not valid. Use '%s list targets' to get the target ids.",
+                    SdkConstants.androidCmdName());
+        }
+
+        IAndroidTarget target = targets[targetId-1]; // target id is 1-based
+
+        try {
+            boolean removePrevious = mSdkCommandLine.getFlagForce();
+            AvdManager avdManager = AvdManager.getInstance(mSdkManager, mSdkLog);
+
+            String avdName = mSdkCommandLine.getParamName();
+
+            if (!AvdManager.RE_AVD_NAME.matcher(avdName).matches()) {
+                errorAndExit(
+                    "AVD name '%1$s' contains invalid characters.\nAllowed characters are: %2$s",
+                    avdName, AvdManager.CHARS_AVD_NAME);
+                return;
+            }
+
+            AvdInfo info = avdManager.getAvd(avdName, false /*validAvdOnly*/);
+            if (info != null) {
+                if (removePrevious) {
+                    mSdkLog.warning(
+                            "Android Virtual Device '%s' already exists and will be replaced.",
+                            avdName);
+                } else {
+                    errorAndExit("Android Virtual Device '%s' already exists.\n" +
+                                 "Use --force if you want to replace it.",
+                                 avdName);
+                    return;
+                }
+            }
+
+            String paramFolderPath = mSdkCommandLine.getParamLocationPath();
+            File avdFolder = null;
+            if (paramFolderPath != null) {
+                avdFolder = new File(paramFolderPath);
+            } else {
+                avdFolder = AvdInfo.getDefaultAvdFolder(avdManager, avdName);
+            }
+
+            // Validate skin is either default (empty) or NNNxMMM or a valid skin name.
+            Map<String, String> skinHardwareConfig = null;
+            String skin = mSdkCommandLine.getParamSkin();
+            if (skin != null && skin.length() == 0) {
+                skin = null;
+            }
+
+            if (skin != null && target != null) {
+                boolean valid = false;
+                // Is it a know skin name for this target?
+                for (String s : target.getSkins()) {
+                    if (skin.equalsIgnoreCase(s)) {
+                        skin = s;  // Make skin names case-insensitive.
+                        valid = true;
+
+                        // get the hardware properties for this skin
+                        File skinFolder = avdManager.getSkinPath(skin, target);
+                        FileWrapper skinHardwareFile = new FileWrapper(skinFolder,
+                                AvdManager.HARDWARE_INI);
+                        if (skinHardwareFile.isFile()) {
+                            skinHardwareConfig = ProjectProperties.parsePropertyFile(
+                                    skinHardwareFile, mSdkLog);
+                        }
+                        break;
+                    }
+                }
+
+                // Is it NNNxMMM?
+                if (!valid) {
+                    valid = AvdManager.NUMERIC_SKIN_SIZE.matcher(skin).matches();
+                }
+
+                if (!valid) {
+                    displaySkinList(target, "Valid skins: ");
+                    errorAndExit("'%s' is not a valid skin name or size (NNNxMMM)", skin);
+                    return;
+                }
+            }
+
+            String abiType = mSdkCommandLine.getParamAbi();
+            if (target != null && (abiType == null || abiType.length() == 0)) {
+                ISystemImage[] systemImages = target.getSystemImages();
+                if (systemImages != null && systemImages.length == 1) {
+                    // Auto-select the single ABI available
+                    abiType = systemImages[0].getAbiType();
+                    mSdkLog.info("Auto-selecting single ABI %1$s\n", abiType);
+                } else {
+                    displayAbiList(target, "Valid ABIs: ");
+                    errorAndExit("This platform has more than one ABI. Please specify one using --%1$s.",
+                            SdkCommandLine.KEY_ABI);
+                }
+            }
+
+            Map<String, String> hardwareConfig = null;
+            if (target != null && target.isPlatform()) {
+                try {
+                    hardwareConfig = promptForHardware(target, skinHardwareConfig);
+                } catch (IOException e) {
+                    errorAndExit(e.getMessage());
+                }
+            }
+
+            @SuppressWarnings("unused") // oldAvdInfo is never read, yet useful for debugging
+            AvdInfo oldAvdInfo = null;
+            if (removePrevious) {
+                oldAvdInfo = avdManager.getAvd(avdName, false /*validAvdOnly*/);
+            }
+
+            @SuppressWarnings("unused") // newAvdInfo is never read, yet useful for debugging
+            AvdInfo newAvdInfo = avdManager.createAvd(avdFolder,
+                    avdName,
+                    target,
+                    abiType,
+                    skin,
+                    mSdkCommandLine.getParamSdCard(),
+                    hardwareConfig,
+                    mSdkCommandLine.getFlagSnapshot(),
+                    removePrevious,
+                    false, //edit existing
+                    mSdkLog);
+
+        } catch (AndroidLocationException e) {
+            errorAndExit(e.getMessage());
+        }
+    }
+
+    /**
+     * Delete an AVD. If the AVD name is not part of the available ones look for an
+     * invalid AVD (one not loaded due to some error) to remove it too.
+     */
+    private void deleteAvd() {
+        try {
+            String avdName = mSdkCommandLine.getParamName();
+            AvdManager avdManager = AvdManager.getInstance(mSdkManager, mSdkLog);
+            AvdInfo info = avdManager.getAvd(avdName, false /*validAvdOnly*/);
+
+            if (info == null) {
+                errorAndExit("There is no Android Virtual Device named '%s'.", avdName);
+                return;
+            }
+
+            avdManager.deleteAvd(info, mSdkLog);
+        } catch (AndroidLocationException e) {
+            errorAndExit(e.getMessage());
+        }
+    }
+
+    /**
+     * Moves an AVD.
+     */
+    private void moveAvd() {
+        try {
+            String avdName = mSdkCommandLine.getParamName();
+            AvdManager avdManager = AvdManager.getInstance(mSdkManager, mSdkLog);
+            AvdInfo info = avdManager.getAvd(avdName, true /*validAvdOnly*/);
+
+            if (info == null) {
+                errorAndExit("There is no valid Android Virtual Device named '%s'.", avdName);
+                return;
+            }
+
+            // This is a rename if there's a new name for the AVD
+            String newName = mSdkCommandLine.getParamMoveNewName();
+            if (newName != null && newName.equals(info.getName())) {
+                // same name, not actually a rename operation
+                newName = null;
+            }
+
+            // This is a move (of the data files) if there's a new location path
+            String paramFolderPath = mSdkCommandLine.getParamLocationPath();
+            if (paramFolderPath != null) {
+                // check if paths are the same. Use File methods to account for OS idiosyncrasies.
+                try {
+                    File f1 = new File(paramFolderPath).getCanonicalFile();
+                    File f2 = new File(info.getDataFolderPath()).getCanonicalFile();
+                    if (f1.equals(f2)) {
+                        // same canonical path, so not actually a move
+                        paramFolderPath = null;
+                    }
+                } catch (IOException e) {
+                    // Fail to resolve canonical path. Fail now since a move operation might fail
+                    // later and be harder to recover from.
+                    errorAndExit(e.getMessage());
+                    return;
+                }
+            }
+
+            if (newName == null && paramFolderPath == null) {
+                mSdkLog.warning("Move operation aborted: same AVD name, same canonical data path");
+                return;
+            }
+
+            // If a rename was requested and no data move was requested, check if the original
+            // data path is our default constructed from the AVD name. In this case we still want
+            // to rename that folder too.
+            if (newName != null && paramFolderPath == null) {
+                // Compute the original data path
+                File originalFolder = new File(
+                        AndroidLocation.getFolder() + AndroidLocation.FOLDER_AVD,
+                        info.getName() + AvdManager.AVD_FOLDER_EXTENSION);
+                if (info.getDataFolderPath() != null &&
+                        originalFolder.equals(new File(info.getDataFolderPath()))) {
+                    try {
+                        // The AVD is using the default data folder path based on the AVD name.
+                        // That folder needs to be adjusted to use the new name.
+                        File f = new File(AndroidLocation.getFolder() + AndroidLocation.FOLDER_AVD,
+                                     newName + AvdManager.AVD_FOLDER_EXTENSION);
+                        paramFolderPath = f.getCanonicalPath();
+                    } catch (IOException e) {
+                        // Fail to resolve canonical path. Fail now rather than later.
+                        errorAndExit(e.getMessage());
+                    }
+                }
+            }
+
+            // Check for conflicts
+            if (newName != null) {
+                if (avdManager.getAvd(newName, false /*validAvdOnly*/) != null) {
+                    errorAndExit("There is already an AVD named '%s'.", newName);
+                    return;
+                }
+
+                File ini = info.getIniFile();
+                if (ini.equals(AvdInfo.getDefaultIniFile(avdManager, newName))) {
+                    errorAndExit("The AVD file '%s' is in the way.", ini.getCanonicalPath());
+                    return;
+                }
+            }
+
+            if (paramFolderPath != null && new File(paramFolderPath).exists()) {
+                errorAndExit(
+                        "There is already a file or directory at '%s'.\nUse --path to specify a different data folder.",
+                        paramFolderPath);
+            }
+
+            avdManager.moveAvd(info, newName, paramFolderPath, mSdkLog);
+        } catch (AndroidLocationException e) {
+            errorAndExit(e.getMessage());
+        } catch (IOException e) {
+            errorAndExit(e.getMessage());
+        }
+    }
+
+    /**
+     * Updates a broken AVD.
+     */
+    private void updateAvd() {
+        try {
+            String avdName = mSdkCommandLine.getParamName();
+            AvdManager avdManager = AvdManager.getInstance(mSdkManager, mSdkLog);
+            avdManager.updateAvd(avdName, mSdkLog);
+        } catch (AndroidLocationException e) {
+            errorAndExit(e.getMessage());
+        } catch (IOException e) {
+            errorAndExit(e.getMessage());
+        }
+    }
+
+    /**
+     * Updates adb with the USB devices declared in the SDK add-ons.
+     */
+    private void updateAdb() {
+        try {
+            mSdkManager.updateAdb();
+
+            mSdkLog.info(
+                    "adb has been updated. You must restart adb with the following commands\n" +
+                    "\tadb kill-server\n" +
+                    "\tadb start-server\n");
+        } catch (AndroidLocationException e) {
+            errorAndExit(e.getMessage());
+        } catch (IOException e) {
+            errorAndExit(e.getMessage());
+        }
+    }
+
+
+
+    /**
+     * Prompts the user to setup a hardware config for a Platform-based AVD.
+     * @throws IOException
+     */
+    private Map<String, String> promptForHardware(IAndroidTarget createTarget,
+            Map<String, String> skinHardwareConfig) throws IOException {
+        byte[] readLineBuffer = new byte[256];
+        String result;
+        String defaultAnswer = "no";
+
+        mSdkLog.info("%s is a basic Android platform.\n", createTarget.getName());
+        mSdkLog.info("Do you wish to create a custom hardware profile [%s]",
+                defaultAnswer);
+
+        result = readLine(readLineBuffer).trim();
+        // handle default:
+        if (result.length() == 0) {
+            result = defaultAnswer;
+        }
+
+        if (getBooleanReply(result) == false) {
+            // no custom config, return the skin hardware config in case there is one.
+            return skinHardwareConfig;
+        }
+
+        mSdkLog.info("\n"); // empty line
+
+        // get the list of possible hardware properties
+        File hardwareDefs = new File (mOsSdkFolder + File.separator +
+                SdkConstants.OS_SDK_TOOLS_LIB_FOLDER, SdkConstants.FN_HARDWARE_INI);
+        Map<String, HardwareProperty> hwMap = HardwareProperties.parseHardwareDefinitions(
+                hardwareDefs, null /*sdkLog*/);
+
+        HashMap<String, String> map = new HashMap<String, String>();
+
+        // we just want to loop on the HardwareProperties
+        HardwareProperty[] hwProperties = hwMap.values().toArray(
+                new HardwareProperty[hwMap.size()]);
+        for (int i = 0 ; i < hwProperties.length ;) {
+            HardwareProperty property = hwProperties[i];
+
+            String description = property.getDescription();
+            if (description != null) {
+                mSdkLog.info("%s: %s\n", property.getAbstract(), description);
+            } else {
+                mSdkLog.info("%s\n", property.getAbstract());
+            }
+
+            String defaultValue = property.getDefault();
+            String defaultFromSkin = skinHardwareConfig != null ? skinHardwareConfig.get(
+                    property.getName()) : null;
+
+            if (defaultFromSkin != null) {
+                mSdkLog.info("%s [%s (from skin)]:", property.getName(), defaultFromSkin);
+            } else if (defaultValue != null) {
+                mSdkLog.info("%s [%s]:", property.getName(), defaultValue);
+            } else {
+                mSdkLog.info("%s (%s):", property.getName(), property.getType());
+            }
+
+            result = readLine(readLineBuffer);
+            if (result.length() == 0) {
+                if (defaultFromSkin != null || defaultValue != null) {
+                    if (defaultFromSkin != null) {
+                        // we need to write this one in the AVD file
+                        map.put(property.getName(), defaultFromSkin);
+                    }
+
+                    mSdkLog.info("\n"); // empty line
+                    i++; // go to the next property if we have a valid default value.
+                         // if there's no default, we'll redo this property
+                }
+                continue;
+            }
+
+            switch (property.getType()) {
+                case BOOLEAN:
+                    try {
+                        if (getBooleanReply(result)) {
+                            map.put(property.getName(), "yes");
+                            i++; // valid reply, move to next property
+                        } else {
+                            map.put(property.getName(), "no");
+                            i++; // valid reply, move to next property
+                        }
+                    } catch (IOException e) {
+                        // display error, and do not increment i to redo this property
+                        mSdkLog.info("\n%s\n", e.getMessage());
+                    }
+                    break;
+                case INTEGER:
+                    try {
+                        Integer.parseInt(result);
+                        map.put(property.getName(), result);
+                        i++; // valid reply, move to next property
+                    } catch (NumberFormatException e) {
+                        // display error, and do not increment i to redo this property
+                        mSdkLog.info("\n%s\n", e.getMessage());
+                    }
+                    break;
+                case DISKSIZE:
+                    // TODO check validity
+                    map.put(property.getName(), result);
+                    i++; // valid reply, move to next property
+                    break;
+            }
+
+            mSdkLog.info("\n"); // empty line
+        }
+
+        return map;
+    }
+
+    /**
+     * Reads a line from the input stream.
+     * @param buffer
+     * @throws IOException
+     */
+    private String readLine(byte[] buffer) throws IOException {
+        int count = System.in.read(buffer);
+
+        // is the input longer than the buffer?
+        if (count == buffer.length && buffer[count-1] != 10) {
+            // create a new temp buffer
+            byte[] tempBuffer = new byte[256];
+
+            // and read the rest
+            String secondHalf = readLine(tempBuffer);
+
+            // return a concat of both
+            return new String(buffer, 0, count) + secondHalf;
+        }
+
+        // ignore end whitespace
+        while (count > 0 && (buffer[count-1] == '\r' || buffer[count-1] == '\n')) {
+            count--;
+        }
+
+        return new String(buffer, 0, count);
+    }
+
+    /**
+     * Reads a line from the input stream, masking it as much as possible.
+     */
+    @SuppressWarnings("unused")
+    private String promptPassword(String prompt) throws IOException {
+
+        // Setup a thread that tries to overwrite any input by
+        // masking the last character with a space. This is quite
+        // crude but is a documented workaround to the lack of a
+        // proper password getter.
+        final AtomicBoolean keepErasing = new AtomicBoolean(true);
+
+        Thread eraser = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                while (keepErasing.get()) {
+                    System.err.print("\b ");    //$NON-NLS-1$. \b=Backspace
+                    try {
+                        Thread.sleep(10 /*millis*/);
+                    } catch (InterruptedException e) {
+                        // Ignore
+                    }
+                }
+            }
+        }, "eraser");                           //$NON-NLS-1$
+
+        try {
+            System.err.print(prompt);
+            eraser.start();
+            byte[] buffer = new byte[256];
+            return readLine(buffer);
+        } finally {
+            keepErasing.set(false);
+            try {
+                eraser.join();
+            } catch (InterruptedException e) {
+                // Ignore
+            }
+        }
+    }
+
+    /**
+     * Returns the boolean value represented by the string.
+     * @throws IOException If the value is not a boolean string.
+     */
+    private boolean getBooleanReply(String reply) throws IOException {
+
+        for (String valid : BOOLEAN_YES_REPLIES) {
+            if (valid.equalsIgnoreCase(reply)) {
+                return true;
+            }
+        }
+
+        for (String valid : BOOLEAN_NO_REPLIES) {
+            if (valid.equalsIgnoreCase(reply)) {
+                return false;
+            }
+        }
+
+        throw new IOException(String.format("%s is not a valid reply", reply));
+    }
+
+    private void errorAndExit(String format, Object...args) {
+        mSdkLog.error(null, format, args);
+        System.exit(1);
+    }
+
+    /**
+     * Converts a symbolic target name (such as those accepted by --target on the command-line)
+     * to an internal target index id. A valid target name is either a numeric target id (> 0)
+     * or a target hash string.
+     * <p/>
+     * If the given target can't be mapped, {@link #INVALID_TARGET_ID} (0) is returned.
+     * It's up to the caller to output an error.
+     * <p/>
+     * On success, returns a value > 0.
+     */
+    private int resolveTargetName(String targetName) {
+
+        if (targetName == null) {
+            return INVALID_TARGET_ID;
+        }
+
+        targetName = targetName.trim();
+
+        // Case of an integer number
+        if (targetName.matches("[0-9]*")) {
+            try {
+                int n = Integer.parseInt(targetName);
+                return n < 1 ? INVALID_TARGET_ID : n;
+            } catch (NumberFormatException e) {
+                // Ignore. Should not happen.
+            }
+        }
+
+        // Let's try to find a platform or addon name.
+        IAndroidTarget[] targets = mSdkManager.getTargets();
+        for (int i = 0; i < targets.length; i++) {
+            if (targetName.equals(targets[i].hashString())) {
+                return i + 1;
+            }
+        }
+
+        return INVALID_TARGET_ID;
+    }
+}
diff --git a/sdkmanager/app/src/com/android/sdkmanager/SdkCommandLine.java b/sdkmanager/app/src/main/java/com/android/sdkmanager/SdkCommandLine.java
similarity index 100%
rename from sdkmanager/app/src/com/android/sdkmanager/SdkCommandLine.java
rename to sdkmanager/app/src/main/java/com/android/sdkmanager/SdkCommandLine.java
diff --git a/sdkmanager/app/tests/com/android/sdklib/SdkManagerTestCase.java b/sdkmanager/app/src/test/java/com/android/sdklib/SdkManagerTestCase.java
similarity index 100%
rename from sdkmanager/app/tests/com/android/sdklib/SdkManagerTestCase.java
rename to sdkmanager/app/src/test/java/com/android/sdklib/SdkManagerTestCase.java
diff --git a/sdkmanager/app/tests/com/android/sdklib/mock/MockLog.java b/sdkmanager/app/src/test/java/com/android/sdklib/mock/MockLog.java
similarity index 100%
rename from sdkmanager/app/tests/com/android/sdklib/mock/MockLog.java
rename to sdkmanager/app/src/test/java/com/android/sdklib/mock/MockLog.java
diff --git a/sdkmanager/app/tests/com/android/sdkmanager/AvdManagerTest.java b/sdkmanager/app/src/test/java/com/android/sdkmanager/AvdManagerTest.java
similarity index 100%
rename from sdkmanager/app/tests/com/android/sdkmanager/AvdManagerTest.java
rename to sdkmanager/app/src/test/java/com/android/sdkmanager/AvdManagerTest.java
diff --git a/sdkmanager/app/tests/com/android/sdkmanager/MainTest.java b/sdkmanager/app/src/test/java/com/android/sdkmanager/MainTest.java
similarity index 100%
rename from sdkmanager/app/tests/com/android/sdkmanager/MainTest.java
rename to sdkmanager/app/src/test/java/com/android/sdkmanager/MainTest.java
diff --git a/sdkmanager/app/tests/com/android/sdkmanager/SdkCommandLineTest.java b/sdkmanager/app/src/test/java/com/android/sdkmanager/SdkCommandLineTest.java
similarity index 100%
rename from sdkmanager/app/tests/com/android/sdkmanager/SdkCommandLineTest.java
rename to sdkmanager/app/src/test/java/com/android/sdkmanager/SdkCommandLineTest.java
diff --git a/sdkmanager/app/tests/Android.mk b/sdkmanager/app/tests/Android.mk
deleted file mode 100644
index 7b88129..0000000
--- a/sdkmanager/app/tests/Android.mk
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright (C) 2011 The Android Open Source Project
-#
-# Licensed 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.
-
-LOCAL_PATH := $(call my-dir)
-
-
-include $(CLEAR_VARS)
-
-# Only compile source java files in this lib.
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_MODULE := sdkmanager-tests
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_JAVA_LIBRARIES := \
-        httpclient-4.1.1 \
-        httpcore-4.1 \
-        httpmime-4.1.1 \
-        junit \
-        sdkmanager \
-        sdklib
-
-include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/sdkmanager/libs/sdklib/Android.mk b/sdkmanager/libs/sdklib/Android.mk
index dfd3fcb..ef0362d 100644
--- a/sdkmanager/libs/sdklib/Android.mk
+++ b/sdkmanager/libs/sdklib/Android.mk
@@ -24,10 +24,7 @@
 
 LOCAL_MODULE := sdklib
 LOCAL_MODULE_TAGS := optional
-# IMPORTANT: if you add a new dependency here, please make sure
-# to also check the following files:
-#   sdkmanager/sdklib/manifest.txt
-#   sdkmanager/app/etc/android.bat
+
 LOCAL_JAVA_LIBRARIES := \
         common \
         commons-codec-1.4 \
@@ -42,7 +39,7 @@
         layoutlib_api
 
 LOCAL_PREBUILT_JAVA_LIBRARIES := \
-	../../../../prebuilts/devtools/$(LOCAL_MODULE)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
+	../../../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
 
 include $(BUILD_HOST_PREBUILT)
 
diff --git a/sdkmanager/libs/sdkuilib/Android.mk b/sdkmanager/libs/sdkuilib/Android.mk
index b746632..df35432 100644
--- a/sdkmanager/libs/sdkuilib/Android.mk
+++ b/sdkmanager/libs/sdkuilib/Android.mk
@@ -24,10 +24,7 @@
 
 LOCAL_MODULE := sdkuilib
 LOCAL_MODULE_TAGS := optional
-# IMPORTANT: if you add a new dependency here, please make sure
-# to also check the following file:
-#   sdkmanager/app/etc/android.bat
-# (Note: there is no manifest.txt for sdkuilib.)
+
 LOCAL_JAVA_LIBRARIES := \
 	common \
 	commons-codec-1.4 \
@@ -45,7 +42,7 @@
 	swtmenubar
 
 LOCAL_PREBUILT_JAVA_LIBRARIES := \
-	../../../../prebuilts/devtools/$(LOCAL_MODULE)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
+	../../../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
 
 include $(BUILD_HOST_PREBUILT)
 
diff --git a/swtmenubar/Android.mk b/swtmenubar/Android.mk
index 865c277..01e8645 100644
--- a/swtmenubar/Android.mk
+++ b/swtmenubar/Android.mk
@@ -26,7 +26,7 @@
 	org.eclipse.jface_3.6.2.M20110210-1200
 
 LOCAL_PREBUILT_JAVA_LIBRARIES := \
-	../../prebuilts/devtools/$(LOCAL_MODULE)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
+	../../prebuilts/devtools/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
 
 include $(BUILD_HOST_PREBUILT)
 
diff --git a/templates/activities/BlankActivity/globals.xml.ftl b/templates/activities/BlankActivity/globals.xml.ftl
index 3a26abd..6220005 100644
--- a/templates/activities/BlankActivity/globals.xml.ftl
+++ b/templates/activities/BlankActivity/globals.xml.ftl
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
 <globals>
     <global id="srcOut" value="src/${slashedPackageName(packageName)}" />
-    <global id="menuName" value="${layoutName}" />
+    <global id="menuName" value="${classToResource(activityClass)}" />
 </globals>
diff --git a/templates/activities/BlankActivity/recipe.xml.ftl b/templates/activities/BlankActivity/recipe.xml.ftl
index 8ed9f51..78bd8b2 100644
--- a/templates/activities/BlankActivity/recipe.xml.ftl
+++ b/templates/activities/BlankActivity/recipe.xml.ftl
@@ -7,14 +7,22 @@
 
     <merge from="res/values/strings.xml.ftl" />
 
+    <merge from="res/values/dimens.xml" />
+    <merge from="res/values-sw600dp/dimens.xml" />
+    <merge from="res/values-sw720dp-land/dimens.xml" />
+
     <!-- Decide what kind of layout to add (viewpager or not) -->
     <#if navType?contains("pager")>
         <instantiate from="res/layout/activity_pager.xml.ftl"
                        to="res/layout/${layoutName}.xml" />
+        <instantiate from="res/layout/fragment_dummy.xml.ftl"
+                       to="res/layout/fragment_${classToResource(activityClass)}_dummy.xml" />
 
     <#elseif navType == "tabs" || navType == "dropdown">
         <instantiate from="res/layout/activity_fragment_container.xml"
                      to="res/layout/${layoutName}.xml" />
+        <instantiate from="res/layout/fragment_dummy.xml.ftl"
+                       to="res/layout/fragment_${classToResource(activityClass)}_dummy.xml" />
 
     <#else>
         <instantiate from="res/layout/activity_simple.xml.ftl"
diff --git a/templates/activities/BlankActivity/root/res/layout/activity_simple.xml.ftl b/templates/activities/BlankActivity/root/res/layout/activity_simple.xml.ftl
index 5f97369..9ddd213 100644
--- a/templates/activities/BlankActivity/root/res/layout/activity_simple.xml.ftl
+++ b/templates/activities/BlankActivity/root/res/layout/activity_simple.xml.ftl
@@ -1,14 +1,16 @@
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
-    tools:context=".${activityClass}"
     android:layout_width=<#if buildApi lt 8 >"fill_parent"<#else>"match_parent"</#if>
-    android:layout_height=<#if buildApi lt 8 >"fill_parent"<#else>"match_parent"</#if> >
+    android:layout_height=<#if buildApi lt 8 >"fill_parent"<#else>"match_parent"</#if>
+    android:paddingLeft="@dimen/activity_horizontal_margin"
+    android:paddingRight="@dimen/activity_horizontal_margin"
+    android:paddingTop="@dimen/activity_vertical_margin"
+    android:paddingBottom="@dimen/activity_vertical_margin"
+    tools:context=".${activityClass}">
 
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_centerHorizontal="true"
-        android:layout_centerVertical="true"
         android:text="@string/hello_world" />
 
 </RelativeLayout>
diff --git a/templates/activities/BlankActivity/root/res/layout/fragment_dummy.xml.ftl b/templates/activities/BlankActivity/root/res/layout/fragment_dummy.xml.ftl
new file mode 100644
index 0000000..1f21998
--- /dev/null
+++ b/templates/activities/BlankActivity/root/res/layout/fragment_dummy.xml.ftl
@@ -0,0 +1,16 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width=<#if buildApi lt 8 >"fill_parent"<#else>"match_parent"</#if>
+    android:layout_height=<#if buildApi lt 8 >"fill_parent"<#else>"match_parent"</#if>
+    android:paddingLeft="@dimen/activity_horizontal_margin"
+    android:paddingRight="@dimen/activity_horizontal_margin"
+    android:paddingTop="@dimen/activity_vertical_margin"
+    android:paddingBottom="@dimen/activity_vertical_margin"
+    tools:context=".${activityClass}$DummySectionFragment">
+
+    <TextView
+        android:id="@+id/section_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</RelativeLayout>
diff --git a/templates/activities/BlankActivity/root/res/menu/main.xml.ftl b/templates/activities/BlankActivity/root/res/menu/main.xml.ftl
index 41bdfee..e35aa1b 100644
--- a/templates/activities/BlankActivity/root/res/menu/main.xml.ftl
+++ b/templates/activities/BlankActivity/root/res/menu/main.xml.ftl
@@ -1,6 +1,6 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:id="@+id/menu_settings"
-        android:title="@string/menu_settings"
+    <item android:id="@+id/action_settings"
+        android:title="@string/action_settings"
         android:orderInCategory="100"<#if buildApi gte 11>
         android:showAsAction="never"</#if> />
 </menu>
diff --git a/templates/activities/BlankActivity/root/res/values-sw600dp/dimens.xml b/templates/activities/BlankActivity/root/res/values-sw600dp/dimens.xml
new file mode 100644
index 0000000..886b05f
--- /dev/null
+++ b/templates/activities/BlankActivity/root/res/values-sw600dp/dimens.xml
@@ -0,0 +1,4 @@
+<resources>
+    <!-- Customize dimensions originally defined in res/values/dimens.xml (such as
+         screen margins) for sw600dp devices (e.g. 7" tablets) here. -->
+</resources>
diff --git a/templates/activities/BlankActivity/root/res/values-sw720dp-land/dimens.xml b/templates/activities/BlankActivity/root/res/values-sw720dp-land/dimens.xml
new file mode 100644
index 0000000..00059fc
--- /dev/null
+++ b/templates/activities/BlankActivity/root/res/values-sw720dp-land/dimens.xml
@@ -0,0 +1,5 @@
+<resources>
+    <!-- Customize dimensions originally defined in res/values/dimens.xml (such as
+         screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here. -->
+    <dimen name="activity_horizontal_margin">128dp</dimen>
+</resources>
diff --git a/templates/activities/BlankActivity/root/res/values/dimens.xml b/templates/activities/BlankActivity/root/res/values/dimens.xml
new file mode 100644
index 0000000..47c8224
--- /dev/null
+++ b/templates/activities/BlankActivity/root/res/values/dimens.xml
@@ -0,0 +1,5 @@
+<resources>
+    <!-- Default screen margins, per the Android Design guidelines. -->
+    <dimen name="activity_horizontal_margin">16dp</dimen>
+    <dimen name="activity_vertical_margin">16dp</dimen>
+</resources>
diff --git a/templates/activities/BlankActivity/root/res/values/strings.xml.ftl b/templates/activities/BlankActivity/root/res/values/strings.xml.ftl
index 8c7636e..1c9bc8b 100644
--- a/templates/activities/BlankActivity/root/res/values/strings.xml.ftl
+++ b/templates/activities/BlankActivity/root/res/values/strings.xml.ftl
@@ -3,7 +3,7 @@
     <string name="title_${activityToLayout(activityClass)}">${escapeXmlString(activityTitle)}</string>
     </#if>
 
-    <string name="menu_settings">Settings</string>
+    <string name="action_settings">Settings</string>
 
     <#if navType != "none">
     <string name="title_section1">Section 1</string>
diff --git a/templates/activities/BlankActivity/root/src/app_package/SimpleActivity.java.ftl b/templates/activities/BlankActivity/root/src/app_package/SimpleActivity.java.ftl
index feae824..7edd647 100644
--- a/templates/activities/BlankActivity/root/src/app_package/SimpleActivity.java.ftl
+++ b/templates/activities/BlankActivity/root/src/app_package/SimpleActivity.java.ftl
@@ -6,6 +6,10 @@
 <#if parentActivityClass != "">
 import android.view.MenuItem;
 import android.support.v4.app.NavUtils;
+<#if minApiLevel < 11>
+import android.annotation.TargetApi;
+import android.os.Build;
+</#if>
 </#if>
 
 public class ${activityClass} extends Activity {
@@ -16,10 +20,22 @@
         setContentView(R.layout.${layoutName});
         <#if parentActivityClass != "">
         // Show the Up button in the action bar.
-        getActionBar().setDisplayHomeAsUpEnabled(true);
+        setupActionBar();
         </#if>
     }
 
+    <#if parentActivityClass != "">
+    /**
+     * Set up the {@link android.app.ActionBar}<#if minApiLevel < 11>, if the API is available</#if>.
+     */
+    <#if minApiLevel < 11>@TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    </#if>private void setupActionBar() {
+        <#if minApiLevel < 11>if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {</#if>
+        getActionBar().setDisplayHomeAsUpEnabled(true);
+        <#if minApiLevel < 11>}</#if>
+    }
+    </#if>
+
     <#include "include_onCreateOptionsMenu.java.ftl">
     <#include "include_onOptionsItemSelected.java.ftl">
 
diff --git a/templates/activities/BlankActivity/root/src/app_package/include_DummySectionFragment.java.ftl b/templates/activities/BlankActivity/root/src/app_package/include_DummySectionFragment.java.ftl
index c455fc5..8eb1399 100644
--- a/templates/activities/BlankActivity/root/src/app_package/include_DummySectionFragment.java.ftl
+++ b/templates/activities/BlankActivity/root/src/app_package/include_DummySectionFragment.java.ftl
@@ -15,11 +15,9 @@
         @Override
         public View onCreateView(LayoutInflater inflater, ViewGroup container,
                 Bundle savedInstanceState) {
-            // Create a new TextView and set its text to the fragment's section
-            // number argument value.
-            TextView textView = new TextView(getActivity());
-            textView.setGravity(Gravity.CENTER);
-            textView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));
-            return textView;
+            View rootView = inflater.inflate(R.layout.fragment_${classToResource(activityClass)}_dummy, container, false);
+            TextView dummyTextView = (TextView) rootView.findViewById(R.id.section_label);
+            dummyTextView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));
+            return rootView;
         }
     }
diff --git a/templates/activities/BlankActivity/template.xml b/templates/activities/BlankActivity/template.xml
index 6afe523..08a306d 100644
--- a/templates/activities/BlankActivity/template.xml
+++ b/templates/activities/BlankActivity/template.xml
@@ -57,9 +57,9 @@
         default="none"
         help="The type of navigation to use for the activity" >
         <option id="none" default="true">None</option>
-        <option id="tabs" minApi="11">Tabs</option>
-        <option id="tabs_pager" minApi="11">Tabs + Swipe</option>
-        <option id="pager_strip" minApi="11">Swipe Views + Title Strip</option>
+        <!--<option id="tabs" minApi="11">Fixed Tabs</option>-->
+        <option id="tabs_pager" minApi="11">Fixed Tabs + Swipe</option>
+        <option id="pager_strip" minApi="11">Scrollable Tabs + Swipe</option>
         <option id="dropdown" minApi="11">Dropdown</option>
     </parameter>
 
diff --git a/templates/activities/LoginActivity/globals.xml.ftl b/templates/activities/LoginActivity/globals.xml.ftl
index cb45205..62dfd8d 100644
--- a/templates/activities/LoginActivity/globals.xml.ftl
+++ b/templates/activities/LoginActivity/globals.xml.ftl
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <globals>
     <global id="srcOut" value="src/${slashedPackageName(packageName)}" />
-    <global id="menuName" value="${layoutName}" />
+    <global id="menuName" value="${classToResource(activityClass)}" />
     <global id="simpleName" value="${activityToLayout(activityClass)}" />
 </globals>
diff --git a/templates/activities/LoginActivity/root/res/menu/activity_login.xml b/templates/activities/LoginActivity/root/res/menu/activity_login.xml
index 1254dce..2965794 100644
--- a/templates/activities/LoginActivity/root/res/menu/activity_login.xml
+++ b/templates/activities/LoginActivity/root/res/menu/activity_login.xml
@@ -1,5 +1,5 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:id="@+id/menu_forgot_password"
-        android:title="@string/menu_forgot_password"
+    <item android:id="@+id/action_forgot_password"
+        android:title="@string/action_forgot_password"
         android:showAsAction="never" />
 </menu>
diff --git a/templates/activities/LoginActivity/root/res/values/strings.xml.ftl b/templates/activities/LoginActivity/root/res/values/strings.xml.ftl
index 18bf85f..def1b2f 100644
--- a/templates/activities/LoginActivity/root/res/values/strings.xml.ftl
+++ b/templates/activities/LoginActivity/root/res/values/strings.xml.ftl
@@ -10,7 +10,7 @@
     <string name="action_sign_in_register"><b>Sign in</b> or register</string>
     <string name="action_sign_in_short">Sign in</string>
 
-    <string name="menu_forgot_password">Recover lost password</string>
+    <string name="action_forgot_password">Recover lost password</string>
 
     <string name="login_progress_signing_in">Signing in&#8230;</string>
 
diff --git a/templates/ic_launcher_xxhdpi.png b/templates/ic_launcher_xxhdpi.png
new file mode 100644
index 0000000..549135a
--- /dev/null
+++ b/templates/ic_launcher_xxhdpi.png
Binary files differ
diff --git a/templates/other/BlankFragment/globals.xml.ftl b/templates/other/BlankFragment/globals.xml.ftl
new file mode 100644
index 0000000..bfc27eb
--- /dev/null
+++ b/templates/other/BlankFragment/globals.xml.ftl
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<globals>
+    <global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+</globals>
diff --git a/templates/other/BlankFragment/recipe.xml.ftl b/templates/other/BlankFragment/recipe.xml.ftl
new file mode 100644
index 0000000..add6d27
--- /dev/null
+++ b/templates/other/BlankFragment/recipe.xml.ftl
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<recipe>
+
+    <merge from="res/values/strings.xml" />
+
+    <#if includeLayout>
+        <instantiate from="res/layout/fragment_blank.xml.ftl"
+                       to="res/layout/fragment_${classToResource(className)}.xml" />
+
+        <open file="res/layout/fragment_${classToResource(className)}.xml" />
+    </#if>
+
+    <open file="${srcOut}/${className}.java" />
+
+    <instantiate from="src/app_package/BlankFragment.java.ftl"
+                   to="${srcOut}/${className}.java" />
+
+</recipe>
diff --git a/templates/other/BlankFragment/root/res/layout/fragment_blank.xml.ftl b/templates/other/BlankFragment/root/res/layout/fragment_blank.xml.ftl
new file mode 100644
index 0000000..3e04f05
--- /dev/null
+++ b/templates/other/BlankFragment/root/res/layout/fragment_blank.xml.ftl
@@ -0,0 +1,13 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".${className}">
+
+    <!-- TODO: Update blank fragment layout -->
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="@string/hello_blank_fragment" />
+
+</FrameLayout>
diff --git a/templates/other/BlankFragment/root/res/values/strings.xml b/templates/other/BlankFragment/root/res/values/strings.xml
new file mode 100644
index 0000000..c8d8b1a
--- /dev/null
+++ b/templates/other/BlankFragment/root/res/values/strings.xml
@@ -0,0 +1,6 @@
+<resources>
+
+<!-- TODO: Remove or change this placeholder text -->
+    <string name="hello_blank_fragment">Hello blank fragment</string>
+
+</resources>
diff --git a/templates/other/BlankFragment/root/src/app_package/BlankFragment.java.ftl b/templates/other/BlankFragment/root/src/app_package/BlankFragment.java.ftl
new file mode 100644
index 0000000..6b3fb1e
--- /dev/null
+++ b/templates/other/BlankFragment/root/src/app_package/BlankFragment.java.ftl
@@ -0,0 +1,129 @@
+package ${packageName};
+
+<#if includeCallbacks>import android.app.Activity;</#if>
+<#if includeCallbacks>import android.net.Uri;</#if>
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+<#if !includeLayout>import android.widget.TextView;</#if>
+
+/**
+ * A simple {@link android.support.v4.app.Fragment} subclass.
+<#if includeCallbacks>
+ * Activities that contain this fragment must implement the
+ * {@link ${className}.OnFragmentInteractionListener} interface
+ * to handle interaction events.
+</#if>
+<#if includeFactory>
+ * Use the {@link ${className}#newInstance} factory method to
+ * create an instance of this fragment.
+</#if>
+ *
+ */
+public class ${className} extends Fragment {
+<#if includeFactory>
+    // TODO: Rename parameter arguments, choose names that match
+    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
+    private static final String ARG_PARAM1 = "param1";
+    private static final String ARG_PARAM2 = "param2";
+
+    // TODO: Rename and change types of parameters
+    private String mParam1;
+    private String mParam2;
+</#if>
+
+<#if includeCallbacks>
+    private OnFragmentInteractionListener mListener;
+</#if>
+
+<#if includeFactory>
+    /**
+     * Use this factory method to create a new instance of
+     * this fragment using the provided parameters.
+     *
+     * @param param1 Parameter 1.
+     * @param param2 Parameter 2.
+     * @return A new instance of fragment ${className}.
+     */
+    // TODO: Rename and change types and number of parameters
+    public static ${className} newInstance(String param1, String param2) {
+        ${className} fragment = new ${className}();
+        Bundle args = new Bundle();
+        args.putString(ARG_PARAM1, param1);
+        args.putString(ARG_PARAM2, param2);
+        fragment.setArguments(args);
+        return fragment;
+    }
+</#if>
+    public ${className}() {
+        // Required empty public constructor
+    }
+
+<#if includeFactory>
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (getArguments() != null) {
+            mParam1 = getArguments().getString(ARG_PARAM1);
+            mParam2 = getArguments().getString(ARG_PARAM2);
+        }
+    }
+</#if>
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+<#if includeLayout>
+        // Inflate the layout for this fragment
+        return inflater.inflate(R.layout.fragment_${classToResource(className)}, container, false);
+<#else>
+        TextView textView = new TextView(getActivity());
+        textView.setText(R.string.hello_blank_fragment);
+        return textView;
+</#if>
+    }
+
+<#if includeCallbacks>
+    // TODO: Rename method, update argument and hook method into UI event
+    public void onButtonPressed(Uri uri) {
+        if (mListener != null) {
+            mListener.onFragmentInteraction(uri);
+        }
+    }
+
+    @Override
+    public void onAttach(Activity activity) {
+        super.onAttach(activity);
+        try {
+            mListener = (OnFragmentInteractionListener) activity;
+        } catch (ClassCastException e) {
+            throw new ClassCastException(activity.toString()
+                    + " must implement OnFragmentInteractionListener");
+        }
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        mListener = null;
+    }
+
+    /**
+     * This interface must be implemented by activities that contain this
+     * fragment to allow an interaction in this fragment to be communicated
+     * to the activity and potentially other fragments contained in that
+     * activity.
+     * <p>
+     * See the Android Training lesson <a href=
+     * "http://developer.android.com/training/basics/fragments/communicating.html"
+     * >Communicating with Other Fragments</a> for more information.
+     */
+    public interface OnFragmentInteractionListener {
+        // TODO: Update argument type and name
+        public void onFragmentInteraction(Uri uri);
+    }
+</#if>
+
+}
diff --git a/templates/other/BlankFragment/template.xml b/templates/other/BlankFragment/template.xml
new file mode 100644
index 0000000..9434c18
--- /dev/null
+++ b/templates/other/BlankFragment/template.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+<template
+    format="3"
+    revision="1"
+    name="New Blank Fragment"
+    description="Creates a blank fragment that is compatible back to API level 4."
+    minApi="7"
+    minBuildApi="8">
+
+    <dependency name="android-support-v4" revision="8" />
+
+    <category value="Other" />
+
+    <parameter
+        id="className"
+        name="Fragment Name"
+        type="string"
+        constraints="class|nonempty|unique"
+        default="BlankFragment"
+        help="The name of the fragment class to create" />
+
+    <parameter
+        id="includeLayout"
+        name="Create layout XML?"
+        type="boolean"
+        default="true"
+        help="Generate a layout XML for the fragment" />
+
+    <parameter
+        id="includeFactory"
+        name="Include fragment factory methods?"
+        type="boolean"
+        default="true"
+        help="Generate static fragment factory methods for easy instantiation" />
+
+    <parameter
+        id="includeCallbacks"
+        name="Include interface callbacks?"
+        type="boolean"
+        default="true"
+        help="Generate event callbacks for communication with an Activity or other fragments" />
+
+    <thumbs>
+        <thumb>template_blank_fragment.png</thumb>
+    </thumbs>
+
+    <globals file="globals.xml.ftl" />
+    <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/templates/other/BlankFragment/template_blank_fragment.png b/templates/other/BlankFragment/template_blank_fragment.png
new file mode 100644
index 0000000..e0e71ce
--- /dev/null
+++ b/templates/other/BlankFragment/template_blank_fragment.png
Binary files differ
diff --git a/templates/other/ListFragment/globals.xml.ftl b/templates/other/ListFragment/globals.xml.ftl
new file mode 100644
index 0000000..577250d
--- /dev/null
+++ b/templates/other/ListFragment/globals.xml.ftl
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<globals>
+    <global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+    <global id="collection_name" value="${extractLetters(objectKind?lower_case)}" />
+    <global id="className" value="${extractLetters(objectKind)}Fragment" />
+    <global id="fragment_layout" value="fragment_${extractLetters(objectKind?lower_case)}" />
+</globals>
diff --git a/templates/other/ListFragment/recipe.xml.ftl b/templates/other/ListFragment/recipe.xml.ftl
new file mode 100644
index 0000000..5db4fdb
--- /dev/null
+++ b/templates/other/ListFragment/recipe.xml.ftl
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<recipe>
+
+<#if switchGrid == true>
+    <merge from="res/values/refs.xml.ftl" />
+    <merge from="res/values/refs_lrg.xml.ftl"
+           to="res/values-large/refs.xml" />
+    <merge from="res/values/refs_lrg.xml.ftl"
+           to="res/values-sw600dp/refs.xml" />
+
+    <instantiate from="res/layout/fragment_grid.xml"
+                 to="res/layout/${fragment_layout}_grid.xml" />
+
+    <instantiate from="res/layout/fragment_list.xml"
+                 to="res/layout/${fragment_layout}_list.xml" />
+</#if>
+
+    <instantiate from="src/app_package/ListFragment.java.ftl"
+                 to="${srcOut}/${className}.java" />
+
+    <instantiate from="src/app_package/dummy/DummyContent.java.ftl"
+                 to="${srcOut}/dummy/DummyContent.java" />
+
+    <open file="${srcOut}/${className}.java" />
+
+</recipe>
diff --git a/templates/other/ListFragment/root/res/layout/fragment_grid.xml b/templates/other/ListFragment/root/res/layout/fragment_grid.xml
new file mode 100644
index 0000000..87ae969
--- /dev/null
+++ b/templates/other/ListFragment/root/res/layout/fragment_grid.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".${className}">
+
+    <GridView
+        android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:numColumns="2" />
+
+    <TextView
+        android:id="@android:id/empty"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/templates/other/ListFragment/root/res/layout/fragment_list.xml b/templates/other/ListFragment/root/res/layout/fragment_list.xml
new file mode 100644
index 0000000..5b0e178
--- /dev/null
+++ b/templates/other/ListFragment/root/res/layout/fragment_list.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".${className}">
+
+    <ListView
+        android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+    <TextView
+        android:id="@android:id/empty"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/templates/other/ListFragment/root/res/values-large/refs_lrg.xml.ftl b/templates/other/ListFragment/root/res/values-large/refs_lrg.xml.ftl
new file mode 100644
index 0000000..fb20a27
--- /dev/null
+++ b/templates/other/ListFragment/root/res/values-large/refs_lrg.xml.ftl
@@ -0,0 +1,12 @@
+<resources>
+
+    <!--
+    Layout alias to replace the single-pane version of the layout with a
+    two-pane version on Large screens.
+
+    For more on layout aliases, see:
+    http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+    -->
+    <item name="${fragment_layout}" type="layout">@layout/${fragment_layout}_grid</item>
+
+</resources>
\ No newline at end of file
diff --git a/templates/other/ListFragment/root/res/values-sw600dp/refs_lrg.xml.ftl b/templates/other/ListFragment/root/res/values-sw600dp/refs_lrg.xml.ftl
new file mode 100644
index 0000000..fb20a27
--- /dev/null
+++ b/templates/other/ListFragment/root/res/values-sw600dp/refs_lrg.xml.ftl
@@ -0,0 +1,12 @@
+<resources>
+
+    <!--
+    Layout alias to replace the single-pane version of the layout with a
+    two-pane version on Large screens.
+
+    For more on layout aliases, see:
+    http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+    -->
+    <item name="${fragment_layout}" type="layout">@layout/${fragment_layout}_grid</item>
+
+</resources>
\ No newline at end of file
diff --git a/templates/other/ListFragment/root/res/values/refs.xml.ftl b/templates/other/ListFragment/root/res/values/refs.xml.ftl
new file mode 100644
index 0000000..59ca92c
--- /dev/null
+++ b/templates/other/ListFragment/root/res/values/refs.xml.ftl
@@ -0,0 +1,12 @@
+<resources>
+
+    <!--
+    Layout alias to replace the single-pane version of the layout with a
+    two-pane version on Large screens.
+
+    For more on layout aliases, see:
+    http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+    -->
+    <item name="${fragment_layout}" type="layout">@layout/${fragment_layout}_list</item>
+
+</resources>
\ No newline at end of file
diff --git a/templates/other/ListFragment/root/res/values/refs_lrg.xml.ftl b/templates/other/ListFragment/root/res/values/refs_lrg.xml.ftl
new file mode 100644
index 0000000..fb20a27
--- /dev/null
+++ b/templates/other/ListFragment/root/res/values/refs_lrg.xml.ftl
@@ -0,0 +1,12 @@
+<resources>
+
+    <!--
+    Layout alias to replace the single-pane version of the layout with a
+    two-pane version on Large screens.
+
+    For more on layout aliases, see:
+    http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+    -->
+    <item name="${fragment_layout}" type="layout">@layout/${fragment_layout}_grid</item>
+
+</resources>
\ No newline at end of file
diff --git a/templates/other/ListFragment/root/src/app_package/ListFragment.java.ftl b/templates/other/ListFragment/root/src/app_package/ListFragment.java.ftl
new file mode 100644
index 0000000..6100448
--- /dev/null
+++ b/templates/other/ListFragment/root/src/app_package/ListFragment.java.ftl
@@ -0,0 +1,195 @@
+package ${packageName};
+
+import android.app.Activity;
+import android.os.Bundle;
+<#if switchGrid == true>
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+<#else>
+import android.support.v4.app.ListFragment;
+</#if>
+import android.view.View;
+<#if switchGrid == true>
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.widget.AdapterView;
+</#if>
+import android.widget.ArrayAdapter;
+<#if switchGrid == true>
+import android.widget.ListAdapter;
+import android.widget.TextView;
+<#else>
+import android.widget.ListView;
+</#if>
+
+import ${packageName}.dummy.DummyContent;
+
+/**
+ * A fragment representing a list of Items.
+ * <p />
+<#if switchGrid == true>
+ * Large screen devices (such as tablets) are supported by replacing the ListView
+ * with a GridView.
+</#if>
+ * <p />
+ * Activities containing this fragment MUST implement the {@link Callbacks}
+ * interface.
+ */
+<#if switchGrid == true>
+public class ${className} extends Fragment implements AbsListView.OnItemClickListener {
+<#else>
+public class ${className} extends ListFragment {
+</#if>
+
+<#if includeFactory>
+    // TODO: Rename parameter arguments, choose names that match
+    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
+    private static final String ARG_PARAM1 = "param1";
+    private static final String ARG_PARAM2 = "param2";
+
+    // TODO: Rename and change types of parameters
+    private String mParam1;
+    private String mParam2;
+
+</#if>
+    private OnFragmentInteractionListener mListener;
+
+<#if switchGrid == true>
+    /**
+     * The fragment's ListView/GridView.
+     */
+    private AbsListView mListView;
+
+    /**
+     * The Adapter which will be used to populate the ListView/GridView with
+     * Views.
+     */
+    private ListAdapter mAdapter;
+
+</#if>
+<#if includeFactory>
+    // TODO: Rename and change types of parameters
+    public static ${className} newInstance(String param1, String param2) {
+        ${className} fragment = new ${className}();
+        Bundle args = new Bundle();
+        args.putString(ARG_PARAM1, param1);
+        args.putString(ARG_PARAM2, param2);
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+</#if>
+    /**
+     * Mandatory empty constructor for the fragment manager to instantiate the
+     * fragment (e.g. upon screen orientation changes).
+     */
+    public ${className}() {
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+<#if includeFactory>
+        if (getArguments() != null) {
+            mParam1 = getArguments().getString(ARG_PARAM1);
+            mParam2 = getArguments().getString(ARG_PARAM2);
+        }
+</#if>
+
+        // TODO: Change Adapter to display your content
+<#if switchGrid == true>
+        mAdapter = new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
+                android.R.layout.simple_list_item_1, android.R.id.text1, DummyContent.ITEMS);
+<#else>
+        setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
+                android.R.layout.simple_list_item_1, android.R.id.text1, DummyContent.ITEMS));
+</#if>
+    }
+
+<#if switchGrid == true>
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        View view = inflater.inflate(R.layout.${fragment_layout}, container, false);
+
+        // Set the adapter
+        mListView = (AbsListView) view.findViewById(android.R.id.list);
+        ((AdapterView<ListAdapter>) mListView).setAdapter(mAdapter);
+
+        // Set OnItemClickListener so we can be notified on item clicks
+        mListView.setOnItemClickListener(this);
+
+        return view;
+    }
+</#if>
+
+    @Override
+    public void onAttach(Activity activity) {
+        super.onAttach(activity);
+        try {
+            mListener = (OnFragmentInteractionListener) activity;
+        } catch (ClassCastException e) {
+            throw new ClassCastException(activity.toString()
+                + " must implement OnFragmentInteractionListener");
+        }
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        mListener = null;
+    }
+
+
+<#if switchGrid == true>
+    @Override
+    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+        if (null != mListener) {
+            // Notify the active callbacks interface (the activity, if the
+            // fragment is attached to one) that an item has been selected.
+            mListener.onFragmentInteraction(DummyContent.ITEMS.get(position).id);
+        }
+    }
+
+    /**
+     * The default content for this Fragment has a TextView that is shown when
+     * the list is empty. If you would like to change the text, call this method
+     * to supply the text it should use.
+     */
+    public void setEmptyText(CharSequence emptyText) {
+        View emptyView = mListView.getEmptyView();
+
+        if (emptyText instanceof TextView) {
+            ((TextView) emptyView).setText(emptyText);
+        }
+    }
+<#else>
+    @Override
+    public void onListItemClick(ListView l, View v, int position, long id) {
+        super.onListItemClick(l, v, position, id);
+
+        if (null != mListener) {
+            // Notify the active callbacks interface (the activity, if the
+            // fragment is attached to one) that an item has been selected.
+            mListener.onFragmentInteraction(DummyContent.ITEMS.get(position).id);
+        }
+    }
+</#if>
+
+    /**
+    * This interface must be implemented by activities that contain this
+    * fragment to allow an interaction in this fragment to be communicated
+    * to the activity and potentially other fragments contained in that
+    * activity.
+    * <p>
+    * See the Android Training lesson <a href=
+    * "http://developer.android.com/training/basics/fragments/communicating.html"
+    * >Communicating with Other Fragments</a> for more information.
+    */
+    public interface OnFragmentInteractionListener {
+        // TODO: Update argument type and name
+        public void onFragmentInteraction(String id);
+    }
+
+}
diff --git a/templates/other/ListFragment/root/src/app_package/dummy/DummyContent.java.ftl b/templates/other/ListFragment/root/src/app_package/dummy/DummyContent.java.ftl
new file mode 100644
index 0000000..3545ba3
--- /dev/null
+++ b/templates/other/ListFragment/root/src/app_package/dummy/DummyContent.java.ftl
@@ -0,0 +1,55 @@
+package ${packageName}.dummy;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Helper class for providing sample content for user interfaces created by
+ * Android template wizards.
+ * <p>
+ * TODO: Replace all uses of this class before publishing your app.
+ */
+public class DummyContent {
+
+    /**
+     * An array of sample (dummy) items.
+     */
+    public static List<DummyItem> ITEMS = new ArrayList<DummyItem>();
+
+    /**
+     * A map of sample (dummy) items, by ID.
+     */
+    public static Map<String, DummyItem> ITEM_MAP = new HashMap<String, DummyItem>();
+
+    static {
+        // Add 3 sample items.
+        addItem(new DummyItem("1", "Item 1"));
+        addItem(new DummyItem("2", "Item 2"));
+        addItem(new DummyItem("3", "Item 3"));
+    }
+
+    private static void addItem(DummyItem item) {
+        ITEMS.add(item);
+        ITEM_MAP.put(item.id, item);
+    }
+
+    /**
+     * A dummy item representing a piece of content.
+     */
+    public static class DummyItem {
+        public String id;
+        public String content;
+
+        public DummyItem(String id, String content) {
+            this.id = id;
+            this.content = content;
+        }
+
+        @Override
+        public String toString() {
+            return content;
+        }
+    }
+}
diff --git a/templates/other/ListFragment/template.xml b/templates/other/ListFragment/template.xml
new file mode 100644
index 0000000..e00257c
--- /dev/null
+++ b/templates/other/ListFragment/template.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<template
+    format="3"
+    revision="1"
+    name="New List Fragment"
+    description="Creates a new empty fragment containing a list that can optionally change to a grid when on large screens. Compatible back to API level 4."
+    minApi="7"
+    minBuildApi="8">
+
+    <dependency name="android-support-v4" revision="8" />
+
+    <category value="UI Components" />
+
+    <parameter
+        id="packageName"
+        name="Package name"
+        type="string"
+        constraints="package"
+        default="com.mycompany.myapp" />
+
+    <parameter
+        id="objectKind"
+        name="Object Kind"
+        type="string"
+        constraints="nonempty"
+        default="Item"
+        help="Other examples are 'Person', 'Book', etc." />
+
+    <parameter
+        id="includeFactory"
+        name="Include fragment factory methods?"
+        type="boolean"
+        default="true"
+        help="Generate static fragment factory methods for easy instantiation" />
+
+    <parameter
+        id="switchGrid"
+        name="Switch to grid view on large screens?"
+        type="boolean"
+        default="true" />
+
+    <!-- 128x128 thumbnails relative to template.xml -->
+    <thumbs>
+        <!-- default thumbnail is required -->
+        <thumb>templates_list_fragment.png</thumb>
+    </thumbs>
+
+
+    <globals file="globals.xml.ftl" />
+    <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/templates/other/ListFragment/templates_list_fragment.png b/templates/other/ListFragment/templates_list_fragment.png
new file mode 100644
index 0000000..92ac799
--- /dev/null
+++ b/templates/other/ListFragment/templates_list_fragment.png
Binary files differ
diff --git a/traceview/etc/manifest.txt b/traceview/etc/manifest.txt
index 0c17bec..e145b4a 100644
--- a/traceview/etc/manifest.txt
+++ b/traceview/etc/manifest.txt
@@ -1,2 +1,2 @@
 Main-Class: com.android.traceview.MainWindow
-Class-Path: common.jar swt.jar org.eclipse.equinox.common_3.2.0.v20060603.jar org.eclipse.jface_3.2.0.I20060605-1400.jar org.eclipse.core.commands_3.2.0.I20060605-1400.jar
+Class-Path: common.jar swt.jar org.eclipse.equinox.common_3.2.0.v20060603.jar org.eclipse.jface_3.2.0.I20060605-1400.jar org.eclipse.core.commands_3.2.0.I20060605-1400.jar guava-tools.jar
